ETH Price: $2,522.94 (+0.10%)

Transaction Decoder

Block:
18293701 at Oct-06-2023 07:59:47 PM +UTC
Transaction Fee:
0.002982646095810138 ETH $7.53
Gas Used:
456,111 Gas / 6.539298758 Gwei

Emitted Events:

126 Holographer.0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef( 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef, 0x000000000000000000000000aae92bb933f9eba2dfe2d9d544a48c547c0ccd3a, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000100000000000000000000000000000000000000000000000000000212 )
127 HolographRegistryProxy.0xb4d3a3f85e85fdbd1d39f939d8c75355ec33ef437522432fe1a7b8b20bb4fab4( 0xb4d3a3f85e85fdbd1d39f939d8c75355ec33ef437522432fe1a7b8b20bb4fab4, 0x000000000000000000000000282d299ae68f40becc3c2a440e2894750b82de88, 0000000000000000000000000000000000000000000000000000000000000020, 0000000000000000000000000000000000000000000000000000000000000080, 351b8d13789e4d8d2717631559251955685881a31494dd0b8b19b4ef8530bb6d, 000000000000000000000000aae92bb933f9eba2dfe2d9d544a48c547c0ccd3a, 0000000000000000000000000000000000000000000000000000000000000000, 0000000100000000000000000000000000000000000000000000000000000212 )
128 UltraLightNodeV2.WithdrawNative( msgSender=0xc88108d606834178dad67cbeeea214a528d3c484, to=0xc88108d606834178dad67cbeeea214a528d3c484, amount=5569518549115 )
129 0xc88108d606834178dad67cbeeea214a528d3c484.0xc6619bbfa28fb4bfe3b3d37f2cb2080b93a1ba83d2e175f85b0661e7d291b7e6( 0xc6619bbfa28fb4bfe3b3d37f2cb2080b93a1ba83d2e175f85b0661e7d291b7e6, 0000000000000000000000000000000000000000000000000000000000000020, 0000000000000000000000000000000000000000000000000000000000000065, 000000000000000000000000000000000000000000000000000000000000006d, 0000000000000000000000004d73adb72bc3dd368966edd0f0b2148401a178e2, 000000000000000000000000777c19834a1a2ff6353a1e9cfb7c799ed7943a11, ad2dccba10292c8e9597097bf8d345a26e8b642270624b9f126a8909b9ffe8f7, 00000000000000000000000000000000000000000000000000000000000000c0, 0000000000000000000000000000000000000000000000000000000000000056, 0002000000000000000000000000000000000000000000000000000000000001, e0140000000000000000000000000000000000000000000000000234efd87fbe, e000bc9e47d02d94a5cee2305199fd8ffa465fc0ffee00000000000000000000 )
130 UltraLightNodeV2.RelayerParams( adapterParams=0x0002000000000000000000000000000000000000000000000000000000000001E0140000000000000000000000000000000000000000000000000234EFD87FBEE000BC9E47D02D94A5CEE2305199FD8FFA465FC0FFEE, outboundProofType=2 )
131 UltraLightNodeV2.WithdrawNative( msgSender=0xc88108d606834178dad67cbeeea214a528d3c484, to=0xc88108d606834178dad67cbeeea214a528d3c484, amount=635124475367340 )
132 UltraLightNodeV2.Packet( payload=0x00000000000002B30065777C19834A1A2FF6353A1E9CFB7C799ED7943A11006D777C19834A1A2FF6353A1E9CFB7C799ED7943A1116F1BE7000000000000000000000000000000000000000000000000000000000000007130000000000000000000000000000000000000000000000000000000000000001000000000000000000000000282D299AE68F40BECC3C2A440E2894750B82DE8800000000000000000000000083B34F3C7E13A3C70977701CEA202FC2330C4E47000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004C7D42DD33280000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000AAE92BB933F9EBA2DFE2D9D544A48C547C0CCD3A000000000000000000000000AAE92BB933F9EBA2DFE2D9D544A48C547C0CCD3A00000001000000000000000000000000000000000000000000000000000002120000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000610E30000000000000000000000000000000000000000000000000000005D21DBA000 )
133 HolographOperatorProxy.0x0f5759b4182507dcfc771071166f98d7ca331262e5134eaa74b676adce2138b7( 0x0f5759b4182507dcfc771071166f98d7ca331262e5134eaa74b676adce2138b7, ac1a3b72cd61d9b5ea3c56771926dade6fd29a74d40a18d1268a22eb16749a90 )

Account State Difference:

  Address   Before After State Difference Code
(MEV Builder: 0x1b8...C45)
6.687982116681885012 Eth6.688027727781885012 Eth0.0000456111
0x282d299A...50B82De88
0x5B905fE0...FAbf76068
(LayerZero: Nonce)
0x66A71Dce...C225Cd675
(LayerZero: Ethereum Endpoint)
0x83b34F3C...2330C4E47 0.039328466180112088 Eth0.039412567056527872 Eth0.000084100876415784
0xAAe92bB9...47C0CcD3a
0.017091850976868612 Eth
Nonce: 201
0.013384410010726235 Eth
Nonce: 202
0.003707440966142377
0xc88108D6...528D3C484 1.035623763925068952 Eth1.036264457918985407 Eth0.000640693993916455
0xD85b5E17...669b60d8b

Execution Trace

ETH 0.000994332322454863 HolographBridgeProxy.e5585666( )
  • ETH 0.000994332322454863 HolographBridge.bridgeOutRequest( toChain=4, holographableContract=0x282d299AE68F40BecC3C2A440E2894750B82De88, gasLimit=397539, gasPrice=400000000000, bridgeOutPayload=0x000000000000000000000000AAE92BB933F9EBA2DFE2D9D544A48C547C0CCD3A000000000000000000000000AAE92BB933F9EBA2DFE2D9D544A48C547C0CCD3A0000000100000000000000000000000000000000000000000000000000000212 )
    • HolographRegistryProxy.44b25fff( )
      • HolographRegistry.isHolographedContract( smartContract=0x282d299AE68F40BecC3C2A440E2894750B82De88 ) => ( True )
      • Holographer.b7e03661( )
        • Holograph.STATICCALL( )
        • HolographRegistryProxy.74b7510c( )
          • HolographRegistry.getReservedContractTypeAddress( contractType=0000000000000000000000000000000000486F6C6F6772617068455243373231 ) => ( contractTypeAddress=0xd9e9c178811a93bfcC849C054F41e2Ab2C5f3288 )
          • HolographERC721.bridgeOut( toChain=4, sender=0xAAe92bB933F9EbA2dfE2D9D544A48C547C0CcD3a, payload=0x000000000000000000000000AAE92BB933F9EBA2DFE2D9D544A48C547C0CCD3A000000000000000000000000AAE92BB933F9EBA2DFE2D9D544A48C547C0CCD3A0000000100000000000000000000000000000000000000000000000000000212 )
            • Holograph.STATICCALL( )
            • Holograph.STATICCALL( )
            • HolographRegistryProxy.afa5886e( )
              • HolographRegistry.holographableEvent( payload=0x351B8D13789E4D8D2717631559251955685881A31494DD0B8B19B4EF8530BB6D000000000000000000000000AAE92BB933F9EBA2DFE2D9D544A48C547C0CCD3A00000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000212 )
              • ETH 0.000994332322454863 HolographOperatorProxy.409aad69( )
                • ETH 0.000994332322454863 HolographOperator.send( gasLimit=397539, gasPrice=400000000000, toChain=4, msgSender=0xAAe92bB933F9EbA2dfE2D9D544A48C547C0CcD3a, nonce=1811, holographableContract=0x282d299AE68F40BecC3C2A440E2894750B82De88, bridgeOutPayload=0x000000000000000000000000AAE92BB933F9EBA2DFE2D9D544A48C547C0CCD3A000000000000000000000000AAE92BB933F9EBA2DFE2D9D544A48C547C0CCD3A000000010000000000000000000000000000000000000000000000000000021200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000 )
                  • LayerZeroModuleProxy.8c19a89f( )
                    • 0xca196d996232092881dfa2bea156a10227b2357c.8c19a89f( )
                      • HolographInterfaces.getChainId( fromChainType=2, fromChainId=4, toChainType=3 ) => ( toChainId=109 )
                      • Endpoint.STATICCALL( )
                      • UltraLightNodeV2.getAppConfig( _remoteChainId=109, _ua=0x777C19834a1A2FF6353a1E9cfb7C799ed7943a11 ) => ( [{name:inboundProofLibraryVersion, type:uint16, order:1, indexed:false, value:2, valueString:2}, {name:inboundBlockConfirmations, type:uint64, order:2, indexed:false, value:512, valueString:512}, {name:relayer, type:address, order:3, indexed:false, value:0xc88108D606834178DAD67cBEeea214a528D3C484, valueString:0xc88108D606834178DAD67cBEeea214a528D3C484}, {name:outboundProofType, type:uint16, order:4, indexed:false, value:2, valueString:2}, {name:outboundBlockConfirmations, type:uint64, order:5, indexed:false, value:15, valueString:15}, {name:oracle, type:address, order:6, indexed:false, value:0xc88108D606834178DAD67cBEeea214a528D3C484, valueString:0xc88108D606834178DAD67cBEeea214a528D3C484}] )
                      • 0xc88108d606834178dad67cbeeea214a528d3c484.765a8a54( )
                      • Holograph.STATICCALL( )
                      • HolographRegistryProxy.949d53a7( )
                        • HolographRegistry.getHToken( chainId=1 ) => ( 0x83b34F3C7E13A3c70977701cEa202fC2330C4E47 )
                        • ETH 0.000084100876415784 Holographer.CALL( )
                        • Holograph.STATICCALL( )
                        • ETH 0.000910231446039079 LayerZeroModuleProxy.0a0542ef( )
                          • ETH 0.000910231446039079 0xca196d996232092881dfa2bea156a10227b2357c.0a0542ef( )
                            • HolographInterfaces.getChainId( fromChainType=2, fromChainId=4, toChainType=3 ) => ( toChainId=109 )
                            • ETH 0.000910231446039079 Endpoint.send( _dstChainId=109, _destination=0x777C19834A1A2FF6353A1E9CFB7C799ED7943A11777C19834A1A2FF6353A1E9CFB7C799ED7943A11, _payload=0x16F1BE7000000000000000000000000000000000000000000000000000000000000007130000000000000000000000000000000000000000000000000000000000000001000000000000000000000000282D299AE68F40BECC3C2A440E2894750B82DE8800000000000000000000000083B34F3C7E13A3C70977701CEA202FC2330C4E47000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004C7D42DD33280000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000AAE92BB933F9EBA2DFE2D9D544A48C547C0CCD3A000000000000000000000000AAE92BB933F9EBA2DFE2D9D544A48C547C0CCD3A00000001000000000000000000000000000000000000000000000000000002120000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000610E30000000000000000000000000000000000000000000000000000005D21DBA000, _refundAddress=0xAAe92bB933F9EbA2dfE2D9D544A48C547C0CcD3a, _zroPaymentAddress=0x777C19834a1A2FF6353a1E9cfb7C799ed7943a11, _adapterParams=0x0002000000000000000000000000000000000000000000000000000000000001E0140000000000000000000000000000000000000000000000000234EFD87FBEE000BC9E47D02D94A5CEE2305199FD8FFA465FC0FFEE )
                              File 1 of 14: HolographBridgeProxy
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              import "../abstract/Admin.sol";
                              import "../abstract/Initializable.sol";
                              import "../interface/InitializableInterface.sol";
                              contract HolographBridgeProxy is Admin, Initializable {
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.bridge')) - 1)
                                 */
                                bytes32 constant _bridgeSlot = 0xeb87cbb21687feb327e3d58c6c16d552231d12c7a0e8115042a4165fac8a77f9;
                                constructor() {}
                                function init(bytes memory data) external override returns (bytes4) {
                                  require(!_isInitialized(), "HOLOGRAPH: already initialized");
                                  (address bridge, bytes memory initCode) = abi.decode(data, (address, bytes));
                                  assembly {
                                    sstore(_adminSlot, origin())
                                    sstore(_bridgeSlot, bridge)
                                  }
                                  (bool success, bytes memory returnData) = bridge.delegatecall(abi.encodeWithSignature("init(bytes)", initCode));
                                  bytes4 selector = abi.decode(returnData, (bytes4));
                                  require(success && selector == InitializableInterface.init.selector, "initialization failed");
                                  _setInitialized();
                                  return InitializableInterface.init.selector;
                                }
                                function getBridge() external view returns (address bridge) {
                                  assembly {
                                    bridge := sload(_bridgeSlot)
                                  }
                                }
                                function setBridge(address bridge) external onlyAdmin {
                                  assembly {
                                    sstore(_bridgeSlot, bridge)
                                  }
                                }
                                receive() external payable {}
                                fallback() external payable {
                                  assembly {
                                    let bridge := sload(_bridgeSlot)
                                    calldatacopy(0, 0, calldatasize())
                                    let result := delegatecall(gas(), bridge, 0, calldatasize(), 0, 0)
                                    returndatacopy(0, 0, returndatasize())
                                    switch result
                                    case 0 {
                                      revert(0, returndatasize())
                                    }
                                    default {
                                      return(0, returndatasize())
                                    }
                                  }
                                }
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              abstract contract Admin {
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.admin')) - 1)
                                 */
                                bytes32 constant _adminSlot = 0x3f106594dc74eeef980dae234cde8324dc2497b13d27a0c59e55bd2ca10a07c9;
                                modifier onlyAdmin() {
                                  require(msg.sender == getAdmin(), "HOLOGRAPH: admin only function");
                                  _;
                                }
                                constructor() {}
                                function admin() public view returns (address) {
                                  return getAdmin();
                                }
                                function getAdmin() public view returns (address adminAddress) {
                                  assembly {
                                    adminAddress := sload(_adminSlot)
                                  }
                                }
                                function setAdmin(address adminAddress) public onlyAdmin {
                                  assembly {
                                    sstore(_adminSlot, adminAddress)
                                  }
                                }
                                function adminCall(address target, bytes calldata data) external payable onlyAdmin {
                                  assembly {
                                    calldatacopy(0, data.offset, data.length)
                                    let result := call(gas(), target, callvalue(), 0, data.length, 0, 0)
                                    returndatacopy(0, 0, returndatasize())
                                    switch result
                                    case 0 {
                                      revert(0, returndatasize())
                                    }
                                    default {
                                      return(0, returndatasize())
                                    }
                                  }
                                }
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              import "../interface/InitializableInterface.sol";
                              /**
                               * @title Initializable
                               * @author https://github.com/holographxyz
                               * @notice Use init instead of constructor
                               * @dev This allows for use of init function to make one time initializations without the need for a constructor
                               */
                              abstract contract Initializable is InitializableInterface {
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.initialized')) - 1)
                                 */
                                bytes32 constant _initializedSlot = 0x4e5f991bca30eca2d4643aaefa807e88f96a4a97398933d572a3c0d973004a01;
                                /**
                                 * @dev Constructor is left empty and init is used instead
                                 */
                                constructor() {}
                                /**
                                 * @notice Used internally to initialize the contract instead of through a constructor
                                 * @dev This function is called by the deployer/factory when creating a contract
                                 * @param initPayload abi encoded payload to use for contract initilaization
                                 */
                                function init(bytes memory initPayload) external virtual returns (bytes4);
                                function _isInitialized() internal view returns (bool initialized) {
                                  assembly {
                                    initialized := sload(_initializedSlot)
                                  }
                                }
                                function _setInitialized() internal {
                                  assembly {
                                    sstore(_initializedSlot, 0x0000000000000000000000000000000000000000000000000000000000000001)
                                  }
                                }
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              /**
                               * @title Initializable
                               * @author https://github.com/holographxyz
                               * @notice Use init instead of constructor
                               * @dev This allows for use of init function to make one time initializations without the need of a constructor
                               */
                              interface InitializableInterface {
                                /**
                                 * @notice Used internally to initialize the contract instead of through a constructor
                                 * @dev This function is called by the deployer/factory when creating a contract
                                 * @param initPayload abi encoded payload to use for contract initilaization
                                 */
                                function init(bytes memory initPayload) external returns (bytes4);
                              }
                              

                              File 2 of 14: Holographer
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              import "../abstract/Admin.sol";
                              import "../abstract/Initializable.sol";
                              import "../interface/HolographInterface.sol";
                              import "../interface/HolographerInterface.sol";
                              import "../interface/HolographRegistryInterface.sol";
                              import "../interface/InitializableInterface.sol";
                              /**
                               * @dev This contract is a binder. It puts together all the variables to make the underlying contracts functional and be bridgeable.
                               */
                              contract Holographer is Admin, Initializable, HolographerInterface {
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.originChain')) - 1)
                                 */
                                bytes32 constant _originChainSlot = 0xd49ffd6af8249d6e6b5963d9d2b22c6db30ad594cb468453047a14e1c1bcde4d;
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.holograph')) - 1)
                                 */
                                bytes32 constant _holographSlot = 0xb4107f746e9496e8452accc7de63d1c5e14c19f510932daa04077cd49e8bd77a;
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.contractType')) - 1)
                                 */
                                bytes32 constant _contractTypeSlot = 0x0b671eb65810897366dd82c4cbb7d9dff8beda8484194956e81e89b8a361d9c7;
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.sourceContract')) - 1)
                                 */
                                bytes32 constant _sourceContractSlot = 0x27d542086d1e831d40b749e7f5509a626c3047a36d160781c40d5acc83e5b074;
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.blockHeight')) - 1)
                                 */
                                bytes32 constant _blockHeightSlot = 0x9172848b0f1df776dc924b58e7fa303087ae0409bbf611608529e7f747d55de3;
                                /**
                                 * @dev Constructor is left empty and init is used instead
                                 */
                                constructor() {}
                                /**
                                 * @notice Used internally to initialize the contract instead of through a constructor
                                 * @dev This function is called by the deployer/factory when creating a contract
                                 * @param initPayload abi encoded payload to use for contract initilaization
                                 */
                                function init(bytes memory initPayload) external override returns (bytes4) {
                                  require(!_isInitialized(), "HOLOGRAPHER: already initialized");
                                  (bytes memory encoded, bytes memory initCode) = abi.decode(initPayload, (bytes, bytes));
                                  (uint32 originChain, address holograph, bytes32 contractType, address sourceContract) = abi.decode(
                                    encoded,
                                    (uint32, address, bytes32, address)
                                  );
                                  assembly {
                                    sstore(_adminSlot, caller())
                                    sstore(_blockHeightSlot, number())
                                    sstore(_contractTypeSlot, contractType)
                                    sstore(_holographSlot, holograph)
                                    sstore(_originChainSlot, originChain)
                                    sstore(_sourceContractSlot, sourceContract)
                                  }
                                  (bool success, bytes memory returnData) = HolographRegistryInterface(HolographInterface(holograph).getRegistry())
                                    .getReservedContractTypeAddress(contractType)
                                    .delegatecall(abi.encodeWithSelector(InitializableInterface.init.selector, initCode));
                                  bytes4 selector = abi.decode(returnData, (bytes4));
                                  require(success && selector == InitializableInterface.init.selector, "HOLOGRAPH: initialization failed");
                                  _setInitialized();
                                  return InitializableInterface.init.selector;
                                }
                                /**
                                 * @dev Returns the contract type that is used for loading the Enforcer
                                 */
                                function getContractType() external view returns (bytes32 contractType) {
                                  assembly {
                                    contractType := sload(_contractTypeSlot)
                                  }
                                }
                                /**
                                 * @dev Returns the block height of when the smart contract was deployed. Useful for retrieving deployment config for re-deployment on other EVM-compatible chains.
                                 */
                                function getDeploymentBlock() external view returns (uint256 deploymentBlock) {
                                  assembly {
                                    deploymentBlock := sload(_blockHeightSlot)
                                  }
                                }
                                /**
                                 * @dev Returns a hardcoded address for the Holograph smart contract.
                                 */
                                function getHolograph() external view returns (address holograph) {
                                  assembly {
                                    holograph := sload(_holographSlot)
                                  }
                                }
                                /**
                                 * @dev Returns a hardcoded address for the Holograph smart contract that controls and enforces the ERC standards.
                                 */
                                function getHolographEnforcer() public view returns (address) {
                                  HolographInterface holograph;
                                  bytes32 contractType;
                                  assembly {
                                    holograph := sload(_holographSlot)
                                    contractType := sload(_contractTypeSlot)
                                  }
                                  return HolographRegistryInterface(holograph.getRegistry()).getReservedContractTypeAddress(contractType);
                                }
                                /**
                                 * @dev Returns the original chain that contract was deployed on.
                                 */
                                function getOriginChain() external view returns (uint32 originChain) {
                                  assembly {
                                    originChain := sload(_originChainSlot)
                                  }
                                }
                                /**
                                 * @dev Returns a hardcoded address for the custom secure storage contract deployed in parallel with this contract deployment.
                                 */
                                function getSourceContract() external view returns (address sourceContract) {
                                  assembly {
                                    sourceContract := sload(_sourceContractSlot)
                                  }
                                }
                                /**
                                 * @dev Purposefully left empty, to prevent running out of gas errors when receiving native token payments.
                                 */
                                receive() external payable {}
                                /**
                                 * @dev This takes the Enforcer's source code, runs it, and uses current address for storage slots.
                                 */
                                fallback() external payable {
                                  address holographEnforcer = getHolographEnforcer();
                                  assembly {
                                    calldatacopy(0, 0, calldatasize())
                                    let result := delegatecall(gas(), holographEnforcer, 0, calldatasize(), 0, 0)
                                    returndatacopy(0, 0, returndatasize())
                                    switch result
                                    case 0 {
                                      revert(0, returndatasize())
                                    }
                                    default {
                                      return(0, returndatasize())
                                    }
                                  }
                                }
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              abstract contract Admin {
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.admin')) - 1)
                                 */
                                bytes32 constant _adminSlot = 0x3f106594dc74eeef980dae234cde8324dc2497b13d27a0c59e55bd2ca10a07c9;
                                modifier onlyAdmin() {
                                  require(msg.sender == getAdmin(), "HOLOGRAPH: admin only function");
                                  _;
                                }
                                constructor() {}
                                function admin() public view returns (address) {
                                  return getAdmin();
                                }
                                function getAdmin() public view returns (address adminAddress) {
                                  assembly {
                                    adminAddress := sload(_adminSlot)
                                  }
                                }
                                function setAdmin(address adminAddress) public onlyAdmin {
                                  assembly {
                                    sstore(_adminSlot, adminAddress)
                                  }
                                }
                                function adminCall(address target, bytes calldata data) external payable onlyAdmin {
                                  assembly {
                                    calldatacopy(0, data.offset, data.length)
                                    let result := call(gas(), target, callvalue(), 0, data.length, 0, 0)
                                    returndatacopy(0, 0, returndatasize())
                                    switch result
                                    case 0 {
                                      revert(0, returndatasize())
                                    }
                                    default {
                                      return(0, returndatasize())
                                    }
                                  }
                                }
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              /**
                               * @title Holograph Protocol
                               * @author https://github.com/holographxyz
                               * @notice This is the primary Holograph Protocol smart contract
                               * @dev This contract stores a reference to all the primary modules and variables of the protocol
                               */
                              interface HolographInterface {
                                /**
                                 * @notice Get the address of the Holograph Bridge module
                                 * @dev Used for beaming holographable assets cross-chain
                                 */
                                function getBridge() external view returns (address bridge);
                                /**
                                 * @notice Update the Holograph Bridge module address
                                 * @param bridge address of the Holograph Bridge smart contract to use
                                 */
                                function setBridge(address bridge) external;
                                /**
                                 * @notice Get the chain ID that the Protocol was deployed on
                                 * @dev Useful for checking if/when a hard fork occurs
                                 */
                                function getChainId() external view returns (uint256 chainId);
                                /**
                                 * @notice Update the chain ID
                                 * @dev Useful for updating once a hard fork has been mitigated
                                 * @param chainId EVM chain ID to use
                                 */
                                function setChainId(uint256 chainId) external;
                                /**
                                 * @notice Get the address of the Holograph Factory module
                                 * @dev Used for deploying holographable smart contracts
                                 */
                                function getFactory() external view returns (address factory);
                                /**
                                 * @notice Update the Holograph Factory module address
                                 * @param factory address of the Holograph Factory smart contract to use
                                 */
                                function setFactory(address factory) external;
                                /**
                                 * @notice Get the Holograph chain Id
                                 * @dev Holograph uses an internal chain id mapping
                                 */
                                function getHolographChainId() external view returns (uint32 holographChainId);
                                /**
                                 * @notice Update the Holograph chain ID
                                 * @dev Useful for updating once a hard fork was mitigated
                                 * @param holographChainId Holograph chain ID to use
                                 */
                                function setHolographChainId(uint32 holographChainId) external;
                                /**
                                 * @notice Get the address of the Holograph Interfaces module
                                 * @dev Holograph uses this contract to store data that needs to be accessed by a large portion of the modules
                                 */
                                function getInterfaces() external view returns (address interfaces);
                                /**
                                 * @notice Update the Holograph Interfaces module address
                                 * @param interfaces address of the Holograph Interfaces smart contract to use
                                 */
                                function setInterfaces(address interfaces) external;
                                /**
                                 * @notice Get the address of the Holograph Operator module
                                 * @dev All cross-chain Holograph Bridge beams are handled by the Holograph Operator module
                                 */
                                function getOperator() external view returns (address operator);
                                /**
                                 * @notice Update the Holograph Operator module address
                                 * @param operator address of the Holograph Operator smart contract to use
                                 */
                                function setOperator(address operator) external;
                                /**
                                 * @notice Get the Holograph Registry module
                                 * @dev This module stores a reference for all deployed holographable smart contracts
                                 */
                                function getRegistry() external view returns (address registry);
                                /**
                                 * @notice Update the Holograph Registry module address
                                 * @param registry address of the Holograph Registry smart contract to use
                                 */
                                function setRegistry(address registry) external;
                                /**
                                 * @notice Get the Holograph Treasury module
                                 * @dev All of the Holograph Protocol assets are stored and managed by this module
                                 */
                                function getTreasury() external view returns (address treasury);
                                /**
                                 * @notice Update the Holograph Treasury module address
                                 * @param treasury address of the Holograph Treasury smart contract to use
                                 */
                                function setTreasury(address treasury) external;
                                /**
                                 * @notice Get the Holograph Utility Token address
                                 * @dev This is the official utility token of the Holograph Protocol
                                 */
                                function getUtilityToken() external view returns (address utilityToken);
                                /**
                                 * @notice Update the Holograph Utility Token address
                                 * @param utilityToken address of the Holograph Utility Token smart contract to use
                                 */
                                function setUtilityToken(address utilityToken) external;
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              import "../interface/InitializableInterface.sol";
                              /**
                               * @title Initializable
                               * @author https://github.com/holographxyz
                               * @notice Use init instead of constructor
                               * @dev This allows for use of init function to make one time initializations without the need for a constructor
                               */
                              abstract contract Initializable is InitializableInterface {
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.initialized')) - 1)
                                 */
                                bytes32 constant _initializedSlot = 0x4e5f991bca30eca2d4643aaefa807e88f96a4a97398933d572a3c0d973004a01;
                                /**
                                 * @dev Constructor is left empty and init is used instead
                                 */
                                constructor() {}
                                /**
                                 * @notice Used internally to initialize the contract instead of through a constructor
                                 * @dev This function is called by the deployer/factory when creating a contract
                                 * @param initPayload abi encoded payload to use for contract initilaization
                                 */
                                function init(bytes memory initPayload) external virtual returns (bytes4);
                                function _isInitialized() internal view returns (bool initialized) {
                                  assembly {
                                    initialized := sload(_initializedSlot)
                                  }
                                }
                                function _setInitialized() internal {
                                  assembly {
                                    sstore(_initializedSlot, 0x0000000000000000000000000000000000000000000000000000000000000001)
                                  }
                                }
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              interface HolographerInterface {
                                function getContractType() external view returns (bytes32 contractType);
                                function getDeploymentBlock() external view returns (uint256 deploymentBlock);
                                function getHolograph() external view returns (address holograph);
                                function getHolographEnforcer() external view returns (address);
                                function getOriginChain() external view returns (uint32 originChain);
                                function getSourceContract() external view returns (address sourceContract);
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              interface HolographRegistryInterface {
                                function isHolographedContract(address smartContract) external view returns (bool);
                                function isHolographedHashDeployed(bytes32 hash) external view returns (bool);
                                function referenceContractTypeAddress(address contractAddress) external returns (bytes32);
                                function getContractTypeAddress(bytes32 contractType) external view returns (address);
                                function setContractTypeAddress(bytes32 contractType, address contractAddress) external;
                                function getHolograph() external view returns (address holograph);
                                function setHolograph(address holograph) external;
                                function getHolographableContracts(uint256 index, uint256 length) external view returns (address[] memory contracts);
                                function getHolographableContractsLength() external view returns (uint256);
                                function getHolographedHashAddress(bytes32 hash) external view returns (address);
                                function setHolographedHashAddress(bytes32 hash, address contractAddress) external;
                                function getHToken(uint32 chainId) external view returns (address);
                                function setHToken(uint32 chainId, address hToken) external;
                                function getReservedContractTypeAddress(bytes32 contractType) external view returns (address contractTypeAddress);
                                function setReservedContractTypeAddress(bytes32 hash, bool reserved) external;
                                function setReservedContractTypeAddresses(bytes32[] calldata hashes, bool[] calldata reserved) external;
                                function getUtilityToken() external view returns (address utilityToken);
                                function setUtilityToken(address utilityToken) external;
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              /**
                               * @title Initializable
                               * @author https://github.com/holographxyz
                               * @notice Use init instead of constructor
                               * @dev This allows for use of init function to make one time initializations without the need of a constructor
                               */
                              interface InitializableInterface {
                                /**
                                 * @notice Used internally to initialize the contract instead of through a constructor
                                 * @dev This function is called by the deployer/factory when creating a contract
                                 * @param initPayload abi encoded payload to use for contract initilaization
                                 */
                                function init(bytes memory initPayload) external returns (bytes4);
                              }
                              

                              File 3 of 14: HolographRegistryProxy
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              import "../abstract/Admin.sol";
                              import "../abstract/Initializable.sol";
                              import "../interface/InitializableInterface.sol";
                              contract HolographRegistryProxy is Admin, Initializable {
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.registry')) - 1)
                                 */
                                bytes32 constant _registrySlot = 0xce8e75d5c5227ce29a4ee170160bb296e5dea6934b80a9bd723f7ef1e7c850e7;
                                constructor() {}
                                function init(bytes memory data) external override returns (bytes4) {
                                  require(!_isInitialized(), "HOLOGRAPH: already initialized");
                                  (address registry, bytes memory initCode) = abi.decode(data, (address, bytes));
                                  assembly {
                                    sstore(_adminSlot, origin())
                                    sstore(_registrySlot, registry)
                                  }
                                  (bool success, bytes memory returnData) = registry.delegatecall(abi.encodeWithSignature("init(bytes)", initCode));
                                  bytes4 selector = abi.decode(returnData, (bytes4));
                                  require(success && selector == InitializableInterface.init.selector, "initialization failed");
                                  _setInitialized();
                                  return InitializableInterface.init.selector;
                                }
                                function getRegistry() external view returns (address registry) {
                                  assembly {
                                    registry := sload(_registrySlot)
                                  }
                                }
                                function setRegistry(address registry) external onlyAdmin {
                                  assembly {
                                    sstore(_registrySlot, registry)
                                  }
                                }
                                receive() external payable {}
                                fallback() external payable {
                                  assembly {
                                    let registry := sload(_registrySlot)
                                    calldatacopy(0, 0, calldatasize())
                                    let result := delegatecall(gas(), registry, 0, calldatasize(), 0, 0)
                                    returndatacopy(0, 0, returndatasize())
                                    switch result
                                    case 0 {
                                      revert(0, returndatasize())
                                    }
                                    default {
                                      return(0, returndatasize())
                                    }
                                  }
                                }
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              abstract contract Admin {
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.admin')) - 1)
                                 */
                                bytes32 constant _adminSlot = 0x3f106594dc74eeef980dae234cde8324dc2497b13d27a0c59e55bd2ca10a07c9;
                                modifier onlyAdmin() {
                                  require(msg.sender == getAdmin(), "HOLOGRAPH: admin only function");
                                  _;
                                }
                                constructor() {}
                                function admin() public view returns (address) {
                                  return getAdmin();
                                }
                                function getAdmin() public view returns (address adminAddress) {
                                  assembly {
                                    adminAddress := sload(_adminSlot)
                                  }
                                }
                                function setAdmin(address adminAddress) public onlyAdmin {
                                  assembly {
                                    sstore(_adminSlot, adminAddress)
                                  }
                                }
                                function adminCall(address target, bytes calldata data) external payable onlyAdmin {
                                  assembly {
                                    calldatacopy(0, data.offset, data.length)
                                    let result := call(gas(), target, callvalue(), 0, data.length, 0, 0)
                                    returndatacopy(0, 0, returndatasize())
                                    switch result
                                    case 0 {
                                      revert(0, returndatasize())
                                    }
                                    default {
                                      return(0, returndatasize())
                                    }
                                  }
                                }
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              import "../interface/InitializableInterface.sol";
                              /**
                               * @title Initializable
                               * @author https://github.com/holographxyz
                               * @notice Use init instead of constructor
                               * @dev This allows for use of init function to make one time initializations without the need for a constructor
                               */
                              abstract contract Initializable is InitializableInterface {
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.initialized')) - 1)
                                 */
                                bytes32 constant _initializedSlot = 0x4e5f991bca30eca2d4643aaefa807e88f96a4a97398933d572a3c0d973004a01;
                                /**
                                 * @dev Constructor is left empty and init is used instead
                                 */
                                constructor() {}
                                /**
                                 * @notice Used internally to initialize the contract instead of through a constructor
                                 * @dev This function is called by the deployer/factory when creating a contract
                                 * @param initPayload abi encoded payload to use for contract initilaization
                                 */
                                function init(bytes memory initPayload) external virtual returns (bytes4);
                                function _isInitialized() internal view returns (bool initialized) {
                                  assembly {
                                    initialized := sload(_initializedSlot)
                                  }
                                }
                                function _setInitialized() internal {
                                  assembly {
                                    sstore(_initializedSlot, 0x0000000000000000000000000000000000000000000000000000000000000001)
                                  }
                                }
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              /**
                               * @title Initializable
                               * @author https://github.com/holographxyz
                               * @notice Use init instead of constructor
                               * @dev This allows for use of init function to make one time initializations without the need of a constructor
                               */
                              interface InitializableInterface {
                                /**
                                 * @notice Used internally to initialize the contract instead of through a constructor
                                 * @dev This function is called by the deployer/factory when creating a contract
                                 * @param initPayload abi encoded payload to use for contract initilaization
                                 */
                                function init(bytes memory initPayload) external returns (bytes4);
                              }
                              

                              File 4 of 14: UltraLightNodeV2
                              {"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"}}

                              File 5 of 14: HolographOperatorProxy
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              import "../abstract/Admin.sol";
                              import "../abstract/Initializable.sol";
                              import "../interface/InitializableInterface.sol";
                              contract HolographOperatorProxy is Admin, Initializable {
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.operator')) - 1)
                                 */
                                bytes32 constant _operatorSlot = 0x7caba557ad34138fa3b7e43fb574e0e6cc10481c3073e0dffbc560db81b5c60f;
                                constructor() {}
                                function init(bytes memory data) external override returns (bytes4) {
                                  require(!_isInitialized(), "HOLOGRAPH: already initialized");
                                  (address operator, bytes memory initCode) = abi.decode(data, (address, bytes));
                                  assembly {
                                    sstore(_adminSlot, origin())
                                    sstore(_operatorSlot, operator)
                                  }
                                  (bool success, bytes memory returnData) = operator.delegatecall(abi.encodeWithSignature("init(bytes)", initCode));
                                  bytes4 selector = abi.decode(returnData, (bytes4));
                                  require(success && selector == InitializableInterface.init.selector, "initialization failed");
                                  _setInitialized();
                                  return InitializableInterface.init.selector;
                                }
                                function getOperator() external view returns (address operator) {
                                  assembly {
                                    operator := sload(_operatorSlot)
                                  }
                                }
                                function setOperator(address operator) external onlyAdmin {
                                  assembly {
                                    sstore(_operatorSlot, operator)
                                  }
                                }
                                receive() external payable {}
                                fallback() external payable {
                                  assembly {
                                    let operator := sload(_operatorSlot)
                                    calldatacopy(0, 0, calldatasize())
                                    let result := delegatecall(gas(), operator, 0, calldatasize(), 0, 0)
                                    returndatacopy(0, 0, returndatasize())
                                    switch result
                                    case 0 {
                                      revert(0, returndatasize())
                                    }
                                    default {
                                      return(0, returndatasize())
                                    }
                                  }
                                }
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              abstract contract Admin {
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.admin')) - 1)
                                 */
                                bytes32 constant _adminSlot = 0x3f106594dc74eeef980dae234cde8324dc2497b13d27a0c59e55bd2ca10a07c9;
                                modifier onlyAdmin() {
                                  require(msg.sender == getAdmin(), "HOLOGRAPH: admin only function");
                                  _;
                                }
                                constructor() {}
                                function admin() public view returns (address) {
                                  return getAdmin();
                                }
                                function getAdmin() public view returns (address adminAddress) {
                                  assembly {
                                    adminAddress := sload(_adminSlot)
                                  }
                                }
                                function setAdmin(address adminAddress) public onlyAdmin {
                                  assembly {
                                    sstore(_adminSlot, adminAddress)
                                  }
                                }
                                function adminCall(address target, bytes calldata data) external payable onlyAdmin {
                                  assembly {
                                    calldatacopy(0, data.offset, data.length)
                                    let result := call(gas(), target, callvalue(), 0, data.length, 0, 0)
                                    returndatacopy(0, 0, returndatasize())
                                    switch result
                                    case 0 {
                                      revert(0, returndatasize())
                                    }
                                    default {
                                      return(0, returndatasize())
                                    }
                                  }
                                }
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              import "../interface/InitializableInterface.sol";
                              /**
                               * @title Initializable
                               * @author https://github.com/holographxyz
                               * @notice Use init instead of constructor
                               * @dev This allows for use of init function to make one time initializations without the need for a constructor
                               */
                              abstract contract Initializable is InitializableInterface {
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.initialized')) - 1)
                                 */
                                bytes32 constant _initializedSlot = 0x4e5f991bca30eca2d4643aaefa807e88f96a4a97398933d572a3c0d973004a01;
                                /**
                                 * @dev Constructor is left empty and init is used instead
                                 */
                                constructor() {}
                                /**
                                 * @notice Used internally to initialize the contract instead of through a constructor
                                 * @dev This function is called by the deployer/factory when creating a contract
                                 * @param initPayload abi encoded payload to use for contract initilaization
                                 */
                                function init(bytes memory initPayload) external virtual returns (bytes4);
                                function _isInitialized() internal view returns (bool initialized) {
                                  assembly {
                                    initialized := sload(_initializedSlot)
                                  }
                                }
                                function _setInitialized() internal {
                                  assembly {
                                    sstore(_initializedSlot, 0x0000000000000000000000000000000000000000000000000000000000000001)
                                  }
                                }
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              /**
                               * @title Initializable
                               * @author https://github.com/holographxyz
                               * @notice Use init instead of constructor
                               * @dev This allows for use of init function to make one time initializations without the need of a constructor
                               */
                              interface InitializableInterface {
                                /**
                                 * @notice Used internally to initialize the contract instead of through a constructor
                                 * @dev This function is called by the deployer/factory when creating a contract
                                 * @param initPayload abi encoded payload to use for contract initilaization
                                 */
                                function init(bytes memory initPayload) external returns (bytes4);
                              }
                              

                              File 6 of 14: HolographBridge
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              import "./abstract/Admin.sol";
                              import "./abstract/Initializable.sol";
                              import "./interface/HolographERC20Interface.sol";
                              import "./interface/Holographable.sol";
                              import "./interface/HolographInterface.sol";
                              import "./interface/HolographBridgeInterface.sol";
                              import "./interface/HolographFactoryInterface.sol";
                              import "./interface/HolographOperatorInterface.sol";
                              import "./interface/HolographRegistryInterface.sol";
                              import "./interface/InitializableInterface.sol";
                              /**
                               * @title Holograph Bridge
                               * @author https://github.com/holographxyz
                               * @notice Beam any holographable contracts and assets across blockchains
                               * @dev The contract abstracts all the complexities of making bridge requests and uses a universal interface to bridge any type of holographable assets
                               */
                              contract HolographBridge is Admin, Initializable, HolographBridgeInterface {
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.factory')) - 1)
                                 */
                                bytes32 constant _factorySlot = 0xa49f20855ba576e09d13c8041c8039fa655356ea27f6c40f1ec46a4301cd5b23;
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.holograph')) - 1)
                                 */
                                bytes32 constant _holographSlot = 0xb4107f746e9496e8452accc7de63d1c5e14c19f510932daa04077cd49e8bd77a;
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.jobNonce')) - 1)
                                 */
                                bytes32 constant _jobNonceSlot = 0x1cda64803f3b43503042e00863791e8d996666552d5855a78d53ee1dd4b3286d;
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.operator')) - 1)
                                 */
                                bytes32 constant _operatorSlot = 0x7caba557ad34138fa3b7e43fb574e0e6cc10481c3073e0dffbc560db81b5c60f;
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.registry')) - 1)
                                 */
                                bytes32 constant _registrySlot = 0xce8e75d5c5227ce29a4ee170160bb296e5dea6934b80a9bd723f7ef1e7c850e7;
                                /**
                                 * @dev Allow calls only from Holograph Operator contract
                                 */
                                modifier onlyOperator() {
                                  require(msg.sender == address(_operator()), "HOLOGRAPH: operator only call");
                                  _;
                                }
                                /**
                                 * @dev Constructor is left empty and init is used instead
                                 */
                                constructor() {}
                                /**
                                 * @notice Used internally to initialize the contract instead of through a constructor
                                 * @dev This function is called by the deployer/factory when creating a contract
                                 * @param initPayload abi encoded payload to use for contract initilaization
                                 */
                                function init(bytes memory initPayload) external override returns (bytes4) {
                                  require(!_isInitialized(), "HOLOGRAPH: already initialized");
                                  (address factory, address holograph, address operator, address registry) = abi.decode(
                                    initPayload,
                                    (address, address, address, address)
                                  );
                                  assembly {
                                    sstore(_adminSlot, origin())
                                    sstore(_factorySlot, factory)
                                    sstore(_holographSlot, holograph)
                                    sstore(_operatorSlot, operator)
                                    sstore(_registrySlot, registry)
                                  }
                                  _setInitialized();
                                  return InitializableInterface.init.selector;
                                }
                                /**
                                 * @notice Receive a beam from another chain
                                 * @dev This function can only be called by the Holograph Operator module
                                 * @param fromChain Holograph Chain ID where the brigeOutRequest was created
                                 * @param holographableContract address of the destination contract that the bridgeInRequest is targeted for
                                 * @param hToken address of the hToken contract that wrapped the origin chain native gas token
                                 * @param hTokenRecipient address of recipient for the hToken reward
                                 * @param hTokenValue exact amount of hToken reward in wei
                                 * @param doNotRevert boolean used to specify if the call should revert
                                 * @param bridgeInPayload actual abi encoded bytes of the data that the holographable contract bridgeIn function will receive
                                 */
                                function bridgeInRequest(
                                  uint256, /* nonce*/
                                  uint32 fromChain,
                                  address holographableContract,
                                  address hToken,
                                  address hTokenRecipient,
                                  uint256 hTokenValue,
                                  bool doNotRevert,
                                  bytes calldata bridgeInPayload
                                ) external payable onlyOperator {
                                  /**
                                   * @dev check that the target contract is either Holograph Factory or a deployed holographable contract
                                   */
                                  require(
                                    _registry().isHolographedContract(holographableContract) || address(_factory()) == holographableContract,
                                    "HOLOGRAPH: not holographed"
                                  );
                                  /**
                                   * @dev make a bridgeIn function call to the holographable contract
                                   */
                                  bytes4 selector = Holographable(holographableContract).bridgeIn(fromChain, bridgeInPayload);
                                  /**
                                   * @dev ensure returned selector is bridgeIn function signature, to guarantee that the function was called and succeeded
                                   */
                                  require(selector == Holographable.bridgeIn.selector, "HOLOGRAPH: bridge in failed");
                                  /**
                                   * @dev check if a specific reward amount was assigned to this request
                                   */
                                  if (hTokenValue > 0 && hTokenRecipient != address(0)) {
                                    /**
                                     * @dev mint the specific hToken amount for hToken recipient
                                     *      this value is equivalent to amount that is deposited on origin chain's hToken contract
                                     *      recipient can beam the asset to origin chain and unwrap for native gas token at any time
                                     */
                                    require(
                                      HolographERC20Interface(hToken).holographBridgeMint(hTokenRecipient, hTokenValue) ==
                                        HolographERC20Interface.holographBridgeMint.selector,
                                      "HOLOGRAPH: hToken mint failed"
                                    );
                                  }
                                  /**
                                   * @dev allow the call to revert on demand, for example use case, look into the Holograph Operator's jobEstimator function
                                   */
                                  require(doNotRevert, "HOLOGRAPH: reverted");
                                }
                                /**
                                 * @notice Create a beam request for a destination chain
                                 * @dev This function works for deploying contracts and beaming supported holographable assets across chains
                                 * @param toChain Holograph Chain ID where the beam is being sent to
                                 * @param holographableContract address of the contract for which the bridge request is being made
                                 * @param gasLimit maximum amount of gas to spend for executing the beam on destination chain
                                 * @param gasPrice maximum amount of gas price (in destination chain native gas token) to pay on destination chain
                                 * @param bridgeOutPayload actual abi encoded bytes of the data that the holographable contract bridgeOut function will receive
                                 */
                                function bridgeOutRequest(
                                  uint32 toChain,
                                  address holographableContract,
                                  uint256 gasLimit,
                                  uint256 gasPrice,
                                  bytes calldata bridgeOutPayload
                                ) external payable {
                                  /**
                                   * @dev check that the target contract is either Holograph Factory or a deployed holographable contract
                                   */
                                  require(
                                    _registry().isHolographedContract(holographableContract) || address(_factory()) == holographableContract,
                                    "HOLOGRAPH: not holographed"
                                  );
                                  /**
                                   * @dev make a bridgeOut function call to the holographable contract
                                   */
                                  (bytes4 selector, bytes memory returnedPayload) = Holographable(holographableContract).bridgeOut(
                                    toChain,
                                    msg.sender,
                                    bridgeOutPayload
                                  );
                                  /**
                                   * @dev ensure returned selector is bridgeOut function signature, to guarantee that the function was called and succeeded
                                   */
                                  require(selector == Holographable.bridgeOut.selector, "HOLOGRAPH: bridge out failed");
                                  /**
                                   * @dev pass the request, along with all data, to Holograph Operator, to handle the cross-chain messaging logic
                                   */
                                  _operator().send{value: msg.value}(
                                    gasLimit,
                                    gasPrice,
                                    toChain,
                                    msg.sender,
                                    _jobNonce(),
                                    holographableContract,
                                    returnedPayload
                                  );
                                }
                                /**
                                 * @notice Do not call this function, it will always revert
                                 * @dev Used by getBridgeOutRequestPayload function
                                 *      It is purposefully inverted to always revert on a successful call
                                 *      Marked as external and not private to allow use inside try/catch of getBridgeOutRequestPayload function
                                 *      If this function does not revert and returns a string, it is the actual revert reason
                                 * @param sender address of actual sender that is planning to make a bridgeOutRequest call
                                 * @param toChain holograph chain id of destination chain
                                 * @param holographableContract address of the contract for which the bridge request is being made
                                 * @param bridgeOutPayload actual abi encoded bytes of the data that the holographable contract bridgeOut function will receive
                                 */
                                function revertedBridgeOutRequest(
                                  address sender,
                                  uint32 toChain,
                                  address holographableContract,
                                  bytes calldata bridgeOutPayload
                                ) external returns (string memory revertReason) {
                                  /**
                                   * @dev make a bridgeOut function call to the holographable contract inside of a try/catch
                                   */
                                  try Holographable(holographableContract).bridgeOut(toChain, sender, bridgeOutPayload) returns (
                                    bytes4 selector,
                                    bytes memory payload
                                  ) {
                                    /**
                                     * @dev ensure returned selector is bridgeOut function signature, to guarantee that the function was called and succeeded
                                     */
                                    if (selector != Holographable.bridgeOut.selector) {
                                      /**
                                       * @dev if selector does not match, then it means the request failed
                                       */
                                      return "HOLOGRAPH: bridge out failed";
                                    }
                                    assembly {
                                      /**
                                       * @dev the entire payload is sent back in a revert
                                       */
                                      revert(add(payload, 0x20), mload(payload))
                                    }
                                  } catch Error(string memory reason) {
                                    return reason;
                                  } catch {
                                    return "HOLOGRAPH: unknown error";
                                  }
                                }
                                /**
                                 * @notice Get the payload created by the bridgeOutRequest function
                                 * @dev Use this function to get the payload that will be generated by a bridgeOutRequest
                                 *      Only use this with a static call
                                 * @param toChain Holograph Chain ID where the beam is being sent to
                                 * @param holographableContract address of the contract for which the bridge request is being made
                                 * @param gasLimit maximum amount of gas to spend for executing the beam on destination chain
                                 * @param gasPrice maximum amount of gas price (in destination chain native gas token) to pay on destination chain
                                 * @param bridgeOutPayload actual abi encoded bytes of the data that the holographable contract bridgeOut function will receive
                                 * @return samplePayload bytes made up of the bridgeOutRequest payload
                                 */
                                function getBridgeOutRequestPayload(
                                  uint32 toChain,
                                  address holographableContract,
                                  uint256 gasLimit,
                                  uint256 gasPrice,
                                  bytes calldata bridgeOutPayload
                                ) external returns (bytes memory samplePayload) {
                                  /**
                                   * @dev check that the target contract is either Holograph Factory or a deployed holographable contract
                                   */
                                  require(
                                    _registry().isHolographedContract(holographableContract) || address(_factory()) == holographableContract,
                                    "HOLOGRAPH: not holographed"
                                  );
                                  bytes memory payload;
                                  /**
                                   * @dev the revertedBridgeOutRequest function is wrapped into a try/catch function
                                   */
                                  try this.revertedBridgeOutRequest(msg.sender, toChain, holographableContract, bridgeOutPayload) returns (
                                    string memory revertReason
                                  ) {
                                    /**
                                     * @dev a non reverted result is actually a revert
                                     */
                                    revert(revertReason);
                                  } catch (bytes memory realResponse) {
                                    /**
                                     * @dev a revert is actually success, so the return data is stored as payload
                                     */
                                    payload = realResponse;
                                  }
                                  uint256 jobNonce;
                                  assembly {
                                    jobNonce := sload(_jobNonceSlot)
                                  }
                                  /**
                                   * @dev extract hlgFee from operator
                                   */
                                  uint256 fee = 0;
                                  if (gasPrice < type(uint256).max && gasLimit < type(uint256).max) {
                                    (uint256 hlgFee, , uint256 dstGasPrice) = _operator().getMessageFee(
                                      toChain,
                                      gasLimit,
                                      gasPrice,
                                      bridgeOutPayload
                                    );
                                    if (gasPrice == 0) {
                                      gasPrice = dstGasPrice;
                                    }
                                    fee = hlgFee;
                                  }
                                  /**
                                   * @dev the data is abi encoded into actual bridgeOutRequest payload bytes
                                   */
                                  bytes memory encodedData = abi.encodeWithSelector(
                                    HolographBridgeInterface.bridgeInRequest.selector,
                                    /**
                                     * @dev the latest job nonce is incremented by one
                                     */
                                    jobNonce + 1,
                                    _holograph().getHolographChainId(),
                                    holographableContract,
                                    _registry().getHToken(_holograph().getHolographChainId()),
                                    address(0),
                                    fee,
                                    true,
                                    payload
                                  );
                                  /**
                                   * @dev this abi encodes the data just like in Holograph Operator
                                   */
                                  samplePayload = abi.encodePacked(encodedData, gasLimit, gasPrice);
                                }
                                /**
                                 * @notice Get the fees associated with sending specific payload
                                 * @dev Will provide exact costs on protocol and message side, combine the two to get total
                                 * @dev @param toChain holograph chain id of destination chain for payload
                                 * @dev @param gasLimit amount of gas to provide for executing payload on destination chain
                                 * @dev @param gasPrice maximum amount to pay for gas price, can be set to 0 and will be chose automatically
                                 * @dev @param crossChainPayload the entire packet being sent cross-chain
                                 * @return hlgFee the amount (in wei) of native gas token that will cost for finalizing job on destiantion chain
                                 * @return msgFee the amount (in wei) of native gas token that will cost for sending message to destiantion chain
                                 * @return dstGasPrice the amount (in wei) that destination message maximum gas price will be
                                 */
                                function getMessageFee(
                                  uint32,
                                  uint256,
                                  uint256,
                                  bytes calldata
                                )
                                  external
                                  view
                                  returns (
                                    uint256,
                                    uint256,
                                    uint256
                                  )
                                {
                                  assembly {
                                    calldatacopy(0, 0, calldatasize())
                                    let result := staticcall(gas(), sload(_operatorSlot), 0, calldatasize(), 0, 0)
                                    returndatacopy(0, 0, returndatasize())
                                    switch result
                                    case 0 {
                                      revert(0, returndatasize())
                                    }
                                    default {
                                      return(0, returndatasize())
                                    }
                                  }
                                }
                                /**
                                 * @notice Get the address of the Holograph Factory module
                                 * @dev Used for deploying holographable smart contracts
                                 */
                                function getFactory() external view returns (address factory) {
                                  assembly {
                                    factory := sload(_factorySlot)
                                  }
                                }
                                /**
                                 * @notice Update the Holograph Factory module address
                                 * @param factory address of the Holograph Factory smart contract to use
                                 */
                                function setFactory(address factory) external onlyAdmin {
                                  assembly {
                                    sstore(_factorySlot, factory)
                                  }
                                }
                                /**
                                 * @notice Get the Holograph Protocol contract
                                 * @dev Used for storing a reference to all the primary modules and variables of the protocol
                                 */
                                function getHolograph() external view returns (address holograph) {
                                  assembly {
                                    holograph := sload(_holographSlot)
                                  }
                                }
                                /**
                                 * @notice Update the Holograph Protocol contract address
                                 * @param holograph address of the Holograph Protocol smart contract to use
                                 */
                                function setHolograph(address holograph) external onlyAdmin {
                                  assembly {
                                    sstore(_holographSlot, holograph)
                                  }
                                }
                                /**
                                 * @notice Get the latest job nonce
                                 * @dev You can use the job nonce as a way to calculate total amount of bridge requests that have been made
                                 */
                                function getJobNonce() external view returns (uint256 jobNonce) {
                                  assembly {
                                    jobNonce := sload(_jobNonceSlot)
                                  }
                                }
                                /**
                                 * @notice Get the address of the Holograph Operator module
                                 * @dev All cross-chain Holograph Bridge beams are handled by the Holograph Operator module
                                 */
                                function getOperator() external view returns (address operator) {
                                  assembly {
                                    operator := sload(_operatorSlot)
                                  }
                                }
                                /**
                                 * @notice Update the Holograph Operator module address
                                 * @param operator address of the Holograph Operator smart contract to use
                                 */
                                function setOperator(address operator) external onlyAdmin {
                                  assembly {
                                    sstore(_operatorSlot, operator)
                                  }
                                }
                                /**
                                 * @notice Get the Holograph Registry module
                                 * @dev This module stores a reference for all deployed holographable smart contracts
                                 */
                                function getRegistry() external view returns (address registry) {
                                  assembly {
                                    registry := sload(_registrySlot)
                                  }
                                }
                                /**
                                 * @notice Update the Holograph Registry module address
                                 * @param registry address of the Holograph Registry smart contract to use
                                 */
                                function setRegistry(address registry) external onlyAdmin {
                                  assembly {
                                    sstore(_registrySlot, registry)
                                  }
                                }
                                /**
                                 * @dev Internal function used for getting the Holograph Factory Interface
                                 */
                                function _factory() private view returns (HolographFactoryInterface factory) {
                                  assembly {
                                    factory := sload(_factorySlot)
                                  }
                                }
                                /**
                                 * @dev Internal function used for getting the Holograph Interface
                                 */
                                function _holograph() private view returns (HolographInterface holograph) {
                                  assembly {
                                    holograph := sload(_holographSlot)
                                  }
                                }
                                /**
                                 * @dev Internal nonce, that increments on each call, used for randomness
                                 */
                                function _jobNonce() private returns (uint256 jobNonce) {
                                  assembly {
                                    jobNonce := add(sload(_jobNonceSlot), 0x0000000000000000000000000000000000000000000000000000000000000001)
                                    sstore(_jobNonceSlot, jobNonce)
                                  }
                                }
                                /**
                                 * @dev Internal function used for getting the Holograph Operator Interface
                                 */
                                function _operator() private view returns (HolographOperatorInterface operator) {
                                  assembly {
                                    operator := sload(_operatorSlot)
                                  }
                                }
                                /**
                                 * @dev Internal function used for getting the Holograph Registry Interface
                                 */
                                function _registry() private view returns (HolographRegistryInterface registry) {
                                  assembly {
                                    registry := sload(_registrySlot)
                                  }
                                }
                                /**
                                 * @dev Purposefully reverts to prevent having any type of ether transfered into the contract
                                 */
                                receive() external payable {
                                  revert();
                                }
                                /**
                                 * @dev Purposefully reverts to prevent any calls to undefined functions
                                 */
                                fallback() external payable {
                                  revert();
                                }
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              abstract contract Admin {
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.admin')) - 1)
                                 */
                                bytes32 constant _adminSlot = 0x3f106594dc74eeef980dae234cde8324dc2497b13d27a0c59e55bd2ca10a07c9;
                                modifier onlyAdmin() {
                                  require(msg.sender == getAdmin(), "HOLOGRAPH: admin only function");
                                  _;
                                }
                                constructor() {}
                                function admin() public view returns (address) {
                                  return getAdmin();
                                }
                                function getAdmin() public view returns (address adminAddress) {
                                  assembly {
                                    adminAddress := sload(_adminSlot)
                                  }
                                }
                                function setAdmin(address adminAddress) public onlyAdmin {
                                  assembly {
                                    sstore(_adminSlot, adminAddress)
                                  }
                                }
                                function adminCall(address target, bytes calldata data) external payable onlyAdmin {
                                  assembly {
                                    calldatacopy(0, data.offset, data.length)
                                    let result := call(gas(), target, callvalue(), 0, data.length, 0, 0)
                                    returndatacopy(0, 0, returndatasize())
                                    switch result
                                    case 0 {
                                      revert(0, returndatasize())
                                    }
                                    default {
                                      return(0, returndatasize())
                                    }
                                  }
                                }
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              import "../interface/InitializableInterface.sol";
                              /**
                               * @title Initializable
                               * @author https://github.com/holographxyz
                               * @notice Use init instead of constructor
                               * @dev This allows for use of init function to make one time initializations without the need for a constructor
                               */
                              abstract contract Initializable is InitializableInterface {
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.initialized')) - 1)
                                 */
                                bytes32 constant _initializedSlot = 0x4e5f991bca30eca2d4643aaefa807e88f96a4a97398933d572a3c0d973004a01;
                                /**
                                 * @dev Constructor is left empty and init is used instead
                                 */
                                constructor() {}
                                /**
                                 * @notice Used internally to initialize the contract instead of through a constructor
                                 * @dev This function is called by the deployer/factory when creating a contract
                                 * @param initPayload abi encoded payload to use for contract initilaization
                                 */
                                function init(bytes memory initPayload) external virtual returns (bytes4);
                                function _isInitialized() internal view returns (bool initialized) {
                                  assembly {
                                    initialized := sload(_initializedSlot)
                                  }
                                }
                                function _setInitialized() internal {
                                  assembly {
                                    sstore(_initializedSlot, 0x0000000000000000000000000000000000000000000000000000000000000001)
                                  }
                                }
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              import "./ERC20.sol";
                              import "./ERC20Burnable.sol";
                              import "./ERC20Metadata.sol";
                              import "./ERC20Permit.sol";
                              import "./ERC20Receiver.sol";
                              import "./ERC20Safer.sol";
                              import "./ERC165.sol";
                              import "./Holographable.sol";
                              interface HolographERC20Interface is
                                ERC165,
                                ERC20,
                                ERC20Burnable,
                                ERC20Metadata,
                                ERC20Receiver,
                                ERC20Safer,
                                ERC20Permit,
                                Holographable
                              {
                                function holographBridgeMint(address to, uint256 amount) external returns (bytes4);
                                function sourceBurn(address from, uint256 amount) external;
                                function sourceMint(address to, uint256 amount) external;
                                function sourceMintBatch(address[] calldata wallets, uint256[] calldata amounts) external;
                                function sourceTransfer(
                                  address from,
                                  address to,
                                  uint256 amount
                                ) external;
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              interface Holographable {
                                function bridgeIn(uint32 fromChain, bytes calldata payload) external returns (bytes4);
                                function bridgeOut(
                                  uint32 toChain,
                                  address sender,
                                  bytes calldata payload
                                ) external returns (bytes4 selector, bytes memory data);
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              /**
                               * @title Holograph Protocol
                               * @author https://github.com/holographxyz
                               * @notice This is the primary Holograph Protocol smart contract
                               * @dev This contract stores a reference to all the primary modules and variables of the protocol
                               */
                              interface HolographInterface {
                                /**
                                 * @notice Get the address of the Holograph Bridge module
                                 * @dev Used for beaming holographable assets cross-chain
                                 */
                                function getBridge() external view returns (address bridge);
                                /**
                                 * @notice Update the Holograph Bridge module address
                                 * @param bridge address of the Holograph Bridge smart contract to use
                                 */
                                function setBridge(address bridge) external;
                                /**
                                 * @notice Get the chain ID that the Protocol was deployed on
                                 * @dev Useful for checking if/when a hard fork occurs
                                 */
                                function getChainId() external view returns (uint256 chainId);
                                /**
                                 * @notice Update the chain ID
                                 * @dev Useful for updating once a hard fork has been mitigated
                                 * @param chainId EVM chain ID to use
                                 */
                                function setChainId(uint256 chainId) external;
                                /**
                                 * @notice Get the address of the Holograph Factory module
                                 * @dev Used for deploying holographable smart contracts
                                 */
                                function getFactory() external view returns (address factory);
                                /**
                                 * @notice Update the Holograph Factory module address
                                 * @param factory address of the Holograph Factory smart contract to use
                                 */
                                function setFactory(address factory) external;
                                /**
                                 * @notice Get the Holograph chain Id
                                 * @dev Holograph uses an internal chain id mapping
                                 */
                                function getHolographChainId() external view returns (uint32 holographChainId);
                                /**
                                 * @notice Update the Holograph chain ID
                                 * @dev Useful for updating once a hard fork was mitigated
                                 * @param holographChainId Holograph chain ID to use
                                 */
                                function setHolographChainId(uint32 holographChainId) external;
                                /**
                                 * @notice Get the address of the Holograph Interfaces module
                                 * @dev Holograph uses this contract to store data that needs to be accessed by a large portion of the modules
                                 */
                                function getInterfaces() external view returns (address interfaces);
                                /**
                                 * @notice Update the Holograph Interfaces module address
                                 * @param interfaces address of the Holograph Interfaces smart contract to use
                                 */
                                function setInterfaces(address interfaces) external;
                                /**
                                 * @notice Get the address of the Holograph Operator module
                                 * @dev All cross-chain Holograph Bridge beams are handled by the Holograph Operator module
                                 */
                                function getOperator() external view returns (address operator);
                                /**
                                 * @notice Update the Holograph Operator module address
                                 * @param operator address of the Holograph Operator smart contract to use
                                 */
                                function setOperator(address operator) external;
                                /**
                                 * @notice Get the Holograph Registry module
                                 * @dev This module stores a reference for all deployed holographable smart contracts
                                 */
                                function getRegistry() external view returns (address registry);
                                /**
                                 * @notice Update the Holograph Registry module address
                                 * @param registry address of the Holograph Registry smart contract to use
                                 */
                                function setRegistry(address registry) external;
                                /**
                                 * @notice Get the Holograph Treasury module
                                 * @dev All of the Holograph Protocol assets are stored and managed by this module
                                 */
                                function getTreasury() external view returns (address treasury);
                                /**
                                 * @notice Update the Holograph Treasury module address
                                 * @param treasury address of the Holograph Treasury smart contract to use
                                 */
                                function setTreasury(address treasury) external;
                                /**
                                 * @notice Get the Holograph Utility Token address
                                 * @dev This is the official utility token of the Holograph Protocol
                                 */
                                function getUtilityToken() external view returns (address utilityToken);
                                /**
                                 * @notice Update the Holograph Utility Token address
                                 * @param utilityToken address of the Holograph Utility Token smart contract to use
                                 */
                                function setUtilityToken(address utilityToken) external;
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              /**
                               * @title Holograph Bridge
                               * @author https://github.com/holographxyz
                               * @notice Beam any holographable contracts and assets across blockchains
                               * @dev The contract abstracts all the complexities of making bridge requests and uses a universal interface to bridge any type of holographable assets
                               */
                              interface HolographBridgeInterface {
                                /**
                                 * @notice Receive a beam from another chain
                                 * @dev This function can only be called by the Holograph Operator module
                                 * @param fromChain Holograph Chain ID where the brigeOutRequest was created
                                 * @param holographableContract address of the destination contract that the bridgeInRequest is targeted for
                                 * @param hToken address of the hToken contract that wrapped the origin chain native gas token
                                 * @param hTokenRecipient address of recipient for the hToken reward
                                 * @param hTokenValue exact amount of hToken reward in wei
                                 * @param doNotRevert boolean used to specify if the call should revert
                                 * @param bridgeInPayload actual abi encoded bytes of the data that the holographable contract bridgeIn function will receive
                                 */
                                function bridgeInRequest(
                                  uint256 nonce,
                                  uint32 fromChain,
                                  address holographableContract,
                                  address hToken,
                                  address hTokenRecipient,
                                  uint256 hTokenValue,
                                  bool doNotRevert,
                                  bytes calldata bridgeInPayload
                                ) external payable;
                                /**
                                 * @notice Create a beam request for a destination chain
                                 * @dev This function works for deploying contracts and beaming supported holographable assets across chains
                                 * @param toChain Holograph Chain ID where the beam is being sent to
                                 * @param holographableContract address of the contract for which the bridge request is being made
                                 * @param gasLimit maximum amount of gas to spend for executing the beam on destination chain
                                 * @param gasPrice maximum amount of gas price (in destination chain native gas token) to pay on destination chain
                                 * @param bridgeOutPayload actual abi encoded bytes of the data that the holographable contract bridgeOut function will receive
                                 */
                                function bridgeOutRequest(
                                  uint32 toChain,
                                  address holographableContract,
                                  uint256 gasLimit,
                                  uint256 gasPrice,
                                  bytes calldata bridgeOutPayload
                                ) external payable;
                                /**
                                 * @notice Do not call this function, it will always revert
                                 * @dev Used by getBridgeOutRequestPayload function
                                 *      It is purposefully inverted to always revert on a successful call
                                 *      Marked as external and not private to allow use inside try/catch of getBridgeOutRequestPayload function
                                 *      If this function does not revert and returns a string, it is the actual revert reason
                                 * @param sender address of actual sender that is planning to make a bridgeOutRequest call
                                 * @param toChain holograph chain id of destination chain
                                 * @param holographableContract address of the contract for which the bridge request is being made
                                 * @param bridgeOutPayload actual abi encoded bytes of the data that the holographable contract bridgeOut function will receive
                                 */
                                function revertedBridgeOutRequest(
                                  address sender,
                                  uint32 toChain,
                                  address holographableContract,
                                  bytes calldata bridgeOutPayload
                                ) external returns (string memory revertReason);
                                /**
                                 * @notice Get the payload created by the bridgeOutRequest function
                                 * @dev Use this function to get the payload that will be generated by a bridgeOutRequest
                                 *      Only use this with a static call
                                 * @param toChain Holograph Chain ID where the beam is being sent to
                                 * @param holographableContract address of the contract for which the bridge request is being made
                                 * @param gasLimit maximum amount of gas to spend for executing the beam on destination chain
                                 * @param gasPrice maximum amount of gas price (in destination chain native gas token) to pay on destination chain
                                 * @param bridgeOutPayload actual abi encoded bytes of the data that the holographable contract bridgeOut function will receive
                                 * @return samplePayload bytes made up of the bridgeOutRequest payload
                                 */
                                function getBridgeOutRequestPayload(
                                  uint32 toChain,
                                  address holographableContract,
                                  uint256 gasLimit,
                                  uint256 gasPrice,
                                  bytes calldata bridgeOutPayload
                                ) external returns (bytes memory samplePayload);
                                /**
                                 * @notice Get the fees associated with sending specific payload
                                 * @dev Will provide exact costs on protocol and message side, combine the two to get total
                                 * @param toChain holograph chain id of destination chain for payload
                                 * @param gasLimit amount of gas to provide for executing payload on destination chain
                                 * @param gasPrice maximum amount to pay for gas price, can be set to 0 and will be chose automatically
                                 * @param crossChainPayload the entire packet being sent cross-chain
                                 * @return hlgFee the amount (in wei) of native gas token that will cost for finalizing job on destiantion chain
                                 * @return msgFee the amount (in wei) of native gas token that will cost for sending message to destiantion chain
                                 * @return dstGasPrice the amount (in wei) that destination message maximum gas price will be
                                 */
                                function getMessageFee(
                                  uint32 toChain,
                                  uint256 gasLimit,
                                  uint256 gasPrice,
                                  bytes calldata crossChainPayload
                                )
                                  external
                                  view
                                  returns (
                                    uint256 hlgFee,
                                    uint256 msgFee,
                                    uint256 dstGasPrice
                                  );
                                /**
                                 * @notice Get the address of the Holograph Factory module
                                 * @dev Used for deploying holographable smart contracts
                                 */
                                function getFactory() external view returns (address factory);
                                /**
                                 * @notice Update the Holograph Factory module address
                                 * @param factory address of the Holograph Factory smart contract to use
                                 */
                                function setFactory(address factory) external;
                                /**
                                 * @notice Get the Holograph Protocol contract
                                 * @dev Used for storing a reference to all the primary modules and variables of the protocol
                                 */
                                function getHolograph() external view returns (address holograph);
                                /**
                                 * @notice Update the Holograph Protocol contract address
                                 * @param holograph address of the Holograph Protocol smart contract to use
                                 */
                                function setHolograph(address holograph) external;
                                /**
                                 * @notice Get the latest job nonce
                                 * @dev You can use the job nonce as a way to calculate total amount of bridge requests that have been made
                                 */
                                function getJobNonce() external view returns (uint256 jobNonce);
                                /**
                                 * @notice Get the address of the Holograph Operator module
                                 * @dev All cross-chain Holograph Bridge beams are handled by the Holograph Operator module
                                 */
                                function getOperator() external view returns (address operator);
                                /**
                                 * @notice Update the Holograph Operator module address
                                 * @param operator address of the Holograph Operator smart contract to use
                                 */
                                function setOperator(address operator) external;
                                /**
                                 * @notice Get the Holograph Registry module
                                 * @dev This module stores a reference for all deployed holographable smart contracts
                                 */
                                function getRegistry() external view returns (address registry);
                                /**
                                 * @notice Update the Holograph Registry module address
                                 * @param registry address of the Holograph Registry smart contract to use
                                 */
                                function setRegistry(address registry) external;
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              import "../struct/DeploymentConfig.sol";
                              import "../struct/Verification.sol";
                              /**
                               * @title Holograph Factory
                               * @author https://github.com/holographxyz
                               * @notice Deploy holographable contracts
                               * @dev The contract provides methods that allow for the creation of Holograph Protocol compliant smart contracts, that are capable of minting holographable assets
                               */
                              interface HolographFactoryInterface {
                                /**
                                 * @dev This event is fired every time that a bridgeable contract is deployed.
                                 */
                                event BridgeableContractDeployed(address indexed contractAddress, bytes32 indexed hash);
                                /**
                                 * @notice Deploy a holographable smart contract
                                 * @dev Using this function allows to deploy smart contracts that have the same address across all EVM chains
                                 * @param config contract deployement configurations
                                 * @param signature that was created by the wallet that created the original payload
                                 * @param signer address of wallet that created the payload
                                 */
                                function deployHolographableContract(
                                  DeploymentConfig memory config,
                                  Verification memory signature,
                                  address signer
                                ) external;
                                /**
                                 * @notice Get the Holograph Protocol contract
                                 * @dev Used for storing a reference to all the primary modules and variables of the protocol
                                 */
                                function getHolograph() external view returns (address holograph);
                                /**
                                 * @notice Update the Holograph Protocol contract address
                                 * @param holograph address of the Holograph Protocol smart contract to use
                                 */
                                function setHolograph(address holograph) external;
                                /**
                                 * @notice Get the Holograph Registry module
                                 * @dev This module stores a reference for all deployed holographable smart contracts
                                 */
                                function getRegistry() external view returns (address registry);
                                /**
                                 * @notice Update the Holograph Registry module address
                                 * @param registry address of the Holograph Registry smart contract to use
                                 */
                                function setRegistry(address registry) external;
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              import "../struct/OperatorJob.sol";
                              interface HolographOperatorInterface {
                                /**
                                 * @dev Event is emitted for every time that a valid job is available.
                                 */
                                event AvailableOperatorJob(bytes32 jobHash, bytes payload);
                                /**
                                 * @dev Event is emitted for every time that a job is completed.
                                 */
                                event FinishedOperatorJob(bytes32 jobHash, address operator);
                                /**
                                 * @dev Event is emitted every time a cross-chain message is sent
                                 */
                                event CrossChainMessageSent(bytes32 messageHash);
                                /**
                                 * @dev Event is emitted if an operator job execution fails
                                 */
                                event FailedOperatorJob(bytes32 jobHash);
                                /**
                                 * @notice Execute an available operator job
                                 * @dev When making this call, if operating criteria is not met, the call will revert
                                 * @param bridgeInRequestPayload the entire cross chain message payload
                                 */
                                function executeJob(bytes calldata bridgeInRequestPayload) external payable;
                                function nonRevertingBridgeCall(address msgSender, bytes calldata payload) external payable;
                                /**
                                 * @notice Receive a cross-chain message
                                 * @dev This function is restricted for use by Holograph Messaging Module only
                                 */
                                function crossChainMessage(bytes calldata bridgeInRequestPayload) external payable;
                                /**
                                 * @notice Calculate the amount of gas needed to execute a bridgeInRequest
                                 * @dev Use this function to estimate the amount of gas that will be used by the bridgeInRequest function
                                 *      Set a specific gas limit when making this call, subtract return value, to get total gas used
                                 *      Only use this with a static call
                                 * @param bridgeInRequestPayload abi encoded bytes making up the bridgeInRequest payload
                                 * @return the gas amount remaining after the static call is returned
                                 */
                                function jobEstimator(bytes calldata bridgeInRequestPayload) external payable returns (uint256);
                                /**
                                 * @notice Send cross chain bridge request message
                                 * @dev This function is restricted to only be callable by Holograph Bridge
                                 * @param gasLimit maximum amount of gas to spend for executing the beam on destination chain
                                 * @param gasPrice maximum amount of gas price (in destination chain native gas token) to pay on destination chain
                                 * @param toChain Holograph Chain ID where the beam is being sent to
                                 * @param nonce incremented number used to ensure job hashes are unique
                                 * @param holographableContract address of the contract for which the bridge request is being made
                                 * @param bridgeOutPayload bytes made up of the bridgeOutRequest payload
                                 */
                                function send(
                                  uint256 gasLimit,
                                  uint256 gasPrice,
                                  uint32 toChain,
                                  address msgSender,
                                  uint256 nonce,
                                  address holographableContract,
                                  bytes calldata bridgeOutPayload
                                ) external payable;
                                /**
                                 * @notice Get the fees associated with sending specific payload
                                 * @dev Will provide exact costs on protocol and message side, combine the two to get total
                                 * @param toChain holograph chain id of destination chain for payload
                                 * @param gasLimit amount of gas to provide for executing payload on destination chain
                                 * @param gasPrice maximum amount to pay for gas price, can be set to 0 and will be chose automatically
                                 * @param crossChainPayload the entire packet being sent cross-chain
                                 * @return hlgFee the amount (in wei) of native gas token that will cost for finalizing job on destiantion chain
                                 * @return msgFee the amount (in wei) of native gas token that will cost for sending message to destiantion chain
                                 * @return dstGasPrice the amount (in wei) that destination message maximum gas price will be
                                 */
                                function getMessageFee(
                                  uint32 toChain,
                                  uint256 gasLimit,
                                  uint256 gasPrice,
                                  bytes calldata crossChainPayload
                                )
                                  external
                                  view
                                  returns (
                                    uint256 hlgFee,
                                    uint256 msgFee,
                                    uint256 dstGasPrice
                                  );
                                /**
                                 * @notice Get the details for an available operator job
                                 * @dev The job hash is a keccak256 hash of the entire job payload
                                 * @param jobHash keccak256 hash of the job
                                 * @return an OperatorJob struct with details about a specific job
                                 */
                                function getJobDetails(bytes32 jobHash) external view returns (OperatorJob memory);
                                /**
                                 * @notice Get number of pods available
                                 * @dev This returns number of pods that have been opened via bonding
                                 */
                                function getTotalPods() external view returns (uint256 totalPods);
                                /**
                                 * @notice Get total number of operators in a pod
                                 * @dev Use in conjunction with paginated getPodOperators function
                                 * @param pod the pod to query
                                 * @return total operators in a pod
                                 */
                                function getPodOperatorsLength(uint256 pod) external view returns (uint256);
                                /**
                                 * @notice Get list of operators in a pod
                                 * @dev Use paginated getPodOperators function instead if list gets too long
                                 * @param pod the pod to query
                                 * @return operators array list of operators in a pod
                                 */
                                function getPodOperators(uint256 pod) external view returns (address[] memory operators);
                                /**
                                 * @notice Get paginated list of operators in a pod
                                 * @dev Use in conjunction with getPodOperatorsLength to know the total length of results
                                 * @param pod the pod to query
                                 * @param index the array index to start from
                                 * @param length the length of result set to be (will be shorter if reached end of array)
                                 * @return operators a paginated array of operators
                                 */
                                function getPodOperators(
                                  uint256 pod,
                                  uint256 index,
                                  uint256 length
                                ) external view returns (address[] memory operators);
                                /**
                                 * @notice Check the base and current price for bonding to a particular pod
                                 * @dev Useful for understanding what is required for bonding to a pod
                                 * @param pod the pod to get bonding amounts for
                                 * @return base the base bond amount required for a pod
                                 * @return current the current bond amount required for a pod
                                 */
                                function getPodBondAmounts(uint256 pod) external view returns (uint256 base, uint256 current);
                                /**
                                 * @notice Get an operator's currently bonded amount
                                 * @dev Useful for checking how much an operator has bonded
                                 * @param operator address of operator to check
                                 * @return amount total number of utility token bonded
                                 */
                                function getBondedAmount(address operator) external view returns (uint256 amount);
                                /**
                                 * @notice Get an operator's currently bonded pod
                                 * @dev Useful for checking if an operator is currently bonded
                                 * @param operator address of operator to check
                                 * @return pod number that operator is bonded on, returns zero if not bonded or selected for job
                                 */
                                function getBondedPod(address operator) external view returns (uint256 pod);
                                /**
                                 * @notice Get an operator's currently bonded pod index
                                 * @dev Useful for checking if an operator is a fallback for active job
                                 * @param operator address of operator to check
                                 * @return index currently bonded pod's operator index, returns zero if not in pod or moved out for active job
                                 */
                                function getBondedPodIndex(address operator) external view returns (uint256 index);
                                /**
                                 * @notice Topup a bonded operator with more utility tokens
                                 * @dev Useful function if an operator got slashed and wants to add a safety buffer to not get unbonded
                                 * @param operator address of operator to topup
                                 * @param amount utility token amount to add
                                 */
                                function topupUtilityToken(address operator, uint256 amount) external;
                                /**
                                 * @notice Bond utility tokens and become an operator
                                 * @dev An operator can only bond to one pod at a time, per network
                                 * @param operator address of operator to bond (can be an ownable smart contract)
                                 * @param amount utility token amount to bond (can be greater than minimum)
                                 * @param pod number of pod to bond to (can be for one that does not exist yet)
                                 */
                                function bondUtilityToken(
                                  address operator,
                                  uint256 amount,
                                  uint256 pod
                                ) external;
                                /**
                                 * @notice Unbond HLG utility tokens and stop being an operator
                                 * @dev A bonded operator selected for a job cannot unbond until they complete the job, or are slashed
                                 * @param operator address of operator to unbond
                                 * @param recipient address where to send the bonded tokens
                                 */
                                function unbondUtilityToken(address operator, address recipient) external;
                                /**
                                 * @notice Get the address of the Holograph Bridge module
                                 * @dev Used for beaming holographable assets cross-chain
                                 */
                                function getBridge() external view returns (address bridge);
                                /**
                                 * @notice Update the Holograph Bridge module address
                                 * @param bridge address of the Holograph Bridge smart contract to use
                                 */
                                function setBridge(address bridge) external;
                                /**
                                 * @notice Get the Holograph Protocol contract
                                 * @dev Used for storing a reference to all the primary modules and variables of the protocol
                                 */
                                function getHolograph() external view returns (address holograph);
                                /**
                                 * @notice Update the Holograph Protocol contract address
                                 * @param holograph address of the Holograph Protocol smart contract to use
                                 */
                                function setHolograph(address holograph) external;
                                /**
                                 * @notice Get the address of the Holograph Interfaces module
                                 * @dev Holograph uses this contract to store data that needs to be accessed by a large portion of the modules
                                 */
                                function getInterfaces() external view returns (address interfaces);
                                /**
                                 * @notice Update the Holograph Interfaces module address
                                 * @param interfaces address of the Holograph Interfaces smart contract to use
                                 */
                                function setInterfaces(address interfaces) external;
                                /**
                                 * @notice Get the address of the Holograph Messaging Module
                                 * @dev All cross-chain message requests will get forwarded to this adress
                                 */
                                function getMessagingModule() external view returns (address messagingModule);
                                /**
                                 * @notice Update the Holograph Messaging Module address
                                 * @param messagingModule address of the LayerZero Endpoint to use
                                 */
                                function setMessagingModule(address messagingModule) external;
                                /**
                                 * @notice Get the Holograph Registry module
                                 * @dev This module stores a reference for all deployed holographable smart contracts
                                 */
                                function getRegistry() external view returns (address registry);
                                /**
                                 * @notice Update the Holograph Registry module address
                                 * @param registry address of the Holograph Registry smart contract to use
                                 */
                                function setRegistry(address registry) external;
                                /**
                                 * @notice Get the Holograph Utility Token address
                                 * @dev This is the official utility token of the Holograph Protocol
                                 */
                                function getUtilityToken() external view returns (address utilityToken);
                                /**
                                 * @notice Update the Holograph Utility Token address
                                 * @param utilityToken address of the Holograph Utility Token smart contract to use
                                 */
                                function setUtilityToken(address utilityToken) external;
                                /**
                                 * @notice Get the Minimum Gas Price
                                 * @dev This amount is used as the value that will define a job as underpriced is lower than
                                 */
                                function getMinGasPrice() external view returns (uint256 minGasPrice);
                                /**
                                 * @notice Update the Minimum Gas Price
                                 * @param minGasPrice amount to set for minimum gas price
                                 */
                                function setMinGasPrice(uint256 minGasPrice) external;
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              interface HolographRegistryInterface {
                                function isHolographedContract(address smartContract) external view returns (bool);
                                function isHolographedHashDeployed(bytes32 hash) external view returns (bool);
                                function referenceContractTypeAddress(address contractAddress) external returns (bytes32);
                                function getContractTypeAddress(bytes32 contractType) external view returns (address);
                                function setContractTypeAddress(bytes32 contractType, address contractAddress) external;
                                function getHolograph() external view returns (address holograph);
                                function setHolograph(address holograph) external;
                                function getHolographableContracts(uint256 index, uint256 length) external view returns (address[] memory contracts);
                                function getHolographableContractsLength() external view returns (uint256);
                                function getHolographedHashAddress(bytes32 hash) external view returns (address);
                                function setHolographedHashAddress(bytes32 hash, address contractAddress) external;
                                function getHToken(uint32 chainId) external view returns (address);
                                function setHToken(uint32 chainId, address hToken) external;
                                function getReservedContractTypeAddress(bytes32 contractType) external view returns (address contractTypeAddress);
                                function setReservedContractTypeAddress(bytes32 hash, bool reserved) external;
                                function setReservedContractTypeAddresses(bytes32[] calldata hashes, bool[] calldata reserved) external;
                                function getUtilityToken() external view returns (address utilityToken);
                                function setUtilityToken(address utilityToken) external;
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              /**
                               * @title Initializable
                               * @author https://github.com/holographxyz
                               * @notice Use init instead of constructor
                               * @dev This allows for use of init function to make one time initializations without the need of a constructor
                               */
                              interface InitializableInterface {
                                /**
                                 * @notice Used internally to initialize the contract instead of through a constructor
                                 * @dev This function is called by the deployer/factory when creating a contract
                                 * @param initPayload abi encoded payload to use for contract initilaization
                                 */
                                function init(bytes memory initPayload) external returns (bytes4);
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              pragma solidity 0.8.13;
                              interface ERC20 {
                                function totalSupply() external view returns (uint256);
                                function balanceOf(address _owner) external view returns (uint256 balance);
                                function transfer(address _to, uint256 _value) external returns (bool success);
                                function transferFrom(
                                  address _from,
                                  address _to,
                                  uint256 _value
                                ) external returns (bool success);
                                function approve(address _spender, uint256 _value) external returns (bool success);
                                function allowance(address _owner, address _spender) external view returns (uint256 remaining);
                                event Transfer(address indexed _from, address indexed _to, uint256 _value);
                                event Approval(address indexed _owner, address indexed _spender, uint256 _value);
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              pragma solidity 0.8.13;
                              interface ERC20Burnable {
                                function burn(uint256 amount) external;
                                function burnFrom(address account, uint256 amount) external returns (bool);
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              pragma solidity 0.8.13;
                              interface ERC20Metadata {
                                function decimals() external view returns (uint8);
                                function name() external view returns (string memory);
                                function symbol() external view returns (string memory);
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              pragma solidity 0.8.13;
                              interface ERC20Receiver {
                                function onERC20Received(
                                  address account,
                                  address recipient,
                                  uint256 amount,
                                  bytes memory data
                                ) external returns (bytes4);
                              }
                              // SPDX-License-Identifier: MIT
                              // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)
                              pragma solidity 0.8.13;
                              /**
                               * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
                               * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
                               *
                               * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
                               * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
                               * need to send a transaction, and thus is not required to hold Ether at all.
                               */
                              interface ERC20Permit {
                                /**
                                 * @dev Sets `value` as the allowance of `spender` over ``account``'s tokens,
                                 * given ``account``'s signed approval.
                                 *
                                 * IMPORTANT: The same issues {IERC20-approve} has related to transaction
                                 * ordering also apply here.
                                 *
                                 * Emits an {Approval} event.
                                 *
                                 * Requirements:
                                 *
                                 * - `spender` cannot be the zero address.
                                 * - `deadline` must be a timestamp in the future.
                                 * - `v`, `r` and `s` must be a valid `secp256k1` signature from `account`
                                 * over the EIP712-formatted function arguments.
                                 * - the signature must use ``account``'s current nonce (see {nonces}).
                                 *
                                 * For more information on the signature format, see the
                                 * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
                                 * section].
                                 */
                                function permit(
                                  address account,
                                  address spender,
                                  uint256 value,
                                  uint256 deadline,
                                  uint8 v,
                                  bytes32 r,
                                  bytes32 s
                                ) external;
                                /**
                                 * @dev Returns the current nonce for `account`. This value must be
                                 * included whenever a signature is generated for {permit}.
                                 *
                                 * Every successful call to {permit} increases ``account``'s nonce by one. This
                                 * prevents a signature from being used multiple times.
                                 */
                                function nonces(address account) external view returns (uint256);
                                /**
                                 * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
                                 */
                                // solhint-disable-next-line func-name-mixedcase
                                function DOMAIN_SEPARATOR() external view returns (bytes32);
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              pragma solidity 0.8.13;
                              interface ERC20Safer {
                                function safeTransfer(address recipient, uint256 amount) external returns (bool);
                                function safeTransfer(
                                  address recipient,
                                  uint256 amount,
                                  bytes memory data
                                ) external returns (bool);
                                function safeTransferFrom(
                                  address account,
                                  address recipient,
                                  uint256 amount
                                ) external returns (bool);
                                function safeTransferFrom(
                                  address account,
                                  address recipient,
                                  uint256 amount,
                                  bytes memory data
                                ) external returns (bool);
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              pragma solidity 0.8.13;
                              interface ERC165 {
                                /// @notice Query if a contract implements an interface
                                /// @param interfaceID The interface identifier, as specified in ERC-165
                                /// @dev Interface identification is specified in ERC-165. This function
                                ///  uses less than 30,000 gas.
                                /// @return `true` if the contract implements `interfaceID` and
                                ///  `interfaceID` is not 0xffffffff, `false` otherwise
                                function supportsInterface(bytes4 interfaceID) external view returns (bool);
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              struct DeploymentConfig {
                                bytes32 contractType;
                                uint32 chainType;
                                bytes32 salt;
                                bytes byteCode;
                                bytes initCode;
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              struct Verification {
                                bytes32 r;
                                bytes32 s;
                                uint8 v;
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              struct OperatorJob {
                                uint8 pod;
                                uint16 blockTimes;
                                address operator;
                                uint40 startBlock;
                                uint64 startTimestamp;
                                uint16[5] fallbackOperators;
                              }
                              /*
                              uint\t\tDigits\tMax value
                              -----------------------------
                              uint8\t\t3\t\t255
                              uint16\t\t5\t\t65,535
                              uint24\t\t8\t\t16,777,215
                              uint32\t\t10\t\t4,294,967,295
                              uint40\t\t13\t\t1,099,511,627,775
                              uint48\t\t15\t\t281,474,976,710,655
                              uint56\t\t17\t\t72,057,594,037,927,935
                              uint64\t\t20\t\t18,446,744,073,709,551,615
                              uint72\t\t22\t\t4,722,366,482,869,645,213,695
                              uint80\t\t25\t\t1,208,925,819,614,629,174,706,175
                              uint88\t\t27\t\t309,485,009,821,345,068,724,781,055
                              uint96\t\t29\t\t79,228,162,514,264,337,593,543,950,335
                              ...
                              uint128\t\t39\t\t340,282,366,920,938,463,463,374,607,431,768,211,455
                              ...
                              uint256\t\t78\t\t115,792,089,237,316,195,423,570,985,008,687,907,853,269,984,665,640,564,039,457,584,007,913,129,639,935
                              */
                              

                              File 7 of 14: HolographRegistry
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              abstract contract Admin {
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.admin')) - 1)
                                 */
                                bytes32 constant _adminSlot = 0x3f106594dc74eeef980dae234cde8324dc2497b13d27a0c59e55bd2ca10a07c9;
                                modifier onlyAdmin() {
                                  require(msg.sender == getAdmin(), "HOLOGRAPH: admin only function");
                                  _;
                                }
                                constructor() {}
                                function admin() public view returns (address) {
                                  return getAdmin();
                                }
                                function getAdmin() public view returns (address adminAddress) {
                                  assembly {
                                    adminAddress := sload(_adminSlot)
                                  }
                                }
                                function setAdmin(address adminAddress) public onlyAdmin {
                                  assembly {
                                    sstore(_adminSlot, adminAddress)
                                  }
                                }
                                function adminCall(address target, bytes calldata data) external payable onlyAdmin {
                                  assembly {
                                    calldatacopy(0, data.offset, data.length)
                                    let result := call(gas(), target, callvalue(), 0, data.length, 0, 0)
                                    returndatacopy(0, 0, returndatasize())
                                    switch result
                                    case 0 {
                                      revert(0, returndatasize())
                                    }
                                    default {
                                      return(0, returndatasize())
                                    }
                                  }
                                }
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              import "../interface/InitializableInterface.sol";
                              /**
                               * @title Initializable
                               * @author https://github.com/holographxyz
                               * @notice Use init instead of constructor
                               * @dev This allows for use of init function to make one time initializations without the need for a constructor
                               */
                              abstract contract Initializable is InitializableInterface {
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.initialized')) - 1)
                                 */
                                bytes32 constant _initializedSlot = 0x4e5f991bca30eca2d4643aaefa807e88f96a4a97398933d572a3c0d973004a01;
                                /**
                                 * @dev Constructor is left empty and init is used instead
                                 */
                                constructor() {}
                                /**
                                 * @notice Used internally to initialize the contract instead of through a constructor
                                 * @dev This function is called by the deployer/factory when creating a contract
                                 * @param initPayload abi encoded payload to use for contract initilaization
                                 */
                                function init(bytes memory initPayload) external virtual returns (bytes4);
                                function _isInitialized() internal view returns (bool initialized) {
                                  assembly {
                                    initialized := sload(_initializedSlot)
                                  }
                                }
                                function _setInitialized() internal {
                                  assembly {
                                    sstore(_initializedSlot, 0x0000000000000000000000000000000000000000000000000000000000000001)
                                  }
                                }
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              import "./abstract/Admin.sol";
                              import "./abstract/Initializable.sol";
                              import "./interface/HolographInterface.sol";
                              import "./interface/HolographRegistryInterface.sol";
                              import "./interface/InitializableInterface.sol";
                              /**
                               * @title Holograph Registry
                               * @author https://github.com/holographxyz
                               * @notice View and validate all deployed holographable contracts
                               * @dev Use this to: validate that contracts are Holograph Protocol compliant, get source code for supported standards, and interact with hTokens
                               */
                              contract HolographRegistry is Admin, Initializable, HolographRegistryInterface {
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.holograph')) - 1)
                                 */
                                bytes32 constant _holographSlot = 0xb4107f746e9496e8452accc7de63d1c5e14c19f510932daa04077cd49e8bd77a;
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.utilityToken')) - 1)
                                 */
                                bytes32 constant _utilityTokenSlot = 0xbf76518d46db472b71aa7677a0908b8016f3dee568415ffa24055f9a670f9c37;
                                /**
                                 * @dev Array of all Holographable contracts that were ever deployed on this chain
                                 */
                                address[] private _holographableContracts;
                                /**
                                 * @dev A mapping of hashes to contract addresses
                                 */
                                mapping(bytes32 => address) private _holographedContractsHashMap;
                                /**
                                 * @dev Storage slot for saving contract type to contract address references
                                 */
                                mapping(bytes32 => address) private _contractTypeAddresses;
                                /**
                                 * @dev Reserved type addresses for Admin
                                 *  Note: this is used for defining default contracts
                                 */
                                mapping(bytes32 => bool) private _reservedTypes;
                                /**
                                 * @dev A list of smart contracts that are guaranteed secure and holographable
                                 */
                                mapping(address => bool) private _holographedContracts;
                                /**
                                 * @dev Mapping of all hTokens available for the different EVM chains
                                 */
                                mapping(uint32 => address) private _hTokens;
                                /**
                                 * @dev Constructor is left empty and init is used instead
                                 */
                                constructor() {}
                                /**
                                 * @notice Used internally to initialize the contract instead of through a constructor
                                 * @dev This function is called by the deployer/factory when creating a contract
                                 * @param initPayload abi encoded payload to use for contract initilaization
                                 */
                                function init(bytes memory initPayload) external override returns (bytes4) {
                                  require(!_isInitialized(), "HOLOGRAPH: already initialized");
                                  (address holograph, bytes32[] memory reservedTypes) = abi.decode(initPayload, (address, bytes32[]));
                                  assembly {
                                    sstore(_adminSlot, origin())
                                    sstore(_holographSlot, holograph)
                                  }
                                  for (uint256 i = 0; i < reservedTypes.length; i++) {
                                    _reservedTypes[reservedTypes[i]] = true;
                                  }
                                  _setInitialized();
                                  return InitializableInterface.init.selector;
                                }
                                function isHolographedContract(address smartContract) external view returns (bool) {
                                  return _holographedContracts[smartContract];
                                }
                                function isHolographedHashDeployed(bytes32 hash) external view returns (bool) {
                                  return _holographedContractsHashMap[hash] != address(0);
                                }
                                function holographableEvent(bytes calldata payload) external {
                                  if (_holographedContracts[msg.sender]) {
                                    emit HolographableContractEvent(msg.sender, payload);
                                  }
                                }
                                /**
                                 * @dev Allows to reference a deployed smart contract, and use it's code as reference inside of Holographers
                                 */
                                function referenceContractTypeAddress(address contractAddress) external returns (bytes32) {
                                  bytes32 contractType;
                                  assembly {
                                    contractType := extcodehash(contractAddress)
                                  }
                                  require((contractType != 0x0 && contractType != 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470), "HOLOGRAPH: empty contract");
                                  require(_contractTypeAddresses[contractType] == address(0), "HOLOGRAPH: contract already set");
                                  require(!_reservedTypes[contractType], "HOLOGRAPH: reserved address type");
                                  _contractTypeAddresses[contractType] = contractAddress;
                                  return contractType;
                                }
                                /**
                                 * @dev Returns the contract address for a contract type
                                 */
                                function getContractTypeAddress(bytes32 contractType) external view returns (address) {
                                  return _contractTypeAddresses[contractType];
                                }
                                /**
                                 * @dev Sets the contract address for a contract type
                                 */
                                function setContractTypeAddress(bytes32 contractType, address contractAddress) external onlyAdmin {
                                  require(_reservedTypes[contractType], "HOLOGRAPH: not reserved type");
                                  _contractTypeAddresses[contractType] = contractAddress;
                                }
                                /**
                                 * @notice Get the Holograph Protocol contract
                                 * @dev This contract stores a reference to all the primary modules and variables of the protocol
                                 */
                                function getHolograph() external view returns (address holograph) {
                                  assembly {
                                    holograph := sload(_holographSlot)
                                  }
                                }
                                /**
                                 * @notice Update the Holograph Protocol contract address
                                 * @param holograph address of the Holograph Protocol smart contract to use
                                 */
                                function setHolograph(address holograph) external onlyAdmin {
                                  assembly {
                                    sstore(_holographSlot, holograph)
                                  }
                                }
                                /**
                                 * @notice Get set length list, starting from index, for all holographable contracts
                                 * @param index The index to start enumeration from
                                 * @param length The length of returned results
                                 * @return contracts address[] Returns a set length array of holographable contracts deployed
                                 */
                                function getHolographableContracts(uint256 index, uint256 length) external view returns (address[] memory contracts) {
                                  uint256 supply = _holographableContracts.length;
                                  if (index + length > supply) {
                                    length = supply - index;
                                  }
                                  contracts = new address[](length);
                                  for (uint256 i = 0; i < length; i++) {
                                    contracts[i] = _holographableContracts[index + i];
                                  }
                                }
                                /**
                                 * @notice Get total number of deployed holographable contracts
                                 */
                                function getHolographableContractsLength() external view returns (uint256) {
                                  return _holographableContracts.length;
                                }
                                /**
                                 * @dev Returns the address for a holographed hash
                                 */
                                function getHolographedHashAddress(bytes32 hash) external view returns (address) {
                                  return _holographedContractsHashMap[hash];
                                }
                                /**
                                 * @dev Allows Holograph Factory to register a deployed contract, referenced with deployment hash
                                 */
                                function setHolographedHashAddress(bytes32 hash, address contractAddress) external {
                                  address holograph;
                                  assembly {
                                    holograph := sload(_holographSlot)
                                  }
                                  require(msg.sender == HolographInterface(holograph).getFactory(), "HOLOGRAPH: factory only function");
                                  _holographedContractsHashMap[hash] = contractAddress;
                                  _holographedContracts[contractAddress] = true;
                                  _holographableContracts.push(contractAddress);
                                }
                                /**
                                 * @dev Returns the hToken address for a given chain id
                                 */
                                function getHToken(uint32 chainId) external view returns (address) {
                                  return _hTokens[chainId];
                                }
                                /**
                                 * @dev Sets the hToken address for a specific chain id
                                 */
                                function setHToken(uint32 chainId, address hToken) external onlyAdmin {
                                  _hTokens[chainId] = hToken;
                                }
                                /**
                                 * @dev Returns the reserved contract address for a contract type
                                 */
                                function getReservedContractTypeAddress(bytes32 contractType) external view returns (address contractTypeAddress) {
                                  if (_reservedTypes[contractType]) {
                                    contractTypeAddress = _contractTypeAddresses[contractType];
                                  }
                                }
                                /**
                                 * @dev Allows admin to update or toggle reserved type
                                 */
                                function setReservedContractTypeAddress(bytes32 hash, bool reserved) external onlyAdmin {
                                  _reservedTypes[hash] = reserved;
                                }
                                /**
                                 * @dev Allows admin to update or toggle reserved types
                                 */
                                function setReservedContractTypeAddresses(bytes32[] calldata hashes, bool[] calldata reserved) external onlyAdmin {
                                  for (uint256 i = 0; i < hashes.length; i++) {
                                    _reservedTypes[hashes[i]] = reserved[i];
                                  }
                                }
                                /**
                                 * @notice Get the Holograph Utility Token address
                                 * @dev This is the official utility token of the Holograph Protocol
                                 */
                                function getUtilityToken() external view returns (address utilityToken) {
                                  assembly {
                                    utilityToken := sload(_utilityTokenSlot)
                                  }
                                }
                                /**
                                 * @notice Update the Holograph Utility Token address
                                 * @param utilityToken address of the Holograph Utility Token smart contract to use
                                 */
                                function setUtilityToken(address utilityToken) external onlyAdmin {
                                  assembly {
                                    sstore(_utilityTokenSlot, utilityToken)
                                  }
                                }
                                /**
                                 * @dev Purposefully reverts to prevent having any type of ether transfered into the contract
                                 */
                                receive() external payable {
                                  revert();
                                }
                                /**
                                 * @dev Purposefully reverts to prevent any calls to undefined functions
                                 */
                                fallback() external payable {
                                  revert();
                                }
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              /**
                               * @title Holograph Protocol
                               * @author https://github.com/holographxyz
                               * @notice This is the primary Holograph Protocol smart contract
                               * @dev This contract stores a reference to all the primary modules and variables of the protocol
                               */
                              interface HolographInterface {
                                /**
                                 * @notice Get the address of the Holograph Bridge module
                                 * @dev Used for beaming holographable assets cross-chain
                                 */
                                function getBridge() external view returns (address bridge);
                                /**
                                 * @notice Update the Holograph Bridge module address
                                 * @param bridge address of the Holograph Bridge smart contract to use
                                 */
                                function setBridge(address bridge) external;
                                /**
                                 * @notice Get the chain ID that the Protocol was deployed on
                                 * @dev Useful for checking if/when a hard fork occurs
                                 */
                                function getChainId() external view returns (uint256 chainId);
                                /**
                                 * @notice Update the chain ID
                                 * @dev Useful for updating once a hard fork has been mitigated
                                 * @param chainId EVM chain ID to use
                                 */
                                function setChainId(uint256 chainId) external;
                                /**
                                 * @notice Get the address of the Holograph Factory module
                                 * @dev Used for deploying holographable smart contracts
                                 */
                                function getFactory() external view returns (address factory);
                                /**
                                 * @notice Update the Holograph Factory module address
                                 * @param factory address of the Holograph Factory smart contract to use
                                 */
                                function setFactory(address factory) external;
                                /**
                                 * @notice Get the Holograph chain Id
                                 * @dev Holograph uses an internal chain id mapping
                                 */
                                function getHolographChainId() external view returns (uint32 holographChainId);
                                /**
                                 * @notice Update the Holograph chain ID
                                 * @dev Useful for updating once a hard fork was mitigated
                                 * @param holographChainId Holograph chain ID to use
                                 */
                                function setHolographChainId(uint32 holographChainId) external;
                                /**
                                 * @notice Get the address of the Holograph Interfaces module
                                 * @dev Holograph uses this contract to store data that needs to be accessed by a large portion of the modules
                                 */
                                function getInterfaces() external view returns (address interfaces);
                                /**
                                 * @notice Update the Holograph Interfaces module address
                                 * @param interfaces address of the Holograph Interfaces smart contract to use
                                 */
                                function setInterfaces(address interfaces) external;
                                /**
                                 * @notice Get the address of the Holograph Operator module
                                 * @dev All cross-chain Holograph Bridge beams are handled by the Holograph Operator module
                                 */
                                function getOperator() external view returns (address operator);
                                /**
                                 * @notice Update the Holograph Operator module address
                                 * @param operator address of the Holograph Operator smart contract to use
                                 */
                                function setOperator(address operator) external;
                                /**
                                 * @notice Get the Holograph Registry module
                                 * @dev This module stores a reference for all deployed holographable smart contracts
                                 */
                                function getRegistry() external view returns (address registry);
                                /**
                                 * @notice Update the Holograph Registry module address
                                 * @param registry address of the Holograph Registry smart contract to use
                                 */
                                function setRegistry(address registry) external;
                                /**
                                 * @notice Get the Holograph Treasury module
                                 * @dev All of the Holograph Protocol assets are stored and managed by this module
                                 */
                                function getTreasury() external view returns (address treasury);
                                /**
                                 * @notice Update the Holograph Treasury module address
                                 * @param treasury address of the Holograph Treasury smart contract to use
                                 */
                                function setTreasury(address treasury) external;
                                /**
                                 * @notice Get the Holograph Utility Token address
                                 * @dev This is the official utility token of the Holograph Protocol
                                 */
                                function getUtilityToken() external view returns (address utilityToken);
                                /**
                                 * @notice Update the Holograph Utility Token address
                                 * @param utilityToken address of the Holograph Utility Token smart contract to use
                                 */
                                function setUtilityToken(address utilityToken) external;
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              interface HolographRegistryInterface {
                                event HolographableContractEvent(address indexed _holographableContract, bytes _payload);
                                function isHolographedContract(address smartContract) external view returns (bool);
                                function isHolographedHashDeployed(bytes32 hash) external view returns (bool);
                                function referenceContractTypeAddress(address contractAddress) external returns (bytes32);
                                function getContractTypeAddress(bytes32 contractType) external view returns (address);
                                function setContractTypeAddress(bytes32 contractType, address contractAddress) external;
                                function getHolograph() external view returns (address holograph);
                                function setHolograph(address holograph) external;
                                function getHolographableContracts(uint256 index, uint256 length) external view returns (address[] memory contracts);
                                function getHolographableContractsLength() external view returns (uint256);
                                function getHolographedHashAddress(bytes32 hash) external view returns (address);
                                function setHolographedHashAddress(bytes32 hash, address contractAddress) external;
                                function getHToken(uint32 chainId) external view returns (address);
                                function setHToken(uint32 chainId, address hToken) external;
                                function getReservedContractTypeAddress(bytes32 contractType) external view returns (address contractTypeAddress);
                                function setReservedContractTypeAddress(bytes32 hash, bool reserved) external;
                                function setReservedContractTypeAddresses(bytes32[] calldata hashes, bool[] calldata reserved) external;
                                function getUtilityToken() external view returns (address utilityToken);
                                function setUtilityToken(address utilityToken) external;
                                function holographableEvent(bytes calldata payload) external;
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              /**
                               * @title Initializable
                               * @author https://github.com/holographxyz
                               * @notice Use init instead of constructor
                               * @dev This allows for use of init function to make one time initializations without the need of a constructor
                               */
                              interface InitializableInterface {
                                /**
                                 * @notice Used internally to initialize the contract instead of through a constructor
                                 * @dev This function is called by the deployer/factory when creating a contract
                                 * @param initPayload abi encoded payload to use for contract initilaization
                                 */
                                function init(bytes memory initPayload) external returns (bytes4);
                              }
                              

                              File 8 of 14: Holograph
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              import "./abstract/Admin.sol";
                              import "./abstract/Initializable.sol";
                              import "./interface/InitializableInterface.sol";
                              import "./interface/HolographInterface.sol";
                              /**
                               * @title Holograph Protocol
                               * @author https://github.com/holographxyz
                               * @notice This is the primary Holograph Protocol smart contract
                               * @dev This contract stores a reference to all the primary modules and variables of the protocol
                               */
                              contract Holograph is Admin, Initializable, HolographInterface {
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.bridge')) - 1)
                                 */
                                bytes32 constant _bridgeSlot = 0xeb87cbb21687feb327e3d58c6c16d552231d12c7a0e8115042a4165fac8a77f9;
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.chainId')) - 1)
                                 */
                                bytes32 constant _chainIdSlot = 0x7651bfc11f7485d07ab2b41c1312e2007c8cb7efb0f7352a6dee4a1153eebab2;
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.factory')) - 1)
                                 */
                                bytes32 constant _factorySlot = 0xa49f20855ba576e09d13c8041c8039fa655356ea27f6c40f1ec46a4301cd5b23;
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.holographChainId')) - 1)
                                 */
                                bytes32 constant _holographChainIdSlot = 0xd840a780c26e07edc6e1ee2eaa6f134ed5488dbd762614116653cee8542a3844;
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.interfaces')) - 1)
                                 */
                                bytes32 constant _interfacesSlot = 0xbd3084b8c09da87ad159c247a60e209784196be2530cecbbd8f337fdd1848827;
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.operator')) - 1)
                                 */
                                bytes32 constant _operatorSlot = 0x7caba557ad34138fa3b7e43fb574e0e6cc10481c3073e0dffbc560db81b5c60f;
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.registry')) - 1)
                                 */
                                bytes32 constant _registrySlot = 0xce8e75d5c5227ce29a4ee170160bb296e5dea6934b80a9bd723f7ef1e7c850e7;
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.treasury')) - 1)
                                 */
                                bytes32 constant _treasurySlot = 0x4215e7a38d75164ca078bbd61d0992cdeb1ba16f3b3ead5944966d3e4080e8b6;
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.utilityToken')) - 1)
                                 */
                                bytes32 constant _utilityTokenSlot = 0xbf76518d46db472b71aa7677a0908b8016f3dee568415ffa24055f9a670f9c37;
                                /**
                                 * @dev Constructor is left empty and init is used instead
                                 */
                                constructor() {}
                                /**
                                 * @notice Used internally to initialize the contract instead of through a constructor
                                 * @dev This function is called by the deployer/factory when creating a contract
                                 * @param initPayload abi encoded payload to use for contract initilaization
                                 */
                                function init(bytes memory initPayload) external override returns (bytes4) {
                                  require(!_isInitialized(), "HOLOGRAPH: already initialized");
                                  (
                                    uint32 holographChainId,
                                    address bridge,
                                    address factory,
                                    address interfaces,
                                    address operator,
                                    address registry,
                                    address treasury,
                                    address utilityToken
                                  ) = abi.decode(initPayload, (uint32, address, address, address, address, address, address, address));
                                  assembly {
                                    sstore(_adminSlot, origin())
                                    sstore(_chainIdSlot, chainid())
                                    sstore(_holographChainIdSlot, holographChainId)
                                    sstore(_bridgeSlot, bridge)
                                    sstore(_factorySlot, factory)
                                    sstore(_interfacesSlot, interfaces)
                                    sstore(_operatorSlot, operator)
                                    sstore(_registrySlot, registry)
                                    sstore(_treasurySlot, treasury)
                                    sstore(_utilityTokenSlot, utilityToken)
                                  }
                                  _setInitialized();
                                  return InitializableInterface.init.selector;
                                }
                                /**
                                 * @notice Get the address of the Holograph Bridge module
                                 * @dev Used for beaming holographable assets cross-chain
                                 */
                                function getBridge() external view returns (address bridge) {
                                  assembly {
                                    bridge := sload(_bridgeSlot)
                                  }
                                }
                                /**
                                 * @notice Update the Holograph Bridge module address
                                 * @param bridge address of the Holograph Bridge smart contract to use
                                 */
                                function setBridge(address bridge) external onlyAdmin {
                                  assembly {
                                    sstore(_bridgeSlot, bridge)
                                  }
                                }
                                /**
                                 * @notice Get the chain ID that the Protocol was deployed on
                                 * @dev Useful for checking if/when a hard fork occurs
                                 */
                                function getChainId() external view returns (uint256 chainId) {
                                  assembly {
                                    chainId := sload(_chainIdSlot)
                                  }
                                }
                                /**
                                 * @notice Update the chain ID
                                 * @dev Useful for updating once a hard fork has been mitigated
                                 * @param chainId EVM chain ID to use
                                 */
                                function setChainId(uint256 chainId) external onlyAdmin {
                                  assembly {
                                    sstore(_chainIdSlot, chainId)
                                  }
                                }
                                /**
                                 * @notice Get the address of the Holograph Factory module
                                 * @dev Used for deploying holographable smart contracts
                                 */
                                function getFactory() external view returns (address factory) {
                                  assembly {
                                    factory := sload(_factorySlot)
                                  }
                                }
                                /**
                                 * @notice Update the Holograph Factory module address
                                 * @param factory address of the Holograph Factory smart contract to use
                                 */
                                function setFactory(address factory) external onlyAdmin {
                                  assembly {
                                    sstore(_factorySlot, factory)
                                  }
                                }
                                /**
                                 * @notice Get the Holograph chain Id
                                 * @dev Holograph uses an internal chain id mapping
                                 */
                                function getHolographChainId() external view returns (uint32 holographChainId) {
                                  assembly {
                                    holographChainId := sload(_holographChainIdSlot)
                                  }
                                }
                                /**
                                 * @notice Update the Holograph chain ID
                                 * @dev Useful for updating once a hard fork was mitigated
                                 * @param holographChainId Holograph chain ID to use
                                 */
                                function setHolographChainId(uint32 holographChainId) external onlyAdmin {
                                  assembly {
                                    sstore(_holographChainIdSlot, holographChainId)
                                  }
                                }
                                /**
                                 * @notice Get the address of the Holograph Interfaces module
                                 * @dev Holograph uses this contract to store data that needs to be accessed by a large portion of the modules
                                 */
                                function getInterfaces() external view returns (address interfaces) {
                                  assembly {
                                    interfaces := sload(_interfacesSlot)
                                  }
                                }
                                /**
                                 * @notice Update the Holograph Interfaces module address
                                 * @param interfaces address of the Holograph Interfaces smart contract to use
                                 */
                                function setInterfaces(address interfaces) external onlyAdmin {
                                  assembly {
                                    sstore(_interfacesSlot, interfaces)
                                  }
                                }
                                /**
                                 * @notice Get the address of the Holograph Operator module
                                 * @dev All cross-chain Holograph Bridge beams are handled by the Holograph Operator module
                                 */
                                function getOperator() external view returns (address operator) {
                                  assembly {
                                    operator := sload(_operatorSlot)
                                  }
                                }
                                /**
                                 * @notice Update the Holograph Operator module address
                                 * @param operator address of the Holograph Operator smart contract to use
                                 */
                                function setOperator(address operator) external onlyAdmin {
                                  assembly {
                                    sstore(_operatorSlot, operator)
                                  }
                                }
                                /**
                                 * @notice Get the Holograph Registry module
                                 * @dev This module stores a reference for all deployed holographable smart contracts
                                 */
                                function getRegistry() external view returns (address registry) {
                                  assembly {
                                    registry := sload(_registrySlot)
                                  }
                                }
                                /**
                                 * @notice Update the Holograph Registry module address
                                 * @param registry address of the Holograph Registry smart contract to use
                                 */
                                function setRegistry(address registry) external onlyAdmin {
                                  assembly {
                                    sstore(_registrySlot, registry)
                                  }
                                }
                                /**
                                 * @notice Get the Holograph Treasury module
                                 * @dev All of the Holograph Protocol assets are stored and managed by this module
                                 */
                                function getTreasury() external view returns (address treasury) {
                                  assembly {
                                    treasury := sload(_treasurySlot)
                                  }
                                }
                                /**
                                 * @notice Update the Holograph Treasury module address
                                 * @param treasury address of the Holograph Treasury smart contract to use
                                 */
                                function setTreasury(address treasury) external onlyAdmin {
                                  assembly {
                                    sstore(_treasurySlot, treasury)
                                  }
                                }
                                /**
                                 * @notice Get the Holograph Utility Token address
                                 * @dev This is the official utility token of the Holograph Protocol
                                 */
                                function getUtilityToken() external view returns (address utilityToken) {
                                  assembly {
                                    utilityToken := sload(_utilityTokenSlot)
                                  }
                                }
                                /**
                                 * @notice Update the Holograph Utility Token address
                                 * @param utilityToken address of the Holograph Utility Token smart contract to use
                                 */
                                function setUtilityToken(address utilityToken) external onlyAdmin {
                                  assembly {
                                    sstore(_utilityTokenSlot, utilityToken)
                                  }
                                }
                                /**
                                 * @dev Purposefully reverts to prevent having any type of ether transfered into the contract
                                 */
                                receive() external payable {
                                  revert();
                                }
                                /**
                                 * @dev Purposefully reverts to prevent any calls to undefined functions
                                 */
                                fallback() external payable {
                                  revert();
                                }
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              abstract contract Admin {
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.admin')) - 1)
                                 */
                                bytes32 constant _adminSlot = 0x3f106594dc74eeef980dae234cde8324dc2497b13d27a0c59e55bd2ca10a07c9;
                                modifier onlyAdmin() {
                                  require(msg.sender == getAdmin(), "HOLOGRAPH: admin only function");
                                  _;
                                }
                                constructor() {}
                                function admin() public view returns (address) {
                                  return getAdmin();
                                }
                                function getAdmin() public view returns (address adminAddress) {
                                  assembly {
                                    adminAddress := sload(_adminSlot)
                                  }
                                }
                                function setAdmin(address adminAddress) public onlyAdmin {
                                  assembly {
                                    sstore(_adminSlot, adminAddress)
                                  }
                                }
                                function adminCall(address target, bytes calldata data) external payable onlyAdmin {
                                  assembly {
                                    calldatacopy(0, data.offset, data.length)
                                    let result := call(gas(), target, callvalue(), 0, data.length, 0, 0)
                                    returndatacopy(0, 0, returndatasize())
                                    switch result
                                    case 0 {
                                      revert(0, returndatasize())
                                    }
                                    default {
                                      return(0, returndatasize())
                                    }
                                  }
                                }
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              import "../interface/InitializableInterface.sol";
                              /**
                               * @title Initializable
                               * @author https://github.com/holographxyz
                               * @notice Use init instead of constructor
                               * @dev This allows for use of init function to make one time initializations without the need for a constructor
                               */
                              abstract contract Initializable is InitializableInterface {
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.initialized')) - 1)
                                 */
                                bytes32 constant _initializedSlot = 0x4e5f991bca30eca2d4643aaefa807e88f96a4a97398933d572a3c0d973004a01;
                                /**
                                 * @dev Constructor is left empty and init is used instead
                                 */
                                constructor() {}
                                /**
                                 * @notice Used internally to initialize the contract instead of through a constructor
                                 * @dev This function is called by the deployer/factory when creating a contract
                                 * @param initPayload abi encoded payload to use for contract initilaization
                                 */
                                function init(bytes memory initPayload) external virtual returns (bytes4);
                                function _isInitialized() internal view returns (bool initialized) {
                                  assembly {
                                    initialized := sload(_initializedSlot)
                                  }
                                }
                                function _setInitialized() internal {
                                  assembly {
                                    sstore(_initializedSlot, 0x0000000000000000000000000000000000000000000000000000000000000001)
                                  }
                                }
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              /**
                               * @title Initializable
                               * @author https://github.com/holographxyz
                               * @notice Use init instead of constructor
                               * @dev This allows for use of init function to make one time initializations without the need of a constructor
                               */
                              interface InitializableInterface {
                                /**
                                 * @notice Used internally to initialize the contract instead of through a constructor
                                 * @dev This function is called by the deployer/factory when creating a contract
                                 * @param initPayload abi encoded payload to use for contract initilaization
                                 */
                                function init(bytes memory initPayload) external returns (bytes4);
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              /**
                               * @title Holograph Protocol
                               * @author https://github.com/holographxyz
                               * @notice This is the primary Holograph Protocol smart contract
                               * @dev This contract stores a reference to all the primary modules and variables of the protocol
                               */
                              interface HolographInterface {
                                /**
                                 * @notice Get the address of the Holograph Bridge module
                                 * @dev Used for beaming holographable assets cross-chain
                                 */
                                function getBridge() external view returns (address bridge);
                                /**
                                 * @notice Update the Holograph Bridge module address
                                 * @param bridge address of the Holograph Bridge smart contract to use
                                 */
                                function setBridge(address bridge) external;
                                /**
                                 * @notice Get the chain ID that the Protocol was deployed on
                                 * @dev Useful for checking if/when a hard fork occurs
                                 */
                                function getChainId() external view returns (uint256 chainId);
                                /**
                                 * @notice Update the chain ID
                                 * @dev Useful for updating once a hard fork has been mitigated
                                 * @param chainId EVM chain ID to use
                                 */
                                function setChainId(uint256 chainId) external;
                                /**
                                 * @notice Get the address of the Holograph Factory module
                                 * @dev Used for deploying holographable smart contracts
                                 */
                                function getFactory() external view returns (address factory);
                                /**
                                 * @notice Update the Holograph Factory module address
                                 * @param factory address of the Holograph Factory smart contract to use
                                 */
                                function setFactory(address factory) external;
                                /**
                                 * @notice Get the Holograph chain Id
                                 * @dev Holograph uses an internal chain id mapping
                                 */
                                function getHolographChainId() external view returns (uint32 holographChainId);
                                /**
                                 * @notice Update the Holograph chain ID
                                 * @dev Useful for updating once a hard fork was mitigated
                                 * @param holographChainId Holograph chain ID to use
                                 */
                                function setHolographChainId(uint32 holographChainId) external;
                                /**
                                 * @notice Get the address of the Holograph Interfaces module
                                 * @dev Holograph uses this contract to store data that needs to be accessed by a large portion of the modules
                                 */
                                function getInterfaces() external view returns (address interfaces);
                                /**
                                 * @notice Update the Holograph Interfaces module address
                                 * @param interfaces address of the Holograph Interfaces smart contract to use
                                 */
                                function setInterfaces(address interfaces) external;
                                /**
                                 * @notice Get the address of the Holograph Operator module
                                 * @dev All cross-chain Holograph Bridge beams are handled by the Holograph Operator module
                                 */
                                function getOperator() external view returns (address operator);
                                /**
                                 * @notice Update the Holograph Operator module address
                                 * @param operator address of the Holograph Operator smart contract to use
                                 */
                                function setOperator(address operator) external;
                                /**
                                 * @notice Get the Holograph Registry module
                                 * @dev This module stores a reference for all deployed holographable smart contracts
                                 */
                                function getRegistry() external view returns (address registry);
                                /**
                                 * @notice Update the Holograph Registry module address
                                 * @param registry address of the Holograph Registry smart contract to use
                                 */
                                function setRegistry(address registry) external;
                                /**
                                 * @notice Get the Holograph Treasury module
                                 * @dev All of the Holograph Protocol assets are stored and managed by this module
                                 */
                                function getTreasury() external view returns (address treasury);
                                /**
                                 * @notice Update the Holograph Treasury module address
                                 * @param treasury address of the Holograph Treasury smart contract to use
                                 */
                                function setTreasury(address treasury) external;
                                /**
                                 * @notice Get the Holograph Utility Token address
                                 * @dev This is the official utility token of the Holograph Protocol
                                 */
                                function getUtilityToken() external view returns (address utilityToken);
                                /**
                                 * @notice Update the Holograph Utility Token address
                                 * @param utilityToken address of the Holograph Utility Token smart contract to use
                                 */
                                function setUtilityToken(address utilityToken) external;
                              }
                              

                              File 9 of 14: HolographERC721
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              abstract contract Admin {
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.admin')) - 1)
                                 */
                                bytes32 constant _adminSlot = 0x3f106594dc74eeef980dae234cde8324dc2497b13d27a0c59e55bd2ca10a07c9;
                                modifier onlyAdmin() {
                                  require(msg.sender == getAdmin(), "HOLOGRAPH: admin only function");
                                  _;
                                }
                                constructor() {}
                                function admin() public view returns (address) {
                                  return getAdmin();
                                }
                                function getAdmin() public view returns (address adminAddress) {
                                  assembly {
                                    adminAddress := sload(_adminSlot)
                                  }
                                }
                                function setAdmin(address adminAddress) public onlyAdmin {
                                  assembly {
                                    sstore(_adminSlot, adminAddress)
                                  }
                                }
                                function adminCall(address target, bytes calldata data) external payable onlyAdmin {
                                  assembly {
                                    calldatacopy(0, data.offset, data.length)
                                    let result := call(gas(), target, callvalue(), 0, data.length, 0, 0)
                                    returndatacopy(0, 0, returndatasize())
                                    switch result
                                    case 0 {
                                      revert(0, returndatasize())
                                    }
                                    default {
                                      return(0, returndatasize())
                                    }
                                  }
                                }
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              import "../interface/InitializableInterface.sol";
                              /**
                               * @title Initializable
                               * @author https://github.com/holographxyz
                               * @notice Use init instead of constructor
                               * @dev This allows for use of init function to make one time initializations without the need for a constructor
                               */
                              abstract contract Initializable is InitializableInterface {
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.initialized')) - 1)
                                 */
                                bytes32 constant _initializedSlot = 0x4e5f991bca30eca2d4643aaefa807e88f96a4a97398933d572a3c0d973004a01;
                                /**
                                 * @dev Constructor is left empty and init is used instead
                                 */
                                constructor() {}
                                /**
                                 * @notice Used internally to initialize the contract instead of through a constructor
                                 * @dev This function is called by the deployer/factory when creating a contract
                                 * @param initPayload abi encoded payload to use for contract initilaization
                                 */
                                function init(bytes memory initPayload) external virtual returns (bytes4);
                                function _isInitialized() internal view returns (bool initialized) {
                                  assembly {
                                    initialized := sload(_initializedSlot)
                                  }
                                }
                                function _setInitialized() internal {
                                  assembly {
                                    sstore(_initializedSlot, 0x0000000000000000000000000000000000000000000000000000000000000001)
                                  }
                                }
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              abstract contract Owner {
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.owner')) - 1)
                                 */
                                bytes32 constant _ownerSlot = 0xb56711ba6bd3ded7639fc335ee7524fe668a79d7558c85992e3f8494cf772777;
                                /**
                                 * @dev Event emitted when contract owner is changed.
                                 */
                                event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
                                modifier onlyOwner() virtual {
                                  require(msg.sender == getOwner(), "HOLOGRAPH: owner only function");
                                  _;
                                }
                                function owner() external view virtual returns (address) {
                                  return getOwner();
                                }
                                constructor() {}
                                function getOwner() public view returns (address ownerAddress) {
                                  assembly {
                                    ownerAddress := sload(_ownerSlot)
                                  }
                                }
                                function setOwner(address ownerAddress) public virtual onlyOwner {
                                  address previousOwner = getOwner();
                                  assembly {
                                    sstore(_ownerSlot, ownerAddress)
                                  }
                                  emit OwnershipTransferred(previousOwner, ownerAddress);
                                }
                                function transferOwnership(address newOwner) public onlyOwner {
                                  require(newOwner != address(0), "HOLOGRAPH: zero address");
                                  assembly {
                                    sstore(_ownerSlot, newOwner)
                                  }
                                }
                                function ownerCall(address target, bytes calldata data) external payable onlyOwner {
                                  assembly {
                                    calldatacopy(0, data.offset, data.length)
                                    let result := call(gas(), target, callvalue(), 0, data.length, 0, 0)
                                    returndatacopy(0, 0, returndatasize())
                                    switch result
                                    case 0 {
                                      revert(0, returndatasize())
                                    }
                                    default {
                                      return(0, returndatasize())
                                    }
                                  }
                                }
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              import "../abstract/Admin.sol";
                              import "../abstract/Initializable.sol";
                              import "../abstract/Owner.sol";
                              import "../enum/HolographERC721Event.sol";
                              import "../enum/InterfaceType.sol";
                              import "../interface/ERC165.sol";
                              import "../interface/ERC721.sol";
                              import "../interface/HolographERC721Interface.sol";
                              import "../interface/ERC721Metadata.sol";
                              import "../interface/ERC721TokenReceiver.sol";
                              import "../interface/Holographable.sol";
                              import "../interface/HolographedERC721.sol";
                              import "../interface/HolographInterface.sol";
                              import "../interface/HolographerInterface.sol";
                              import "../interface/HolographRegistryInterface.sol";
                              import "../interface/InitializableInterface.sol";
                              import "../interface/HolographInterfacesInterface.sol";
                              import "../interface/HolographRoyaltiesInterface.sol";
                              import "../interface/Ownable.sol";
                              /**
                               * @title Holograph Bridgeable ERC-721 Collection
                               * @author Holograph Foundation
                               * @notice A smart contract for minting and managing Holograph Bridgeable ERC721 NFTs.
                               * @dev The entire logic and functionality of the smart contract is self-contained.
                               */
                              contract HolographERC721 is Admin, Owner, HolographERC721Interface, Initializable {
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.holograph')) - 1)
                                 */
                                bytes32 constant _holographSlot = 0xb4107f746e9496e8452accc7de63d1c5e14c19f510932daa04077cd49e8bd77a;
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.sourceContract')) - 1)
                                 */
                                bytes32 constant _sourceContractSlot = 0x27d542086d1e831d40b749e7f5509a626c3047a36d160781c40d5acc83e5b074;
                                /**
                                 * @dev Configuration for events to trigger for source smart contract.
                                 */
                                uint256 private _eventConfig;
                                /**
                                 * @dev Collection name.
                                 */
                                string private _name;
                                /**
                                 * @dev Collection symbol.
                                 */
                                string private _symbol;
                                /**
                                 * @dev Collection royalty base points.
                                 */
                                uint16 private _bps;
                                /**
                                 * @dev Array of all token ids in collection.
                                 */
                                uint256[] private _allTokens;
                                /**
                                 * @dev Map of token id to array index of _ownedTokens.
                                 */
                                mapping(uint256 => uint256) private _ownedTokensIndex;
                                /**
                                 * @dev Token id to wallet (owner) address map.
                                 */
                                mapping(uint256 => address) private _tokenOwner;
                                /**
                                 * @dev 1-to-1 map of token id that was assigned an approved operator address.
                                 */
                                mapping(uint256 => address) private _tokenApprovals;
                                /**
                                 * @dev Map of total tokens owner by a specific address.
                                 */
                                mapping(address => uint256) private _ownedTokensCount;
                                /**
                                 * @dev Map of array of token ids owned by a specific address.
                                 */
                                mapping(address => uint256[]) private _ownedTokens;
                                /**
                                 * @notice Map of full operator approval for a particular address.
                                 * @dev Usually utilised for supporting marketplace proxy wallets.
                                 */
                                mapping(address => mapping(address => bool)) private _operatorApprovals;
                                /**
                                 * @dev Mapping from token id to position in the allTokens array.
                                 */
                                mapping(uint256 => uint256) private _allTokensIndex;
                                /**
                                 * @dev Mapping of all token ids that have been burned. This is to prevent re-minting of same token ids.
                                 */
                                mapping(uint256 => bool) private _burnedTokens;
                                /**
                                 * @notice Only allow calls from bridge smart contract.
                                 */
                                modifier onlyBridge() {
                                  require(msg.sender == _holograph().getBridge(), "ERC721: bridge only call");
                                  _;
                                }
                                /**
                                 * @notice Only allow calls from source smart contract.
                                 */
                                modifier onlySource() {
                                  address sourceContract;
                                  assembly {
                                    sourceContract := sload(_sourceContractSlot)
                                  }
                                  require(msg.sender == sourceContract, "ERC721: source only call");
                                  _;
                                }
                                /**
                                 * @dev Constructor is left empty and init is used instead
                                 */
                                constructor() {}
                                /**
                                 * @notice Used internally to initialize the contract instead of through a constructor
                                 * @dev This function is called by the deployer/factory when creating a contract
                                 * @param initPayload abi encoded payload to use for contract initilaization
                                 */
                                function init(bytes memory initPayload) external override returns (bytes4) {
                                  require(!_isInitialized(), "ERC721: already initialized");
                                  InitializableInterface sourceContract;
                                  assembly {
                                    sstore(_ownerSlot, caller())
                                    sourceContract := sload(_sourceContractSlot)
                                  }
                                  (
                                    string memory contractName,
                                    string memory contractSymbol,
                                    uint16 contractBps,
                                    uint256 eventConfig,
                                    bool skipInit,
                                    bytes memory initCode
                                  ) = abi.decode(initPayload, (string, string, uint16, uint256, bool, bytes));
                                  _name = contractName;
                                  _symbol = contractSymbol;
                                  _bps = contractBps;
                                  _eventConfig = eventConfig;
                                  if (!skipInit) {
                                    require(sourceContract.init(initCode) == InitializableInterface.init.selector, "ERC721: could not init source");
                                    (bool success, bytes memory returnData) = _royalties().delegatecall(
                                      abi.encodeWithSelector(
                                        HolographRoyaltiesInterface.initHolographRoyalties.selector,
                                        abi.encode(uint256(contractBps), uint256(0))
                                      )
                                    );
                                    bytes4 selector = abi.decode(returnData, (bytes4));
                                    require(success && selector == InitializableInterface.init.selector, "ERC721: could not init royalties");
                                  }
                                  _setInitialized();
                                  return InitializableInterface.init.selector;
                                }
                                /**
                                 * @notice Gets a base64 encoded contract JSON file.
                                 * @return string The URI.
                                 */
                                function contractURI() external view returns (string memory) {
                                  if (_isEventRegistered(HolographERC721Event.customContractURI)) {
                                    assembly {
                                      calldatacopy(0, 0, calldatasize())
                                      mstore(calldatasize(), caller())
                                      let result := staticcall(gas(), sload(_sourceContractSlot), 0, add(calldatasize(), 0x20), 0, 0)
                                      returndatacopy(0, 0, returndatasize())
                                      switch result
                                      case 0 {
                                        revert(0, returndatasize())
                                      }
                                      default {
                                        return(0, returndatasize())
                                      }
                                    }
                                  }
                                  return HolographInterfacesInterface(_interfaces()).contractURI(_name, "", "", _bps, address(this));
                                }
                                /**
                                 * @notice Gets the name of the collection.
                                 * @return string The collection name.
                                 */
                                function name() external view returns (string memory) {
                                  return _name;
                                }
                                /**
                                 * @notice Shows the interfaces the contracts support
                                 * @dev Must add new 4 byte interface Ids here to acknowledge support
                                 * @param interfaceId ERC165 style 4 byte interfaceId.
                                 * @return bool True if supported.
                                 */
                                function supportsInterface(bytes4 interfaceId) external view returns (bool) {
                                  HolographInterfacesInterface interfaces = HolographInterfacesInterface(_interfaces());
                                  ERC165 erc165Contract;
                                  assembly {
                                    erc165Contract := sload(_sourceContractSlot)
                                  }
                                  if (
                                    interfaces.supportsInterface(InterfaceType.ERC721, interfaceId) || // check global interfaces
                                    interfaces.supportsInterface(InterfaceType.ROYALTIES, interfaceId) || // check if royalties supports interface
                                    erc165Contract.supportsInterface(interfaceId) // check if source supports interface
                                  ) {
                                    return true;
                                  } else {
                                    return false;
                                  }
                                }
                                /**
                                 * @notice Gets the collection's symbol.
                                 * @return string The symbol.
                                 */
                                function symbol() external view returns (string memory) {
                                  return _symbol;
                                }
                                /**
                                 * @notice Get's the URI of the token.
                                 * @dev Defaults the the Arweave URI
                                 * @return string The URI.
                                 */
                                function tokenURI(uint256 tokenId) external view returns (string memory) {
                                  assembly {
                                    calldatacopy(0, 0, calldatasize())
                                    mstore(calldatasize(), caller())
                                    let result := staticcall(gas(), sload(_sourceContractSlot), 0, add(calldatasize(), 0x20), 0, 0)
                                    returndatacopy(0, 0, returndatasize())
                                    switch result
                                    case 0 {
                                      revert(0, returndatasize())
                                    }
                                    default {
                                      return(0, returndatasize())
                                    }
                                  }
                                }
                                /**
                                 * @notice Get list of tokens owned by wallet.
                                 * @param wallet The wallet address to get tokens for.
                                 * @return uint256[] Returns an array of token ids owned by wallet.
                                 */
                                function tokensOfOwner(address wallet) external view returns (uint256[] memory) {
                                  return _ownedTokens[wallet];
                                }
                                /**
                                 * @notice Get set length list, starting from index, for tokens owned by wallet.
                                 * @param wallet The wallet address to get tokens for.
                                 * @param index The index to start enumeration from.
                                 * @param length The length of returned results.
                                 * @return tokenIds uint256[] Returns a set length array of token ids owned by wallet.
                                 */
                                function tokensOfOwner(
                                  address wallet,
                                  uint256 index,
                                  uint256 length
                                ) external view returns (uint256[] memory tokenIds) {
                                  uint256 supply = _ownedTokensCount[wallet];
                                  if (index + length > supply) {
                                    length = supply - index;
                                  }
                                  tokenIds = new uint256[](length);
                                  for (uint256 i = 0; i < length; i++) {
                                    tokenIds[i] = _ownedTokens[wallet][index + i];
                                  }
                                }
                                /**
                                 * @notice Adds a new address to the token's approval list.
                                 * @dev Requires the sender to be in the approved addresses.
                                 * @param to The address to approve.
                                 * @param tokenId The affected token.
                                 */
                                function approve(address to, uint256 tokenId) external payable {
                                  address tokenOwner = _tokenOwner[tokenId];
                                  require(to != tokenOwner, "ERC721: cannot approve self");
                                  require(_isApprovedStrict(msg.sender, tokenId), "ERC721: not approved sender");
                                  if (_isEventRegistered(HolographERC721Event.beforeApprove)) {
                                    require(_sourceCall(abi.encodeWithSelector(HolographedERC721.beforeApprove.selector, tokenOwner, to, tokenId)));
                                  }
                                  _tokenApprovals[tokenId] = to;
                                  emit Approval(tokenOwner, to, tokenId);
                                  if (_isEventRegistered(HolographERC721Event.afterApprove)) {
                                    require(_sourceCall(abi.encodeWithSelector(HolographedERC721.afterApprove.selector, tokenOwner, to, tokenId)));
                                  }
                                }
                                /**
                                 * @notice Burns the token.
                                 * @dev The sender must be the owner or approved.
                                 * @param tokenId The token to burn.
                                 */
                                function burn(uint256 tokenId) external {
                                  require(_isApproved(msg.sender, tokenId), "ERC721: not approved sender");
                                  address wallet = _tokenOwner[tokenId];
                                  if (_isEventRegistered(HolographERC721Event.beforeBurn)) {
                                    require(_sourceCall(abi.encodeWithSelector(HolographedERC721.beforeBurn.selector, wallet, tokenId)));
                                  }
                                  _burn(wallet, tokenId);
                                  if (_isEventRegistered(HolographERC721Event.afterBurn)) {
                                    require(_sourceCall(abi.encodeWithSelector(HolographedERC721.afterBurn.selector, wallet, tokenId)));
                                  }
                                }
                                function bridgeIn(uint32 fromChain, bytes calldata payload) external onlyBridge returns (bytes4) {
                                  (address from, address to, uint256 tokenId, bytes memory data) = abi.decode(
                                    payload,
                                    (address, address, uint256, bytes)
                                  );
                                  require(!_exists(tokenId), "ERC721: token already exists");
                                  delete _burnedTokens[tokenId];
                                  _mint(to, tokenId);
                                  if (_isEventRegistered(HolographERC721Event.bridgeIn)) {
                                    require(
                                      _sourceCall(abi.encodeWithSelector(HolographedERC721.bridgeIn.selector, fromChain, from, to, tokenId, data)),
                                      "HOLOGRAPH: bridge in failed"
                                    );
                                  }
                                  return Holographable.bridgeIn.selector;
                                }
                                function bridgeOut(
                                  uint32 toChain,
                                  address sender,
                                  bytes calldata payload
                                ) external onlyBridge returns (bytes4 selector, bytes memory data) {
                                  (address from, address to, uint256 tokenId) = abi.decode(payload, (address, address, uint256));
                                  require(to != address(0), "ERC721: zero address");
                                  require(_isApproved(sender, tokenId), "ERC721: sender not approved");
                                  require(from == _tokenOwner[tokenId], "ERC721: from is not owner");
                                  if (_isEventRegistered(HolographERC721Event.bridgeOut)) {
                                    /*
                                     * @dev making a bridgeOut call to source contract
                                     *      assembly is used so that msg.sender can be injected in the calldata
                                     */
                                    bytes memory sourcePayload = abi.encodeWithSelector(
                                      HolographedERC721.bridgeOut.selector,
                                      toChain,
                                      from,
                                      to,
                                      tokenId
                                    );
                                    assembly {
                                      // it is important to add 32 bytes in order to accommodate the first 32 bytes being used for storing length of bytes
                                      mstore(add(sourcePayload, add(mload(sourcePayload), 0x20)), caller())
                                      let result := call(
                                        gas(),
                                        sload(_sourceContractSlot),
                                        callvalue(),
                                        // start reading data from memory position, plus 32 bytes, to skip bytes length indicator
                                        add(sourcePayload, 0x20),
                                        // add an additional 32 bytes to bytes length to include the appended caller address
                                        add(mload(sourcePayload), 0x20),
                                        0,
                                        0
                                      )
                                      // when reading back data, skip the first 32 bytes which is used to indicate bytes position in calldata
                                      // also subtract 32 bytes from returndatasize to accomodate the skipped first 32 bytes
                                      returndatacopy(data, 0x20, sub(returndatasize(), 0x20))
                                      switch result
                                      case 0 {
                                        revert(0, returndatasize())
                                      }
                                    }
                                  }
                                  _burn(from, tokenId);
                                  return (Holographable.bridgeOut.selector, abi.encode(from, to, tokenId, data));
                                }
                                /**
                                 * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
                                 * are aware of the ERC721 protocol to prevent tokens from being forever locked.
                                 * @param from cannot be the zero address.
                                 * @param to cannot be the zero address.
                                 * @param tokenId token must exist and be owned by `from`.
                                 */
                                function safeTransferFrom(address from, address to, uint256 tokenId) external payable {
                                  safeTransferFrom(from, to, tokenId, "");
                                }
                                /**
                                 * @notice Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
                                 * @dev Since it's not being used, the _data variable is commented out to avoid compiler warnings.
                                 * are aware of the ERC721 protocol to prevent tokens from being forever locked.
                                 * @param from cannot be the zero address.
                                 * @param to cannot be the zero address.
                                 * @param tokenId token must exist and be owned by `from`.
                                 */
                                function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public payable {
                                  require(_isApproved(msg.sender, tokenId), "ERC721: not approved sender");
                                  if (_isEventRegistered(HolographERC721Event.beforeSafeTransfer)) {
                                    require(
                                      _sourceCall(abi.encodeWithSelector(HolographedERC721.beforeSafeTransfer.selector, from, to, tokenId, data))
                                    );
                                  }
                                  _transferFrom(from, to, tokenId);
                                  if (_isContract(to)) {
                                    require(
                                      ERC721TokenReceiver(to).onERC721Received(msg.sender, from, tokenId, data) ==
                                        ERC721TokenReceiver.onERC721Received.selector,
                                      "ERC721: onERC721Received fail"
                                    );
                                  }
                                  if (_isEventRegistered(HolographERC721Event.afterSafeTransfer)) {
                                    require(
                                      _sourceCall(abi.encodeWithSelector(HolographedERC721.afterSafeTransfer.selector, from, to, tokenId, data))
                                    );
                                  }
                                }
                                /**
                                 * @notice Adds a new approved operator.
                                 * @dev Allows platforms to sell/transfer all your NFTs. Used with proxy contracts like OpenSea/Rarible.
                                 * @param to The address to approve.
                                 * @param approved Turn on or off approval status.
                                 */
                                function setApprovalForAll(address to, bool approved) external {
                                  require(to != msg.sender, "ERC721: cannot approve self");
                                  if (_isEventRegistered(HolographERC721Event.beforeApprovalAll)) {
                                    require(
                                      _sourceCall(abi.encodeWithSelector(HolographedERC721.beforeApprovalAll.selector, msg.sender, to, approved))
                                    );
                                  }
                                  _operatorApprovals[msg.sender][to] = approved;
                                  emit ApprovalForAll(msg.sender, to, approved);
                                  if (_isEventRegistered(HolographERC721Event.afterApprovalAll)) {
                                    require(
                                      _sourceCall(abi.encodeWithSelector(HolographedERC721.afterApprovalAll.selector, msg.sender, to, approved))
                                    );
                                  }
                                }
                                /**
                                 * @dev Allows for source smart contract to burn a token.
                                 *  Note: this is put in place to make sure that custom logic could be implemented for merging, gamification, etc.
                                 *  Note: token cannot be burned if it's locked by bridge.
                                 */
                                function sourceBurn(uint256 tokenId) external onlySource {
                                  address wallet = _tokenOwner[tokenId];
                                  _burn(wallet, tokenId);
                                }
                                /**
                                 * @dev Allows for source smart contract to mint a token.
                                 */
                                function sourceMint(address to, uint224 tokenId) external onlySource {
                                  // uint32 is reserved for chain id to be used
                                  // we need to get current chain id, and prepend it to tokenId
                                  // this will prevent possible tokenId overlap if minting simultaneously on multiple chains is possible
                                  uint256 token = uint256(bytes32(abi.encodePacked(_chain(), tokenId)));
                                  require(!_burnedTokens[token], "ERC721: can't mint burned token");
                                  _mint(to, token);
                                }
                                /**
                                 * @dev Allows source to get the prepend for their tokenIds.
                                 */
                                function sourceGetChainPrepend() external view onlySource returns (uint256) {
                                  return uint256(bytes32(abi.encodePacked(_chain(), uint224(0))));
                                }
                                /**
                                 * @dev Allows for source smart contract to mint a batch of tokens.
                                 */
                                function sourceMintBatch(address to, uint224[] calldata tokenIds) external onlySource {
                                  require(tokenIds.length < 1000, "ERC721: max batch size is 1000");
                                  uint32 chain = _chain();
                                  uint256 token;
                                  for (uint256 i = 0; i < tokenIds.length; i++) {
                                    require(!_burnedTokens[token], "ERC721: can't mint burned token");
                                    token = uint256(bytes32(abi.encodePacked(chain, tokenIds[i])));
                                    require(!_burnedTokens[token], "ERC721: can't mint burned token");
                                    _mint(to, token);
                                  }
                                }
                                /**
                                 * @dev Allows for source smart contract to mint a batch of tokens.
                                 */
                                function sourceMintBatch(address[] calldata wallets, uint224[] calldata tokenIds) external onlySource {
                                  require(wallets.length == tokenIds.length, "ERC721: array length missmatch");
                                  require(tokenIds.length < 1000, "ERC721: max batch size is 1000");
                                  uint32 chain = _chain();
                                  uint256 token;
                                  for (uint256 i = 0; i < tokenIds.length; i++) {
                                    token = uint256(bytes32(abi.encodePacked(chain, tokenIds[i])));
                                    require(!_burnedTokens[token], "ERC721: can't mint burned token");
                                    _mint(wallets[i], token);
                                  }
                                }
                                /**
                                 * @dev Allows for source smart contract to mint a batch of tokens.
                                 */
                                function sourceMintBatchIncremental(address to, uint224 startingTokenId, uint256 length) external onlySource {
                                  uint256 token = uint256(bytes32(abi.encodePacked(_chain(), startingTokenId)));
                                  for (uint256 i = 0; i < length; i++) {
                                    require(!_burnedTokens[token], "ERC721: can't mint burned token");
                                    _mint(to, token);
                                    token++;
                                  }
                                }
                                /**
                                 * @dev Allows for source smart contract to transfer a token.
                                 *  Note: this is put in place to make sure that custom logic could be implemented for merging, gamification, etc.
                                 *  Note: token cannot be transfered if it's locked by bridge.
                                 */
                                function sourceTransfer(address to, uint256 tokenId) external onlySource {
                                  require(!_burnedTokens[tokenId], "ERC721: token has been burned");
                                  address wallet = _tokenOwner[tokenId];
                                  _transferFrom(wallet, to, tokenId);
                                }
                                /**
                                 * @dev Allows for source smart contract to make calls to external contracts
                                 */
                                function sourceExternalCall(address target, bytes calldata data) external onlySource {
                                  assembly {
                                    calldatacopy(0, data.offset, data.length)
                                    let result := call(gas(), target, callvalue(), 0, data.length, 0, 0)
                                    returndatacopy(0, 0, returndatasize())
                                    switch result
                                    case 0 {
                                      revert(0, returndatasize())
                                    }
                                    default {
                                      return(0, returndatasize())
                                    }
                                  }
                                }
                                /**
                                 * @notice Transfers `tokenId` token from `msg.sender` to `to`.
                                 * @dev WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
                                 * @param to cannot be the zero address.
                                 * @param tokenId token must be owned by `from`.
                                 */
                                function transfer(address to, uint256 tokenId) external payable {
                                  transferFrom(msg.sender, to, tokenId, "");
                                }
                                /**
                                 * @notice Transfers `tokenId` token from `from` to `to`.
                                 * @dev WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
                                 * @param from  cannot be the zero address.
                                 * @param to cannot be the zero address.
                                 * @param tokenId token must be owned by `from`.
                                 */
                                function transferFrom(address from, address to, uint256 tokenId) public payable {
                                  transferFrom(from, to, tokenId, "");
                                }
                                /**
                                 * @notice Transfers `tokenId` token from `from` to `to`.
                                 * @dev WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
                                 * @dev Since it's not being used, the _data variable is commented out to avoid compiler warnings.
                                 * @param from  cannot be the zero address.
                                 * @param to cannot be the zero address.
                                 * @param tokenId token must be owned by `from`.
                                 * @param data additional data to pass.
                                 */
                                function transferFrom(address from, address to, uint256 tokenId, bytes memory data) public payable {
                                  require(_isApproved(msg.sender, tokenId), "ERC721: not approved sender");
                                  if (_isEventRegistered(HolographERC721Event.beforeTransfer)) {
                                    require(_sourceCall(abi.encodeWithSelector(HolographedERC721.beforeTransfer.selector, from, to, tokenId, data)));
                                  }
                                  _transferFrom(from, to, tokenId);
                                  if (_isEventRegistered(HolographERC721Event.afterTransfer)) {
                                    require(_sourceCall(abi.encodeWithSelector(HolographedERC721.afterTransfer.selector, from, to, tokenId, data)));
                                  }
                                }
                                /**
                                 * @notice Get total number of tokens owned by wallet.
                                 * @dev Used to see total amount of tokens owned by a specific wallet.
                                 * @param wallet Address for which to get token balance.
                                 * @return uint256 Returns an integer, representing total amount of tokens held by address.
                                 */
                                function balanceOf(address wallet) public view returns (uint256) {
                                  return _ownedTokensCount[wallet];
                                }
                                function burned(uint256 tokenId) public view returns (bool) {
                                  return _burnedTokens[tokenId];
                                }
                                /**
                                 * @notice Decimal places to have for totalSupply.
                                 * @dev Since ERC721s are single, we use 0 as the decimal places to make sure a round number for totalSupply.
                                 * @return uint256 Returns the number of decimal places to have for totalSupply.
                                 */
                                function decimals() external pure returns (uint256) {
                                  return 0;
                                }
                                function exists(uint256 tokenId) public view returns (bool) {
                                  return _tokenOwner[tokenId] != address(0);
                                }
                                /**
                                 * @notice Gets the approved address for the token.
                                 * @dev Single operator set for a specific token. Usually used for one-time very specific authorisations.
                                 * @param tokenId Token id to get approved operator for.
                                 * @return address Approved address for token.
                                 */
                                function getApproved(uint256 tokenId) external view returns (address) {
                                  return _tokenApprovals[tokenId];
                                }
                                /**
                                 * @notice Checks if the address is approved.
                                 * @dev Includes references to OpenSea and Rarible marketplace proxies.
                                 * @param wallet Address of the wallet.
                                 * @param operator Address of the marketplace operator.
                                 * @return bool True if approved.
                                 */
                                function isApprovedForAll(address wallet, address operator) external view returns (bool) {
                                  return (_operatorApprovals[wallet][operator] || _sourceApproved(wallet, operator));
                                }
                                /**
                                 * @notice Checks who the owner of a token is.
                                 * @dev The token must exist.
                                 * @param tokenId The token to look up.
                                 * @return address Owner of the token.
                                 */
                                function ownerOf(uint256 tokenId) external view returns (address) {
                                  address tokenOwner = _tokenOwner[tokenId];
                                  require(tokenOwner != address(0), "ERC721: token does not exist");
                                  return tokenOwner;
                                }
                                /**
                                 * @notice Get token by index.
                                 * @dev Used in conjunction with totalSupply function to iterate over all tokens in collection.
                                 * @param index Index of token in array.
                                 * @return uint256 Returns the token id of token located at that index.
                                 */
                                function tokenByIndex(uint256 index) external view returns (uint256) {
                                  require(index < _allTokens.length, "ERC721: index out of bounds");
                                  return _allTokens[index];
                                }
                                /**
                                 * @notice Get set length list, starting from index, for all tokens.
                                 * @param index The index to start enumeration from.
                                 * @param length The length of returned results.
                                 * @return tokenIds uint256[] Returns a set length array of token ids minted.
                                 */
                                function tokens(uint256 index, uint256 length) external view returns (uint256[] memory tokenIds) {
                                  uint256 supply = _allTokens.length;
                                  if (index + length > supply) {
                                    length = supply - index;
                                  }
                                  tokenIds = new uint256[](length);
                                  for (uint256 i = 0; i < length; i++) {
                                    tokenIds[i] = _allTokens[index + i];
                                  }
                                }
                                /**
                                 * @notice Get token from wallet by index instead of token id.
                                 * @dev Helpful for wallet token enumeration where token id info is not yet available. Use in conjunction with balanceOf function.
                                 * @param wallet Specific address for which to get token for.
                                 * @param index Index of token in array.
                                 * @return uint256 Returns the token id of token located at that index in specified wallet.
                                 */
                                function tokenOfOwnerByIndex(address wallet, uint256 index) external view returns (uint256) {
                                  require(index < balanceOf(wallet), "ERC721: index out of bounds");
                                  return _ownedTokens[wallet][index];
                                }
                                /**
                                 * @notice Total amount of tokens in the collection.
                                 * @dev Ignores burned tokens.
                                 * @return uint256 Returns the total number of active (not burned) tokens.
                                 */
                                function totalSupply() external view returns (uint256) {
                                  return _allTokens.length;
                                }
                                /**
                                 * @notice Empty function that is triggered by external contract on NFT transfer.
                                 * @dev We have this blank function in place to make sure that external contract sending in NFTs don't error out.
                                 * @dev Since it's not being used, the _operator variable is commented out to avoid compiler warnings.
                                 * @dev Since it's not being used, the _from variable is commented out to avoid compiler warnings.
                                 * @dev Since it's not being used, the _tokenId variable is commented out to avoid compiler warnings.
                                 * @dev Since it's not being used, the _data variable is commented out to avoid compiler warnings.
                                 * @return bytes4 Returns the interfaceId of onERC721Received.
                                 */
                                function onERC721Received(
                                  address _operator,
                                  address _from,
                                  uint256 _tokenId,
                                  bytes calldata _data
                                ) external returns (bytes4) {
                                  require(_isContract(_operator), "ERC721: operator not contract");
                                  if (_isEventRegistered(HolographERC721Event.beforeOnERC721Received)) {
                                    require(
                                      _sourceCall(
                                        abi.encodeWithSelector(
                                          HolographedERC721.beforeOnERC721Received.selector,
                                          _operator,
                                          _from,
                                          address(this),
                                          _tokenId,
                                          _data
                                        )
                                      )
                                    );
                                  }
                                  try HolographERC721Interface(_operator).ownerOf(_tokenId) returns (address tokenOwner) {
                                    require(tokenOwner == address(this), "ERC721: contract not token owner");
                                  } catch {
                                    revert("ERC721: token does not exist");
                                  }
                                  if (_isEventRegistered(HolographERC721Event.afterOnERC721Received)) {
                                    require(
                                      _sourceCall(
                                        abi.encodeWithSelector(
                                          HolographedERC721.afterOnERC721Received.selector,
                                          _operator,
                                          _from,
                                          address(this),
                                          _tokenId,
                                          _data
                                        )
                                      )
                                    );
                                  }
                                  return ERC721TokenReceiver.onERC721Received.selector;
                                }
                                /**
                                 * @dev Add a newly minted token into managed list of tokens.
                                 * @param to Address of token owner for which to add the token.
                                 * @param tokenId Id of token to add.
                                 */
                                function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
                                  _ownedTokensIndex[tokenId] = _ownedTokensCount[to];
                                  _ownedTokensCount[to]++;
                                  _ownedTokens[to].push(tokenId);
                                  _allTokensIndex[tokenId] = _allTokens.length;
                                  _allTokens.push(tokenId);
                                }
                                /**
                                 * @notice Burns the token.
                                 * @dev All validation needs to be done before calling this function.
                                 * @param wallet Address of current token owner.
                                 * @param tokenId The token to burn.
                                 */
                                function _burn(address wallet, uint256 tokenId) private {
                                  _clearApproval(tokenId);
                                  _tokenOwner[tokenId] = address(0);
                                  _registryTransfer(wallet, address(0), tokenId);
                                  _removeTokenFromOwnerEnumeration(wallet, tokenId);
                                  _burnedTokens[tokenId] = true;
                                }
                                /**
                                 * @notice Deletes a token from the approval list.
                                 * @dev Removes from count.
                                 * @param tokenId T.
                                 */
                                function _clearApproval(uint256 tokenId) private {
                                  delete _tokenApprovals[tokenId];
                                }
                                /**
                                 * @notice Mints an NFT.
                                 * @dev Can to mint the token to the zero address and the token cannot already exist.
                                 * @param to Address to mint to.
                                 * @param tokenId The new token.
                                 */
                                function _mint(address to, uint256 tokenId) private {
                                  require(tokenId > 0, "ERC721: token id cannot be zero");
                                  require(to != address(0), "ERC721: minting to burn address");
                                  require(!_exists(tokenId), "ERC721: token already exists");
                                  require(!_burnedTokens[tokenId], "ERC721: token has been burned");
                                  _tokenOwner[tokenId] = to;
                                  _registryTransfer(address(0), to, tokenId);
                                  _addTokenToOwnerEnumeration(to, tokenId);
                                }
                                function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
                                  uint256 lastTokenIndex = _allTokens.length - 1;
                                  uint256 tokenIndex = _allTokensIndex[tokenId];
                                  uint256 lastTokenId = _allTokens[lastTokenIndex];
                                  _allTokens[tokenIndex] = lastTokenId;
                                  _allTokensIndex[lastTokenId] = tokenIndex;
                                  delete _allTokensIndex[tokenId];
                                  delete _allTokens[lastTokenIndex];
                                  _allTokens.pop();
                                }
                                /**
                                 * @dev Remove a token from managed list of tokens.
                                 * @param from Address of token owner for which to remove the token.
                                 * @param tokenId Id of token to remove.
                                 */
                                function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
                                  _removeTokenFromAllTokensEnumeration(tokenId);
                                  _ownedTokensCount[from]--;
                                  uint256 lastTokenIndex = _ownedTokensCount[from];
                                  uint256 tokenIndex = _ownedTokensIndex[tokenId];
                                  if (tokenIndex != lastTokenIndex) {
                                    uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];
                                    _ownedTokens[from][tokenIndex] = lastTokenId;
                                    _ownedTokensIndex[lastTokenId] = tokenIndex;
                                  }
                                  if (lastTokenIndex == 0) {
                                    delete _ownedTokens[from];
                                  } else {
                                    delete _ownedTokens[from][lastTokenIndex];
                                    _ownedTokens[from].pop();
                                  }
                                }
                                /**
                                 * @dev Primary private function that handles the transfer/mint/burn functionality.
                                 * @param from Address from where token is being transferred. Zero address means it is being minted.
                                 * @param to Address to whom the token is being transferred. Zero address means it is being burned.
                                 * @param tokenId Id of token that is being transferred/minted/burned.
                                 */
                                function _transferFrom(address from, address to, uint256 tokenId) private {
                                  require(_tokenOwner[tokenId] == from, "ERC721: token not owned");
                                  require(to != address(0), "ERC721: use burn instead");
                                  _clearApproval(tokenId);
                                  _tokenOwner[tokenId] = to;
                                  _registryTransfer(from, to, tokenId);
                                  _removeTokenFromOwnerEnumeration(from, tokenId);
                                  _addTokenToOwnerEnumeration(to, tokenId);
                                }
                                function _chain() private view returns (uint32) {
                                  uint32 currentChain = HolographInterface(HolographerInterface(payable(address(this))).getHolograph())
                                    .getHolographChainId();
                                  if (currentChain != HolographerInterface(payable(address(this))).getOriginChain()) {
                                    return currentChain;
                                  }
                                  return uint32(0);
                                }
                                /**
                                 * @notice Checks if the token owner exists.
                                 * @dev If the address is the zero address no owner exists.
                                 * @param tokenId The affected token.
                                 * @return bool True if it exists.
                                 */
                                function _exists(uint256 tokenId) private view returns (bool) {
                                  address tokenOwner = _tokenOwner[tokenId];
                                  return tokenOwner != address(0);
                                }
                                function _sourceApproved(address _tokenWallet, address _tokenSpender) internal view returns (bool approved) {
                                  if (_isEventRegistered(HolographERC721Event.onIsApprovedForAll)) {
                                    HolographedERC721 sourceContract;
                                    assembly {
                                      sourceContract := sload(_sourceContractSlot)
                                    }
                                    if (sourceContract.onIsApprovedForAll(_tokenWallet, _tokenSpender)) {
                                      approved = true;
                                    }
                                  }
                                }
                                /**
                                 * @notice Checks if the address is an approved one.
                                 * @dev Uses inlined checks for different usecases of approval.
                                 * @param spender Address of the spender.
                                 * @param tokenId The affected token.
                                 * @return bool True if approved.
                                 */
                                function _isApproved(address spender, uint256 tokenId) private view returns (bool) {
                                  require(_exists(tokenId), "ERC721: token does not exist");
                                  address tokenOwner = _tokenOwner[tokenId];
                                  return (spender == tokenOwner ||
                                    _tokenApprovals[tokenId] == spender ||
                                    _operatorApprovals[tokenOwner][spender] ||
                                    _sourceApproved(tokenOwner, spender));
                                }
                                function _isApprovedStrict(address spender, uint256 tokenId) private view returns (bool) {
                                  require(_exists(tokenId), "ERC721: token does not exist");
                                  address tokenOwner = _tokenOwner[tokenId];
                                  return (spender == tokenOwner || _operatorApprovals[tokenOwner][spender] || _sourceApproved(tokenOwner, spender));
                                }
                                function _isContract(address contractAddress) private view returns (bool) {
                                  bytes32 codehash;
                                  assembly {
                                    codehash := extcodehash(contractAddress)
                                  }
                                  return (codehash != 0x0 && codehash != 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470);
                                }
                                /**
                                 * @dev Get the interfaces contract address.
                                 */
                                function _interfaces() private view returns (address) {
                                  return _holograph().getInterfaces();
                                }
                                function owner() public view override returns (address) {
                                  assembly {
                                    calldatacopy(0, 0, calldatasize())
                                    mstore(calldatasize(), caller())
                                    let result := staticcall(gas(), sload(_sourceContractSlot), 0, add(calldatasize(), 0x20), 0, 0)
                                    returndatacopy(0, 0, returndatasize())
                                    switch result
                                    case 0 {
                                      revert(0, returndatasize())
                                    }
                                    default {
                                      return(0, returndatasize())
                                    }
                                  }
                                }
                                function _holograph() private view returns (HolographInterface holograph) {
                                  assembly {
                                    holograph := sload(_holographSlot)
                                  }
                                }
                                /**
                                 * @dev Get the bridge contract address.
                                 */
                                function _royalties() private view returns (address) {
                                  return
                                    HolographRegistryInterface(_holograph().getRegistry()).getContractTypeAddress(0x0000000000000000000000000000486f6c6f6772617068526f79616c74696573);
                                }
                                function _registryTransfer(address _from, address _to, uint256 _tokenId) private {
                                  emit Transfer(_from, _to, _tokenId);
                                  HolographRegistryInterface(_holograph().getRegistry()).holographableEvent(
                                    abi.encode(
                                      // keccak256("TransferERC721(address,address,uint256)")
                                      bytes32(0x351b8d13789e4d8d2717631559251955685881a31494dd0b8b19b4ef8530bb6d),
                                      _from,
                                      _to,
                                      _tokenId
                                    )
                                  );
                                }
                                /**
                                 * @dev Purposefully left empty, to prevent running out of gas errors when receiving native token payments.
                                 */
                                event FundsReceived(address indexed source, uint256 amount);
                                receive() external payable {
                                  emit FundsReceived(msg.sender, msg.value);
                                }
                                /**
                                 * @notice Fallback to the source contract.
                                 * @dev Any function call that is not covered here, will automatically be sent over to the source contract.
                                 */
                                fallback() external payable {
                                  // Check if royalties support the function, send there, otherwise revert to source
                                  address _target;
                                  if (HolographInterfacesInterface(_interfaces()).supportsInterface(InterfaceType.ROYALTIES, msg.sig)) {
                                    _target = _royalties();
                                    assembly {
                                      calldatacopy(0, 0, calldatasize())
                                      let result := delegatecall(gas(), _target, 0, calldatasize(), 0, 0)
                                      returndatacopy(0, 0, returndatasize())
                                      switch result
                                      case 0 {
                                        revert(0, returndatasize())
                                      }
                                      default {
                                        return(0, returndatasize())
                                      }
                                    }
                                  } else {
                                    assembly {
                                      calldatacopy(0, 0, calldatasize())
                                      mstore(calldatasize(), caller())
                                      let result := call(gas(), sload(_sourceContractSlot), callvalue(), 0, add(calldatasize(), 0x20), 0, 0)
                                      returndatacopy(0, 0, returndatasize())
                                      switch result
                                      case 0 {
                                        revert(0, returndatasize())
                                      }
                                      default {
                                        return(0, returndatasize())
                                      }
                                    }
                                  }
                                }
                                /*
                                 * @dev all calls to source contract go through this function in order to inject original msg.sender in calldata
                                 */
                                function _sourceCall(bytes memory payload) private returns (bool output) {
                                  assembly {
                                    mstore(add(payload, add(mload(payload), 0x20)), caller())
                                    // offset memory position by 32 bytes to skip the 32 bytes where bytes length is stored
                                    // add 32 bytes to bytes length to include the appended msg.sender to calldata
                                    let result := call(
                                      gas(),
                                      sload(_sourceContractSlot),
                                      callvalue(),
                                      add(payload, 0x20),
                                      add(mload(payload), 0x20),
                                      0,
                                      0
                                    )
                                    let pos := mload(0x40)
                                    // reserve memory space for return data
                                    mstore(0x40, add(pos, returndatasize()))
                                    returndatacopy(pos, 0, returndatasize())
                                    switch result
                                    case 0 {
                                      revert(pos, returndatasize())
                                    }
                                    output := mload(pos)
                                  }
                                }
                                function _isEventRegistered(HolographERC721Event _eventName) private view returns (bool) {
                                  return ((_eventConfig >> uint256(_eventName)) & uint256(1) == 1 ? true : false);
                                }
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              enum ChainIdType {
                                UNDEFINED, //  0
                                EVM, //        1
                                HOLOGRAPH, //  2
                                LAYERZERO, //  3
                                HYPERLANE //   4
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              enum HolographERC721Event {
                                UNDEFINED, // 0
                                bridgeIn, //  1
                                bridgeOut, //  2
                                afterApprove, //  3
                                beforeApprove, //  4
                                afterApprovalAll, //  5
                                beforeApprovalAll, //  6
                                afterBurn, //  7
                                beforeBurn, //  8
                                afterMint, //  9
                                beforeMint, // 10
                                afterSafeTransfer, // 11
                                beforeSafeTransfer, // 12
                                afterTransfer, // 13
                                beforeTransfer, // 14
                                beforeOnERC721Received, // 15
                                afterOnERC721Received, // 16
                                onIsApprovedForAll, // 17
                                customContractURI // 18
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              enum InterfaceType {
                                UNDEFINED, // 0
                                ERC20, //     1
                                ERC721, //    2
                                ERC1155, //   3
                                ROYALTIES, // 4
                                GENERIC //    5
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              enum TokenUriType {
                                UNDEFINED, //   0
                                IPFS, //        1
                                HTTPS, //       2
                                ARWEAVE //      3
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              interface CollectionURI {
                                function contractURI() external view returns (string memory);
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              pragma solidity 0.8.13;
                              interface ERC165 {
                                /// @notice Query if a contract implements an interface
                                /// @param interfaceID The interface identifier, as specified in ERC-165
                                /// @dev Interface identification is specified in ERC-165. This function
                                ///  uses less than 30,000 gas.
                                /// @return `true` if the contract implements `interfaceID` and
                                ///  `interfaceID` is not 0xffffffff, `false` otherwise
                                function supportsInterface(bytes4 interfaceID) external view returns (bool);
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              pragma solidity 0.8.13;
                              /// @title ERC-721 Non-Fungible Token Standard
                              /// @dev See https://eips.ethereum.org/EIPS/eip-721
                              ///  Note: the ERC-165 identifier for this interface is 0x80ac58cd.
                              /* is ERC165 */
                              interface ERC721 {
                                /// @dev This emits when ownership of any NFT changes by any mechanism.
                                ///  This event emits when NFTs are created (`from` == 0) and destroyed
                                ///  (`to` == 0). Exception: during contract creation, any number of NFTs
                                ///  may be created and assigned without emitting Transfer. At the time of
                                ///  any transfer, the approved address for that NFT (if any) is reset to none.
                                event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);
                                /// @dev This emits when the approved address for an NFT is changed or
                                ///  reaffirmed. The zero address indicates there is no approved address.
                                ///  When a Transfer event emits, this also indicates that the approved
                                ///  address for that NFT (if any) is reset to none.
                                event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);
                                /// @dev This emits when an operator is enabled or disabled for an owner.
                                ///  The operator can manage all NFTs of the owner.
                                event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
                                /// @notice Count all NFTs assigned to an owner
                                /// @dev NFTs assigned to the zero address are considered invalid, and this
                                ///  function throws for queries about the zero address.
                                /// @param _owner An address for whom to query the balance
                                /// @return The number of NFTs owned by `_owner`, possibly zero
                                function balanceOf(address _owner) external view returns (uint256);
                                /// @notice Find the owner of an NFT
                                /// @dev NFTs assigned to zero address are considered invalid, and queries
                                ///  about them do throw.
                                /// @param _tokenId The identifier for an NFT
                                /// @return The address of the owner of the NFT
                                function ownerOf(uint256 _tokenId) external view returns (address);
                                /// @notice Transfers the ownership of an NFT from one address to another address
                                /// @dev Throws unless `msg.sender` is the current owner, an authorized
                                ///  operator, or the approved address for this NFT. Throws if `_from` is
                                ///  not the current owner. Throws if `_to` is the zero address. Throws if
                                ///  `_tokenId` is not a valid NFT. When transfer is complete, this function
                                ///  checks if `_to` is a smart contract (code size > 0). If so, it calls
                                ///  `onERC721Received` on `_to` and throws if the return value is not
                                ///  `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`.
                                /// @param _from The current owner of the NFT
                                /// @param _to The new owner
                                /// @param _tokenId The NFT to transfer
                                /// @param data Additional data with no specified format, sent in call to `_to`
                                function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes calldata data) external payable;
                                /// @notice Transfers the ownership of an NFT from one address to another address
                                /// @dev This works identically to the other function with an extra data parameter,
                                ///  except this function just sets data to "".
                                /// @param _from The current owner of the NFT
                                /// @param _to The new owner
                                /// @param _tokenId The NFT to transfer
                                function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;
                                /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE
                                ///  TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE
                                ///  THEY MAY BE PERMANENTLY LOST
                                /// @dev Throws unless `msg.sender` is the current owner, an authorized
                                ///  operator, or the approved address for this NFT. Throws if `_from` is
                                ///  not the current owner. Throws if `_to` is the zero address. Throws if
                                ///  `_tokenId` is not a valid NFT.
                                /// @param _from The current owner of the NFT
                                /// @param _to The new owner
                                /// @param _tokenId The NFT to transfer
                                function transferFrom(address _from, address _to, uint256 _tokenId) external payable;
                                /// @notice Change or reaffirm the approved address for an NFT
                                /// @dev The zero address indicates there is no approved address.
                                ///  Throws unless `msg.sender` is the current NFT owner, or an authorized
                                ///  operator of the current owner.
                                /// @param _approved The new approved NFT controller
                                /// @param _tokenId The NFT to approve
                                function approve(address _approved, uint256 _tokenId) external payable;
                                /// @notice Enable or disable approval for a third party ("operator") to manage
                                ///  all of `msg.sender`'s assets
                                /// @dev Emits the ApprovalForAll event. The contract MUST allow
                                ///  multiple operators per owner.
                                /// @param _operator Address to add to the set of authorized operators
                                /// @param _approved True if the operator is approved, false to revoke approval
                                function setApprovalForAll(address _operator, bool _approved) external;
                                /// @notice Get the approved address for a single NFT
                                /// @dev Throws if `_tokenId` is not a valid NFT.
                                /// @param _tokenId The NFT to find the approved address for
                                /// @return The approved address for this NFT, or the zero address if there is none
                                function getApproved(uint256 _tokenId) external view returns (address);
                                /// @notice Query if an address is an authorized operator for another address
                                /// @param _owner The address that owns the NFTs
                                /// @param _operator The address that acts on behalf of the owner
                                /// @return True if `_operator` is an approved operator for `_owner`, false otherwise
                                function isApprovedForAll(address _owner, address _operator) external view returns (bool);
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              pragma solidity 0.8.13;
                              /// @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
                              /// @dev See https://eips.ethereum.org/EIPS/eip-721
                              ///  Note: the ERC-165 identifier for this interface is 0x780e9d63.
                              /* is ERC721 */
                              interface ERC721Enumerable {
                                /// @notice Count NFTs tracked by this contract
                                /// @return A count of valid NFTs tracked by this contract, where each one of
                                ///  them has an assigned and queryable owner not equal to the zero address
                                function totalSupply() external view returns (uint256);
                                /// @notice Enumerate valid NFTs
                                /// @dev Throws if `_index` >= `totalSupply()`.
                                /// @param _index A counter less than `totalSupply()`
                                /// @return The token identifier for the `_index`th NFT,
                                ///  (sort order not specified)
                                function tokenByIndex(uint256 _index) external view returns (uint256);
                                /// @notice Enumerate NFTs assigned to an owner
                                /// @dev Throws if `_index` >= `balanceOf(_owner)` or if
                                ///  `_owner` is the zero address, representing invalid NFTs.
                                /// @param _owner An address where we are interested in NFTs owned by them
                                /// @param _index A counter less than `balanceOf(_owner)`
                                /// @return The token identifier for the `_index`th NFT assigned to `_owner`,
                                ///   (sort order not specified)
                                function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256);
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              pragma solidity 0.8.13;
                              /// @title ERC-721 Non-Fungible Token Standard, optional metadata extension
                              /// @dev See https://eips.ethereum.org/EIPS/eip-721
                              ///  Note: the ERC-165 identifier for this interface is 0x5b5e139f.
                              /* is ERC721 */
                              interface ERC721Metadata {
                                /// @notice A descriptive name for a collection of NFTs in this contract
                                function name() external view returns (string memory _name);
                                /// @notice An abbreviated name for NFTs in this contract
                                function symbol() external view returns (string memory _symbol);
                                /// @notice A distinct Uniform Resource Identifier (URI) for a given asset.
                                /// @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC
                                ///  3986. The URI may point to a JSON file that conforms to the "ERC721
                                ///  Metadata JSON Schema".
                                function tokenURI(uint256 _tokenId) external view returns (string memory);
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              /// @dev Note: the ERC-165 identifier for this interface is 0x150b7a02.
                              interface ERC721TokenReceiver {
                                /// @notice Handle the receipt of an NFT
                                /// @dev The ERC721 smart contract calls this function on the recipient
                                ///  after a `transfer`. This function MAY throw to revert and reject the
                                ///  transfer. Return of other than the magic value MUST result in the
                                ///  transaction being reverted.
                                ///  Note: the contract address is always the message sender.
                                /// @param _operator The address which called `safeTransferFrom` function
                                /// @param _from The address which previously owned the token
                                /// @param _tokenId The NFT identifier which is being transferred
                                /// @param _data Additional data with no specified format
                                /// @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
                                ///  unless throwing
                                function onERC721Received(
                                  address _operator,
                                  address _from,
                                  uint256 _tokenId,
                                  bytes calldata _data
                                ) external returns (bytes4);
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              interface Holographable {
                                function bridgeIn(uint32 fromChain, bytes calldata payload) external returns (bytes4);
                                function bridgeOut(
                                  uint32 toChain,
                                  address sender,
                                  bytes calldata payload
                                ) external returns (bytes4 selector, bytes memory data);
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              /// @title Holograph ERC-721 Non-Fungible Token Standard
                              /// @dev See https://holograph.network/standard/ERC-721
                              ///  Note: the ERC-165 identifier for this interface is 0xFFFFFFFF.
                              interface HolographedERC721 {
                                // event id = 1
                                function bridgeIn(
                                  uint32 _chainId,
                                  address _from,
                                  address _to,
                                  uint256 _tokenId,
                                  bytes calldata _data
                                ) external returns (bool success);
                                // event id = 2
                                function bridgeOut(
                                  uint32 _chainId,
                                  address _from,
                                  address _to,
                                  uint256 _tokenId
                                ) external returns (bytes memory _data);
                                // event id = 3
                                function afterApprove(address _owner, address _to, uint256 _tokenId) external returns (bool success);
                                // event id = 4
                                function beforeApprove(address _owner, address _to, uint256 _tokenId) external returns (bool success);
                                // event id = 5
                                function afterApprovalAll(address _sender, address _to, bool _approved) external returns (bool success);
                                // event id = 6
                                function beforeApprovalAll(address _sender, address _to, bool _approved) external returns (bool success);
                                // event id = 7
                                function afterBurn(address _owner, uint256 _tokenId) external returns (bool success);
                                // event id = 8
                                function beforeBurn(address _owner, uint256 _tokenId) external returns (bool success);
                                // event id = 9
                                function afterMint(address _owner, uint256 _tokenId) external returns (bool success);
                                // event id = 10
                                function beforeMint(address _owner, uint256 _tokenId) external returns (bool success);
                                // event id = 11
                                function afterSafeTransfer(
                                  address _from,
                                  address _to,
                                  uint256 _tokenId,
                                  bytes calldata _data
                                ) external returns (bool success);
                                // event id = 12
                                function beforeSafeTransfer(
                                  address _from,
                                  address _to,
                                  uint256 _tokenId,
                                  bytes calldata _data
                                ) external returns (bool success);
                                // event id = 13
                                function afterTransfer(
                                  address _from,
                                  address _to,
                                  uint256 _tokenId,
                                  bytes calldata _data
                                ) external returns (bool success);
                                // event id = 14
                                function beforeTransfer(
                                  address _from,
                                  address _to,
                                  uint256 _tokenId,
                                  bytes calldata _data
                                ) external returns (bool success);
                                // event id = 15
                                function afterOnERC721Received(
                                  address _operator,
                                  address _from,
                                  address _to,
                                  uint256 _tokenId,
                                  bytes calldata _data
                                ) external returns (bool success);
                                // event id = 16
                                function beforeOnERC721Received(
                                  address _operator,
                                  address _from,
                                  address _to,
                                  uint256 _tokenId,
                                  bytes calldata _data
                                ) external returns (bool success);
                                // event id = 17
                                function onIsApprovedForAll(address _wallet, address _operator) external view returns (bool approved);
                                // event id = 18
                                function contractURI() external view returns (string memory contractJSON);
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              import "./CollectionURI.sol";
                              import "./ERC165.sol";
                              import "./ERC721.sol";
                              import "./ERC721Enumerable.sol";
                              import "./ERC721Metadata.sol";
                              import "./ERC721TokenReceiver.sol";
                              import "./Holographable.sol";
                              interface HolographERC721Interface is
                                ERC165,
                                ERC721,
                                ERC721Enumerable,
                                ERC721Metadata,
                                ERC721TokenReceiver,
                                CollectionURI,
                                Holographable
                              {
                                function approve(address to, uint256 tokenId) external payable;
                                function burn(uint256 tokenId) external;
                                function safeTransferFrom(address from, address to, uint256 tokenId) external payable;
                                function setApprovalForAll(address to, bool approved) external;
                                function sourceBurn(uint256 tokenId) external;
                                function sourceMint(address to, uint224 tokenId) external;
                                function sourceGetChainPrepend() external view returns (uint256);
                                function sourceTransfer(address to, uint256 tokenId) external;
                                function sourceExternalCall(address target, bytes calldata data) external;
                                function transfer(address to, uint256 tokenId) external payable;
                                function contractURI() external view returns (string memory);
                                function getApproved(uint256 tokenId) external view returns (address);
                                function isApprovedForAll(address wallet, address operator) external view returns (bool);
                                function name() external view returns (string memory);
                                function burned(uint256 tokenId) external view returns (bool);
                                function decimals() external pure returns (uint256);
                                function exists(uint256 tokenId) external view returns (bool);
                                function ownerOf(uint256 tokenId) external view returns (address);
                                function supportsInterface(bytes4 interfaceId) external view returns (bool);
                                function symbol() external view returns (string memory);
                                function tokenByIndex(uint256 index) external view returns (uint256);
                                function tokenOfOwnerByIndex(address wallet, uint256 index) external view returns (uint256);
                                function tokensOfOwner(address wallet) external view returns (uint256[] memory);
                                function tokenURI(uint256 tokenId) external view returns (string memory);
                                function totalSupply() external view returns (uint256);
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              interface HolographerInterface {
                                function getContractType() external view returns (bytes32 contractType);
                                function getDeploymentBlock() external view returns (uint256 deploymentBlock);
                                function getHolograph() external view returns (address holograph);
                                function getHolographEnforcer() external view returns (address);
                                function getOriginChain() external view returns (uint32 originChain);
                                function getSourceContract() external view returns (address sourceContract);
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              /**
                               * @title Holograph Protocol
                               * @author https://github.com/holographxyz
                               * @notice This is the primary Holograph Protocol smart contract
                               * @dev This contract stores a reference to all the primary modules and variables of the protocol
                               */
                              interface HolographInterface {
                                /**
                                 * @notice Get the address of the Holograph Bridge module
                                 * @dev Used for beaming holographable assets cross-chain
                                 */
                                function getBridge() external view returns (address bridge);
                                /**
                                 * @notice Update the Holograph Bridge module address
                                 * @param bridge address of the Holograph Bridge smart contract to use
                                 */
                                function setBridge(address bridge) external;
                                /**
                                 * @notice Get the chain ID that the Protocol was deployed on
                                 * @dev Useful for checking if/when a hard fork occurs
                                 */
                                function getChainId() external view returns (uint256 chainId);
                                /**
                                 * @notice Update the chain ID
                                 * @dev Useful for updating once a hard fork has been mitigated
                                 * @param chainId EVM chain ID to use
                                 */
                                function setChainId(uint256 chainId) external;
                                /**
                                 * @notice Get the address of the Holograph Factory module
                                 * @dev Used for deploying holographable smart contracts
                                 */
                                function getFactory() external view returns (address factory);
                                /**
                                 * @notice Update the Holograph Factory module address
                                 * @param factory address of the Holograph Factory smart contract to use
                                 */
                                function setFactory(address factory) external;
                                /**
                                 * @notice Get the Holograph chain Id
                                 * @dev Holograph uses an internal chain id mapping
                                 */
                                function getHolographChainId() external view returns (uint32 holographChainId);
                                /**
                                 * @notice Update the Holograph chain ID
                                 * @dev Useful for updating once a hard fork was mitigated
                                 * @param holographChainId Holograph chain ID to use
                                 */
                                function setHolographChainId(uint32 holographChainId) external;
                                /**
                                 * @notice Get the address of the Holograph Interfaces module
                                 * @dev Holograph uses this contract to store data that needs to be accessed by a large portion of the modules
                                 */
                                function getInterfaces() external view returns (address interfaces);
                                /**
                                 * @notice Update the Holograph Interfaces module address
                                 * @param interfaces address of the Holograph Interfaces smart contract to use
                                 */
                                function setInterfaces(address interfaces) external;
                                /**
                                 * @notice Get the address of the Holograph Operator module
                                 * @dev All cross-chain Holograph Bridge beams are handled by the Holograph Operator module
                                 */
                                function getOperator() external view returns (address operator);
                                /**
                                 * @notice Update the Holograph Operator module address
                                 * @param operator address of the Holograph Operator smart contract to use
                                 */
                                function setOperator(address operator) external;
                                /**
                                 * @notice Get the Holograph Registry module
                                 * @dev This module stores a reference for all deployed holographable smart contracts
                                 */
                                function getRegistry() external view returns (address registry);
                                /**
                                 * @notice Update the Holograph Registry module address
                                 * @param registry address of the Holograph Registry smart contract to use
                                 */
                                function setRegistry(address registry) external;
                                /**
                                 * @notice Get the Holograph Treasury module
                                 * @dev All of the Holograph Protocol assets are stored and managed by this module
                                 */
                                function getTreasury() external view returns (address treasury);
                                /**
                                 * @notice Update the Holograph Treasury module address
                                 * @param treasury address of the Holograph Treasury smart contract to use
                                 */
                                function setTreasury(address treasury) external;
                                /**
                                 * @notice Get the Holograph Utility Token address
                                 * @dev This is the official utility token of the Holograph Protocol
                                 */
                                function getUtilityToken() external view returns (address utilityToken);
                                /**
                                 * @notice Update the Holograph Utility Token address
                                 * @param utilityToken address of the Holograph Utility Token smart contract to use
                                 */
                                function setUtilityToken(address utilityToken) external;
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              import "../enum/ChainIdType.sol";
                              import "../enum/InterfaceType.sol";
                              import "../enum/TokenUriType.sol";
                              interface HolographInterfacesInterface {
                                function contractURI(
                                  string calldata name,
                                  string calldata imageURL,
                                  string calldata externalLink,
                                  uint16 bps,
                                  address contractAddress
                                ) external pure returns (string memory);
                                function getUriPrepend(TokenUriType uriType) external view returns (string memory prepend);
                                function updateUriPrepend(TokenUriType uriType, string calldata prepend) external;
                                function updateUriPrepends(TokenUriType[] calldata uriTypes, string[] calldata prepends) external;
                                function getChainId(
                                  ChainIdType fromChainType,
                                  uint256 fromChainId,
                                  ChainIdType toChainType
                                ) external view returns (uint256 toChainId);
                                function updateChainIdMap(
                                  ChainIdType fromChainType,
                                  uint256 fromChainId,
                                  ChainIdType toChainType,
                                  uint256 toChainId
                                ) external;
                                function updateChainIdMaps(
                                  ChainIdType[] calldata fromChainType,
                                  uint256[] calldata fromChainId,
                                  ChainIdType[] calldata toChainType,
                                  uint256[] calldata toChainId
                                ) external;
                                function supportsInterface(InterfaceType interfaceType, bytes4 interfaceId) external view returns (bool);
                                function updateInterface(InterfaceType interfaceType, bytes4 interfaceId, bool supported) external;
                                function updateInterfaces(InterfaceType interfaceType, bytes4[] calldata interfaceIds, bool supported) external;
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              interface HolographRegistryInterface {
                                event HolographableContractEvent(address indexed _holographableContract, bytes _payload);
                                function isHolographedContract(address smartContract) external view returns (bool);
                                function isHolographedHashDeployed(bytes32 hash) external view returns (bool);
                                function referenceContractTypeAddress(address contractAddress) external returns (bytes32);
                                function getContractTypeAddress(bytes32 contractType) external view returns (address);
                                function setContractTypeAddress(bytes32 contractType, address contractAddress) external;
                                function getHolograph() external view returns (address holograph);
                                function setHolograph(address holograph) external;
                                function getHolographableContracts(uint256 index, uint256 length) external view returns (address[] memory contracts);
                                function getHolographableContractsLength() external view returns (uint256);
                                function getHolographedHashAddress(bytes32 hash) external view returns (address);
                                function setHolographedHashAddress(bytes32 hash, address contractAddress) external;
                                function getHToken(uint32 chainId) external view returns (address);
                                function setHToken(uint32 chainId, address hToken) external;
                                function getReservedContractTypeAddress(bytes32 contractType) external view returns (address contractTypeAddress);
                                function setReservedContractTypeAddress(bytes32 hash, bool reserved) external;
                                function setReservedContractTypeAddresses(bytes32[] calldata hashes, bool[] calldata reserved) external;
                                function getUtilityToken() external view returns (address utilityToken);
                                function setUtilityToken(address utilityToken) external;
                                function holographableEvent(bytes calldata payload) external;
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              import "../struct/ZoraBidShares.sol";
                              interface HolographRoyaltiesInterface {
                                function initHolographRoyalties(bytes memory data) external returns (bytes4);
                                function configurePayouts(address payable[] memory addresses, uint256[] memory bps) external;
                                function getPayoutInfo() external view returns (address payable[] memory addresses, uint256[] memory bps);
                                function getEthPayout() external;
                                function getTokenPayout(address tokenAddress) external;
                                function getTokensPayout(address[] memory tokenAddresses) external;
                                function supportsInterface(bytes4 interfaceId) external pure returns (bool);
                                function setRoyalties(uint256 tokenId, address payable receiver, uint256 bp) external;
                                function royaltyInfo(uint256 tokenId, uint256 value) external view returns (address, uint256);
                                function getFeeBps(uint256 tokenId) external view returns (uint256[] memory);
                                function getFeeRecipients(uint256 tokenId) external view returns (address payable[] memory);
                                function getRoyalties(uint256 tokenId) external view returns (address payable[] memory, uint256[] memory);
                                function getFees(uint256 tokenId) external view returns (address payable[] memory, uint256[] memory);
                                function tokenCreator(address /* contractAddress*/, uint256 tokenId) external view returns (address);
                                function calculateRoyaltyFee(
                                  address /* contractAddress */,
                                  uint256 tokenId,
                                  uint256 amount
                                ) external view returns (uint256);
                                function marketContract() external view returns (address);
                                function tokenCreators(uint256 tokenId) external view returns (address);
                                function bidSharesForToken(uint256 tokenId) external view returns (HolographBidShares memory bidShares);
                                function getStorageSlot(string calldata slot) external pure returns (bytes32);
                                function getTokenAddress(string memory tokenName) external view returns (address);
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              /**
                               * @title Initializable
                               * @author https://github.com/holographxyz
                               * @notice Use init instead of constructor
                               * @dev This allows for use of init function to make one time initializations without the need of a constructor
                               */
                              interface InitializableInterface {
                                /**
                                 * @notice Used internally to initialize the contract instead of through a constructor
                                 * @dev This function is called by the deployer/factory when creating a contract
                                 * @param initPayload abi encoded payload to use for contract initilaization
                                 */
                                function init(bytes memory initPayload) external returns (bytes4);
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              interface Ownable {
                                event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
                                function owner() external view returns (address);
                                function transferOwnership(address _newOwner) external;
                                function isOwner() external view returns (bool);
                                function isOwner(address wallet) external view returns (bool);
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              import "./ZoraDecimal.sol";
                              struct HolographBidShares {
                                // % of sale value that goes to the _previous_ owner of the nft
                                HolographDecimal prevOwner;
                                // % of sale value that goes to the original creator of the nft
                                HolographDecimal creator;
                                // % of sale value that goes to the seller (current owner) of the nft
                                HolographDecimal owner;
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              struct HolographDecimal {
                                uint256 value;
                              }
                              

                              File 10 of 14: HolographOperator
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              abstract contract Admin {
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.admin')) - 1)
                                 */
                                bytes32 constant _adminSlot = 0x3f106594dc74eeef980dae234cde8324dc2497b13d27a0c59e55bd2ca10a07c9;
                                modifier onlyAdmin() {
                                  require(msg.sender == getAdmin(), "HOLOGRAPH: admin only function");
                                  _;
                                }
                                constructor() {}
                                function admin() public view returns (address) {
                                  return getAdmin();
                                }
                                function getAdmin() public view returns (address adminAddress) {
                                  assembly {
                                    adminAddress := sload(_adminSlot)
                                  }
                                }
                                function setAdmin(address adminAddress) public onlyAdmin {
                                  assembly {
                                    sstore(_adminSlot, adminAddress)
                                  }
                                }
                                function adminCall(address target, bytes calldata data) external payable onlyAdmin {
                                  assembly {
                                    calldatacopy(0, data.offset, data.length)
                                    let result := call(gas(), target, callvalue(), 0, data.length, 0, 0)
                                    returndatacopy(0, 0, returndatasize())
                                    switch result
                                    case 0 {
                                      revert(0, returndatasize())
                                    }
                                    default {
                                      return(0, returndatasize())
                                    }
                                  }
                                }
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              import "../interface/InitializableInterface.sol";
                              /**
                               * @title Initializable
                               * @author https://github.com/holographxyz
                               * @notice Use init instead of constructor
                               * @dev This allows for use of init function to make one time initializations without the need for a constructor
                               */
                              abstract contract Initializable is InitializableInterface {
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.initialized')) - 1)
                                 */
                                bytes32 constant _initializedSlot = 0x4e5f991bca30eca2d4643aaefa807e88f96a4a97398933d572a3c0d973004a01;
                                /**
                                 * @dev Constructor is left empty and init is used instead
                                 */
                                constructor() {}
                                /**
                                 * @notice Used internally to initialize the contract instead of through a constructor
                                 * @dev This function is called by the deployer/factory when creating a contract
                                 * @param initPayload abi encoded payload to use for contract initilaization
                                 */
                                function init(bytes memory initPayload) external virtual returns (bytes4);
                                function _isInitialized() internal view returns (bool initialized) {
                                  assembly {
                                    initialized := sload(_initializedSlot)
                                  }
                                }
                                function _setInitialized() internal {
                                  assembly {
                                    sstore(_initializedSlot, 0x0000000000000000000000000000000000000000000000000000000000000001)
                                  }
                                }
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              enum ChainIdType {
                                UNDEFINED, //  0
                                EVM, //        1
                                HOLOGRAPH, //  2
                                LAYERZERO, //  3
                                HYPERLANE //   4
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              enum InterfaceType {
                                UNDEFINED, // 0
                                ERC20, //     1
                                ERC721, //    2
                                ERC1155, //   3
                                ROYALTIES, // 4
                                GENERIC //    5
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              enum TokenUriType {
                                UNDEFINED, //   0
                                IPFS, //        1
                                HTTPS, //       2
                                ARWEAVE //      3
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              import "./abstract/Admin.sol";
                              import "./abstract/Initializable.sol";
                              import "./interface/CrossChainMessageInterface.sol";
                              import "./interface/HolographBridgeInterface.sol";
                              import "./interface/HolographERC20Interface.sol";
                              import "./interface/HolographInterface.sol";
                              import "./interface/HolographOperatorInterface.sol";
                              import "./interface/HolographRegistryInterface.sol";
                              import "./interface/InitializableInterface.sol";
                              import "./interface/HolographInterfacesInterface.sol";
                              import "./interface/Ownable.sol";
                              import "./struct/OperatorJob.sol";
                              /**
                               * @title Holograph Operator
                               * @author https://github.com/holographxyz
                               * @notice Participate in the Holograph Protocol by becoming an Operator
                               * @dev This contract allows operators to bond utility tokens and help execute operator jobs
                               */
                              contract HolographOperator is Admin, Initializable, HolographOperatorInterface {
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.bridge')) - 1)
                                 */
                                bytes32 constant _bridgeSlot = 0xeb87cbb21687feb327e3d58c6c16d552231d12c7a0e8115042a4165fac8a77f9;
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.holograph')) - 1)
                                 */
                                bytes32 constant _holographSlot = 0xb4107f746e9496e8452accc7de63d1c5e14c19f510932daa04077cd49e8bd77a;
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.interfaces')) - 1)
                                 */
                                bytes32 constant _interfacesSlot = 0xbd3084b8c09da87ad159c247a60e209784196be2530cecbbd8f337fdd1848827;
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.jobNonce')) - 1)
                                 */
                                bytes32 constant _jobNonceSlot = 0x1cda64803f3b43503042e00863791e8d996666552d5855a78d53ee1dd4b3286d;
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.messagingModule')) - 1)
                                 */
                                bytes32 constant _messagingModuleSlot = 0x54176250282e65985d205704ffce44a59efe61f7afd99e29fda50f55b48c061a;
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.registry')) - 1)
                                 */
                                bytes32 constant _registrySlot = 0xce8e75d5c5227ce29a4ee170160bb296e5dea6934b80a9bd723f7ef1e7c850e7;
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.utilityToken')) - 1)
                                 */
                                bytes32 constant _utilityTokenSlot = 0xbf76518d46db472b71aa7677a0908b8016f3dee568415ffa24055f9a670f9c37;
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.minGasPrice')) - 1)
                                 */
                                bytes32 constant _minGasPriceSlot = 0x264d744422f7427cd080572c35c848b6cd3a36da6b47519af89ef13098b12fc0;
                                /**
                                 * @dev Internal number (in seconds), used for defining a window for operator to execute the job
                                 */
                                uint256 private _blockTime;
                                /**
                                 * @dev Minimum amount of tokens needed for bonding
                                 */
                                uint256 private _baseBondAmount;
                                /**
                                 * @dev The multiplier used for calculating bonding amount for pods
                                 */
                                uint256 private _podMultiplier;
                                /**
                                 * @dev The threshold used for limiting number of operators in a pod
                                 */
                                uint256 private _operatorThreshold;
                                /**
                                 * @dev The threshold step used for increasing bond amount once threshold is reached
                                 */
                                uint256 private _operatorThresholdStep;
                                /**
                                 * @dev The threshold divisor used for increasing bond amount once threshold is reached
                                 */
                                uint256 private _operatorThresholdDivisor;
                                /**
                                 * @dev Internal counter of all cross-chain messages received
                                 */
                                uint256 private _inboundMessageCounter;
                                /**
                                 * @dev Internal mapping of operator job details for a specific job hash
                                 */
                                mapping(bytes32 => uint256) private _operatorJobs;
                                /**
                                 * @dev Internal mapping of operator job details for a specific job hash
                                 */
                                mapping(bytes32 => bool) private _failedJobs;
                                /**
                                 * @dev Internal mapping of operator addresses, used for temp storage when defining an operator job
                                 */
                                mapping(uint256 => address) private _operatorTempStorage;
                                /**
                                 * @dev Internal index used for storing/referencing operator temp storage
                                 */
                                uint32 private _operatorTempStorageCounter;
                                /**
                                 * @dev Multi-dimensional array of available operators
                                 */
                                address[][] private _operatorPods;
                                /**
                                 * @dev Internal mapping of bonded operators, to prevent double bonding
                                 */
                                mapping(address => uint256) private _bondedOperators;
                                /**
                                 * @dev Internal mapping of bonded operators, to prevent double bonding
                                 */
                                mapping(address => uint256) private _operatorPodIndex;
                                /**
                                 * @dev Internal mapping of bonded operator amounts
                                 */
                                mapping(address => uint256) private _bondedAmounts;
                                /**
                                 * @dev Constructor is left empty and init is used instead
                                 */
                                constructor() {}
                                /**
                                 * @notice Used internally to initialize the contract instead of through a constructor
                                 * @dev This function is called by the deployer/factory when creating a contract
                                 * @param initPayload abi encoded payload to use for contract initilaization
                                 */
                                function init(bytes memory initPayload) external override returns (bytes4) {
                                  require(!_isInitialized(), "HOLOGRAPH: already initialized");
                                  (
                                    address bridge,
                                    address holograph,
                                    address interfaces,
                                    address registry,
                                    address utilityToken,
                                    uint256 minGasPrice
                                  ) = abi.decode(initPayload, (address, address, address, address, address, uint256));
                                  assembly {
                                    sstore(_adminSlot, origin())
                                    sstore(_bridgeSlot, bridge)
                                    sstore(_holographSlot, holograph)
                                    sstore(_interfacesSlot, interfaces)
                                    sstore(_registrySlot, registry)
                                    sstore(_utilityTokenSlot, utilityToken)
                                    sstore(_minGasPriceSlot, minGasPrice)
                                  }
                                  _blockTime = 60; // 60 seconds allowed for execution
                                  unchecked {
                                    _baseBondAmount = 100 * (10 ** 18); // one single token unit * 100
                                  }
                                  // how much to increase bond amount per pod
                                  _podMultiplier = 2; // 1, 4, 16, 64
                                  // starting pod max amount
                                  _operatorThreshold = 1000;
                                  // how often to increase price per each operator
                                  _operatorThresholdStep = 10;
                                  // we want to multiply by decimals, but instead will have to divide
                                  _operatorThresholdDivisor = 100; // == * 0.01
                                  // set first operator for each pod as zero address
                                  _operatorPods = [[address(0)]];
                                  // mark zero address as bonded operator, to prevent abuse
                                  _bondedOperators[address(0)] = 1;
                                  _setInitialized();
                                  return InitializableInterface.init.selector;
                                }
                                /**
                                 * @notice Recover failed job
                                 * @dev If a job fails, it can be manually recovered
                                 * @param bridgeInRequestPayload the entire cross chain message payload
                                 */
                                function recoverJob(bytes calldata bridgeInRequestPayload) external payable {
                                  bytes32 hash = keccak256(bridgeInRequestPayload);
                                  require(_failedJobs[hash], "HOLOGRAPH: invalid recovery job");
                                  (bool success, ) = _bridge().call{value: msg.value}(bridgeInRequestPayload);
                                  require(success, "HOLOGRAPH: recovery failed");
                                  delete (_failedJobs[hash]);
                                }
                                /**
                                 * @notice Execute an available operator job
                                 * @dev When making this call, if operating criteria is not met, the call will revert
                                 * @param bridgeInRequestPayload the entire cross chain message payload
                                 */
                                function executeJob(bytes calldata bridgeInRequestPayload) external payable {
                                  /**
                                   * @dev derive the payload hash for use in mappings
                                   */
                                  bytes32 hash = keccak256(bridgeInRequestPayload);
                                  /**
                                   * @dev check that job exists
                                   */
                                  require(_operatorJobs[hash] > 0, "HOLOGRAPH: invalid job");
                                  uint256 gasLimit = 0;
                                  uint256 gasPrice = 0;
                                  assembly {
                                    /**
                                     * @dev extract gasLimit
                                     */
                                    gasLimit := calldataload(sub(add(bridgeInRequestPayload.offset, bridgeInRequestPayload.length), 0x40))
                                    /**
                                     * @dev extract gasPrice
                                     */
                                    gasPrice := calldataload(sub(add(bridgeInRequestPayload.offset, bridgeInRequestPayload.length), 0x20))
                                  }
                                  /**
                                   * @dev unpack bitwise packed operator job details
                                   */
                                  OperatorJob memory job = getJobDetails(hash);
                                  /**
                                   * @dev to prevent replay attacks, remove job from mapping
                                   */
                                  delete _operatorJobs[hash];
                                  /**
                                   * @dev operators of last resort are allowed, but they will not receive HLG rewards of any sort
                                   */
                                  bool isBonded = _bondedAmounts[msg.sender] != 0;
                                  /**
                                   * @dev check that a specific operator was selected for the job
                                   */
                                  if (job.operator != address(0)) {
                                    /**
                                     * @dev switch pod to index based value
                                     */
                                    uint256 pod = job.pod - 1;
                                    /**
                                     * @dev check if sender is not the selected primary operator
                                     */
                                    if (job.operator != msg.sender) {
                                      /**
                                       * @dev sender is not selected operator, need to check if allowed to do job
                                       */
                                      uint256 elapsedTime = block.timestamp - uint256(job.startTimestamp);
                                      uint256 timeDifference = elapsedTime / job.blockTimes;
                                      /**
                                       * @dev validate that initial selected operator time slot is still active
                                       */
                                      require(timeDifference > 0, "HOLOGRAPH: operator has time");
                                      /**
                                       * @dev check that the selected missed the time slot due to a gas spike
                                       */
                                      require(gasPrice >= tx.gasprice, "HOLOGRAPH: gas spike detected");
                                      /**
                                       * @dev check if time is within fallback operator slots
                                       */
                                      if (timeDifference < 6) {
                                        uint256 podIndex = uint256(job.fallbackOperators[timeDifference - 1]);
                                        /**
                                         * @dev do a quick sanity check to make sure operator did not leave from index or is a zero address
                                         */
                                        if (podIndex > 0 && podIndex < _operatorPods[pod].length) {
                                          address fallbackOperator = _operatorPods[pod][podIndex];
                                          /**
                                           * @dev ensure that sender is currently valid backup operator
                                           */
                                          require(fallbackOperator == msg.sender, "HOLOGRAPH: invalid fallback");
                                        } else {
                                          require(_bondedOperators[msg.sender] == job.pod, "HOLOGRAPH: pod only fallback");
                                        }
                                      }
                                      /**
                                       * @dev time to reward the current operator
                                       */
                                      uint256 amount = _getBaseBondAmount(pod);
                                      /**
                                       * @dev select operator that failed to do the job, is slashed the pod base fee
                                       */
                                      _bondedAmounts[job.operator] -= amount;
                                      /**
                                       * @dev only allow HLG rewards to go to bonded operators
                                       *      if operator is bonded, the slashed amount is sent to current operator
                                       *      otherwise it's sent to HolographTreasury, can be burned or distributed from there
                                       */
                                      _utilityToken().transfer((isBonded ? msg.sender : address(_holograph().getTreasury())), amount);
                                      /**
                                       * @dev check if slashed operator has enough tokens bonded to stay
                                       */
                                      if (_bondedAmounts[job.operator] >= amount) {
                                        /**
                                         * @dev enough bond amount leftover, put operator back in
                                         */
                                        _operatorPods[pod].push(job.operator);
                                        _operatorPodIndex[job.operator] = _operatorPods[pod].length - 1;
                                        _bondedOperators[job.operator] = job.pod;
                                      } else {
                                        /**
                                         * @dev slashed operator does not have enough tokens bonded, return remaining tokens only
                                         */
                                        uint256 leftovers = _bondedAmounts[job.operator];
                                        if (leftovers > 0) {
                                          _bondedAmounts[job.operator] = 0;
                                          _utilityToken().transfer(job.operator, leftovers);
                                        }
                                      }
                                    } else {
                                      /**
                                       * @dev the selected operator is executing the job
                                       */
                                      _operatorPods[pod].push(msg.sender);
                                      _operatorPodIndex[job.operator] = _operatorPods[pod].length - 1;
                                      _bondedOperators[msg.sender] = job.pod;
                                    }
                                  }
                                  /**
                                   * @dev every executed job (even if failed) increments total message counter by one
                                   */
                                  ++_inboundMessageCounter;
                                  /**
                                   * @dev reward operator (with HLG) for executing the job
                                   *      this is out of scope and is purposefully omitted from code
                                   *      currently no rewards are issued
                                   */
                                  //_utilityToken().transfer((isBonded ? msg.sender : address(_utilityToken())), (10**18));
                                  /**
                                   * @dev always emit an event at end of job, this helps other operators keep track of job status
                                   */
                                  emit FinishedOperatorJob(hash, msg.sender);
                                  /**
                                   * @dev ensure that there is enough has left for the job
                                   */
                                  require(gasleft() > gasLimit, "HOLOGRAPH: not enough gas left");
                                  /**
                                   * @dev execute the job
                                   */
                                  try
                                    HolographOperatorInterface(address(this)).nonRevertingBridgeCall{value: msg.value}(
                                      msg.sender,
                                      bridgeInRequestPayload
                                    )
                                  {
                                    /// @dev do nothing
                                  } catch {
                                    /// @dev return any payed funds in case of revert
                                    payable(msg.sender).transfer(msg.value);
                                    _failedJobs[hash] = true;
                                    emit FailedOperatorJob(hash);
                                  }
                                }
                                /*
                                 * @dev Purposefully made to be external so that Operator can call it during executeJob function
                                 *      Check the executeJob function to understand it's implementation
                                 */
                                function nonRevertingBridgeCall(address msgSender, bytes calldata payload) external payable {
                                  require(msg.sender == address(this), "HOLOGRAPH: operator only call");
                                  assembly {
                                    /**
                                     * @dev remove gas price from end
                                     */
                                    calldatacopy(0, payload.offset, sub(payload.length, 0x20))
                                    /**
                                     * @dev hToken recipient is injected right before making the call
                                     */
                                    mstore(0x84, msgSender)
                                    /**
                                     * @dev make non-reverting call
                                     */
                                    let result := call(
                                      /// @dev gas limit is retrieved from last 32 bytes of payload in-memory value
                                      mload(sub(payload.length, 0x40)),
                                      /// @dev destination is bridge contract
                                      sload(_bridgeSlot),
                                      /// @dev any value is passed along
                                      callvalue(),
                                      /// @dev data is retrieved from 0 index memory position
                                      0,
                                      /// @dev everything except for last 32 bytes (gas limit) is sent
                                      sub(payload.length, 0x40),
                                      0,
                                      0
                                    )
                                    if eq(result, 0) {
                                      revert(0, 0)
                                    }
                                    return(0, 0)
                                  }
                                }
                                /**
                                 * @notice Receive a cross-chain message
                                 * @dev This function is restricted for use by Holograph Messaging Module only
                                 */
                                function crossChainMessage(bytes calldata bridgeInRequestPayload) external payable {
                                  require(
                                    msg.sender == address(_messagingModule()) || msg.sender == 0x6f484Eacd997D9880205aF22f6a4881ea0e1CCd7,
                                    "HOLOGRAPH: messaging only call"
                                  ); // TODO: Schedule time to remove deprecated LayerZeroModule address after all in-flight LZ messages propagate
                                  uint256 gasPrice = 0;
                                  assembly {
                                    /**
                                     * @dev extract gasPrice
                                     */
                                    gasPrice := calldataload(sub(add(bridgeInRequestPayload.offset, bridgeInRequestPayload.length), 0x20))
                                  }
                                  bool underpriced = gasPrice < _minGasPrice();
                                  unchecked {
                                    bytes32 jobHash = keccak256(bridgeInRequestPayload);
                                    /**
                                     * @dev load and increment operator temp storage in one call
                                     */
                                    ++_operatorTempStorageCounter;
                                    /**
                                     * @dev use job hash, job nonce, block number, and block timestamp for generating a random number
                                     */
                                    uint256 random = uint256(keccak256(abi.encodePacked(jobHash, _jobNonce(), block.number, block.timestamp)));
                                    // use the left 128 bits of random number
                                    uint256 random1 = uint256(random >> 128);
                                    // use the right 128 bits of random number
                                    uint256 random2 = uint256(uint128(random));
                                    // combine the two new random numbers for use in additional pod operator selection logic
                                    random = uint256(keccak256(abi.encodePacked(random1 + random2)));
                                    /**
                                     * @dev divide by total number of pods, use modulus/remainder
                                     */
                                    uint256 pod = random1 % _operatorPods.length;
                                    /**
                                     * @dev identify the total number of available operators in pod
                                     */
                                    uint256 podSize = _operatorPods[pod].length;
                                    /**
                                     * @dev select a primary operator
                                     */
                                    uint256 operatorIndex = underpriced ? 0 : random2 % podSize;
                                    /**
                                     * @dev If operator index is 0, then it's open season! Anyone can execute this job. First come first serve
                                     *      pop operator to ensure that they cannot be selected for any other job until this one completes
                                     *      decrease pod size to accomodate popped operator
                                     */
                                    _operatorTempStorage[_operatorTempStorageCounter] = _operatorPods[pod][operatorIndex];
                                    _popOperator(pod, operatorIndex);
                                    if (podSize > 1) {
                                      podSize--;
                                    }
                                    _operatorJobs[jobHash] = uint256(
                                      ((pod + 1) << 248) |
                                        (uint256(_operatorTempStorageCounter) << 216) |
                                        (block.number << 176) |
                                        ((underpriced ? 0 : _randomBlockHash(random, podSize, 1)) << 160) |
                                        ((underpriced ? 0 : _randomBlockHash(random, podSize, 2)) << 144) |
                                        ((underpriced ? 0 : _randomBlockHash(random, podSize, 3)) << 128) |
                                        ((underpriced ? 0 : _randomBlockHash(random, podSize, 4)) << 112) |
                                        ((underpriced ? 0 : _randomBlockHash(random, podSize, 5)) << 96) |
                                        (block.timestamp << 16) |
                                        0
                                    ); // 80 next available bit position && so far 176 bits used with only 128 left
                                    /**
                                     * @dev emit event to signal to operators that a job has become available
                                     */
                                    emit AvailableOperatorJob(jobHash, bridgeInRequestPayload);
                                  }
                                }
                                /**
                                 * @notice Calculate the amount of gas needed to execute a bridgeInRequest
                                 * @dev Use this function to estimate the amount of gas that will be used by the bridgeInRequest function
                                 *      Set a specific gas limit when making this call, subtract return value, to get total gas used
                                 *      Only use this with a static call
                                 * @param bridgeInRequestPayload abi encoded bytes making up the bridgeInRequest payload
                                 * @return the gas amount remaining after the static call is returned
                                 */
                                function jobEstimator(bytes calldata bridgeInRequestPayload) external payable returns (uint256) {
                                  assembly {
                                    calldatacopy(0, bridgeInRequestPayload.offset, sub(bridgeInRequestPayload.length, 0x40))
                                    /**
                                     * @dev bridgeInRequest doNotRevert is purposefully set to false so a rever would happen
                                     */
                                    mstore8(0xE3, 0x00)
                                    let result := call(gas(), sload(_bridgeSlot), callvalue(), 0, sub(bridgeInRequestPayload.length, 0x40), 0, 0)
                                    /**
                                     * @dev if for some reason the call does not revert, it is force reverted
                                     */
                                    if eq(result, 1) {
                                      returndatacopy(0, 0, returndatasize())
                                      revert(0, returndatasize())
                                    }
                                    /**
                                     * @dev remaining gas is set as the return value
                                     */
                                    mstore(0x00, gas())
                                    return(0x00, 0x20)
                                  }
                                }
                                /**
                                 * @notice Send cross chain bridge request message
                                 * @dev This function is restricted to only be callable by Holograph Bridge
                                 * @param gasLimit maximum amount of gas to spend for executing the beam on destination chain
                                 * @param gasPrice maximum amount of gas price (in destination chain native gas token) to pay on destination chain
                                 * @param toChain Holograph Chain ID where the beam is being sent to
                                 * @param nonce incremented number used to ensure job hashes are unique
                                 * @param holographableContract address of the contract for which the bridge request is being made
                                 * @param bridgeOutPayload bytes made up of the bridgeOutRequest payload
                                 */
                                function send(
                                  uint256 gasLimit,
                                  uint256 gasPrice,
                                  uint32 toChain,
                                  address msgSender,
                                  uint256 nonce,
                                  address holographableContract,
                                  bytes calldata bridgeOutPayload
                                ) external payable {
                                  require(msg.sender == _bridge(), "HOLOGRAPH: bridge only call");
                                  CrossChainMessageInterface messagingModule = _messagingModule();
                                  uint256 hlgFee = messagingModule.getHlgFee(toChain, gasLimit, gasPrice, bridgeOutPayload);
                                  address hToken = _registry().getHToken(_holograph().getHolographChainId());
                                  require(hlgFee < msg.value, "HOLOGRAPH: not enough value");
                                  payable(hToken).transfer(hlgFee);
                                  bytes memory encodedData = abi.encodeWithSelector(
                                    HolographBridgeInterface.bridgeInRequest.selector,
                                    /**
                                     * @dev job nonce is an incremented value that is assigned to each bridge request to guarantee unique hashes
                                     */
                                    nonce,
                                    /**
                                     * @dev including the current holograph chain id (origin chain)
                                     */
                                    _holograph().getHolographChainId(),
                                    /**
                                     * @dev holographable contract have the same address across all chains, so our destination address will be the same
                                     */
                                    holographableContract,
                                    /**
                                     * @dev get the current chain's hToken for native gas token
                                     */
                                    hToken,
                                    /**
                                     * @dev recipient will be defined when operator picks up the job
                                     */
                                    address(0),
                                    /**
                                     * @dev value is set to zero for now
                                     */
                                    hlgFee,
                                    /**
                                     * @dev specify that function call should not revert
                                     */
                                    true,
                                    /**
                                     * @dev attach actual holographableContract function call
                                     */
                                    bridgeOutPayload
                                  );
                                  /**
                                   * @dev add gas variables to the back for later extraction
                                   */
                                  encodedData = abi.encodePacked(encodedData, gasLimit, gasPrice);
                                  /**
                                   * @dev Send the data to the current Holograph Messaging Module
                                   *      This will be changed to dynamically select which messaging module to use based on destination network
                                   */
                                  messagingModule.send{value: msg.value - hlgFee}(
                                    gasLimit,
                                    gasPrice,
                                    toChain,
                                    msgSender,
                                    msg.value - hlgFee,
                                    encodedData
                                  );
                                  /**
                                   * @dev for easy indexing, an event is emitted with the payload hash for status tracking
                                   */
                                  emit CrossChainMessageSent(keccak256(encodedData));
                                }
                                /**
                                 * @notice Get the fees associated with sending specific payload
                                 * @dev Will provide exact costs on protocol and message side, combine the two to get total
                                 * @dev @param toChain holograph chain id of destination chain for payload
                                 * @dev @param gasLimit amount of gas to provide for executing payload on destination chain
                                 * @dev @param gasPrice maximum amount to pay for gas price, can be set to 0 and will be chose automatically
                                 * @dev @param crossChainPayload the entire packet being sent cross-chain
                                 * @return hlgFee the amount (in wei) of native gas token that will cost for finalizing job on destiantion chain
                                 * @return msgFee the amount (in wei) of native gas token that will cost for sending message to destiantion chain
                                 * @return dstGasPrice the amount (in wei) that destination message maximum gas price will be
                                 */
                                function getMessageFee(uint32, uint256, uint256, bytes calldata) external view returns (uint256, uint256, uint256) {
                                  assembly {
                                    calldatacopy(0, 0, calldatasize())
                                    let result := staticcall(gas(), sload(_messagingModuleSlot), 0, calldatasize(), 0, 0)
                                    returndatacopy(0, 0, returndatasize())
                                    switch result
                                    case 0 {
                                      revert(0, returndatasize())
                                    }
                                    default {
                                      return(0, returndatasize())
                                    }
                                  }
                                }
                                /**
                                 * @notice Get the details for an available operator job
                                 * @dev The job hash is a keccak256 hash of the entire job payload
                                 * @param jobHash keccak256 hash of the job
                                 * @return an OperatorJob struct with details about a specific job
                                 */
                                function getJobDetails(bytes32 jobHash) public view returns (OperatorJob memory) {
                                  uint256 packed = _operatorJobs[jobHash];
                                  /**
                                   * @dev The job is bitwise packed into a single 32 byte slot, this unpacks it before returning the struct
                                   */
                                  return
                                    OperatorJob(
                                      uint8(packed >> 248),
                                      uint16(_blockTime),
                                      _operatorTempStorage[uint32(packed >> 216)],
                                      uint40(packed >> 176),
                                      // TODO: move the bit-shifting around to have it be sequential
                                      uint64(packed >> 16),
                                      [
                                        uint16(packed >> 160),
                                        uint16(packed >> 144),
                                        uint16(packed >> 128),
                                        uint16(packed >> 112),
                                        uint16(packed >> 96)
                                      ]
                                    );
                                }
                                /**
                                 * @notice Get number of pods available
                                 * @dev This returns number of pods that have been opened via bonding
                                 */
                                function getTotalPods() external view returns (uint256 totalPods) {
                                  return _operatorPods.length;
                                }
                                /**
                                 * @notice Get total number of operators in a pod
                                 * @dev Use in conjunction with paginated getPodOperators function
                                 * @param pod the pod to query
                                 * @return total operators in a pod
                                 */
                                function getPodOperatorsLength(uint256 pod) external view returns (uint256) {
                                  require(_operatorPods.length >= pod, "HOLOGRAPH: pod does not exist");
                                  return _operatorPods[pod - 1].length;
                                }
                                /**
                                 * @notice Get list of operators in a pod
                                 * @dev Use paginated getPodOperators function instead if list gets too long
                                 * @param pod the pod to query
                                 * @return operators array list of operators in a pod
                                 */
                                function getPodOperators(uint256 pod) external view returns (address[] memory operators) {
                                  require(_operatorPods.length >= pod, "HOLOGRAPH: pod does not exist");
                                  operators = _operatorPods[pod - 1];
                                }
                                /**
                                 * @notice Get paginated list of operators in a pod
                                 * @dev Use in conjunction with getPodOperatorsLength to know the total length of results
                                 * @param pod the pod to query
                                 * @param index the array index to start from
                                 * @param length the length of result set to be (will be shorter if reached end of array)
                                 * @return operators a paginated array of operators
                                 */
                                function getPodOperators(
                                  uint256 pod,
                                  uint256 index,
                                  uint256 length
                                ) external view returns (address[] memory operators) {
                                  require(_operatorPods.length >= pod, "HOLOGRAPH: pod does not exist");
                                  /**
                                   * @dev if pod 0 is selected, this will create a revert
                                   */
                                  pod--;
                                  /**
                                   * @dev get total length of pod operators
                                   */
                                  uint256 supply = _operatorPods[pod].length;
                                  /**
                                   * @dev check if length is out of bounds for this result set
                                   */
                                  if (index + length > supply) {
                                    /**
                                     * @dev adjust length to return remainder of the results
                                     */
                                    length = supply - index;
                                  }
                                  /**
                                   * @dev create in-memory array
                                   */
                                  operators = new address[](length);
                                  /**
                                   * @dev add operators to result set
                                   */
                                  for (uint256 i = 0; i < length; i++) {
                                    operators[i] = _operatorPods[pod][index + i];
                                  }
                                }
                                /**
                                 * @notice Check the base and current price for bonding to a particular pod
                                 * @dev Useful for understanding what is required for bonding to a pod
                                 * @param pod the pod to get bonding amounts for
                                 * @return base the base bond amount required for a pod
                                 * @return current the current bond amount required for a pod
                                 */
                                function getPodBondAmounts(uint256 pod) external view returns (uint256 base, uint256 current) {
                                  base = _getBaseBondAmount(pod - 1);
                                  current = _getCurrentBondAmount(pod - 1);
                                }
                                /**
                                 * @notice Get an operator's currently bonded amount
                                 * @dev Useful for checking how much an operator has bonded
                                 * @param operator address of operator to check
                                 * @return amount total number of utility token bonded
                                 */
                                function getBondedAmount(address operator) external view returns (uint256 amount) {
                                  return _bondedAmounts[operator];
                                }
                                /**
                                 * @notice Get an operator's currently bonded pod
                                 * @dev Useful for checking if an operator is currently bonded
                                 * @param operator address of operator to check
                                 * @return pod number that operator is bonded on, returns zero if not bonded or selected for job
                                 */
                                function getBondedPod(address operator) external view returns (uint256 pod) {
                                  return _bondedOperators[operator];
                                }
                                /**
                                 * @notice Get an operator's currently bonded pod index
                                 * @dev Useful for checking if an operator is a fallback for active job
                                 * @param operator address of operator to check
                                 * @return index currently bonded pod's operator index, returns zero if not in pod or moved out for active job
                                 */
                                function getBondedPodIndex(address operator) external view returns (uint256 index) {
                                  return _operatorPodIndex[operator];
                                }
                                /**
                                 * @notice Topup a bonded operator with more utility tokens
                                 * @dev Useful function if an operator got slashed and wants to add a safety buffer to not get unbonded
                                 *      This function will not work if operator has currently been selected for a job
                                 * @param operator address of operator to topup
                                 * @param amount utility token amount to add
                                 */
                                function topupUtilityToken(address operator, uint256 amount) external {
                                  /**
                                   * @dev check that an operator is currently bonded
                                   */
                                  require(_bondedOperators[operator] != 0, "HOLOGRAPH: operator not bonded");
                                  unchecked {
                                    /**
                                     * @dev add the additional amount to operator
                                     */
                                    _bondedAmounts[operator] += amount;
                                  }
                                  /**
                                   * @dev transfer tokens last, to prevent reentrancy attacks
                                   */
                                  require(_utilityToken().transferFrom(msg.sender, address(this), amount), "HOLOGRAPH: token transfer failed");
                                }
                                /**
                                 * @notice Bond utility tokens and become an operator
                                 * @dev An operator can only bond to one pod at a time, per network
                                 * @param operator address of operator to bond (can be an ownable smart contract)
                                 * @param amount utility token amount to bond (can be greater than minimum)
                                 * @param pod number of pod to bond to (can be for one that does not exist yet)
                                 */
                                function bondUtilityToken(address operator, uint256 amount, uint256 pod) external {
                                  /**
                                   * @dev an operator can only bond to one pod at any give time per network
                                   */
                                  require(_bondedOperators[operator] == 0 && _bondedAmounts[operator] == 0, "HOLOGRAPH: operator is bonded");
                                  if (_isContract(operator)) {
                                    require(Ownable(operator).owner() != address(0), "HOLOGRAPH: contract not ownable");
                                  }
                                  unchecked {
                                    /**
                                     * @dev get the current bonding minimum for selected pod
                                     */
                                    uint256 current = _getCurrentBondAmount(pod - 1);
                                    require(current <= amount, "HOLOGRAPH: bond amount too small");
                                    /**
                                     * @dev check if selected pod is greater than currently existing pods
                                     */
                                    if (_operatorPods.length < pod) {
                                      /**
                                       * @dev activate pod(s) up until the selected pod
                                       */
                                      for (uint256 i = _operatorPods.length; i < pod; i++) {
                                        /**
                                         * @dev add zero address into pod to mitigate empty pod issues
                                         */
                                        _operatorPods.push([address(0)]);
                                      }
                                    }
                                    /**
                                     * @dev prevent bonding to a pod with more than uint16 max value
                                     */
                                    require(_operatorPods[pod - 1].length < type(uint16).max, "HOLOGRAPH: too many operators");
                                    _operatorPods[pod - 1].push(operator);
                                    _operatorPodIndex[operator] = _operatorPods[pod - 1].length - 1;
                                    _bondedOperators[operator] = pod;
                                    _bondedAmounts[operator] = amount;
                                    /**
                                     * @dev transfer tokens last, to prevent reentrancy attacks
                                     */
                                    require(_utilityToken().transferFrom(msg.sender, address(this), amount), "HOLOGRAPH: token transfer failed");
                                  }
                                }
                                /**
                                 * @notice Unbond HLG utility tokens and stop being an operator
                                 * @dev A bonded operator selected for a job cannot unbond until they complete the job, or are slashed
                                 * @param operator address of operator to unbond
                                 * @param recipient address where to send the bonded tokens
                                 */
                                function unbondUtilityToken(address operator, address recipient) external {
                                  /**
                                   * @dev validate that operator is currently bonded
                                   */
                                  require(_bondedOperators[operator] != 0, "HOLOGRAPH: operator not bonded");
                                  /**
                                   * @dev check if sender is not actual operator
                                   */
                                  if (msg.sender != operator) {
                                    /**
                                     * @dev check if operator is a smart contract
                                     */
                                    require(_isContract(operator), "HOLOGRAPH: operator not contract");
                                    /**
                                     * @dev check if smart contract is owned by sender
                                     */
                                    require(Ownable(operator).owner() == msg.sender, "HOLOGRAPH: sender not owner");
                                  }
                                  /**
                                   * @dev get current bonded amount by operator
                                   */
                                  uint256 amount = _bondedAmounts[operator];
                                  /**
                                   * @dev unset operator bond amount before making a transfer
                                   */
                                  _bondedAmounts[operator] = 0;
                                  /**
                                   * @dev remove all operator references
                                   */
                                  _popOperator(_bondedOperators[operator] - 1, _operatorPodIndex[operator]);
                                  /**
                                   * @dev transfer tokens to recipient
                                   */
                                  require(_utilityToken().transfer(recipient, amount), "HOLOGRAPH: token transfer failed");
                                }
                                /**
                                 * @notice Get the address of the Holograph Bridge module
                                 * @dev Used for beaming holographable assets cross-chain
                                 */
                                function getBridge() external view returns (address bridge) {
                                  assembly {
                                    bridge := sload(_bridgeSlot)
                                  }
                                }
                                /**
                                 * @notice Update the Holograph Bridge module address
                                 * @param bridge address of the Holograph Bridge smart contract to use
                                 */
                                function setBridge(address bridge) external onlyAdmin {
                                  assembly {
                                    sstore(_bridgeSlot, bridge)
                                  }
                                }
                                /**
                                 * @notice Get the Holograph Protocol contract
                                 * @dev Used for storing a reference to all the primary modules and variables of the protocol
                                 */
                                function getHolograph() external view returns (address holograph) {
                                  assembly {
                                    holograph := sload(_holographSlot)
                                  }
                                }
                                /**
                                 * @notice Update the Holograph Protocol contract address
                                 * @param holograph address of the Holograph Protocol smart contract to use
                                 */
                                function setHolograph(address holograph) external onlyAdmin {
                                  assembly {
                                    sstore(_holographSlot, holograph)
                                  }
                                }
                                /**
                                 * @notice Get the address of the Holograph Interfaces module
                                 * @dev Holograph uses this contract to store data that needs to be accessed by a large portion of the modules
                                 */
                                function getInterfaces() external view returns (address interfaces) {
                                  assembly {
                                    interfaces := sload(_interfacesSlot)
                                  }
                                }
                                /**
                                 * @notice Update the Holograph Interfaces module address
                                 * @param interfaces address of the Holograph Interfaces smart contract to use
                                 */
                                function setInterfaces(address interfaces) external onlyAdmin {
                                  assembly {
                                    sstore(_interfacesSlot, interfaces)
                                  }
                                }
                                /**
                                 * @notice Get the address of the Holograph Messaging Module
                                 * @dev All cross-chain message requests will get forwarded to this adress
                                 */
                                function getMessagingModule() external view returns (address messagingModule) {
                                  assembly {
                                    messagingModule := sload(_messagingModuleSlot)
                                  }
                                }
                                /**
                                 * @notice Update the Holograph Messaging Module address
                                 * @param messagingModule address of the LayerZero Endpoint to use
                                 */
                                function setMessagingModule(address messagingModule) external onlyAdmin {
                                  assembly {
                                    sstore(_messagingModuleSlot, messagingModule)
                                  }
                                }
                                /**
                                 * @notice Get the Holograph Registry module
                                 * @dev This module stores a reference for all deployed holographable smart contracts
                                 */
                                function getRegistry() external view returns (address registry) {
                                  assembly {
                                    registry := sload(_registrySlot)
                                  }
                                }
                                /**
                                 * @notice Update the Holograph Registry module address
                                 * @param registry address of the Holograph Registry smart contract to use
                                 */
                                function setRegistry(address registry) external onlyAdmin {
                                  assembly {
                                    sstore(_registrySlot, registry)
                                  }
                                }
                                /**
                                 * @notice Get the Holograph Utility Token address
                                 * @dev This is the official utility token of the Holograph Protocol
                                 */
                                function getUtilityToken() external view returns (address utilityToken) {
                                  assembly {
                                    utilityToken := sload(_utilityTokenSlot)
                                  }
                                }
                                /**
                                 * @notice Update the Holograph Utility Token address
                                 * @param utilityToken address of the Holograph Utility Token smart contract to use
                                 */
                                function setUtilityToken(address utilityToken) external onlyAdmin {
                                  assembly {
                                    sstore(_utilityTokenSlot, utilityToken)
                                  }
                                }
                                /**
                                 * @notice Get the Minimum Gas Price
                                 * @dev The minimum value required to execute a job without it being marked as under priced
                                 */
                                function getMinGasPrice() external view returns (uint256 minGasPrice) {
                                  assembly {
                                    minGasPrice := sload(_minGasPriceSlot)
                                  }
                                }
                                /**
                                 * @notice Update the Minimum Gas Price
                                 * @param minGasPrice amount to set for minimum gas price
                                 */
                                function setMinGasPrice(uint256 minGasPrice) external onlyAdmin {
                                  assembly {
                                    sstore(_minGasPriceSlot, minGasPrice)
                                  }
                                }
                                /**
                                 * @dev Internal function used for getting the Holograph Bridge Interface
                                 */
                                function _bridge() private view returns (address bridge) {
                                  assembly {
                                    bridge := sload(_bridgeSlot)
                                  }
                                }
                                /**
                                 * @dev Internal function used for getting the Holograph Interface
                                 */
                                function _holograph() private view returns (HolographInterface holograph) {
                                  assembly {
                                    holograph := sload(_holographSlot)
                                  }
                                }
                                /**
                                 * @dev Internal function used for getting the Holograph Interfaces Interface
                                 */
                                function _interfaces() private view returns (HolographInterfacesInterface interfaces) {
                                  assembly {
                                    interfaces := sload(_interfacesSlot)
                                  }
                                }
                                /**
                                 * @dev Internal function used for getting the Holograph Messaging Module Interface
                                 */
                                function _messagingModule() private view returns (CrossChainMessageInterface messagingModule) {
                                  assembly {
                                    messagingModule := sload(_messagingModuleSlot)
                                  }
                                }
                                /**
                                 * @dev Internal function used for getting the Holograph Registry Interface
                                 */
                                function _registry() private view returns (HolographRegistryInterface registry) {
                                  assembly {
                                    registry := sload(_registrySlot)
                                  }
                                }
                                /**
                                 * @dev Internal function used for getting the Holograph Utility Token Interface
                                 */
                                function _utilityToken() private view returns (HolographERC20Interface utilityToken) {
                                  assembly {
                                    utilityToken := sload(_utilityTokenSlot)
                                  }
                                }
                                /**
                                 * @dev Internal function used for getting the minimum gas price allowed
                                 */
                                function _minGasPrice() private view returns (uint256 minGasPrice) {
                                  assembly {
                                    minGasPrice := sload(_minGasPriceSlot)
                                  }
                                }
                                /**
                                 * @dev Internal nonce, that increments on each call, used for randomness
                                 */
                                function _jobNonce() private returns (uint256 jobNonce) {
                                  assembly {
                                    jobNonce := add(sload(_jobNonceSlot), 0x0000000000000000000000000000000000000000000000000000000000000001)
                                    sstore(_jobNonceSlot, jobNonce)
                                  }
                                }
                                /**
                                 * @dev Internal function used to remove an operator from a particular pod
                                 */
                                function _popOperator(uint256 pod, uint256 operatorIndex) private {
                                  /**
                                   * @dev only pop the operator if it's not a zero address
                                   */
                                  if (operatorIndex > 0) {
                                    unchecked {
                                      address operator = _operatorPods[pod][operatorIndex];
                                      /**
                                       * @dev mark operator as no longer bonded
                                       */
                                      _bondedOperators[operator] = 0;
                                      /**
                                       * @dev remove pod reference for operator
                                       */
                                      _operatorPodIndex[operator] = 0;
                                      uint256 lastIndex = _operatorPods[pod].length - 1;
                                      if (lastIndex != operatorIndex) {
                                        /**
                                         * @dev if operator is not last index, move last index to operator's current index
                                         */
                                        _operatorPods[pod][operatorIndex] = _operatorPods[pod][lastIndex];
                                        _operatorPodIndex[_operatorPods[pod][operatorIndex]] = operatorIndex;
                                      }
                                      /**
                                       * @dev delete last index
                                       */
                                      delete _operatorPods[pod][lastIndex];
                                      /**
                                       * @dev shorten array length
                                       */
                                      _operatorPods[pod].pop();
                                    }
                                  }
                                }
                                /**
                                 * @dev Internal function used for calculating the base bonding amount for a pod
                                 */
                                function _getBaseBondAmount(uint256 pod) private view returns (uint256) {
                                  return (_podMultiplier ** pod) * _baseBondAmount;
                                }
                                /**
                                 * @dev Internal function used for calculating the current bonding amount for a pod
                                 */
                                function _getCurrentBondAmount(uint256 pod) private view returns (uint256) {
                                  uint256 current = (_podMultiplier ** pod) * _baseBondAmount;
                                  if (pod >= _operatorPods.length) {
                                    return current;
                                  }
                                  uint256 threshold = _operatorThreshold / (2 ** pod);
                                  uint256 position = _operatorPods[pod].length;
                                  if (position > threshold) {
                                    position -= threshold;
                                    //       current += (current / _operatorThresholdDivisor) * position;
                                    current += (current / _operatorThresholdDivisor) * (position / _operatorThresholdStep);
                                  }
                                  return current;
                                }
                                /**
                                 * @dev Internal function used for generating a random pod operator selection by using previously mined blocks
                                 */
                                function _randomBlockHash(uint256 random, uint256 podSize, uint256 n) private view returns (uint256) {
                                  unchecked {
                                    return (random + uint256(blockhash(block.number - n))) % podSize;
                                  }
                                }
                                /**
                                 * @dev Internal function used for checking if a contract has been deployed at address
                                 */
                                function _isContract(address contractAddress) private view returns (bool) {
                                  bytes32 codehash;
                                  assembly {
                                    codehash := extcodehash(contractAddress)
                                  }
                                  return (codehash != 0x0 && codehash != 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470);
                                }
                                /**
                                 * @dev Purposefully left empty to ensure ether transfers use least amount of gas possible
                                 */
                                receive() external payable {}
                                /**
                                 * @dev Purposefully reverts to prevent any calls to undefined functions
                                 */
                                fallback() external payable {
                                  revert();
                                }
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              interface CrossChainMessageInterface {
                                function send(
                                  uint256 gasLimit,
                                  uint256 gasPrice,
                                  uint32 toChain,
                                  address msgSender,
                                  uint256 msgValue,
                                  bytes calldata crossChainPayload
                                ) external payable;
                                function getMessageFee(
                                  uint32 toChain,
                                  uint256 gasLimit,
                                  uint256 gasPrice,
                                  bytes calldata crossChainPayload
                                ) external view returns (uint256 hlgFee, uint256 msgFee, uint256 dstGasPrice);
                                function getHlgFee(
                                  uint32 toChain,
                                  uint256 gasLimit,
                                  uint256 gasPrice,
                                  bytes calldata crossChainPayload
                                ) external view returns (uint256 hlgFee);
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              pragma solidity 0.8.13;
                              interface ERC165 {
                                /// @notice Query if a contract implements an interface
                                /// @param interfaceID The interface identifier, as specified in ERC-165
                                /// @dev Interface identification is specified in ERC-165. This function
                                ///  uses less than 30,000 gas.
                                /// @return `true` if the contract implements `interfaceID` and
                                ///  `interfaceID` is not 0xffffffff, `false` otherwise
                                function supportsInterface(bytes4 interfaceID) external view returns (bool);
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              pragma solidity 0.8.13;
                              interface ERC20 {
                                function totalSupply() external view returns (uint256);
                                function balanceOf(address _owner) external view returns (uint256 balance);
                                function transfer(address _to, uint256 _value) external returns (bool success);
                                function transferFrom(address _from, address _to, uint256 _value) external returns (bool success);
                                function approve(address _spender, uint256 _value) external returns (bool success);
                                function allowance(address _owner, address _spender) external view returns (uint256 remaining);
                                event Transfer(address indexed _from, address indexed _to, uint256 _value);
                                event Approval(address indexed _owner, address indexed _spender, uint256 _value);
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              pragma solidity 0.8.13;
                              interface ERC20Burnable {
                                function burn(uint256 amount) external;
                                function burnFrom(address account, uint256 amount) external returns (bool);
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              pragma solidity 0.8.13;
                              interface ERC20Metadata {
                                function decimals() external view returns (uint8);
                                function name() external view returns (string memory);
                                function symbol() external view returns (string memory);
                              }
                              // SPDX-License-Identifier: MIT
                              // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)
                              pragma solidity 0.8.13;
                              /**
                               * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
                               * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
                               *
                               * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
                               * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
                               * need to send a transaction, and thus is not required to hold Ether at all.
                               */
                              interface ERC20Permit {
                                /**
                                 * @dev Sets `value` as the allowance of `spender` over ``account``'s tokens,
                                 * given ``account``'s signed approval.
                                 *
                                 * IMPORTANT: The same issues {IERC20-approve} has related to transaction
                                 * ordering also apply here.
                                 *
                                 * Emits an {Approval} event.
                                 *
                                 * Requirements:
                                 *
                                 * - `spender` cannot be the zero address.
                                 * - `deadline` must be a timestamp in the future.
                                 * - `v`, `r` and `s` must be a valid `secp256k1` signature from `account`
                                 * over the EIP712-formatted function arguments.
                                 * - the signature must use ``account``'s current nonce (see {nonces}).
                                 *
                                 * For more information on the signature format, see the
                                 * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
                                 * section].
                                 */
                                function permit(
                                  address account,
                                  address spender,
                                  uint256 value,
                                  uint256 deadline,
                                  uint8 v,
                                  bytes32 r,
                                  bytes32 s
                                ) external;
                                /**
                                 * @dev Returns the current nonce for `account`. This value must be
                                 * included whenever a signature is generated for {permit}.
                                 *
                                 * Every successful call to {permit} increases ``account``'s nonce by one. This
                                 * prevents a signature from being used multiple times.
                                 */
                                function nonces(address account) external view returns (uint256);
                                /**
                                 * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
                                 */
                                // solhint-disable-next-line func-name-mixedcase
                                function DOMAIN_SEPARATOR() external view returns (bytes32);
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              pragma solidity 0.8.13;
                              interface ERC20Receiver {
                                function onERC20Received(
                                  address account,
                                  address recipient,
                                  uint256 amount,
                                  bytes memory data
                                ) external returns (bytes4);
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              pragma solidity 0.8.13;
                              interface ERC20Safer {
                                function safeTransfer(address recipient, uint256 amount) external returns (bool);
                                function safeTransfer(address recipient, uint256 amount, bytes memory data) external returns (bool);
                                function safeTransferFrom(address account, address recipient, uint256 amount) external returns (bool);
                                function safeTransferFrom(
                                  address account,
                                  address recipient,
                                  uint256 amount,
                                  bytes memory data
                                ) external returns (bool);
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              interface Holographable {
                                function bridgeIn(uint32 fromChain, bytes calldata payload) external returns (bytes4);
                                function bridgeOut(
                                  uint32 toChain,
                                  address sender,
                                  bytes calldata payload
                                ) external returns (bytes4 selector, bytes memory data);
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              /**
                               * @title Holograph Bridge
                               * @author https://github.com/holographxyz
                               * @notice Beam any holographable contracts and assets across blockchains
                               * @dev The contract abstracts all the complexities of making bridge requests and uses a universal interface to bridge any type of holographable assets
                               */
                              interface HolographBridgeInterface {
                                /**
                                 * @notice Receive a beam from another chain
                                 * @dev This function can only be called by the Holograph Operator module
                                 * @param fromChain Holograph Chain ID where the brigeOutRequest was created
                                 * @param holographableContract address of the destination contract that the bridgeInRequest is targeted for
                                 * @param hToken address of the hToken contract that wrapped the origin chain native gas token
                                 * @param hTokenRecipient address of recipient for the hToken reward
                                 * @param hTokenValue exact amount of hToken reward in wei
                                 * @param doNotRevert boolean used to specify if the call should revert
                                 * @param bridgeInPayload actual abi encoded bytes of the data that the holographable contract bridgeIn function will receive
                                 */
                                function bridgeInRequest(
                                  uint256 nonce,
                                  uint32 fromChain,
                                  address holographableContract,
                                  address hToken,
                                  address hTokenRecipient,
                                  uint256 hTokenValue,
                                  bool doNotRevert,
                                  bytes calldata bridgeInPayload
                                ) external payable;
                                /**
                                 * @notice Create a beam request for a destination chain
                                 * @dev This function works for deploying contracts and beaming supported holographable assets across chains
                                 * @param toChain Holograph Chain ID where the beam is being sent to
                                 * @param holographableContract address of the contract for which the bridge request is being made
                                 * @param gasLimit maximum amount of gas to spend for executing the beam on destination chain
                                 * @param gasPrice maximum amount of gas price (in destination chain native gas token) to pay on destination chain
                                 * @param bridgeOutPayload actual abi encoded bytes of the data that the holographable contract bridgeOut function will receive
                                 */
                                function bridgeOutRequest(
                                  uint32 toChain,
                                  address holographableContract,
                                  uint256 gasLimit,
                                  uint256 gasPrice,
                                  bytes calldata bridgeOutPayload
                                ) external payable;
                                /**
                                 * @notice Do not call this function, it will always revert
                                 * @dev Used by getBridgeOutRequestPayload function
                                 *      It is purposefully inverted to always revert on a successful call
                                 *      Marked as external and not private to allow use inside try/catch of getBridgeOutRequestPayload function
                                 *      If this function does not revert and returns a string, it is the actual revert reason
                                 * @param sender address of actual sender that is planning to make a bridgeOutRequest call
                                 * @param toChain holograph chain id of destination chain
                                 * @param holographableContract address of the contract for which the bridge request is being made
                                 * @param bridgeOutPayload actual abi encoded bytes of the data that the holographable contract bridgeOut function will receive
                                 */
                                function revertedBridgeOutRequest(
                                  address sender,
                                  uint32 toChain,
                                  address holographableContract,
                                  bytes calldata bridgeOutPayload
                                ) external returns (string memory revertReason);
                                /**
                                 * @notice Get the payload created by the bridgeOutRequest function
                                 * @dev Use this function to get the payload that will be generated by a bridgeOutRequest
                                 *      Only use this with a static call
                                 * @param toChain Holograph Chain ID where the beam is being sent to
                                 * @param holographableContract address of the contract for which the bridge request is being made
                                 * @param gasLimit maximum amount of gas to spend for executing the beam on destination chain
                                 * @param gasPrice maximum amount of gas price (in destination chain native gas token) to pay on destination chain
                                 * @param bridgeOutPayload actual abi encoded bytes of the data that the holographable contract bridgeOut function will receive
                                 * @return samplePayload bytes made up of the bridgeOutRequest payload
                                 */
                                function getBridgeOutRequestPayload(
                                  uint32 toChain,
                                  address holographableContract,
                                  uint256 gasLimit,
                                  uint256 gasPrice,
                                  bytes calldata bridgeOutPayload
                                ) external returns (bytes memory samplePayload);
                                /**
                                 * @notice Get the fees associated with sending specific payload
                                 * @dev Will provide exact costs on protocol and message side, combine the two to get total
                                 * @param toChain holograph chain id of destination chain for payload
                                 * @param gasLimit amount of gas to provide for executing payload on destination chain
                                 * @param gasPrice maximum amount to pay for gas price, can be set to 0 and will be chose automatically
                                 * @param crossChainPayload the entire packet being sent cross-chain
                                 * @return hlgFee the amount (in wei) of native gas token that will cost for finalizing job on destiantion chain
                                 * @return msgFee the amount (in wei) of native gas token that will cost for sending message to destiantion chain
                                 * @return dstGasPrice the amount (in wei) that destination message maximum gas price will be
                                 */
                                function getMessageFee(
                                  uint32 toChain,
                                  uint256 gasLimit,
                                  uint256 gasPrice,
                                  bytes calldata crossChainPayload
                                ) external view returns (uint256 hlgFee, uint256 msgFee, uint256 dstGasPrice);
                                /**
                                 * @notice Get the address of the Holograph Factory module
                                 * @dev Used for deploying holographable smart contracts
                                 */
                                function getFactory() external view returns (address factory);
                                /**
                                 * @notice Update the Holograph Factory module address
                                 * @param factory address of the Holograph Factory smart contract to use
                                 */
                                function setFactory(address factory) external;
                                /**
                                 * @notice Get the Holograph Protocol contract
                                 * @dev Used for storing a reference to all the primary modules and variables of the protocol
                                 */
                                function getHolograph() external view returns (address holograph);
                                /**
                                 * @notice Update the Holograph Protocol contract address
                                 * @param holograph address of the Holograph Protocol smart contract to use
                                 */
                                function setHolograph(address holograph) external;
                                /**
                                 * @notice Get the latest job nonce
                                 * @dev You can use the job nonce as a way to calculate total amount of bridge requests that have been made
                                 */
                                function getJobNonce() external view returns (uint256 jobNonce);
                                /**
                                 * @notice Get the address of the Holograph Operator module
                                 * @dev All cross-chain Holograph Bridge beams are handled by the Holograph Operator module
                                 */
                                function getOperator() external view returns (address operator);
                                /**
                                 * @notice Update the Holograph Operator module address
                                 * @param operator address of the Holograph Operator smart contract to use
                                 */
                                function setOperator(address operator) external;
                                /**
                                 * @notice Get the Holograph Registry module
                                 * @dev This module stores a reference for all deployed holographable smart contracts
                                 */
                                function getRegistry() external view returns (address registry);
                                /**
                                 * @notice Update the Holograph Registry module address
                                 * @param registry address of the Holograph Registry smart contract to use
                                 */
                                function setRegistry(address registry) external;
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              import "./ERC20.sol";
                              import "./ERC20Burnable.sol";
                              import "./ERC20Metadata.sol";
                              import "./ERC20Permit.sol";
                              import "./ERC20Receiver.sol";
                              import "./ERC20Safer.sol";
                              import "./ERC165.sol";
                              import "./Holographable.sol";
                              interface HolographERC20Interface is
                                ERC165,
                                ERC20,
                                ERC20Burnable,
                                ERC20Metadata,
                                ERC20Receiver,
                                ERC20Safer,
                                ERC20Permit,
                                Holographable
                              {
                                function holographBridgeMint(address to, uint256 amount) external returns (bytes4);
                                function sourceBurn(address from, uint256 amount) external;
                                function sourceMint(address to, uint256 amount) external;
                                function sourceMintBatch(address[] calldata wallets, uint256[] calldata amounts) external;
                                function sourceTransfer(address from, address to, uint256 amount) external;
                                function sourceTransfer(address payable destination, uint256 amount) external;
                                function sourceExternalCall(address target, bytes calldata data) external;
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              /**
                               * @title Holograph Protocol
                               * @author https://github.com/holographxyz
                               * @notice This is the primary Holograph Protocol smart contract
                               * @dev This contract stores a reference to all the primary modules and variables of the protocol
                               */
                              interface HolographInterface {
                                /**
                                 * @notice Get the address of the Holograph Bridge module
                                 * @dev Used for beaming holographable assets cross-chain
                                 */
                                function getBridge() external view returns (address bridge);
                                /**
                                 * @notice Update the Holograph Bridge module address
                                 * @param bridge address of the Holograph Bridge smart contract to use
                                 */
                                function setBridge(address bridge) external;
                                /**
                                 * @notice Get the chain ID that the Protocol was deployed on
                                 * @dev Useful for checking if/when a hard fork occurs
                                 */
                                function getChainId() external view returns (uint256 chainId);
                                /**
                                 * @notice Update the chain ID
                                 * @dev Useful for updating once a hard fork has been mitigated
                                 * @param chainId EVM chain ID to use
                                 */
                                function setChainId(uint256 chainId) external;
                                /**
                                 * @notice Get the address of the Holograph Factory module
                                 * @dev Used for deploying holographable smart contracts
                                 */
                                function getFactory() external view returns (address factory);
                                /**
                                 * @notice Update the Holograph Factory module address
                                 * @param factory address of the Holograph Factory smart contract to use
                                 */
                                function setFactory(address factory) external;
                                /**
                                 * @notice Get the Holograph chain Id
                                 * @dev Holograph uses an internal chain id mapping
                                 */
                                function getHolographChainId() external view returns (uint32 holographChainId);
                                /**
                                 * @notice Update the Holograph chain ID
                                 * @dev Useful for updating once a hard fork was mitigated
                                 * @param holographChainId Holograph chain ID to use
                                 */
                                function setHolographChainId(uint32 holographChainId) external;
                                /**
                                 * @notice Get the address of the Holograph Interfaces module
                                 * @dev Holograph uses this contract to store data that needs to be accessed by a large portion of the modules
                                 */
                                function getInterfaces() external view returns (address interfaces);
                                /**
                                 * @notice Update the Holograph Interfaces module address
                                 * @param interfaces address of the Holograph Interfaces smart contract to use
                                 */
                                function setInterfaces(address interfaces) external;
                                /**
                                 * @notice Get the address of the Holograph Operator module
                                 * @dev All cross-chain Holograph Bridge beams are handled by the Holograph Operator module
                                 */
                                function getOperator() external view returns (address operator);
                                /**
                                 * @notice Update the Holograph Operator module address
                                 * @param operator address of the Holograph Operator smart contract to use
                                 */
                                function setOperator(address operator) external;
                                /**
                                 * @notice Get the Holograph Registry module
                                 * @dev This module stores a reference for all deployed holographable smart contracts
                                 */
                                function getRegistry() external view returns (address registry);
                                /**
                                 * @notice Update the Holograph Registry module address
                                 * @param registry address of the Holograph Registry smart contract to use
                                 */
                                function setRegistry(address registry) external;
                                /**
                                 * @notice Get the Holograph Treasury module
                                 * @dev All of the Holograph Protocol assets are stored and managed by this module
                                 */
                                function getTreasury() external view returns (address treasury);
                                /**
                                 * @notice Update the Holograph Treasury module address
                                 * @param treasury address of the Holograph Treasury smart contract to use
                                 */
                                function setTreasury(address treasury) external;
                                /**
                                 * @notice Get the Holograph Utility Token address
                                 * @dev This is the official utility token of the Holograph Protocol
                                 */
                                function getUtilityToken() external view returns (address utilityToken);
                                /**
                                 * @notice Update the Holograph Utility Token address
                                 * @param utilityToken address of the Holograph Utility Token smart contract to use
                                 */
                                function setUtilityToken(address utilityToken) external;
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              import "../enum/ChainIdType.sol";
                              import "../enum/InterfaceType.sol";
                              import "../enum/TokenUriType.sol";
                              interface HolographInterfacesInterface {
                                function contractURI(
                                  string calldata name,
                                  string calldata imageURL,
                                  string calldata externalLink,
                                  uint16 bps,
                                  address contractAddress
                                ) external pure returns (string memory);
                                function getUriPrepend(TokenUriType uriType) external view returns (string memory prepend);
                                function updateUriPrepend(TokenUriType uriType, string calldata prepend) external;
                                function updateUriPrepends(TokenUriType[] calldata uriTypes, string[] calldata prepends) external;
                                function getChainId(
                                  ChainIdType fromChainType,
                                  uint256 fromChainId,
                                  ChainIdType toChainType
                                ) external view returns (uint256 toChainId);
                                function updateChainIdMap(
                                  ChainIdType fromChainType,
                                  uint256 fromChainId,
                                  ChainIdType toChainType,
                                  uint256 toChainId
                                ) external;
                                function updateChainIdMaps(
                                  ChainIdType[] calldata fromChainType,
                                  uint256[] calldata fromChainId,
                                  ChainIdType[] calldata toChainType,
                                  uint256[] calldata toChainId
                                ) external;
                                function supportsInterface(InterfaceType interfaceType, bytes4 interfaceId) external view returns (bool);
                                function updateInterface(InterfaceType interfaceType, bytes4 interfaceId, bool supported) external;
                                function updateInterfaces(InterfaceType interfaceType, bytes4[] calldata interfaceIds, bool supported) external;
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              import "../struct/OperatorJob.sol";
                              interface HolographOperatorInterface {
                                /**
                                 * @dev Event is emitted for every time that a valid job is available.
                                 */
                                event AvailableOperatorJob(bytes32 jobHash, bytes payload);
                                /**
                                 * @dev Event is emitted for every time that a job is completed.
                                 */
                                event FinishedOperatorJob(bytes32 jobHash, address operator);
                                /**
                                 * @dev Event is emitted every time a cross-chain message is sent
                                 */
                                event CrossChainMessageSent(bytes32 messageHash);
                                /**
                                 * @dev Event is emitted if an operator job execution fails
                                 */
                                event FailedOperatorJob(bytes32 jobHash);
                                /**
                                 * @notice Execute an available operator job
                                 * @dev When making this call, if operating criteria is not met, the call will revert
                                 * @param bridgeInRequestPayload the entire cross chain message payload
                                 */
                                function executeJob(bytes calldata bridgeInRequestPayload) external payable;
                                function nonRevertingBridgeCall(address msgSender, bytes calldata payload) external payable;
                                /**
                                 * @notice Receive a cross-chain message
                                 * @dev This function is restricted for use by Holograph Messaging Module only
                                 */
                                function crossChainMessage(bytes calldata bridgeInRequestPayload) external payable;
                                /**
                                 * @notice Calculate the amount of gas needed to execute a bridgeInRequest
                                 * @dev Use this function to estimate the amount of gas that will be used by the bridgeInRequest function
                                 *      Set a specific gas limit when making this call, subtract return value, to get total gas used
                                 *      Only use this with a static call
                                 * @param bridgeInRequestPayload abi encoded bytes making up the bridgeInRequest payload
                                 * @return the gas amount remaining after the static call is returned
                                 */
                                function jobEstimator(bytes calldata bridgeInRequestPayload) external payable returns (uint256);
                                /**
                                 * @notice Send cross chain bridge request message
                                 * @dev This function is restricted to only be callable by Holograph Bridge
                                 * @param gasLimit maximum amount of gas to spend for executing the beam on destination chain
                                 * @param gasPrice maximum amount of gas price (in destination chain native gas token) to pay on destination chain
                                 * @param toChain Holograph Chain ID where the beam is being sent to
                                 * @param nonce incremented number used to ensure job hashes are unique
                                 * @param holographableContract address of the contract for which the bridge request is being made
                                 * @param bridgeOutPayload bytes made up of the bridgeOutRequest payload
                                 */
                                function send(
                                  uint256 gasLimit,
                                  uint256 gasPrice,
                                  uint32 toChain,
                                  address msgSender,
                                  uint256 nonce,
                                  address holographableContract,
                                  bytes calldata bridgeOutPayload
                                ) external payable;
                                /**
                                 * @notice Get the fees associated with sending specific payload
                                 * @dev Will provide exact costs on protocol and message side, combine the two to get total
                                 * @param toChain holograph chain id of destination chain for payload
                                 * @param gasLimit amount of gas to provide for executing payload on destination chain
                                 * @param gasPrice maximum amount to pay for gas price, can be set to 0 and will be chose automatically
                                 * @param crossChainPayload the entire packet being sent cross-chain
                                 * @return hlgFee the amount (in wei) of native gas token that will cost for finalizing job on destiantion chain
                                 * @return msgFee the amount (in wei) of native gas token that will cost for sending message to destiantion chain
                                 * @return dstGasPrice the amount (in wei) that destination message maximum gas price will be
                                 */
                                function getMessageFee(
                                  uint32 toChain,
                                  uint256 gasLimit,
                                  uint256 gasPrice,
                                  bytes calldata crossChainPayload
                                ) external view returns (uint256 hlgFee, uint256 msgFee, uint256 dstGasPrice);
                                /**
                                 * @notice Get the details for an available operator job
                                 * @dev The job hash is a keccak256 hash of the entire job payload
                                 * @param jobHash keccak256 hash of the job
                                 * @return an OperatorJob struct with details about a specific job
                                 */
                                function getJobDetails(bytes32 jobHash) external view returns (OperatorJob memory);
                                /**
                                 * @notice Get number of pods available
                                 * @dev This returns number of pods that have been opened via bonding
                                 */
                                function getTotalPods() external view returns (uint256 totalPods);
                                /**
                                 * @notice Get total number of operators in a pod
                                 * @dev Use in conjunction with paginated getPodOperators function
                                 * @param pod the pod to query
                                 * @return total operators in a pod
                                 */
                                function getPodOperatorsLength(uint256 pod) external view returns (uint256);
                                /**
                                 * @notice Get list of operators in a pod
                                 * @dev Use paginated getPodOperators function instead if list gets too long
                                 * @param pod the pod to query
                                 * @return operators array list of operators in a pod
                                 */
                                function getPodOperators(uint256 pod) external view returns (address[] memory operators);
                                /**
                                 * @notice Get paginated list of operators in a pod
                                 * @dev Use in conjunction with getPodOperatorsLength to know the total length of results
                                 * @param pod the pod to query
                                 * @param index the array index to start from
                                 * @param length the length of result set to be (will be shorter if reached end of array)
                                 * @return operators a paginated array of operators
                                 */
                                function getPodOperators(
                                  uint256 pod,
                                  uint256 index,
                                  uint256 length
                                ) external view returns (address[] memory operators);
                                /**
                                 * @notice Check the base and current price for bonding to a particular pod
                                 * @dev Useful for understanding what is required for bonding to a pod
                                 * @param pod the pod to get bonding amounts for
                                 * @return base the base bond amount required for a pod
                                 * @return current the current bond amount required for a pod
                                 */
                                function getPodBondAmounts(uint256 pod) external view returns (uint256 base, uint256 current);
                                /**
                                 * @notice Get an operator's currently bonded amount
                                 * @dev Useful for checking how much an operator has bonded
                                 * @param operator address of operator to check
                                 * @return amount total number of utility token bonded
                                 */
                                function getBondedAmount(address operator) external view returns (uint256 amount);
                                /**
                                 * @notice Get an operator's currently bonded pod
                                 * @dev Useful for checking if an operator is currently bonded
                                 * @param operator address of operator to check
                                 * @return pod number that operator is bonded on, returns zero if not bonded or selected for job
                                 */
                                function getBondedPod(address operator) external view returns (uint256 pod);
                                /**
                                 * @notice Get an operator's currently bonded pod index
                                 * @dev Useful for checking if an operator is a fallback for active job
                                 * @param operator address of operator to check
                                 * @return index currently bonded pod's operator index, returns zero if not in pod or moved out for active job
                                 */
                                function getBondedPodIndex(address operator) external view returns (uint256 index);
                                /**
                                 * @notice Topup a bonded operator with more utility tokens
                                 * @dev Useful function if an operator got slashed and wants to add a safety buffer to not get unbonded
                                 * @param operator address of operator to topup
                                 * @param amount utility token amount to add
                                 */
                                function topupUtilityToken(address operator, uint256 amount) external;
                                /**
                                 * @notice Bond utility tokens and become an operator
                                 * @dev An operator can only bond to one pod at a time, per network
                                 * @param operator address of operator to bond (can be an ownable smart contract)
                                 * @param amount utility token amount to bond (can be greater than minimum)
                                 * @param pod number of pod to bond to (can be for one that does not exist yet)
                                 */
                                function bondUtilityToken(address operator, uint256 amount, uint256 pod) external;
                                /**
                                 * @notice Unbond HLG utility tokens and stop being an operator
                                 * @dev A bonded operator selected for a job cannot unbond until they complete the job, or are slashed
                                 * @param operator address of operator to unbond
                                 * @param recipient address where to send the bonded tokens
                                 */
                                function unbondUtilityToken(address operator, address recipient) external;
                                /**
                                 * @notice Get the address of the Holograph Bridge module
                                 * @dev Used for beaming holographable assets cross-chain
                                 */
                                function getBridge() external view returns (address bridge);
                                /**
                                 * @notice Update the Holograph Bridge module address
                                 * @param bridge address of the Holograph Bridge smart contract to use
                                 */
                                function setBridge(address bridge) external;
                                /**
                                 * @notice Get the Holograph Protocol contract
                                 * @dev Used for storing a reference to all the primary modules and variables of the protocol
                                 */
                                function getHolograph() external view returns (address holograph);
                                /**
                                 * @notice Update the Holograph Protocol contract address
                                 * @param holograph address of the Holograph Protocol smart contract to use
                                 */
                                function setHolograph(address holograph) external;
                                /**
                                 * @notice Get the address of the Holograph Interfaces module
                                 * @dev Holograph uses this contract to store data that needs to be accessed by a large portion of the modules
                                 */
                                function getInterfaces() external view returns (address interfaces);
                                /**
                                 * @notice Update the Holograph Interfaces module address
                                 * @param interfaces address of the Holograph Interfaces smart contract to use
                                 */
                                function setInterfaces(address interfaces) external;
                                /**
                                 * @notice Get the address of the Holograph Messaging Module
                                 * @dev All cross-chain message requests will get forwarded to this adress
                                 */
                                function getMessagingModule() external view returns (address messagingModule);
                                /**
                                 * @notice Update the Holograph Messaging Module address
                                 * @param messagingModule address of the LayerZero Endpoint to use
                                 */
                                function setMessagingModule(address messagingModule) external;
                                /**
                                 * @notice Get the Holograph Registry module
                                 * @dev This module stores a reference for all deployed holographable smart contracts
                                 */
                                function getRegistry() external view returns (address registry);
                                /**
                                 * @notice Update the Holograph Registry module address
                                 * @param registry address of the Holograph Registry smart contract to use
                                 */
                                function setRegistry(address registry) external;
                                /**
                                 * @notice Get the Holograph Utility Token address
                                 * @dev This is the official utility token of the Holograph Protocol
                                 */
                                function getUtilityToken() external view returns (address utilityToken);
                                /**
                                 * @notice Update the Holograph Utility Token address
                                 * @param utilityToken address of the Holograph Utility Token smart contract to use
                                 */
                                function setUtilityToken(address utilityToken) external;
                                /**
                                 * @notice Get the Minimum Gas Price
                                 * @dev This amount is used as the value that will define a job as underpriced is lower than
                                 */
                                function getMinGasPrice() external view returns (uint256 minGasPrice);
                                /**
                                 * @notice Update the Minimum Gas Price
                                 * @param minGasPrice amount to set for minimum gas price
                                 */
                                function setMinGasPrice(uint256 minGasPrice) external;
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              interface HolographRegistryInterface {
                                event HolographableContractEvent(address indexed _holographableContract, bytes _payload);
                                function isHolographedContract(address smartContract) external view returns (bool);
                                function isHolographedHashDeployed(bytes32 hash) external view returns (bool);
                                function referenceContractTypeAddress(address contractAddress) external returns (bytes32);
                                function getContractTypeAddress(bytes32 contractType) external view returns (address);
                                function setContractTypeAddress(bytes32 contractType, address contractAddress) external;
                                function getHolograph() external view returns (address holograph);
                                function setHolograph(address holograph) external;
                                function getHolographableContracts(uint256 index, uint256 length) external view returns (address[] memory contracts);
                                function getHolographableContractsLength() external view returns (uint256);
                                function getHolographedHashAddress(bytes32 hash) external view returns (address);
                                function setHolographedHashAddress(bytes32 hash, address contractAddress) external;
                                function getHToken(uint32 chainId) external view returns (address);
                                function setHToken(uint32 chainId, address hToken) external;
                                function getReservedContractTypeAddress(bytes32 contractType) external view returns (address contractTypeAddress);
                                function setReservedContractTypeAddress(bytes32 hash, bool reserved) external;
                                function setReservedContractTypeAddresses(bytes32[] calldata hashes, bool[] calldata reserved) external;
                                function getUtilityToken() external view returns (address utilityToken);
                                function setUtilityToken(address utilityToken) external;
                                function holographableEvent(bytes calldata payload) external;
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              /**
                               * @title Initializable
                               * @author https://github.com/holographxyz
                               * @notice Use init instead of constructor
                               * @dev This allows for use of init function to make one time initializations without the need of a constructor
                               */
                              interface InitializableInterface {
                                /**
                                 * @notice Used internally to initialize the contract instead of through a constructor
                                 * @dev This function is called by the deployer/factory when creating a contract
                                 * @param initPayload abi encoded payload to use for contract initilaization
                                 */
                                function init(bytes memory initPayload) external returns (bytes4);
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              interface Ownable {
                                event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
                                function owner() external view returns (address);
                                function transferOwnership(address _newOwner) external;
                                function isOwner() external view returns (bool);
                                function isOwner(address wallet) external view returns (bool);
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              struct OperatorJob {
                                uint8 pod;
                                uint16 blockTimes;
                                address operator;
                                uint40 startBlock;
                                uint64 startTimestamp;
                                uint16[5] fallbackOperators;
                              }
                              /*
                              uint\t\tDigits\tMax value
                              -----------------------------
                              uint8\t\t3\t\t255
                              uint16\t\t5\t\t65,535
                              uint24\t\t8\t\t16,777,215
                              uint32\t\t10\t\t4,294,967,295
                              uint40\t\t13\t\t1,099,511,627,775
                              uint48\t\t15\t\t281,474,976,710,655
                              uint56\t\t17\t\t72,057,594,037,927,935
                              uint64\t\t20\t\t18,446,744,073,709,551,615
                              uint72\t\t22\t\t4,722,366,482,869,645,213,695
                              uint80\t\t25\t\t1,208,925,819,614,629,174,706,175
                              uint88\t\t27\t\t309,485,009,821,345,068,724,781,055
                              uint96\t\t29\t\t79,228,162,514,264,337,593,543,950,335
                              ...
                              uint128\t\t39\t\t340,282,366,920,938,463,463,374,607,431,768,211,455
                              ...
                              uint256\t\t78\t\t115,792,089,237,316,195,423,570,985,008,687,907,853,269,984,665,640,564,039,457,584,007,913,129,639,935
                              */
                              

                              File 11 of 14: LayerZeroModuleProxy
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              abstract contract Admin {
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.admin')) - 1)
                                 */
                                bytes32 constant _adminSlot = 0x3f106594dc74eeef980dae234cde8324dc2497b13d27a0c59e55bd2ca10a07c9;
                                modifier onlyAdmin() {
                                  require(msg.sender == getAdmin(), "HOLOGRAPH: admin only function");
                                  _;
                                }
                                constructor() {}
                                function admin() public view returns (address) {
                                  return getAdmin();
                                }
                                function getAdmin() public view returns (address adminAddress) {
                                  assembly {
                                    adminAddress := sload(_adminSlot)
                                  }
                                }
                                function setAdmin(address adminAddress) public onlyAdmin {
                                  assembly {
                                    sstore(_adminSlot, adminAddress)
                                  }
                                }
                                function adminCall(address target, bytes calldata data) external payable onlyAdmin {
                                  assembly {
                                    calldatacopy(0, data.offset, data.length)
                                    let result := call(gas(), target, callvalue(), 0, data.length, 0, 0)
                                    returndatacopy(0, 0, returndatasize())
                                    switch result
                                    case 0 {
                                      revert(0, returndatasize())
                                    }
                                    default {
                                      return(0, returndatasize())
                                    }
                                  }
                                }
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              import "../interface/InitializableInterface.sol";
                              /**
                               * @title Initializable
                               * @author https://github.com/holographxyz
                               * @notice Use init instead of constructor
                               * @dev This allows for use of init function to make one time initializations without the need for a constructor
                               */
                              abstract contract Initializable is InitializableInterface {
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.initialized')) - 1)
                                 */
                                bytes32 constant _initializedSlot = 0x4e5f991bca30eca2d4643aaefa807e88f96a4a97398933d572a3c0d973004a01;
                                /**
                                 * @dev Constructor is left empty and init is used instead
                                 */
                                constructor() {}
                                /**
                                 * @notice Used internally to initialize the contract instead of through a constructor
                                 * @dev This function is called by the deployer/factory when creating a contract
                                 * @param initPayload abi encoded payload to use for contract initilaization
                                 */
                                function init(bytes memory initPayload) external virtual returns (bytes4);
                                function _isInitialized() internal view returns (bool initialized) {
                                  assembly {
                                    initialized := sload(_initializedSlot)
                                  }
                                }
                                function _setInitialized() internal {
                                  assembly {
                                    sstore(_initializedSlot, 0x0000000000000000000000000000000000000000000000000000000000000001)
                                  }
                                }
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              /**
                               * @title Initializable
                               * @author https://github.com/holographxyz
                               * @notice Use init instead of constructor
                               * @dev This allows for use of init function to make one time initializations without the need of a constructor
                               */
                              interface InitializableInterface {
                                /**
                                 * @notice Used internally to initialize the contract instead of through a constructor
                                 * @dev This function is called by the deployer/factory when creating a contract
                                 * @param initPayload abi encoded payload to use for contract initilaization
                                 */
                                function init(bytes memory initPayload) external returns (bytes4);
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              import "../abstract/Admin.sol";
                              import "../abstract/Initializable.sol";
                              contract LayerZeroModuleProxy is Admin, Initializable {
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.layerZeroModule')) - 1)
                                 */
                                bytes32 constant _layerZeroModuleSlot = 0x7c89cf3f353cabaa2f43d6eba6b9682ecfdeedd31a3b76a8b3e17a61970fb7f0;
                                constructor() {}
                                function init(bytes memory data) external override returns (bytes4) {
                                  require(!_isInitialized(), "HOLOGRAPH: already initialized");
                                  (address layerZeroModule, bytes memory initCode) = abi.decode(data, (address, bytes));
                                  assembly {
                                    sstore(_adminSlot, origin())
                                    sstore(_layerZeroModuleSlot, layerZeroModule)
                                  }
                                  (bool success, bytes memory returnData) = layerZeroModule.delegatecall(
                                    abi.encodeWithSignature("init(bytes)", initCode)
                                  );
                                  bytes4 selector = abi.decode(returnData, (bytes4));
                                  require(success && selector == Initializable.init.selector, "initialization failed");
                                  _setInitialized();
                                  return Initializable.init.selector;
                                }
                                function getLayerZeroModule() external view returns (address layerZeroModule) {
                                  assembly {
                                    layerZeroModule := sload(_layerZeroModuleSlot)
                                  }
                                }
                                function setLayerZeroModule(address layerZeroModule) external onlyAdmin {
                                  assembly {
                                    sstore(_layerZeroModuleSlot, layerZeroModule)
                                  }
                                }
                                receive() external payable {}
                                fallback() external payable {
                                  assembly {
                                    let layerZeroModule := sload(_layerZeroModuleSlot)
                                    calldatacopy(0, 0, calldatasize())
                                    let result := delegatecall(gas(), layerZeroModule, 0, calldatasize(), 0, 0)
                                    returndatacopy(0, 0, returndatasize())
                                    switch result
                                    case 0 {
                                      revert(0, returndatasize())
                                    }
                                    default {
                                      return(0, returndatasize())
                                    }
                                  }
                                }
                              }
                              

                              File 12 of 14: HolographInterfaces
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              import "./abstract/Admin.sol";
                              import "./abstract/Initializable.sol";
                              import "./enum/ChainIdType.sol";
                              import "./enum/InterfaceType.sol";
                              import "./enum/TokenUriType.sol";
                              import "./interface/InitializableInterface.sol";
                              import "./library/Base64.sol";
                              import "./library/Strings.sol";
                              /**
                               * @title Holograph Interfaces
                               * @author https://github.com/holographxyz
                               * @notice Get universal Holograph Protocol variables
                               * @dev The contract stores a reference of all supported: chains, interfaces, functions, etc.
                               */
                              contract HolographInterfaces is Admin, Initializable {
                                /**
                                 * @dev Internal mapping of all InterfaceType interfaces
                                 */
                                mapping(InterfaceType => mapping(bytes4 => bool)) private _supportedInterfaces;
                                /**
                                 * @dev Internal mapping of all ChainIdType conversions
                                 */
                                mapping(ChainIdType => mapping(uint256 => mapping(ChainIdType => uint256))) private _chainIdMap;
                                /**
                                 * @dev Internal mapping of all TokenUriType prepends
                                 */
                                mapping(TokenUriType => string) private _prependURI;
                                /**
                                 * @dev Constructor is left empty and init is used instead
                                 */
                                constructor() {}
                                /**
                                 * @notice Used internally to initialize the contract instead of through a constructor
                                 * @dev This function is called by the deployer/factory when creating a contract
                                 * @param initPayload abi encoded payload to use for contract initilaization
                                 */
                                function init(bytes memory initPayload) external override returns (bytes4) {
                                  require(!_isInitialized(), "HOLOGRAPH: already initialized");
                                  address contractAdmin = abi.decode(initPayload, (address));
                                  assembly {
                                    sstore(_adminSlot, contractAdmin)
                                  }
                                  _setInitialized();
                                  return InitializableInterface.init.selector;
                                }
                                /**
                                 * @notice Get a base64 encoded contract URI JSON string
                                 * @dev Used to dynamically generate contract JSON payload
                                 * @param name the name of the smart contract
                                 * @param imageURL string pointing to the primary contract image, can be: https, ipfs, or ar (arweave)
                                 * @param externalLink url to website/page related to smart contract
                                 * @param bps basis points used for specifying royalties percentage
                                 * @param contractAddress address of the smart contract
                                 * @return a base64 encoded json string representing the smart contract
                                 */
                                function contractURI(
                                  string calldata name,
                                  string calldata imageURL,
                                  string calldata externalLink,
                                  uint16 bps,
                                  address contractAddress
                                ) external pure returns (string memory) {
                                  return
                                    string(
                                      abi.encodePacked(
                                        "data:application/json;base64,",
                                        Base64.encode(
                                          abi.encodePacked(
                                            '{"name":"',
                                            name,
                                            '","description":"',
                                            name,
                                            '","image":"',
                                            imageURL,
                                            '","external_link":"',
                                            externalLink,
                                            '","seller_fee_basis_points":',
                                            Strings.uint2str(bps),
                                            ',"fee_recipient":"0x',
                                            Strings.toAsciiString(contractAddress),
                                            '"}'
                                          )
                                        )
                                      )
                                    );
                                }
                                /**
                                 * @notice Get the prepend to use for tokenURI
                                 * @dev Provides the prepend to use with TokenUriType URI
                                 */
                                function getUriPrepend(TokenUriType uriType) external view returns (string memory prepend) {
                                  prepend = _prependURI[uriType];
                                }
                                /**
                                 * @notice Update the tokenURI prepend
                                 * @param uriType specify which TokenUriType to set for
                                 * @param prepend the string to use for the prepend
                                 */
                                function updateUriPrepend(TokenUriType uriType, string calldata prepend) external onlyAdmin {
                                  _prependURI[uriType] = prepend;
                                }
                                /**
                                 * @notice Update the tokenURI prepends
                                 * @param uriTypes specify array of TokenUriTypes to set for
                                 * @param prepends array string to use for the prepends
                                 */
                                function updateUriPrepends(TokenUriType[] calldata uriTypes, string[] calldata prepends) external onlyAdmin {
                                  for (uint256 i = 0; i < uriTypes.length; i++) {
                                    _prependURI[uriTypes[i]] = prepends[i];
                                  }
                                }
                                function getChainId(
                                  ChainIdType fromChainType,
                                  uint256 fromChainId,
                                  ChainIdType toChainType
                                ) external view returns (uint256 toChainId) {
                                  return _chainIdMap[fromChainType][fromChainId][toChainType];
                                }
                                function updateChainIdMap(
                                  ChainIdType fromChainType,
                                  uint256 fromChainId,
                                  ChainIdType toChainType,
                                  uint256 toChainId
                                ) external onlyAdmin {
                                  _chainIdMap[fromChainType][fromChainId][toChainType] = toChainId;
                                }
                                function updateChainIdMaps(
                                  ChainIdType[] calldata fromChainType,
                                  uint256[] calldata fromChainId,
                                  ChainIdType[] calldata toChainType,
                                  uint256[] calldata toChainId
                                ) external onlyAdmin {
                                  uint256 length = fromChainType.length;
                                  for (uint256 i = 0; i < length; i++) {
                                    _chainIdMap[fromChainType[i]][fromChainId[i]][toChainType[i]] = toChainId[i];
                                  }
                                }
                                function supportsInterface(InterfaceType interfaceType, bytes4 interfaceId) external view returns (bool) {
                                  return _supportedInterfaces[interfaceType][interfaceId];
                                }
                                function updateInterface(
                                  InterfaceType interfaceType,
                                  bytes4 interfaceId,
                                  bool supported
                                ) external onlyAdmin {
                                  _supportedInterfaces[interfaceType][interfaceId] = supported;
                                }
                                function updateInterfaces(
                                  InterfaceType interfaceType,
                                  bytes4[] calldata interfaceIds,
                                  bool supported
                                ) external onlyAdmin {
                                  for (uint256 i = 0; i < interfaceIds.length; i++) {
                                    _supportedInterfaces[interfaceType][interfaceIds[i]] = supported;
                                  }
                                }
                                /**
                                 * @dev Purposefully reverts to prevent having any type of ether transfered into the contract
                                 */
                                receive() external payable {
                                  revert();
                                }
                                /**
                                 * @dev Purposefully reverts to prevent any calls to undefined functions
                                 */
                                fallback() external payable {
                                  revert();
                                }
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              abstract contract Admin {
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.admin')) - 1)
                                 */
                                bytes32 constant _adminSlot = 0x3f106594dc74eeef980dae234cde8324dc2497b13d27a0c59e55bd2ca10a07c9;
                                modifier onlyAdmin() {
                                  require(msg.sender == getAdmin(), "HOLOGRAPH: admin only function");
                                  _;
                                }
                                constructor() {}
                                function admin() public view returns (address) {
                                  return getAdmin();
                                }
                                function getAdmin() public view returns (address adminAddress) {
                                  assembly {
                                    adminAddress := sload(_adminSlot)
                                  }
                                }
                                function setAdmin(address adminAddress) public onlyAdmin {
                                  assembly {
                                    sstore(_adminSlot, adminAddress)
                                  }
                                }
                                function adminCall(address target, bytes calldata data) external payable onlyAdmin {
                                  assembly {
                                    calldatacopy(0, data.offset, data.length)
                                    let result := call(gas(), target, callvalue(), 0, data.length, 0, 0)
                                    returndatacopy(0, 0, returndatasize())
                                    switch result
                                    case 0 {
                                      revert(0, returndatasize())
                                    }
                                    default {
                                      return(0, returndatasize())
                                    }
                                  }
                                }
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              import "../interface/InitializableInterface.sol";
                              /**
                               * @title Initializable
                               * @author https://github.com/holographxyz
                               * @notice Use init instead of constructor
                               * @dev This allows for use of init function to make one time initializations without the need for a constructor
                               */
                              abstract contract Initializable is InitializableInterface {
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.initialized')) - 1)
                                 */
                                bytes32 constant _initializedSlot = 0x4e5f991bca30eca2d4643aaefa807e88f96a4a97398933d572a3c0d973004a01;
                                /**
                                 * @dev Constructor is left empty and init is used instead
                                 */
                                constructor() {}
                                /**
                                 * @notice Used internally to initialize the contract instead of through a constructor
                                 * @dev This function is called by the deployer/factory when creating a contract
                                 * @param initPayload abi encoded payload to use for contract initilaization
                                 */
                                function init(bytes memory initPayload) external virtual returns (bytes4);
                                function _isInitialized() internal view returns (bool initialized) {
                                  assembly {
                                    initialized := sload(_initializedSlot)
                                  }
                                }
                                function _setInitialized() internal {
                                  assembly {
                                    sstore(_initializedSlot, 0x0000000000000000000000000000000000000000000000000000000000000001)
                                  }
                                }
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              enum ChainIdType {
                                UNDEFINED, //  0
                                EVM, //        1
                                HOLOGRAPH, //  2
                                LAYERZERO, //  3
                                HYPERLANE //   4
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              enum TokenUriType {
                                UNDEFINED, //   0
                                IPFS, //        1
                                HTTPS, //       2
                                ARWEAVE //      3
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              enum InterfaceType {
                                UNDEFINED, // 0
                                ERC20, //     1
                                ERC721, //    2
                                ERC1155, //   3
                                ROYALTIES, // 4
                                GENERIC //    5
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              library Base64 {
                                bytes private constant base64stdchars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
                                bytes private constant base64urlchars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
                                function encode(string memory _str) internal pure returns (string memory) {
                                  bytes memory _bs = bytes(_str);
                                  return encode(_bs);
                                }
                                function encode(bytes memory _bs) internal pure returns (string memory) {
                                  uint256 rem = _bs.length % 3;
                                  uint256 res_length = ((_bs.length + 2) / 3) * 4 - ((3 - rem) % 3);
                                  bytes memory res = new bytes(res_length);
                                  uint256 i = 0;
                                  uint256 j = 0;
                                  for (; i + 3 <= _bs.length; i += 3) {
                                    (res[j], res[j + 1], res[j + 2], res[j + 3]) = encode3(uint8(_bs[i]), uint8(_bs[i + 1]), uint8(_bs[i + 2]));
                                    j += 4;
                                  }
                                  if (rem != 0) {
                                    uint8 la0 = uint8(_bs[_bs.length - rem]);
                                    uint8 la1 = 0;
                                    if (rem == 2) {
                                      la1 = uint8(_bs[_bs.length - 1]);
                                    }
                                    (
                                      bytes1 b0,
                                      bytes1 b1,
                                      bytes1 b2, /* bytes1 b3*/
                                    ) = encode3(la0, la1, 0);
                                    res[j] = b0;
                                    res[j + 1] = b1;
                                    if (rem == 2) {
                                      res[j + 2] = b2;
                                    }
                                  }
                                  return string(res);
                                }
                                function encode3(
                                  uint256 a0,
                                  uint256 a1,
                                  uint256 a2
                                )
                                  private
                                  pure
                                  returns (
                                    bytes1 b0,
                                    bytes1 b1,
                                    bytes1 b2,
                                    bytes1 b3
                                  )
                                {
                                  uint256 n = (a0 << 16) | (a1 << 8) | a2;
                                  uint256 c0 = (n >> 18) & 63;
                                  uint256 c1 = (n >> 12) & 63;
                                  uint256 c2 = (n >> 6) & 63;
                                  uint256 c3 = (n) & 63;
                                  b0 = base64urlchars[c0];
                                  b1 = base64urlchars[c1];
                                  b2 = base64urlchars[c2];
                                  b3 = base64urlchars[c3];
                                }
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              library Strings {
                                function toHexString(address account) internal pure returns (string memory) {
                                  return toHexString(uint256(uint160(account)));
                                }
                                function toHexString(uint256 value) internal pure returns (string memory) {
                                  if (value == 0) {
                                    return "0x00";
                                  }
                                  uint256 temp = value;
                                  uint256 length = 0;
                                  while (temp != 0) {
                                    length++;
                                    temp >>= 8;
                                  }
                                  return toHexString(value, length);
                                }
                                function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
                                  bytes memory buffer = new bytes(2 * length + 2);
                                  buffer[0] = "0";
                                  buffer[1] = "x";
                                  for (uint256 i = 2 * length + 1; i > 1; --i) {
                                    buffer[i] = bytes16("0123456789abcdef")[value & 0xf];
                                    value >>= 4;
                                  }
                                  require(value == 0, "Strings: hex length insufficient");
                                  return string(buffer);
                                }
                                function toAsciiString(address x) internal pure returns (string memory) {
                                  bytes memory s = new bytes(40);
                                  for (uint256 i = 0; i < 20; i++) {
                                    bytes1 b = bytes1(uint8(uint256(uint160(x)) / (2**(8 * (19 - i)))));
                                    bytes1 hi = bytes1(uint8(b) / 16);
                                    bytes1 lo = bytes1(uint8(b) - 16 * uint8(hi));
                                    s[2 * i] = char(hi);
                                    s[2 * i + 1] = char(lo);
                                  }
                                  return string(s);
                                }
                                function char(bytes1 b) internal pure returns (bytes1 c) {
                                  if (uint8(b) < 10) {
                                    return bytes1(uint8(b) + 0x30);
                                  } else {
                                    return bytes1(uint8(b) + 0x57);
                                  }
                                }
                                function uint2str(uint256 _i) internal pure returns (string memory _uint256AsString) {
                                  if (_i == 0) {
                                    return "0";
                                  }
                                  uint256 j = _i;
                                  uint256 len;
                                  while (j != 0) {
                                    len++;
                                    j /= 10;
                                  }
                                  bytes memory bstr = new bytes(len);
                                  uint256 k = len;
                                  while (_i != 0) {
                                    k = k - 1;
                                    uint8 temp = (48 + uint8(_i - (_i / 10) * 10));
                                    bytes1 b1 = bytes1(temp);
                                    bstr[k] = b1;
                                    _i /= 10;
                                  }
                                  return string(bstr);
                                }
                                function toString(uint256 value) internal pure returns (string memory) {
                                  if (value == 0) {
                                    return "0";
                                  }
                                  uint256 temp = value;
                                  uint256 digits;
                                  while (temp != 0) {
                                    digits++;
                                    temp /= 10;
                                  }
                                  bytes memory buffer = new bytes(digits);
                                  while (value != 0) {
                                    digits -= 1;
                                    buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
                                    value /= 10;
                                  }
                                  return string(buffer);
                                }
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              /**
                               * @title Initializable
                               * @author https://github.com/holographxyz
                               * @notice Use init instead of constructor
                               * @dev This allows for use of init function to make one time initializations without the need of a constructor
                               */
                              interface InitializableInterface {
                                /**
                                 * @notice Used internally to initialize the contract instead of through a constructor
                                 * @dev This function is called by the deployer/factory when creating a contract
                                 * @param initPayload abi encoded payload to use for contract initilaization
                                 */
                                function init(bytes memory initPayload) external returns (bytes4);
                              }
                              

                              File 13 of 14: Endpoint
                              // 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;
                                  ILayerZeroMessagingLibrary public defaultSendLibrary;
                                  address public defaultReceiveLibraryAddress;
                                  struct LibraryConfig {
                                      uint16 sendVersion;
                                      uint16 receiveVersion;
                                      address receiveLibraryAddress;
                                      ILayerZeroMessagingLibrary sendLibrary;
                                  }
                                  struct StoredPayload {
                                      uint64 payloadLength;
                                      address dstAddress;
                                      bytes32 payloadHash;
                                  }
                                  // user app config = [uaAddress]
                                  mapping(address => LibraryConfig) public uaConfigLookup;
                                  // inboundNonce = [srcChainId][srcAddress].
                                  mapping(uint16 => mapping(bytes => uint64)) public inboundNonce;
                                  // outboundNonce = [dstChainId][srcAddress].
                                  mapping(uint16 => mapping(address => uint64)) public outboundNonce;
                                  // storedPayload = [srcChainId][srcAddress]
                                  mapping(uint16 => mapping(bytes => StoredPayload)) public storedPayload;
                                  // library versioning events
                                  event NewLibraryVersionAdded(uint16 version);
                                  event DefaultSendVersionSet(uint16 version);
                                  event DefaultReceiveVersionSet(uint16 version);
                                  event UaSendVersionSet(address ua, uint16 version);
                                  event UaReceiveVersionSet(address ua, uint16 version);
                                  event UaForceResumeReceive(uint16 chainId, bytes srcAddress);
                                  // payload events
                                  event PayloadCleared(uint16 srcChainId, bytes srcAddress, uint64 nonce, address dstAddress);
                                  event PayloadStored(uint16 srcChainId, bytes srcAddress, address dstAddress, uint64 nonce, bytes payload, bytes reason);
                                  constructor(uint16 _chainId) {
                                      chainId = _chainId;
                                  }
                                  //---------------------------------------------------------------------------
                                  // send and receive nonreentrant lock
                                  uint8 internal constant _NOT_ENTERED = 1;
                                  uint8 internal constant _ENTERED = 2;
                                  uint8 internal _send_entered_state = 1;
                                  uint8 internal _receive_entered_state = 1;
                                  modifier sendNonReentrant() {
                                      require(_send_entered_state == _NOT_ENTERED, "LayerZero: no send reentrancy");
                                      _send_entered_state = _ENTERED;
                                      _;
                                      _send_entered_state = _NOT_ENTERED;
                                  }
                                  modifier receiveNonReentrant() {
                                      require(_receive_entered_state == _NOT_ENTERED, "LayerZero: no receive reentrancy");
                                      _receive_entered_state = _ENTERED;
                                      _;
                                      _receive_entered_state = _NOT_ENTERED;
                                  }
                                  // BLOCK_VERSION is also a valid version
                                  modifier validVersion(uint16 _version) {
                                      require(_version <= latestVersion || _version == BLOCK_VERSION, "LayerZero: invalid messaging library version");
                                      _;
                                  }
                                  //---------------------------------------------------------------------------
                                  // User Application Calls - Endpoint Interface
                                  function send(uint16 _dstChainId, bytes calldata _destination, bytes calldata _payload, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable override sendNonReentrant {
                                      LibraryConfig storage uaConfig = uaConfigLookup[msg.sender];
                                      uint64 nonce = ++outboundNonce[_dstChainId][msg.sender];
                                      _getSendLibrary(uaConfig).send{value: msg.value}(msg.sender, nonce, _dstChainId, _destination, _payload, _refundAddress, _zroPaymentAddress, _adapterParams);
                                  }
                                  //---------------------------------------------------------------------------
                                  // authenticated Library (msg.sender) Calls to pass through Endpoint to UA (dstAddress)
                                  function receivePayload(uint16 _srcChainId, bytes calldata _srcAddress, address _dstAddress, uint64 _nonce, uint _gasLimit, bytes calldata _payload) external override receiveNonReentrant {
                                      // assert and increment the nonce. no message shuffling
                                      require(_nonce == ++inboundNonce[_srcChainId][_srcAddress], "LayerZero: wrong nonce");
                                      LibraryConfig storage uaConfig = uaConfigLookup[_dstAddress];
                                      // authentication to prevent cross-version message validation
                                      // protects against a malicious library from passing arbitrary data
                                      if (uaConfig.receiveVersion == DEFAULT_VERSION) {
                                          require(defaultReceiveLibraryAddress == msg.sender, "LayerZero: invalid default library");
                                      } else {
                                          require(uaConfig.receiveLibraryAddress == msg.sender, "LayerZero: invalid library");
                                      }
                                      // block if any message blocking
                                      StoredPayload storage sp = storedPayload[_srcChainId][_srcAddress];
                                      require(sp.payloadHash == bytes32(0), "LayerZero: in message blocking");
                                      try ILayerZeroReceiver(_dstAddress).lzReceive{gas: _gasLimit}(_srcChainId, _srcAddress, _nonce, _payload) {
                                          // success, do nothing, end of the message delivery
                                      } catch (bytes memory reason) {
                                          // revert nonce if any uncaught errors/exceptions if the ua chooses the blocking mode
                                          storedPayload[_srcChainId][_srcAddress] = StoredPayload(uint64(_payload.length), _dstAddress, keccak256(_payload));
                                          emit PayloadStored(_srcChainId, _srcAddress, _dstAddress, _nonce, _payload, reason);
                                      }
                                  }
                                  function retryPayload(uint16 _srcChainId, bytes calldata _srcAddress, bytes calldata _payload) external override receiveNonReentrant {
                                      StoredPayload storage sp = storedPayload[_srcChainId][_srcAddress];
                                      require(sp.payloadHash != bytes32(0), "LayerZero: no stored payload");
                                      require(_payload.length == sp.payloadLength && keccak256(_payload) == sp.payloadHash, "LayerZero: invalid payload");
                                      address dstAddress = sp.dstAddress;
                                      // empty the storedPayload
                                      sp.payloadLength = 0;
                                      sp.dstAddress = address(0);
                                      sp.payloadHash = bytes32(0);
                                      uint64 nonce = inboundNonce[_srcChainId][_srcAddress];
                                      ILayerZeroReceiver(dstAddress).lzReceive(_srcChainId, _srcAddress, nonce, _payload);
                                      emit PayloadCleared(_srcChainId, _srcAddress, nonce, dstAddress);
                                  }
                                  //---------------------------------------------------------------------------
                                  // Owner Calls, only new library version upgrade (3 steps)
                                  // note libraryLookup[0] = 0x0, no library implementation
                                  // LIBRARY UPGRADE step 1: set _newLayerZeroLibraryAddress be the new version
                                  function newVersion(address _newLayerZeroLibraryAddress) external onlyOwner {
                                      require(_newLayerZeroLibraryAddress != address(0x0), "LayerZero: new version cannot be zero address");
                                      require(latestVersion < 65535, "LayerZero: can not add new messaging library");
                                      latestVersion++;
                                      libraryLookup[latestVersion] = ILayerZeroMessagingLibrary(_newLayerZeroLibraryAddress);
                                      emit NewLibraryVersionAdded(latestVersion);
                                  }
                                  // LIBRARY UPGRADE step 2: stop sending messages from the old version
                                  function setDefaultSendVersion(uint16 _newDefaultSendVersion) external onlyOwner validVersion(_newDefaultSendVersion) {
                                      require(_newDefaultSendVersion != DEFAULT_VERSION, "LayerZero: default send version must > 0");
                                      defaultSendVersion = _newDefaultSendVersion;
                                      defaultSendLibrary = libraryLookup[defaultSendVersion];
                                      emit DefaultSendVersionSet(_newDefaultSendVersion);
                                  }
                                  // LIBRARY UPGRADE step 3: stop receiving messages from the old version
                                  function setDefaultReceiveVersion(uint16 _newDefaultReceiveVersion) external onlyOwner validVersion(_newDefaultReceiveVersion) {
                                      require(_newDefaultReceiveVersion != DEFAULT_VERSION, "LayerZero: default receive version must > 0");
                                      defaultReceiveVersion = _newDefaultReceiveVersion;
                                      defaultReceiveLibraryAddress = address(libraryLookup[defaultReceiveVersion]);
                                      emit DefaultReceiveVersionSet(_newDefaultReceiveVersion);
                                  }
                                  //---------------------------------------------------------------------------
                                  // User Application Calls - UA set/get Interface
                                  function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external override validVersion(_version) {
                                      if (_version == DEFAULT_VERSION) {
                                          require(defaultSendVersion == defaultReceiveVersion, "LayerZero: can not set Config during DEFAULT migration");
                                          _version = defaultSendVersion;
                                      }
                                      require(_version != BLOCK_VERSION, "LayerZero: can not set config for BLOCK_VERSION");
                                      libraryLookup[_version].setConfig(_chainId, msg.sender, _configType, _config);
                                  }
                                  // Migration step 1: set the send version
                                  // Define what library the UA points too
                                  function setSendVersion(uint16 _newVersion) external override validVersion(_newVersion) {
                                      // write into config
                                      LibraryConfig storage uaConfig = uaConfigLookup[msg.sender];
                                      uaConfig.sendVersion = _newVersion;
                                      // the libraryLookup[BLOCK_VERSION || DEFAULT_VERSION] = 0x0
                                      uaConfig.sendLibrary = libraryLookup[_newVersion];
                                      emit UaSendVersionSet(msg.sender, _newVersion);
                                  }
                                  // Migration step 2: set the receive version
                                  // after all messages sent from the old version are received
                                  // the UA can now safely switch to the new receive version
                                  // it is the UA's responsibility make sure all messages from the old version are processed
                                  function setReceiveVersion(uint16 _newVersion) external override validVersion(_newVersion) {
                                      // write into config
                                      LibraryConfig storage uaConfig = uaConfigLookup[msg.sender];
                                      uaConfig.receiveVersion = _newVersion;
                                      // the libraryLookup[BLOCK_VERSION || DEFAULT_VERSION] = 0x0
                                      uaConfig.receiveLibraryAddress = address(libraryLookup[_newVersion]);
                                      emit UaReceiveVersionSet(msg.sender, _newVersion);
                                  }
                                  function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external override {
                                      StoredPayload storage sp = storedPayload[_srcChainId][_srcAddress];
                                      // revert if no messages are cached. safeguard malicious UA behaviour
                                      require(sp.payloadHash != bytes32(0), "LayerZero: no stored payload");
                                      require(sp.dstAddress == msg.sender, "LayerZero: invalid caller");
                                      // empty the storedPayload
                                      sp.payloadLength = 0;
                                      sp.dstAddress = address(0);
                                      sp.payloadHash = bytes32(0);
                                      // emit the event with the new nonce
                                      emit UaForceResumeReceive(_srcChainId, _srcAddress);
                                  }
                                  //---------------------------------------------------------------------------
                                  // view helper function
                                  function estimateFees(uint16 _dstChainId, address _userApplication, bytes calldata _payload, bool _payInZRO, bytes calldata _adapterParams) external view override returns (uint nativeFee, uint zroFee) {
                                      LibraryConfig storage uaConfig = uaConfigLookup[_userApplication];
                                      ILayerZeroMessagingLibrary lib = uaConfig.sendVersion == DEFAULT_VERSION ? defaultSendLibrary : uaConfig.sendLibrary;
                                      return lib.estimateFees(_dstChainId, _userApplication, _payload, _payInZRO, _adapterParams);
                                  }
                                  function _getSendLibrary(LibraryConfig storage uaConfig) internal view returns (ILayerZeroMessagingLibrary) {
                                      if (uaConfig.sendVersion == DEFAULT_VERSION) {
                                          // check if the in send-blocking upgrade
                                          require(defaultSendVersion != BLOCK_VERSION, "LayerZero: default in BLOCK_VERSION");
                                          return defaultSendLibrary;
                                      } else {
                                          // check if the in send-blocking upgrade
                                          require(uaConfig.sendVersion != BLOCK_VERSION, "LayerZero: in BLOCK_VERSION");
                                          return uaConfig.sendLibrary;
                                      }
                                  }
                                  function getSendLibraryAddress(address _userApplication) external view override returns (address sendLibraryAddress) {
                                      LibraryConfig storage uaConfig = uaConfigLookup[_userApplication];
                                      uint16 sendVersion = uaConfig.sendVersion;
                                      require(sendVersion != BLOCK_VERSION, "LayerZero: send version is BLOCK_VERSION");
                                      if (sendVersion == DEFAULT_VERSION) {
                                          require(defaultSendVersion != BLOCK_VERSION, "LayerZero: send version (default) is BLOCK_VERSION");
                                          sendLibraryAddress = address(defaultSendLibrary);
                                      } else {
                                          sendLibraryAddress = address(uaConfig.sendLibrary);
                                      }
                                  }
                                  function getReceiveLibraryAddress(address _userApplication) external view override returns (address receiveLibraryAddress) {
                                      LibraryConfig storage uaConfig = uaConfigLookup[_userApplication];
                                      uint16 receiveVersion = uaConfig.receiveVersion;
                                      require(receiveVersion != BLOCK_VERSION, "LayerZero: receive version is BLOCK_VERSION");
                                      if (receiveVersion == DEFAULT_VERSION) {
                                          require(defaultReceiveVersion != BLOCK_VERSION, "LayerZero: receive version (default) is BLOCK_VERSION");
                                          receiveLibraryAddress = defaultReceiveLibraryAddress;
                                      } else {
                                          receiveLibraryAddress = uaConfig.receiveLibraryAddress;
                                      }
                                  }
                                  function isSendingPayload() external view override returns (bool) {
                                      return _send_entered_state == _ENTERED;
                                  }
                                  function isReceivingPayload() external view override returns (bool) {
                                      return _receive_entered_state == _ENTERED;
                                  }
                                  function getInboundNonce(uint16 _srcChainId, bytes calldata _srcAddress) external view override returns (uint64) {
                                      return inboundNonce[_srcChainId][_srcAddress];
                                  }
                                  function getOutboundNonce(uint16 _dstChainId, address _srcAddress) external view override returns (uint64) {
                                      return outboundNonce[_dstChainId][_srcAddress];
                                  }
                                  function getChainId() external view override returns (uint16) {
                                      return chainId;
                                  }
                                  function getSendVersion(address _userApplication) external view override returns (uint16) {
                                      LibraryConfig storage uaConfig = uaConfigLookup[_userApplication];
                                      return uaConfig.sendVersion == DEFAULT_VERSION ? defaultSendVersion : uaConfig.sendVersion;
                                  }
                                  function getReceiveVersion(address _userApplication) external view override returns (uint16) {
                                      LibraryConfig storage uaConfig = uaConfigLookup[_userApplication];
                                      return uaConfig.receiveVersion == DEFAULT_VERSION ? defaultReceiveVersion : uaConfig.receiveVersion;
                                  }
                                  function getConfig(uint16 _version, uint16 _chainId, address _userApplication, uint _configType) external view override validVersion(_version) returns (bytes memory) {
                                      if (_version == DEFAULT_VERSION) {
                                          require(defaultSendVersion == defaultReceiveVersion, "LayerZero: no DEFAULT config while migration");
                                          _version = defaultSendVersion;
                                      }
                                      require(_version != BLOCK_VERSION, "LayerZero: can not get config for BLOCK_VERSION");
                                      return libraryLookup[_version].getConfig(_chainId, _userApplication, _configType);
                                  }
                                  function hasStoredPayload(uint16 _srcChainId, bytes calldata _srcAddress) external view override returns (bool) {
                                      StoredPayload storage sp = storedPayload[_srcChainId][_srcAddress];
                                      return sp.payloadHash != bytes32(0);
                                  }
                              }
                              // SPDX-License-Identifier: BUSL-1.1
                              pragma solidity >=0.5.0;
                              interface ILayerZeroReceiver {
                                  // @notice LayerZero endpoint will invoke this function to deliver the message on the destination
                                  // @param _srcChainId - the source endpoint identifier
                                  // @param _srcAddress - the source sending contract address from the source chain
                                  // @param _nonce - the ordered message nonce
                                  // @param _payload - the signed payload is the UA bytes has encoded to be sent
                                  function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) external;
                              }
                              // SPDX-License-Identifier: BUSL-1.1
                              pragma solidity >=0.5.0;
                              import "./ILayerZeroUserApplicationConfig.sol";
                              interface ILayerZeroEndpoint is ILayerZeroUserApplicationConfig {
                                  // @notice send a LayerZero message to the specified address at a LayerZero endpoint.
                                  // @param _dstChainId - the destination chain identifier
                                  // @param _destination - the address on destination chain (in bytes). address length/format may vary by chains
                                  // @param _payload - a custom bytes payload to send to the destination contract
                                  // @param _refundAddress - if the source transaction is cheaper than the amount of value passed, refund the additional amount to this address
                                  // @param _zroPaymentAddress - the address of the ZRO token holder who would pay for the transaction
                                  // @param _adapterParams - parameters for custom functionality. e.g. receive airdropped native gas from the relayer on destination
                                  function send(uint16 _dstChainId, bytes calldata _destination, bytes calldata _payload, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable;
                                  // @notice used by the messaging library to publish verified payload
                                  // @param _srcChainId - the source chain identifier
                                  // @param _srcAddress - the source contract (as bytes) at the source chain
                                  // @param _dstAddress - the address on destination chain
                                  // @param _nonce - the unbound message ordering nonce
                                  // @param _gasLimit - the gas limit for external contract execution
                                  // @param _payload - verified payload to send to the destination contract
                                  function receivePayload(uint16 _srcChainId, bytes calldata _srcAddress, address _dstAddress, uint64 _nonce, uint _gasLimit, bytes calldata _payload) external;
                                  // @notice get the inboundNonce of a receiver from a source chain which could be EVM or non-EVM chain
                                  // @param _srcChainId - the source chain identifier
                                  // @param _srcAddress - the source chain contract address
                                  function getInboundNonce(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (uint64);
                                  // @notice get the outboundNonce from this source chain which, consequently, is always an EVM
                                  // @param _srcAddress - the source chain contract address
                                  function getOutboundNonce(uint16 _dstChainId, address _srcAddress) external view returns (uint64);
                                  // @notice gets a quote in source native gas, for the amount that send() requires to pay for message delivery
                                  // @param _dstChainId - the destination chain identifier
                                  // @param _userApplication - the user app address on this EVM chain
                                  // @param _payload - the custom message to send over LayerZero
                                  // @param _payInZRO - if false, user app pays the protocol fee in native token
                                  // @param _adapterParam - parameters for the adapter service, e.g. send some dust native token to dstChain
                                  function estimateFees(uint16 _dstChainId, address _userApplication, bytes calldata _payload, bool _payInZRO, bytes calldata _adapterParam) external view returns (uint nativeFee, uint zroFee);
                                  // @notice get this Endpoint's immutable source identifier
                                  function getChainId() external view returns (uint16);
                                  // @notice the interface to retry failed message on this Endpoint destination
                                  // @param _srcChainId - the source chain identifier
                                  // @param _srcAddress - the source chain contract address
                                  // @param _payload - the payload to be retried
                                  function retryPayload(uint16 _srcChainId, bytes calldata _srcAddress, bytes calldata _payload) external;
                                  // @notice query if any STORED payload (message blocking) at the endpoint.
                                  // @param _srcChainId - the source chain identifier
                                  // @param _srcAddress - the source chain contract address
                                  function hasStoredPayload(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool);
                                  // @notice query if the _libraryAddress is valid for sending msgs.
                                  // @param _userApplication - the user app address on this EVM chain
                                  function getSendLibraryAddress(address _userApplication) external view returns (address);
                                  // @notice query if the _libraryAddress is valid for receiving msgs.
                                  // @param _userApplication - the user app address on this EVM chain
                                  function getReceiveLibraryAddress(address _userApplication) external view returns (address);
                                  // @notice query if the non-reentrancy guard for send() is on
                                  // @return true if the guard is on. false otherwise
                                  function isSendingPayload() external view returns (bool);
                                  // @notice query if the non-reentrancy guard for receive() is on
                                  // @return true if the guard is on. false otherwise
                                  function isReceivingPayload() external view returns (bool);
                                  // @notice get the configuration of the LayerZero messaging library of the specified version
                                  // @param _version - messaging library version
                                  // @param _chainId - the chainId for the pending config change
                                  // @param _userApplication - the contract address of the user application
                                  // @param _configType - type of configuration. every messaging library has its own convention.
                                  function getConfig(uint16 _version, uint16 _chainId, address _userApplication, uint _configType) external view returns (bytes memory);
                                  // @notice get the send() LayerZero messaging library version
                                  // @param _userApplication - the contract address of the user application
                                  function getSendVersion(address _userApplication) external view returns (uint16);
                                  // @notice get the lzReceive() LayerZero messaging library version
                                  // @param _userApplication - the contract address of the user application
                                  function getReceiveVersion(address _userApplication) external view returns (uint16);
                              }
                              // SPDX-License-Identifier: BUSL-1.1
                              pragma solidity >=0.7.0;
                              import "./ILayerZeroUserApplicationConfig.sol";
                              interface ILayerZeroMessagingLibrary {
                                  // send(), messages will be inflight.
                                  function send(address _userApplication, uint64 _lastNonce, uint16 _chainId, bytes calldata _destination, bytes calldata _payload, address payable refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable;
                                  // estimate native fee at the send side
                                  function estimateFees(uint16 _chainId, address _userApplication, bytes calldata _payload, bool _payInZRO, bytes calldata _adapterParam) external view returns (uint nativeFee, uint zroFee);
                                  //---------------------------------------------------------------------------
                                  // setConfig / getConfig are User Application (UA) functions to specify Oracle, Relayer, blockConfirmations, libraryVersion
                                  function setConfig(uint16 _chainId, address _userApplication, uint _configType, bytes calldata _config) external;
                                  function getConfig(uint16 _chainId, address _userApplication, uint _configType) external view returns (bytes memory);
                              }
                              // SPDX-License-Identifier: MIT
                              pragma solidity ^0.7.0;
                              import "../utils/Context.sol";
                              /**
                               * @dev Contract module which provides a basic access control mechanism, where
                               * there is an account (an owner) that can be granted exclusive access to
                               * specific functions.
                               *
                               * By default, the owner account will be the one that deploys the contract. This
                               * can later be changed with {transferOwnership}.
                               *
                               * This module is used through inheritance. It will make available the modifier
                               * `onlyOwner`, which can be applied to your functions to restrict their use to
                               * the owner.
                               */
                              abstract contract Ownable is Context {
                                  address private _owner;
                                  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
                                  /**
                                   * @dev Initializes the contract setting the deployer as the initial owner.
                                   */
                                  constructor () {
                                      address msgSender = _msgSender();
                                      _owner = msgSender;
                                      emit OwnershipTransferred(address(0), msgSender);
                                  }
                                  /**
                                   * @dev Returns the address of the current owner.
                                   */
                                  function owner() public view virtual returns (address) {
                                      return _owner;
                                  }
                                  /**
                                   * @dev Throws if called by any account other than the owner.
                                   */
                                  modifier onlyOwner() {
                                      require(owner() == _msgSender(), "Ownable: caller is not the owner");
                                      _;
                                  }
                                  /**
                                   * @dev Leaves the contract without owner. It will not be possible to call
                                   * `onlyOwner` functions anymore. Can only be called by the current owner.
                                   *
                                   * NOTE: Renouncing ownership will leave the contract without an owner,
                                   * thereby removing any functionality that is only available to the owner.
                                   */
                                  function renounceOwnership() public virtual onlyOwner {
                                      emit OwnershipTransferred(_owner, address(0));
                                      _owner = address(0);
                                  }
                                  /**
                                   * @dev Transfers ownership of the contract to a new account (`newOwner`).
                                   * Can only be called by the current owner.
                                   */
                                  function transferOwnership(address newOwner) public virtual onlyOwner {
                                      require(newOwner != address(0), "Ownable: new owner is the zero address");
                                      emit OwnershipTransferred(_owner, newOwner);
                                      _owner = newOwner;
                                  }
                              }
                              // SPDX-License-Identifier: BUSL-1.1
                              pragma solidity >=0.5.0;
                              interface ILayerZeroUserApplicationConfig {
                                  // @notice set the configuration of the LayerZero messaging library of the specified version
                                  // @param _version - messaging library version
                                  // @param _chainId - the chainId for the pending config change
                                  // @param _configType - type of configuration. every messaging library has its own convention.
                                  // @param _config - configuration in the bytes. can encode arbitrary content.
                                  function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external;
                                  // @notice set the send() LayerZero messaging library version to _version
                                  // @param _version - new messaging library version
                                  function setSendVersion(uint16 _version) external;
                                  // @notice set the lzReceive() LayerZero messaging library version to _version
                                  // @param _version - new messaging library version
                                  function setReceiveVersion(uint16 _version) external;
                                  // @notice Only when the UA needs to resume the message flow in blocking mode and clear the stored payload
                                  // @param _srcChainId - the chainId of the source chain
                                  // @param _srcAddress - the contract address of the source contract at the source chain
                                  function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external;
                              }
                              // SPDX-License-Identifier: MIT
                              pragma solidity >=0.6.0 <0.8.0;
                              /*
                               * @dev Provides information about the current execution context, including the
                               * sender of the transaction and its data. While these are generally available
                               * via msg.sender and msg.data, they should not be accessed in such a direct
                               * manner, since when dealing with GSN meta-transactions the account sending and
                               * paying for execution may not be the actual sender (as far as an application
                               * is concerned).
                               *
                               * This contract is only required for intermediate, library-like contracts.
                               */
                              abstract contract Context {
                                  function _msgSender() internal view virtual returns (address payable) {
                                      return msg.sender;
                                  }
                                  function _msgData() internal view virtual returns (bytes memory) {
                                      this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
                                      return msg.data;
                                  }
                              }
                              

                              File 14 of 14: Holographer
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              import "../abstract/Admin.sol";
                              import "../abstract/Initializable.sol";
                              import "../interface/HolographInterface.sol";
                              import "../interface/HolographerInterface.sol";
                              import "../interface/HolographRegistryInterface.sol";
                              import "../interface/InitializableInterface.sol";
                              /**
                               * @dev This contract is a binder. It puts together all the variables to make the underlying contracts functional and be bridgeable.
                               */
                              contract Holographer is Admin, Initializable, HolographerInterface {
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.originChain')) - 1)
                                 */
                                bytes32 constant _originChainSlot = 0xd49ffd6af8249d6e6b5963d9d2b22c6db30ad594cb468453047a14e1c1bcde4d;
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.holograph')) - 1)
                                 */
                                bytes32 constant _holographSlot = 0xb4107f746e9496e8452accc7de63d1c5e14c19f510932daa04077cd49e8bd77a;
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.contractType')) - 1)
                                 */
                                bytes32 constant _contractTypeSlot = 0x0b671eb65810897366dd82c4cbb7d9dff8beda8484194956e81e89b8a361d9c7;
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.sourceContract')) - 1)
                                 */
                                bytes32 constant _sourceContractSlot = 0x27d542086d1e831d40b749e7f5509a626c3047a36d160781c40d5acc83e5b074;
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.blockHeight')) - 1)
                                 */
                                bytes32 constant _blockHeightSlot = 0x9172848b0f1df776dc924b58e7fa303087ae0409bbf611608529e7f747d55de3;
                                /**
                                 * @dev Constructor is left empty and init is used instead
                                 */
                                constructor() {}
                                /**
                                 * @notice Used internally to initialize the contract instead of through a constructor
                                 * @dev This function is called by the deployer/factory when creating a contract
                                 * @param initPayload abi encoded payload to use for contract initilaization
                                 */
                                function init(bytes memory initPayload) external override returns (bytes4) {
                                  require(!_isInitialized(), "HOLOGRAPHER: already initialized");
                                  (bytes memory encoded, bytes memory initCode) = abi.decode(initPayload, (bytes, bytes));
                                  (uint32 originChain, address holograph, bytes32 contractType, address sourceContract) = abi.decode(
                                    encoded,
                                    (uint32, address, bytes32, address)
                                  );
                                  assembly {
                                    sstore(_adminSlot, caller())
                                    sstore(_blockHeightSlot, number())
                                    sstore(_contractTypeSlot, contractType)
                                    sstore(_holographSlot, holograph)
                                    sstore(_originChainSlot, originChain)
                                    sstore(_sourceContractSlot, sourceContract)
                                  }
                                  (bool success, bytes memory returnData) = HolographRegistryInterface(HolographInterface(holograph).getRegistry())
                                    .getReservedContractTypeAddress(contractType)
                                    .delegatecall(abi.encodeWithSelector(InitializableInterface.init.selector, initCode));
                                  bytes4 selector = abi.decode(returnData, (bytes4));
                                  require(success && selector == InitializableInterface.init.selector, "HOLOGRAPH: initialization failed");
                                  _setInitialized();
                                  return InitializableInterface.init.selector;
                                }
                                /**
                                 * @dev Returns the contract type that is used for loading the Enforcer
                                 */
                                function getContractType() external view returns (bytes32 contractType) {
                                  assembly {
                                    contractType := sload(_contractTypeSlot)
                                  }
                                }
                                /**
                                 * @dev Returns the block height of when the smart contract was deployed. Useful for retrieving deployment config for re-deployment on other EVM-compatible chains.
                                 */
                                function getDeploymentBlock() external view returns (uint256 deploymentBlock) {
                                  assembly {
                                    deploymentBlock := sload(_blockHeightSlot)
                                  }
                                }
                                /**
                                 * @dev Returns a hardcoded address for the Holograph smart contract.
                                 */
                                function getHolograph() external view returns (address holograph) {
                                  assembly {
                                    holograph := sload(_holographSlot)
                                  }
                                }
                                /**
                                 * @dev Returns a hardcoded address for the Holograph smart contract that controls and enforces the ERC standards.
                                 */
                                function getHolographEnforcer() public view returns (address) {
                                  HolographInterface holograph;
                                  bytes32 contractType;
                                  assembly {
                                    holograph := sload(_holographSlot)
                                    contractType := sload(_contractTypeSlot)
                                  }
                                  return HolographRegistryInterface(holograph.getRegistry()).getReservedContractTypeAddress(contractType);
                                }
                                /**
                                 * @dev Returns the original chain that contract was deployed on.
                                 */
                                function getOriginChain() external view returns (uint32 originChain) {
                                  assembly {
                                    originChain := sload(_originChainSlot)
                                  }
                                }
                                /**
                                 * @dev Returns a hardcoded address for the custom secure storage contract deployed in parallel with this contract deployment.
                                 */
                                function getSourceContract() external view returns (address sourceContract) {
                                  assembly {
                                    sourceContract := sload(_sourceContractSlot)
                                  }
                                }
                                /**
                                 * @dev Purposefully left empty, to prevent running out of gas errors when receiving native token payments.
                                 */
                                receive() external payable {}
                                /**
                                 * @dev This takes the Enforcer's source code, runs it, and uses current address for storage slots.
                                 */
                                fallback() external payable {
                                  address holographEnforcer = getHolographEnforcer();
                                  assembly {
                                    calldatacopy(0, 0, calldatasize())
                                    let result := delegatecall(gas(), holographEnforcer, 0, calldatasize(), 0, 0)
                                    returndatacopy(0, 0, returndatasize())
                                    switch result
                                    case 0 {
                                      revert(0, returndatasize())
                                    }
                                    default {
                                      return(0, returndatasize())
                                    }
                                  }
                                }
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              abstract contract Admin {
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.admin')) - 1)
                                 */
                                bytes32 constant _adminSlot = 0x3f106594dc74eeef980dae234cde8324dc2497b13d27a0c59e55bd2ca10a07c9;
                                modifier onlyAdmin() {
                                  require(msg.sender == getAdmin(), "HOLOGRAPH: admin only function");
                                  _;
                                }
                                constructor() {}
                                function admin() public view returns (address) {
                                  return getAdmin();
                                }
                                function getAdmin() public view returns (address adminAddress) {
                                  assembly {
                                    adminAddress := sload(_adminSlot)
                                  }
                                }
                                function setAdmin(address adminAddress) public onlyAdmin {
                                  assembly {
                                    sstore(_adminSlot, adminAddress)
                                  }
                                }
                                function adminCall(address target, bytes calldata data) external payable onlyAdmin {
                                  assembly {
                                    calldatacopy(0, data.offset, data.length)
                                    let result := call(gas(), target, callvalue(), 0, data.length, 0, 0)
                                    returndatacopy(0, 0, returndatasize())
                                    switch result
                                    case 0 {
                                      revert(0, returndatasize())
                                    }
                                    default {
                                      return(0, returndatasize())
                                    }
                                  }
                                }
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              /**
                               * @title Holograph Protocol
                               * @author https://github.com/holographxyz
                               * @notice This is the primary Holograph Protocol smart contract
                               * @dev This contract stores a reference to all the primary modules and variables of the protocol
                               */
                              interface HolographInterface {
                                /**
                                 * @notice Get the address of the Holograph Bridge module
                                 * @dev Used for beaming holographable assets cross-chain
                                 */
                                function getBridge() external view returns (address bridge);
                                /**
                                 * @notice Update the Holograph Bridge module address
                                 * @param bridge address of the Holograph Bridge smart contract to use
                                 */
                                function setBridge(address bridge) external;
                                /**
                                 * @notice Get the chain ID that the Protocol was deployed on
                                 * @dev Useful for checking if/when a hard fork occurs
                                 */
                                function getChainId() external view returns (uint256 chainId);
                                /**
                                 * @notice Update the chain ID
                                 * @dev Useful for updating once a hard fork has been mitigated
                                 * @param chainId EVM chain ID to use
                                 */
                                function setChainId(uint256 chainId) external;
                                /**
                                 * @notice Get the address of the Holograph Factory module
                                 * @dev Used for deploying holographable smart contracts
                                 */
                                function getFactory() external view returns (address factory);
                                /**
                                 * @notice Update the Holograph Factory module address
                                 * @param factory address of the Holograph Factory smart contract to use
                                 */
                                function setFactory(address factory) external;
                                /**
                                 * @notice Get the Holograph chain Id
                                 * @dev Holograph uses an internal chain id mapping
                                 */
                                function getHolographChainId() external view returns (uint32 holographChainId);
                                /**
                                 * @notice Update the Holograph chain ID
                                 * @dev Useful for updating once a hard fork was mitigated
                                 * @param holographChainId Holograph chain ID to use
                                 */
                                function setHolographChainId(uint32 holographChainId) external;
                                /**
                                 * @notice Get the address of the Holograph Interfaces module
                                 * @dev Holograph uses this contract to store data that needs to be accessed by a large portion of the modules
                                 */
                                function getInterfaces() external view returns (address interfaces);
                                /**
                                 * @notice Update the Holograph Interfaces module address
                                 * @param interfaces address of the Holograph Interfaces smart contract to use
                                 */
                                function setInterfaces(address interfaces) external;
                                /**
                                 * @notice Get the address of the Holograph Operator module
                                 * @dev All cross-chain Holograph Bridge beams are handled by the Holograph Operator module
                                 */
                                function getOperator() external view returns (address operator);
                                /**
                                 * @notice Update the Holograph Operator module address
                                 * @param operator address of the Holograph Operator smart contract to use
                                 */
                                function setOperator(address operator) external;
                                /**
                                 * @notice Get the Holograph Registry module
                                 * @dev This module stores a reference for all deployed holographable smart contracts
                                 */
                                function getRegistry() external view returns (address registry);
                                /**
                                 * @notice Update the Holograph Registry module address
                                 * @param registry address of the Holograph Registry smart contract to use
                                 */
                                function setRegistry(address registry) external;
                                /**
                                 * @notice Get the Holograph Treasury module
                                 * @dev All of the Holograph Protocol assets are stored and managed by this module
                                 */
                                function getTreasury() external view returns (address treasury);
                                /**
                                 * @notice Update the Holograph Treasury module address
                                 * @param treasury address of the Holograph Treasury smart contract to use
                                 */
                                function setTreasury(address treasury) external;
                                /**
                                 * @notice Get the Holograph Utility Token address
                                 * @dev This is the official utility token of the Holograph Protocol
                                 */
                                function getUtilityToken() external view returns (address utilityToken);
                                /**
                                 * @notice Update the Holograph Utility Token address
                                 * @param utilityToken address of the Holograph Utility Token smart contract to use
                                 */
                                function setUtilityToken(address utilityToken) external;
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              import "../interface/InitializableInterface.sol";
                              /**
                               * @title Initializable
                               * @author https://github.com/holographxyz
                               * @notice Use init instead of constructor
                               * @dev This allows for use of init function to make one time initializations without the need for a constructor
                               */
                              abstract contract Initializable is InitializableInterface {
                                /**
                                 * @dev bytes32(uint256(keccak256('eip1967.Holograph.initialized')) - 1)
                                 */
                                bytes32 constant _initializedSlot = 0x4e5f991bca30eca2d4643aaefa807e88f96a4a97398933d572a3c0d973004a01;
                                /**
                                 * @dev Constructor is left empty and init is used instead
                                 */
                                constructor() {}
                                /**
                                 * @notice Used internally to initialize the contract instead of through a constructor
                                 * @dev This function is called by the deployer/factory when creating a contract
                                 * @param initPayload abi encoded payload to use for contract initilaization
                                 */
                                function init(bytes memory initPayload) external virtual returns (bytes4);
                                function _isInitialized() internal view returns (bool initialized) {
                                  assembly {
                                    initialized := sload(_initializedSlot)
                                  }
                                }
                                function _setInitialized() internal {
                                  assembly {
                                    sstore(_initializedSlot, 0x0000000000000000000000000000000000000000000000000000000000000001)
                                  }
                                }
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              interface HolographerInterface {
                                function getContractType() external view returns (bytes32 contractType);
                                function getDeploymentBlock() external view returns (uint256 deploymentBlock);
                                function getHolograph() external view returns (address holograph);
                                function getHolographEnforcer() external view returns (address);
                                function getOriginChain() external view returns (uint32 originChain);
                                function getSourceContract() external view returns (address sourceContract);
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              interface HolographRegistryInterface {
                                function isHolographedContract(address smartContract) external view returns (bool);
                                function isHolographedHashDeployed(bytes32 hash) external view returns (bool);
                                function referenceContractTypeAddress(address contractAddress) external returns (bytes32);
                                function getContractTypeAddress(bytes32 contractType) external view returns (address);
                                function setContractTypeAddress(bytes32 contractType, address contractAddress) external;
                                function getHolograph() external view returns (address holograph);
                                function setHolograph(address holograph) external;
                                function getHolographableContracts(uint256 index, uint256 length) external view returns (address[] memory contracts);
                                function getHolographableContractsLength() external view returns (uint256);
                                function getHolographedHashAddress(bytes32 hash) external view returns (address);
                                function setHolographedHashAddress(bytes32 hash, address contractAddress) external;
                                function getHToken(uint32 chainId) external view returns (address);
                                function setHToken(uint32 chainId, address hToken) external;
                                function getReservedContractTypeAddress(bytes32 contractType) external view returns (address contractTypeAddress);
                                function setReservedContractTypeAddress(bytes32 hash, bool reserved) external;
                                function setReservedContractTypeAddresses(bytes32[] calldata hashes, bool[] calldata reserved) external;
                                function getUtilityToken() external view returns (address utilityToken);
                                function setUtilityToken(address utilityToken) external;
                              }
                              // SPDX-License-Identifier: UNLICENSED
                              /*
                                                       ┌───────────┐
                                                       │ HOLOGRAPH │
                                                       └───────────┘
                              ╔═════════════════════════════════════════════════════════════╗
                              ║                                                             ║
                              ║                            / ^ \\                            ║
                              ║                            ~~*~~            ¸               ║
                              ║                         [ '<>:<>' ]         │░░░            ║
                              ║               ╔╗           _/"\\_           ╔╣               ║
                              ║             ┌─╬╬─┐          """          ┌─╬╬─┐             ║
                              ║          ┌─┬┘ ╠╣ └┬─┐       \\_/       ┌─┬┘ ╠╣ └┬─┐          ║
                              ║       ┌─┬┘ │  ╠╣  │ └┬─┐           ┌─┬┘ │  ╠╣  │ └┬─┐       ║
                              ║    ┌─┬┘ │  │  ╠╣  │  │ └┬─┐     ┌─┬┘ │  │  ╠╣  │  │ └┬─┐    ║
                              ║ ┌─┬┘ │  │  │  ╠╣  │  │  │ └┬┐ ┌┬┘ │  │  │  ╠╣  │  │  │ └┬─┐ ║
                              ╠┬┘ │  │  │  │  ╠╣  │  │  │  │└¤┘│  │  │  │  ╠╣  │  │  │  │ └┬╣
                              ║│  │  │  │  │  ╠╣  │  │  │  │   │  │  │  │  ╠╣  │  │  │  │  │║
                              ╠╩══╩══╩══╩══╩══╬╬══╩══╩══╩══╩═══╩══╩══╩══╩══╬╬══╩══╩══╩══╩══╩╣
                              ╠┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╬╬┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴╣
                              ║               ╠╣                           ╠╣               ║
                              ║               ╠╣                           ╠╣               ║
                              ║    ,          ╠╣     ,        ,'      *    ╠╣               ║
                              ║~~~~~^~~~~~~~~┌╬╬┐~~~^~~~~~~~~^^~~~~~~~~^~~┌╬╬┐~~~~~~~^~~~~~~║
                              ╚══════════════╩╩╩╩═════════════════════════╩╩╩╩══════════════╝
                                   - one protocol, one bridge = infinite possibilities -
                               ***************************************************************
                               DISCLAIMER: U.S Patent Pending
                               LICENSE: Holograph Limited Public License (H-LPL)
                               https://holograph.xyz/licenses/h-lpl/1.0.0
                               This license governs use of the accompanying software. If you
                               use the software, you accept this license. If you do not accept
                               the license, you are not permitted to use the software.
                               1. Definitions
                               The terms "reproduce," "reproduction," "derivative works," and
                               "distribution" have the same meaning here as under U.S.
                               copyright law. A "contribution" is the original software, or
                               any additions or changes to the software. A "contributor" is
                               any person that distributes its contribution under this
                               license. "Licensed patents" are a contributor’s patent claims
                               that read directly on its contribution.
                               2. Grant of Rights
                               A) Copyright Grant- Subject to the terms of this license,
                               including the license conditions and limitations in sections 3
                               and 4, each contributor grants you a non-exclusive, worldwide,
                               royalty-free copyright license to reproduce its contribution,
                               prepare derivative works of its contribution, and distribute
                               its contribution or any derivative works that you create.
                               B) Patent Grant- Subject to the terms of this license,
                               including the license conditions and limitations in section 3,
                               each contributor grants you a non-exclusive, worldwide,
                               royalty-free license under its licensed patents to make, have
                               made, use, sell, offer for sale, import, and/or otherwise
                               dispose of its contribution in the software or derivative works
                               of the contribution in the software.
                               3. Conditions and Limitations
                               A) No Trademark License- This license does not grant you rights
                               to use any contributors’ name, logo, or trademarks.
                               B) If you bring a patent claim against any contributor over
                               patents that you claim are infringed by the software, your
                               patent license from such contributor is terminated with
                               immediate effect.
                               C) If you distribute any portion of the software, you must
                               retain all copyright, patent, trademark, and attribution
                               notices that are present in the software.
                               D) If you distribute any portion of the software in source code
                               form, you may do so only under this license by including a
                               complete copy of this license with your distribution. If you
                               distribute any portion of the software in compiled or object
                               code form, you may only do so under a license that complies
                               with this license.
                               E) The software is licensed “as-is.” You bear all risks of
                               using it. The contributors give no express warranties,
                               guarantees, or conditions. You may have additional consumer
                               rights under your local laws which this license cannot change.
                               To the extent permitted under your local laws, the contributors
                               exclude all implied warranties, including those of
                               merchantability, fitness for a particular purpose and
                               non-infringement.
                               4. (F) Platform Limitation- The licenses granted in sections
                               2.A & 2.B extend only to the software or derivative works that
                               you create that run on a Holograph system product.
                               ***************************************************************
                              */
                              pragma solidity 0.8.13;
                              /**
                               * @title Initializable
                               * @author https://github.com/holographxyz
                               * @notice Use init instead of constructor
                               * @dev This allows for use of init function to make one time initializations without the need of a constructor
                               */
                              interface InitializableInterface {
                                /**
                                 * @notice Used internally to initialize the contract instead of through a constructor
                                 * @dev This function is called by the deployer/factory when creating a contract
                                 * @param initPayload abi encoded payload to use for contract initilaization
                                 */
                                function init(bytes memory initPayload) external returns (bytes4);
                              }