diff --git a/contracts/scripts/native_solc_compile_all_ccip b/contracts/scripts/native_solc_compile_all_ccip
index 0b1496d391..1343fbebd4 100755
--- a/contracts/scripts/native_solc_compile_all_ccip
+++ b/contracts/scripts/native_solc_compile_all_ccip
@@ -100,5 +100,7 @@ compileContract ccip/interfaces/encodingutils/ICCIPEncodingUtils.sol
 
 # Customer contracts
 compileContract ccip/pools/USDC/USDCTokenPool.sol
+compileContract ccip/pools/LBTC/adapters/CLAdapter.sol
+compileContract ccip/pools/LBTC/adapters/LombardTokenPool.sol
 
 compileContract tests/MockV3Aggregator.sol
diff --git a/contracts/src/v0.8/ccip/pools/LBTC/IBridge.sol b/contracts/src/v0.8/ccip/pools/LBTC/IBridge.sol
new file mode 100644
index 0000000000..609137d691
--- /dev/null
+++ b/contracts/src/v0.8/ccip/pools/LBTC/IBridge.sol
@@ -0,0 +1,114 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.24;
+
+import {ILBTC} from "../LBTC/ILBTC.sol";
+import "./adapters/IAdapter.sol";
+import {IConsortiumConsumer, INotaryConsortium} from "./IConsortiumConsumer.sol";
+
+interface IBridge is IConsortiumConsumer {
+    /// @notice Emitted when the destination is unknown.
+    error UnknownDestination();
+
+    /// @notice Emitted when the zero address is used.
+    error Bridge_ZeroAddress();
+
+    error Bridge_ZeroAmount();
+
+    /// @notice Emitted adapter is not set for destination without consortium
+    error BadConfiguration();
+
+    /// @notice Emitted when the destination is already known.
+    error KnownDestination();
+
+    /// @notice Emitted when the zero contract hash is used.
+    error ZeroContractHash();
+
+    /// @notice Emitted when the chain id is invalid.
+    error ZeroChainId();
+
+    /// @notice Emitted when the destination is not valid.
+    error NotValidDestination();
+
+    /// @notice Emitted when amount is below commission
+    error AmountLessThanCommission(uint256 commission);
+
+    /// @notice Emitted when the origin contract is unknown.
+    error UnknownOriginContract(bytes32 fromChain, bytes32 fromContract);
+
+    /// @notice Emitted when the unexpected action is used.
+    error UnexpectedAction(bytes4 action);
+
+    error UnknownAdapter(address);
+
+    error PayloadAlreadyUsed(bytes32);
+
+    /// @notice Emitted no payload submitted by adapter
+    error AdapterNotConfirmed();
+
+    /// @notice Emitted no payload submitted by consortium
+    error ConsortiumNotConfirmed();
+
+    /// @notice Emitted when the deposit absolute commission is changed.
+    event DepositAbsoluteCommissionChanged(
+        uint64 newValue,
+        bytes32 indexed chain
+    );
+
+    /// @notice Emitted when the deposit relative commission is changed.
+    event DepositRelativeCommissionChanged(
+        uint16 newValue,
+        bytes32 indexed chain
+    );
+
+    /// @notice Emitted when a bridge destination is added.
+    event BridgeDestinationAdded(
+        bytes32 indexed chain,
+        bytes32 indexed contractAddress
+    );
+
+    /// @notice Emitted when a bridge destination is removed.
+    event BridgeDestinationRemoved(bytes32 indexed chain);
+
+    /// @notice Emitted when the adapter is changed.
+    event AdapterChanged(address previousAdapter, IAdapter newAdapter);
+
+    /// @notice Emitted when the is a deposit in the bridge
+    event DepositToBridge(
+        address indexed fromAddress,
+        bytes32 indexed toAddress,
+        bytes32 indexed payloadHash,
+        bytes payload
+    );
+
+    /// @notice Emitted when a withdraw is made from the bridge
+    event WithdrawFromBridge(
+        address indexed recipient,
+        bytes32 indexed payloadHash,
+        bytes payload,
+        uint64 amount
+    );
+
+    event PayloadReceived(
+        address indexed recipient,
+        bytes32 indexed payloadHash,
+        address indexed adapter
+    );
+
+    event PayloadNotarized(
+        address indexed recipient,
+        bytes32 indexed payloadHash
+    );
+
+    /// @notice Emitted when the treasury is changed.
+    event TreasuryChanged(address previousTreasury, address newTreasury);
+
+    function lbtc() external view returns (ILBTC);
+    function receivePayload(bytes32 fromChain, bytes calldata payload) external;
+    function deposit(
+        bytes32 toChain,
+        bytes32 toAddress,
+        uint64 amount
+    ) external payable returns (uint256, bytes memory);
+    function authNotary(bytes calldata payload, bytes calldata proof) external;
+    function withdraw(bytes calldata payload) external returns (uint64);
+}
diff --git a/contracts/src/v0.8/ccip/pools/LBTC/IConsortiumConsumer.sol b/contracts/src/v0.8/ccip/pools/LBTC/IConsortiumConsumer.sol
new file mode 100644
index 0000000000..8010e25fd8
--- /dev/null
+++ b/contracts/src/v0.8/ccip/pools/LBTC/IConsortiumConsumer.sol
@@ -0,0 +1,19 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.24;
+
+import {INotaryConsortium} from "./INotaryConsortium.sol";
+
+/**
+ * @title Consortium Consumer interface
+ * @author Lombard.Finance
+ * @notice Common interface for contracts who verify signatures with `INotaryConsortium`
+ */
+interface IConsortiumConsumer {
+    event ConsortiumChanged(
+        INotaryConsortium indexed prevVal,
+        INotaryConsortium indexed newVal
+    );
+
+    function changeConsortium(INotaryConsortium newVal) external;
+    function consortium() external view returns (INotaryConsortium);
+}
diff --git a/contracts/src/v0.8/ccip/pools/LBTC/ILBTC.sol b/contracts/src/v0.8/ccip/pools/LBTC/ILBTC.sol
new file mode 100644
index 0000000000..1b4e265a01
--- /dev/null
+++ b/contracts/src/v0.8/ccip/pools/LBTC/ILBTC.sol
@@ -0,0 +1,60 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.24;
+
+interface ILBTC {
+    error ZeroAddress();
+    error ZeroContractHash();
+    error ZeroChainId();
+    error WithdrawalsDisabled();
+    error KnownDestination();
+    error UnknownDestination();
+    error ScriptPubkeyUnsupported();
+    error AmountLessThanCommission(uint256 fee);
+    error AmountBelowDustLimit(uint256 dustLimit);
+    error InvalidDustFeeRate();
+    error UnauthorizedAccount(address account);
+    error UnexpectedAction(bytes4 action);
+    error UnknownOriginContract(uint256 fromChainId, address fromContract);
+    error InvalidUserSignature();
+    error PayloadAlreadyUsed();
+    error InvalidInputLength();
+
+    event PauserRoleTransferred(
+        address indexed previousPauser,
+        address indexed newPauser
+    );
+    event UnstakeRequest(
+        address indexed fromAddress,
+        bytes scriptPubKey,
+        uint256 amount
+    );
+    event WithdrawalsEnabled(bool);
+    event NameAndSymbolChanged(string name, string symbol);
+    event ConsortiumChanged(address indexed prevVal, address indexed newVal);
+    event TreasuryAddressChanged(
+        address indexed prevValue,
+        address indexed newValue
+    );
+    event BurnCommissionChanged(
+        uint64 indexed prevValue,
+        uint64 indexed newValue
+    );
+    event DustFeeRateChanged(uint256 indexed oldRate, uint256 indexed newRate);
+    event BasculeChanged(address indexed prevVal, address indexed newVal);
+    event MinterUpdated(address indexed minter, bool isMinter);
+    event BridgeChanged(address indexed prevVal, address indexed newVal);
+    event ClaimerUpdated(address indexed claimer, bool isClaimer);
+    event FeeCharged(uint256 indexed fee, bytes userSignature);
+    event FeeChanged(uint256 indexed oldFee, uint256 indexed newFee);
+    error FeeGreaterThanAmount();
+
+    event MintProofConsumed(
+        address indexed recipient,
+        bytes32 indexed payloadHash,
+        bytes payload
+    );
+
+    function burn(uint256 amount) external;
+    function burn(address from, uint256 amount) external;
+    function mint(address to, uint256 amount) external;
+}
diff --git a/contracts/src/v0.8/ccip/pools/LBTC/INotaryConsortium.sol b/contracts/src/v0.8/ccip/pools/LBTC/INotaryConsortium.sol
new file mode 100644
index 0000000000..6f493a3c9d
--- /dev/null
+++ b/contracts/src/v0.8/ccip/pools/LBTC/INotaryConsortium.sol
@@ -0,0 +1,46 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.24;
+
+import {ECDSA} from "../../../vendor/openzeppelin-solidity/v5.0.2/contracts/utils/cryptography/ECDSA.sol";
+
+interface INotaryConsortium {
+    /// @dev Error thrown when signature payload is already used
+    error PayloadAlreadyUsed();
+
+    /// @dev Error thrown when signatures length is not equal to signers length
+    error LengthMismatch();
+
+    /// @dev Error thrown when there are not enough signatures
+    error NotEnoughSignatures();
+
+    /// @dev Error thrown when ECDSA signature verification fails
+    error SignatureVerificationFailed(uint256 sigIndx, ECDSA.RecoverError err);
+
+    /// @dev Error thrown when signature verification fails
+    error WrongSignatureReceived(bytes sig);
+
+    /// @dev Error thrown when unexpected action is used
+    error UnexpectedAction(bytes4 action);
+
+    /// @dev Event emitted when the validator set is updated
+    event ValidatorSetUpdated(
+        uint256 indexed epoch,
+        address[] validators,
+        uint256[] weights,
+        uint256 threshold
+    );
+
+    /// @dev Error thrown when validator set already set
+    error ValSetAlreadySet();
+
+    /// @dev Error thrown when no validator set is set
+    error NoValidatorSet();
+
+    /// @dev Error thrown when invalid epoch is provided
+    error InvalidEpoch();
+
+    function checkProof(
+        bytes32 _payloadHash,
+        bytes calldata _proof
+    ) external view;
+}
diff --git a/contracts/src/v0.8/ccip/pools/LBTC/adapters/AbstractAdapter.sol b/contracts/src/v0.8/ccip/pools/LBTC/adapters/AbstractAdapter.sol
new file mode 100644
index 0000000000..3d657a529a
--- /dev/null
+++ b/contracts/src/v0.8/ccip/pools/LBTC/adapters/AbstractAdapter.sol
@@ -0,0 +1,97 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.24;
+
+import {IAdapter} from "./IAdapter.sol";
+import {Context} from "../../../../vendor/openzeppelin-solidity/v5.0.2/contracts/utils/Context.sol";
+import {IBridge, ILBTC} from "../IBridge.sol";
+/**
+ * @title Abstract bridge adapter
+ * @author Lombard.finance
+ * @notice Implements basic communication with Bridge contract.
+ * Should be extended with business logic of bridging protocols (e.g. CCIP, LayerZero).
+ */
+abstract contract AbstractAdapter is IAdapter, Context {
+    error Adapter_ZeroAddress();
+
+    error NotBridge();
+
+    event BridgeChanged(IBridge indexed oldBridge, IBridge indexed newBridge);
+
+    IBridge public override bridge;
+
+    constructor(IBridge bridge_) {
+        bridge = bridge_;
+    }
+
+    function lbtc() public view returns (ILBTC) {
+        return bridge.lbtc();
+    }
+
+    /// MODIFIERS ///
+
+    modifier onlyBridge() {
+        _onlyBridge();
+        _;
+    }
+
+    /// ONLY OWNER FUNCTIONS ///
+
+    /**
+     * @notice Change the bridge address
+     * @param bridge_ New bridge address
+     */
+    function changeBridge(IBridge bridge_) external {
+        _onlyOwner();
+        _notZero(address(bridge_));
+
+        IBridge oldBridge = bridge;
+        bridge = bridge_;
+        emit BridgeChanged(oldBridge, bridge_);
+    }
+
+    /// PRIVATE FUNCTIONS ///
+
+    function _onlyOwner() internal view virtual;
+
+    function _onlyBridge() internal view {
+        if (_msgSender() != address(bridge)) {
+            revert NotBridge();
+        }
+    }
+
+    function _notZero(address addr) internal pure {
+        if (addr == address(0)) {
+            revert Adapter_ZeroAddress();
+        }
+    }
+
+    /**
+     * @dev Called when data is received.
+     */
+    function _receive(bytes32 fromChain, bytes memory payload) internal {
+        bridge.receivePayload(fromChain, payload);
+    }
+
+    /**
+     * @notice Sends a payload from the source to destination chain.
+     * @param _toChain Destination chain's.
+     * @param _payload The payload to send.
+     * @param _refundAddress Address where refund fee
+     */
+    function _deposit(
+        bytes32 _toChain,
+        bytes memory _payload,
+        address _refundAddress
+    ) internal virtual {}
+
+    function deposit(
+        address _fromAddress,
+        bytes32 _toChain,
+        bytes32 /* _toContract */,
+        bytes32 /* _toAddress */,
+        uint256 /* _amount */,
+        bytes memory _payload
+    ) external payable virtual override {
+        _deposit(_toChain, _payload, _fromAddress);
+    }
+}
diff --git a/contracts/src/v0.8/ccip/pools/LBTC/adapters/CLAdapter.sol b/contracts/src/v0.8/ccip/pools/LBTC/adapters/CLAdapter.sol
new file mode 100644
index 0000000000..c5b10a5cd0
--- /dev/null
+++ b/contracts/src/v0.8/ccip/pools/LBTC/adapters/CLAdapter.sol
@@ -0,0 +1,262 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.24;
+
+import {IERC20} from "../../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/ERC20.sol";
+import {IRouterClient} from "../../../interfaces/IRouterClient.sol";
+import {Client} from "../../../libraries/Client.sol";
+import {AbstractAdapter} from "./AbstractAdapter.sol";
+import {IBridge} from "../IBridge.sol";
+import {Pool} from "../../../libraries/Pool.sol";
+import {LombardTokenPool} from "./LombardTokenPool.sol";
+import {Ownable} from "../../../../vendor/openzeppelin-solidity/v5.0.2/contracts/access/Ownable.sol";
+
+/**
+ * @title CCIP bridge adapter
+ * @author Lombard.finance
+ * @notice CLAdapter present an intermediary to enforce TokenPool compatibility
+ */
+contract CLAdapter is AbstractAdapter, Ownable {
+    error CLZeroChain();
+    error CLZeroChanSelector();
+    error CLAttemptToOverrideChainSelector();
+    error CLAttemptToOverrideChain();
+    error CLRefundFailed(address, uint256);
+    error CLUnauthorizedTokenPool(address);
+    error ZeroPayload();
+
+    event CLChainSelectorSet(bytes32, uint64);
+    event CLTokenPoolDeployed(address);
+
+    mapping(bytes32 => uint64) public getRemoteChainSelector;
+    mapping(uint64 => bytes32) public getChain;
+    uint128 public getExecutionGasLimit;
+    LombardTokenPool public tokenPool; // 1-to-1 with adapter
+
+    // store last state
+    uint256 internal _lastBurnedAmount;
+    bytes internal _lastPayload;
+
+    /// @notice msg.sender gets the ownership of the contract given
+    /// token pool implementation
+    constructor(
+        IBridge bridge_,
+        uint128 executionGasLimit_,
+        //
+        address ccipRouter_,
+        address[] memory allowlist_,
+        address rmnProxy_,
+        bool attestationEnable_
+    ) AbstractAdapter(bridge_) Ownable() {
+        _setExecutionGasLimit(executionGasLimit_);
+
+        tokenPool = new LombardTokenPool(
+            IERC20(address(bridge_.lbtc())),
+            ccipRouter_,
+            allowlist_,
+            rmnProxy_,
+            CLAdapter(this),
+            attestationEnable_
+        );
+        tokenPool.transferOwnership(_msgSender());
+        emit CLTokenPoolDeployed(address(tokenPool));
+    }
+
+    /// USER ACTIONS ///
+
+    function getFee(
+        bytes32 _toChain,
+        bytes32,
+        bytes32 _toAddress,
+        uint256 _amount,
+        bytes memory _payload
+    ) public view override returns (uint256) {
+        return
+            IRouterClient(tokenPool.getRouter()).getFee(
+                getRemoteChainSelector[_toChain],
+                _buildCCIPMessage(
+                    abi.encodePacked(_toAddress),
+                    _amount,
+                    _payload
+                )
+            );
+    }
+
+    function initiateDeposit(
+        uint64 remoteChainSelector,
+        bytes calldata receiver,
+        uint256 amount
+    ) external returns (uint256 lastBurnedAmount, bytes memory lastPayload) {
+        _onlyTokenPool();
+
+        if (_lastPayload.length > 0) {
+            // just return if already initiated
+            lastBurnedAmount = _lastBurnedAmount;
+            lastPayload = _lastPayload;
+            _lastPayload = new bytes(0);
+            _lastBurnedAmount = 0;
+        } else {
+            IERC20(address(lbtc())).approve(address(bridge), amount);
+            (lastBurnedAmount, lastPayload) = bridge.deposit(
+                getChain[remoteChainSelector],
+                bytes32(receiver),
+                uint64(amount)
+            );
+        }
+
+        bridge.lbtc().burn(lastBurnedAmount);
+    }
+
+    function deposit(
+        address fromAddress,
+        bytes32 _toChain,
+        bytes32,
+        bytes32 _toAddress,
+        uint256 _amount,
+        bytes memory _payload
+    ) external payable virtual override {
+        // if deposit was initiated by adapter do nothing
+        if (fromAddress == address(this)) {
+            return;
+        }
+
+        _lastBurnedAmount = _amount;
+        _lastPayload = _payload;
+
+        uint64 chainSelector = getRemoteChainSelector[_toChain];
+
+        Client.EVM2AnyMessage memory message = _buildCCIPMessage(
+            abi.encodePacked(_toAddress),
+            _amount,
+            _payload
+        );
+
+        address router = tokenPool.getRouter();
+
+        uint256 fee = IRouterClient(router).getFee(chainSelector, message);
+
+        if (msg.value < fee) {
+            revert NotEnoughToPayFee(fee);
+        }
+        if (msg.value > fee) {
+            uint256 refundAm = msg.value - fee;
+            (bool success, ) = payable(fromAddress).call{value: refundAm}("");
+            if (!success) {
+                revert CLRefundFailed(fromAddress, refundAm);
+            }
+        }
+
+        IERC20(address(lbtc())).approve(router, _amount);
+        IRouterClient(router).ccipSend{value: fee}(chainSelector, message);
+    }
+
+    /// @dev same as `initiateWithdrawal` but without signatures opted in data
+    function initWithdrawalNoSignatures(
+        uint64 remoteSelector,
+        bytes calldata onChainData
+    ) external returns (uint64) {
+        _onlyTokenPool();
+
+        _receive(getChain[remoteSelector], onChainData);
+        return bridge.withdraw(onChainData);
+    }
+
+    function initiateWithdrawal(
+        uint64 remoteSelector,
+        bytes calldata offChainData
+    ) external returns (uint64) {
+        _onlyTokenPool();
+
+        (bytes memory payload, bytes memory proof) = abi.decode(
+            offChainData,
+            (bytes, bytes)
+        );
+
+        _receive(getChain[remoteSelector], payload);
+        bridge.authNotary(payload, proof);
+        return bridge.withdraw(payload);
+    }
+
+    /// ONLY OWNER FUNCTIONS ///
+
+    function setExecutionGasLimit(uint128 newVal) external onlyOwner {
+        _setExecutionGasLimit(newVal);
+    }
+
+    /// PRIVATE FUNCTIONS ///
+
+    function _buildCCIPMessage(
+        bytes memory _receiver,
+        uint256 _amount,
+        bytes memory _payload
+    ) private view returns (Client.EVM2AnyMessage memory) {
+        // Set the token amounts
+        Client.EVMTokenAmount[]
+            memory tokenAmounts = new Client.EVMTokenAmount[](1);
+        tokenAmounts[0] = Client.EVMTokenAmount({
+            token: address(bridge.lbtc()),
+            amount: _amount
+        });
+
+        bytes memory data;
+        if (!tokenPool.isAttestationEnabled()) {
+            // we should send payload if not attestations expected
+            if (_payload.length == 0) {
+                revert ZeroPayload();
+            }
+            data = _payload;
+        }
+
+        return
+            Client.EVM2AnyMessage({
+                receiver: _receiver,
+                data: data,
+                tokenAmounts: tokenAmounts,
+                extraArgs: Client._argsToBytes(
+                    Client.EVMExtraArgsV2({
+                        gasLimit: getExecutionGasLimit,
+                        allowOutOfOrderExecution: true
+                    })
+                ),
+                feeToken: address(0) // let's pay with native tokens
+            });
+    }
+
+    function _onlyOwner() internal view override onlyOwner {}
+
+    function _onlyTokenPool() internal view {
+        if (address(tokenPool) != _msgSender()) {
+            revert CLUnauthorizedTokenPool(_msgSender());
+        }
+    }
+
+    function _setExecutionGasLimit(uint128 newVal) internal {
+        emit ExecutionGasLimitSet(getExecutionGasLimit, newVal);
+        getExecutionGasLimit = newVal;
+    }
+
+    /**
+     * @notice Allows owner set chain selector for chain id
+     * @param chain ABI encoded chain id
+     * @param chainSelector Chain selector of chain id (https://docs.chain.link/ccip/directory/testnet/chain/)
+     */
+    function setRemoteChainSelector(
+        bytes32 chain,
+        uint64 chainSelector
+    ) external onlyOwner {
+        if (chain == bytes32(0)) {
+            revert CLZeroChain();
+        }
+        if (chainSelector == 0) {
+            revert CLZeroChain();
+        }
+        if (getRemoteChainSelector[chain] != 0) {
+            revert CLAttemptToOverrideChainSelector();
+        }
+        if (getChain[chainSelector] != bytes32(0)) {
+            revert CLAttemptToOverrideChain();
+        }
+        getRemoteChainSelector[chain] = chainSelector;
+        getChain[chainSelector] = chain;
+        emit CLChainSelectorSet(chain, chainSelector);
+    }
+}
diff --git a/contracts/src/v0.8/ccip/pools/LBTC/adapters/IAdapter.sol b/contracts/src/v0.8/ccip/pools/LBTC/adapters/IAdapter.sol
new file mode 100644
index 0000000000..7deac1acf0
--- /dev/null
+++ b/contracts/src/v0.8/ccip/pools/LBTC/adapters/IAdapter.sol
@@ -0,0 +1,28 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.24;
+
+import {IBridge} from "../IBridge.sol";
+
+interface IAdapter {
+    /// @notice Thrown when msg.value is not enough to pay CCIP fee.
+    error NotEnoughToPayFee(uint256 fee);
+
+    event ExecutionGasLimitSet(uint128 indexed prevVal, uint128 indexed newVal);
+
+    function bridge() external view returns (IBridge);
+    function getFee(
+        bytes32 _toChain,
+        bytes32 _toContract,
+        bytes32 _toAddress,
+        uint256 _amount,
+        bytes memory _payload
+    ) external view returns (uint256);
+    function deposit(
+        address _fromAddress,
+        bytes32 _toChain,
+        bytes32 _toContract,
+        bytes32 _toAddress,
+        uint256 _amount,
+        bytes memory _payload
+    ) external payable;
+}
diff --git a/contracts/src/v0.8/ccip/pools/LBTC/adapters/LombardTokenPool.sol b/contracts/src/v0.8/ccip/pools/LBTC/adapters/LombardTokenPool.sol
new file mode 100644
index 0000000000..ee4ee9a9ca
--- /dev/null
+++ b/contracts/src/v0.8/ccip/pools/LBTC/adapters/LombardTokenPool.sol
@@ -0,0 +1,87 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.24;
+
+import {IERC20} from "../../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol";
+import {IRouterClient} from "../../../interfaces/IRouterClient.sol";
+import {Client} from "../../../libraries/Client.sol";
+import {IBridge} from "../IBridge.sol";
+import {Pool} from "../../../libraries/Pool.sol";
+import {TokenPool} from "../../TokenPool.sol";
+import {CLAdapter} from "./CLAdapter.sol";
+
+contract LombardTokenPool is TokenPool {
+    CLAdapter public adapter;
+    bool public isAttestationEnabled;
+
+    /// @notice msg.sender gets the ownership of the contract given
+    /// token pool implementation
+    constructor(
+        IERC20 lbtc_,
+        address ccipRouter_,
+        address[] memory allowlist_,
+        address rmnProxy_,
+        CLAdapter adapter_,
+        bool attestationEnable_
+    ) TokenPool(lbtc_, 8, allowlist_, rmnProxy_, ccipRouter_) {
+        adapter = adapter_;
+        isAttestationEnabled = attestationEnable_;
+    }
+
+    /// @notice Burn the token in the pool
+    /// @dev The _validateLockOrBurn check is an essential security check
+    function lockOrBurn(
+        Pool.LockOrBurnInV1 calldata lockOrBurnIn
+    ) external virtual override returns (Pool.LockOrBurnOutV1 memory) {
+        _validateLockOrBurn(lockOrBurnIn);
+
+        // send out to burn
+        i_token.transfer(address(adapter), lockOrBurnIn.amount);
+        (uint256 burnedAmount, bytes memory payload) = adapter.initiateDeposit(
+            lockOrBurnIn.remoteChainSelector,
+            lockOrBurnIn.receiver,
+            lockOrBurnIn.amount
+        );
+
+        emit Burned(lockOrBurnIn.originalSender, burnedAmount);
+
+        bytes memory destPoolData;
+        if (isAttestationEnabled) {
+            destPoolData = abi.encode(sha256(payload));
+        } else {
+            destPoolData = payload;
+        }
+
+        return
+            Pool.LockOrBurnOutV1({
+                destTokenAddress: getRemoteToken(
+                    lockOrBurnIn.remoteChainSelector
+                ),
+                destPoolData: destPoolData
+            });
+    }
+
+    /// @notice Mint tokens from the pool to the recipient
+    /// @dev The _validateReleaseOrMint check is an essential security check
+    function releaseOrMint(
+        Pool.ReleaseOrMintInV1 calldata releaseOrMintIn
+    ) external virtual override returns (Pool.ReleaseOrMintOutV1 memory) {
+        _validateReleaseOrMint(releaseOrMintIn);
+
+        uint64 amount;
+        if (isAttestationEnabled) {
+            amount = adapter.initiateWithdrawal(
+                releaseOrMintIn.remoteChainSelector,
+                releaseOrMintIn.offchainTokenData
+            );
+        } else {
+            amount = adapter.initWithdrawalNoSignatures(
+                releaseOrMintIn.remoteChainSelector,
+                releaseOrMintIn.sourcePoolData
+            );
+        }
+
+        emit Minted(msg.sender, releaseOrMintIn.receiver, uint256(amount));
+
+        return Pool.ReleaseOrMintOutV1({destinationAmount: uint256(amount)});
+    }
+}
diff --git a/core/gethwrappers/ccip/generated/lbtc_adapter/lbtc_adapter.go b/core/gethwrappers/ccip/generated/lbtc_adapter/lbtc_adapter.go
new file mode 100644
index 0000000000..f7a4b643f1
--- /dev/null
+++ b/core/gethwrappers/ccip/generated/lbtc_adapter/lbtc_adapter.go
@@ -0,0 +1,1211 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package lbtc_adapter
+
+import (
+	"errors"
+	"fmt"
+	"math/big"
+	"strings"
+
+	ethereum "github.com/ethereum/go-ethereum"
+	"github.com/ethereum/go-ethereum/accounts/abi"
+	"github.com/ethereum/go-ethereum/accounts/abi/bind"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/event"
+	"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated"
+)
+
+var (
+	_ = errors.New
+	_ = big.NewInt
+	_ = strings.NewReader
+	_ = ethereum.NotFound
+	_ = bind.Bind
+	_ = common.Big1
+	_ = types.BloomLookup
+	_ = event.NewSubscription
+	_ = abi.ConvertType
+)
+
+var CLAdapterMetaData = &bind.MetaData{
+	ABI: "[{\"inputs\":[{\"internalType\":\"contractIBridge\",\"name\":\"bridge_\",\"type\":\"address\"},{\"internalType\":\"uint128\",\"name\":\"executionGasLimit_\",\"type\":\"uint128\"},{\"internalType\":\"address\",\"name\":\"ccipRouter_\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"allowlist_\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"rmnProxy_\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"attestationEnable_\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"Adapter_ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CLAttemptToOverrideChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CLAttemptToOverrideChainSelector\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"CLRefundFailed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"CLUnauthorizedTokenPool\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CLZeroChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CLZeroChanSelector\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotBridge\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"}],\"name\":\"NotEnoughToPayFee\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroPayload\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contractIBridge\",\"name\":\"oldBridge\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"contractIBridge\",\"name\":\"newBridge\",\"type\":\"address\"}],\"name\":\"BridgeChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"CLChainSelectorSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"CLTokenPoolDeployed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint128\",\"name\":\"prevVal\",\"type\":\"uint128\"},{\"indexed\":true,\"internalType\":\"uint128\",\"name\":\"newVal\",\"type\":\"uint128\"}],\"name\":\"ExecutionGasLimitSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"bridge\",\"outputs\":[{\"internalType\":\"contractIBridge\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractIBridge\",\"name\":\"bridge_\",\"type\":\"address\"}],\"name\":\"changeBridge\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"fromAddress\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"_toChain\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_toAddress\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_payload\",\"type\":\"bytes\"}],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"getChain\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getExecutionGasLimit\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_toChain\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_toAddress\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_payload\",\"type\":\"bytes\"}],\"name\":\"getFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"getRemoteChainSelector\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"onChainData\",\"type\":\"bytes\"}],\"name\":\"initWithdrawalNoSignatures\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"initiateDeposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"lastBurnedAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"lastPayload\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offChainData\",\"type\":\"bytes\"}],\"name\":\"initiateWithdrawal\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lbtc\",\"outputs\":[{\"internalType\":\"contractILBTC\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint128\",\"name\":\"newVal\",\"type\":\"uint128\"}],\"name\":\"setExecutionGasLimit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"chain\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"setRemoteChainSelector\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tokenPool\",\"outputs\":[{\"internalType\":\"contractLombardTokenPool\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
+	Bin: "0x60806040523480156200001157600080fd5b5060405162006e3c38038062006e3c8339810160408190526200003491620002f5565b600080546001600160a01b0319166001600160a01b038816179055620000616200005b3390565b620001e7565b6200006c8562000239565b856001600160a01b03166368b3c9106040518163ffffffff1660e01b8152600401602060405180830381865afa158015620000ab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000d191906200043a565b8484843085604051620000e49062000295565b620000f59695949392919062000461565b604051809103906000f08015801562000112573d6000803e3d6000fd5b50600580546001600160a01b0319166001600160a01b0392909216918217905563f2fde38b6200013f3390565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b1580156200018157600080fd5b505af115801562000196573d6000803e3d6000fd5b50506005546040516001600160a01b0390911681527f45163ba2f75e282ba1000a5e166237acb454fa6b2b4cc778671bf977a01b13b49250602001905060405180910390a1505050505050620004df565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6004546040516001600160801b038084169216907f45a4a024e3d155ab5b1634193775d00d4cbf4ef295e76d0bf1aa6dfeb114dd8490600090a3600480546001600160801b0319166001600160801b0392909216919091179055565b6146dd806200275f83390190565b6001600160a01b0381168114620002b957600080fd5b50565b8051620002c981620002a3565b919050565b634e487b7160e01b600052604160045260246000fd5b80518015158114620002c957600080fd5b60008060008060008060c087890312156200030f57600080fd5b86516200031c81620002a3565b602088810151919750906001600160801b03811681146200033c57600080fd5b60408901519096506200034f81620002a3565b60608901519095506001600160401b03808211156200036d57600080fd5b818a0191508a601f8301126200038257600080fd5b815181811115620003975762000397620002ce565b8060051b604051601f19603f83011681018181108582111715620003bf57620003bf620002ce565b60405291825284820192508381018501918d831115620003de57600080fd5b938501935b828510156200040757620003f785620002bc565b84529385019392850192620003e3565b8098505050505050506200041e60808801620002bc565b91506200042e60a08801620002e4565b90509295509295509295565b6000602082840312156200044d57600080fd5b81516200045a81620002a3565b9392505050565b600060c0820160018060a01b03808a1684526020818a16602086015260c0604086015282895180855260e08701915060208b01945060005b81811015620004b957855185168352948301949183019160010162000499565b50509782166060860152509490941660808301525090151560a090910152509392505050565b61227080620004ef6000396000f3fe60806040526004361061010e5760003560e01c8063715886c4116100a5578063a1a6d50811610074578063e240550d11610059578063e240550d14610377578063e78cea9214610397578063f2fde38b146103c457600080fd5b8063a1a6d5081461031c578063b1ab7e221461035757600080fd5b8063715886c41461025d578063775710d4146102705780638da5cb5b146102a757806392b0680a146102d257600080fd5b80635391a405116100e15780635391a405146101e5578063550e7ab21461020557806368b3c91014610233578063715018a61461024857600080fd5b806308774410146101135780630c373d7414610135578063104e992914610173578063453bb95c146101c5575b600080fd5b34801561011f57600080fd5b5061013361012e3660046118be565b6103e4565b005b34801561014157600080fd5b50610155610150366004611941565b61046a565b60405167ffffffffffffffff90911681526020015b60405180910390f35b34801561017f57600080fd5b506005546101a09073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161016a565b3480156101d157600080fd5b506101336101e0366004611996565b61057e565b3480156101f157600080fd5b50610155610200366004611941565b610731565b34801561021157600080fd5b506102256102203660046119c6565b6108a0565b60405161016a929190611a90565b34801561023f57600080fd5b506101a0610c47565b34801561025457600080fd5b50610133610cde565b61013361026b366004611bc3565b610cf2565b34801561027c57600080fd5b5061015561028b366004611c38565b60026020526000908152604090205467ffffffffffffffff1681565b3480156102b357600080fd5b5060015473ffffffffffffffffffffffffffffffffffffffff166101a0565b3480156102de57600080fd5b506004546102fb906fffffffffffffffffffffffffffffffff1681565b6040516fffffffffffffffffffffffffffffffff909116815260200161016a565b34801561032857600080fd5b50610349610337366004611c51565b60036020526000908152604090205481565b60405190815260200161016a565b34801561036357600080fd5b50610349610372366004611c6e565b6110d8565b34801561038357600080fd5b50610133610392366004611cd2565b61122d565b3480156103a357600080fd5b506000546101a09073ffffffffffffffffffffffffffffffffffffffff1681565b3480156103d057600080fd5b506101336103df3660046118be565b611241565b6103ec6112f5565b6103f5816112fd565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917fd565484d693f5157abcceb853139678038bc740991b0a4dc3baa2426325bb3c09190a35050565b600061047461134a565b6104db600360008667ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000205484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061139d92505050565b6000546040517f0968f26400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690630968f264906105339086908690600401611d04565b6020604051808303816000875af1158015610552573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105769190611d51565b949350505050565b610586611423565b816105bd576040517fe531cb7300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff16600003610601576040517fe531cb7300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526002602052604090205467ffffffffffffffff1615610651576040517fb72f782a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8116600090815260036020526040902054156106a2576040517fe95ca6dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260026020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff861690811790915580845260038352928190208590558051858152918201929092527f61805347ac73c642ed5bfbc228e1702a4d51591b36a35387250de0c0d75b0072910160405180910390a15050565b600061073b61134a565b60008061074a84860186611d6e565b67ffffffffffffffff88166000908152600360205260409020549193509150610773908361139d565b6000546040517f6b93aa5100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690636b93aa51906107cb9085908590600401611dd2565b600060405180830381600087803b1580156107e557600080fd5b505af11580156107f9573d6000803e3d6000fd5b50506000546040517f0968f26400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169250630968f2649150610853908590600401611e00565b6020604051808303816000875af1158015610872573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108969190611d51565b9695505050505050565b600060606108ac61134a565b6000600780546108bb90611e13565b905011156109a2576006549150600780546108d590611e13565b80601f016020809104026020016040519081016040528092919081815260200182805461090190611e13565b801561094e5780601f106109235761010080835404028352916020019161094e565b820191906000526020600020905b81548152906001019060200180831161093157829003601f168201915b509394506000935061095f92505050565b6040519080825280601f01601f191660200182016040528015610989576020820181803683370190505b506007906109979082611eb3565b506000600655610b43565b6109aa610c47565b6000546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201526024810186905291169063095ea7b3906044016020604051808303816000875af1158015610a22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a469190611fcd565b506000805467ffffffffffffffff88168252600360205260409091205473ffffffffffffffffffffffffffffffffffffffff909116906383031c4190610a8c8789611fef565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526004810192909252602482015267ffffffffffffffff861660448201526064016000604051808303816000875af1158015610af7573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610b3d919081019061202c565b90925090505b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166368b3c9106040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd291906120af565b73ffffffffffffffffffffffffffffffffffffffff166342966c68836040518263ffffffff1660e01b8152600401610c0c91815260200190565b600060405180830381600087803b158015610c2657600080fd5b505af1158015610c3a573d6000803e3d6000fd5b5050505094509492505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166368b3c9106040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd991906120af565b905090565b610ce6611423565b610cf060006114a4565b565b73ffffffffffffffffffffffffffffffffffffffff861630146110d05760068290556007610d208282611eb3565b50600085815260026020908152604080832054815192830187905267ffffffffffffffff169291610d629101604051602081830303815290604052858561151b565b90506000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b0f479a16040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df791906120af565b905060008173ffffffffffffffffffffffffffffffffffffffff166320487ded85856040518363ffffffff1660e01b8152600401610e369291906120cc565b602060405180830381865afa158015610e53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e7791906121e1565b905080341015610ebb576040517faf09dec9000000000000000000000000000000000000000000000000000000008152600481018290526024015b60405180910390fd5b80341115610f8d576000610ecf82346121fa565b905060008b73ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114610f2b576040519150601f19603f3d011682016040523d82523d6000602084013e610f30565b606091505b5050905080610f8a576040517f9bb3185e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8d16600482015260248101839052604401610eb2565b50505b610f95610c47565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260248201899052919091169063095ea7b3906044016020604051808303816000875af115801561100c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110309190611fcd565b506040517f96f4e9f900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316906396f4e9f990839061108790889088906004016120cc565b60206040518083038185885af11580156110a5573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906110ca91906121e1565b50505050505b505050505050565b600554604080517fb0f479a1000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163b0f479a19160048083019260209291908290030181865afa158015611148573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116c91906120af565b60008781526002602090815260409182902054825191820188905273ffffffffffffffffffffffffffffffffffffffff93909316926320487ded9267ffffffffffffffff909116916111cf9101604051602081830303815290604052878761151b565b6040518363ffffffff1660e01b81526004016111ec9291906120cc565b602060405180830381865afa158015611209573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089691906121e1565b611235611423565b61123e81611816565b50565b611249611423565b73ffffffffffffffffffffffffffffffffffffffff81166112ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610eb2565b61123e816114a4565b610cf0611423565b73ffffffffffffffffffffffffffffffffffffffff811661123e576040517fcf891a8700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055473ffffffffffffffffffffffffffffffffffffffff163314610cf0576040517f36b0b92e000000000000000000000000000000000000000000000000000000008152336004820152602401610eb2565b6000546040517f8783f52500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690638783f525906113f59085908590600401611a90565b600060405180830381600087803b15801561140f57600080fd5b505af11580156110d0573d6000803e3d6000fd5b60015473ffffffffffffffffffffffffffffffffffffffff163314610cf0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610eb2565b6001805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6115636040518060a00160405280606081526020016060815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001606081525090565b604080516001808252818301909252600091816020015b604080518082019091526000808252602082015281526020019060019003908161157a575050604080518082018083526000547f68b3c91000000000000000000000000000000000000000000000000000000000909152915192935091829173ffffffffffffffffffffffffffffffffffffffff16906368b3c910906044808501916020918187030181865afa158015611618573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163c91906120af565b73ffffffffffffffffffffffffffffffffffffffff168152602001858152508160008151811061166e5761166e612234565b60200260200101819052506060600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166355b961566040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061170c9190611fcd565b61174e57835160000361174b576040517ff3cc293900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50825b6040805160a081018252878152602080820184905281830185905260006060830152825180840184526004546fffffffffffffffffffffffffffffffff1680825260019183019182528451602481019190915290511515604480830191909152845180830390910181526064909101909352820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f181dcf10000000000000000000000000000000000000000000000000000000001790529060808201529695505050505050565b6004546040516fffffffffffffffffffffffffffffffff8084169216907f45a4a024e3d155ab5b1634193775d00d4cbf4ef295e76d0bf1aa6dfeb114dd8490600090a3600480547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff92909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff8116811461123e57600080fd5b6000602082840312156118d057600080fd5b81356118db8161189c565b9392505050565b67ffffffffffffffff8116811461123e57600080fd5b60008083601f84011261190a57600080fd5b50813567ffffffffffffffff81111561192257600080fd5b60208301915083602082850101111561193a57600080fd5b9250929050565b60008060006040848603121561195657600080fd5b8335611961816118e2565b9250602084013567ffffffffffffffff81111561197d57600080fd5b611989868287016118f8565b9497909650939450505050565b600080604083850312156119a957600080fd5b8235915060208301356119bb816118e2565b809150509250929050565b600080600080606085870312156119dc57600080fd5b84356119e7816118e2565b9350602085013567ffffffffffffffff811115611a0357600080fd5b611a0f878288016118f8565b9598909750949560400135949350505050565b60005b83811015611a3d578181015183820152602001611a25565b50506000910152565b60008151808452611a5e816020860160208601611a22565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b8281526040602082015260006105766040830184611a46565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611b1f57611b1f611aa9565b604052919050565b600067ffffffffffffffff821115611b4157611b41611aa9565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112611b7e57600080fd5b8135611b91611b8c82611b27565b611ad8565b818152846020838601011115611ba657600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215611bdc57600080fd5b8635611be78161189c565b95506020870135945060408701359350606087013592506080870135915060a087013567ffffffffffffffff811115611c1f57600080fd5b611c2b89828a01611b6d565b9150509295509295509295565b600060208284031215611c4a57600080fd5b5035919050565b600060208284031215611c6357600080fd5b81356118db816118e2565b600080600080600060a08688031215611c8657600080fd5b85359450602086013593506040860135925060608601359150608086013567ffffffffffffffff811115611cb957600080fd5b611cc588828901611b6d565b9150509295509295909350565b600060208284031215611ce457600080fd5b81356fffffffffffffffffffffffffffffffff811681146118db57600080fd5b60208152816020820152818360408301376000818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b600060208284031215611d6357600080fd5b81516118db816118e2565b60008060408385031215611d8157600080fd5b823567ffffffffffffffff80821115611d9957600080fd5b611da586838701611b6d565b93506020850135915080821115611dbb57600080fd5b50611dc885828601611b6d565b9150509250929050565b604081526000611de56040830185611a46565b8281036020840152611df78185611a46565b95945050505050565b6020815260006118db6020830184611a46565b600181811c90821680611e2757607f821691505b602082108103611e60577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f821115611eae576000816000526020600020601f850160051c81016020861015611e8f5750805b601f850160051c820191505b818110156110d057828155600101611e9b565b505050565b815167ffffffffffffffff811115611ecd57611ecd611aa9565b611ee181611edb8454611e13565b84611e66565b602080601f831160018114611f345760008415611efe5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556110d0565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015611f8157888601518255948401946001909101908401611f62565b5085821015611fbd57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215611fdf57600080fd5b815180151581146118db57600080fd5b80356020831015612026577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff602084900360031b1b165b92915050565b6000806040838503121561203f57600080fd5b82519150602083015167ffffffffffffffff81111561205d57600080fd5b8301601f8101851361206e57600080fd5b805161207c611b8c82611b27565b81815286602083850101111561209157600080fd5b6120a2826020830160208601611a22565b8093505050509250929050565b6000602082840312156120c157600080fd5b81516118db8161189c565b6000604067ffffffffffffffff851683526020604081850152845160a060408601526120fb60e0860182611a46565b9050818601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808784030160608801526121368383611a46565b6040890151888203830160808a01528051808352908601945060009350908501905b80841015612197578451805173ffffffffffffffffffffffffffffffffffffffff16835286015186830152938501936001939093019290860190612158565b50606089015173ffffffffffffffffffffffffffffffffffffffff1660a08901526080890151888203830160c08a015295506121d38187611a46565b9a9950505050505050505050565b6000602082840312156121f357600080fd5b5051919050565b81810381811115612026577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea164736f6c6343000818000a6101006040523480156200001257600080fd5b50604051620046dd380380620046dd8339810160408190526200003591620005d1565b856008858588336000816200005d57604051639b15e16f60e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0384811691909117909155811615620000905762000090816200021b565b50506001600160a01b0385161580620000b057506001600160a01b038116155b80620000c357506001600160a01b038216155b15620000e2576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b03808616608081905290831660c0526040805163313ce56760e01b8152905163313ce567916004808201926020929091908290030181865afa92505050801562000152575060408051601f3d908101601f191682019092526200014f9181019062000708565b60015b1562000192578060ff168560ff161462000190576040516332ad3e0760e11b815260ff80871660048301528216602482015260440160405180910390fd5b505b60ff841660a052600480546001600160a01b0319166001600160a01b038316179055825115801560e052620001dc57604080516000815260208101909152620001dc908462000295565b5050600a8054941515600160a01b026001600160a81b03199095166001600160a01b039096169590951793909317909355506200078295505050505050565b336001600160a01b038216036200024557604051636d6c4ee560e11b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b03838116918217835560015460405192939116917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60e051620002b6576040516335f4a7b360e01b815260040160405180910390fd5b60005b825181101562000341576000838281518110620002da57620002da62000734565b60209081029190910101519050620002f4600282620003f2565b1562000337576040516001600160a01b03821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b50600101620002b9565b5060005b8151811015620003ed57600082828151811062000366576200036662000734565b6020026020010151905060006001600160a01b0316816001600160a01b031603620003925750620003e4565b6200039f60028262000412565b15620003e2576040516001600160a01b03821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b60010162000345565b505050565b600062000409836001600160a01b03841662000429565b90505b92915050565b600062000409836001600160a01b0384166200052d565b6000818152600183016020526040812054801562000522576000620004506001836200074a565b855490915060009062000466906001906200074a565b9050808214620004d25760008660000182815481106200048a576200048a62000734565b9060005260206000200154905080876000018481548110620004b057620004b062000734565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080620004e657620004e66200076c565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506200040c565b60009150506200040c565b600081815260018301602052604081205462000576575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556200040c565b5060006200040c565b6001600160a01b03811681146200059557600080fd5b50565b8051620005a5816200057f565b919050565b634e487b7160e01b600052604160045260246000fd5b80518015158114620005a557600080fd5b60008060008060008060c08789031215620005eb57600080fd5b8651620005f8816200057f565b809650506020808801516200060d816200057f565b60408901519096506001600160401b03808211156200062b57600080fd5b818a0191508a601f8301126200064057600080fd5b815181811115620006555762000655620005aa565b8060051b604051601f19603f830116810181811085821117156200067d576200067d620005aa565b60405291825284820192508381018501918d8311156200069c57600080fd5b938501935b82851015620006c557620006b58562000598565b84529385019392850192620006a1565b809950505050505050620006dc6060880162000598565b9250620006ec6080880162000598565b9150620006fc60a08801620005c0565b90509295509295509295565b6000602082840312156200071b57600080fd5b815160ff811681146200072d57600080fd5b9392505050565b634e487b7160e01b600052603260045260246000fd5b818103818111156200040c57634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60805160a05160c05160e051613ee9620007f46000396000818161056701528181611d1501526126c401526000818161054101528181611b0a0152612001015260006102c601526000818161024e0152818161028201528181610bec0152818161265a01526128af0152613ee96000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c80639a4575b911610104578063c0d78655116100a2578063dc0bd97111610071578063dc0bd9711461053f578063e0351e1314610565578063e8a1da171461058b578063f2fde38b1461059e57600080fd5b8063c0d78655146104f1578063c4bffe2b14610504578063c75eea9c14610519578063cf7401f31461052c57600080fd5b8063acfecf91116100de578063acfecf9114610431578063af58d59f14610444578063b0f479a1146104b3578063b7946580146104d157600080fd5b80639a4575b9146103dc578063a42a7b8b146103fc578063a7cd63b71461041c57600080fd5b806354c8a4f31161017c57806379ba50971161014b57806379ba5097146103905780637d54534e146103985780638926f54f146103ab5780638da5cb5b146103be57600080fd5b806354c8a4f31461032557806355b961561461033a57806362ddd3c41461035f5780636d3d1a581461037257600080fd5b8063240028e8116101b8578063240028e81461027257806324f65ee7146102bf57806339077537146102f05780634c5ef0ed1461031257600080fd5b806301ffc9a7146101df57806303eadcfc1461020757806321df0da71461024c575b600080fd5b6101f26101ed36600461306f565b6105b1565b60405190151581526020015b60405180910390f35b600a546102279073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101fe565b7f0000000000000000000000000000000000000000000000000000000000000000610227565b6101f26102803660046130d3565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff90811691161490565b60405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020016101fe565b6103036102fe3660046130f0565b610696565b604051905181526020016101fe565b6101f2610320366004613142565b6108b5565b610338610333366004613213565b6108ff565b005b600a546101f29074010000000000000000000000000000000000000000900460ff1681565b61033861036d366004613142565b61097a565b60095473ffffffffffffffffffffffffffffffffffffffff16610227565b610338610a17565b6103386103a63660046130d3565b610ae5565b6101f26103b936600461327f565b610b66565b60015473ffffffffffffffffffffffffffffffffffffffff16610227565b6103ef6103ea36600461329c565b610b7d565b6040516101fe9190613345565b61040f61040a36600461327f565b610e59565b6040516101fe919061339c565b610424610fc4565b6040516101fe919061341e565b61033861043f366004613142565b610fd5565b61045761045236600461327f565b6110ed565b6040516101fe919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b60045473ffffffffffffffffffffffffffffffffffffffff16610227565b6104e46104df36600461327f565b6111c2565b6040516101fe9190613478565b6103386104ff3660046130d3565b611272565b61050c61134d565b6040516101fe919061348b565b61045761052736600461327f565b611405565b61033861053a3660046135ef565b6114d7565b7f0000000000000000000000000000000000000000000000000000000000000000610227565b7f00000000000000000000000000000000000000000000000000000000000000006101f2565b610338610599366004613213565b61155b565b6103386105ac3660046130d3565b611a6d565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167faff2afbf00000000000000000000000000000000000000000000000000000000148061064457507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e64dd2900000000000000000000000000000000000000000000000000000000145b8061069057507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6040805160208101909152600081526106ae82611a81565b600a5460009074010000000000000000000000000000000000000000900460ff161561077757600a5473ffffffffffffffffffffffffffffffffffffffff16635391a405610702604086016020870161327f565b61070f60e0870187613636565b6040518463ffffffff1660e01b815260040161072d939291906136e4565b6020604051808303816000875af115801561074c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107709190613708565b9050610816565b600a5473ffffffffffffffffffffffffffffffffffffffff16630c373d746107a5604086016020870161327f565b6107b260c0870187613636565b6040518463ffffffff1660e01b81526004016107d0939291906136e4565b6020604051808303816000875af11580156107ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108139190613708565b90505b61082660608401604085016130d3565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f08367ffffffffffffffff1660405161088e91815260200190565b60405180910390a3604080516020810190915267ffffffffffffffff909116815292915050565b60006108f783836040516108ca929190613725565b604080519182900390912067ffffffffffffffff8716600090815260076020529190912060050190611ca5565b949350505050565b610907611cc0565b61097484848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808802828101820190935287825290935087925086918291850190849080828437600092019190915250611d1392505050565b50505050565b610982611cc0565b61098b83610b66565b6109d2576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024015b60405180910390fd5b610a128383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611ec992505050565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a68576040517f02b543c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000008082163390811790935560008054909116815560405173ffffffffffffffffffffffffffffffffffffffff909216929183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610aed611cc0565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f44676b5284b809a22248eba0da87391d79098be38bb03154be88a58bf4d091749060200160405180910390a150565b6000610690600567ffffffffffffffff8416611ca5565b6040805180820190915260608082526020820152610b9a82611fc3565b600a546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9182166004820152606084013560248201527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303816000875af1158015610c37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5b9190613735565b50600a54600090819073ffffffffffffffffffffffffffffffffffffffff1663550e7ab2610c8f604087016020880161327f565b610c998780613636565b88606001356040518563ffffffff1660e01b8152600401610cbd9493929190613752565b6000604051808303816000875af1158015610cdc573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610d2291908101906137cd565b9092509050610d3760608501604086016130d3565b73ffffffffffffffffffffffffffffffffffffffff167f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df783604051610d7e91815260200190565b60405180910390a2600a5460609074010000000000000000000000000000000000000000900460ff1615610e2457600282604051610dbc9190613855565b602060405180830381855afa158015610dd9573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610dfc9190613871565b604051602001610e0e91815260200190565b6040516020818303038152906040529050610e27565b50805b6040518060400160405280610e488760200160208101906104df919061327f565b815260200191909152949350505050565b67ffffffffffffffff8116600090815260076020526040812060609190610e829060050161214f565b90506000815167ffffffffffffffff811115610ea057610ea06134cd565b604051908082528060200260200182016040528015610ed357816020015b6060815260200190600190039081610ebe5790505b50905060005b8251811015610fbc5760086000848381518110610ef857610ef861388a565b602002602001015181526020019081526020016000208054610f19906138b9565b80601f0160208091040260200160405190810160405280929190818152602001828054610f45906138b9565b8015610f925780601f10610f6757610100808354040283529160200191610f92565b820191906000526020600020905b815481529060010190602001808311610f7557829003601f168201915b5050505050828281518110610fa957610fa961388a565b6020908102919091010152600101610ed9565b509392505050565b6060610fd0600261214f565b905090565b610fdd611cc0565b610fe683610b66565b611028576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024016109c9565b611068828260405161103b929190613725565b604080519182900390912067ffffffffffffffff861660009081526007602052919091206005019061215c565b6110a4578282826040517f74f23c7c0000000000000000000000000000000000000000000000000000000081526004016109c9939291906136e4565b8267ffffffffffffffff167f52d00ee4d9bd51b40168f2afc5848837288ce258784ad914278791464b3f4d7683836040516110e092919061390c565b60405180910390a2505050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845260028201546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff16151594820194909452600390910154808416606083015291909104909116608082015261069090612168565b67ffffffffffffffff811660009081526007602052604090206004018054606091906111ed906138b9565b80601f0160208091040260200160405190810160405280929190818152602001828054611219906138b9565b80156112665780601f1061123b57610100808354040283529160200191611266565b820191906000526020600020905b81548152906001019060200180831161124957829003601f168201915b50505050509050919050565b61127a611cc0565b73ffffffffffffffffffffffffffffffffffffffff81166112c7576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f1684910160405180910390a15050565b6060600061135b600561214f565b90506000815167ffffffffffffffff811115611379576113796134cd565b6040519080825280602002602001820160405280156113a2578160200160208202803683370190505b50905060005b82518110156113fe578281815181106113c3576113c361388a565b60200260200101518282815181106113dd576113dd61388a565b67ffffffffffffffff909216602092830291909101909101526001016113a8565b5092915050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845281546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff16151594820194909452600190910154808416606083015291909104909116608082015261069090612168565b60095473ffffffffffffffffffffffffffffffffffffffff163314801590611517575060015473ffffffffffffffffffffffffffffffffffffffff163314155b15611550576040517f8e4a23d60000000000000000000000000000000000000000000000000000000081523360048201526024016109c9565b610a1283838361221a565b611563611cc0565b60005b838110156117505760008585838181106115825761158261388a565b9050602002016020810190611597919061327f565b90506115ae600567ffffffffffffffff831661215c565b6115f0576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff821660048201526024016109c9565b67ffffffffffffffff811660009081526007602052604081206116159060050161214f565b905060005b8151811015611681576116788282815181106116385761163861388a565b6020026020010151600760008667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060050161215c90919063ffffffff16565b5060010161161a565b5067ffffffffffffffff8216600090815260076020526040812080547fffffffffffffffffffffff000000000000000000000000000000000000000000908116825560018201839055600282018054909116905560038101829055906116ea6004830182613002565b60058201600081816116fc828261303c565b505060405167ffffffffffffffff871681527f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d8599169450602001925061173e915050565b60405180910390a15050600101611566565b5060005b81811015611a665760008383838181106117705761177061388a565b90506020028101906117829190613920565b61178b90613a44565b905061179c81606001516000612304565b6117ab81608001516000612304565b8060400151516000036117ea576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80516118029060059067ffffffffffffffff16612441565b6118475780516040517f1d5ad3c500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016109c9565b805167ffffffffffffffff16600090815260076020908152604091829020825160a08082018552606080870180518601516fffffffffffffffffffffffffffffffff90811680865263ffffffff42168689018190528351511515878b0181905284518a0151841686890181905294518b0151841660809889018190528954740100000000000000000000000000000000000000009283027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff7001000000000000000000000000000000008087027fffffffffffffffffffffffff000000000000000000000000000000000000000094851690981788178216929092178d5592810290971760018c01558c519889018d52898e0180518d01518716808b528a8e019590955280515115158a8f018190528151909d01518716988a01899052518d0151909516979098018790526002890180549a9091029990931617179094169590951790925590920290911760038201559082015160048201906119ca9082613b54565b5060005b826020015151811015611a0e57611a068360000151846020015183815181106119f9576119f961388a565b6020026020010151611ec9565b6001016119ce565b507f8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c28260000151836040015184606001518560800151604051611a549493929190613c6e565b60405180910390a15050600101611754565b5050505050565b611a75611cc0565b611a7e8161244d565b50565b611a9461028060a08301608084016130d3565b611af357611aa860a08201608083016130d3565b6040517f961c9a4f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016109c9565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016632cbc26bb611b3f604084016020850161327f565b60405160e083901b7fffffffff0000000000000000000000000000000000000000000000000000000016815260809190911b77ffffffffffffffff00000000000000000000000000000000166004820152602401602060405180830381865afa158015611bb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd49190613735565b15611c0b576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c23611c1e604083016020840161327f565b612511565b611c43611c36604083016020840161327f565b61032060a0840184613636565b611c8857611c5460a0820182613636565b6040517f24eb47e50000000000000000000000000000000000000000000000000000000081526004016109c992919061390c565b611a7e611c9b604083016020840161327f565b8260600135612637565b600081815260018301602052604081205415155b9392505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611d11576040517f2b5c74de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b7f0000000000000000000000000000000000000000000000000000000000000000611d6a576040517f35f4a7b300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8251811015611e00576000838281518110611d8a57611d8a61388a565b60200260200101519050611da881600261267e90919063ffffffff16565b15611df75760405173ffffffffffffffffffffffffffffffffffffffff821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b50600101611d6d565b5060005b8151811015610a12576000828281518110611e2157611e2161388a565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e655750611ec1565b611e706002826126a0565b15611ebf5760405173ffffffffffffffffffffffffffffffffffffffff821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b600101611e04565b8051600003611f04576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805160208083019190912067ffffffffffffffff8416600090815260079092526040909120611f369060050182612441565b611f705782826040517f393b8ad20000000000000000000000000000000000000000000000000000000081526004016109c9929190613d07565b6000818152600860205260409020611f888382613b54565b508267ffffffffffffffff167f7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea836040516110e09190613478565b611fd661028060a08301608084016130d3565b611fea57611aa860a08201608083016130d3565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016632cbc26bb612036604084016020850161327f565b60405160e083901b7fffffffff0000000000000000000000000000000000000000000000000000000016815260809190911b77ffffffffffffffff00000000000000000000000000000000166004820152602401602060405180830381865afa1580156120a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120cb9190613735565b15612102576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61211a61211560608301604084016130d3565b6126c2565b61213261212d604083016020840161327f565b612741565b611a7e612145604083016020840161327f565b826060013561288f565b60606000611cb9836128d3565b6000611cb9838361292e565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526121f682606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff16426121da9190613d59565b85608001516fffffffffffffffffffffffffffffffff16612a21565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b61222383610b66565b612265576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024016109c9565b612270826000612304565b67ffffffffffffffff831660009081526007602052604090206122939083612a49565b61229e816000612304565b67ffffffffffffffff831660009081526007602052604090206122c49060020182612a49565b7f0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b8383836040516122f793929190613d6c565b60405180910390a1505050565b8151156123cf5781602001516fffffffffffffffffffffffffffffffff1682604001516fffffffffffffffffffffffffffffffff1610158061235a575060408201516fffffffffffffffffffffffffffffffff16155b1561239357816040517f8020d1240000000000000000000000000000000000000000000000000000000081526004016109c99190613def565b80156123cb576040517f433fc33d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b60408201516fffffffffffffffffffffffffffffffff16151580612408575060208201516fffffffffffffffffffffffffffffffff1615155b156123cb57816040517fd68af9cc0000000000000000000000000000000000000000000000000000000081526004016109c99190613def565b6000611cb98383612beb565b3373ffffffffffffffffffffffffffffffffffffffff82160361249c576040517fdad89dca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116918217835560015460405192939116917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b61251a81610b66565b61255c576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff821660048201526024016109c9565b600480546040517f83826b2b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925233602483015273ffffffffffffffffffffffffffffffffffffffff16906383826b2b90604401602060405180830381865afa1580156125db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ff9190613735565b611a7e576040517f728fe07b0000000000000000000000000000000000000000000000000000000081523360048201526024016109c9565b67ffffffffffffffff821660009081526007602052604090206123cb90600201827f0000000000000000000000000000000000000000000000000000000000000000612c3a565b6000611cb98373ffffffffffffffffffffffffffffffffffffffff841661292e565b6000611cb98373ffffffffffffffffffffffffffffffffffffffff8416612beb565b7f000000000000000000000000000000000000000000000000000000000000000015611a7e576126f3600282612fbd565b611a7e576040517fd0d2597600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024016109c9565b61274a81610b66565b61278c576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff821660048201526024016109c9565b600480546040517fa8d87a3b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925273ffffffffffffffffffffffffffffffffffffffff169063a8d87a3b90602401602060405180830381865afa158015612805573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128299190613e2b565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a7e576040517f728fe07b0000000000000000000000000000000000000000000000000000000081523360048201526024016109c9565b67ffffffffffffffff821660009081526007602052604090206123cb90827f0000000000000000000000000000000000000000000000000000000000000000612c3a565b60608160000180548060200260200160405190810160405280929190818152602001828054801561126657602002820191906000526020600020905b81548152602001906001019080831161290f5750505050509050919050565b60008181526001830160205260408120548015612a17576000612952600183613d59565b855490915060009061296690600190613d59565b90508082146129cb5760008660000182815481106129865761298661388a565b90600052602060002001549050808760000184815481106129a9576129a961388a565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806129dc576129dc613e48565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610690565b6000915050610690565b6000612a4085612a318486613e77565b612a3b9087613e8e565b612fec565b95945050505050565b8154600090612a7290700100000000000000000000000000000000900463ffffffff1642613d59565b90508015612b145760018301548354612aba916fffffffffffffffffffffffffffffffff80821692811691859170010000000000000000000000000000000090910416612a21565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b60208201518354612b3a916fffffffffffffffffffffffffffffffff9081169116612fec565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19906122f7908490613def565b6000818152600183016020526040812054612c3257508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610690565b506000610690565b825474010000000000000000000000000000000000000000900460ff161580612c61575081155b15612c6b57505050565b825460018401546fffffffffffffffffffffffffffffffff80831692911690600090612cb190700100000000000000000000000000000000900463ffffffff1642613d59565b90508015612d715781831115612cf3576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001860154612d2d9083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16612a21565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b84821015612e285773ffffffffffffffffffffffffffffffffffffffff8416612dd0576040517ff94ebcd100000000000000000000000000000000000000000000000000000000815260048101839052602481018690526044016109c9565b6040517f1a76572a000000000000000000000000000000000000000000000000000000008152600481018390526024810186905273ffffffffffffffffffffffffffffffffffffffff851660448201526064016109c9565b84831015612f3b5760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16906000908290612e6c9082613d59565b612e76878a613d59565b612e809190613e8e565b612e8a9190613ea1565b905073ffffffffffffffffffffffffffffffffffffffff8616612ee3576040517f15279c0800000000000000000000000000000000000000000000000000000000815260048101829052602481018690526044016109c9565b6040517fd0c8d23a000000000000000000000000000000000000000000000000000000008152600481018290526024810186905273ffffffffffffffffffffffffffffffffffffffff871660448201526064016109c9565b612f458584613d59565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515611cb9565b6000818310612ffb5781611cb9565b5090919050565b50805461300e906138b9565b6000825580601f1061301e575050565b601f016020900490600052602060002090810190611a7e9190613056565b5080546000825590600052602060002090810190611a7e91905b5b8082111561306b5760008155600101613057565b5090565b60006020828403121561308157600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114611cb957600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114611a7e57600080fd5b6000602082840312156130e557600080fd5b8135611cb9816130b1565b60006020828403121561310257600080fd5b813567ffffffffffffffff81111561311957600080fd5b82016101008185031215611cb957600080fd5b67ffffffffffffffff81168114611a7e57600080fd5b60008060006040848603121561315757600080fd5b83356131628161312c565b9250602084013567ffffffffffffffff8082111561317f57600080fd5b818601915086601f83011261319357600080fd5b8135818111156131a257600080fd5b8760208285010111156131b457600080fd5b6020830194508093505050509250925092565b60008083601f8401126131d957600080fd5b50813567ffffffffffffffff8111156131f157600080fd5b6020830191508360208260051b850101111561320c57600080fd5b9250929050565b6000806000806040858703121561322957600080fd5b843567ffffffffffffffff8082111561324157600080fd5b61324d888389016131c7565b9096509450602087013591508082111561326657600080fd5b50613273878288016131c7565b95989497509550505050565b60006020828403121561329157600080fd5b8135611cb98161312c565b6000602082840312156132ae57600080fd5b813567ffffffffffffffff8111156132c557600080fd5b820160a08185031215611cb957600080fd5b60005b838110156132f25781810151838201526020016132da565b50506000910152565b600081518084526133138160208601602086016132d7565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600082516040602084015261336160608401826132fb565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848303016040850152612a4082826132fb565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b82811015613411577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526133ff8583516132fb565b945092850192908501906001016133c5565b5092979650505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561346c57835173ffffffffffffffffffffffffffffffffffffffff168352928401929184019160010161343a565b50909695505050505050565b602081526000611cb960208301846132fb565b6020808252825182820181905260009190848201906040850190845b8181101561346c57835167ffffffffffffffff16835292840192918401916001016134a7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613543576135436134cd565b604052919050565b8015158114611a7e57600080fd5b80356fffffffffffffffffffffffffffffffff8116811461357957600080fd5b919050565b60006060828403121561359057600080fd5b6040516060810181811067ffffffffffffffff821117156135b3576135b36134cd565b60405290508082356135c48161354b565b81526135d260208401613559565b60208201526135e360408401613559565b60408201525092915050565b600080600060e0848603121561360457600080fd5b833561360f8161312c565b925061361e856020860161357e565b915061362d856080860161357e565b90509250925092565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261366b57600080fd5b83018035915067ffffffffffffffff82111561368657600080fd5b60200191503681900382131561320c57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b67ffffffffffffffff84168152604060208201526000612a4060408301848661369b565b60006020828403121561371a57600080fd5b8151611cb98161312c565b8183823760009101908152919050565b60006020828403121561374757600080fd5b8151611cb98161354b565b67ffffffffffffffff8516815260606020820152600061377660608301858761369b565b905082604083015295945050505050565b600067ffffffffffffffff8211156137a1576137a16134cd565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600080604083850312156137e057600080fd5b82519150602083015167ffffffffffffffff8111156137fe57600080fd5b8301601f8101851361380f57600080fd5b805161382261381d82613787565b6134fc565b81815286602083850101111561383757600080fd5b6138488260208301602086016132d7565b8093505050509250929050565b600082516138678184602087016132d7565b9190910192915050565b60006020828403121561388357600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600181811c908216806138cd57607f821691505b602082108103613906577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b6020815260006108f760208301848661369b565b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee183360301811261386757600080fd5b600082601f83011261396557600080fd5b813561397361381d82613787565b81815284602083860101111561398857600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f8301126139b657600080fd5b8135602067ffffffffffffffff808311156139d3576139d36134cd565b8260051b6139e28382016134fc565b93845285810183019383810190888611156139fc57600080fd5b84880192505b85831015613a3857823584811115613a1a5760008081fd5b613a288a87838c0101613954565b8352509184019190840190613a02565b98975050505050505050565b60006101208236031215613a5757600080fd5b60405160a0810167ffffffffffffffff8282108183111715613a7b57613a7b6134cd565b8160405284359150613a8c8261312c565b90825260208401359080821115613aa257600080fd5b613aae368387016139a5565b60208401526040850135915080821115613ac757600080fd5b50613ad436828601613954565b604083015250613ae7366060850161357e565b6060820152613af93660c0850161357e565b608082015292915050565b601f821115610a12576000816000526020600020601f850160051c81016020861015613b2d5750805b601f850160051c820191505b81811015613b4c57828155600101613b39565b505050505050565b815167ffffffffffffffff811115613b6e57613b6e6134cd565b613b8281613b7c84546138b9565b84613b04565b602080601f831160018114613bd55760008415613b9f5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613b4c565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613c2257888601518255948401946001909101908401613c03565b5085821015613c5e57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600061010067ffffffffffffffff87168352806020840152613c92818401876132fb565b8551151560408581019190915260208701516fffffffffffffffffffffffffffffffff9081166060870152908701511660808501529150613cd09050565b8251151560a083015260208301516fffffffffffffffffffffffffffffffff90811660c084015260408401511660e0830152612a40565b67ffffffffffffffff831681526040602082015260006108f760408301846132fb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561069057610690613d2a565b67ffffffffffffffff8416815260e08101613db860208301858051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b82511515608083015260208301516fffffffffffffffffffffffffffffffff90811660a084015260408401511660c08301526108f7565b6060810161069082848051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b600060208284031215613e3d57600080fd5b8151611cb9816130b1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b808202811582820484141761069057610690613d2a565b8082018082111561069057610690613d2a565b600082613ed7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50049056fea164736f6c6343000818000a",
+}
+
+var CLAdapterABI = CLAdapterMetaData.ABI
+
+var CLAdapterBin = CLAdapterMetaData.Bin
+
+func DeployCLAdapter(auth *bind.TransactOpts, backend bind.ContractBackend, bridge_ common.Address, executionGasLimit_ *big.Int, ccipRouter_ common.Address, allowlist_ []common.Address, rmnProxy_ common.Address, attestationEnable_ bool) (common.Address, *types.Transaction, *CLAdapter, error) {
+	parsed, err := CLAdapterMetaData.GetAbi()
+	if err != nil {
+		return common.Address{}, nil, nil, err
+	}
+	if parsed == nil {
+		return common.Address{}, nil, nil, errors.New("GetABI returned nil")
+	}
+
+	address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(CLAdapterBin), backend, bridge_, executionGasLimit_, ccipRouter_, allowlist_, rmnProxy_, attestationEnable_)
+	if err != nil {
+		return common.Address{}, nil, nil, err
+	}
+	return address, tx, &CLAdapter{address: address, abi: *parsed, CLAdapterCaller: CLAdapterCaller{contract: contract}, CLAdapterTransactor: CLAdapterTransactor{contract: contract}, CLAdapterFilterer: CLAdapterFilterer{contract: contract}}, nil
+}
+
+type CLAdapter struct {
+	address common.Address
+	abi     abi.ABI
+	CLAdapterCaller
+	CLAdapterTransactor
+	CLAdapterFilterer
+}
+
+type CLAdapterCaller struct {
+	contract *bind.BoundContract
+}
+
+type CLAdapterTransactor struct {
+	contract *bind.BoundContract
+}
+
+type CLAdapterFilterer struct {
+	contract *bind.BoundContract
+}
+
+type CLAdapterSession struct {
+	Contract     *CLAdapter
+	CallOpts     bind.CallOpts
+	TransactOpts bind.TransactOpts
+}
+
+type CLAdapterCallerSession struct {
+	Contract *CLAdapterCaller
+	CallOpts bind.CallOpts
+}
+
+type CLAdapterTransactorSession struct {
+	Contract     *CLAdapterTransactor
+	TransactOpts bind.TransactOpts
+}
+
+type CLAdapterRaw struct {
+	Contract *CLAdapter
+}
+
+type CLAdapterCallerRaw struct {
+	Contract *CLAdapterCaller
+}
+
+type CLAdapterTransactorRaw struct {
+	Contract *CLAdapterTransactor
+}
+
+func NewCLAdapter(address common.Address, backend bind.ContractBackend) (*CLAdapter, error) {
+	abi, err := abi.JSON(strings.NewReader(CLAdapterABI))
+	if err != nil {
+		return nil, err
+	}
+	contract, err := bindCLAdapter(address, backend, backend, backend)
+	if err != nil {
+		return nil, err
+	}
+	return &CLAdapter{address: address, abi: abi, CLAdapterCaller: CLAdapterCaller{contract: contract}, CLAdapterTransactor: CLAdapterTransactor{contract: contract}, CLAdapterFilterer: CLAdapterFilterer{contract: contract}}, nil
+}
+
+func NewCLAdapterCaller(address common.Address, caller bind.ContractCaller) (*CLAdapterCaller, error) {
+	contract, err := bindCLAdapter(address, caller, nil, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &CLAdapterCaller{contract: contract}, nil
+}
+
+func NewCLAdapterTransactor(address common.Address, transactor bind.ContractTransactor) (*CLAdapterTransactor, error) {
+	contract, err := bindCLAdapter(address, nil, transactor, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &CLAdapterTransactor{contract: contract}, nil
+}
+
+func NewCLAdapterFilterer(address common.Address, filterer bind.ContractFilterer) (*CLAdapterFilterer, error) {
+	contract, err := bindCLAdapter(address, nil, nil, filterer)
+	if err != nil {
+		return nil, err
+	}
+	return &CLAdapterFilterer{contract: contract}, nil
+}
+
+func bindCLAdapter(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+	parsed, err := CLAdapterMetaData.GetAbi()
+	if err != nil {
+		return nil, err
+	}
+	return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil
+}
+
+func (_CLAdapter *CLAdapterRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _CLAdapter.Contract.CLAdapterCaller.contract.Call(opts, result, method, params...)
+}
+
+func (_CLAdapter *CLAdapterRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _CLAdapter.Contract.CLAdapterTransactor.contract.Transfer(opts)
+}
+
+func (_CLAdapter *CLAdapterRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _CLAdapter.Contract.CLAdapterTransactor.contract.Transact(opts, method, params...)
+}
+
+func (_CLAdapter *CLAdapterCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _CLAdapter.Contract.contract.Call(opts, result, method, params...)
+}
+
+func (_CLAdapter *CLAdapterTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _CLAdapter.Contract.contract.Transfer(opts)
+}
+
+func (_CLAdapter *CLAdapterTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _CLAdapter.Contract.contract.Transact(opts, method, params...)
+}
+
+func (_CLAdapter *CLAdapterCaller) Bridge(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _CLAdapter.contract.Call(opts, &out, "bridge")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+func (_CLAdapter *CLAdapterSession) Bridge() (common.Address, error) {
+	return _CLAdapter.Contract.Bridge(&_CLAdapter.CallOpts)
+}
+
+func (_CLAdapter *CLAdapterCallerSession) Bridge() (common.Address, error) {
+	return _CLAdapter.Contract.Bridge(&_CLAdapter.CallOpts)
+}
+
+func (_CLAdapter *CLAdapterCaller) GetChain(opts *bind.CallOpts, arg0 uint64) ([32]byte, error) {
+	var out []interface{}
+	err := _CLAdapter.contract.Call(opts, &out, "getChain", arg0)
+
+	if err != nil {
+		return *new([32]byte), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
+
+	return out0, err
+
+}
+
+func (_CLAdapter *CLAdapterSession) GetChain(arg0 uint64) ([32]byte, error) {
+	return _CLAdapter.Contract.GetChain(&_CLAdapter.CallOpts, arg0)
+}
+
+func (_CLAdapter *CLAdapterCallerSession) GetChain(arg0 uint64) ([32]byte, error) {
+	return _CLAdapter.Contract.GetChain(&_CLAdapter.CallOpts, arg0)
+}
+
+func (_CLAdapter *CLAdapterCaller) GetExecutionGasLimit(opts *bind.CallOpts) (*big.Int, error) {
+	var out []interface{}
+	err := _CLAdapter.contract.Call(opts, &out, "getExecutionGasLimit")
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+func (_CLAdapter *CLAdapterSession) GetExecutionGasLimit() (*big.Int, error) {
+	return _CLAdapter.Contract.GetExecutionGasLimit(&_CLAdapter.CallOpts)
+}
+
+func (_CLAdapter *CLAdapterCallerSession) GetExecutionGasLimit() (*big.Int, error) {
+	return _CLAdapter.Contract.GetExecutionGasLimit(&_CLAdapter.CallOpts)
+}
+
+func (_CLAdapter *CLAdapterCaller) GetFee(opts *bind.CallOpts, _toChain [32]byte, arg1 [32]byte, _toAddress [32]byte, _amount *big.Int, _payload []byte) (*big.Int, error) {
+	var out []interface{}
+	err := _CLAdapter.contract.Call(opts, &out, "getFee", _toChain, arg1, _toAddress, _amount, _payload)
+
+	if err != nil {
+		return *new(*big.Int), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
+
+	return out0, err
+
+}
+
+func (_CLAdapter *CLAdapterSession) GetFee(_toChain [32]byte, arg1 [32]byte, _toAddress [32]byte, _amount *big.Int, _payload []byte) (*big.Int, error) {
+	return _CLAdapter.Contract.GetFee(&_CLAdapter.CallOpts, _toChain, arg1, _toAddress, _amount, _payload)
+}
+
+func (_CLAdapter *CLAdapterCallerSession) GetFee(_toChain [32]byte, arg1 [32]byte, _toAddress [32]byte, _amount *big.Int, _payload []byte) (*big.Int, error) {
+	return _CLAdapter.Contract.GetFee(&_CLAdapter.CallOpts, _toChain, arg1, _toAddress, _amount, _payload)
+}
+
+func (_CLAdapter *CLAdapterCaller) GetRemoteChainSelector(opts *bind.CallOpts, arg0 [32]byte) (uint64, error) {
+	var out []interface{}
+	err := _CLAdapter.contract.Call(opts, &out, "getRemoteChainSelector", arg0)
+
+	if err != nil {
+		return *new(uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64)
+
+	return out0, err
+
+}
+
+func (_CLAdapter *CLAdapterSession) GetRemoteChainSelector(arg0 [32]byte) (uint64, error) {
+	return _CLAdapter.Contract.GetRemoteChainSelector(&_CLAdapter.CallOpts, arg0)
+}
+
+func (_CLAdapter *CLAdapterCallerSession) GetRemoteChainSelector(arg0 [32]byte) (uint64, error) {
+	return _CLAdapter.Contract.GetRemoteChainSelector(&_CLAdapter.CallOpts, arg0)
+}
+
+func (_CLAdapter *CLAdapterCaller) Lbtc(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _CLAdapter.contract.Call(opts, &out, "lbtc")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+func (_CLAdapter *CLAdapterSession) Lbtc() (common.Address, error) {
+	return _CLAdapter.Contract.Lbtc(&_CLAdapter.CallOpts)
+}
+
+func (_CLAdapter *CLAdapterCallerSession) Lbtc() (common.Address, error) {
+	return _CLAdapter.Contract.Lbtc(&_CLAdapter.CallOpts)
+}
+
+func (_CLAdapter *CLAdapterCaller) Owner(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _CLAdapter.contract.Call(opts, &out, "owner")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+func (_CLAdapter *CLAdapterSession) Owner() (common.Address, error) {
+	return _CLAdapter.Contract.Owner(&_CLAdapter.CallOpts)
+}
+
+func (_CLAdapter *CLAdapterCallerSession) Owner() (common.Address, error) {
+	return _CLAdapter.Contract.Owner(&_CLAdapter.CallOpts)
+}
+
+func (_CLAdapter *CLAdapterCaller) TokenPool(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _CLAdapter.contract.Call(opts, &out, "tokenPool")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+func (_CLAdapter *CLAdapterSession) TokenPool() (common.Address, error) {
+	return _CLAdapter.Contract.TokenPool(&_CLAdapter.CallOpts)
+}
+
+func (_CLAdapter *CLAdapterCallerSession) TokenPool() (common.Address, error) {
+	return _CLAdapter.Contract.TokenPool(&_CLAdapter.CallOpts)
+}
+
+func (_CLAdapter *CLAdapterTransactor) ChangeBridge(opts *bind.TransactOpts, bridge_ common.Address) (*types.Transaction, error) {
+	return _CLAdapter.contract.Transact(opts, "changeBridge", bridge_)
+}
+
+func (_CLAdapter *CLAdapterSession) ChangeBridge(bridge_ common.Address) (*types.Transaction, error) {
+	return _CLAdapter.Contract.ChangeBridge(&_CLAdapter.TransactOpts, bridge_)
+}
+
+func (_CLAdapter *CLAdapterTransactorSession) ChangeBridge(bridge_ common.Address) (*types.Transaction, error) {
+	return _CLAdapter.Contract.ChangeBridge(&_CLAdapter.TransactOpts, bridge_)
+}
+
+func (_CLAdapter *CLAdapterTransactor) Deposit(opts *bind.TransactOpts, fromAddress common.Address, _toChain [32]byte, arg2 [32]byte, _toAddress [32]byte, _amount *big.Int, _payload []byte) (*types.Transaction, error) {
+	return _CLAdapter.contract.Transact(opts, "deposit", fromAddress, _toChain, arg2, _toAddress, _amount, _payload)
+}
+
+func (_CLAdapter *CLAdapterSession) Deposit(fromAddress common.Address, _toChain [32]byte, arg2 [32]byte, _toAddress [32]byte, _amount *big.Int, _payload []byte) (*types.Transaction, error) {
+	return _CLAdapter.Contract.Deposit(&_CLAdapter.TransactOpts, fromAddress, _toChain, arg2, _toAddress, _amount, _payload)
+}
+
+func (_CLAdapter *CLAdapterTransactorSession) Deposit(fromAddress common.Address, _toChain [32]byte, arg2 [32]byte, _toAddress [32]byte, _amount *big.Int, _payload []byte) (*types.Transaction, error) {
+	return _CLAdapter.Contract.Deposit(&_CLAdapter.TransactOpts, fromAddress, _toChain, arg2, _toAddress, _amount, _payload)
+}
+
+func (_CLAdapter *CLAdapterTransactor) InitWithdrawalNoSignatures(opts *bind.TransactOpts, remoteSelector uint64, onChainData []byte) (*types.Transaction, error) {
+	return _CLAdapter.contract.Transact(opts, "initWithdrawalNoSignatures", remoteSelector, onChainData)
+}
+
+func (_CLAdapter *CLAdapterSession) InitWithdrawalNoSignatures(remoteSelector uint64, onChainData []byte) (*types.Transaction, error) {
+	return _CLAdapter.Contract.InitWithdrawalNoSignatures(&_CLAdapter.TransactOpts, remoteSelector, onChainData)
+}
+
+func (_CLAdapter *CLAdapterTransactorSession) InitWithdrawalNoSignatures(remoteSelector uint64, onChainData []byte) (*types.Transaction, error) {
+	return _CLAdapter.Contract.InitWithdrawalNoSignatures(&_CLAdapter.TransactOpts, remoteSelector, onChainData)
+}
+
+func (_CLAdapter *CLAdapterTransactor) InitiateDeposit(opts *bind.TransactOpts, remoteChainSelector uint64, receiver []byte, amount *big.Int) (*types.Transaction, error) {
+	return _CLAdapter.contract.Transact(opts, "initiateDeposit", remoteChainSelector, receiver, amount)
+}
+
+func (_CLAdapter *CLAdapterSession) InitiateDeposit(remoteChainSelector uint64, receiver []byte, amount *big.Int) (*types.Transaction, error) {
+	return _CLAdapter.Contract.InitiateDeposit(&_CLAdapter.TransactOpts, remoteChainSelector, receiver, amount)
+}
+
+func (_CLAdapter *CLAdapterTransactorSession) InitiateDeposit(remoteChainSelector uint64, receiver []byte, amount *big.Int) (*types.Transaction, error) {
+	return _CLAdapter.Contract.InitiateDeposit(&_CLAdapter.TransactOpts, remoteChainSelector, receiver, amount)
+}
+
+func (_CLAdapter *CLAdapterTransactor) InitiateWithdrawal(opts *bind.TransactOpts, remoteSelector uint64, offChainData []byte) (*types.Transaction, error) {
+	return _CLAdapter.contract.Transact(opts, "initiateWithdrawal", remoteSelector, offChainData)
+}
+
+func (_CLAdapter *CLAdapterSession) InitiateWithdrawal(remoteSelector uint64, offChainData []byte) (*types.Transaction, error) {
+	return _CLAdapter.Contract.InitiateWithdrawal(&_CLAdapter.TransactOpts, remoteSelector, offChainData)
+}
+
+func (_CLAdapter *CLAdapterTransactorSession) InitiateWithdrawal(remoteSelector uint64, offChainData []byte) (*types.Transaction, error) {
+	return _CLAdapter.Contract.InitiateWithdrawal(&_CLAdapter.TransactOpts, remoteSelector, offChainData)
+}
+
+func (_CLAdapter *CLAdapterTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _CLAdapter.contract.Transact(opts, "renounceOwnership")
+}
+
+func (_CLAdapter *CLAdapterSession) RenounceOwnership() (*types.Transaction, error) {
+	return _CLAdapter.Contract.RenounceOwnership(&_CLAdapter.TransactOpts)
+}
+
+func (_CLAdapter *CLAdapterTransactorSession) RenounceOwnership() (*types.Transaction, error) {
+	return _CLAdapter.Contract.RenounceOwnership(&_CLAdapter.TransactOpts)
+}
+
+func (_CLAdapter *CLAdapterTransactor) SetExecutionGasLimit(opts *bind.TransactOpts, newVal *big.Int) (*types.Transaction, error) {
+	return _CLAdapter.contract.Transact(opts, "setExecutionGasLimit", newVal)
+}
+
+func (_CLAdapter *CLAdapterSession) SetExecutionGasLimit(newVal *big.Int) (*types.Transaction, error) {
+	return _CLAdapter.Contract.SetExecutionGasLimit(&_CLAdapter.TransactOpts, newVal)
+}
+
+func (_CLAdapter *CLAdapterTransactorSession) SetExecutionGasLimit(newVal *big.Int) (*types.Transaction, error) {
+	return _CLAdapter.Contract.SetExecutionGasLimit(&_CLAdapter.TransactOpts, newVal)
+}
+
+func (_CLAdapter *CLAdapterTransactor) SetRemoteChainSelector(opts *bind.TransactOpts, chain [32]byte, chainSelector uint64) (*types.Transaction, error) {
+	return _CLAdapter.contract.Transact(opts, "setRemoteChainSelector", chain, chainSelector)
+}
+
+func (_CLAdapter *CLAdapterSession) SetRemoteChainSelector(chain [32]byte, chainSelector uint64) (*types.Transaction, error) {
+	return _CLAdapter.Contract.SetRemoteChainSelector(&_CLAdapter.TransactOpts, chain, chainSelector)
+}
+
+func (_CLAdapter *CLAdapterTransactorSession) SetRemoteChainSelector(chain [32]byte, chainSelector uint64) (*types.Transaction, error) {
+	return _CLAdapter.Contract.SetRemoteChainSelector(&_CLAdapter.TransactOpts, chain, chainSelector)
+}
+
+func (_CLAdapter *CLAdapterTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error) {
+	return _CLAdapter.contract.Transact(opts, "transferOwnership", newOwner)
+}
+
+func (_CLAdapter *CLAdapterSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) {
+	return _CLAdapter.Contract.TransferOwnership(&_CLAdapter.TransactOpts, newOwner)
+}
+
+func (_CLAdapter *CLAdapterTransactorSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) {
+	return _CLAdapter.Contract.TransferOwnership(&_CLAdapter.TransactOpts, newOwner)
+}
+
+type CLAdapterBridgeChangedIterator struct {
+	Event *CLAdapterBridgeChanged
+
+	contract *bind.BoundContract
+	event    string
+
+	logs chan types.Log
+	sub  ethereum.Subscription
+	done bool
+	fail error
+}
+
+func (it *CLAdapterBridgeChangedIterator) Next() bool {
+
+	if it.fail != nil {
+		return false
+	}
+
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(CLAdapterBridgeChanged)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+
+	select {
+	case log := <-it.logs:
+		it.Event = new(CLAdapterBridgeChanged)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+func (it *CLAdapterBridgeChangedIterator) Error() error {
+	return it.fail
+}
+
+func (it *CLAdapterBridgeChangedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+type CLAdapterBridgeChanged struct {
+	OldBridge common.Address
+	NewBridge common.Address
+	Raw       types.Log
+}
+
+func (_CLAdapter *CLAdapterFilterer) FilterBridgeChanged(opts *bind.FilterOpts, oldBridge []common.Address, newBridge []common.Address) (*CLAdapterBridgeChangedIterator, error) {
+
+	var oldBridgeRule []interface{}
+	for _, oldBridgeItem := range oldBridge {
+		oldBridgeRule = append(oldBridgeRule, oldBridgeItem)
+	}
+	var newBridgeRule []interface{}
+	for _, newBridgeItem := range newBridge {
+		newBridgeRule = append(newBridgeRule, newBridgeItem)
+	}
+
+	logs, sub, err := _CLAdapter.contract.FilterLogs(opts, "BridgeChanged", oldBridgeRule, newBridgeRule)
+	if err != nil {
+		return nil, err
+	}
+	return &CLAdapterBridgeChangedIterator{contract: _CLAdapter.contract, event: "BridgeChanged", logs: logs, sub: sub}, nil
+}
+
+func (_CLAdapter *CLAdapterFilterer) WatchBridgeChanged(opts *bind.WatchOpts, sink chan<- *CLAdapterBridgeChanged, oldBridge []common.Address, newBridge []common.Address) (event.Subscription, error) {
+
+	var oldBridgeRule []interface{}
+	for _, oldBridgeItem := range oldBridge {
+		oldBridgeRule = append(oldBridgeRule, oldBridgeItem)
+	}
+	var newBridgeRule []interface{}
+	for _, newBridgeItem := range newBridge {
+		newBridgeRule = append(newBridgeRule, newBridgeItem)
+	}
+
+	logs, sub, err := _CLAdapter.contract.WatchLogs(opts, "BridgeChanged", oldBridgeRule, newBridgeRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+
+				event := new(CLAdapterBridgeChanged)
+				if err := _CLAdapter.contract.UnpackLog(event, "BridgeChanged", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+func (_CLAdapter *CLAdapterFilterer) ParseBridgeChanged(log types.Log) (*CLAdapterBridgeChanged, error) {
+	event := new(CLAdapterBridgeChanged)
+	if err := _CLAdapter.contract.UnpackLog(event, "BridgeChanged", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+type CLAdapterCLChainSelectorSetIterator struct {
+	Event *CLAdapterCLChainSelectorSet
+
+	contract *bind.BoundContract
+	event    string
+
+	logs chan types.Log
+	sub  ethereum.Subscription
+	done bool
+	fail error
+}
+
+func (it *CLAdapterCLChainSelectorSetIterator) Next() bool {
+
+	if it.fail != nil {
+		return false
+	}
+
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(CLAdapterCLChainSelectorSet)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+
+	select {
+	case log := <-it.logs:
+		it.Event = new(CLAdapterCLChainSelectorSet)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+func (it *CLAdapterCLChainSelectorSetIterator) Error() error {
+	return it.fail
+}
+
+func (it *CLAdapterCLChainSelectorSetIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+type CLAdapterCLChainSelectorSet struct {
+	Arg0 [32]byte
+	Arg1 uint64
+	Raw  types.Log
+}
+
+func (_CLAdapter *CLAdapterFilterer) FilterCLChainSelectorSet(opts *bind.FilterOpts) (*CLAdapterCLChainSelectorSetIterator, error) {
+
+	logs, sub, err := _CLAdapter.contract.FilterLogs(opts, "CLChainSelectorSet")
+	if err != nil {
+		return nil, err
+	}
+	return &CLAdapterCLChainSelectorSetIterator{contract: _CLAdapter.contract, event: "CLChainSelectorSet", logs: logs, sub: sub}, nil
+}
+
+func (_CLAdapter *CLAdapterFilterer) WatchCLChainSelectorSet(opts *bind.WatchOpts, sink chan<- *CLAdapterCLChainSelectorSet) (event.Subscription, error) {
+
+	logs, sub, err := _CLAdapter.contract.WatchLogs(opts, "CLChainSelectorSet")
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+
+				event := new(CLAdapterCLChainSelectorSet)
+				if err := _CLAdapter.contract.UnpackLog(event, "CLChainSelectorSet", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+func (_CLAdapter *CLAdapterFilterer) ParseCLChainSelectorSet(log types.Log) (*CLAdapterCLChainSelectorSet, error) {
+	event := new(CLAdapterCLChainSelectorSet)
+	if err := _CLAdapter.contract.UnpackLog(event, "CLChainSelectorSet", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+type CLAdapterCLTokenPoolDeployedIterator struct {
+	Event *CLAdapterCLTokenPoolDeployed
+
+	contract *bind.BoundContract
+	event    string
+
+	logs chan types.Log
+	sub  ethereum.Subscription
+	done bool
+	fail error
+}
+
+func (it *CLAdapterCLTokenPoolDeployedIterator) Next() bool {
+
+	if it.fail != nil {
+		return false
+	}
+
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(CLAdapterCLTokenPoolDeployed)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+
+	select {
+	case log := <-it.logs:
+		it.Event = new(CLAdapterCLTokenPoolDeployed)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+func (it *CLAdapterCLTokenPoolDeployedIterator) Error() error {
+	return it.fail
+}
+
+func (it *CLAdapterCLTokenPoolDeployedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+type CLAdapterCLTokenPoolDeployed struct {
+	Arg0 common.Address
+	Raw  types.Log
+}
+
+func (_CLAdapter *CLAdapterFilterer) FilterCLTokenPoolDeployed(opts *bind.FilterOpts) (*CLAdapterCLTokenPoolDeployedIterator, error) {
+
+	logs, sub, err := _CLAdapter.contract.FilterLogs(opts, "CLTokenPoolDeployed")
+	if err != nil {
+		return nil, err
+	}
+	return &CLAdapterCLTokenPoolDeployedIterator{contract: _CLAdapter.contract, event: "CLTokenPoolDeployed", logs: logs, sub: sub}, nil
+}
+
+func (_CLAdapter *CLAdapterFilterer) WatchCLTokenPoolDeployed(opts *bind.WatchOpts, sink chan<- *CLAdapterCLTokenPoolDeployed) (event.Subscription, error) {
+
+	logs, sub, err := _CLAdapter.contract.WatchLogs(opts, "CLTokenPoolDeployed")
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+
+				event := new(CLAdapterCLTokenPoolDeployed)
+				if err := _CLAdapter.contract.UnpackLog(event, "CLTokenPoolDeployed", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+func (_CLAdapter *CLAdapterFilterer) ParseCLTokenPoolDeployed(log types.Log) (*CLAdapterCLTokenPoolDeployed, error) {
+	event := new(CLAdapterCLTokenPoolDeployed)
+	if err := _CLAdapter.contract.UnpackLog(event, "CLTokenPoolDeployed", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+type CLAdapterExecutionGasLimitSetIterator struct {
+	Event *CLAdapterExecutionGasLimitSet
+
+	contract *bind.BoundContract
+	event    string
+
+	logs chan types.Log
+	sub  ethereum.Subscription
+	done bool
+	fail error
+}
+
+func (it *CLAdapterExecutionGasLimitSetIterator) Next() bool {
+
+	if it.fail != nil {
+		return false
+	}
+
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(CLAdapterExecutionGasLimitSet)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+
+	select {
+	case log := <-it.logs:
+		it.Event = new(CLAdapterExecutionGasLimitSet)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+func (it *CLAdapterExecutionGasLimitSetIterator) Error() error {
+	return it.fail
+}
+
+func (it *CLAdapterExecutionGasLimitSetIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+type CLAdapterExecutionGasLimitSet struct {
+	PrevVal *big.Int
+	NewVal  *big.Int
+	Raw     types.Log
+}
+
+func (_CLAdapter *CLAdapterFilterer) FilterExecutionGasLimitSet(opts *bind.FilterOpts, prevVal []*big.Int, newVal []*big.Int) (*CLAdapterExecutionGasLimitSetIterator, error) {
+
+	var prevValRule []interface{}
+	for _, prevValItem := range prevVal {
+		prevValRule = append(prevValRule, prevValItem)
+	}
+	var newValRule []interface{}
+	for _, newValItem := range newVal {
+		newValRule = append(newValRule, newValItem)
+	}
+
+	logs, sub, err := _CLAdapter.contract.FilterLogs(opts, "ExecutionGasLimitSet", prevValRule, newValRule)
+	if err != nil {
+		return nil, err
+	}
+	return &CLAdapterExecutionGasLimitSetIterator{contract: _CLAdapter.contract, event: "ExecutionGasLimitSet", logs: logs, sub: sub}, nil
+}
+
+func (_CLAdapter *CLAdapterFilterer) WatchExecutionGasLimitSet(opts *bind.WatchOpts, sink chan<- *CLAdapterExecutionGasLimitSet, prevVal []*big.Int, newVal []*big.Int) (event.Subscription, error) {
+
+	var prevValRule []interface{}
+	for _, prevValItem := range prevVal {
+		prevValRule = append(prevValRule, prevValItem)
+	}
+	var newValRule []interface{}
+	for _, newValItem := range newVal {
+		newValRule = append(newValRule, newValItem)
+	}
+
+	logs, sub, err := _CLAdapter.contract.WatchLogs(opts, "ExecutionGasLimitSet", prevValRule, newValRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+
+				event := new(CLAdapterExecutionGasLimitSet)
+				if err := _CLAdapter.contract.UnpackLog(event, "ExecutionGasLimitSet", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+func (_CLAdapter *CLAdapterFilterer) ParseExecutionGasLimitSet(log types.Log) (*CLAdapterExecutionGasLimitSet, error) {
+	event := new(CLAdapterExecutionGasLimitSet)
+	if err := _CLAdapter.contract.UnpackLog(event, "ExecutionGasLimitSet", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+type CLAdapterOwnershipTransferredIterator struct {
+	Event *CLAdapterOwnershipTransferred
+
+	contract *bind.BoundContract
+	event    string
+
+	logs chan types.Log
+	sub  ethereum.Subscription
+	done bool
+	fail error
+}
+
+func (it *CLAdapterOwnershipTransferredIterator) Next() bool {
+
+	if it.fail != nil {
+		return false
+	}
+
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(CLAdapterOwnershipTransferred)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+
+	select {
+	case log := <-it.logs:
+		it.Event = new(CLAdapterOwnershipTransferred)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+func (it *CLAdapterOwnershipTransferredIterator) Error() error {
+	return it.fail
+}
+
+func (it *CLAdapterOwnershipTransferredIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+type CLAdapterOwnershipTransferred struct {
+	PreviousOwner common.Address
+	NewOwner      common.Address
+	Raw           types.Log
+}
+
+func (_CLAdapter *CLAdapterFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*CLAdapterOwnershipTransferredIterator, error) {
+
+	var previousOwnerRule []interface{}
+	for _, previousOwnerItem := range previousOwner {
+		previousOwnerRule = append(previousOwnerRule, previousOwnerItem)
+	}
+	var newOwnerRule []interface{}
+	for _, newOwnerItem := range newOwner {
+		newOwnerRule = append(newOwnerRule, newOwnerItem)
+	}
+
+	logs, sub, err := _CLAdapter.contract.FilterLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule)
+	if err != nil {
+		return nil, err
+	}
+	return &CLAdapterOwnershipTransferredIterator{contract: _CLAdapter.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil
+}
+
+func (_CLAdapter *CLAdapterFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *CLAdapterOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) {
+
+	var previousOwnerRule []interface{}
+	for _, previousOwnerItem := range previousOwner {
+		previousOwnerRule = append(previousOwnerRule, previousOwnerItem)
+	}
+	var newOwnerRule []interface{}
+	for _, newOwnerItem := range newOwner {
+		newOwnerRule = append(newOwnerRule, newOwnerItem)
+	}
+
+	logs, sub, err := _CLAdapter.contract.WatchLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+
+				event := new(CLAdapterOwnershipTransferred)
+				if err := _CLAdapter.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+func (_CLAdapter *CLAdapterFilterer) ParseOwnershipTransferred(log types.Log) (*CLAdapterOwnershipTransferred, error) {
+	event := new(CLAdapterOwnershipTransferred)
+	if err := _CLAdapter.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+func (_CLAdapter *CLAdapter) ParseLog(log types.Log) (generated.AbigenLog, error) {
+	switch log.Topics[0] {
+	case _CLAdapter.abi.Events["BridgeChanged"].ID:
+		return _CLAdapter.ParseBridgeChanged(log)
+	case _CLAdapter.abi.Events["CLChainSelectorSet"].ID:
+		return _CLAdapter.ParseCLChainSelectorSet(log)
+	case _CLAdapter.abi.Events["CLTokenPoolDeployed"].ID:
+		return _CLAdapter.ParseCLTokenPoolDeployed(log)
+	case _CLAdapter.abi.Events["ExecutionGasLimitSet"].ID:
+		return _CLAdapter.ParseExecutionGasLimitSet(log)
+	case _CLAdapter.abi.Events["OwnershipTransferred"].ID:
+		return _CLAdapter.ParseOwnershipTransferred(log)
+
+	default:
+		return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0])
+	}
+}
+
+func (CLAdapterBridgeChanged) Topic() common.Hash {
+	return common.HexToHash("0xd565484d693f5157abcceb853139678038bc740991b0a4dc3baa2426325bb3c0")
+}
+
+func (CLAdapterCLChainSelectorSet) Topic() common.Hash {
+	return common.HexToHash("0x61805347ac73c642ed5bfbc228e1702a4d51591b36a35387250de0c0d75b0072")
+}
+
+func (CLAdapterCLTokenPoolDeployed) Topic() common.Hash {
+	return common.HexToHash("0x45163ba2f75e282ba1000a5e166237acb454fa6b2b4cc778671bf977a01b13b4")
+}
+
+func (CLAdapterExecutionGasLimitSet) Topic() common.Hash {
+	return common.HexToHash("0x45a4a024e3d155ab5b1634193775d00d4cbf4ef295e76d0bf1aa6dfeb114dd84")
+}
+
+func (CLAdapterOwnershipTransferred) Topic() common.Hash {
+	return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0")
+}
+
+func (_CLAdapter *CLAdapter) Address() common.Address {
+	return _CLAdapter.address
+}
+
+type CLAdapterInterface interface {
+	Bridge(opts *bind.CallOpts) (common.Address, error)
+
+	GetChain(opts *bind.CallOpts, arg0 uint64) ([32]byte, error)
+
+	GetExecutionGasLimit(opts *bind.CallOpts) (*big.Int, error)
+
+	GetFee(opts *bind.CallOpts, _toChain [32]byte, arg1 [32]byte, _toAddress [32]byte, _amount *big.Int, _payload []byte) (*big.Int, error)
+
+	GetRemoteChainSelector(opts *bind.CallOpts, arg0 [32]byte) (uint64, error)
+
+	Lbtc(opts *bind.CallOpts) (common.Address, error)
+
+	Owner(opts *bind.CallOpts) (common.Address, error)
+
+	TokenPool(opts *bind.CallOpts) (common.Address, error)
+
+	ChangeBridge(opts *bind.TransactOpts, bridge_ common.Address) (*types.Transaction, error)
+
+	Deposit(opts *bind.TransactOpts, fromAddress common.Address, _toChain [32]byte, arg2 [32]byte, _toAddress [32]byte, _amount *big.Int, _payload []byte) (*types.Transaction, error)
+
+	InitWithdrawalNoSignatures(opts *bind.TransactOpts, remoteSelector uint64, onChainData []byte) (*types.Transaction, error)
+
+	InitiateDeposit(opts *bind.TransactOpts, remoteChainSelector uint64, receiver []byte, amount *big.Int) (*types.Transaction, error)
+
+	InitiateWithdrawal(opts *bind.TransactOpts, remoteSelector uint64, offChainData []byte) (*types.Transaction, error)
+
+	RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error)
+
+	SetExecutionGasLimit(opts *bind.TransactOpts, newVal *big.Int) (*types.Transaction, error)
+
+	SetRemoteChainSelector(opts *bind.TransactOpts, chain [32]byte, chainSelector uint64) (*types.Transaction, error)
+
+	TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error)
+
+	FilterBridgeChanged(opts *bind.FilterOpts, oldBridge []common.Address, newBridge []common.Address) (*CLAdapterBridgeChangedIterator, error)
+
+	WatchBridgeChanged(opts *bind.WatchOpts, sink chan<- *CLAdapterBridgeChanged, oldBridge []common.Address, newBridge []common.Address) (event.Subscription, error)
+
+	ParseBridgeChanged(log types.Log) (*CLAdapterBridgeChanged, error)
+
+	FilterCLChainSelectorSet(opts *bind.FilterOpts) (*CLAdapterCLChainSelectorSetIterator, error)
+
+	WatchCLChainSelectorSet(opts *bind.WatchOpts, sink chan<- *CLAdapterCLChainSelectorSet) (event.Subscription, error)
+
+	ParseCLChainSelectorSet(log types.Log) (*CLAdapterCLChainSelectorSet, error)
+
+	FilterCLTokenPoolDeployed(opts *bind.FilterOpts) (*CLAdapterCLTokenPoolDeployedIterator, error)
+
+	WatchCLTokenPoolDeployed(opts *bind.WatchOpts, sink chan<- *CLAdapterCLTokenPoolDeployed) (event.Subscription, error)
+
+	ParseCLTokenPoolDeployed(log types.Log) (*CLAdapterCLTokenPoolDeployed, error)
+
+	FilterExecutionGasLimitSet(opts *bind.FilterOpts, prevVal []*big.Int, newVal []*big.Int) (*CLAdapterExecutionGasLimitSetIterator, error)
+
+	WatchExecutionGasLimitSet(opts *bind.WatchOpts, sink chan<- *CLAdapterExecutionGasLimitSet, prevVal []*big.Int, newVal []*big.Int) (event.Subscription, error)
+
+	ParseExecutionGasLimitSet(log types.Log) (*CLAdapterExecutionGasLimitSet, error)
+
+	FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*CLAdapterOwnershipTransferredIterator, error)
+
+	WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *CLAdapterOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error)
+
+	ParseOwnershipTransferred(log types.Log) (*CLAdapterOwnershipTransferred, error)
+
+	ParseLog(log types.Log) (generated.AbigenLog, error)
+
+	Address() common.Address
+}
diff --git a/core/gethwrappers/ccip/generated/lbtc_token_pool/lbtc_token_pool.go b/core/gethwrappers/ccip/generated/lbtc_token_pool/lbtc_token_pool.go
new file mode 100644
index 0000000000..13ac5716fd
--- /dev/null
+++ b/core/gethwrappers/ccip/generated/lbtc_token_pool/lbtc_token_pool.go
@@ -0,0 +1,3171 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package lbtc_token_pool
+
+import (
+	"errors"
+	"fmt"
+	"math/big"
+	"strings"
+
+	ethereum "github.com/ethereum/go-ethereum"
+	"github.com/ethereum/go-ethereum/accounts/abi"
+	"github.com/ethereum/go-ethereum/accounts/abi/bind"
+	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/event"
+	"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated"
+)
+
+var (
+	_ = errors.New
+	_ = big.NewInt
+	_ = strings.NewReader
+	_ = ethereum.NotFound
+	_ = bind.Bind
+	_ = common.Big1
+	_ = types.BloomLookup
+	_ = event.NewSubscription
+	_ = abi.ConvertType
+)
+
+type PoolLockOrBurnInV1 struct {
+	Receiver            []byte
+	RemoteChainSelector uint64
+	OriginalSender      common.Address
+	Amount              *big.Int
+	LocalToken          common.Address
+}
+
+type PoolLockOrBurnOutV1 struct {
+	DestTokenAddress []byte
+	DestPoolData     []byte
+}
+
+type PoolReleaseOrMintInV1 struct {
+	OriginalSender      []byte
+	RemoteChainSelector uint64
+	Receiver            common.Address
+	Amount              *big.Int
+	LocalToken          common.Address
+	SourcePoolAddress   []byte
+	SourcePoolData      []byte
+	OffchainTokenData   []byte
+}
+
+type PoolReleaseOrMintOutV1 struct {
+	DestinationAmount *big.Int
+}
+
+type RateLimiterConfig struct {
+	IsEnabled bool
+	Capacity  *big.Int
+	Rate      *big.Int
+}
+
+type RateLimiterTokenBucket struct {
+	Tokens      *big.Int
+	LastUpdated uint32
+	IsEnabled   bool
+	Capacity    *big.Int
+	Rate        *big.Int
+}
+
+type TokenPoolChainUpdate struct {
+	RemoteChainSelector       uint64
+	RemotePoolAddresses       [][]byte
+	RemoteTokenAddress        []byte
+	OutboundRateLimiterConfig RateLimiterConfig
+	InboundRateLimiterConfig  RateLimiterConfig
+}
+
+var LombardTokenPoolMetaData = &bind.MetaData{
+	ABI: "[{\"inputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"lbtc_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"ccipRouter_\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"allowlist_\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"rmnProxy_\",\"type\":\"address\"},{\"internalType\":\"contractCLAdapter\",\"name\":\"adapter_\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"attestationEnable_\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"}],\"name\":\"AggregateValueMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"}],\"name\":\"AggregateValueRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AllowListNotEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"CallerIsNotARampOnRouter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CannotTransferToSelf\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"DisabledNonZeroRateLimit\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"expected\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"actual\",\"type\":\"uint8\"}],\"name\":\"InvalidDecimalArgs\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"rateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"InvalidRateLimitRate\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolData\",\"type\":\"bytes\"}],\"name\":\"InvalidRemoteChainDecimals\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidRemotePoolForChain\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidSourcePoolAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"InvalidToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeProposedOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"NonExistentChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"remoteDecimals\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"localDecimals\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"remoteAmount\",\"type\":\"uint256\"}],\"name\":\"OverflowDetected\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnerCannotBeZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"PoolAlreadyAdded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RateLimitMustBeDisabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenRateLimitReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"Unauthorized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"AllowListAdd\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"AllowListRemove\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Burned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remoteToken\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"ChainConfigured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"ConfigChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Locked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Minted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"rateLimitAdmin\",\"type\":\"address\"}],\"name\":\"RateLimitAdminSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Released\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"RemotePoolAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"RemotePoolRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"RouterUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"TokensConsumed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"adapter\",\"outputs\":[{\"internalType\":\"contractCLAdapter\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"addRemotePool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"removes\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"adds\",\"type\":\"address[]\"}],\"name\":\"applyAllowListUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64[]\",\"name\":\"remoteChainSelectorsToRemove\",\"type\":\"uint64[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes[]\",\"name\":\"remotePoolAddresses\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"remoteTokenAddress\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"internalType\":\"structTokenPool.ChainUpdate[]\",\"name\":\"chainsToAdd\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowList\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowListEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getCurrentInboundRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getCurrentOutboundRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRateLimitAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRemotePools\",\"outputs\":[{\"internalType\":\"bytes[]\",\"name\":\"\",\"type\":\"bytes[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRemoteToken\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRmnProxy\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSupportedChains\",\"outputs\":[{\"internalType\":\"uint64[]\",\"name\":\"\",\"type\":\"uint64[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"token\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenDecimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isAttestationEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"isRemotePool\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"isSupportedChain\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"isSupportedToken\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"originalSender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"}],\"internalType\":\"structPool.LockOrBurnInV1\",\"name\":\"lockOrBurnIn\",\"type\":\"tuple\"}],\"name\":\"lockOrBurn\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destPoolData\",\"type\":\"bytes\"}],\"internalType\":\"structPool.LockOrBurnOutV1\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"originalSender\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"sourcePoolData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"offchainTokenData\",\"type\":\"bytes\"}],\"internalType\":\"structPool.ReleaseOrMintInV1\",\"name\":\"releaseOrMintIn\",\"type\":\"tuple\"}],\"name\":\"releaseOrMint\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"destinationAmount\",\"type\":\"uint256\"}],\"internalType\":\"structPool.ReleaseOrMintOutV1\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"removeRemotePool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundConfig\",\"type\":\"tuple\"}],\"name\":\"setChainRateLimiterConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rateLimitAdmin\",\"type\":\"address\"}],\"name\":\"setRateLimitAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"setRouter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
+	Bin: "0x6101006040523480156200001257600080fd5b50604051620046dd380380620046dd8339810160408190526200003591620005d1565b856008858588336000816200005d57604051639b15e16f60e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0384811691909117909155811615620000905762000090816200021b565b50506001600160a01b0385161580620000b057506001600160a01b038116155b80620000c357506001600160a01b038216155b15620000e2576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b03808616608081905290831660c0526040805163313ce56760e01b8152905163313ce567916004808201926020929091908290030181865afa92505050801562000152575060408051601f3d908101601f191682019092526200014f9181019062000708565b60015b1562000192578060ff168560ff161462000190576040516332ad3e0760e11b815260ff80871660048301528216602482015260440160405180910390fd5b505b60ff841660a052600480546001600160a01b0319166001600160a01b038316179055825115801560e052620001dc57604080516000815260208101909152620001dc908462000295565b5050600a8054941515600160a01b026001600160a81b03199095166001600160a01b039096169590951793909317909355506200078295505050505050565b336001600160a01b038216036200024557604051636d6c4ee560e11b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b03838116918217835560015460405192939116917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60e051620002b6576040516335f4a7b360e01b815260040160405180910390fd5b60005b825181101562000341576000838281518110620002da57620002da62000734565b60209081029190910101519050620002f4600282620003f2565b1562000337576040516001600160a01b03821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b50600101620002b9565b5060005b8151811015620003ed57600082828151811062000366576200036662000734565b6020026020010151905060006001600160a01b0316816001600160a01b031603620003925750620003e4565b6200039f60028262000412565b15620003e2576040516001600160a01b03821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b60010162000345565b505050565b600062000409836001600160a01b03841662000429565b90505b92915050565b600062000409836001600160a01b0384166200052d565b6000818152600183016020526040812054801562000522576000620004506001836200074a565b855490915060009062000466906001906200074a565b9050808214620004d25760008660000182815481106200048a576200048a62000734565b9060005260206000200154905080876000018481548110620004b057620004b062000734565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080620004e657620004e66200076c565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506200040c565b60009150506200040c565b600081815260018301602052604081205462000576575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556200040c565b5060006200040c565b6001600160a01b03811681146200059557600080fd5b50565b8051620005a5816200057f565b919050565b634e487b7160e01b600052604160045260246000fd5b80518015158114620005a557600080fd5b60008060008060008060c08789031215620005eb57600080fd5b8651620005f8816200057f565b809650506020808801516200060d816200057f565b60408901519096506001600160401b03808211156200062b57600080fd5b818a0191508a601f8301126200064057600080fd5b815181811115620006555762000655620005aa565b8060051b604051601f19603f830116810181811085821117156200067d576200067d620005aa565b60405291825284820192508381018501918d8311156200069c57600080fd5b938501935b82851015620006c557620006b58562000598565b84529385019392850192620006a1565b809950505050505050620006dc6060880162000598565b9250620006ec6080880162000598565b9150620006fc60a08801620005c0565b90509295509295509295565b6000602082840312156200071b57600080fd5b815160ff811681146200072d57600080fd5b9392505050565b634e487b7160e01b600052603260045260246000fd5b818103818111156200040c57634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60805160a05160c05160e051613ee9620007f46000396000818161056701528181611d1501526126c401526000818161054101528181611b0a0152612001015260006102c601526000818161024e0152818161028201528181610bec0152818161265a01526128af0152613ee96000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c80639a4575b911610104578063c0d78655116100a2578063dc0bd97111610071578063dc0bd9711461053f578063e0351e1314610565578063e8a1da171461058b578063f2fde38b1461059e57600080fd5b8063c0d78655146104f1578063c4bffe2b14610504578063c75eea9c14610519578063cf7401f31461052c57600080fd5b8063acfecf91116100de578063acfecf9114610431578063af58d59f14610444578063b0f479a1146104b3578063b7946580146104d157600080fd5b80639a4575b9146103dc578063a42a7b8b146103fc578063a7cd63b71461041c57600080fd5b806354c8a4f31161017c57806379ba50971161014b57806379ba5097146103905780637d54534e146103985780638926f54f146103ab5780638da5cb5b146103be57600080fd5b806354c8a4f31461032557806355b961561461033a57806362ddd3c41461035f5780636d3d1a581461037257600080fd5b8063240028e8116101b8578063240028e81461027257806324f65ee7146102bf57806339077537146102f05780634c5ef0ed1461031257600080fd5b806301ffc9a7146101df57806303eadcfc1461020757806321df0da71461024c575b600080fd5b6101f26101ed36600461306f565b6105b1565b60405190151581526020015b60405180910390f35b600a546102279073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101fe565b7f0000000000000000000000000000000000000000000000000000000000000000610227565b6101f26102803660046130d3565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff90811691161490565b60405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020016101fe565b6103036102fe3660046130f0565b610696565b604051905181526020016101fe565b6101f2610320366004613142565b6108b5565b610338610333366004613213565b6108ff565b005b600a546101f29074010000000000000000000000000000000000000000900460ff1681565b61033861036d366004613142565b61097a565b60095473ffffffffffffffffffffffffffffffffffffffff16610227565b610338610a17565b6103386103a63660046130d3565b610ae5565b6101f26103b936600461327f565b610b66565b60015473ffffffffffffffffffffffffffffffffffffffff16610227565b6103ef6103ea36600461329c565b610b7d565b6040516101fe9190613345565b61040f61040a36600461327f565b610e59565b6040516101fe919061339c565b610424610fc4565b6040516101fe919061341e565b61033861043f366004613142565b610fd5565b61045761045236600461327f565b6110ed565b6040516101fe919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b60045473ffffffffffffffffffffffffffffffffffffffff16610227565b6104e46104df36600461327f565b6111c2565b6040516101fe9190613478565b6103386104ff3660046130d3565b611272565b61050c61134d565b6040516101fe919061348b565b61045761052736600461327f565b611405565b61033861053a3660046135ef565b6114d7565b7f0000000000000000000000000000000000000000000000000000000000000000610227565b7f00000000000000000000000000000000000000000000000000000000000000006101f2565b610338610599366004613213565b61155b565b6103386105ac3660046130d3565b611a6d565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167faff2afbf00000000000000000000000000000000000000000000000000000000148061064457507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e64dd2900000000000000000000000000000000000000000000000000000000145b8061069057507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6040805160208101909152600081526106ae82611a81565b600a5460009074010000000000000000000000000000000000000000900460ff161561077757600a5473ffffffffffffffffffffffffffffffffffffffff16635391a405610702604086016020870161327f565b61070f60e0870187613636565b6040518463ffffffff1660e01b815260040161072d939291906136e4565b6020604051808303816000875af115801561074c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107709190613708565b9050610816565b600a5473ffffffffffffffffffffffffffffffffffffffff16630c373d746107a5604086016020870161327f565b6107b260c0870187613636565b6040518463ffffffff1660e01b81526004016107d0939291906136e4565b6020604051808303816000875af11580156107ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108139190613708565b90505b61082660608401604085016130d3565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f08367ffffffffffffffff1660405161088e91815260200190565b60405180910390a3604080516020810190915267ffffffffffffffff909116815292915050565b60006108f783836040516108ca929190613725565b604080519182900390912067ffffffffffffffff8716600090815260076020529190912060050190611ca5565b949350505050565b610907611cc0565b61097484848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808802828101820190935287825290935087925086918291850190849080828437600092019190915250611d1392505050565b50505050565b610982611cc0565b61098b83610b66565b6109d2576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024015b60405180910390fd5b610a128383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611ec992505050565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a68576040517f02b543c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000008082163390811790935560008054909116815560405173ffffffffffffffffffffffffffffffffffffffff909216929183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610aed611cc0565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f44676b5284b809a22248eba0da87391d79098be38bb03154be88a58bf4d091749060200160405180910390a150565b6000610690600567ffffffffffffffff8416611ca5565b6040805180820190915260608082526020820152610b9a82611fc3565b600a546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9182166004820152606084013560248201527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303816000875af1158015610c37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5b9190613735565b50600a54600090819073ffffffffffffffffffffffffffffffffffffffff1663550e7ab2610c8f604087016020880161327f565b610c998780613636565b88606001356040518563ffffffff1660e01b8152600401610cbd9493929190613752565b6000604051808303816000875af1158015610cdc573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610d2291908101906137cd565b9092509050610d3760608501604086016130d3565b73ffffffffffffffffffffffffffffffffffffffff167f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df783604051610d7e91815260200190565b60405180910390a2600a5460609074010000000000000000000000000000000000000000900460ff1615610e2457600282604051610dbc9190613855565b602060405180830381855afa158015610dd9573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610dfc9190613871565b604051602001610e0e91815260200190565b6040516020818303038152906040529050610e27565b50805b6040518060400160405280610e488760200160208101906104df919061327f565b815260200191909152949350505050565b67ffffffffffffffff8116600090815260076020526040812060609190610e829060050161214f565b90506000815167ffffffffffffffff811115610ea057610ea06134cd565b604051908082528060200260200182016040528015610ed357816020015b6060815260200190600190039081610ebe5790505b50905060005b8251811015610fbc5760086000848381518110610ef857610ef861388a565b602002602001015181526020019081526020016000208054610f19906138b9565b80601f0160208091040260200160405190810160405280929190818152602001828054610f45906138b9565b8015610f925780601f10610f6757610100808354040283529160200191610f92565b820191906000526020600020905b815481529060010190602001808311610f7557829003601f168201915b5050505050828281518110610fa957610fa961388a565b6020908102919091010152600101610ed9565b509392505050565b6060610fd0600261214f565b905090565b610fdd611cc0565b610fe683610b66565b611028576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024016109c9565b611068828260405161103b929190613725565b604080519182900390912067ffffffffffffffff861660009081526007602052919091206005019061215c565b6110a4578282826040517f74f23c7c0000000000000000000000000000000000000000000000000000000081526004016109c9939291906136e4565b8267ffffffffffffffff167f52d00ee4d9bd51b40168f2afc5848837288ce258784ad914278791464b3f4d7683836040516110e092919061390c565b60405180910390a2505050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845260028201546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff16151594820194909452600390910154808416606083015291909104909116608082015261069090612168565b67ffffffffffffffff811660009081526007602052604090206004018054606091906111ed906138b9565b80601f0160208091040260200160405190810160405280929190818152602001828054611219906138b9565b80156112665780601f1061123b57610100808354040283529160200191611266565b820191906000526020600020905b81548152906001019060200180831161124957829003601f168201915b50505050509050919050565b61127a611cc0565b73ffffffffffffffffffffffffffffffffffffffff81166112c7576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f1684910160405180910390a15050565b6060600061135b600561214f565b90506000815167ffffffffffffffff811115611379576113796134cd565b6040519080825280602002602001820160405280156113a2578160200160208202803683370190505b50905060005b82518110156113fe578281815181106113c3576113c361388a565b60200260200101518282815181106113dd576113dd61388a565b67ffffffffffffffff909216602092830291909101909101526001016113a8565b5092915050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845281546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff16151594820194909452600190910154808416606083015291909104909116608082015261069090612168565b60095473ffffffffffffffffffffffffffffffffffffffff163314801590611517575060015473ffffffffffffffffffffffffffffffffffffffff163314155b15611550576040517f8e4a23d60000000000000000000000000000000000000000000000000000000081523360048201526024016109c9565b610a1283838361221a565b611563611cc0565b60005b838110156117505760008585838181106115825761158261388a565b9050602002016020810190611597919061327f565b90506115ae600567ffffffffffffffff831661215c565b6115f0576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff821660048201526024016109c9565b67ffffffffffffffff811660009081526007602052604081206116159060050161214f565b905060005b8151811015611681576116788282815181106116385761163861388a565b6020026020010151600760008667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060050161215c90919063ffffffff16565b5060010161161a565b5067ffffffffffffffff8216600090815260076020526040812080547fffffffffffffffffffffff000000000000000000000000000000000000000000908116825560018201839055600282018054909116905560038101829055906116ea6004830182613002565b60058201600081816116fc828261303c565b505060405167ffffffffffffffff871681527f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d8599169450602001925061173e915050565b60405180910390a15050600101611566565b5060005b81811015611a665760008383838181106117705761177061388a565b90506020028101906117829190613920565b61178b90613a44565b905061179c81606001516000612304565b6117ab81608001516000612304565b8060400151516000036117ea576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80516118029060059067ffffffffffffffff16612441565b6118475780516040517f1d5ad3c500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016109c9565b805167ffffffffffffffff16600090815260076020908152604091829020825160a08082018552606080870180518601516fffffffffffffffffffffffffffffffff90811680865263ffffffff42168689018190528351511515878b0181905284518a0151841686890181905294518b0151841660809889018190528954740100000000000000000000000000000000000000009283027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff7001000000000000000000000000000000008087027fffffffffffffffffffffffff000000000000000000000000000000000000000094851690981788178216929092178d5592810290971760018c01558c519889018d52898e0180518d01518716808b528a8e019590955280515115158a8f018190528151909d01518716988a01899052518d0151909516979098018790526002890180549a9091029990931617179094169590951790925590920290911760038201559082015160048201906119ca9082613b54565b5060005b826020015151811015611a0e57611a068360000151846020015183815181106119f9576119f961388a565b6020026020010151611ec9565b6001016119ce565b507f8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c28260000151836040015184606001518560800151604051611a549493929190613c6e565b60405180910390a15050600101611754565b5050505050565b611a75611cc0565b611a7e8161244d565b50565b611a9461028060a08301608084016130d3565b611af357611aa860a08201608083016130d3565b6040517f961c9a4f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016109c9565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016632cbc26bb611b3f604084016020850161327f565b60405160e083901b7fffffffff0000000000000000000000000000000000000000000000000000000016815260809190911b77ffffffffffffffff00000000000000000000000000000000166004820152602401602060405180830381865afa158015611bb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd49190613735565b15611c0b576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c23611c1e604083016020840161327f565b612511565b611c43611c36604083016020840161327f565b61032060a0840184613636565b611c8857611c5460a0820182613636565b6040517f24eb47e50000000000000000000000000000000000000000000000000000000081526004016109c992919061390c565b611a7e611c9b604083016020840161327f565b8260600135612637565b600081815260018301602052604081205415155b9392505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611d11576040517f2b5c74de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b7f0000000000000000000000000000000000000000000000000000000000000000611d6a576040517f35f4a7b300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8251811015611e00576000838281518110611d8a57611d8a61388a565b60200260200101519050611da881600261267e90919063ffffffff16565b15611df75760405173ffffffffffffffffffffffffffffffffffffffff821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b50600101611d6d565b5060005b8151811015610a12576000828281518110611e2157611e2161388a565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e655750611ec1565b611e706002826126a0565b15611ebf5760405173ffffffffffffffffffffffffffffffffffffffff821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b600101611e04565b8051600003611f04576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805160208083019190912067ffffffffffffffff8416600090815260079092526040909120611f369060050182612441565b611f705782826040517f393b8ad20000000000000000000000000000000000000000000000000000000081526004016109c9929190613d07565b6000818152600860205260409020611f888382613b54565b508267ffffffffffffffff167f7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea836040516110e09190613478565b611fd661028060a08301608084016130d3565b611fea57611aa860a08201608083016130d3565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016632cbc26bb612036604084016020850161327f565b60405160e083901b7fffffffff0000000000000000000000000000000000000000000000000000000016815260809190911b77ffffffffffffffff00000000000000000000000000000000166004820152602401602060405180830381865afa1580156120a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120cb9190613735565b15612102576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61211a61211560608301604084016130d3565b6126c2565b61213261212d604083016020840161327f565b612741565b611a7e612145604083016020840161327f565b826060013561288f565b60606000611cb9836128d3565b6000611cb9838361292e565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526121f682606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff16426121da9190613d59565b85608001516fffffffffffffffffffffffffffffffff16612a21565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b61222383610b66565b612265576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024016109c9565b612270826000612304565b67ffffffffffffffff831660009081526007602052604090206122939083612a49565b61229e816000612304565b67ffffffffffffffff831660009081526007602052604090206122c49060020182612a49565b7f0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b8383836040516122f793929190613d6c565b60405180910390a1505050565b8151156123cf5781602001516fffffffffffffffffffffffffffffffff1682604001516fffffffffffffffffffffffffffffffff1610158061235a575060408201516fffffffffffffffffffffffffffffffff16155b1561239357816040517f8020d1240000000000000000000000000000000000000000000000000000000081526004016109c99190613def565b80156123cb576040517f433fc33d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b60408201516fffffffffffffffffffffffffffffffff16151580612408575060208201516fffffffffffffffffffffffffffffffff1615155b156123cb57816040517fd68af9cc0000000000000000000000000000000000000000000000000000000081526004016109c99190613def565b6000611cb98383612beb565b3373ffffffffffffffffffffffffffffffffffffffff82160361249c576040517fdad89dca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116918217835560015460405192939116917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b61251a81610b66565b61255c576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff821660048201526024016109c9565b600480546040517f83826b2b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925233602483015273ffffffffffffffffffffffffffffffffffffffff16906383826b2b90604401602060405180830381865afa1580156125db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ff9190613735565b611a7e576040517f728fe07b0000000000000000000000000000000000000000000000000000000081523360048201526024016109c9565b67ffffffffffffffff821660009081526007602052604090206123cb90600201827f0000000000000000000000000000000000000000000000000000000000000000612c3a565b6000611cb98373ffffffffffffffffffffffffffffffffffffffff841661292e565b6000611cb98373ffffffffffffffffffffffffffffffffffffffff8416612beb565b7f000000000000000000000000000000000000000000000000000000000000000015611a7e576126f3600282612fbd565b611a7e576040517fd0d2597600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024016109c9565b61274a81610b66565b61278c576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff821660048201526024016109c9565b600480546040517fa8d87a3b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925273ffffffffffffffffffffffffffffffffffffffff169063a8d87a3b90602401602060405180830381865afa158015612805573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128299190613e2b565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a7e576040517f728fe07b0000000000000000000000000000000000000000000000000000000081523360048201526024016109c9565b67ffffffffffffffff821660009081526007602052604090206123cb90827f0000000000000000000000000000000000000000000000000000000000000000612c3a565b60608160000180548060200260200160405190810160405280929190818152602001828054801561126657602002820191906000526020600020905b81548152602001906001019080831161290f5750505050509050919050565b60008181526001830160205260408120548015612a17576000612952600183613d59565b855490915060009061296690600190613d59565b90508082146129cb5760008660000182815481106129865761298661388a565b90600052602060002001549050808760000184815481106129a9576129a961388a565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806129dc576129dc613e48565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610690565b6000915050610690565b6000612a4085612a318486613e77565b612a3b9087613e8e565b612fec565b95945050505050565b8154600090612a7290700100000000000000000000000000000000900463ffffffff1642613d59565b90508015612b145760018301548354612aba916fffffffffffffffffffffffffffffffff80821692811691859170010000000000000000000000000000000090910416612a21565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b60208201518354612b3a916fffffffffffffffffffffffffffffffff9081169116612fec565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19906122f7908490613def565b6000818152600183016020526040812054612c3257508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610690565b506000610690565b825474010000000000000000000000000000000000000000900460ff161580612c61575081155b15612c6b57505050565b825460018401546fffffffffffffffffffffffffffffffff80831692911690600090612cb190700100000000000000000000000000000000900463ffffffff1642613d59565b90508015612d715781831115612cf3576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001860154612d2d9083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16612a21565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b84821015612e285773ffffffffffffffffffffffffffffffffffffffff8416612dd0576040517ff94ebcd100000000000000000000000000000000000000000000000000000000815260048101839052602481018690526044016109c9565b6040517f1a76572a000000000000000000000000000000000000000000000000000000008152600481018390526024810186905273ffffffffffffffffffffffffffffffffffffffff851660448201526064016109c9565b84831015612f3b5760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16906000908290612e6c9082613d59565b612e76878a613d59565b612e809190613e8e565b612e8a9190613ea1565b905073ffffffffffffffffffffffffffffffffffffffff8616612ee3576040517f15279c0800000000000000000000000000000000000000000000000000000000815260048101829052602481018690526044016109c9565b6040517fd0c8d23a000000000000000000000000000000000000000000000000000000008152600481018290526024810186905273ffffffffffffffffffffffffffffffffffffffff871660448201526064016109c9565b612f458584613d59565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515611cb9565b6000818310612ffb5781611cb9565b5090919050565b50805461300e906138b9565b6000825580601f1061301e575050565b601f016020900490600052602060002090810190611a7e9190613056565b5080546000825590600052602060002090810190611a7e91905b5b8082111561306b5760008155600101613057565b5090565b60006020828403121561308157600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114611cb957600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114611a7e57600080fd5b6000602082840312156130e557600080fd5b8135611cb9816130b1565b60006020828403121561310257600080fd5b813567ffffffffffffffff81111561311957600080fd5b82016101008185031215611cb957600080fd5b67ffffffffffffffff81168114611a7e57600080fd5b60008060006040848603121561315757600080fd5b83356131628161312c565b9250602084013567ffffffffffffffff8082111561317f57600080fd5b818601915086601f83011261319357600080fd5b8135818111156131a257600080fd5b8760208285010111156131b457600080fd5b6020830194508093505050509250925092565b60008083601f8401126131d957600080fd5b50813567ffffffffffffffff8111156131f157600080fd5b6020830191508360208260051b850101111561320c57600080fd5b9250929050565b6000806000806040858703121561322957600080fd5b843567ffffffffffffffff8082111561324157600080fd5b61324d888389016131c7565b9096509450602087013591508082111561326657600080fd5b50613273878288016131c7565b95989497509550505050565b60006020828403121561329157600080fd5b8135611cb98161312c565b6000602082840312156132ae57600080fd5b813567ffffffffffffffff8111156132c557600080fd5b820160a08185031215611cb957600080fd5b60005b838110156132f25781810151838201526020016132da565b50506000910152565b600081518084526133138160208601602086016132d7565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600082516040602084015261336160608401826132fb565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848303016040850152612a4082826132fb565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b82811015613411577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526133ff8583516132fb565b945092850192908501906001016133c5565b5092979650505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561346c57835173ffffffffffffffffffffffffffffffffffffffff168352928401929184019160010161343a565b50909695505050505050565b602081526000611cb960208301846132fb565b6020808252825182820181905260009190848201906040850190845b8181101561346c57835167ffffffffffffffff16835292840192918401916001016134a7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613543576135436134cd565b604052919050565b8015158114611a7e57600080fd5b80356fffffffffffffffffffffffffffffffff8116811461357957600080fd5b919050565b60006060828403121561359057600080fd5b6040516060810181811067ffffffffffffffff821117156135b3576135b36134cd565b60405290508082356135c48161354b565b81526135d260208401613559565b60208201526135e360408401613559565b60408201525092915050565b600080600060e0848603121561360457600080fd5b833561360f8161312c565b925061361e856020860161357e565b915061362d856080860161357e565b90509250925092565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261366b57600080fd5b83018035915067ffffffffffffffff82111561368657600080fd5b60200191503681900382131561320c57600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b67ffffffffffffffff84168152604060208201526000612a4060408301848661369b565b60006020828403121561371a57600080fd5b8151611cb98161312c565b8183823760009101908152919050565b60006020828403121561374757600080fd5b8151611cb98161354b565b67ffffffffffffffff8516815260606020820152600061377660608301858761369b565b905082604083015295945050505050565b600067ffffffffffffffff8211156137a1576137a16134cd565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600080604083850312156137e057600080fd5b82519150602083015167ffffffffffffffff8111156137fe57600080fd5b8301601f8101851361380f57600080fd5b805161382261381d82613787565b6134fc565b81815286602083850101111561383757600080fd5b6138488260208301602086016132d7565b8093505050509250929050565b600082516138678184602087016132d7565b9190910192915050565b60006020828403121561388357600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600181811c908216806138cd57607f821691505b602082108103613906577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b6020815260006108f760208301848661369b565b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee183360301811261386757600080fd5b600082601f83011261396557600080fd5b813561397361381d82613787565b81815284602083860101111561398857600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f8301126139b657600080fd5b8135602067ffffffffffffffff808311156139d3576139d36134cd565b8260051b6139e28382016134fc565b93845285810183019383810190888611156139fc57600080fd5b84880192505b85831015613a3857823584811115613a1a5760008081fd5b613a288a87838c0101613954565b8352509184019190840190613a02565b98975050505050505050565b60006101208236031215613a5757600080fd5b60405160a0810167ffffffffffffffff8282108183111715613a7b57613a7b6134cd565b8160405284359150613a8c8261312c565b90825260208401359080821115613aa257600080fd5b613aae368387016139a5565b60208401526040850135915080821115613ac757600080fd5b50613ad436828601613954565b604083015250613ae7366060850161357e565b6060820152613af93660c0850161357e565b608082015292915050565b601f821115610a12576000816000526020600020601f850160051c81016020861015613b2d5750805b601f850160051c820191505b81811015613b4c57828155600101613b39565b505050505050565b815167ffffffffffffffff811115613b6e57613b6e6134cd565b613b8281613b7c84546138b9565b84613b04565b602080601f831160018114613bd55760008415613b9f5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613b4c565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613c2257888601518255948401946001909101908401613c03565b5085821015613c5e57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600061010067ffffffffffffffff87168352806020840152613c92818401876132fb565b8551151560408581019190915260208701516fffffffffffffffffffffffffffffffff9081166060870152908701511660808501529150613cd09050565b8251151560a083015260208301516fffffffffffffffffffffffffffffffff90811660c084015260408401511660e0830152612a40565b67ffffffffffffffff831681526040602082015260006108f760408301846132fb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561069057610690613d2a565b67ffffffffffffffff8416815260e08101613db860208301858051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b82511515608083015260208301516fffffffffffffffffffffffffffffffff90811660a084015260408401511660c08301526108f7565b6060810161069082848051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b600060208284031215613e3d57600080fd5b8151611cb9816130b1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b808202811582820484141761069057610690613d2a565b8082018082111561069057610690613d2a565b600082613ed7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50049056fea164736f6c6343000818000a",
+}
+
+var LombardTokenPoolABI = LombardTokenPoolMetaData.ABI
+
+var LombardTokenPoolBin = LombardTokenPoolMetaData.Bin
+
+func DeployLombardTokenPool(auth *bind.TransactOpts, backend bind.ContractBackend, lbtc_ common.Address, ccipRouter_ common.Address, allowlist_ []common.Address, rmnProxy_ common.Address, adapter_ common.Address, attestationEnable_ bool) (common.Address, *types.Transaction, *LombardTokenPool, error) {
+	parsed, err := LombardTokenPoolMetaData.GetAbi()
+	if err != nil {
+		return common.Address{}, nil, nil, err
+	}
+	if parsed == nil {
+		return common.Address{}, nil, nil, errors.New("GetABI returned nil")
+	}
+
+	address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(LombardTokenPoolBin), backend, lbtc_, ccipRouter_, allowlist_, rmnProxy_, adapter_, attestationEnable_)
+	if err != nil {
+		return common.Address{}, nil, nil, err
+	}
+	return address, tx, &LombardTokenPool{address: address, abi: *parsed, LombardTokenPoolCaller: LombardTokenPoolCaller{contract: contract}, LombardTokenPoolTransactor: LombardTokenPoolTransactor{contract: contract}, LombardTokenPoolFilterer: LombardTokenPoolFilterer{contract: contract}}, nil
+}
+
+type LombardTokenPool struct {
+	address common.Address
+	abi     abi.ABI
+	LombardTokenPoolCaller
+	LombardTokenPoolTransactor
+	LombardTokenPoolFilterer
+}
+
+type LombardTokenPoolCaller struct {
+	contract *bind.BoundContract
+}
+
+type LombardTokenPoolTransactor struct {
+	contract *bind.BoundContract
+}
+
+type LombardTokenPoolFilterer struct {
+	contract *bind.BoundContract
+}
+
+type LombardTokenPoolSession struct {
+	Contract     *LombardTokenPool
+	CallOpts     bind.CallOpts
+	TransactOpts bind.TransactOpts
+}
+
+type LombardTokenPoolCallerSession struct {
+	Contract *LombardTokenPoolCaller
+	CallOpts bind.CallOpts
+}
+
+type LombardTokenPoolTransactorSession struct {
+	Contract     *LombardTokenPoolTransactor
+	TransactOpts bind.TransactOpts
+}
+
+type LombardTokenPoolRaw struct {
+	Contract *LombardTokenPool
+}
+
+type LombardTokenPoolCallerRaw struct {
+	Contract *LombardTokenPoolCaller
+}
+
+type LombardTokenPoolTransactorRaw struct {
+	Contract *LombardTokenPoolTransactor
+}
+
+func NewLombardTokenPool(address common.Address, backend bind.ContractBackend) (*LombardTokenPool, error) {
+	abi, err := abi.JSON(strings.NewReader(LombardTokenPoolABI))
+	if err != nil {
+		return nil, err
+	}
+	contract, err := bindLombardTokenPool(address, backend, backend, backend)
+	if err != nil {
+		return nil, err
+	}
+	return &LombardTokenPool{address: address, abi: abi, LombardTokenPoolCaller: LombardTokenPoolCaller{contract: contract}, LombardTokenPoolTransactor: LombardTokenPoolTransactor{contract: contract}, LombardTokenPoolFilterer: LombardTokenPoolFilterer{contract: contract}}, nil
+}
+
+func NewLombardTokenPoolCaller(address common.Address, caller bind.ContractCaller) (*LombardTokenPoolCaller, error) {
+	contract, err := bindLombardTokenPool(address, caller, nil, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &LombardTokenPoolCaller{contract: contract}, nil
+}
+
+func NewLombardTokenPoolTransactor(address common.Address, transactor bind.ContractTransactor) (*LombardTokenPoolTransactor, error) {
+	contract, err := bindLombardTokenPool(address, nil, transactor, nil)
+	if err != nil {
+		return nil, err
+	}
+	return &LombardTokenPoolTransactor{contract: contract}, nil
+}
+
+func NewLombardTokenPoolFilterer(address common.Address, filterer bind.ContractFilterer) (*LombardTokenPoolFilterer, error) {
+	contract, err := bindLombardTokenPool(address, nil, nil, filterer)
+	if err != nil {
+		return nil, err
+	}
+	return &LombardTokenPoolFilterer{contract: contract}, nil
+}
+
+func bindLombardTokenPool(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+	parsed, err := LombardTokenPoolMetaData.GetAbi()
+	if err != nil {
+		return nil, err
+	}
+	return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil
+}
+
+func (_LombardTokenPool *LombardTokenPoolRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _LombardTokenPool.Contract.LombardTokenPoolCaller.contract.Call(opts, result, method, params...)
+}
+
+func (_LombardTokenPool *LombardTokenPoolRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _LombardTokenPool.Contract.LombardTokenPoolTransactor.contract.Transfer(opts)
+}
+
+func (_LombardTokenPool *LombardTokenPoolRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _LombardTokenPool.Contract.LombardTokenPoolTransactor.contract.Transact(opts, method, params...)
+}
+
+func (_LombardTokenPool *LombardTokenPoolCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+	return _LombardTokenPool.Contract.contract.Call(opts, result, method, params...)
+}
+
+func (_LombardTokenPool *LombardTokenPoolTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _LombardTokenPool.Contract.contract.Transfer(opts)
+}
+
+func (_LombardTokenPool *LombardTokenPoolTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+	return _LombardTokenPool.Contract.contract.Transact(opts, method, params...)
+}
+
+func (_LombardTokenPool *LombardTokenPoolCaller) Adapter(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _LombardTokenPool.contract.Call(opts, &out, "adapter")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+func (_LombardTokenPool *LombardTokenPoolSession) Adapter() (common.Address, error) {
+	return _LombardTokenPool.Contract.Adapter(&_LombardTokenPool.CallOpts)
+}
+
+func (_LombardTokenPool *LombardTokenPoolCallerSession) Adapter() (common.Address, error) {
+	return _LombardTokenPool.Contract.Adapter(&_LombardTokenPool.CallOpts)
+}
+
+func (_LombardTokenPool *LombardTokenPoolCaller) GetAllowList(opts *bind.CallOpts) ([]common.Address, error) {
+	var out []interface{}
+	err := _LombardTokenPool.contract.Call(opts, &out, "getAllowList")
+
+	if err != nil {
+		return *new([]common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address)
+
+	return out0, err
+
+}
+
+func (_LombardTokenPool *LombardTokenPoolSession) GetAllowList() ([]common.Address, error) {
+	return _LombardTokenPool.Contract.GetAllowList(&_LombardTokenPool.CallOpts)
+}
+
+func (_LombardTokenPool *LombardTokenPoolCallerSession) GetAllowList() ([]common.Address, error) {
+	return _LombardTokenPool.Contract.GetAllowList(&_LombardTokenPool.CallOpts)
+}
+
+func (_LombardTokenPool *LombardTokenPoolCaller) GetAllowListEnabled(opts *bind.CallOpts) (bool, error) {
+	var out []interface{}
+	err := _LombardTokenPool.contract.Call(opts, &out, "getAllowListEnabled")
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+func (_LombardTokenPool *LombardTokenPoolSession) GetAllowListEnabled() (bool, error) {
+	return _LombardTokenPool.Contract.GetAllowListEnabled(&_LombardTokenPool.CallOpts)
+}
+
+func (_LombardTokenPool *LombardTokenPoolCallerSession) GetAllowListEnabled() (bool, error) {
+	return _LombardTokenPool.Contract.GetAllowListEnabled(&_LombardTokenPool.CallOpts)
+}
+
+func (_LombardTokenPool *LombardTokenPoolCaller) GetCurrentInboundRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64) (RateLimiterTokenBucket, error) {
+	var out []interface{}
+	err := _LombardTokenPool.contract.Call(opts, &out, "getCurrentInboundRateLimiterState", remoteChainSelector)
+
+	if err != nil {
+		return *new(RateLimiterTokenBucket), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(RateLimiterTokenBucket)).(*RateLimiterTokenBucket)
+
+	return out0, err
+
+}
+
+func (_LombardTokenPool *LombardTokenPoolSession) GetCurrentInboundRateLimiterState(remoteChainSelector uint64) (RateLimiterTokenBucket, error) {
+	return _LombardTokenPool.Contract.GetCurrentInboundRateLimiterState(&_LombardTokenPool.CallOpts, remoteChainSelector)
+}
+
+func (_LombardTokenPool *LombardTokenPoolCallerSession) GetCurrentInboundRateLimiterState(remoteChainSelector uint64) (RateLimiterTokenBucket, error) {
+	return _LombardTokenPool.Contract.GetCurrentInboundRateLimiterState(&_LombardTokenPool.CallOpts, remoteChainSelector)
+}
+
+func (_LombardTokenPool *LombardTokenPoolCaller) GetCurrentOutboundRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64) (RateLimiterTokenBucket, error) {
+	var out []interface{}
+	err := _LombardTokenPool.contract.Call(opts, &out, "getCurrentOutboundRateLimiterState", remoteChainSelector)
+
+	if err != nil {
+		return *new(RateLimiterTokenBucket), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(RateLimiterTokenBucket)).(*RateLimiterTokenBucket)
+
+	return out0, err
+
+}
+
+func (_LombardTokenPool *LombardTokenPoolSession) GetCurrentOutboundRateLimiterState(remoteChainSelector uint64) (RateLimiterTokenBucket, error) {
+	return _LombardTokenPool.Contract.GetCurrentOutboundRateLimiterState(&_LombardTokenPool.CallOpts, remoteChainSelector)
+}
+
+func (_LombardTokenPool *LombardTokenPoolCallerSession) GetCurrentOutboundRateLimiterState(remoteChainSelector uint64) (RateLimiterTokenBucket, error) {
+	return _LombardTokenPool.Contract.GetCurrentOutboundRateLimiterState(&_LombardTokenPool.CallOpts, remoteChainSelector)
+}
+
+func (_LombardTokenPool *LombardTokenPoolCaller) GetRateLimitAdmin(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _LombardTokenPool.contract.Call(opts, &out, "getRateLimitAdmin")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+func (_LombardTokenPool *LombardTokenPoolSession) GetRateLimitAdmin() (common.Address, error) {
+	return _LombardTokenPool.Contract.GetRateLimitAdmin(&_LombardTokenPool.CallOpts)
+}
+
+func (_LombardTokenPool *LombardTokenPoolCallerSession) GetRateLimitAdmin() (common.Address, error) {
+	return _LombardTokenPool.Contract.GetRateLimitAdmin(&_LombardTokenPool.CallOpts)
+}
+
+func (_LombardTokenPool *LombardTokenPoolCaller) GetRemotePools(opts *bind.CallOpts, remoteChainSelector uint64) ([][]byte, error) {
+	var out []interface{}
+	err := _LombardTokenPool.contract.Call(opts, &out, "getRemotePools", remoteChainSelector)
+
+	if err != nil {
+		return *new([][]byte), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new([][]byte)).(*[][]byte)
+
+	return out0, err
+
+}
+
+func (_LombardTokenPool *LombardTokenPoolSession) GetRemotePools(remoteChainSelector uint64) ([][]byte, error) {
+	return _LombardTokenPool.Contract.GetRemotePools(&_LombardTokenPool.CallOpts, remoteChainSelector)
+}
+
+func (_LombardTokenPool *LombardTokenPoolCallerSession) GetRemotePools(remoteChainSelector uint64) ([][]byte, error) {
+	return _LombardTokenPool.Contract.GetRemotePools(&_LombardTokenPool.CallOpts, remoteChainSelector)
+}
+
+func (_LombardTokenPool *LombardTokenPoolCaller) GetRemoteToken(opts *bind.CallOpts, remoteChainSelector uint64) ([]byte, error) {
+	var out []interface{}
+	err := _LombardTokenPool.contract.Call(opts, &out, "getRemoteToken", remoteChainSelector)
+
+	if err != nil {
+		return *new([]byte), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte)
+
+	return out0, err
+
+}
+
+func (_LombardTokenPool *LombardTokenPoolSession) GetRemoteToken(remoteChainSelector uint64) ([]byte, error) {
+	return _LombardTokenPool.Contract.GetRemoteToken(&_LombardTokenPool.CallOpts, remoteChainSelector)
+}
+
+func (_LombardTokenPool *LombardTokenPoolCallerSession) GetRemoteToken(remoteChainSelector uint64) ([]byte, error) {
+	return _LombardTokenPool.Contract.GetRemoteToken(&_LombardTokenPool.CallOpts, remoteChainSelector)
+}
+
+func (_LombardTokenPool *LombardTokenPoolCaller) GetRmnProxy(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _LombardTokenPool.contract.Call(opts, &out, "getRmnProxy")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+func (_LombardTokenPool *LombardTokenPoolSession) GetRmnProxy() (common.Address, error) {
+	return _LombardTokenPool.Contract.GetRmnProxy(&_LombardTokenPool.CallOpts)
+}
+
+func (_LombardTokenPool *LombardTokenPoolCallerSession) GetRmnProxy() (common.Address, error) {
+	return _LombardTokenPool.Contract.GetRmnProxy(&_LombardTokenPool.CallOpts)
+}
+
+func (_LombardTokenPool *LombardTokenPoolCaller) GetRouter(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _LombardTokenPool.contract.Call(opts, &out, "getRouter")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+func (_LombardTokenPool *LombardTokenPoolSession) GetRouter() (common.Address, error) {
+	return _LombardTokenPool.Contract.GetRouter(&_LombardTokenPool.CallOpts)
+}
+
+func (_LombardTokenPool *LombardTokenPoolCallerSession) GetRouter() (common.Address, error) {
+	return _LombardTokenPool.Contract.GetRouter(&_LombardTokenPool.CallOpts)
+}
+
+func (_LombardTokenPool *LombardTokenPoolCaller) GetSupportedChains(opts *bind.CallOpts) ([]uint64, error) {
+	var out []interface{}
+	err := _LombardTokenPool.contract.Call(opts, &out, "getSupportedChains")
+
+	if err != nil {
+		return *new([]uint64), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new([]uint64)).(*[]uint64)
+
+	return out0, err
+
+}
+
+func (_LombardTokenPool *LombardTokenPoolSession) GetSupportedChains() ([]uint64, error) {
+	return _LombardTokenPool.Contract.GetSupportedChains(&_LombardTokenPool.CallOpts)
+}
+
+func (_LombardTokenPool *LombardTokenPoolCallerSession) GetSupportedChains() ([]uint64, error) {
+	return _LombardTokenPool.Contract.GetSupportedChains(&_LombardTokenPool.CallOpts)
+}
+
+func (_LombardTokenPool *LombardTokenPoolCaller) GetToken(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _LombardTokenPool.contract.Call(opts, &out, "getToken")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+func (_LombardTokenPool *LombardTokenPoolSession) GetToken() (common.Address, error) {
+	return _LombardTokenPool.Contract.GetToken(&_LombardTokenPool.CallOpts)
+}
+
+func (_LombardTokenPool *LombardTokenPoolCallerSession) GetToken() (common.Address, error) {
+	return _LombardTokenPool.Contract.GetToken(&_LombardTokenPool.CallOpts)
+}
+
+func (_LombardTokenPool *LombardTokenPoolCaller) GetTokenDecimals(opts *bind.CallOpts) (uint8, error) {
+	var out []interface{}
+	err := _LombardTokenPool.contract.Call(opts, &out, "getTokenDecimals")
+
+	if err != nil {
+		return *new(uint8), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8)
+
+	return out0, err
+
+}
+
+func (_LombardTokenPool *LombardTokenPoolSession) GetTokenDecimals() (uint8, error) {
+	return _LombardTokenPool.Contract.GetTokenDecimals(&_LombardTokenPool.CallOpts)
+}
+
+func (_LombardTokenPool *LombardTokenPoolCallerSession) GetTokenDecimals() (uint8, error) {
+	return _LombardTokenPool.Contract.GetTokenDecimals(&_LombardTokenPool.CallOpts)
+}
+
+func (_LombardTokenPool *LombardTokenPoolCaller) IsAttestationEnabled(opts *bind.CallOpts) (bool, error) {
+	var out []interface{}
+	err := _LombardTokenPool.contract.Call(opts, &out, "isAttestationEnabled")
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+func (_LombardTokenPool *LombardTokenPoolSession) IsAttestationEnabled() (bool, error) {
+	return _LombardTokenPool.Contract.IsAttestationEnabled(&_LombardTokenPool.CallOpts)
+}
+
+func (_LombardTokenPool *LombardTokenPoolCallerSession) IsAttestationEnabled() (bool, error) {
+	return _LombardTokenPool.Contract.IsAttestationEnabled(&_LombardTokenPool.CallOpts)
+}
+
+func (_LombardTokenPool *LombardTokenPoolCaller) IsRemotePool(opts *bind.CallOpts, remoteChainSelector uint64, remotePoolAddress []byte) (bool, error) {
+	var out []interface{}
+	err := _LombardTokenPool.contract.Call(opts, &out, "isRemotePool", remoteChainSelector, remotePoolAddress)
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+func (_LombardTokenPool *LombardTokenPoolSession) IsRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (bool, error) {
+	return _LombardTokenPool.Contract.IsRemotePool(&_LombardTokenPool.CallOpts, remoteChainSelector, remotePoolAddress)
+}
+
+func (_LombardTokenPool *LombardTokenPoolCallerSession) IsRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (bool, error) {
+	return _LombardTokenPool.Contract.IsRemotePool(&_LombardTokenPool.CallOpts, remoteChainSelector, remotePoolAddress)
+}
+
+func (_LombardTokenPool *LombardTokenPoolCaller) IsSupportedChain(opts *bind.CallOpts, remoteChainSelector uint64) (bool, error) {
+	var out []interface{}
+	err := _LombardTokenPool.contract.Call(opts, &out, "isSupportedChain", remoteChainSelector)
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+func (_LombardTokenPool *LombardTokenPoolSession) IsSupportedChain(remoteChainSelector uint64) (bool, error) {
+	return _LombardTokenPool.Contract.IsSupportedChain(&_LombardTokenPool.CallOpts, remoteChainSelector)
+}
+
+func (_LombardTokenPool *LombardTokenPoolCallerSession) IsSupportedChain(remoteChainSelector uint64) (bool, error) {
+	return _LombardTokenPool.Contract.IsSupportedChain(&_LombardTokenPool.CallOpts, remoteChainSelector)
+}
+
+func (_LombardTokenPool *LombardTokenPoolCaller) IsSupportedToken(opts *bind.CallOpts, token common.Address) (bool, error) {
+	var out []interface{}
+	err := _LombardTokenPool.contract.Call(opts, &out, "isSupportedToken", token)
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+func (_LombardTokenPool *LombardTokenPoolSession) IsSupportedToken(token common.Address) (bool, error) {
+	return _LombardTokenPool.Contract.IsSupportedToken(&_LombardTokenPool.CallOpts, token)
+}
+
+func (_LombardTokenPool *LombardTokenPoolCallerSession) IsSupportedToken(token common.Address) (bool, error) {
+	return _LombardTokenPool.Contract.IsSupportedToken(&_LombardTokenPool.CallOpts, token)
+}
+
+func (_LombardTokenPool *LombardTokenPoolCaller) Owner(opts *bind.CallOpts) (common.Address, error) {
+	var out []interface{}
+	err := _LombardTokenPool.contract.Call(opts, &out, "owner")
+
+	if err != nil {
+		return *new(common.Address), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+	return out0, err
+
+}
+
+func (_LombardTokenPool *LombardTokenPoolSession) Owner() (common.Address, error) {
+	return _LombardTokenPool.Contract.Owner(&_LombardTokenPool.CallOpts)
+}
+
+func (_LombardTokenPool *LombardTokenPoolCallerSession) Owner() (common.Address, error) {
+	return _LombardTokenPool.Contract.Owner(&_LombardTokenPool.CallOpts)
+}
+
+func (_LombardTokenPool *LombardTokenPoolCaller) SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) {
+	var out []interface{}
+	err := _LombardTokenPool.contract.Call(opts, &out, "supportsInterface", interfaceId)
+
+	if err != nil {
+		return *new(bool), err
+	}
+
+	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+	return out0, err
+
+}
+
+func (_LombardTokenPool *LombardTokenPoolSession) SupportsInterface(interfaceId [4]byte) (bool, error) {
+	return _LombardTokenPool.Contract.SupportsInterface(&_LombardTokenPool.CallOpts, interfaceId)
+}
+
+func (_LombardTokenPool *LombardTokenPoolCallerSession) SupportsInterface(interfaceId [4]byte) (bool, error) {
+	return _LombardTokenPool.Contract.SupportsInterface(&_LombardTokenPool.CallOpts, interfaceId)
+}
+
+func (_LombardTokenPool *LombardTokenPoolTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) {
+	return _LombardTokenPool.contract.Transact(opts, "acceptOwnership")
+}
+
+func (_LombardTokenPool *LombardTokenPoolSession) AcceptOwnership() (*types.Transaction, error) {
+	return _LombardTokenPool.Contract.AcceptOwnership(&_LombardTokenPool.TransactOpts)
+}
+
+func (_LombardTokenPool *LombardTokenPoolTransactorSession) AcceptOwnership() (*types.Transaction, error) {
+	return _LombardTokenPool.Contract.AcceptOwnership(&_LombardTokenPool.TransactOpts)
+}
+
+func (_LombardTokenPool *LombardTokenPoolTransactor) AddRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) {
+	return _LombardTokenPool.contract.Transact(opts, "addRemotePool", remoteChainSelector, remotePoolAddress)
+}
+
+func (_LombardTokenPool *LombardTokenPoolSession) AddRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) {
+	return _LombardTokenPool.Contract.AddRemotePool(&_LombardTokenPool.TransactOpts, remoteChainSelector, remotePoolAddress)
+}
+
+func (_LombardTokenPool *LombardTokenPoolTransactorSession) AddRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) {
+	return _LombardTokenPool.Contract.AddRemotePool(&_LombardTokenPool.TransactOpts, remoteChainSelector, remotePoolAddress)
+}
+
+func (_LombardTokenPool *LombardTokenPoolTransactor) ApplyAllowListUpdates(opts *bind.TransactOpts, removes []common.Address, adds []common.Address) (*types.Transaction, error) {
+	return _LombardTokenPool.contract.Transact(opts, "applyAllowListUpdates", removes, adds)
+}
+
+func (_LombardTokenPool *LombardTokenPoolSession) ApplyAllowListUpdates(removes []common.Address, adds []common.Address) (*types.Transaction, error) {
+	return _LombardTokenPool.Contract.ApplyAllowListUpdates(&_LombardTokenPool.TransactOpts, removes, adds)
+}
+
+func (_LombardTokenPool *LombardTokenPoolTransactorSession) ApplyAllowListUpdates(removes []common.Address, adds []common.Address) (*types.Transaction, error) {
+	return _LombardTokenPool.Contract.ApplyAllowListUpdates(&_LombardTokenPool.TransactOpts, removes, adds)
+}
+
+func (_LombardTokenPool *LombardTokenPoolTransactor) ApplyChainUpdates(opts *bind.TransactOpts, remoteChainSelectorsToRemove []uint64, chainsToAdd []TokenPoolChainUpdate) (*types.Transaction, error) {
+	return _LombardTokenPool.contract.Transact(opts, "applyChainUpdates", remoteChainSelectorsToRemove, chainsToAdd)
+}
+
+func (_LombardTokenPool *LombardTokenPoolSession) ApplyChainUpdates(remoteChainSelectorsToRemove []uint64, chainsToAdd []TokenPoolChainUpdate) (*types.Transaction, error) {
+	return _LombardTokenPool.Contract.ApplyChainUpdates(&_LombardTokenPool.TransactOpts, remoteChainSelectorsToRemove, chainsToAdd)
+}
+
+func (_LombardTokenPool *LombardTokenPoolTransactorSession) ApplyChainUpdates(remoteChainSelectorsToRemove []uint64, chainsToAdd []TokenPoolChainUpdate) (*types.Transaction, error) {
+	return _LombardTokenPool.Contract.ApplyChainUpdates(&_LombardTokenPool.TransactOpts, remoteChainSelectorsToRemove, chainsToAdd)
+}
+
+func (_LombardTokenPool *LombardTokenPoolTransactor) LockOrBurn(opts *bind.TransactOpts, lockOrBurnIn PoolLockOrBurnInV1) (*types.Transaction, error) {
+	return _LombardTokenPool.contract.Transact(opts, "lockOrBurn", lockOrBurnIn)
+}
+
+func (_LombardTokenPool *LombardTokenPoolSession) LockOrBurn(lockOrBurnIn PoolLockOrBurnInV1) (*types.Transaction, error) {
+	return _LombardTokenPool.Contract.LockOrBurn(&_LombardTokenPool.TransactOpts, lockOrBurnIn)
+}
+
+func (_LombardTokenPool *LombardTokenPoolTransactorSession) LockOrBurn(lockOrBurnIn PoolLockOrBurnInV1) (*types.Transaction, error) {
+	return _LombardTokenPool.Contract.LockOrBurn(&_LombardTokenPool.TransactOpts, lockOrBurnIn)
+}
+
+func (_LombardTokenPool *LombardTokenPoolTransactor) ReleaseOrMint(opts *bind.TransactOpts, releaseOrMintIn PoolReleaseOrMintInV1) (*types.Transaction, error) {
+	return _LombardTokenPool.contract.Transact(opts, "releaseOrMint", releaseOrMintIn)
+}
+
+func (_LombardTokenPool *LombardTokenPoolSession) ReleaseOrMint(releaseOrMintIn PoolReleaseOrMintInV1) (*types.Transaction, error) {
+	return _LombardTokenPool.Contract.ReleaseOrMint(&_LombardTokenPool.TransactOpts, releaseOrMintIn)
+}
+
+func (_LombardTokenPool *LombardTokenPoolTransactorSession) ReleaseOrMint(releaseOrMintIn PoolReleaseOrMintInV1) (*types.Transaction, error) {
+	return _LombardTokenPool.Contract.ReleaseOrMint(&_LombardTokenPool.TransactOpts, releaseOrMintIn)
+}
+
+func (_LombardTokenPool *LombardTokenPoolTransactor) RemoveRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) {
+	return _LombardTokenPool.contract.Transact(opts, "removeRemotePool", remoteChainSelector, remotePoolAddress)
+}
+
+func (_LombardTokenPool *LombardTokenPoolSession) RemoveRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) {
+	return _LombardTokenPool.Contract.RemoveRemotePool(&_LombardTokenPool.TransactOpts, remoteChainSelector, remotePoolAddress)
+}
+
+func (_LombardTokenPool *LombardTokenPoolTransactorSession) RemoveRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) {
+	return _LombardTokenPool.Contract.RemoveRemotePool(&_LombardTokenPool.TransactOpts, remoteChainSelector, remotePoolAddress)
+}
+
+func (_LombardTokenPool *LombardTokenPoolTransactor) SetChainRateLimiterConfig(opts *bind.TransactOpts, remoteChainSelector uint64, outboundConfig RateLimiterConfig, inboundConfig RateLimiterConfig) (*types.Transaction, error) {
+	return _LombardTokenPool.contract.Transact(opts, "setChainRateLimiterConfig", remoteChainSelector, outboundConfig, inboundConfig)
+}
+
+func (_LombardTokenPool *LombardTokenPoolSession) SetChainRateLimiterConfig(remoteChainSelector uint64, outboundConfig RateLimiterConfig, inboundConfig RateLimiterConfig) (*types.Transaction, error) {
+	return _LombardTokenPool.Contract.SetChainRateLimiterConfig(&_LombardTokenPool.TransactOpts, remoteChainSelector, outboundConfig, inboundConfig)
+}
+
+func (_LombardTokenPool *LombardTokenPoolTransactorSession) SetChainRateLimiterConfig(remoteChainSelector uint64, outboundConfig RateLimiterConfig, inboundConfig RateLimiterConfig) (*types.Transaction, error) {
+	return _LombardTokenPool.Contract.SetChainRateLimiterConfig(&_LombardTokenPool.TransactOpts, remoteChainSelector, outboundConfig, inboundConfig)
+}
+
+func (_LombardTokenPool *LombardTokenPoolTransactor) SetRateLimitAdmin(opts *bind.TransactOpts, rateLimitAdmin common.Address) (*types.Transaction, error) {
+	return _LombardTokenPool.contract.Transact(opts, "setRateLimitAdmin", rateLimitAdmin)
+}
+
+func (_LombardTokenPool *LombardTokenPoolSession) SetRateLimitAdmin(rateLimitAdmin common.Address) (*types.Transaction, error) {
+	return _LombardTokenPool.Contract.SetRateLimitAdmin(&_LombardTokenPool.TransactOpts, rateLimitAdmin)
+}
+
+func (_LombardTokenPool *LombardTokenPoolTransactorSession) SetRateLimitAdmin(rateLimitAdmin common.Address) (*types.Transaction, error) {
+	return _LombardTokenPool.Contract.SetRateLimitAdmin(&_LombardTokenPool.TransactOpts, rateLimitAdmin)
+}
+
+func (_LombardTokenPool *LombardTokenPoolTransactor) SetRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) {
+	return _LombardTokenPool.contract.Transact(opts, "setRouter", newRouter)
+}
+
+func (_LombardTokenPool *LombardTokenPoolSession) SetRouter(newRouter common.Address) (*types.Transaction, error) {
+	return _LombardTokenPool.Contract.SetRouter(&_LombardTokenPool.TransactOpts, newRouter)
+}
+
+func (_LombardTokenPool *LombardTokenPoolTransactorSession) SetRouter(newRouter common.Address) (*types.Transaction, error) {
+	return _LombardTokenPool.Contract.SetRouter(&_LombardTokenPool.TransactOpts, newRouter)
+}
+
+func (_LombardTokenPool *LombardTokenPoolTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) {
+	return _LombardTokenPool.contract.Transact(opts, "transferOwnership", to)
+}
+
+func (_LombardTokenPool *LombardTokenPoolSession) TransferOwnership(to common.Address) (*types.Transaction, error) {
+	return _LombardTokenPool.Contract.TransferOwnership(&_LombardTokenPool.TransactOpts, to)
+}
+
+func (_LombardTokenPool *LombardTokenPoolTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) {
+	return _LombardTokenPool.Contract.TransferOwnership(&_LombardTokenPool.TransactOpts, to)
+}
+
+type LombardTokenPoolAllowListAddIterator struct {
+	Event *LombardTokenPoolAllowListAdd
+
+	contract *bind.BoundContract
+	event    string
+
+	logs chan types.Log
+	sub  ethereum.Subscription
+	done bool
+	fail error
+}
+
+func (it *LombardTokenPoolAllowListAddIterator) Next() bool {
+
+	if it.fail != nil {
+		return false
+	}
+
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(LombardTokenPoolAllowListAdd)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+
+	select {
+	case log := <-it.logs:
+		it.Event = new(LombardTokenPoolAllowListAdd)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+func (it *LombardTokenPoolAllowListAddIterator) Error() error {
+	return it.fail
+}
+
+func (it *LombardTokenPoolAllowListAddIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+type LombardTokenPoolAllowListAdd struct {
+	Sender common.Address
+	Raw    types.Log
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) FilterAllowListAdd(opts *bind.FilterOpts) (*LombardTokenPoolAllowListAddIterator, error) {
+
+	logs, sub, err := _LombardTokenPool.contract.FilterLogs(opts, "AllowListAdd")
+	if err != nil {
+		return nil, err
+	}
+	return &LombardTokenPoolAllowListAddIterator{contract: _LombardTokenPool.contract, event: "AllowListAdd", logs: logs, sub: sub}, nil
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) WatchAllowListAdd(opts *bind.WatchOpts, sink chan<- *LombardTokenPoolAllowListAdd) (event.Subscription, error) {
+
+	logs, sub, err := _LombardTokenPool.contract.WatchLogs(opts, "AllowListAdd")
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+
+				event := new(LombardTokenPoolAllowListAdd)
+				if err := _LombardTokenPool.contract.UnpackLog(event, "AllowListAdd", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) ParseAllowListAdd(log types.Log) (*LombardTokenPoolAllowListAdd, error) {
+	event := new(LombardTokenPoolAllowListAdd)
+	if err := _LombardTokenPool.contract.UnpackLog(event, "AllowListAdd", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+type LombardTokenPoolAllowListRemoveIterator struct {
+	Event *LombardTokenPoolAllowListRemove
+
+	contract *bind.BoundContract
+	event    string
+
+	logs chan types.Log
+	sub  ethereum.Subscription
+	done bool
+	fail error
+}
+
+func (it *LombardTokenPoolAllowListRemoveIterator) Next() bool {
+
+	if it.fail != nil {
+		return false
+	}
+
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(LombardTokenPoolAllowListRemove)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+
+	select {
+	case log := <-it.logs:
+		it.Event = new(LombardTokenPoolAllowListRemove)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+func (it *LombardTokenPoolAllowListRemoveIterator) Error() error {
+	return it.fail
+}
+
+func (it *LombardTokenPoolAllowListRemoveIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+type LombardTokenPoolAllowListRemove struct {
+	Sender common.Address
+	Raw    types.Log
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) FilterAllowListRemove(opts *bind.FilterOpts) (*LombardTokenPoolAllowListRemoveIterator, error) {
+
+	logs, sub, err := _LombardTokenPool.contract.FilterLogs(opts, "AllowListRemove")
+	if err != nil {
+		return nil, err
+	}
+	return &LombardTokenPoolAllowListRemoveIterator{contract: _LombardTokenPool.contract, event: "AllowListRemove", logs: logs, sub: sub}, nil
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) WatchAllowListRemove(opts *bind.WatchOpts, sink chan<- *LombardTokenPoolAllowListRemove) (event.Subscription, error) {
+
+	logs, sub, err := _LombardTokenPool.contract.WatchLogs(opts, "AllowListRemove")
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+
+				event := new(LombardTokenPoolAllowListRemove)
+				if err := _LombardTokenPool.contract.UnpackLog(event, "AllowListRemove", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) ParseAllowListRemove(log types.Log) (*LombardTokenPoolAllowListRemove, error) {
+	event := new(LombardTokenPoolAllowListRemove)
+	if err := _LombardTokenPool.contract.UnpackLog(event, "AllowListRemove", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+type LombardTokenPoolBurnedIterator struct {
+	Event *LombardTokenPoolBurned
+
+	contract *bind.BoundContract
+	event    string
+
+	logs chan types.Log
+	sub  ethereum.Subscription
+	done bool
+	fail error
+}
+
+func (it *LombardTokenPoolBurnedIterator) Next() bool {
+
+	if it.fail != nil {
+		return false
+	}
+
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(LombardTokenPoolBurned)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+
+	select {
+	case log := <-it.logs:
+		it.Event = new(LombardTokenPoolBurned)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+func (it *LombardTokenPoolBurnedIterator) Error() error {
+	return it.fail
+}
+
+func (it *LombardTokenPoolBurnedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+type LombardTokenPoolBurned struct {
+	Sender common.Address
+	Amount *big.Int
+	Raw    types.Log
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) FilterBurned(opts *bind.FilterOpts, sender []common.Address) (*LombardTokenPoolBurnedIterator, error) {
+
+	var senderRule []interface{}
+	for _, senderItem := range sender {
+		senderRule = append(senderRule, senderItem)
+	}
+
+	logs, sub, err := _LombardTokenPool.contract.FilterLogs(opts, "Burned", senderRule)
+	if err != nil {
+		return nil, err
+	}
+	return &LombardTokenPoolBurnedIterator{contract: _LombardTokenPool.contract, event: "Burned", logs: logs, sub: sub}, nil
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) WatchBurned(opts *bind.WatchOpts, sink chan<- *LombardTokenPoolBurned, sender []common.Address) (event.Subscription, error) {
+
+	var senderRule []interface{}
+	for _, senderItem := range sender {
+		senderRule = append(senderRule, senderItem)
+	}
+
+	logs, sub, err := _LombardTokenPool.contract.WatchLogs(opts, "Burned", senderRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+
+				event := new(LombardTokenPoolBurned)
+				if err := _LombardTokenPool.contract.UnpackLog(event, "Burned", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) ParseBurned(log types.Log) (*LombardTokenPoolBurned, error) {
+	event := new(LombardTokenPoolBurned)
+	if err := _LombardTokenPool.contract.UnpackLog(event, "Burned", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+type LombardTokenPoolChainAddedIterator struct {
+	Event *LombardTokenPoolChainAdded
+
+	contract *bind.BoundContract
+	event    string
+
+	logs chan types.Log
+	sub  ethereum.Subscription
+	done bool
+	fail error
+}
+
+func (it *LombardTokenPoolChainAddedIterator) Next() bool {
+
+	if it.fail != nil {
+		return false
+	}
+
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(LombardTokenPoolChainAdded)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+
+	select {
+	case log := <-it.logs:
+		it.Event = new(LombardTokenPoolChainAdded)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+func (it *LombardTokenPoolChainAddedIterator) Error() error {
+	return it.fail
+}
+
+func (it *LombardTokenPoolChainAddedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+type LombardTokenPoolChainAdded struct {
+	RemoteChainSelector       uint64
+	RemoteToken               []byte
+	OutboundRateLimiterConfig RateLimiterConfig
+	InboundRateLimiterConfig  RateLimiterConfig
+	Raw                       types.Log
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) FilterChainAdded(opts *bind.FilterOpts) (*LombardTokenPoolChainAddedIterator, error) {
+
+	logs, sub, err := _LombardTokenPool.contract.FilterLogs(opts, "ChainAdded")
+	if err != nil {
+		return nil, err
+	}
+	return &LombardTokenPoolChainAddedIterator{contract: _LombardTokenPool.contract, event: "ChainAdded", logs: logs, sub: sub}, nil
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) WatchChainAdded(opts *bind.WatchOpts, sink chan<- *LombardTokenPoolChainAdded) (event.Subscription, error) {
+
+	logs, sub, err := _LombardTokenPool.contract.WatchLogs(opts, "ChainAdded")
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+
+				event := new(LombardTokenPoolChainAdded)
+				if err := _LombardTokenPool.contract.UnpackLog(event, "ChainAdded", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) ParseChainAdded(log types.Log) (*LombardTokenPoolChainAdded, error) {
+	event := new(LombardTokenPoolChainAdded)
+	if err := _LombardTokenPool.contract.UnpackLog(event, "ChainAdded", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+type LombardTokenPoolChainConfiguredIterator struct {
+	Event *LombardTokenPoolChainConfigured
+
+	contract *bind.BoundContract
+	event    string
+
+	logs chan types.Log
+	sub  ethereum.Subscription
+	done bool
+	fail error
+}
+
+func (it *LombardTokenPoolChainConfiguredIterator) Next() bool {
+
+	if it.fail != nil {
+		return false
+	}
+
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(LombardTokenPoolChainConfigured)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+
+	select {
+	case log := <-it.logs:
+		it.Event = new(LombardTokenPoolChainConfigured)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+func (it *LombardTokenPoolChainConfiguredIterator) Error() error {
+	return it.fail
+}
+
+func (it *LombardTokenPoolChainConfiguredIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+type LombardTokenPoolChainConfigured struct {
+	RemoteChainSelector       uint64
+	OutboundRateLimiterConfig RateLimiterConfig
+	InboundRateLimiterConfig  RateLimiterConfig
+	Raw                       types.Log
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) FilterChainConfigured(opts *bind.FilterOpts) (*LombardTokenPoolChainConfiguredIterator, error) {
+
+	logs, sub, err := _LombardTokenPool.contract.FilterLogs(opts, "ChainConfigured")
+	if err != nil {
+		return nil, err
+	}
+	return &LombardTokenPoolChainConfiguredIterator{contract: _LombardTokenPool.contract, event: "ChainConfigured", logs: logs, sub: sub}, nil
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) WatchChainConfigured(opts *bind.WatchOpts, sink chan<- *LombardTokenPoolChainConfigured) (event.Subscription, error) {
+
+	logs, sub, err := _LombardTokenPool.contract.WatchLogs(opts, "ChainConfigured")
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+
+				event := new(LombardTokenPoolChainConfigured)
+				if err := _LombardTokenPool.contract.UnpackLog(event, "ChainConfigured", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) ParseChainConfigured(log types.Log) (*LombardTokenPoolChainConfigured, error) {
+	event := new(LombardTokenPoolChainConfigured)
+	if err := _LombardTokenPool.contract.UnpackLog(event, "ChainConfigured", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+type LombardTokenPoolChainRemovedIterator struct {
+	Event *LombardTokenPoolChainRemoved
+
+	contract *bind.BoundContract
+	event    string
+
+	logs chan types.Log
+	sub  ethereum.Subscription
+	done bool
+	fail error
+}
+
+func (it *LombardTokenPoolChainRemovedIterator) Next() bool {
+
+	if it.fail != nil {
+		return false
+	}
+
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(LombardTokenPoolChainRemoved)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+
+	select {
+	case log := <-it.logs:
+		it.Event = new(LombardTokenPoolChainRemoved)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+func (it *LombardTokenPoolChainRemovedIterator) Error() error {
+	return it.fail
+}
+
+func (it *LombardTokenPoolChainRemovedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+type LombardTokenPoolChainRemoved struct {
+	RemoteChainSelector uint64
+	Raw                 types.Log
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) FilterChainRemoved(opts *bind.FilterOpts) (*LombardTokenPoolChainRemovedIterator, error) {
+
+	logs, sub, err := _LombardTokenPool.contract.FilterLogs(opts, "ChainRemoved")
+	if err != nil {
+		return nil, err
+	}
+	return &LombardTokenPoolChainRemovedIterator{contract: _LombardTokenPool.contract, event: "ChainRemoved", logs: logs, sub: sub}, nil
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *LombardTokenPoolChainRemoved) (event.Subscription, error) {
+
+	logs, sub, err := _LombardTokenPool.contract.WatchLogs(opts, "ChainRemoved")
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+
+				event := new(LombardTokenPoolChainRemoved)
+				if err := _LombardTokenPool.contract.UnpackLog(event, "ChainRemoved", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) ParseChainRemoved(log types.Log) (*LombardTokenPoolChainRemoved, error) {
+	event := new(LombardTokenPoolChainRemoved)
+	if err := _LombardTokenPool.contract.UnpackLog(event, "ChainRemoved", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+type LombardTokenPoolConfigChangedIterator struct {
+	Event *LombardTokenPoolConfigChanged
+
+	contract *bind.BoundContract
+	event    string
+
+	logs chan types.Log
+	sub  ethereum.Subscription
+	done bool
+	fail error
+}
+
+func (it *LombardTokenPoolConfigChangedIterator) Next() bool {
+
+	if it.fail != nil {
+		return false
+	}
+
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(LombardTokenPoolConfigChanged)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+
+	select {
+	case log := <-it.logs:
+		it.Event = new(LombardTokenPoolConfigChanged)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+func (it *LombardTokenPoolConfigChangedIterator) Error() error {
+	return it.fail
+}
+
+func (it *LombardTokenPoolConfigChangedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+type LombardTokenPoolConfigChanged struct {
+	Config RateLimiterConfig
+	Raw    types.Log
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) FilterConfigChanged(opts *bind.FilterOpts) (*LombardTokenPoolConfigChangedIterator, error) {
+
+	logs, sub, err := _LombardTokenPool.contract.FilterLogs(opts, "ConfigChanged")
+	if err != nil {
+		return nil, err
+	}
+	return &LombardTokenPoolConfigChangedIterator{contract: _LombardTokenPool.contract, event: "ConfigChanged", logs: logs, sub: sub}, nil
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) WatchConfigChanged(opts *bind.WatchOpts, sink chan<- *LombardTokenPoolConfigChanged) (event.Subscription, error) {
+
+	logs, sub, err := _LombardTokenPool.contract.WatchLogs(opts, "ConfigChanged")
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+
+				event := new(LombardTokenPoolConfigChanged)
+				if err := _LombardTokenPool.contract.UnpackLog(event, "ConfigChanged", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) ParseConfigChanged(log types.Log) (*LombardTokenPoolConfigChanged, error) {
+	event := new(LombardTokenPoolConfigChanged)
+	if err := _LombardTokenPool.contract.UnpackLog(event, "ConfigChanged", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+type LombardTokenPoolLockedIterator struct {
+	Event *LombardTokenPoolLocked
+
+	contract *bind.BoundContract
+	event    string
+
+	logs chan types.Log
+	sub  ethereum.Subscription
+	done bool
+	fail error
+}
+
+func (it *LombardTokenPoolLockedIterator) Next() bool {
+
+	if it.fail != nil {
+		return false
+	}
+
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(LombardTokenPoolLocked)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+
+	select {
+	case log := <-it.logs:
+		it.Event = new(LombardTokenPoolLocked)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+func (it *LombardTokenPoolLockedIterator) Error() error {
+	return it.fail
+}
+
+func (it *LombardTokenPoolLockedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+type LombardTokenPoolLocked struct {
+	Sender common.Address
+	Amount *big.Int
+	Raw    types.Log
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) FilterLocked(opts *bind.FilterOpts, sender []common.Address) (*LombardTokenPoolLockedIterator, error) {
+
+	var senderRule []interface{}
+	for _, senderItem := range sender {
+		senderRule = append(senderRule, senderItem)
+	}
+
+	logs, sub, err := _LombardTokenPool.contract.FilterLogs(opts, "Locked", senderRule)
+	if err != nil {
+		return nil, err
+	}
+	return &LombardTokenPoolLockedIterator{contract: _LombardTokenPool.contract, event: "Locked", logs: logs, sub: sub}, nil
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) WatchLocked(opts *bind.WatchOpts, sink chan<- *LombardTokenPoolLocked, sender []common.Address) (event.Subscription, error) {
+
+	var senderRule []interface{}
+	for _, senderItem := range sender {
+		senderRule = append(senderRule, senderItem)
+	}
+
+	logs, sub, err := _LombardTokenPool.contract.WatchLogs(opts, "Locked", senderRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+
+				event := new(LombardTokenPoolLocked)
+				if err := _LombardTokenPool.contract.UnpackLog(event, "Locked", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) ParseLocked(log types.Log) (*LombardTokenPoolLocked, error) {
+	event := new(LombardTokenPoolLocked)
+	if err := _LombardTokenPool.contract.UnpackLog(event, "Locked", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+type LombardTokenPoolMintedIterator struct {
+	Event *LombardTokenPoolMinted
+
+	contract *bind.BoundContract
+	event    string
+
+	logs chan types.Log
+	sub  ethereum.Subscription
+	done bool
+	fail error
+}
+
+func (it *LombardTokenPoolMintedIterator) Next() bool {
+
+	if it.fail != nil {
+		return false
+	}
+
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(LombardTokenPoolMinted)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+
+	select {
+	case log := <-it.logs:
+		it.Event = new(LombardTokenPoolMinted)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+func (it *LombardTokenPoolMintedIterator) Error() error {
+	return it.fail
+}
+
+func (it *LombardTokenPoolMintedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+type LombardTokenPoolMinted struct {
+	Sender    common.Address
+	Recipient common.Address
+	Amount    *big.Int
+	Raw       types.Log
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) FilterMinted(opts *bind.FilterOpts, sender []common.Address, recipient []common.Address) (*LombardTokenPoolMintedIterator, error) {
+
+	var senderRule []interface{}
+	for _, senderItem := range sender {
+		senderRule = append(senderRule, senderItem)
+	}
+	var recipientRule []interface{}
+	for _, recipientItem := range recipient {
+		recipientRule = append(recipientRule, recipientItem)
+	}
+
+	logs, sub, err := _LombardTokenPool.contract.FilterLogs(opts, "Minted", senderRule, recipientRule)
+	if err != nil {
+		return nil, err
+	}
+	return &LombardTokenPoolMintedIterator{contract: _LombardTokenPool.contract, event: "Minted", logs: logs, sub: sub}, nil
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) WatchMinted(opts *bind.WatchOpts, sink chan<- *LombardTokenPoolMinted, sender []common.Address, recipient []common.Address) (event.Subscription, error) {
+
+	var senderRule []interface{}
+	for _, senderItem := range sender {
+		senderRule = append(senderRule, senderItem)
+	}
+	var recipientRule []interface{}
+	for _, recipientItem := range recipient {
+		recipientRule = append(recipientRule, recipientItem)
+	}
+
+	logs, sub, err := _LombardTokenPool.contract.WatchLogs(opts, "Minted", senderRule, recipientRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+
+				event := new(LombardTokenPoolMinted)
+				if err := _LombardTokenPool.contract.UnpackLog(event, "Minted", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) ParseMinted(log types.Log) (*LombardTokenPoolMinted, error) {
+	event := new(LombardTokenPoolMinted)
+	if err := _LombardTokenPool.contract.UnpackLog(event, "Minted", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+type LombardTokenPoolOwnershipTransferRequestedIterator struct {
+	Event *LombardTokenPoolOwnershipTransferRequested
+
+	contract *bind.BoundContract
+	event    string
+
+	logs chan types.Log
+	sub  ethereum.Subscription
+	done bool
+	fail error
+}
+
+func (it *LombardTokenPoolOwnershipTransferRequestedIterator) Next() bool {
+
+	if it.fail != nil {
+		return false
+	}
+
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(LombardTokenPoolOwnershipTransferRequested)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+
+	select {
+	case log := <-it.logs:
+		it.Event = new(LombardTokenPoolOwnershipTransferRequested)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+func (it *LombardTokenPoolOwnershipTransferRequestedIterator) Error() error {
+	return it.fail
+}
+
+func (it *LombardTokenPoolOwnershipTransferRequestedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+type LombardTokenPoolOwnershipTransferRequested struct {
+	From common.Address
+	To   common.Address
+	Raw  types.Log
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*LombardTokenPoolOwnershipTransferRequestedIterator, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _LombardTokenPool.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return &LombardTokenPoolOwnershipTransferRequestedIterator{contract: _LombardTokenPool.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *LombardTokenPoolOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _LombardTokenPool.contract.WatchLogs(opts, "OwnershipTransferRequested", fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+
+				event := new(LombardTokenPoolOwnershipTransferRequested)
+				if err := _LombardTokenPool.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) ParseOwnershipTransferRequested(log types.Log) (*LombardTokenPoolOwnershipTransferRequested, error) {
+	event := new(LombardTokenPoolOwnershipTransferRequested)
+	if err := _LombardTokenPool.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+type LombardTokenPoolOwnershipTransferredIterator struct {
+	Event *LombardTokenPoolOwnershipTransferred
+
+	contract *bind.BoundContract
+	event    string
+
+	logs chan types.Log
+	sub  ethereum.Subscription
+	done bool
+	fail error
+}
+
+func (it *LombardTokenPoolOwnershipTransferredIterator) Next() bool {
+
+	if it.fail != nil {
+		return false
+	}
+
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(LombardTokenPoolOwnershipTransferred)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+
+	select {
+	case log := <-it.logs:
+		it.Event = new(LombardTokenPoolOwnershipTransferred)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+func (it *LombardTokenPoolOwnershipTransferredIterator) Error() error {
+	return it.fail
+}
+
+func (it *LombardTokenPoolOwnershipTransferredIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+type LombardTokenPoolOwnershipTransferred struct {
+	From common.Address
+	To   common.Address
+	Raw  types.Log
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*LombardTokenPoolOwnershipTransferredIterator, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _LombardTokenPool.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return &LombardTokenPoolOwnershipTransferredIterator{contract: _LombardTokenPool.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *LombardTokenPoolOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) {
+
+	var fromRule []interface{}
+	for _, fromItem := range from {
+		fromRule = append(fromRule, fromItem)
+	}
+	var toRule []interface{}
+	for _, toItem := range to {
+		toRule = append(toRule, toItem)
+	}
+
+	logs, sub, err := _LombardTokenPool.contract.WatchLogs(opts, "OwnershipTransferred", fromRule, toRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+
+				event := new(LombardTokenPoolOwnershipTransferred)
+				if err := _LombardTokenPool.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) ParseOwnershipTransferred(log types.Log) (*LombardTokenPoolOwnershipTransferred, error) {
+	event := new(LombardTokenPoolOwnershipTransferred)
+	if err := _LombardTokenPool.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+type LombardTokenPoolRateLimitAdminSetIterator struct {
+	Event *LombardTokenPoolRateLimitAdminSet
+
+	contract *bind.BoundContract
+	event    string
+
+	logs chan types.Log
+	sub  ethereum.Subscription
+	done bool
+	fail error
+}
+
+func (it *LombardTokenPoolRateLimitAdminSetIterator) Next() bool {
+
+	if it.fail != nil {
+		return false
+	}
+
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(LombardTokenPoolRateLimitAdminSet)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+
+	select {
+	case log := <-it.logs:
+		it.Event = new(LombardTokenPoolRateLimitAdminSet)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+func (it *LombardTokenPoolRateLimitAdminSetIterator) Error() error {
+	return it.fail
+}
+
+func (it *LombardTokenPoolRateLimitAdminSetIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+type LombardTokenPoolRateLimitAdminSet struct {
+	RateLimitAdmin common.Address
+	Raw            types.Log
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) FilterRateLimitAdminSet(opts *bind.FilterOpts) (*LombardTokenPoolRateLimitAdminSetIterator, error) {
+
+	logs, sub, err := _LombardTokenPool.contract.FilterLogs(opts, "RateLimitAdminSet")
+	if err != nil {
+		return nil, err
+	}
+	return &LombardTokenPoolRateLimitAdminSetIterator{contract: _LombardTokenPool.contract, event: "RateLimitAdminSet", logs: logs, sub: sub}, nil
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) WatchRateLimitAdminSet(opts *bind.WatchOpts, sink chan<- *LombardTokenPoolRateLimitAdminSet) (event.Subscription, error) {
+
+	logs, sub, err := _LombardTokenPool.contract.WatchLogs(opts, "RateLimitAdminSet")
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+
+				event := new(LombardTokenPoolRateLimitAdminSet)
+				if err := _LombardTokenPool.contract.UnpackLog(event, "RateLimitAdminSet", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) ParseRateLimitAdminSet(log types.Log) (*LombardTokenPoolRateLimitAdminSet, error) {
+	event := new(LombardTokenPoolRateLimitAdminSet)
+	if err := _LombardTokenPool.contract.UnpackLog(event, "RateLimitAdminSet", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+type LombardTokenPoolReleasedIterator struct {
+	Event *LombardTokenPoolReleased
+
+	contract *bind.BoundContract
+	event    string
+
+	logs chan types.Log
+	sub  ethereum.Subscription
+	done bool
+	fail error
+}
+
+func (it *LombardTokenPoolReleasedIterator) Next() bool {
+
+	if it.fail != nil {
+		return false
+	}
+
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(LombardTokenPoolReleased)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+
+	select {
+	case log := <-it.logs:
+		it.Event = new(LombardTokenPoolReleased)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+func (it *LombardTokenPoolReleasedIterator) Error() error {
+	return it.fail
+}
+
+func (it *LombardTokenPoolReleasedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+type LombardTokenPoolReleased struct {
+	Sender    common.Address
+	Recipient common.Address
+	Amount    *big.Int
+	Raw       types.Log
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) FilterReleased(opts *bind.FilterOpts, sender []common.Address, recipient []common.Address) (*LombardTokenPoolReleasedIterator, error) {
+
+	var senderRule []interface{}
+	for _, senderItem := range sender {
+		senderRule = append(senderRule, senderItem)
+	}
+	var recipientRule []interface{}
+	for _, recipientItem := range recipient {
+		recipientRule = append(recipientRule, recipientItem)
+	}
+
+	logs, sub, err := _LombardTokenPool.contract.FilterLogs(opts, "Released", senderRule, recipientRule)
+	if err != nil {
+		return nil, err
+	}
+	return &LombardTokenPoolReleasedIterator{contract: _LombardTokenPool.contract, event: "Released", logs: logs, sub: sub}, nil
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) WatchReleased(opts *bind.WatchOpts, sink chan<- *LombardTokenPoolReleased, sender []common.Address, recipient []common.Address) (event.Subscription, error) {
+
+	var senderRule []interface{}
+	for _, senderItem := range sender {
+		senderRule = append(senderRule, senderItem)
+	}
+	var recipientRule []interface{}
+	for _, recipientItem := range recipient {
+		recipientRule = append(recipientRule, recipientItem)
+	}
+
+	logs, sub, err := _LombardTokenPool.contract.WatchLogs(opts, "Released", senderRule, recipientRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+
+				event := new(LombardTokenPoolReleased)
+				if err := _LombardTokenPool.contract.UnpackLog(event, "Released", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) ParseReleased(log types.Log) (*LombardTokenPoolReleased, error) {
+	event := new(LombardTokenPoolReleased)
+	if err := _LombardTokenPool.contract.UnpackLog(event, "Released", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+type LombardTokenPoolRemotePoolAddedIterator struct {
+	Event *LombardTokenPoolRemotePoolAdded
+
+	contract *bind.BoundContract
+	event    string
+
+	logs chan types.Log
+	sub  ethereum.Subscription
+	done bool
+	fail error
+}
+
+func (it *LombardTokenPoolRemotePoolAddedIterator) Next() bool {
+
+	if it.fail != nil {
+		return false
+	}
+
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(LombardTokenPoolRemotePoolAdded)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+
+	select {
+	case log := <-it.logs:
+		it.Event = new(LombardTokenPoolRemotePoolAdded)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+func (it *LombardTokenPoolRemotePoolAddedIterator) Error() error {
+	return it.fail
+}
+
+func (it *LombardTokenPoolRemotePoolAddedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+type LombardTokenPoolRemotePoolAdded struct {
+	RemoteChainSelector uint64
+	RemotePoolAddress   []byte
+	Raw                 types.Log
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) FilterRemotePoolAdded(opts *bind.FilterOpts, remoteChainSelector []uint64) (*LombardTokenPoolRemotePoolAddedIterator, error) {
+
+	var remoteChainSelectorRule []interface{}
+	for _, remoteChainSelectorItem := range remoteChainSelector {
+		remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem)
+	}
+
+	logs, sub, err := _LombardTokenPool.contract.FilterLogs(opts, "RemotePoolAdded", remoteChainSelectorRule)
+	if err != nil {
+		return nil, err
+	}
+	return &LombardTokenPoolRemotePoolAddedIterator{contract: _LombardTokenPool.contract, event: "RemotePoolAdded", logs: logs, sub: sub}, nil
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) WatchRemotePoolAdded(opts *bind.WatchOpts, sink chan<- *LombardTokenPoolRemotePoolAdded, remoteChainSelector []uint64) (event.Subscription, error) {
+
+	var remoteChainSelectorRule []interface{}
+	for _, remoteChainSelectorItem := range remoteChainSelector {
+		remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem)
+	}
+
+	logs, sub, err := _LombardTokenPool.contract.WatchLogs(opts, "RemotePoolAdded", remoteChainSelectorRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+
+				event := new(LombardTokenPoolRemotePoolAdded)
+				if err := _LombardTokenPool.contract.UnpackLog(event, "RemotePoolAdded", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) ParseRemotePoolAdded(log types.Log) (*LombardTokenPoolRemotePoolAdded, error) {
+	event := new(LombardTokenPoolRemotePoolAdded)
+	if err := _LombardTokenPool.contract.UnpackLog(event, "RemotePoolAdded", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+type LombardTokenPoolRemotePoolRemovedIterator struct {
+	Event *LombardTokenPoolRemotePoolRemoved
+
+	contract *bind.BoundContract
+	event    string
+
+	logs chan types.Log
+	sub  ethereum.Subscription
+	done bool
+	fail error
+}
+
+func (it *LombardTokenPoolRemotePoolRemovedIterator) Next() bool {
+
+	if it.fail != nil {
+		return false
+	}
+
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(LombardTokenPoolRemotePoolRemoved)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+
+	select {
+	case log := <-it.logs:
+		it.Event = new(LombardTokenPoolRemotePoolRemoved)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+func (it *LombardTokenPoolRemotePoolRemovedIterator) Error() error {
+	return it.fail
+}
+
+func (it *LombardTokenPoolRemotePoolRemovedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+type LombardTokenPoolRemotePoolRemoved struct {
+	RemoteChainSelector uint64
+	RemotePoolAddress   []byte
+	Raw                 types.Log
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) FilterRemotePoolRemoved(opts *bind.FilterOpts, remoteChainSelector []uint64) (*LombardTokenPoolRemotePoolRemovedIterator, error) {
+
+	var remoteChainSelectorRule []interface{}
+	for _, remoteChainSelectorItem := range remoteChainSelector {
+		remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem)
+	}
+
+	logs, sub, err := _LombardTokenPool.contract.FilterLogs(opts, "RemotePoolRemoved", remoteChainSelectorRule)
+	if err != nil {
+		return nil, err
+	}
+	return &LombardTokenPoolRemotePoolRemovedIterator{contract: _LombardTokenPool.contract, event: "RemotePoolRemoved", logs: logs, sub: sub}, nil
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) WatchRemotePoolRemoved(opts *bind.WatchOpts, sink chan<- *LombardTokenPoolRemotePoolRemoved, remoteChainSelector []uint64) (event.Subscription, error) {
+
+	var remoteChainSelectorRule []interface{}
+	for _, remoteChainSelectorItem := range remoteChainSelector {
+		remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem)
+	}
+
+	logs, sub, err := _LombardTokenPool.contract.WatchLogs(opts, "RemotePoolRemoved", remoteChainSelectorRule)
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+
+				event := new(LombardTokenPoolRemotePoolRemoved)
+				if err := _LombardTokenPool.contract.UnpackLog(event, "RemotePoolRemoved", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) ParseRemotePoolRemoved(log types.Log) (*LombardTokenPoolRemotePoolRemoved, error) {
+	event := new(LombardTokenPoolRemotePoolRemoved)
+	if err := _LombardTokenPool.contract.UnpackLog(event, "RemotePoolRemoved", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+type LombardTokenPoolRouterUpdatedIterator struct {
+	Event *LombardTokenPoolRouterUpdated
+
+	contract *bind.BoundContract
+	event    string
+
+	logs chan types.Log
+	sub  ethereum.Subscription
+	done bool
+	fail error
+}
+
+func (it *LombardTokenPoolRouterUpdatedIterator) Next() bool {
+
+	if it.fail != nil {
+		return false
+	}
+
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(LombardTokenPoolRouterUpdated)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+
+	select {
+	case log := <-it.logs:
+		it.Event = new(LombardTokenPoolRouterUpdated)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+func (it *LombardTokenPoolRouterUpdatedIterator) Error() error {
+	return it.fail
+}
+
+func (it *LombardTokenPoolRouterUpdatedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+type LombardTokenPoolRouterUpdated struct {
+	OldRouter common.Address
+	NewRouter common.Address
+	Raw       types.Log
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) FilterRouterUpdated(opts *bind.FilterOpts) (*LombardTokenPoolRouterUpdatedIterator, error) {
+
+	logs, sub, err := _LombardTokenPool.contract.FilterLogs(opts, "RouterUpdated")
+	if err != nil {
+		return nil, err
+	}
+	return &LombardTokenPoolRouterUpdatedIterator{contract: _LombardTokenPool.contract, event: "RouterUpdated", logs: logs, sub: sub}, nil
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) WatchRouterUpdated(opts *bind.WatchOpts, sink chan<- *LombardTokenPoolRouterUpdated) (event.Subscription, error) {
+
+	logs, sub, err := _LombardTokenPool.contract.WatchLogs(opts, "RouterUpdated")
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+
+				event := new(LombardTokenPoolRouterUpdated)
+				if err := _LombardTokenPool.contract.UnpackLog(event, "RouterUpdated", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) ParseRouterUpdated(log types.Log) (*LombardTokenPoolRouterUpdated, error) {
+	event := new(LombardTokenPoolRouterUpdated)
+	if err := _LombardTokenPool.contract.UnpackLog(event, "RouterUpdated", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+type LombardTokenPoolTokensConsumedIterator struct {
+	Event *LombardTokenPoolTokensConsumed
+
+	contract *bind.BoundContract
+	event    string
+
+	logs chan types.Log
+	sub  ethereum.Subscription
+	done bool
+	fail error
+}
+
+func (it *LombardTokenPoolTokensConsumedIterator) Next() bool {
+
+	if it.fail != nil {
+		return false
+	}
+
+	if it.done {
+		select {
+		case log := <-it.logs:
+			it.Event = new(LombardTokenPoolTokensConsumed)
+			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+				it.fail = err
+				return false
+			}
+			it.Event.Raw = log
+			return true
+
+		default:
+			return false
+		}
+	}
+
+	select {
+	case log := <-it.logs:
+		it.Event = new(LombardTokenPoolTokensConsumed)
+		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+			it.fail = err
+			return false
+		}
+		it.Event.Raw = log
+		return true
+
+	case err := <-it.sub.Err():
+		it.done = true
+		it.fail = err
+		return it.Next()
+	}
+}
+
+func (it *LombardTokenPoolTokensConsumedIterator) Error() error {
+	return it.fail
+}
+
+func (it *LombardTokenPoolTokensConsumedIterator) Close() error {
+	it.sub.Unsubscribe()
+	return nil
+}
+
+type LombardTokenPoolTokensConsumed struct {
+	Tokens *big.Int
+	Raw    types.Log
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) FilterTokensConsumed(opts *bind.FilterOpts) (*LombardTokenPoolTokensConsumedIterator, error) {
+
+	logs, sub, err := _LombardTokenPool.contract.FilterLogs(opts, "TokensConsumed")
+	if err != nil {
+		return nil, err
+	}
+	return &LombardTokenPoolTokensConsumedIterator{contract: _LombardTokenPool.contract, event: "TokensConsumed", logs: logs, sub: sub}, nil
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) WatchTokensConsumed(opts *bind.WatchOpts, sink chan<- *LombardTokenPoolTokensConsumed) (event.Subscription, error) {
+
+	logs, sub, err := _LombardTokenPool.contract.WatchLogs(opts, "TokensConsumed")
+	if err != nil {
+		return nil, err
+	}
+	return event.NewSubscription(func(quit <-chan struct{}) error {
+		defer sub.Unsubscribe()
+		for {
+			select {
+			case log := <-logs:
+
+				event := new(LombardTokenPoolTokensConsumed)
+				if err := _LombardTokenPool.contract.UnpackLog(event, "TokensConsumed", log); err != nil {
+					return err
+				}
+				event.Raw = log
+
+				select {
+				case sink <- event:
+				case err := <-sub.Err():
+					return err
+				case <-quit:
+					return nil
+				}
+			case err := <-sub.Err():
+				return err
+			case <-quit:
+				return nil
+			}
+		}
+	}), nil
+}
+
+func (_LombardTokenPool *LombardTokenPoolFilterer) ParseTokensConsumed(log types.Log) (*LombardTokenPoolTokensConsumed, error) {
+	event := new(LombardTokenPoolTokensConsumed)
+	if err := _LombardTokenPool.contract.UnpackLog(event, "TokensConsumed", log); err != nil {
+		return nil, err
+	}
+	event.Raw = log
+	return event, nil
+}
+
+func (_LombardTokenPool *LombardTokenPool) ParseLog(log types.Log) (generated.AbigenLog, error) {
+	switch log.Topics[0] {
+	case _LombardTokenPool.abi.Events["AllowListAdd"].ID:
+		return _LombardTokenPool.ParseAllowListAdd(log)
+	case _LombardTokenPool.abi.Events["AllowListRemove"].ID:
+		return _LombardTokenPool.ParseAllowListRemove(log)
+	case _LombardTokenPool.abi.Events["Burned"].ID:
+		return _LombardTokenPool.ParseBurned(log)
+	case _LombardTokenPool.abi.Events["ChainAdded"].ID:
+		return _LombardTokenPool.ParseChainAdded(log)
+	case _LombardTokenPool.abi.Events["ChainConfigured"].ID:
+		return _LombardTokenPool.ParseChainConfigured(log)
+	case _LombardTokenPool.abi.Events["ChainRemoved"].ID:
+		return _LombardTokenPool.ParseChainRemoved(log)
+	case _LombardTokenPool.abi.Events["ConfigChanged"].ID:
+		return _LombardTokenPool.ParseConfigChanged(log)
+	case _LombardTokenPool.abi.Events["Locked"].ID:
+		return _LombardTokenPool.ParseLocked(log)
+	case _LombardTokenPool.abi.Events["Minted"].ID:
+		return _LombardTokenPool.ParseMinted(log)
+	case _LombardTokenPool.abi.Events["OwnershipTransferRequested"].ID:
+		return _LombardTokenPool.ParseOwnershipTransferRequested(log)
+	case _LombardTokenPool.abi.Events["OwnershipTransferred"].ID:
+		return _LombardTokenPool.ParseOwnershipTransferred(log)
+	case _LombardTokenPool.abi.Events["RateLimitAdminSet"].ID:
+		return _LombardTokenPool.ParseRateLimitAdminSet(log)
+	case _LombardTokenPool.abi.Events["Released"].ID:
+		return _LombardTokenPool.ParseReleased(log)
+	case _LombardTokenPool.abi.Events["RemotePoolAdded"].ID:
+		return _LombardTokenPool.ParseRemotePoolAdded(log)
+	case _LombardTokenPool.abi.Events["RemotePoolRemoved"].ID:
+		return _LombardTokenPool.ParseRemotePoolRemoved(log)
+	case _LombardTokenPool.abi.Events["RouterUpdated"].ID:
+		return _LombardTokenPool.ParseRouterUpdated(log)
+	case _LombardTokenPool.abi.Events["TokensConsumed"].ID:
+		return _LombardTokenPool.ParseTokensConsumed(log)
+
+	default:
+		return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0])
+	}
+}
+
+func (LombardTokenPoolAllowListAdd) Topic() common.Hash {
+	return common.HexToHash("0x2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d8")
+}
+
+func (LombardTokenPoolAllowListRemove) Topic() common.Hash {
+	return common.HexToHash("0x800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf7566")
+}
+
+func (LombardTokenPoolBurned) Topic() common.Hash {
+	return common.HexToHash("0x696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df7")
+}
+
+func (LombardTokenPoolChainAdded) Topic() common.Hash {
+	return common.HexToHash("0x8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c2")
+}
+
+func (LombardTokenPoolChainConfigured) Topic() common.Hash {
+	return common.HexToHash("0x0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b")
+}
+
+func (LombardTokenPoolChainRemoved) Topic() common.Hash {
+	return common.HexToHash("0x5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d859916")
+}
+
+func (LombardTokenPoolConfigChanged) Topic() common.Hash {
+	return common.HexToHash("0x9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19")
+}
+
+func (LombardTokenPoolLocked) Topic() common.Hash {
+	return common.HexToHash("0x9f1ec8c880f76798e7b793325d625e9b60e4082a553c98f42b6cda368dd60008")
+}
+
+func (LombardTokenPoolMinted) Topic() common.Hash {
+	return common.HexToHash("0x9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f0")
+}
+
+func (LombardTokenPoolOwnershipTransferRequested) Topic() common.Hash {
+	return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278")
+}
+
+func (LombardTokenPoolOwnershipTransferred) Topic() common.Hash {
+	return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0")
+}
+
+func (LombardTokenPoolRateLimitAdminSet) Topic() common.Hash {
+	return common.HexToHash("0x44676b5284b809a22248eba0da87391d79098be38bb03154be88a58bf4d09174")
+}
+
+func (LombardTokenPoolReleased) Topic() common.Hash {
+	return common.HexToHash("0x2d87480f50083e2b2759522a8fdda59802650a8055e609a7772cf70c07748f52")
+}
+
+func (LombardTokenPoolRemotePoolAdded) Topic() common.Hash {
+	return common.HexToHash("0x7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea")
+}
+
+func (LombardTokenPoolRemotePoolRemoved) Topic() common.Hash {
+	return common.HexToHash("0x52d00ee4d9bd51b40168f2afc5848837288ce258784ad914278791464b3f4d76")
+}
+
+func (LombardTokenPoolRouterUpdated) Topic() common.Hash {
+	return common.HexToHash("0x02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f1684")
+}
+
+func (LombardTokenPoolTokensConsumed) Topic() common.Hash {
+	return common.HexToHash("0x1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a")
+}
+
+func (_LombardTokenPool *LombardTokenPool) Address() common.Address {
+	return _LombardTokenPool.address
+}
+
+type LombardTokenPoolInterface interface {
+	Adapter(opts *bind.CallOpts) (common.Address, error)
+
+	GetAllowList(opts *bind.CallOpts) ([]common.Address, error)
+
+	GetAllowListEnabled(opts *bind.CallOpts) (bool, error)
+
+	GetCurrentInboundRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64) (RateLimiterTokenBucket, error)
+
+	GetCurrentOutboundRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64) (RateLimiterTokenBucket, error)
+
+	GetRateLimitAdmin(opts *bind.CallOpts) (common.Address, error)
+
+	GetRemotePools(opts *bind.CallOpts, remoteChainSelector uint64) ([][]byte, error)
+
+	GetRemoteToken(opts *bind.CallOpts, remoteChainSelector uint64) ([]byte, error)
+
+	GetRmnProxy(opts *bind.CallOpts) (common.Address, error)
+
+	GetRouter(opts *bind.CallOpts) (common.Address, error)
+
+	GetSupportedChains(opts *bind.CallOpts) ([]uint64, error)
+
+	GetToken(opts *bind.CallOpts) (common.Address, error)
+
+	GetTokenDecimals(opts *bind.CallOpts) (uint8, error)
+
+	IsAttestationEnabled(opts *bind.CallOpts) (bool, error)
+
+	IsRemotePool(opts *bind.CallOpts, remoteChainSelector uint64, remotePoolAddress []byte) (bool, error)
+
+	IsSupportedChain(opts *bind.CallOpts, remoteChainSelector uint64) (bool, error)
+
+	IsSupportedToken(opts *bind.CallOpts, token common.Address) (bool, error)
+
+	Owner(opts *bind.CallOpts) (common.Address, error)
+
+	SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error)
+
+	AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error)
+
+	AddRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error)
+
+	ApplyAllowListUpdates(opts *bind.TransactOpts, removes []common.Address, adds []common.Address) (*types.Transaction, error)
+
+	ApplyChainUpdates(opts *bind.TransactOpts, remoteChainSelectorsToRemove []uint64, chainsToAdd []TokenPoolChainUpdate) (*types.Transaction, error)
+
+	LockOrBurn(opts *bind.TransactOpts, lockOrBurnIn PoolLockOrBurnInV1) (*types.Transaction, error)
+
+	ReleaseOrMint(opts *bind.TransactOpts, releaseOrMintIn PoolReleaseOrMintInV1) (*types.Transaction, error)
+
+	RemoveRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error)
+
+	SetChainRateLimiterConfig(opts *bind.TransactOpts, remoteChainSelector uint64, outboundConfig RateLimiterConfig, inboundConfig RateLimiterConfig) (*types.Transaction, error)
+
+	SetRateLimitAdmin(opts *bind.TransactOpts, rateLimitAdmin common.Address) (*types.Transaction, error)
+
+	SetRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error)
+
+	TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error)
+
+	FilterAllowListAdd(opts *bind.FilterOpts) (*LombardTokenPoolAllowListAddIterator, error)
+
+	WatchAllowListAdd(opts *bind.WatchOpts, sink chan<- *LombardTokenPoolAllowListAdd) (event.Subscription, error)
+
+	ParseAllowListAdd(log types.Log) (*LombardTokenPoolAllowListAdd, error)
+
+	FilterAllowListRemove(opts *bind.FilterOpts) (*LombardTokenPoolAllowListRemoveIterator, error)
+
+	WatchAllowListRemove(opts *bind.WatchOpts, sink chan<- *LombardTokenPoolAllowListRemove) (event.Subscription, error)
+
+	ParseAllowListRemove(log types.Log) (*LombardTokenPoolAllowListRemove, error)
+
+	FilterBurned(opts *bind.FilterOpts, sender []common.Address) (*LombardTokenPoolBurnedIterator, error)
+
+	WatchBurned(opts *bind.WatchOpts, sink chan<- *LombardTokenPoolBurned, sender []common.Address) (event.Subscription, error)
+
+	ParseBurned(log types.Log) (*LombardTokenPoolBurned, error)
+
+	FilterChainAdded(opts *bind.FilterOpts) (*LombardTokenPoolChainAddedIterator, error)
+
+	WatchChainAdded(opts *bind.WatchOpts, sink chan<- *LombardTokenPoolChainAdded) (event.Subscription, error)
+
+	ParseChainAdded(log types.Log) (*LombardTokenPoolChainAdded, error)
+
+	FilterChainConfigured(opts *bind.FilterOpts) (*LombardTokenPoolChainConfiguredIterator, error)
+
+	WatchChainConfigured(opts *bind.WatchOpts, sink chan<- *LombardTokenPoolChainConfigured) (event.Subscription, error)
+
+	ParseChainConfigured(log types.Log) (*LombardTokenPoolChainConfigured, error)
+
+	FilterChainRemoved(opts *bind.FilterOpts) (*LombardTokenPoolChainRemovedIterator, error)
+
+	WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *LombardTokenPoolChainRemoved) (event.Subscription, error)
+
+	ParseChainRemoved(log types.Log) (*LombardTokenPoolChainRemoved, error)
+
+	FilterConfigChanged(opts *bind.FilterOpts) (*LombardTokenPoolConfigChangedIterator, error)
+
+	WatchConfigChanged(opts *bind.WatchOpts, sink chan<- *LombardTokenPoolConfigChanged) (event.Subscription, error)
+
+	ParseConfigChanged(log types.Log) (*LombardTokenPoolConfigChanged, error)
+
+	FilterLocked(opts *bind.FilterOpts, sender []common.Address) (*LombardTokenPoolLockedIterator, error)
+
+	WatchLocked(opts *bind.WatchOpts, sink chan<- *LombardTokenPoolLocked, sender []common.Address) (event.Subscription, error)
+
+	ParseLocked(log types.Log) (*LombardTokenPoolLocked, error)
+
+	FilterMinted(opts *bind.FilterOpts, sender []common.Address, recipient []common.Address) (*LombardTokenPoolMintedIterator, error)
+
+	WatchMinted(opts *bind.WatchOpts, sink chan<- *LombardTokenPoolMinted, sender []common.Address, recipient []common.Address) (event.Subscription, error)
+
+	ParseMinted(log types.Log) (*LombardTokenPoolMinted, error)
+
+	FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*LombardTokenPoolOwnershipTransferRequestedIterator, error)
+
+	WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *LombardTokenPoolOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error)
+
+	ParseOwnershipTransferRequested(log types.Log) (*LombardTokenPoolOwnershipTransferRequested, error)
+
+	FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*LombardTokenPoolOwnershipTransferredIterator, error)
+
+	WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *LombardTokenPoolOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error)
+
+	ParseOwnershipTransferred(log types.Log) (*LombardTokenPoolOwnershipTransferred, error)
+
+	FilterRateLimitAdminSet(opts *bind.FilterOpts) (*LombardTokenPoolRateLimitAdminSetIterator, error)
+
+	WatchRateLimitAdminSet(opts *bind.WatchOpts, sink chan<- *LombardTokenPoolRateLimitAdminSet) (event.Subscription, error)
+
+	ParseRateLimitAdminSet(log types.Log) (*LombardTokenPoolRateLimitAdminSet, error)
+
+	FilterReleased(opts *bind.FilterOpts, sender []common.Address, recipient []common.Address) (*LombardTokenPoolReleasedIterator, error)
+
+	WatchReleased(opts *bind.WatchOpts, sink chan<- *LombardTokenPoolReleased, sender []common.Address, recipient []common.Address) (event.Subscription, error)
+
+	ParseReleased(log types.Log) (*LombardTokenPoolReleased, error)
+
+	FilterRemotePoolAdded(opts *bind.FilterOpts, remoteChainSelector []uint64) (*LombardTokenPoolRemotePoolAddedIterator, error)
+
+	WatchRemotePoolAdded(opts *bind.WatchOpts, sink chan<- *LombardTokenPoolRemotePoolAdded, remoteChainSelector []uint64) (event.Subscription, error)
+
+	ParseRemotePoolAdded(log types.Log) (*LombardTokenPoolRemotePoolAdded, error)
+
+	FilterRemotePoolRemoved(opts *bind.FilterOpts, remoteChainSelector []uint64) (*LombardTokenPoolRemotePoolRemovedIterator, error)
+
+	WatchRemotePoolRemoved(opts *bind.WatchOpts, sink chan<- *LombardTokenPoolRemotePoolRemoved, remoteChainSelector []uint64) (event.Subscription, error)
+
+	ParseRemotePoolRemoved(log types.Log) (*LombardTokenPoolRemotePoolRemoved, error)
+
+	FilterRouterUpdated(opts *bind.FilterOpts) (*LombardTokenPoolRouterUpdatedIterator, error)
+
+	WatchRouterUpdated(opts *bind.WatchOpts, sink chan<- *LombardTokenPoolRouterUpdated) (event.Subscription, error)
+
+	ParseRouterUpdated(log types.Log) (*LombardTokenPoolRouterUpdated, error)
+
+	FilterTokensConsumed(opts *bind.FilterOpts) (*LombardTokenPoolTokensConsumedIterator, error)
+
+	WatchTokensConsumed(opts *bind.WatchOpts, sink chan<- *LombardTokenPoolTokensConsumed) (event.Subscription, error)
+
+	ParseTokensConsumed(log types.Log) (*LombardTokenPoolTokensConsumed, error)
+
+	ParseLog(log types.Log) (generated.AbigenLog, error)
+
+	Address() common.Address
+}
diff --git a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt
index 0399a3574b..1d9540a6d5 100644
--- a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt
+++ b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt
@@ -14,6 +14,8 @@ ether_sender_receiver: ../../../contracts/solc/v0.8.24/EtherSenderReceiver/Ether
 evm_2_evm_offramp: ../../../contracts/solc/v0.8.24/EVM2EVMOffRamp/EVM2EVMOffRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMOffRamp/EVM2EVMOffRamp.bin b0d77babbe635cd6ba04c2af049badc9e9d28a4b6ed6bb75f830ad902a618beb
 evm_2_evm_onramp: ../../../contracts/solc/v0.8.24/EVM2EVMOnRamp/EVM2EVMOnRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMOnRamp/EVM2EVMOnRamp.bin 5c02c2b167946b3467636ff2bb58594cb4652fc63d8bdfee2488ed562e2a3e50
 fee_quoter: ../../../contracts/solc/v0.8.24/FeeQuoter/FeeQuoter.abi ../../../contracts/solc/v0.8.24/FeeQuoter/FeeQuoter.bin 503823a939ff99fe3bdaaef7a89cd4bbe475e260d3921335dbf9c80d4f584b76
+lbtc_adapter: ../../../contracts/solc/v0.8.24/CLAdapter/CLAdapter.abi ../../../contracts/solc/v0.8.24/CLAdapter/CLAdapter.bin 87b427226c055214e0f1b62d4ee24f294c3758dd0ecf7ceb10868021cdf2108c
+lbtc_token_pool: ../../../contracts/solc/v0.8.24/LombardTokenPool/LombardTokenPool.abi ../../../contracts/solc/v0.8.24/LombardTokenPool/LombardTokenPool.bin fcef57b5a0c69a30345188c6be2a89bcf7b77f39fef04349ed1010fb3e947920
 lock_release_token_pool: ../../../contracts/solc/v0.8.24/LockReleaseTokenPool/LockReleaseTokenPool.abi ../../../contracts/solc/v0.8.24/LockReleaseTokenPool/LockReleaseTokenPool.bin 1067f557abeb5570f1da7f050ea982ffad0f35dc064e668a8a0e6af128df490c
 lock_release_token_pool_and_proxy: ../../../contracts/solc/v0.8.24/LockReleaseTokenPoolAndProxy/LockReleaseTokenPoolAndProxy.abi ../../../contracts/solc/v0.8.24/LockReleaseTokenPoolAndProxy/LockReleaseTokenPoolAndProxy.bin e632b08be0fbd1d013e8b3a9d75293d0d532b83071c531ff2be1deec1fa48ec1
 maybe_revert_message_receiver: ../../../contracts/solc/v0.8.24/MaybeRevertMessageReceiver/MaybeRevertMessageReceiver.abi ../../../contracts/solc/v0.8.24/MaybeRevertMessageReceiver/MaybeRevertMessageReceiver.bin d73956c26232ebcc4a5444429fa99cbefed960e323be9b5a24925885c2e477d5
diff --git a/core/gethwrappers/ccip/go_generate.go b/core/gethwrappers/ccip/go_generate.go
index d0f5951323..d57df8d017 100644
--- a/core/gethwrappers/ccip/go_generate.go
+++ b/core/gethwrappers/ccip/go_generate.go
@@ -26,6 +26,8 @@ package ccip
 //go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/LockReleaseTokenPool/LockReleaseTokenPool.abi ../../../contracts/solc/v0.8.24/LockReleaseTokenPool/LockReleaseTokenPool.bin LockReleaseTokenPool lock_release_token_pool
 //go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/TokenPool/TokenPool.abi ../../../contracts/solc/v0.8.24/TokenPool/TokenPool.bin TokenPool token_pool
 //go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/USDCTokenPool/USDCTokenPool.abi ../../../contracts/solc/v0.8.24/USDCTokenPool/USDCTokenPool.bin USDCTokenPool usdc_token_pool
+//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/CLAdapter/CLAdapter.abi ../../../contracts/solc/v0.8.24/CLAdapter/CLAdapter.bin CLAdapter lbtc_adapter
+//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/LombardTokenPool/LombardTokenPool.abi ../../../contracts/solc/v0.8.24/LombardTokenPool/LombardTokenPool.bin LombardTokenPool lbtc_token_pool
 
 // Helpers
 //go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/MockV3Aggregator/MockV3Aggregator.abi ../../../contracts/solc/v0.8.24/MockV3Aggregator/MockV3Aggregator.bin MockV3Aggregator mock_v3_aggregator_contract