From 960efe8a34d3749d899ad406c3a5e9113b788c95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hampus=20Sj=C3=B6berg?= Date: Sat, 26 Dec 2020 21:54:22 +0100 Subject: [PATCH] lnd backend implementation for iOS This commit adds an lnd ("LndMobile") backend for the iOS build. It supports all lnd RPC calls the wallet uses, however it's currently missing some native module functions (src/lndmobile/LndMobile.d.ts specify these). Scheduled sync job is not included in this iteration. --- .gitignore | 4 + README.md | 7 +- .../main/java/com/blixtwallet/LndMobile.java | 626 +- .../LndMobileScheduledSyncWorker.java | 5 - .../com/blixtwallet/LndMobileService.java | 2 +- .../java/com/blixtwallet/LndMobileTools.java | 709 + .../blixtwallet/LndMobileToolsPackage.java | 22 + .../java/com/blixtwallet/MainApplication.java | 1 + build-ios-framework.md | 7 + contrib/log | 2 +- index.js | 2 + ios/BlixtWallet.xcodeproj/project.pbxproj | 228 +- .../xcschemes/BlixtWallet.xcscheme | 2 +- .../xcschemes/BlixtWalletRegtest.xcscheme | 2 +- .../xcschemes/BlixtWalletTestnet.xcscheme | 2 +- ios/BlixtWallet/AppDelegate.m | 8 + ios/BlixtWallet/BlixtWallet.entitlements | 6 + .../AppIcon.appiconset/Contents.json | 72 +- .../blixt-wallet-60-1024.png | Bin 218620 -> 0 bytes .../blixt-wallet-60-20@2x.png | Bin 2264 -> 0 bytes .../blixt-wallet-60-20@3x.png | Bin 3257 -> 0 bytes .../blixt-wallet-60-29@2x.png | Bin 3421 -> 0 bytes .../blixt-wallet-60-29@3x.png | Bin 5866 -> 0 bytes .../blixt-wallet-60-40@2x.png | Bin 4611 -> 0 bytes .../blixt-wallet-60-40@3x.png | Bin 8708 -> 0 bytes .../blixt-wallet-60-60@2x.png | Bin 8708 -> 0 bytes .../blixt-wallet-60-60@3x.png | Bin 20247 -> 0 bytes .../blixt-wallet-70-1024.png | Bin 0 -> 220531 bytes .../AppIcon.appiconset/blixt-wallet-70-20.png | Bin 0 -> 1639 bytes .../blixt-wallet-70-20@2x.png | Bin 0 -> 2381 bytes .../blixt-wallet-70-20@3x.png | Bin 0 -> 3432 bytes .../AppIcon.appiconset/blixt-wallet-70-29.png | Bin 0 -> 1966 bytes .../blixt-wallet-70-29@2x.png | Bin 0 -> 3583 bytes .../blixt-wallet-70-29@3x.png | Bin 0 -> 6051 bytes .../AppIcon.appiconset/blixt-wallet-70-40.png | Bin 0 -> 2381 bytes .../blixt-wallet-70-40@2x.png | Bin 0 -> 4831 bytes .../blixt-wallet-70-40@3x.png | Bin 0 -> 9070 bytes .../blixt-wallet-70-60@2x.png | Bin 0 -> 9070 bytes .../blixt-wallet-70-60@3x.png | Bin 0 -> 20477 bytes .../AppIcon.appiconset/blixt-wallet-70-76.png | Bin 0 -> 5040 bytes .../blixt-wallet-70-76@2x.png | Bin 0 -> 14402 bytes .../blixt-wallet-70-83.5@2x.png | Bin 0 -> 19471 bytes ios/BlixtWallet/Info.plist | 25 +- ios/LndMobile/BlixtWallet-Bridging-Header.h | 4 + ios/LndMobile/Lnd.swift | 246 + ios/LndMobile/LndMobile.m | 52 + ios/LndMobile/LndMobile.swift | 209 + ios/LndMobile/LndMobileScheduledSync.m | 21 + ios/LndMobile/LndMobileScheduledSync.swift | 28 + ios/LndMobile/LndMobileTools.m | 74 + ios/LndMobile/LndMobileTools.swift | 334 + ios/LndMobile/rpc.pb.swift | 15267 ++++++++++++++++ ios/LndMobile/walletunlocker.pb.swift | 580 + ios/Podfile | 3 + ios/Podfile.lock | 400 +- ios/put_Lndmobile.framework_here | 0 jest.config.js | 2 +- jestSetup.js | 3 +- mocks/lndmobile/index.ts | 2 +- package.json | 33 +- react-native.config.js | 10 +- src/App.tsx | 1 + src/Main.tsx | 4 +- src/components/BlixtWallet.tsx | 83 + src/components/BlurModal.tsx | 4 +- src/components/Content.tsx | 2 +- src/components/Form.tsx | 4 +- src/hooks/useBalance.ts | 2 +- src/hooks/useFingerprintAuth.ts | 1 - src/lndmobile/LndMobile.d.ts | 52 +- src/lndmobile/fake/index.ts | 43 +- src/lndmobile/index.ts | 63 +- src/lndmobile/scheduled-sync.ts | 3 +- src/lndmobile/utils.ts | 2 +- src/lndmobile/wallet.ts | 3 +- src/migration/app-migration.ts | 20 +- src/state/Channel.ts | 7 +- ...dDeeplinkManager.ts => DeeplinkManager.ts} | 39 +- src/state/Google.android.ts | 100 + src/state/Google.ts | 60 +- src/state/ICloudBackup.ts | 111 + src/state/LNURL.ts | 3 +- src/state/Lightning.ts | 66 +- src/state/LndMobileInjection.ts | 36 +- src/state/LndMobileInjectionFake.ts | 29 +- src/state/NotificationManager.ts | 21 +- src/state/OnChain.ts | 3 +- src/state/Receive.ts | 3 +- src/state/ScheduledSync.ts | 4 +- src/state/Security.ts | 17 +- src/state/Settings.ts | 11 + src/state/index.ts | 38 +- src/storage/app.ts | 6 + src/storage/keystore.ts | 2 +- src/utils/build.ts | 8 +- src/utils/constants.ts | 4 +- src/utils/event-listener.ts | 7 + src/utils/log.ts | 26 +- src/utils/push-notification.ts | 2 +- src/windows/HelperWindows/SelectList.tsx | 57 +- src/windows/InitProcess/Authentication.tsx | 8 +- src/windows/InitProcess/DEV_Commands.tsx | 93 +- src/windows/InitProcess/InitLightning.tsx | 4 +- src/windows/Keysend/Experiment.tsx | 2 +- src/windows/LNURL/AuthRequest.tsx | 14 +- src/windows/LNURL/PayRequest.tsx | 7 +- src/windows/Loading.tsx | 7 +- src/windows/OnChain/OnChainInfo.tsx | 2 +- src/windows/Overview.tsx | 2 +- src/windows/Receive/ReceiveSetup.tsx | 11 +- src/windows/Send/SendConfirmation.tsx | 2 +- src/windows/Send/SendDone.tsx | 107 +- .../ChangeFingerprintSettingsAuth.tsx | 32 +- src/windows/Settings/LightningPeers.tsx | 217 + src/windows/Settings/LndMobileHelpCenter.tsx | 6 +- src/windows/Settings/Settings.tsx | 193 +- src/windows/Settings/index.tsx | 5 + src/windows/WebLN/Browser.tsx | 14 +- src/windows/Welcome/AlmostDone.tsx | 19 +- src/windows/Welcome/Confirm.tsx | 2 + src/windows/Welcome/GoogleDriveBackup.tsx | 2 +- src/windows/Welcome/ICloudBackup.tsx | 93 + src/windows/Welcome/Restore.tsx | 42 +- src/windows/Welcome/Start.tsx | 4 +- src/windows/Welcome/index.tsx | 3 + .../__snapshots__/Receive.test.tsx.snap | 14 +- yarn.lock | 2839 +-- 127 files changed, 19706 insertions(+), 3985 deletions(-) create mode 100644 android/app/src/main/java/com/blixtwallet/LndMobileTools.java create mode 100644 android/app/src/main/java/com/blixtwallet/LndMobileToolsPackage.java create mode 100644 build-ios-framework.md delete mode 100644 ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-60-1024.png delete mode 100644 ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-60-20@2x.png delete mode 100644 ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-60-20@3x.png delete mode 100644 ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-60-29@2x.png delete mode 100644 ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-60-29@3x.png delete mode 100644 ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-60-40@2x.png delete mode 100644 ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-60-40@3x.png delete mode 100644 ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-60-60@2x.png delete mode 100644 ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-60-60@3x.png create mode 100644 ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-70-1024.png create mode 100644 ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-70-20.png create mode 100644 ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-70-20@2x.png create mode 100644 ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-70-20@3x.png create mode 100644 ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-70-29.png create mode 100644 ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-70-29@2x.png create mode 100644 ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-70-29@3x.png create mode 100644 ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-70-40.png create mode 100644 ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-70-40@2x.png create mode 100644 ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-70-40@3x.png create mode 100644 ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-70-60@2x.png create mode 100644 ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-70-60@3x.png create mode 100644 ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-70-76.png create mode 100644 ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-70-76@2x.png create mode 100644 ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-70-83.5@2x.png create mode 100644 ios/LndMobile/BlixtWallet-Bridging-Header.h create mode 100644 ios/LndMobile/Lnd.swift create mode 100644 ios/LndMobile/LndMobile.m create mode 100644 ios/LndMobile/LndMobile.swift create mode 100644 ios/LndMobile/LndMobileScheduledSync.m create mode 100644 ios/LndMobile/LndMobileScheduledSync.swift create mode 100644 ios/LndMobile/LndMobileTools.m create mode 100644 ios/LndMobile/LndMobileTools.swift create mode 100644 ios/LndMobile/rpc.pb.swift create mode 100644 ios/LndMobile/walletunlocker.pb.swift create mode 100644 ios/put_Lndmobile.framework_here create mode 100644 src/components/BlixtWallet.tsx rename src/state/{AndroidDeeplinkManager.ts => DeeplinkManager.ts} (80%) create mode 100644 src/state/Google.android.ts create mode 100644 src/state/ICloudBackup.ts create mode 100644 src/utils/event-listener.ts create mode 100644 src/windows/Settings/LightningPeers.tsx create mode 100644 src/windows/Welcome/ICloudBackup.tsx diff --git a/.gitignore b/.gitignore index 57cbf7fb2..9d2d4ccf9 100644 --- a/.gitignore +++ b/.gitignore @@ -73,3 +73,7 @@ google-services.json # iOS /ios/Pods + +# Lnd binaries +android/lndmobile/Lndmobile.aar +ios/Lndmobile.framework diff --git a/README.md b/README.md index 684111b3e..25d3a8ab4 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ powered by lnd and Neutrino SPV. - [x] Scheduled sync of chain background job - [x] Local channel backup - [x] [LNURL](https://github.com/btcontract/lnurl-rfc) support (all sub-protocols: pay, channel, auth and withdraw) -- [x] Channel backup to Google Drive +- [x] Channel backup to Google Drive (Android) and iCloud (iOS) - [x] [WebLN](https://webln.dev/) browser - [x] Support for [Multi-Part Payments (MPP)](https://lightning.engineering/posts/2020-05-07-mpp/) - [x] Integrated Tor support @@ -57,11 +57,12 @@ To start the application: ### iOS -_The iPhone/iOS version is still work in progress and is not yet stable nor fully working._ +_The iPhone/iOS version is still work in progress._ To build the iOS version, macOS is required. You also need an Apple Developer account, although you do not need to be enrolled in the Developer Program. - Install [XCode](https://developer.apple.com/xcode/), [Node](https://nodejs.org) and [Yarn](https://classic.yarnpkg.com/) +- Build lnd for iOS by following the steps in [build-ios-framework.md](build-ios-framework.md) - Install Node packages: `yarn` - Generate proto files: `yarn gen-proto` - Install CocoaPods libs: `cd ios && pod install` @@ -74,7 +75,7 @@ To build the iOS version, macOS is required. You also need an Apple Developer ac To start the application: - Run: `yarn start-metro` -- Run: `yarn ios:mainnet-fakelnd-debug` +- Run: `yarn ios:mainnet-debug --device ""` or build from XCode ## Commit and Code-Style diff --git a/android/app/src/main/java/com/blixtwallet/LndMobile.java b/android/app/src/main/java/com/blixtwallet/LndMobile.java index a01e04157..f2d4128aa 100644 --- a/android/app/src/main/java/com/blixtwallet/LndMobile.java +++ b/android/app/src/main/java/com/blixtwallet/LndMobile.java @@ -276,21 +276,7 @@ public void sendPongToLndMobileservice(Promise promise) { } @ReactMethod - public void checkLndProcessExist(Promise promise) { - String packageName = getReactApplicationContext().getPackageName(); - ActivityManager am = (ActivityManager) getReactApplicationContext().getSystemService(Context.ACTIVITY_SERVICE); - for (ActivityManager.RunningAppProcessInfo p : am.getRunningAppProcesses()) { - if (p.processName.equals(packageName + ":blixtLndMobile")) { - HyperLog.d(TAG, packageName + ":blixtLndMobile pid: " + String.valueOf(p.pid)); - promise.resolve(true); - return; - } - } - promise.resolve(false); - } - - @ReactMethod - public void init(Promise promise) { + public void initialize(Promise promise) { if (!lndMobileServiceBound) { int req = new Random().nextInt(); requests.put(req, promise); @@ -404,297 +390,6 @@ public void stopLnd(Promise promise) { } } - private FileObserver logObserver; - - @ReactMethod - public void observeLndLogFile(Promise p) { - File appDir = getReactApplicationContext().getFilesDir(); - - final String logDir = appDir + "/logs/bitcoin/mainnet"; - final String logFile = logDir + "/lnd.log"; - - FileInputStream stream = null; - while (true) { - try { - stream = new FileInputStream(logFile); - } catch (FileNotFoundException e) { - File dir = new File(logDir); - dir.mkdirs(); - File f = new File(logFile); - try { - f.createNewFile(); - continue; - } catch (IOException e1) { - e1.printStackTrace(); - return; - } - } - break; - } - - final InputStreamReader istream = new InputStreamReader(stream); - final BufferedReader buf = new BufferedReader(istream); - try { - readToEnd(buf, false); - } catch (IOException e) { - e.printStackTrace(); - return; - } - - logObserver = new FileObserver(logFile) { - @Override - public void onEvent(int event, String file) { - if(event != FileObserver.MODIFY) { - return; - } - try { - readToEnd(buf, true); - } catch (IOException e) { - e.printStackTrace(); - } - } - }; - logObserver.startWatching(); - Log.i("LndNativeModule", "Started watching " + logFile); - p.resolve(true); - } - - private void readToEnd(BufferedReader buf, boolean emit) throws IOException { - String s = ""; - while ( (s = buf.readLine()) != null ) { - if (!emit) { - continue; - } - getReactApplicationContext() - .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) - .emit("lndlog", s); - } - } - - @ReactMethod - public void killLnd(Promise promise) { - boolean result = killLndProcess(); - promise.resolve(result); - } - - private boolean killLndProcess() { - String packageName = getReactApplicationContext().getPackageName(); - ActivityManager am = (ActivityManager) getCurrentActivity().getSystemService(Context.ACTIVITY_SERVICE); - for (ActivityManager.RunningAppProcessInfo p : am.getRunningAppProcesses()) { - if (p.processName.equals(packageName + ":blixtLndMobile")) { - HyperLog.i(TAG, "Killing " + packageName + ":blixtLndMobile with pid: " + String.valueOf(p.pid)); - Process.killProcess(p.pid); - return true; - } - } - return false; - } - - @ReactMethod - public void restartApp() { - ProcessPhoenix.triggerRebirth(getReactApplicationContext()); - } - - @ReactMethod - void writeConfigFile(Promise promise) { - String filename = getReactApplicationContext().getFilesDir().toString() + "/lnd.conf"; - - try { - new File(filename).getParentFile().mkdirs(); - PrintWriter out = new PrintWriter(filename); - - if (BuildConfig.CHAIN.equals("mainnet")) { - out.println( - "[Application Options]\n" + - "debuglevel=info\n" + - "maxbackoff=2s\n" + - "norest=1\n" + - "sync-freelist=1\n" + - "accept-keysend=1\n" + - "\n" + - "[Routing]\n" + - "routing.assumechanvalid=1\n" + - "\n" + - "[Bitcoin]\n" + - "bitcoin.active=1\n" + - "bitcoin.mainnet=1\n" + - "bitcoin.node=neutrino\n" + - "\n" + - "[Neutrino]\n" + - "neutrino.connect=btcd-mainnet.lightning.computer\n" + - "neutrino.feeurl=https://nodes.lightning.computer/fees/v1/btc-fee-estimates.json\n" + - "\n" + - "[autopilot]\n" + - "autopilot.active=0\n" + - "autopilot.private=1\n" + - "autopilot.minconfs=1\n" + - "autopilot.conftarget=3\n" + - "autopilot.allocation=1.0\n" + - "autopilot.heuristic=externalscore:0.95\n" + - "autopilot.heuristic=preferential:0.05\n" - ); - } else if (BuildConfig.CHAIN.equals("testnet")) { - out.println( - "[Application Options]\n" + - "debuglevel=info\n" + - "maxbackoff=2s\n" + - "norest=1\n" + - "sync-freelist=1\n" + - "accept-keysend=1\n" + - "\n" + - "[Routing]\n" + - "routing.assumechanvalid=1\n" + - "\n" + - "[Bitcoin]\n" + - "bitcoin.active=1\n" + - "bitcoin.testnet=1\n" + - "bitcoin.node=neutrino\n" + - "\n" + - "[Neutrino]\n" + - "neutrino.connect=btcd-testnet.lightning.computer\n" + - "neutrino.feeurl=https://nodes.lightning.computer/fees/v1/btc-fee-estimates.json\n" + - "\n" + - "[autopilot]\n" + - "autopilot.active=0\n" + - "autopilot.private=1\n" + - "autopilot.minconfs=1\n" + - "autopilot.conftarget=3\n" + - "autopilot.allocation=1.0\n" + - "autopilot.heuristic=externalscore:0.95\n" + - "autopilot.heuristic=preferential:0.05\n" - ); - } else if (BuildConfig.CHAIN.equals("regtest")) { - out.println( - "[Application Options]\n" + - "debuglevel=info\n" + - "maxbackoff=2s\n" + - "nolisten=1\n" + - "norest=1\n" + - "sync-freelist=1\n" + - "accept-keysend=1\n" + - "\n" + - "[Routing]\n" + - "routing.assumechanvalid=1\n" + - "\n" + - "[Bitcoin]\n" + - "bitcoin.active=1\n" + - "bitcoin.regtest=1\n" + - "bitcoin.node=bitcoind\n" + - "\n" + - "[Bitcoind]\n" + - "bitcoind.rpchost=192.168.1.113:18443\n" + - "bitcoind.rpcuser=polaruser\n" + - "bitcoind.rpcpass=polarpass\n" + - "bitcoind.zmqpubrawblock=192.168.1.113:28334\n" + - "bitcoind.zmqpubrawtx=192.168.1.113:29335\n" + - "\n" + - "[autopilot]\n" + - "autopilot.active=0\n" + - "autopilot.private=1\n" + - "autopilot.minconfs=1\n" + - "autopilot.conftarget=3\n" + - "autopilot.allocation=1.0\n" + - "autopilot.heuristic=externalscore:0.95\n" + - "autopilot.heuristic=preferential:0.05\n" - ); - } - - out.close(); - HyperLog.d(TAG, "Saved lnd config: " + filename); - } catch (Exception e) { - HyperLog.e(TAG, "Couldn't write " + filename, e); - promise.reject("Couldn't write: " + filename, e); - return; - } - - promise.resolve("File written: " + filename); - } - - void deleteRecursive(File fileOrDirectory) { - if (fileOrDirectory.isDirectory()) { - for (File child : fileOrDirectory.listFiles()) { - deleteRecursive(child); - } - } - - HyperLog.d(TAG, "Delete file " + fileOrDirectory.getName() + " : " + fileOrDirectory.delete()); - } - - @ReactMethod - public void DEBUG_getWalletPasswordFromKeychain(Promise promise) { - KeychainModule keychain = new KeychainModule(getReactApplicationContext()); - - WritableMap keychainOptions = Arguments.createMap(); - WritableMap keychainOptionsAuthenticationPrompt = Arguments.createMap(); - keychainOptionsAuthenticationPrompt.putString("title", "Authenticate to retrieve secret"); - keychainOptionsAuthenticationPrompt.putString("cancel", "Cancel"); - keychainOptions.putMap("authenticationPrompt", keychainOptionsAuthenticationPrompt); - - keychain.getInternetCredentialsForServer("password", keychainOptions, new PromiseWrapper() { - @Override - public void onSuccess(@Nullable Object value) { - if (value != null) { - promise.resolve(((ReadableMap) value).getString("password")); - return; - } - promise.reject("fail2"); - } - - @Override - public void onFail(Throwable throwable) { - Log.d(TAG, "error", throwable); - promise.reject(throwable.getMessage()); - } - }); - } - - @ReactMethod - public void DEBUG_deleteWallet(Promise promise) { - HyperLog.i(TAG, "DEBUG deleting wallet"); - String filename = getReactApplicationContext().getFilesDir().toString() + "/data/chain/bitcoin/" + BuildConfig.CHAIN + "/wallet.db"; - File file = new File(filename); - promise.resolve(file.delete()); - } - - @ReactMethod - public void DEBUG_deleteDatafolder(Promise promise) { - HyperLog.i(TAG, "DEBUG deleting data folder"); - String filename = getReactApplicationContext().getFilesDir().toString() + "/data/"; - File file = new File(filename); - deleteRecursive(file); - promise.resolve(null); - } - - @ReactMethod - public void DEBUG_listProcesses(Promise promise) { - String processes = ""; - - String packageName = getReactApplicationContext().getPackageName(); - ActivityManager am = (ActivityManager) getCurrentActivity().getSystemService(Context.ACTIVITY_SERVICE); - for (ActivityManager.RunningAppProcessInfo p : am.getRunningAppProcesses()) { - processes += p.processName + "\n"; - } - - promise.resolve(processes); - } - - @ReactMethod - public void deleteTLSCerts(Promise promise) { - HyperLog.i(TAG, "Deleting lnd TLS certificates"); - - String tlsKeyFilename = getReactApplicationContext().getFilesDir().toString() + "/tls.key"; - File tlsKeyFile = new File(tlsKeyFilename); - boolean tlsKeyFileDeletion = tlsKeyFile.delete(); - HyperLog.i(TAG, "Delete: " + tlsKeyFilename.toString() + ": " + tlsKeyFileDeletion); - - String tlsCertFilename = getReactApplicationContext().getFilesDir().toString() + "/tls.cert"; - File tlsCertFile = new File(tlsCertFilename); - boolean tlsCertFileDeletion = tlsCertFile.delete(); - HyperLog.i(TAG, "Delete: " + tlsCertFilename.toString() + ": " + tlsCertFileDeletion); - - promise.resolve(tlsKeyFileDeletion && tlsCertFileDeletion); - } - @ReactMethod public void sendCommand(String method, String payloadStr, final Promise promise) { HyperLog.d(TAG, "sendCommand() " + method); @@ -796,323 +491,4 @@ void initWallet(ReadableArray seed, String password, int recoveryWindow, String promise.reject(TAG, "Could not Send MSG_INITWALLET to LndMobileService", e); } } - - @ReactMethod - public void saveLogs(Promise promise) { - File file = HyperLog.getDeviceLogsInFile(getReactApplicationContext(), false); - if (file != null && file.exists()) { - promise.resolve(file.getAbsolutePath()); - } - else { - promise.reject("Fail saving log"); - } - } - - @ReactMethod - public void copyLndLog(Promise promise) { - checkWriteExternalStoragePermission( - (@Nullable Object value) -> { - if (value.equals("granted")) { - String lndLogFile = copyLndLogFile(); - if (lndLogFile != null) { - promise.resolve(lndLogFile); - } - else { - promise.reject("Error copying"); - } - } - }, - () -> { - promise.reject("Request Error"); - }, - () -> { - promise.reject("Permission Check Error"); - } - ); - } - - public String copyLndLogFile() { - File sourceLocation = new File( - getReactApplicationContext().getFilesDir().toString() + - "/logs/bitcoin/" + - BuildConfig.CHAIN + - "/lnd.log" - ); - File targetDir = new File( - ContextCompat.getExternalFilesDirs(getReactApplicationContext(), null)[0].toString() - ); - File targetLocation = new File(targetDir.toString() + "/lnd-" + BuildConfig.CHAIN + (BuildConfig.DEBUG ? "-debug" : "") + ".log"); - - try { - Log.i(TAG, targetLocation.toString()); - - if (!targetDir.exists()) { - if (!targetDir.mkdirs()) { - throw new Error("Error creating dir"); - } - } - - InputStream in = new FileInputStream(sourceLocation); - OutputStream out = new FileOutputStream(targetLocation); - - byte[] buf = new byte[1024]; - int len; - while ((len = in.read(buf)) > 0) { - out.write(buf, 0, len); - } - in.close(); - out.close(); - - return targetLocation.toString(); - } catch (Throwable e) { - Log.e(TAG, "copyLndLogFile() failed: " + e.getMessage() + " " + - "source: " + sourceLocation.toString() + "\n " + - "dest: " + targetDir.toString() - ); - return null; - } - } - - @ReactMethod - public void saveChannelsBackup(String base64Backups, Promise promise) { - byte[] backups = Base64.decode(base64Backups, Base64.NO_WRAP); - checkWriteExternalStoragePermission( - (@Nullable Object value) -> { - if (value.equals("granted")) { - saveChannelBackupToFile(backups, promise); - } - else { - promise.reject("You must grant access"); - } - }, - () -> { promise.reject("Request Error"); }, - () -> { promise.reject("Check Error"); } - ); - } - - private void saveChannelBackupToFile(byte[] backups, Promise promise) { - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss") ; - String path = ContextCompat.getExternalFilesDirs(getReactApplicationContext(), null)[0].toString(); - String file = path + - "/channels-backup-" + - dateFormat.format(new Date()) + ".bin"; - - try { - File dir = new File(path); - if (!dir.exists()) { - dir.mkdirs(); - } - } catch (Exception e) { - Log.e(TAG, "Couldn't create folder " + path, e); - promise.reject("Couldn't create folder: " + path, e.getMessage()); - } - - try (FileOutputStream stream = new FileOutputStream(file)) { - stream.write(backups); - Log.i(TAG, "Success " + file); - } catch (Exception e) { - Log.e(TAG, "Couldn't write " + file, e); - promise.reject("Couldn't write: " + file, e.getMessage()); - } - - promise.resolve(file); - } - - private interface RequestWriteExternalStoragePermissionCallback { - void success(@Nullable Object value); - } - - private void checkWriteExternalStoragePermission(@NonNull RequestWriteExternalStoragePermissionCallback successCallback, - @NonNull Runnable failCallback, - @NonNull Runnable failPermissionCheckcallback) { - PermissionsModule permissions = new PermissionsModule(getReactApplicationContext()); - - PromiseWrapper requestPromiseWrapper = new PromiseWrapper() { - @Override - public void onSuccess(@Nullable Object value) { - successCallback.success(value); - } - - @Override - public void onFail(Throwable throwable) { - failCallback.run(); - } - }; - - PromiseWrapper checkPromiseWrapper = new PromiseWrapper() { - @Override - void onSuccess(@Nullable Object value) { - permissions.requestPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, requestPromiseWrapper); - } - - @Override - void onFail(Throwable throwable) { - failPermissionCheckcallback.run(); - } - }; - - permissions.checkPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, checkPromiseWrapper); - } - - @ReactMethod - public void getIntentStringData(Promise promise) { - String sharedText = getReactApplicationContext() - .getCurrentActivity().getIntent().getStringExtra(Intent.EXTRA_TEXT); - - if (sharedText != null) { - Log.d(TAG, sharedText); - promise.resolve(sharedText); - } - else { - Log.d(TAG, "sharedText null"); - promise.resolve(null); - } - } - - @ReactMethod - public void getIntentNfcData(Promise promise) { - // https://code.tutsplus.com/tutorials/reading-nfc-tags-with-android--mobile-17278 - Tag tag = getReactApplicationContext() - .getCurrentActivity().getIntent().getParcelableExtra(NfcAdapter.EXTRA_TAG); - if (tag == null) { - promise.resolve(null); - return; - } - - Ndef ndef = Ndef.get(tag); - if (ndef == null) { - HyperLog.d(TAG, "NFC tag is not NDEF"); - promise.resolve(null); - } - - NdefMessage ndefMessage = ndef.getCachedNdefMessage(); - - NdefRecord[] records = ndefMessage.getRecords(); - if (records.length > 0) { - // Get first record and ignore the rest - NdefRecord record = records[0]; - if (record.getTnf() == NdefRecord.TNF_WELL_KNOWN && Arrays.equals(record.getType(), NdefRecord.RTD_TEXT)) { - /* - * See NFC forum specification for "Text Record Type Definition" at 3.2.1 - * - * http://www.nfc-forum.org/specs/ - * - * bit_7 defines encoding - * bit_6 reserved for future use, must be 0 - * bit_5..0 length of IANA language code - */ - byte[] payload = record.getPayload(); - - // Get the Text Encoding - String textEncoding = ((payload[0] & 128) == 0) ? "UTF-8" : "UTF-16"; - - // Get the Language Code - int languageCodeLength = payload[0] & 0063; - - // String languageCode = new String(payload, 1, languageCodeLength, "US-ASCII"); - // e.g. "en" - - try { - String s = new String(payload, languageCodeLength + 1, payload.length - languageCodeLength - 1, textEncoding); - promise.resolve(s); - return; - } catch (UnsupportedEncodingException e) { - HyperLog.e(TAG, "Error returning ndef data", e); - } - } - else { - HyperLog.d(TAG, "Cannot read NFC Tag Record"); - } - } - promise.resolve(null); - } - - @ReactMethod - public void tailLog(Integer numberOfLines, Promise promise) { - File file = new File( - getReactApplicationContext().getFilesDir().toString() + - "/logs/bitcoin/" + - BuildConfig.CHAIN + - "/lnd.log" - ); - - java.io.RandomAccessFile fileHandler = null; - try { - fileHandler = new java.io.RandomAccessFile(file, "r"); - long fileLength = fileHandler.length() - 1; - StringBuilder sb = new StringBuilder(); - int line = 0; - - for(long filePointer = fileLength; filePointer != -1; filePointer--){ - fileHandler.seek( filePointer ); - int readByte = fileHandler.readByte(); - - if (readByte == 0xA) { - if (filePointer < fileLength) { - line = line + 1; - } - } else if (readByte == 0xD) { - if (filePointer < fileLength-1) { - line = line + 1; - } - } - if (line >= numberOfLines) { - break; - } - sb.append((char) readByte); - } - - String lastLine = sb.reverse().toString(); - promise.resolve(lastLine); - } catch (java.io.FileNotFoundException e) { - e.printStackTrace(); - promise.reject(e); - } catch (java.io.IOException e) { - e.printStackTrace(); - promise.reject(e); - } - finally { - if (fileHandler != null) { - try { - fileHandler.close(); - } catch (java.io.IOException e) {} - } - } - } - - @ReactMethod - public void log(String type, String tag, String message) { - String mainTag = "BlixtWallet"; - - switch (type) { - case "v": - HyperLog.v(mainTag, "[" + tag + "] " + message); - break; - case "d": - HyperLog.d(mainTag, "[" + tag + "] " + message); - break; - case "i": - HyperLog.i(mainTag, "[" + tag + "] " + message); - break; - case "w": - HyperLog.w(mainTag, "[" + tag + "] " + message); - break; - case "e": - HyperLog.e(mainTag, "[" + tag + "] " + message); - break; - default: - HyperLog.v(mainTag, "[unknown msg type][" + tag + "] " + message); - break; - } - } - - @ReactMethod - public void getTorEnabled(Promise promise) { - android.database.sqlite.SQLiteDatabase db = com.facebook.react.modules.storage.ReactDatabaseSupplier.getInstance(getReactApplicationContext()).get(); - String torEnabled = AsyncLocalStorageUtil.getItemImpl(db, "torEnabled"); - if (torEnabled != null) { - promise.resolve(torEnabled.equals("true")); - } - promise.reject(new Error("")); - } } diff --git a/android/app/src/main/java/com/blixtwallet/LndMobileScheduledSyncWorker.java b/android/app/src/main/java/com/blixtwallet/LndMobileScheduledSyncWorker.java index 389871a89..4549195ef 100644 --- a/android/app/src/main/java/com/blixtwallet/LndMobileScheduledSyncWorker.java +++ b/android/app/src/main/java/com/blixtwallet/LndMobileScheduledSyncWorker.java @@ -392,11 +392,6 @@ private void unbindLndMobileService() { } } - private String getWalletPassword() { - SQLiteDatabase db = dbSupplier.get(); - return AsyncLocalStorageUtil.getItemImpl(db, "walletPassword"); - } - private boolean getTorEnabled() { SQLiteDatabase db = dbSupplier.get(); String torEnabled = AsyncLocalStorageUtil.getItemImpl(db, "torEnabled"); diff --git a/android/app/src/main/java/com/blixtwallet/LndMobileService.java b/android/app/src/main/java/com/blixtwallet/LndMobileService.java index 83f032140..5df493fb4 100644 --- a/android/app/src/main/java/com/blixtwallet/LndMobileService.java +++ b/android/app/src/main/java/com/blixtwallet/LndMobileService.java @@ -241,7 +241,7 @@ public void handleMessage(Message msg) { initWallet.setRecoveryWindow(recoveryWindow); } if (channelBackupsBase64 != null) { - HyperLog.d(TAG, "--CHANNEL BACKUP RESTORE TEST--"); + HyperLog.d(TAG, "--CHANNEL BACKUP RESTORE--"); initWallet.setChannelBackups( Rpc.ChanBackupSnapshot.newBuilder().setMultiChanBackup( Rpc.MultiChanBackup.newBuilder().setMultiChanBackup( diff --git a/android/app/src/main/java/com/blixtwallet/LndMobileTools.java b/android/app/src/main/java/com/blixtwallet/LndMobileTools.java new file mode 100644 index 000000000..d1204375a --- /dev/null +++ b/android/app/src/main/java/com/blixtwallet/LndMobileTools.java @@ -0,0 +1,709 @@ +package com.blixtwallet; + +import com.blixtwallet.tor.BlixtTorUtils; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; + +import android.Manifest; +import android.app.ActivityManager; +import android.database.sqlite.SQLiteDatabase; +import android.os.FileObserver; +import android.os.Process; +import android.util.Base64; +import android.util.Log; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.ServiceConnection; +import android.os.Environment; +import android.os.Message; +import android.os.Messenger; +import android.os.Handler; +import android.os.Bundle; +import android.os.IBinder; +import android.os.RemoteException; + +import android.nfc.Tag; +import android.nfc.NfcAdapter; +import android.nfc.NdefMessage; +import android.nfc.tech.Ndef; +import android.nfc.NdefRecord; + +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Arrays; +import java.io.UnsupportedEncodingException; + +import java.io.PrintWriter; +import java.io.File; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.Random; +import java.util.EnumSet; + +import com.facebook.react.bridge.Arguments; +import com.facebook.react.bridge.WritableMap; +import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContextBaseJavaModule; +import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.bridge.Promise; +import com.facebook.react.bridge.ReadableArray; +import com.facebook.react.bridge.ReadableType; +import com.facebook.react.modules.core.DeviceEventManagerModule; +import com.facebook.react.modules.permissions.PermissionsModule; + +import com.facebook.react.modules.storage.AsyncLocalStorageUtil; +import com.jakewharton.processphoenix.ProcessPhoenix; +import com.oblador.keychain.KeychainModule; + +import com.hypertrack.hyperlog.HyperLog; + +// TODO break this class up +class LndMobileTools extends ReactContextBaseJavaModule { + final String TAG = "LndMobileTools"; + + public LndMobileTools(ReactApplicationContext reactContext) { + super(reactContext); + } + + @Override + public String getName() { + return "LndMobileTools"; + } + + @ReactMethod + void writeConfigFile(Promise promise) { + String filename = getReactApplicationContext().getFilesDir().toString() + "/lnd.conf"; + + try { + new File(filename).getParentFile().mkdirs(); + PrintWriter out = new PrintWriter(filename); + + if (BuildConfig.CHAIN.equals("mainnet")) { + out.println( + "[Application Options]\n" + + "debuglevel=info\n" + + "maxbackoff=2s\n" + + "norest=1\n" + + "sync-freelist=1\n" + + "accept-keysend=1\n" + + "\n" + + "[Routing]\n" + + "routing.assumechanvalid=1\n" + + "\n" + + "[Bitcoin]\n" + + "bitcoin.active=1\n" + + "bitcoin.mainnet=1\n" + + "bitcoin.node=neutrino\n" + + "\n" + + "[Neutrino]\n" + + "neutrino.connect=btcd-mainnet.lightning.computer\n" + + "neutrino.feeurl=https://nodes.lightning.computer/fees/v1/btc-fee-estimates.json\n" + + "\n" + + "[autopilot]\n" + + "autopilot.active=0\n" + + "autopilot.private=1\n" + + "autopilot.minconfs=1\n" + + "autopilot.conftarget=3\n" + + "autopilot.allocation=1.0\n" + + "autopilot.heuristic=externalscore:0.95\n" + + "autopilot.heuristic=preferential:0.05\n" + ); + } else if (BuildConfig.CHAIN.equals("testnet")) { + out.println( + "[Application Options]\n" + + "debuglevel=info\n" + + "maxbackoff=2s\n" + + "norest=1\n" + + "sync-freelist=1\n" + + "accept-keysend=1\n" + + "\n" + + "[Routing]\n" + + "routing.assumechanvalid=1\n" + + "\n" + + "[Bitcoin]\n" + + "bitcoin.active=1\n" + + "bitcoin.testnet=1\n" + + "bitcoin.node=neutrino\n" + + "\n" + + "[Neutrino]\n" + + "neutrino.connect=btcd-testnet.lightning.computer\n" + + "neutrino.feeurl=https://nodes.lightning.computer/fees/v1/btc-fee-estimates.json\n" + + "\n" + + "[autopilot]\n" + + "autopilot.active=0\n" + + "autopilot.private=1\n" + + "autopilot.minconfs=1\n" + + "autopilot.conftarget=3\n" + + "autopilot.allocation=1.0\n" + + "autopilot.heuristic=externalscore:0.95\n" + + "autopilot.heuristic=preferential:0.05\n" + ); + } else if (BuildConfig.CHAIN.equals("regtest")) { + out.println( + "[Application Options]\n" + + "debuglevel=info\n" + + "maxbackoff=2s\n" + + "nolisten=1\n" + + "norest=1\n" + + "sync-freelist=1\n" + + "accept-keysend=1\n" + + "\n" + + "[Routing]\n" + + "routing.assumechanvalid=1\n" + + "\n" + + "[Bitcoin]\n" + + "bitcoin.active=1\n" + + "bitcoin.regtest=1\n" + + "bitcoin.node=bitcoind\n" + + "\n" + + "[Bitcoind]\n" + + "bitcoind.rpchost=192.168.1.113:18443\n" + + "bitcoind.rpcuser=polaruser\n" + + "bitcoind.rpcpass=polarpass\n" + + "bitcoind.zmqpubrawblock=192.168.1.113:28334\n" + + "bitcoind.zmqpubrawtx=192.168.1.113:29335\n" + + "\n" + + "[autopilot]\n" + + "autopilot.active=0\n" + + "autopilot.private=1\n" + + "autopilot.minconfs=1\n" + + "autopilot.conftarget=3\n" + + "autopilot.allocation=1.0\n" + + "autopilot.heuristic=externalscore:0.95\n" + + "autopilot.heuristic=preferential:0.05\n" + ); + } + + out.close(); + HyperLog.d(TAG, "Saved lnd config: " + filename); + } catch (Exception e) { + HyperLog.e(TAG, "Couldn't write " + filename, e); + promise.reject("Couldn't write: " + filename, e); + return; + } + + promise.resolve("File written: " + filename); + } + + @ReactMethod + public void killLnd(Promise promise) { + boolean result = killLndProcess(); + promise.resolve(result); + } + + private boolean killLndProcess() { + String packageName = getReactApplicationContext().getPackageName(); + ActivityManager am = (ActivityManager) getCurrentActivity().getSystemService(Context.ACTIVITY_SERVICE); + for (ActivityManager.RunningAppProcessInfo p : am.getRunningAppProcesses()) { + if (p.processName.equals(packageName + ":blixtLndMobile")) { + HyperLog.i(TAG, "Killing " + packageName + ":blixtLndMobile with pid: " + String.valueOf(p.pid)); + Process.killProcess(p.pid); + return true; + } + } + return false; + } + + @ReactMethod + public void log(String type, String tag, String message) { + String mainTag = "BlixtWallet"; + + switch (type) { + case "v": + HyperLog.v(mainTag, "[" + tag + "] " + message); + break; + case "d": + HyperLog.d(mainTag, "[" + tag + "] " + message); + break; + case "i": + HyperLog.i(mainTag, "[" + tag + "] " + message); + break; + case "w": + HyperLog.w(mainTag, "[" + tag + "] " + message); + break; + case "e": + HyperLog.e(mainTag, "[" + tag + "] " + message); + break; + default: + HyperLog.v(mainTag, "[unknown msg type][" + tag + "] " + message); + break; + } + } + + @ReactMethod + public void saveLogs(Promise promise) { + File file = HyperLog.getDeviceLogsInFile(getReactApplicationContext(), false); + if (file != null && file.exists()) { + promise.resolve(file.getAbsolutePath()); + } + else { + promise.reject("Fail saving log"); + } + } + + @ReactMethod + public void copyLndLog(Promise promise) { + checkWriteExternalStoragePermission( + (@Nullable Object value) -> { + if (value.equals("granted")) { + String lndLogFile = copyLndLogFile(); + if (lndLogFile != null) { + promise.resolve(lndLogFile); + } + else { + promise.reject("Error copying"); + } + } + }, + () -> { + promise.reject("Request Error"); + }, + () -> { + promise.reject("Permission Check Error"); + } + ); + } + + public String copyLndLogFile() { + File sourceLocation = new File( + getReactApplicationContext().getFilesDir().toString() + + "/logs/bitcoin/" + + BuildConfig.CHAIN + + "/lnd.log" + ); + File targetDir = new File( + ContextCompat.getExternalFilesDirs(getReactApplicationContext(), null)[0].toString() + ); + File targetLocation = new File(targetDir.toString() + "/lnd-" + BuildConfig.CHAIN + (BuildConfig.DEBUG ? "-debug" : "") + ".log"); + + try { + Log.i(TAG, targetLocation.toString()); + + if (!targetDir.exists()) { + if (!targetDir.mkdirs()) { + throw new Error("Error creating dir"); + } + } + + InputStream in = new FileInputStream(sourceLocation); + OutputStream out = new FileOutputStream(targetLocation); + + byte[] buf = new byte[1024]; + int len; + while ((len = in.read(buf)) > 0) { + out.write(buf, 0, len); + } + in.close(); + out.close(); + + return targetLocation.toString(); + } catch (Throwable e) { + Log.e(TAG, "copyLndLogFile() failed: " + e.getMessage() + " " + + "source: " + sourceLocation.toString() + "\n " + + "dest: " + targetDir.toString() + ); + return null; + } + } + + @ReactMethod + public void tailLog(Integer numberOfLines, Promise promise) { + File file = new File( + getReactApplicationContext().getFilesDir().toString() + + "/logs/bitcoin/" + + BuildConfig.CHAIN + + "/lnd.log" + ); + + java.io.RandomAccessFile fileHandler = null; + try { + fileHandler = new java.io.RandomAccessFile(file, "r"); + long fileLength = fileHandler.length() - 1; + StringBuilder sb = new StringBuilder(); + int line = 0; + + for(long filePointer = fileLength; filePointer != -1; filePointer--){ + fileHandler.seek( filePointer ); + int readByte = fileHandler.readByte(); + + if (readByte == 0xA) { + if (filePointer < fileLength) { + line = line + 1; + } + } else if (readByte == 0xD) { + if (filePointer < fileLength-1) { + line = line + 1; + } + } + if (line >= numberOfLines) { + break; + } + sb.append((char) readByte); + } + + String lastLine = sb.reverse().toString(); + promise.resolve(lastLine); + } catch (java.io.FileNotFoundException e) { + e.printStackTrace(); + promise.reject(e); + } catch (java.io.IOException e) { + e.printStackTrace(); + promise.reject(e); + } + finally { + if (fileHandler != null) { + try { + fileHandler.close(); + } catch (java.io.IOException e) {} + } + } + } + + private FileObserver logObserver; + + @ReactMethod + public void observeLndLogFile(Promise p) { + File appDir = getReactApplicationContext().getFilesDir(); + + final String logDir = appDir + "/logs/bitcoin/mainnet"; + final String logFile = logDir + "/lnd.log"; + + FileInputStream stream = null; + while (true) { + try { + stream = new FileInputStream(logFile); + } catch (FileNotFoundException e) { + File dir = new File(logDir); + dir.mkdirs(); + File f = new File(logFile); + try { + f.createNewFile(); + continue; + } catch (IOException e1) { + e1.printStackTrace(); + return; + } + } + break; + } + + final InputStreamReader istream = new InputStreamReader(stream); + final BufferedReader buf = new BufferedReader(istream); + try { + readToEnd(buf, false); + } catch (IOException e) { + e.printStackTrace(); + return; + } + + logObserver = new FileObserver(logFile) { + @Override + public void onEvent(int event, String file) { + if(event != FileObserver.MODIFY) { + return; + } + try { + readToEnd(buf, true); + } catch (IOException e) { + e.printStackTrace(); + } + } + }; + logObserver.startWatching(); + Log.i(TAG, "Started watching " + logFile); + p.resolve(true); + } + + private void readToEnd(BufferedReader buf, boolean emit) throws IOException { + String s = ""; + while ( (s = buf.readLine()) != null ) { + if (!emit) { + continue; + } + getReactApplicationContext() + .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) + .emit("lndlog", s); + } + } + + @ReactMethod + public void saveChannelsBackup(String base64Backups, Promise promise) { + byte[] backups = Base64.decode(base64Backups, Base64.NO_WRAP); + checkWriteExternalStoragePermission( + (@Nullable Object value) -> { + if (value.equals("granted")) { + saveChannelBackupToFile(backups, promise); + } + else { + promise.reject("You must grant access"); + } + }, + () -> { promise.reject("Request Error"); }, + () -> { promise.reject("Check Error"); } + ); + } + + private void saveChannelBackupToFile(byte[] backups, Promise promise) { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss") ; + String path = ContextCompat.getExternalFilesDirs(getReactApplicationContext(), null)[0].toString(); + String file = path + + "/channels-backup-" + + dateFormat.format(new Date()) + ".bin"; + + try { + File dir = new File(path); + if (!dir.exists()) { + dir.mkdirs(); + } + } catch (Exception e) { + Log.e(TAG, "Couldn't create folder " + path, e); + promise.reject("Couldn't create folder: " + path, e.getMessage()); + } + + try (FileOutputStream stream = new FileOutputStream(file)) { + stream.write(backups); + Log.i(TAG, "Success " + file); + } catch (Exception e) { + Log.e(TAG, "Couldn't write " + file, e); + promise.reject("Couldn't write: " + file, e.getMessage()); + } + + promise.resolve(file); + } + + @ReactMethod + public void DEBUG_getWalletPasswordFromKeychain(Promise promise) { + KeychainModule keychain = new KeychainModule(getReactApplicationContext()); + + WritableMap keychainOptions = Arguments.createMap(); + WritableMap keychainOptionsAuthenticationPrompt = Arguments.createMap(); + keychainOptionsAuthenticationPrompt.putString("title", "Authenticate to retrieve secret"); + keychainOptionsAuthenticationPrompt.putString("cancel", "Cancel"); + keychainOptions.putMap("authenticationPrompt", keychainOptionsAuthenticationPrompt); + + keychain.getInternetCredentialsForServer("password", keychainOptions, new PromiseWrapper() { + @Override + public void onSuccess(@Nullable Object value) { + if (value != null) { + promise.resolve(((ReadableMap) value).getString("password")); + return; + } + promise.reject("fail2"); + } + + @Override + public void onFail(Throwable throwable) { + Log.d(TAG, "error", throwable); + promise.reject(throwable.getMessage()); + } + }); + } + + @ReactMethod + public void getTorEnabled(Promise promise) { + android.database.sqlite.SQLiteDatabase db = com.facebook.react.modules.storage.ReactDatabaseSupplier.getInstance(getReactApplicationContext()).get(); + String torEnabled = AsyncLocalStorageUtil.getItemImpl(db, "torEnabled"); + if (torEnabled != null) { + promise.resolve(torEnabled.equals("true")); + } + promise.reject(new Error("")); + } + + @ReactMethod + public void getIntentStringData(Promise promise) { + String sharedText = getReactApplicationContext() + .getCurrentActivity().getIntent().getStringExtra(Intent.EXTRA_TEXT); + + if (sharedText != null) { + Log.d(TAG, sharedText); + promise.resolve(sharedText); + } + else { + Log.d(TAG, "sharedText null"); + promise.resolve(null); + } + } + + @ReactMethod + public void getIntentNfcData(Promise promise) { + // https://code.tutsplus.com/tutorials/reading-nfc-tags-with-android--mobile-17278 + Tag tag = getReactApplicationContext() + .getCurrentActivity().getIntent().getParcelableExtra(NfcAdapter.EXTRA_TAG); + if (tag == null) { + promise.resolve(null); + return; + } + + Ndef ndef = Ndef.get(tag); + if (ndef == null) { + HyperLog.d(TAG, "NFC tag is not NDEF"); + promise.resolve(null); + } + + NdefMessage ndefMessage = ndef.getCachedNdefMessage(); + + NdefRecord[] records = ndefMessage.getRecords(); + if (records.length > 0) { + // Get first record and ignore the rest + NdefRecord record = records[0]; + if (record.getTnf() == NdefRecord.TNF_WELL_KNOWN && Arrays.equals(record.getType(), NdefRecord.RTD_TEXT)) { + /* + * See NFC forum specification for "Text Record Type Definition" at 3.2.1 + * + * http://www.nfc-forum.org/specs/ + * + * bit_7 defines encoding + * bit_6 reserved for future use, must be 0 + * bit_5..0 length of IANA language code + */ + byte[] payload = record.getPayload(); + + // Get the Text Encoding + String textEncoding = ((payload[0] & 128) == 0) ? "UTF-8" : "UTF-16"; + + // Get the Language Code + int languageCodeLength = payload[0] & 0063; + + // String languageCode = new String(payload, 1, languageCodeLength, "US-ASCII"); + // e.g. "en" + + try { + String s = new String(payload, languageCodeLength + 1, payload.length - languageCodeLength - 1, textEncoding); + promise.resolve(s); + return; + } catch (UnsupportedEncodingException e) { + HyperLog.e(TAG, "Error returning ndef data", e); + } + } + else { + HyperLog.d(TAG, "Cannot read NFC Tag Record"); + } + } + promise.resolve(null); + } + + @ReactMethod + public void DEBUG_deleteWallet(Promise promise) { + HyperLog.i(TAG, "DEBUG deleting wallet"); + String filename = getReactApplicationContext().getFilesDir().toString() + "/data/chain/bitcoin/" + BuildConfig.CHAIN + "/wallet.db"; + File file = new File(filename); + promise.resolve(file.delete()); + } + + @ReactMethod + public void DEBUG_deleteDatafolder(Promise promise) { + HyperLog.i(TAG, "DEBUG deleting data folder"); + String filename = getReactApplicationContext().getFilesDir().toString() + "/data/"; + File file = new File(filename); + deleteRecursive(file); + promise.resolve(null); + } + + void deleteRecursive(File fileOrDirectory) { + if (fileOrDirectory.isDirectory()) { + for (File child : fileOrDirectory.listFiles()) { + deleteRecursive(child); + } + } + + HyperLog.d(TAG, "Delete file " + fileOrDirectory.getName() + " : " + fileOrDirectory.delete()); + } + + @ReactMethod + public void DEBUG_listProcesses(Promise promise) { + String processes = ""; + + String packageName = getReactApplicationContext().getPackageName(); + ActivityManager am = (ActivityManager) getCurrentActivity().getSystemService(Context.ACTIVITY_SERVICE); + for (ActivityManager.RunningAppProcessInfo p : am.getRunningAppProcesses()) { + processes += p.processName + "\n"; + } + + promise.resolve(processes); + } + + @ReactMethod + public void checkLndProcessExist(Promise promise) { + String packageName = getReactApplicationContext().getPackageName(); + ActivityManager am = (ActivityManager) getReactApplicationContext().getSystemService(Context.ACTIVITY_SERVICE); + for (ActivityManager.RunningAppProcessInfo p : am.getRunningAppProcesses()) { + if (p.processName.equals(packageName + ":blixtLndMobile")) { + HyperLog.d(TAG, packageName + ":blixtLndMobile pid: " + String.valueOf(p.pid)); + promise.resolve(true); + return; + } + } + promise.resolve(false); + } + + @ReactMethod + public void deleteTLSCerts(Promise promise) { + HyperLog.i(TAG, "Deleting lnd TLS certificates"); + + String tlsKeyFilename = getReactApplicationContext().getFilesDir().toString() + "/tls.key"; + File tlsKeyFile = new File(tlsKeyFilename); + boolean tlsKeyFileDeletion = tlsKeyFile.delete(); + HyperLog.i(TAG, "Delete: " + tlsKeyFilename.toString() + ": " + tlsKeyFileDeletion); + + String tlsCertFilename = getReactApplicationContext().getFilesDir().toString() + "/tls.cert"; + File tlsCertFile = new File(tlsCertFilename); + boolean tlsCertFileDeletion = tlsCertFile.delete(); + HyperLog.i(TAG, "Delete: " + tlsCertFilename.toString() + ": " + tlsCertFileDeletion); + + promise.resolve(tlsKeyFileDeletion && tlsCertFileDeletion); + } + + @ReactMethod + public void restartApp() { + ProcessPhoenix.triggerRebirth(getReactApplicationContext()); + } + + private void checkWriteExternalStoragePermission(@NonNull RequestWriteExternalStoragePermissionCallback successCallback, + @NonNull Runnable failCallback, + @NonNull Runnable failPermissionCheckcallback) { + PermissionsModule permissions = new PermissionsModule(getReactApplicationContext()); + + PromiseWrapper requestPromiseWrapper = new PromiseWrapper() { + @Override + public void onSuccess(@Nullable Object value) { + successCallback.success(value); + } + + @Override + public void onFail(Throwable throwable) { + failCallback.run(); + } + }; + + PromiseWrapper checkPromiseWrapper = new PromiseWrapper() { + @Override + void onSuccess(@Nullable Object value) { + permissions.requestPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, requestPromiseWrapper); + } + + @Override + void onFail(Throwable throwable) { + failPermissionCheckcallback.run(); + } + }; + + permissions.checkPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, checkPromiseWrapper); + } + + private interface RequestWriteExternalStoragePermissionCallback { + void success(@Nullable Object value); + } +} diff --git a/android/app/src/main/java/com/blixtwallet/LndMobileToolsPackage.java b/android/app/src/main/java/com/blixtwallet/LndMobileToolsPackage.java new file mode 100644 index 000000000..17041b54d --- /dev/null +++ b/android/app/src/main/java/com/blixtwallet/LndMobileToolsPackage.java @@ -0,0 +1,22 @@ +package com.blixtwallet; + +import com.facebook.react.ReactPackage; +import com.facebook.react.bridge.NativeModule; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.uimanager.ViewManager; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class LndMobileToolsPackage implements ReactPackage { + @Override + public List createViewManagers(ReactApplicationContext reactContext) { + return Collections.emptyList(); + } + + @Override + public List createNativeModules(ReactApplicationContext reactContext) { + return Arrays.asList(new LndMobileTools(reactContext)); + } +} diff --git a/android/app/src/main/java/com/blixtwallet/MainApplication.java b/android/app/src/main/java/com/blixtwallet/MainApplication.java index 2ab4cede0..61301fa96 100644 --- a/android/app/src/main/java/com/blixtwallet/MainApplication.java +++ b/android/app/src/main/java/com/blixtwallet/MainApplication.java @@ -28,6 +28,7 @@ protected List getPackages() { @SuppressWarnings("UnnecessaryLocalVariable") List packages = new PackageList(this).getPackages(); packages.add(new LndMobilePackage()); + packages.add(new LndMobileToolsPackage()); packages.add(new LndMobileScheduledSyncPackage()); packages.add(new BlixtTorPackage()); packages.add(new RealTimeBlurPackage()); diff --git a/build-ios-framework.md b/build-ios-framework.md new file mode 100644 index 000000000..ca60b50a0 --- /dev/null +++ b/build-ios-framework.md @@ -0,0 +1,7 @@ +Make sure you have installed [Go](https://golang.org) and relevant iOS development tools before proceeding. + +* Get lnd: `go get -d github.com/lightningnetwork/lnd` +* `cd src/github.com/lightningnetwork/lnd/` +* Get and init gomobile: `go get golang.org/x/tools/cmd/goimports`, `go get golang.org/x/tools/go/packages`, `go get golang.org/x/mobile/cmd/gomobile` and `gomobile init` +* Compile with `make ios prefix="1" tags="routerrpc walletrpc signrpc invoicesrpc"` +* Put `mobile/build/ios/Lndmobile.framework` folder to `ios/` diff --git a/contrib/log b/contrib/log index 5291ab37f..ead99acc3 100755 --- a/contrib/log +++ b/contrib/log @@ -1 +1 @@ -adb logcat ReactNative:V ReactNativeJS:V LndMobile:V SoLoader:V LndMobileService:V OnionProxyManagerEventHandler:V BlixtTor:V *oxyManagerEventHandler:V crash_dump64:V DEBUG:V *:S +adb logcat ReactNative:V ReactNativeJS:V LndMobile:V SoLoader:V LndMobileService:V OnionProxyManagerEventHandler:V BlixtWallet:V BlixtTor:V *oxyManagerEventHandler:V crash_dump64:V DEBUG:V *:S diff --git a/index.js b/index.js index 16162ca95..812241f21 100644 --- a/index.js +++ b/index.js @@ -1,3 +1,5 @@ +import "react-native-gesture-handler"; + import ReactNative, { AppRegistry, YellowBox, Platform, UIManager } from "react-native"; import App from "./src/App"; import {name as appName} from "./app.json"; diff --git a/ios/BlixtWallet.xcodeproj/project.pbxproj b/ios/BlixtWallet.xcodeproj/project.pbxproj index 8c61ace8c..f05a74633 100644 --- a/ios/BlixtWallet.xcodeproj/project.pbxproj +++ b/ios/BlixtWallet.xcodeproj/project.pbxproj @@ -21,7 +21,18 @@ B77E06202F5CCA2EF5A26E97 /* libPods-BlixtWallet-BlixtWalletTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 457694BE08363A5757587B12 /* libPods-BlixtWallet-BlixtWalletTests.a */; }; BA12DD7C6C3D42969E297EAE /* IBMPlexSans-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 53E703C0F141473C8564E7EA /* IBMPlexSans-Regular.ttf */; }; C22E6DD819CB41F69AADA37A /* IBMPlexSans-Medium.ttf in Resources */ = {isa = PBXBuildFile; fileRef = D57823EDB09B4CD1998E77F2 /* IBMPlexSans-Medium.ttf */; }; + CC28DA0B25925F8700A2DFA3 /* rpc.pb.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC28DA0A25925F8700A2DFA3 /* rpc.pb.swift */; }; + CC28DA1025925FD500A2DFA3 /* walletunlocker.pb.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC28DA0F25925FD500A2DFA3 /* walletunlocker.pb.swift */; }; + CC3C19202579C662004521F7 /* LndMobile.m in Sources */ = {isa = PBXBuildFile; fileRef = CC6139F12579B66E0077D27B /* LndMobile.m */; }; + CC3ED73F25983106007D29B4 /* LndMobileScheduledSync.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC3ED73E25983106007D29B4 /* LndMobileScheduledSync.swift */; }; + CC3ED74425983118007D29B4 /* LndMobileScheduledSync.m in Sources */ = {isa = PBXBuildFile; fileRef = CC3ED74325983118007D29B4 /* LndMobileScheduledSync.m */; }; + CC3F684925915ACA000F11AA /* LndMobileTools.m in Sources */ = {isa = PBXBuildFile; fileRef = CC3F684825915ACA000F11AA /* LndMobileTools.m */; }; + CC3F684E25915AD7000F11AA /* LndMobileTools.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC3F684D25915AD7000F11AA /* LndMobileTools.swift */; }; + CC3F68532591683B000F11AA /* Lnd.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC3F68522591683B000F11AA /* Lnd.swift */; }; CC4F84C39523CF90E4DA5819 /* libPods-BlixtWallet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 24A62E03C64FF473C7843187 /* libPods-BlixtWallet.a */; }; + CCB51AEA259C2F74002637A2 /* CloudKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CCB51AE9259C2F74002637A2 /* CloudKit.framework */; }; + CCC7384A2599894B00CC7028 /* Lndmobile.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CC3EDCF9259950F2007D29B4 /* Lndmobile.framework */; settings = {ATTRIBUTES = (Required, ); }; }; + CCDBCBB525864296003E8BA8 /* LndMobile.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCDBCBB425864296003E8BA8 /* LndMobile.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -86,7 +97,19 @@ C132F37DCBE159303BCD7902 /* Pods-BlixtWallet-tvOS.debugfakelnd.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BlixtWallet-tvOS.debugfakelnd.xcconfig"; path = "Target Support Files/Pods-BlixtWallet-tvOS/Pods-BlixtWallet-tvOS.debugfakelnd.xcconfig"; sourceTree = ""; }; C410974135376A18E1B2404A /* Pods-BlixtWallet-tvOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BlixtWallet-tvOS.release.xcconfig"; path = "Target Support Files/Pods-BlixtWallet-tvOS/Pods-BlixtWallet-tvOS.release.xcconfig"; sourceTree = ""; }; CAAB4E5D47A9A21CFEB062E7 /* Pods-BlixtWallet.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BlixtWallet.release.xcconfig"; path = "Target Support Files/Pods-BlixtWallet/Pods-BlixtWallet.release.xcconfig"; sourceTree = ""; }; + CC28DA0A25925F8700A2DFA3 /* rpc.pb.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = rpc.pb.swift; sourceTree = ""; }; + CC28DA0F25925FD500A2DFA3 /* walletunlocker.pb.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = walletunlocker.pb.swift; sourceTree = ""; }; + CC3ED73E25983106007D29B4 /* LndMobileScheduledSync.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LndMobileScheduledSync.swift; sourceTree = ""; }; + CC3ED74325983118007D29B4 /* LndMobileScheduledSync.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = LndMobileScheduledSync.m; sourceTree = ""; }; + CC3EDCF9259950F2007D29B4 /* Lndmobile.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Lndmobile.framework; sourceTree = ""; }; + CC3F684825915ACA000F11AA /* LndMobileTools.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = LndMobileTools.m; sourceTree = ""; }; + CC3F684D25915AD7000F11AA /* LndMobileTools.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LndMobileTools.swift; sourceTree = ""; }; + CC3F68522591683B000F11AA /* Lnd.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Lnd.swift; sourceTree = ""; }; + CC6139F12579B66E0077D27B /* LndMobile.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = LndMobile.m; sourceTree = ""; }; CC85FC242576522B00C376A9 /* BlixtWallet.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = BlixtWallet.entitlements; path = BlixtWallet/BlixtWallet.entitlements; sourceTree = ""; }; + CCB51AE9259C2F74002637A2 /* CloudKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CloudKit.framework; path = System/Library/Frameworks/CloudKit.framework; sourceTree = SDKROOT; }; + CCDBCBB325864296003E8BA8 /* BlixtWallet-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "BlixtWallet-Bridging-Header.h"; sourceTree = ""; }; + CCDBCBB425864296003E8BA8 /* LndMobile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LndMobile.swift; sourceTree = ""; }; CFC488B9CB00B9AB0D8FDE59 /* libPods-BlixtWallet-tvOS.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-BlixtWallet-tvOS.a"; sourceTree = BUILT_PRODUCTS_DIR; }; D57823EDB09B4CD1998E77F2 /* IBMPlexSans-Medium.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "IBMPlexSans-Medium.ttf"; path = "../assets/fonts/IBMPlexSans-Medium.ttf"; sourceTree = ""; }; D64B150F528503028AA4B961 /* Pods-BlixtWallet-tvOS.debugtestnet.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BlixtWallet-tvOS.debugtestnet.xcconfig"; path = "Target Support Files/Pods-BlixtWallet-tvOS/Pods-BlixtWallet-tvOS.debugtestnet.xcconfig"; sourceTree = ""; }; @@ -111,7 +134,9 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + CCB51AEA259C2F74002637A2 /* CloudKit.framework in Frameworks */, CC4F84C39523CF90E4DA5819 /* libPods-BlixtWallet.a in Frameworks */, + CCC7384A2599894B00CC7028 /* Lndmobile.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -154,6 +179,7 @@ 13B07FAE1A68108700A75B9A /* BlixtWallet */ = { isa = PBXGroup; children = ( + CCDBC9FB258515DD003E8BA8 /* LndMobile */, CC85FC242576522B00C376A9 /* BlixtWallet.entitlements */, 008F07F21AC5B25A0029DE68 /* main.jsbundle */, 13B07FAF1A68108700A75B9A /* AppDelegate.h */, @@ -169,6 +195,7 @@ 2D16E6871FA4F8E400B85C8A /* Frameworks */ = { isa = PBXGroup; children = ( + CCB51AE9259C2F74002637A2 /* CloudKit.framework */, ED297162215061F000B7C4FE /* JavaScriptCore.framework */, ED2971642150620600B7C4FE /* JavaScriptCore.framework */, 24A62E03C64FF473C7843187 /* libPods-BlixtWallet.a */, @@ -228,6 +255,7 @@ 83CBB9F61A601CBA00E9B192 = { isa = PBXGroup; children = ( + CC3EDCF9259950F2007D29B4 /* Lndmobile.framework */, 13B07FAE1A68108700A75B9A /* BlixtWallet */, 832341AE1AAA6A7D00B99B32 /* Libraries */, 00E356EF1AD99517003FC87E /* BlixtWalletTests */, @@ -261,6 +289,23 @@ name = Resources; sourceTree = ""; }; + CCDBC9FB258515DD003E8BA8 /* LndMobile */ = { + isa = PBXGroup; + children = ( + CC28DA0F25925FD500A2DFA3 /* walletunlocker.pb.swift */, + CC28DA0A25925F8700A2DFA3 /* rpc.pb.swift */, + CC6139F12579B66E0077D27B /* LndMobile.m */, + CC3F684825915ACA000F11AA /* LndMobileTools.m */, + CCDBCBB425864296003E8BA8 /* LndMobile.swift */, + CCDBCBB325864296003E8BA8 /* BlixtWallet-Bridging-Header.h */, + CC3F684D25915AD7000F11AA /* LndMobileTools.swift */, + CC3F68522591683B000F11AA /* Lnd.swift */, + CC3ED73E25983106007D29B4 /* LndMobileScheduledSync.swift */, + CC3ED74325983118007D29B4 /* LndMobileScheduledSync.m */, + ); + path = LndMobile; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -358,7 +403,7 @@ }; 13B07F861A680F5B00A75B9A = { DevelopmentTeam = AT26Z24V2Q; - LastSwiftMigration = 1120; + LastSwiftMigration = 1230; }; 2D02E47A1E0B4A5D006451C7 = { CreatedOnToolsVersion = 8.2.1; @@ -508,7 +553,6 @@ ); inputPaths = ( "${PODS_ROOT}/Target Support Files/Pods-BlixtWallet/Pods-BlixtWallet-resources.sh", - "${PODS_ROOT}/GoogleSignIn/Resources/GoogleSignIn.bundle", "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/AntDesign.ttf", "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Entypo.ttf", "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/EvilIcons.ttf", @@ -529,7 +573,6 @@ ); name = "[CP] Copy Pods Resources"; outputPaths = ( - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleSignIn.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AntDesign.ttf", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Entypo.ttf", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EvilIcons.ttf", @@ -560,7 +603,6 @@ ); inputPaths = ( "${PODS_ROOT}/Target Support Files/Pods-BlixtWallet-BlixtWalletTests/Pods-BlixtWallet-BlixtWalletTests-resources.sh", - "${PODS_ROOT}/GoogleSignIn/Resources/GoogleSignIn.bundle", "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/AntDesign.ttf", "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Entypo.ttf", "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/EvilIcons.ttf", @@ -581,7 +623,6 @@ ); name = "[CP] Copy Pods Resources"; outputPaths = ( - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleSignIn.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AntDesign.ttf", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Entypo.ttf", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EvilIcons.ttf", @@ -702,7 +743,16 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + CC3F684E25915AD7000F11AA /* LndMobileTools.swift in Sources */, + CC3F68532591683B000F11AA /* Lnd.swift in Sources */, + CC3ED74425983118007D29B4 /* LndMobileScheduledSync.m in Sources */, + CC3ED73F25983106007D29B4 /* LndMobileScheduledSync.swift in Sources */, + CCDBCBB525864296003E8BA8 /* LndMobile.swift in Sources */, + CC3C19202579C662004521F7 /* LndMobile.m in Sources */, + CC28DA0B25925F8700A2DFA3 /* rpc.pb.swift in Sources */, + CC28DA1025925FD500A2DFA3 /* walletunlocker.pb.swift in Sources */, 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */, + CC3F684925915ACA000F11AA /* LndMobileTools.m in Sources */, 13B07FC11A68108700A75B9A /* main.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -744,6 +794,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 7FB0EDCFC05DD4E258EB4698 /* Pods-BlixtWallet-BlixtWalletTests.debug.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; BUNDLE_LOADER = "$(TEST_HOST)"; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", @@ -767,6 +818,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 6F21675F737F23140EE8373E /* Pods-BlixtWallet-BlixtWalletTests.release.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; BUNDLE_LOADER = "$(TEST_HOST)"; COPY_PHASE_STRIP = NO; INFOPLIST_FILE = BlixtWalletTests/Info.plist; @@ -791,22 +843,31 @@ CHAIN = mainnet; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = BlixtWallet/BlixtWallet.entitlements; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 7; DEBUG = true; DEVELOPMENT_TEAM = AT26Z24V2Q; - ENABLE_BITCODE = NO; + EXCLUDED_ARCHS = "i386 x86_64"; FLAVOR = ""; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/LndMobile", + "$(PROJECT_DIR)", + ); INFOPLIST_FILE = BlixtWallet/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MARKETING_VERSION = 0.1; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", "-lc++", ); - PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.Blixt-Wallet-Debug2"; + PRODUCT_BUNDLE_IDENTIFIER = com.blixtwallet.debug; PRODUCT_NAME = "Blixt Wallet Debug"; + SWIFT_OBJC_BRIDGING_HEADER = "LndMobile/BlixtWallet-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; + VALIDATE_WORKSPACE = YES; VERSIONING_SYSTEM = "apple-generic"; }; name = Debug; @@ -819,20 +880,30 @@ CHAIN = mainnet; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = BlixtWallet/BlixtWallet.entitlements; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 7; DEBUG = false; DEVELOPMENT_TEAM = AT26Z24V2Q; + EXCLUDED_ARCHS = "i386 x86_64"; FLAVOR = ""; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/LndMobile", + "$(PROJECT_DIR)", + ); INFOPLIST_FILE = BlixtWallet/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MARKETING_VERSION = 0.1; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", "-lc++", ); - PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.Blixt-Wallet"; + PRODUCT_BUNDLE_IDENTIFIER = com.blixtwallet; PRODUCT_NAME = "Blixt Wallet"; + SWIFT_OBJC_BRIDGING_HEADER = "LndMobile/BlixtWallet-Bridging-Header.h"; SWIFT_VERSION = 5.0; + VALIDATE_WORKSPACE = YES; VERSIONING_SYSTEM = "apple-generic"; }; name = Release; @@ -979,6 +1050,7 @@ COPY_PHASE_STRIP = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + EXCLUDED_ARCHS = "i386 x86_64"; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -994,7 +1066,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)"; LIBRARY_SEARCH_PATHS = ( "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", @@ -1036,9 +1108,10 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = YES; + COPY_PHASE_STRIP = NO; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + EXCLUDED_ARCHS = "i386 x86_64"; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -1047,7 +1120,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)"; LIBRARY_SEARCH_PATHS = ( "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", @@ -1055,6 +1128,7 @@ "\"$(inherited)\"", ); MTL_ENABLE_DEBUG_INFO = NO; + ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; }; @@ -1092,6 +1166,7 @@ COPY_PHASE_STRIP = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + EXCLUDED_ARCHS = "i386 x86_64"; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -1107,7 +1182,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)"; LIBRARY_SEARCH_PATHS = ( "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", @@ -1125,25 +1200,34 @@ baseConfigurationReference = 51FEA3B5F5E91ADECAF81AF4 /* Pods-BlixtWallet.debugtestnet.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CHAIN = regtest; + CHAIN = testnet; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = BlixtWallet/BlixtWallet.entitlements; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 7; DEBUG = true; DEVELOPMENT_TEAM = AT26Z24V2Q; - ENABLE_BITCODE = NO; + EXCLUDED_ARCHS = "i386 x86_64"; FLAVOR = ""; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/LndMobile", + "$(PROJECT_DIR)", + ); INFOPLIST_FILE = BlixtWallet/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MARKETING_VERSION = 0.1; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", "-lc++", ); - PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_BUNDLE_IDENTIFIER = com.blixtwallet.testnet.debug; PRODUCT_NAME = "Blixt Wallet Testnet Debug"; + SWIFT_OBJC_BRIDGING_HEADER = "LndMobile/BlixtWallet-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; + VALIDATE_WORKSPACE = YES; VERSIONING_SYSTEM = "apple-generic"; }; name = DebugTestnet; @@ -1152,6 +1236,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = DC5C60C16BB07650A497820A /* Pods-BlixtWallet-BlixtWalletTests.debugtestnet.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; BUNDLE_LOADER = "$(TEST_HOST)"; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", @@ -1255,9 +1340,10 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = YES; + COPY_PHASE_STRIP = NO; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + EXCLUDED_ARCHS = "i386 x86_64"; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -1266,7 +1352,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)"; LIBRARY_SEARCH_PATHS = ( "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", @@ -1274,6 +1360,7 @@ "\"$(inherited)\"", ); MTL_ENABLE_DEBUG_INFO = NO; + ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; }; @@ -1287,20 +1374,30 @@ CHAIN = testnet; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = BlixtWallet/BlixtWallet.entitlements; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 7; DEBUG = false; DEVELOPMENT_TEAM = AT26Z24V2Q; + EXCLUDED_ARCHS = "i386 x86_64"; FLAVOR = ""; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/LndMobile", + "$(PROJECT_DIR)", + ); INFOPLIST_FILE = BlixtWallet/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MARKETING_VERSION = 0.1; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", "-lc++", ); - PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.Blixt-Wallet-Regtest"; + PRODUCT_BUNDLE_IDENTIFIER = com.blixtwallet.regtest; PRODUCT_NAME = "Blixt Wallet Testnet"; + SWIFT_OBJC_BRIDGING_HEADER = "LndMobile/BlixtWallet-Bridging-Header.h"; SWIFT_VERSION = 5.0; + VALIDATE_WORKSPACE = YES; VERSIONING_SYSTEM = "apple-generic"; }; name = ReleaseTestnet; @@ -1309,6 +1406,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 7F8DF590825EC1BAC7E0ABE5 /* Pods-BlixtWallet-BlixtWalletTests.releasetestnet.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; BUNDLE_LOADER = "$(TEST_HOST)"; COPY_PHASE_STRIP = NO; INFOPLIST_FILE = BlixtWalletTests/Info.plist; @@ -1412,6 +1510,7 @@ COPY_PHASE_STRIP = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + EXCLUDED_ARCHS = "i386 x86_64"; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -1427,7 +1526,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)"; LIBRARY_SEARCH_PATHS = ( "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", @@ -1445,25 +1544,34 @@ baseConfigurationReference = 1D85700D17488384A1AE7C09 /* Pods-BlixtWallet.debugregtest.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CHAIN = mainnet; + CHAIN = regtest; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = BlixtWallet/BlixtWallet.entitlements; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 7; DEBUG = true; DEVELOPMENT_TEAM = AT26Z24V2Q; - ENABLE_BITCODE = NO; - FLAVOR = fakelnd; + EXCLUDED_ARCHS = "i386 x86_64"; + FLAVOR = ""; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/LndMobile", + "$(PROJECT_DIR)", + ); INFOPLIST_FILE = BlixtWallet/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MARKETING_VERSION = 0.1; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", "-lc++", ); - PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.Blixt-Wallet-Regtest-Debug"; + PRODUCT_BUNDLE_IDENTIFIER = com.blixtwallet.regtest.debug; PRODUCT_NAME = "Blixt Wallet Regtest Debug"; + SWIFT_OBJC_BRIDGING_HEADER = "LndMobile/BlixtWallet-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; + VALIDATE_WORKSPACE = YES; VERSIONING_SYSTEM = "apple-generic"; }; name = DebugRegtest; @@ -1472,6 +1580,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 542C9ECE0553F656BFC79606 /* Pods-BlixtWallet-BlixtWalletTests.debugregtest.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; BUNDLE_LOADER = "$(TEST_HOST)"; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", @@ -1575,9 +1684,10 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = YES; + COPY_PHASE_STRIP = NO; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + EXCLUDED_ARCHS = "i386 x86_64"; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -1586,7 +1696,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)"; LIBRARY_SEARCH_PATHS = ( "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", @@ -1594,6 +1704,7 @@ "\"$(inherited)\"", ); MTL_ENABLE_DEBUG_INFO = NO; + ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; }; @@ -1607,20 +1718,30 @@ CHAIN = regtest; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = BlixtWallet/BlixtWallet.entitlements; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 7; DEBUG = false; DEVELOPMENT_TEAM = AT26Z24V2Q; - FLAVOR = fakelnd; + EXCLUDED_ARCHS = "i386 x86_64"; + FLAVOR = ""; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/LndMobile", + "$(PROJECT_DIR)", + ); INFOPLIST_FILE = BlixtWallet/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MARKETING_VERSION = 0.1; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", "-lc++", ); - PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.Blixt-Wallet-Fakelnd"; + PRODUCT_BUNDLE_IDENTIFIER = com.blixtwallet.regtest; PRODUCT_NAME = "Blixt Wallet Regtest"; + SWIFT_OBJC_BRIDGING_HEADER = "LndMobile/BlixtWallet-Bridging-Header.h"; SWIFT_VERSION = 5.0; + VALIDATE_WORKSPACE = YES; VERSIONING_SYSTEM = "apple-generic"; }; name = ReleaseRegtest; @@ -1629,6 +1750,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = EA2D85B8E85EE977BE93539A /* Pods-BlixtWallet-BlixtWalletTests.releaseregtest.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; BUNDLE_LOADER = "$(TEST_HOST)"; COPY_PHASE_STRIP = NO; INFOPLIST_FILE = BlixtWalletTests/Info.plist; @@ -1732,6 +1854,7 @@ COPY_PHASE_STRIP = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + EXCLUDED_ARCHS = "i386 x86_64"; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -1747,7 +1870,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)"; LIBRARY_SEARCH_PATHS = ( "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", @@ -1768,22 +1891,31 @@ CHAIN = mainnet; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = BlixtWallet/BlixtWallet.entitlements; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 7; DEBUG = true; DEVELOPMENT_TEAM = AT26Z24V2Q; - ENABLE_BITCODE = NO; + EXCLUDED_ARCHS = "i386 x86_64"; FLAVOR = fakelnd; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/LndMobile", + "$(PROJECT_DIR)", + ); INFOPLIST_FILE = BlixtWallet/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MARKETING_VERSION = 0.1; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", "-lc++", ); - PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.Blixt-Wallet-Fakelnd-Debug"; + PRODUCT_BUNDLE_IDENTIFIER = com.blixtwallet.mainnet.fakelnd.debug; PRODUCT_NAME = "Blixt Wallet Fakelnd Debug"; + SWIFT_OBJC_BRIDGING_HEADER = "LndMobile/BlixtWallet-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; + VALIDATE_WORKSPACE = YES; VERSIONING_SYSTEM = "apple-generic"; }; name = DebugFakelnd; @@ -1792,6 +1924,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 1575F4AEEE77591610698556 /* Pods-BlixtWallet-BlixtWalletTests.debugfakelnd.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; BUNDLE_LOADER = "$(TEST_HOST)"; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", @@ -1895,9 +2028,10 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = YES; + COPY_PHASE_STRIP = NO; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + EXCLUDED_ARCHS = "i386 x86_64"; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -1906,7 +2040,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)"; LIBRARY_SEARCH_PATHS = ( "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", @@ -1914,6 +2048,7 @@ "\"$(inherited)\"", ); MTL_ENABLE_DEBUG_INFO = NO; + ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; }; @@ -1927,20 +2062,30 @@ CHAIN = mainnet; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = BlixtWallet/BlixtWallet.entitlements; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 7; DEBUG = false; DEVELOPMENT_TEAM = AT26Z24V2Q; + EXCLUDED_ARCHS = "i386 x86_64"; FLAVOR = fakelnd; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/LndMobile", + "$(PROJECT_DIR)", + ); INFOPLIST_FILE = BlixtWallet/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MARKETING_VERSION = 0.1; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", "-lc++", ); - PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.Blixt-Wallet-Fakelnd"; + PRODUCT_BUNDLE_IDENTIFIER = com.blixtwallet.mainnet.fakelnd; PRODUCT_NAME = "Blixt Wallet Fakelnd"; + SWIFT_OBJC_BRIDGING_HEADER = "LndMobile/BlixtWallet-Bridging-Header.h"; SWIFT_VERSION = 5.0; + VALIDATE_WORKSPACE = YES; VERSIONING_SYSTEM = "apple-generic"; }; name = ReleaseFakelnd; @@ -1949,6 +2094,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 1BF9C37DDFECED4FEB42102D /* Pods-BlixtWallet-BlixtWalletTests.releasefakelnd.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; BUNDLE_LOADER = "$(TEST_HOST)"; COPY_PHASE_STRIP = NO; INFOPLIST_FILE = BlixtWalletTests/Info.plist; diff --git a/ios/BlixtWallet.xcodeproj/xcshareddata/xcschemes/BlixtWallet.xcscheme b/ios/BlixtWallet.xcodeproj/xcshareddata/xcschemes/BlixtWallet.xcscheme index 9f7a8e0d7..aa305b565 100644 --- a/ios/BlixtWallet.xcodeproj/xcshareddata/xcschemes/BlixtWallet.xcscheme +++ b/ios/BlixtWallet.xcodeproj/xcshareddata/xcschemes/BlixtWallet.xcscheme @@ -47,7 +47,7 @@ launchStyle = "0" useCustomWorkingDirectory = "NO" ignoresPersistentStateOnLaunch = "NO" - debugDocumentVersioning = "YES" + debugDocumentVersioning = "NO" debugServiceExtension = "internal" allowLocationSimulation = "YES"> #import #import +#import #ifdef FB_SONARKIT_ENABLED #import @@ -29,6 +30,13 @@ static void InitializeFlipper(UIApplication *application) { @implementation AppDelegate +- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url + sourceApplication:(NSString *)sourceApplication annotation:(id)annotation +{ + return [RCTLinkingManager application:application openURL:url + sourceApplication:sourceApplication annotation:annotation]; +} + - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { #ifdef FB_SONARKIT_ENABLED diff --git a/ios/BlixtWallet/BlixtWallet.entitlements b/ios/BlixtWallet/BlixtWallet.entitlements index 903def2af..f1cddf78f 100644 --- a/ios/BlixtWallet/BlixtWallet.entitlements +++ b/ios/BlixtWallet/BlixtWallet.entitlements @@ -4,5 +4,11 @@ aps-environment development + com.apple.developer.icloud-container-identifiers + + com.apple.developer.icloud-services + + com.apple.developer.ubiquity-kvstore-identifier + $(TeamIdentifierPrefix)$(CFBundleIdentifier) diff --git a/ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/Contents.json b/ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/Contents.json index 8df2a7a12..871a6d703 100644 --- a/ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/Contents.json @@ -1,55 +1,109 @@ { "images" : [ { - "filename" : "blixt-wallet-60-20@2x.png", + "filename" : "blixt-wallet-70-20@2x.png", "idiom" : "iphone", "scale" : "2x", "size" : "20x20" }, { - "filename" : "blixt-wallet-60-20@3x.png", + "filename" : "blixt-wallet-70-20@3x.png", "idiom" : "iphone", "scale" : "3x", "size" : "20x20" }, { - "filename" : "blixt-wallet-60-29@2x.png", + "filename" : "blixt-wallet-70-29@2x.png", "idiom" : "iphone", "scale" : "2x", "size" : "29x29" }, { - "filename" : "blixt-wallet-60-29@3x.png", + "filename" : "blixt-wallet-70-29@3x.png", "idiom" : "iphone", "scale" : "3x", "size" : "29x29" }, { - "filename" : "blixt-wallet-60-40@2x.png", + "filename" : "blixt-wallet-70-40@2x.png", "idiom" : "iphone", "scale" : "2x", "size" : "40x40" }, { - "filename" : "blixt-wallet-60-40@3x.png", + "filename" : "blixt-wallet-70-40@3x.png", "idiom" : "iphone", "scale" : "3x", "size" : "40x40" }, { - "filename" : "blixt-wallet-60-60@2x.png", + "filename" : "blixt-wallet-70-60@2x.png", "idiom" : "iphone", "scale" : "2x", "size" : "60x60" }, { - "filename" : "blixt-wallet-60-60@3x.png", + "filename" : "blixt-wallet-70-60@3x.png", "idiom" : "iphone", "scale" : "3x", "size" : "60x60" }, { - "filename" : "blixt-wallet-60-1024.png", + "filename" : "blixt-wallet-70-20.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "20x20" + }, + { + "filename" : "blixt-wallet-70-20@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "20x20" + }, + { + "filename" : "blixt-wallet-70-29.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "29x29" + }, + { + "filename" : "blixt-wallet-70-29@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "29x29" + }, + { + "filename" : "blixt-wallet-70-40.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "40x40" + }, + { + "filename" : "blixt-wallet-70-40@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "40x40" + }, + { + "filename" : "blixt-wallet-70-76.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" + }, + { + "filename" : "blixt-wallet-70-76@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" + }, + { + "filename" : "blixt-wallet-70-83.5@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "filename" : "blixt-wallet-70-1024.png", "idiom" : "ios-marketing", "scale" : "1x", "size" : "1024x1024" diff --git a/ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-60-1024.png b/ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-60-1024.png deleted file mode 100644 index 604c2512dd9a5b1d4e4b6d422b9c88d06efa86e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 218620 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

tn26DA_&mLAotS#mI8iPOJXzW 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%0D1N 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 z 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 VFN_17suA$d&eqYU>ZsSf{{n}WdoTb1 diff --git a/ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-60-20@2x.png b/ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-60-20@2x.png deleted file mode 100644 index db6e6ef5edd4337c1ab9053aae8b0997895afad2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2264 zcmV;}2q*W6P)BE1ZQLxAY_vg;$?V;oX(lt{{G@3qJ`_O^!KmPq;Qw2}Cn0L9?Tam?khm;cmfj@-EE=vY<#k5o0f^m&*sM6pBI0EL{uRZtU4R5Z z`^X8`V)zNfJ8YaF;u6EP09P2E5Ad?jnUOMxUqvh^s*L``+lU9}BlcPZ2XpY-jyyG} zttleQMaed+noc9ry@UIIwng1*#M^^UkFzj+6yF25_LnMhmf?pGpH<}CbcnAmX|u%; z|7E#p3GpKUUAw%6atiT2#A8)^yd3Cssj4^8z$>TJnP(8+gLrkpJj%xIMEtceUz`ec zeo~wa<_{hK;NmJRuzL3+9o0iVC08s$)vACv7|KExH6jmbd4gn8^0FkllzkRT6fd|P0n zrwSVAXrbt(XrcJk;OyVRDf#{Yw^VBW$m{6QFhZvPBk<6w!tZERBfJcLd1$M3&)TehHS09YRtkN(Z(GDi^F2;vKBX;HY+Q*UEnTqUvgh@A9J5aYSek}G;8j! zqp=F+X_rylpF&#LEj%b>g+0Q~5^H*5N-?MwSLAe5T{?GXqX;9WfX;*4pXw6&V*io?m|<6;W0GAb4f<-njQ>$>Q>9MPr@ zwU=n+0I+*9IKpp9{{0u*d8K7@p9VPmCp-6AwmA>rtOL;dXv;Q$XXCx^0IWWyc=l3w zC&Xgk0yx!!!@*Zi8qcdA>-AfBZYACT*nGWS|NH%Vee(m<-vGFv{{#Oecnig2*2@3@ z061k>NoGw=04e|g00;m9hiL!=000010000Q0000000N)_00aO40096104SgX00aO4 z0096104M+e003DoM3w*m1VKqeK~z`?%~wln6hRQKd2BYb8xuthVpP;5=)uRulOPIS zy(x$<1doCz@#;+lJ$d(_peOO@FVKS`Ld1ih(I6tC_()un&1QF|{i=Iwx3g|0GrJ>9 zvzh9tuCDp|tFG#fQ+d8$5#g7|<`DU$B0xhgj}5%}N|TpU20@xnOkj>%lfnEV1i<`; zmuW+injLmvI-X|n7D)&ml~D#b`tq9klEJmu?{jdCQDURCokAaL;G%0?aN~d|IC2BQjhGl{R;Pe zoFtrG$XKv7wD$%ww@iyO_nPeW6WjJ&rT}%Ytq{~nC1+}R&lM_cI7ro*yV!fo-k?d4 zq)uY&6r$8~p;loPd+r1UJ1$VP^pmRZ?x3_Z01ow!!|yowdFZ<_5LO#fd>>59AU+<| z$X~l3p}h(qE?&P=Ve~K+=nz0IlB)mFx^UqW@cux;U@N#juohCYn?6ZYgWSQ*G<@JT zit-4l#=PE##j#@)R;Cf=cL4Vbi>Q-3u%6tZaq@;IQ5!!|{o7M42tZS`)JGk&;jI~` z>WBN(`27}Oe&}$z1MA2uZ`EVPO-IQsZ6r=QSIAvL^kNDc((v@&Edv$a$ltASaOrGcHhMwM5c;^ zs7j^D3)rWlwDA5uElfWk#JU;YfBlL-k!`=mWor-GahASFo+QoINna%4HshAIP%wT5 zA$>`esq6R(nAQf$2smolTm6-EJ=Z}2Y)ifamL|>uL4-5;GU_8T+#Ohs$exg(kJ}8e z3%??HqVz@DI&sWn(wMzqjDqdQ0qzRbXQx3PLTmeHTk&U0@gX!?V>WfWV zr*O6R%G>ohT$#Fsu=07VCt35__ST>^-kPvX*UDm^-g5)n{_swke{&Z{9oNTnr$yX% zI~a^JjTv(a$lBMWmgWpNn~a!gNrp_4B(aRO32|cl1~}Bi)R&Jq$Jm3}`IBUb`(WBJ zY@KXZoEE_9_U6Aj&g#y_`^eVIzG_y0W#+c7bB_JalWf1@ll8U_en-QdqgiHbLo;Tc z-Sn&JI>$TT*>gf2Z@+A^*j`k|{pDHQh30P5$6`q8qnn*Lw#J%C!Wy)M)Ena!o=JUl mvlExrm=1CKA|w|1k$(aF8BG0;1u3oo0000BE1ZQLxAY_vg;$?V;oX(lt{{G@3qJ`_O^!KmPq;Qw2}Cn0L9?Tam?khm;cmfj@-EE=vY<#k5o0f^m&*sM6pBI0EL{uRZtU4R5Z z`^X8`V)zNfJ8YaF;u6EP09P2E5Ad?jnUOMxUqvh^s*L``+lU9}BlcPZ2XpY-jyyG} zttleQMaed+noc9ry@UIIwng1*#M^^UkFzj+6yF25_LnMhmf?pGpH<}CbcnAmX|u%; z|7E#p3GpKUUAw%6atiT2#A8)^yd3Cssj4^8z$>TJnP(8+gLrkpJj%xIMEtceUz`ec zeo~wa<_{hK;NmJRuzL3+9o0iVC08s$)vACv7|KExH6jmbd4gn8^0FkllzkRT6fd|P0n zrwSVAXrbt(XrcJk;OyVRDf#{Yw^VBW$m{6QFhZvPBk<6w!tZERBfJcLd1$M3&)TehHS09YRtkN(Z(GDi^F2;vKBX;HY+Q*UEnTqUvgh@A9J5aYSek}G;8j! zqp=F+X_rylpF&#LEj%b>g+0Q~5^H*5N-?MwSLAe5T{?GXqX;9WfX;*4pXw6&V*io?m|<6;W0GAb4f<-njQ>$>Q>9MPr@ zwU=n+0I+*9IKpp9{{0u*d8K7@p9VPmCp-6AwmA>rtOL;dXv;Q$XXCx^0IWWyc=l3w zC&Xgk0yx!!!@*Zi8qcdA>-AfBZYACT*nGWS|NH%Vee(m<-vGFv{{#Oecnig2*2@3@ z061k>NoGw=04e|g00;m9hiL!=000010000Q0000000N)_00aO40096106d@r00aO4 z0096106YKy005{L%Vq!o2qH;DK~!i3-CA30R7Dv6x4Wg?ZKco5fEdd2}U1G zd@~qgcr@`6eDW285n|Lt;ej`OHz68LOiVNw!mEi1+7NGmx5_O@DF)K}cDK9d`2BOv ze>!J&=5){YbfJ#v&iw!X&3~DHu19hcKkV{R$XasX>LQcYJDIX1I!VSlb-CU)Wj305 zQY?KtoWXJ@Jy;tpifyu_zDY7uR~oGDkEti53*^eK**RmH_uT-kG>?N*iNjIlr81 zJ!`C~PsYvUo3!A#Hf2Ji?$B{j+lb#8EO*EnYw8oHOuk7AF3BhKQBykID%LeGzIMU) z!Xc5gOAIvtVa4tc3id8#d`ASrXRX&-d$;?|G2C@>Q6vvx2bL@gj};m=1gU?$Ta` z3U}{Da+gqjVh~B|oQ-DzTbN5cLikg!h_Ed@S3Msr_w{C|qqvT`?%PMTku$KL4}37~ z&Bu4GqQOy!=3 z-lC4Kd#Q5m1g3Hq1xMq8m}^jK*|ZuknKAr&8Pj+Vb@%V5iC+(rUz@@jMt0j+3UkgF z2FNKgAIH2Z<@+9{p6&0dO{zL{GRW?HbT-r1@V~hX&p9e{SjLf)EA&zC&ZF3jms9!o zW7xOGv385@wL6E(RASA41guf1v@{F$VWLjG+YVFVuARv41*!~vgJ(-ucrrArCmWpm z95ydIY|qBC@ns3{Sk|YhxN$#qt$l%!RK9ea{K^PUq9UnF5;JAYUHTcL>l9l0F>Mx$ zE@ru>v`v|f$A(OPNc-M2Em`?Am9`#G?$oEQQ01Sm!|b~IDX>y1QO<=8dc=NBpF$N2 zH>JHA1uir;~j~zn>^)E=F8CXTQfHue|QM$hA3eU|FwAq)nBM_}sM zVjUS?#WJ1JJ~G>R&*QZ8(Id0L;z;tUx9|kKjw9(Z)h7O?`uHH)7pXoqguq8tKq~v) ztEg-BGnDV$fJ@3|jC+nI&mKj*lW6OM*Lq4a+_dnqH{YYOTe)@$K_P477m&eAt9)Io5;TgD^3d^cr(IVc*)8qBONn0f28rB-v^z? z25#tzP^~vI&9K`Iaa`&E$(vkh!(QC6wQ)dMv|%TQcXE z66-oo_|5Q4EbGgun^v)ZFLf^8fm_xfjSU<^QZdE(p50J_KC^70r4|X(Ty(!0d6r#T zKtcE5cRoB7Vl;GoP2}UIXX|U~ydF7y05`5-Y|8kUCsSEBt=gu2p{3S4xOqGjZJE-# z3%qu_*FA?T=q?)l{vcI{2e5A2^QnjZuuN%vw6bsWanrlwbzCeyqsc!%4X%>T%w}z$ z7Y&Eaxz_6>J87_@C+x$oq+!P4Gd_*}G+3pZKg4rGj7rTsN67)h zFsU7|7+YbHMc$da);>!kr{BaYsf=~Yj{>8J4^kWA7%3R3W5Py){YbrrMYq(AY8yEU zi;G3)nkVoP?*#7EzlBq|5xbBa_9Jz`EjxtIvflJ9JoE=Me-xzgNd=rHTQ23YoLq7~ zj%G&izeQ2z#5$FNE=sfEhmeJ51u<=-KTVR(RuNI)FM_`6AxcAB@Ncpm!@w< z*w~cTr-*sZO8jh>OIj@VarHH2CLQ%dL)wgK#i!Vm)|KgP-2rZM(dByEl+8t_>6-;M z7BD;ae=pg5-Cjhaq|RYkkG9$!3m)?LPw$fk%hOZVpxIAkQj6TAh0nFf%vvx3pI=M( zQpyCEs1BnLI*^*bfmHtGUn|(8J|dG^tedp(xfYqrCr*%k4NFg5o2$K0SeLzK_z6DQ r&*5g2E=o-J0U%*O7G+p&r+xYl#rTtm-27xw00000NkvXXu0mjfa`8&0 diff --git a/ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-60-29@2x.png b/ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-60-29@2x.png deleted file mode 100644 index fbd57296dfde2e81b929342f8a3150f2414f1dcf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3421 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 diff --git a/ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-60-29@3x.png b/ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-60-29@3x.png deleted file mode 100644 index 2da19d5e5a5aef7c6c423a4026da6d85e5193e14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5866 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 diff --git a/ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-60-40@2x.png b/ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-60-40@2x.png deleted file mode 100644 index 986d4d51b844da8750747ef0f261afaaf3b96cc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4611 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 diff --git a/ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-60-40@3x.png b/ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-60-40@3x.png deleted file mode 100644 index 5662094074631606e5a5486f1e789a7d81fa3424..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8708 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 Ef~*Z<`~Uy| diff --git a/ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-70-1024.png b/ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-70-1024.png new file mode 100644 index 0000000000000000000000000000000000000000..594693710ba601e9c716f52883085ce8c4fab704 GIT binary patch literal 220531 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

tn26DA_&mLAotS#mI8iPOJXzW zyD4(e>v7B*|}izEE9U5>gc+~wACC$?s&VqNvRK)&x9$XE$pE+b;Y=?G;|Qw`QP7YPiAnC&)f#7%*k zJUP7#fg@w*Nf@XVTCzd05uYBP#HY@49c>^+_|N5RKR&;n_lJ9*?hak|KwKw2L4W-Z zc^};bT^lc?Ch{5nlYiL%2wCVFo)_@w57!?1U!pR241{qC1it~|K*uBRmA0+x{`?bO zR~&n(%mcy~UA@r(sStJLq%^cQfP`A1GB8&|jSkSy%@fG4xMg5qBdb|vYyAFK@DYKX z*q@~mCwidIa#Y;1G57+OMl1}x01X~Qj=#YlJN9fPG;GF9h(M2=hS>KgZ|+e(dH*Q< z7c}Y+75>kl8|XkHylW^(Hzm|7q(z|IvPWp%+y0pQ2lBWWG1ARQ+BYyzxS7{94G{i9T$*`aR3^ad8qPgZV zSIp)?mi6jn1oL-#Ht5{hd^ISHg~SR38`X;sg&KcsD9c&x3JFs%bI-KL$mkn3YLne8 zus*#N{K320T+JV}J=Mdhw|V){K$Z4>=j+WcoWHk>(V=VzADuNwJKE%x(X|e$4;RXF zNQn(9y6xVjo7_(xUHum!aBBUc1u0c`51X%fAFUih#oWIL5nOOb0lcY;1q4k(%ac@Df15jY zp9DN){>xi-%`=|(|BDcMu#hPN+hr)RTQbv4M$13_WIO+zundRkW*%KtI`C!M7t?MG zom4URu{YxkA?rh87HG^6Z*(1U<>*&91p(U#_d&dPtAdK@D!GX~N`G>O2*miU zAEaQ`9j^N3>-Auhun^$8_2*6rRess!pAo)meo81XRB&$tgt|2@T-aS-I=*LAAYXsd z5_Q@}E{z!E`#PvN^`+2-s!cafF(+b<%I-xOnzVR_8ZSWlm&0?-p+uQWe8n%wHfoF8 z_Q0|=CnSRwU3qQ10(ZaL_H0lF?bERoj6bQ${{2a z*A4tb87CR+qrF%;1gv(LCzD>EfpT}|_?NWu^X^?|EY%I?ulSzDa9nwp_@l}Q?MR9z zz#Jz$c^jmv8wGc|*QB2^0U9RzcSXXs+&{5*+j{INzDJYW^&P>+B^WPCm~wCre`&CW z0#h@vUm7pHhf?1Z>@IRj3Xe0fGc9ii9~J-Ldu3$Dz z{of7TAYwrirqxj+&>$`tC!r;~&kfZr+92+@=~?=pY*{A(%E>pTwlGRau<}$!xWtp`;qnIS`4QAARDu8T>aNJb)VfAbwuW(Si5K2zGyC{tuV{DEmQv*g*-ZS2@j|K;xMD>_Kt3dtP||1h z>&JagpGIy#s8vPF#pYX#jkg&azc(OkqT)~VW*!AcNMvM=i7k44hLQ$=rUOPo?sdBy zko!p6!Id^yT}Z*2U+EW-Dlx#XVw=lR&F_ z=RDQeiQUcBMqSgK5K9Zf-0m;F=~kEo`wsUTbGze1)2``}kX?udlP+wWeoIU;Ff2>i z6Rsc>T3fe&Quw~QxM)0XBx!#Gkx+bxEl*(xg;omm*uXQJD`m`PTTZ<}=)$3cS@gB0 zTSQFiVEr|epFwX46w+?*!#;glEAFVE#!n6R;FSbiZ-2Ek`uGOmK;pA~!X4BnA)wO# zp13h{nzTD8iET=Iu#8}k5rm0Ls6+VzmaNOat-4Kqy4yKDqY=-|(q^4$!J^3M6beI= z>RVyfoFMR^D!=hKEBRo)`U8I_dF5#CC@}i09}vz2#0mO z>0Og06|1z3`-)|GFGD(`=!awFXI_a-8xv3a0&8lJJ)zPxxUYjrn9LM4yHfPL7qOB| z)MIQ4LeahI`TTL?+`ZenB}~e|$DWsHQ6z)AT_90KE2~-Dext10TtYBB^nN;DVo^)CQ?>^s+?L?|%PjN&>57 z<`7W~b(!mm%HkaoA2_s%CWbjE%)C5lpg(4q9#i>&&q75$m;pi zLX`{JMAcIe)Aq9w_?}&k4swr$3m%=6mibH!3hs*Lx?QDQp@=cIa2FBDd^n)yaE7D~ zY6=nCA2!uLiNn8D`-rntkP?p&C^%Vyqf9oSAs=TI zWPw2w!|mS-1r1G#*&A2JHYJL9nnqmYf>m8umND#h4JVkPd3nn=kpp3hSLS|Yrkny zQA+55*rJ9)u=A}V_zc3p1H+W~$zR>tgH_hrJaC0=#Ad zo9@ba=Blc+wLYnuwXfWA2k~fmx*w^zedkW<^J$Ko1XTi7AX(K;<3(V4D-6D47f+)% ztw%zrGCMOSAGgR4r?(wSHKxq-korNl8L)6dTA{DLhHiXkIB?kp0jgWW-h_b&YS)Yx{=x#!H|7!HZTk3K7dQMjnL|e3<$=)aZouu2lkIDT z_B0zBaUNF}-mZxlBmMaeg8=DsxQ|ATt?$NW>>JcS%*26Z}H+(dxyec+sF}1IpFv?$o^I zM9WS_vy*LVFT1h;-qSm9k_*M>gDT0Kps^)Se+=}49;`uZlU`svG|VTJAL+dl_1qFf z40imip97DX=gcwZ-W|iu1&!g+v&Mgd_`U=tyK_wL(5B?Y&61l~^rtF$ z@pdV@j(33(3SJH_KgUQZ==Ss{p@j>^oD-&FH7VEyp+w6+Ka1 zb-_=VDH$5e#(Ju<3-&r~Ivo(YkU)jPQtI9Ax!VRO9qs(2lnRnc8A*Wpl}8LeI-MHznhpbZ{#{TVD;p_L$Pjq%#T$g(k2sr zNg@(0#~L=Zs<2JPpG>r1tmlK!sDm3C`8{c5hky4;ZAn`D{2qXFwW{(=Pm?Ng z4=yxKtIqp!**Y&c*8Y+)=kK>ESVZWThA9G1vKjiU4-z|!OJfhq5a8YJm**njohq)x z(5d&_OwkgzDV!?3+881AoVXExVw%Vn(uqC1$GrnD1C!rN=@5ZPGzIX(Y0l^Yb|tN1 zzqoV$DH3S`Vr8&d5XY$sr;Amg-opk^D#<*rOAPG4Fa7~8H`1!vy@yA^KNc#TZb0Vb zx3u#rWN_?d(@Zb$k0Ja=&1!72ogTRYk@Aa6rd6ZPBA`{)MUJdo{Ew*I^(UAl13Pfg zOZdECS*+Vxao%U|+sTUJUD!{`Tlax?MDMsfaBnnCa7%a96 zBEA~X$LHqq_hC;Seg0OY1HJL0=5ErK^A~O( z*gbD4ZL!;7OXTCLJH7BPIPII~Z^$Io+XGRZN(!AwDD4J#30%}a=(F4C$s?4ca_eyf zKf0!Li$y6FkrK*kPB=>t+0zu?=+K3AshftF9L@4Z_m<|hJ*2b`FtaeFKC5;AgSb zVAlKG)BE#2-*e92-{0>%9>3pX{<)cZx#qgB<#oNT=aRc68TlKUR`%Snqi<}t#DYE> z{Vn^`r{*-Ns!^E%$QcJ66RiV(+-W~ELQA3|1v}^Ae+m@{964VYCM?PO&h_&=y~-PV zxNGilH&&ruwe=wQ)%CGnV8%3A-b9fr_{$>g>B<35-|(BVoL1;h-`g20Rq;R|I(?d+ zMn^i_ngx|Fsb#(^7=932BuHE7m8G;|R|&C?LFy z4q+emx+V5URKvnr;@(^an+1n0xTADzsC^8)@JH(7U7yBxVrlnj=SJ$gX9ia=Okj|F zbPKEL_+zz;>#UUvVL95S;T(Ak3$~r70SkDD^A25QjL6)>%()2#?Z0!kj3W{ZrE&*) zviuGV`{CtW!x{;Gx_AsJ(qXX$L|%*fJdeJR-WjVWoBih6%|b>G9lt;?rSS(Vu#>L_ zBYru0?C%bx>X}6iEkqd({XHr>jZk(M=jJ=A81GX1Dq}>@%*Z=+|IfDv=0Xl%c%9i? zfV6Ejo1fT`L_lF*)ctlvSIms+uEVDdf8)UJz;jZekou0&UM~3v*ba}c#NF0ooS4_+xVBaSLUxz&|kvY+R^P<#!J-S6hMfwG0qdqT& zH2bz=?$XV*xT9w}IK=OMprlX*pRl@>RUc(8!yp`y|E1xrTsyv~l@fIv%?W2zDn4XE z@A=9IZSCWh{7SM{Bi^ni2MqZ(5{Y>4r6$ql(Ey2|#8XGx4DVPtZ?iXqs_YLnc&@Z> z%F1QG`$uPrgLo;lv>r&@HNrwN8 zvI9!sH)Hmkb(&hy$aS!KH#{ATE)addaht|Jx4f$gu8Of1sjJ-9u+|=7&lY*dt#VD} zQa@);H$Y$fnST4&s%u4hG?3tH!AtY-4P1@t3J;mv2*Usc(_JwWJ>EA zydnNyoM;YPLlr6Te}*V<#CzsX!p?l#U&Q^{ogv*xeESkbaAqs|E#tH8*$ePoZ7g!z zYeUt6^NiM0T0skpa8(2~jvIjf{1B}4ZoImAo)LO(%_)%K0_-b8p-7=+lged*f2P)5 zCAp=!$Iln2YGLB0LW*CXA?N7L0Rb8X>J~}iw3?M#)#{$RNQZaJHH8Q2IV@gj(W8Mi zxJp(9$X$`E7+vb3e3219x4`w{`t$mi)?bXkujq^HFK)kJ=rL*bz&|nw{Od4P(7B$H zK}34Yq^f$|pCV&cJT}nnp)U_LK+vA*;&2Z}u}p}+*T%O!h+yAL24exxf-KI--B#Wz z84uGwIm0TgE7{d*ft``9x0a}0E+0XDL|?k{2Yvg9w6mQ3TeeEp3emCw%2>!KdZYOq zgX6GcF5Ti&g-!Qt$h+YQuNOioqPF4$fcEM-0j+&H1m_i4&V8yKe_4%yEGe9d2bls^ zqGVYTh7p;>ac>1{{^|g{09e)Czt{SMLo2PiyY%lqE3=@AOnw+-I(ncI;>kX~k0<^X5LKDc4w#xR-Y=p3 zQH^e$d13NfH32)&8AN%yx;s2~YUTlv?&*iZFwpOCjj@OUJUwF%cV;r+*LXZF9KJ*N z_HNx4nW4)N^Ucrj-(FS#n|g7Li6h&Izv;jJq4!4AD{Cwv#2em{>eqxuxk$#1q^vuy zpr{!70&&$kt0dQDt|Dex9@_rtpGNotAZZ04b85)*E>c-BHFc}V;PD9tDdvw;xR1ux zrs+uOt=zCrT<2dtmtS9IZT#fTSpC@Bc;y_wc0?(~8D|R+y?4ZdY#OdbG~skpTO=gp ztb_^2+NeJ4vM~hdz=ghK;};dQiL)!;M!ZY)XHn{oO-O3$9#U>FAoPO^y$w`E*b_Yh zUJZ-~M>rEkZDI^gI8lG7wKzMulm>eU9Ed3oszzN0Kcb=R&YSnptE&DuG~2TJ%Ne3i zY4HyWqo`P6EmA}m4y}Y`jtwv}Tl2<`vKIn^ua7m*)lHRj*+1^7fRrDV`Php;pEZR= ztJm->2#Hby78lzYhS|#%i;vb+1HW(l{*GQfzO+jvT|+<89>AamtLzTCuok(fT75`* z@Q#&9`9CB{Yo2HQ7K?X*ZQvl3VoP%H#On#F(>!K9V6H&_qQ{n)bvB+Ev^XU@59IE< zePZEwA4Fm8eF&t6F0MXWfjjldGw#tH_A3IEgkR}I!OX{N3p5K18o#R(HU}3SFm*4J^ULYQjd=f@ZQ@%lh`#kKwX2SK+hAfTkaq@ zv;oO{vQ*AxuRX_rLD;W#Wzk8?>pN$8tIv^sn0K%^$p?|x&IwrxjS3WA9Zxy8r#yW8 z1*)Uz_J%C?S8LN%p&V&A0zEpuV4`^ba!$?gjgrM#Voo_8}lpq zmj##H2y6d)h(FK~~Dq>ZyKy~{Lab(AFISHB*0s5L7L+4x#VV+>Syl0UPEO0bq z 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

)~HJ&u5)ob3PpF>4bPf(MB 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%0DraeNq?Oyz(SA}+@ zdhU*NT6kNO=q+w=Gu@1{6fSjSN$Ke;8KYL&Vn&@=8l@GEG#+_*pr}+u@gzHR&7f?+ zaKBSJ$2u7NYhB{gyZ2g^>Zk@U=so|iiqa%cI>|554v)aYCKJ+`^KB+Hq!2DyH!5~3 z2zg98V93V8h2KlG-z%&|vKS=wvA7G`l@%xgV0o-vpA z(z5PJX;eD*QybI8K$r&9r0|VIezRYwy6P3wF*eIBQhq&Br0e~J%C?^6 z_s@5(NI)Z`1G5jGZ77rm*O^x>Os#dVLeBZ^VEiA6DKxiN3Jj;TDn8~)xR!PQAH|Dp zLRjNn8gcIYAE*Aa|eE5R)7zs>R)q2CpM?*E=!ASw-`6(GpkEIpr}OZ{0Ikc>e+fTjKivmsiVK9;WgAo+`y+>LB^OOqlx}UzffvT#J)9f|}d8#=;8L(i^ zVsHNkeivBSgV#^ASc&)B>mPf>^Qv>_hUiff%_Xy-Gbe}dr1zYxD56x|EQ+jmK&pF; z7=0rbq@L6g+m%wFAS2@OzTRRnH#aNBcsG^6cpo(MW|mdS)@2c&!{|4E3m(B_&O|Wc z>L2>f0p(4H^ zt$TB9Zbqt<>ST#P=`*K)N1PdnK8oT%hI7<3CNX0zx;+k)U-XzFIsUllUDV?gdR{9md6-cBSi0zm#nh(f0v`lCmptlN z310n@?D1D^@=?4?X;dtLts*U2FW8N6ciyoVRXPYBfjiJC5C~UNyj8EQ z-ajz;&OY@q-oZPUKH62D2bYqLvERJ^T?;_6z`KoRC&G`oG~P~2e5tl_`A;jj<^0=L zm95%V@oEN5XhzXSN{nH#tsw*`K=(t{fzF@td=yUFz)ySohW++ubNDStSNzVA!&7ux z^uRj=MUVD~8Jn^b8(p`z-o;7j!%IIk;M* zSjyRb>PIKay8~P23%Ctht1S zx`0%*jqu{WC7X< zVF`&jDRU@gJZTje?bS`_ZCq-KHEjL6R>8Z6YDsr}Gl()4V3v{ojtIXrd{AoNcu9feh1nSxg~u7vDZewa)~WgeaZgZA1KvxHk`>h#uU76!`+%IRpIsF zPalSc?gMec+i|-JlPCE;dz+W3eayt?B zt#wrueLcIeGv&p{krOVAcmZiy>R{1Je@`rB6Mw>`ZPEJY2iMcj6r7O0kS&+Z-T0aE z%{Po1x7e~dd+ffT*-7!3Bi1QZHD9VET!Em(cVwjbAx;tRFG|N-1L0N0x-UX2cRvDb zJ0}hRKCq--y?wd%^_QUXZH?Y87&{zC{x-a@yke4VbBk}`>AZ!WZ|Ear%GiO+CKc55XVXYB?B#qSzWFrbKRX!L5n zY1N6m;XgXe#HDuy<;haJgyQI%yJo+Xg1Ff435tpzviL?Z`tdQWI+8!LG^9jl(ff{W zE=Yr5m8{NVKGkWh|5N0ZzgjF=G=Bl}*#E=u$4dE;WL+*qHoCK1A?PEXsEttn?H0xSA zhOly4Tdcx;LigbqJPjws&{+n>A5H0pzVSF*^tlLmQCn-B|26ox zdl!}BiO?_2{CDZwCY^ya_8>wwSBm@T!c^E5NY~33~~NC+qnbr*(W^-DcIfEj(mEZ~-^JrimDp40IHA z$#N4V{a1woGXB7yQ>?Y9)zE=M{8RTpNg5Y0SH{ltdGG1<%~XLhX{XPr`6XCdpA0kP z?o0lka-yG54qs%kPhDmfwuqmXGdU9qst(OgI^H(*>T)M=8uRS-~gAKEb)$Ek-n|O*fp-jdU2}>f&?Kbi2nlY0m9L^ zR<2S0@4tvLp|WcU#XV9M>q`nc_|1paPiCZzLk@v!WlH`4X?aWKY

x{sEA!4OHz0 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

o8f+a9RH)z4?={9}H< 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 z%0D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 literal 0 HcmV?d00001 diff --git a/ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-70-20.png b/ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-70-20.png new file mode 100644 index 0000000000000000000000000000000000000000..dca8c8cef489339099b6f74a3b82600b83794594 GIT binary patch literal 1639 zcmV-t2AKJYP)BE1ZQLxAY_vg;$?V;oX(lt{{G@3qJ`_O^!KmPq;Qw2}Cn0L9?Tam?khm;cmfj@-EE=vY<#k5o0f^m&*sM6pBI0EL{uRZtU4R5Z z`^X8`V)zNfJ8YaF;u6EP09P2E5Ad?jnUOMxUqvh^s*L``+lU9}BlcPZ2XpY-jyyG} zttleQMaed+noc9ry@UIIwng1*#M^^UkFzj+6yF25_LnMhmf?pGpH<}CbcnAmX|u%; z|7E#p3GpKUUAw%6atiT2#A8)^yd3Cssj4^8z$>TJnP(8+gLrkpJj%xIMEtceUz`ec zeo~wa<_{hK;NmJRuzL3+9o0iVC08s$)vACv7|KExH6jmbd4gn8^0FkllzkRT6fd|P0n zrwSVAXrbt(XrcJk;OyVRDf#{Yw^VBW$m{6QFhZvPBk<6w!tZERBfJcLd1$M3&)TehHS09YRtkN(Z(GDi^F2;vKBX;HY+Q*UEnTqUvgh@A9J5aYSek}G;8j! zqp=F+X_rylpF&#LEj%b>g+0Q~5^H*5N-?MwSLAe5T{?GXqX;9WfX;*4pXw6&V*io?m|<6;W0GAb4f<-njQ>$>Q>9MPr@ zwU=n+0I+*9IKpp9{{0u*d8K7@p9VPmCp-6AwmA>rtOL;dXv;Q$XXCx^0IWWyc=l3w zC&Xgk0yx!!!@*Zi8qcdA>-AfBZYACT*nGWS|NH%Vee(m<-vGFv{{#Oecnig2*2@3@ z061k>NoGw=04e|g00;m9hiL!=000010000Q0000000N)_00aO40096102H7D00aO4 z0096102BZK005B{(#HS*0nkZAK~y*qtyH^813?r$JG*)MLJKW|8bz>*o!0(@m4c}( z^9Ne_4T6QAVq+J@LKGjUh=M5i2qB5)u{-0LO}0oftBYh{cbM68&zyViowX{(C4~VF zN6CTm!BO4-<&lbnQ58zS62KquXoSjzNY6nwUIE#p4l6V*ddQQF04;@qB(O(w5UC8j z$~_=r+&9T=-*o|d9Es^ov_4Luq%h!u*f!6vDJvy0lG~=T8+f%BSavc* z9k)9plu&tfq!+djn^-~hVwc$`sgO~Us&&ei6L56R=021y#3xsgUMx`A6H>DqoFCy< z9{?Uisc_5JocoItqR@udD5G?=&e#O(;VkT-EJo(@oM%uj7U*xQQ=l$^VU2B}`F`dj zEfELa&mrQYRJw-h)gJ24hdd}nwcTWTWlq`0+5TI39@Tu)&peuMC#YTSGt~tBG__8Y zo5D(n#1x#dMU;y5tA0%K$Q2?ck#zgq3jie9DB`n+XT z@0cpdeBZP>b4#%^$0{;L2002ovPDHLkV1npG4j=#k literal 0 HcmV?d00001 diff --git a/ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-70-20@2x.png b/ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-70-20@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e8cb1c69a558b75b00e430a2f90bc1167bd3758c GIT binary patch literal 2381 zcmV-T39|NyP)BE1ZQLxAY_vg;$?V;oX(lt{{G@3qJ`_O^!KmPq;Qw2}Cn0L9?Tam?khm;cmfj@-EE=vY<#k5o0f^m&*sM6pBI0EL{uRZtU4R5Z z`^X8`V)zNfJ8YaF;u6EP09P2E5Ad?jnUOMxUqvh^s*L``+lU9}BlcPZ2XpY-jyyG} zttleQMaed+noc9ry@UIIwng1*#M^^UkFzj+6yF25_LnMhmf?pGpH<}CbcnAmX|u%; z|7E#p3GpKUUAw%6atiT2#A8)^yd3Cssj4^8z$>TJnP(8+gLrkpJj%xIMEtceUz`ec zeo~wa<_{hK;NmJRuzL3+9o0iVC08s$)vACv7|KExH6jmbd4gn8^0FkllzkRT6fd|P0n zrwSVAXrbt(XrcJk;OyVRDf#{Yw^VBW$m{6QFhZvPBk<6w!tZERBfJcLd1$M3&)TehHS09YRtkN(Z(GDi^F2;vKBX;HY+Q*UEnTqUvgh@A9J5aYSek}G;8j! zqp=F+X_rylpF&#LEj%b>g+0Q~5^H*5N-?MwSLAe5T{?GXqX;9WfX;*4pXw6&V*io?m|<6;W0GAb4f<-njQ>$>Q>9MPr@ zwU=n+0I+*9IKpp9{{0u*d8K7@p9VPmCp-6AwmA>rtOL;dXv;Q$XXCx^0IWWyc=l3w zC&Xgk0yx!!!@*Zi8qcdA>-AfBZYACT*nGWS|NH%Vee(m<-vGFv{{#Oecnig2*2@3@ z061k>NoGw=04e|g00;m9hiL!=000010000Q0000000N)_00aO40096104SgX00aO4 z0096104M+e003DoM3w*m1hz>;K~z`?%~xA%TvZhQ&N*|*Tsom?Q%ze-FF~udDpreq z^~GNx78QKxn+QG>74b<#5c*U^5CormQBV;41wp|eYVn3mm6&R&!6unx(#-8#{MJ5a z&+Hk`n3;2?Fq=&Fp0(Fr>)YSjYwbN&ZSmm%;NK)R3&9BOfGv0VBp^wgqFp<2X3m}OKll{k_2ry(`VrC{0?|+x=3Ea zggV(~s$H6k1HXyv%sJSFd*E(-1Ix~FI-Px6@Qvl;yRh?f$RD|Y_N@gH7w$c+?J+SZ zyR=Ze|82ONSK#g3faMfYvnSEXsGCkkDO%t)P`vjdGSjEA{o|{&ln-yv6gKtJ^o5$> za(6$4!ikr#bL}$x`YIsor8{~WU(z}#-Yv4!f>WMH>C{{BTWe_i`3c2LjKttVyB%~K zB)>^m<1D9y^67V&9J6HaJ(iXm5qpUd5>j_vV z0qfv^nK&`eon1PL%Hx+=hfDP1GrSwHr{)N(4Zn5`ZtXXCw^tA}*A!s8a2QVUAe_p5 z%qra^iRYD4os8dJ`jGW; zN*UGmWm1pLUgX+`^qn&(O1kN>?zLQcQ>MqdSMzQYg=5d~{Ow13{ReD)_a+z76_r?^ zl&KzlB^hjY^g0+BjP1ytQ{y8SaI;xAWu-^>dg$aK>GD)}}lT*FD|C4ESqGPmx z?3Io^P4;H7@#Tv=pFc(Cjz$OBHEqP`gdx@w5(;IBy-GFd1%doCWZGMgzDHmOP&#=5 z+rPYz`ts*0W4ph*`)p{trj35Poa-ypYE=YC1Cw4_|6H$3*ejoU7VV9zsC|ElnVvT` zrwr_BLu;A7I$7MEOfX`hwu^Jf9XN~XR~K1k_-oGY+j|1DvSch)EKCypElDp|S8j$^-wK+4f6a`Q=l+<`@!Y2mv0&l(Yp(J(;nQlAYixHu z_}m(Y#lQ{kW>u~_$+WxsVKlf9OCd`;}9W{~Zv0kHPacfK)qHpS$cC-y`lf6Y* zm?Wm6q3|CdG8d<7%FOXF`r2RrI&nqWSh86AxD$PE7RS)6!W^@^fnbKU5vQk(8go&S zh=eT;NSrLxj{hI0Kdek!H1t)7^)pD%Pg4Ic=KVn@I2L-H00000NkvXXu0mjf5onvn literal 0 HcmV?d00001 diff --git a/ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-70-20@3x.png b/ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-70-20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..3727f4267b5ecb7c1ab84b420df3883ae6ab2785 GIT binary patch literal 3432 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 KMNUMnLSTXdTbN4# literal 0 HcmV?d00001 diff --git a/ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-70-29.png b/ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-70-29.png new file mode 100644 index 0000000000000000000000000000000000000000..4207ffc171b70080a1737314779f9a04549fc655 GIT binary patch literal 1966 zcmV;f2T}NmP)BE1ZQLxAY_vg;$?V;oX(lt{{G@3qJ`_O^!KmPq;Qw2}Cn0L9?Tam?khm;cmfj@-EE=vY<#k5o0f^m&*sM6pBI0EL{uRZtU4R5Z z`^X8`V)zNfJ8YaF;u6EP09P2E5Ad?jnUOMxUqvh^s*L``+lU9}BlcPZ2XpY-jyyG} zttleQMaed+noc9ry@UIIwng1*#M^^UkFzj+6yF25_LnMhmf?pGpH<}CbcnAmX|u%; z|7E#p3GpKUUAw%6atiT2#A8)^yd3Cssj4^8z$>TJnP(8+gLrkpJj%xIMEtceUz`ec zeo~wa<_{hK;NmJRuzL3+9o0iVC08s$)vACv7|KExH6jmbd4gn8^0FkllzkRT6fd|P0n zrwSVAXrbt(XrcJk;OyVRDf#{Yw^VBW$m{6QFhZvPBk<6w!tZERBfJcLd1$M3&)TehHS09YRtkN(Z(GDi^F2;vKBX;HY+Q*UEnTqUvgh@A9J5aYSek}G;8j! zqp=F+X_rylpF&#LEj%b>g+0Q~5^H*5N-?MwSLAe5T{?GXqX;9WfX;*4pXw6&V*io?m|<6;W0GAb4f<-njQ>$>Q>9MPr@ zwU=n+0I+*9IKpp9{{0u*d8K7@p9VPmCp-6AwmA>rtOL;dXv;Q$XXCx^0IWWyc=l3w zC&Xgk0yx!!!@*Zi8qcdA>-AfBZYACT*nGWS|NH%Vee(m<-vGFv{{#Oecnig2*2@3@ z061k>NoGw=04e|g00;m9hiL!=000010000Q0000000N)_00aO40096103DzM00aO4 z009610384T008~7G;06=0~bj|K~zW$y;e<2R8bgy?$?YneiSH@5fxgP5@EG(Q3OSh zyM95?qD9am+O`pjet>_%O|-C}MVmqqgNOnbf}~|+el+ULb>`0LdC$FPyiViHy$T+< zbI!Tv{eGVF-mwZ(mlTe2Sb(dP0_UR}OwmOZINDU{v`VKYQ*mzACUx`9%;tT3PJ6~o z)t*enK>aZ9%v^si`!r{+qSJ#7a=~(_YD1|?ViQtHTQE)kFi`3_9V1X$Kins=Bl2OU z^+2|YJ18O3HwsnR-lGt@|4F{ursPX4Hh52tGcUhgfGS3c00mr7rJxhiOt*6z8Y zueDnI+E-a@F zYG)0W+d(HodvK9l-I>Iju_0?2QS$nG+OWj&0JMgAA({@cs~~s! zHoWdDD13g7($c%IB5`6G6|K*oXdkgR3c(!eStJ_0mqTgx8MF^QMCtn^HouN@pCy)B zvE@%#UK7H9;`O110&<0NXYP{C8Ei~F)y|ZTud#f+*+lnruM)FlQ^=hi#rnr5Wb+^G zJWXp#(FRSHWwf2Tf#Sj>{N-s9mCR0-U@i8r;qM1sO)Of_x@G6dW*^&2uLwDNZ$cd7 zruJuVT&lKaN@SifU?1jlaXpP44Mo%r@7Jh!o*s z;1Ob(wdlw9@%2H@sL!tq{}IF;h@oct!=6$9ACP2{W{~EEAOHXW07*qoM6N<$f&v)6 ABLDyZ literal 0 HcmV?d00001 diff --git a/ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-70-29@2x.png b/ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-70-29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..eb4e755035cfb6e743ed34ab3f12cb34b48faef2 GIT binary patch literal 3583 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 literal 0 HcmV?d00001 diff --git a/ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-70-40@2x.png b/ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-70-40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..eb94dcf71d7ecdb09a76829aac2de98df2a714b9 GIT binary patch literal 4831 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 FV1hPuSkwRj literal 0 HcmV?d00001 diff --git a/ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-70-40@3x.png b/ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-70-40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..6c6a9857809a8d4ad263c6bb0b89e89b4617726b GIT binary patch literal 9070 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 literal 0 HcmV?d00001 diff --git a/ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-70-60@2x.png b/ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-70-60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..6c6a9857809a8d4ad263c6bb0b89e89b4617726b GIT binary patch literal 9070 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 literal 0 HcmV?d00001 diff --git a/ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-70-60@3x.png b/ios/BlixtWallet/Images.xcassets/AppIcon.appiconset/blixt-wallet-70-60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..5587cb9eb43201034d4455cf93e4004b19099c33 GIT binary patch literal 20477 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

T6EC&$jmZH7^ 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 APPL CFBundleShortVersionString - 1.0 + $(MARKETING_VERSION) CFBundleSignature ???? + CFBundleURLTypes + + + CFBundleURLSchemes + + lightning + + + CFBundleVersion - 1 + $(CURRENT_PROJECT_VERSION) CHAIN $(CHAIN) CONFIGURATION $(CONFIGURATION) + DEBUG + $(DEBUG) FLAVOR $(FLAVOR) + ITSAppUsesNonExemptEncryption + LSApplicationQueriesSchemes lightning @@ -49,12 +62,12 @@ NSCameraUsageDescription Scan QR codes for invoices - DEBUG - $(DEBUG) - NSLocationWhenInUseUsageDescription - Locally save location of where a transaction was made + NSFaceIDUsageDescription + Use Face ID for accessing wallet functionality NSLocationUsageDescription Locally save location of where a transaction was made + NSLocationWhenInUseUsageDescription + Locally save location of where a transaction was made SCHEME $(SCHEME) UIAppFonts diff --git a/ios/LndMobile/BlixtWallet-Bridging-Header.h b/ios/LndMobile/BlixtWallet-Bridging-Header.h new file mode 100644 index 000000000..a8d51b722 --- /dev/null +++ b/ios/LndMobile/BlixtWallet-Bridging-Header.h @@ -0,0 +1,4 @@ +#import +#import +#import +#import diff --git a/ios/LndMobile/Lnd.swift b/ios/LndMobile/Lnd.swift new file mode 100644 index 000000000..295e2c390 --- /dev/null +++ b/ios/LndMobile/Lnd.swift @@ -0,0 +1,246 @@ +import Foundation +import Lndmobile +import SwiftProtobuf + +public struct LndError: Error { + let msg: String +} + +extension LndError: LocalizedError { + public var errorDescription: String? { + return NSLocalizedString(msg, comment: "") + } +} + +enum LndStatusCodes: NSNumber { + case STATUS_SERVICE_BOUND = 1 + case STATUS_PROCESS_STARTED = 2 + case STATUS_WALLET_UNLOCKED = 4 +} + +// Used for anyone who wants to use this class +typealias Callback = (Data?, Error?) -> Void +typealias StreamCallback = (Data?, Error?) -> Void + +// Used internally in this class to deal with Lndmobile/Go +class LndmobileCallback: NSObject, LndmobileCallbackProtocol { + var method: String + var callback: Callback + + init(method: String, callback: @escaping Callback) { + self.method = method + self.callback = callback + } + + func onResponse(_ p0: Data?) { + self.callback(p0, nil) + } + + func onError(_ p0: Error?) { + NSLog("Inside onError " + self.method) + NSLog(p0?.localizedDescription ?? "unknown error") + self.callback(nil, p0) + } +} + +class LndmobileReceiveStream: NSObject, LndmobileRecvStreamProtocol { + var method: String + var callback: StreamCallback + + init(method: String, callback: @escaping StreamCallback) { + self.method = method + self.callback = callback + } + + func onResponse(_ p0: Data?) { + self.callback(p0, nil) + } + + func onError(_ p0: Error?) { + NSLog("LndmobileReceiveStream onError " + self.method) + NSLog(p0?.localizedDescription ?? "unknown error") + self.callback(nil, p0) + } +} + +open class Lnd { + static let shared = Lnd() + + var lndStarted = false + var walletUnlocked = false + var activeStreams: [String] = [] + + static let syncMethods = [ + // index + // + "AddInvoice": { bytes, cb in LndmobileAddInvoice(bytes, cb) }, + "InvoicesCancelInvoice": { bytes, cb in LndmobileInvoicesCancelInvoice(bytes, cb) }, + "ConnectPeer": { bytes, cb in LndmobileConnectPeer(bytes, cb) }, + "DecodePayReq": { bytes, cb in LndmobileDecodePayReq(bytes, cb) }, + "GetInfo": { bytes, cb in LndmobileGetInfo(bytes, cb) }, + "GetNodeInfo": { bytes, cb in LndmobileGetNodeInfo(bytes, cb) }, + "LookupInvoice": { bytes, cb in LndmobileLookupInvoice(bytes, cb) }, + "ListPeers": { bytes, cb in LndmobileListPeers(bytes, cb) }, + "DisconnectPeer": { bytes, cb in Lndmobile.LndmobileDisconnectPeer (bytes, cb) }, + "SendPaymentSync": { bytes, cb in LndmobileSendPaymentSync(bytes, cb) }, + + // channel + // + "ChannelBalance": { bytes, cb in LndmobileChannelBalance(bytes, cb) }, + "ListChannels": { bytes, cb in LndmobileListChannels(bytes, cb) }, + "OpenChannelSync": { bytes, cb in LndmobileOpenChannelSync(bytes, cb) }, + "PendingChannels": { bytes, cb in LndmobilePendingChannels(bytes, cb) }, + "ExportAllChannelBackups": { bytes, cb in LndmobileExportAllChannelBackups(bytes, cb) }, + "AbandonChannel": { bytes, cb in LndmobileAbandonChannel(bytes, cb) }, + + // onchain + // + "GetTransactions": { bytes, cb in LndmobileGetTransactions(bytes, cb) }, + "NewAddress": { bytes, cb in LndmobileNewAddress(bytes, cb) }, + "SendCoins": { bytes, cb in LndmobileSendCoins(bytes, cb) }, + "WalletBalance": { bytes, cb in LndmobileWalletBalance(bytes, cb) }, + + // wallet + "GenSeed": { bytes, cb in LndmobileGenSeed(bytes, cb) }, + "InitWallet": { bytes, cb in LndmobileInitWallet(bytes, cb) }, + "UnlockWallet": { bytes, cb in LndmobileUnlockWallet(bytes, cb) }, + "WalletKitDeriveKey": { bytes, cb in LndmobileWalletKitDeriveKey(bytes, cb) }, +// derivePrivateKey + "SignerSignMessage": { bytes, cb in LndmobileSignerSignMessage(bytes, cb) }, + + // autopilot + "AutopilotStatus": { bytes, cb in LndmobileAutopilotStatus(bytes, cb) }, + "AutopilotModifyStatus": { bytes, cb in LndmobileAutopilotModifyStatus(bytes, cb) }, + "AutopilotQueryScores": { bytes, cb in LndmobileAutopilotQueryScores(bytes, cb) }, + "AutopilotSetScores": { bytes, cb in LndmobileAutopilotSetScores(bytes, cb) }, + ] + + static let streamMethods = [ + // index + // + "RouterSendPaymentV2": { req, cb in return LndmobileRouterSendPaymentV2(req, cb) }, + // channel + // + "CloseChannel": { req, cb in return LndmobileCloseChannel(req, cb)}, + "SubscribeChannelEvents": { req, cb in return LndmobileSubscribeChannelEvents(req, cb)}, + // onchain + // + "SubscribeTransactions": { req, cb in return LndmobileSubscribeTransactions(req, cb) }, + "SubscribeInvoices": { req, cb in return LndmobileSubscribeInvoices(req, cb) }, + ] + + func checkStatus() -> Int32 { + // Service is always bound on iOS + var flags = LndStatusCodes.STATUS_SERVICE_BOUND.rawValue.int32Value + + if (self.lndStarted) { + flags += LndStatusCodes.STATUS_PROCESS_STARTED.rawValue.int32Value + } + + if (self.walletUnlocked) { + flags += LndStatusCodes.STATUS_WALLET_UNLOCKED.rawValue.int32Value + } + + return flags + } + + func startLnd(_ torEnabled: Bool, lndStartedCallback: @escaping Callback, walletUnlockedCallback: @escaping Callback) -> Void { + let applicationSupport = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask)[0] + let lndPath = applicationSupport.appendingPathComponent("lnd", isDirectory: true) + let args = "--lnddir=\"\(lndPath.path)\"" + + let started: Callback = {(data: Data?, error: Error?) in { + self.lndStarted = true + lndStartedCallback(data, error) + }()} + + let unlocked: Callback = {(data: Data?, error: Error?) in { + self.walletUnlocked = true + walletUnlockedCallback(data, error) + }()} + + LndmobileStart( + args, + LndmobileCallback(method: "start", callback: started), + LndmobileCallback(method: "start2", callback: unlocked) + ) + } + + func stopLnd(_ callback: @escaping Callback) { + do { + let stopRequest = Lnrpc_StopRequest() + let payload = try stopRequest.serializedData() + LndmobileStopDaemon(payload, LndmobileCallback(method: "stopLnd", callback: callback)) + } catch let error { + callback(nil, error) + } + } + + func initWallet(_ seed: [String], password: String, recoveryWindow: Int32, channelsBackupsBase64: String, callback: @escaping Callback) { + do { + var initWalletRequest = Lnrpc_InitWalletRequest() + initWalletRequest.cipherSeedMnemonic = seed + initWalletRequest.walletPassword = password.data(using: .utf8).unsafelyUnwrapped + if (recoveryWindow != 0) { + initWalletRequest.recoveryWindow = recoveryWindow + } + + if (channelsBackupsBase64 != "") { + NSLog("--CHANNEL BACKUP RESTORE--") + var chanBackupSnapshot = Lnrpc_ChanBackupSnapshot() + var multiChanBackup = Lnrpc_MultiChanBackup() + + multiChanBackup.multiChanBackup = Data(base64Encoded: channelsBackupsBase64, options: [])! + chanBackupSnapshot.multiChanBackup = multiChanBackup + + initWalletRequest.channelBackups = chanBackupSnapshot + } + let payload = try initWalletRequest.serializedData() + LndmobileInitWallet(payload, LndmobileCallback(method: "InitWallet", callback: callback)) + } catch let error { + callback(nil, error) + } + } + + func unlockWallet(_ password: String, callback: @escaping Callback) { + do { + var unlockWalletRequest = Lnrpc_UnlockWalletRequest(); + unlockWalletRequest.walletPassword = password.data(using: .utf8).unsafelyUnwrapped + let payload = try unlockWalletRequest.serializedData() + LndmobileUnlockWallet(payload, LndmobileCallback(method: "UnlockWallet", callback: callback)) + } catch let error { + callback(nil, error) + } + } + + func sendCommand(_ method: String, payload: String, callback: @escaping Callback) { + let block = Lnd.syncMethods[method] + + if block == nil { + NSLog("method not found" + method) + callback(nil, LndError(msg: "Lnd method not found: " + method)) + return + } + + let bytes = Data(base64Encoded: payload, options: []) + block?(bytes, LndmobileCallback(method: method, callback: callback)) + } + + func sendStreamCommand(_ method: String, payload: String, streamOnlyOnce: Bool, callback: @escaping StreamCallback) { + if (self.activeStreams.contains(method)) { + NSLog("Attempting to stream " + method + " twice, not allowing") + return + } else { + self.activeStreams.append(method) + } + let block = Lnd.streamMethods[method] + if block == nil { + NSLog("method not found" + method) + callback(nil, LndError(msg: "Lnd method not found: " + method)) + return + } + + let bytes = Data(base64Encoded: payload, options: []) + block?(bytes, LndmobileReceiveStream(method: method, callback: callback)) + } +} diff --git a/ios/LndMobile/LndMobile.m b/ios/LndMobile/LndMobile.m new file mode 100644 index 000000000..471b8a4e3 --- /dev/null +++ b/ios/LndMobile/LndMobile.m @@ -0,0 +1,52 @@ +#import +#import + +@interface RCT_EXTERN_MODULE(LndMobile, NSObject) + +RCT_EXTERN_METHOD( + initialize: (RCTPromiseResolveBlock)resolve + rejecter: (RCTPromiseRejectBlock)reject +) + +RCT_EXTERN_METHOD( + checkStatus: (RCTPromiseResolveBlock)resolve + rejecter: (RCTPromiseRejectBlock)reject +) + +RCT_EXTERN_METHOD( + startLnd: (BOOL)torEnabled + resolver: (RCTPromiseResolveBlock)resolve + rejecter: (RCTPromiseRejectBlock)reject +) + +RCT_EXTERN_METHOD( + initWallet: (NSArray *)seed + password: (NSString *)password + recoveryWindow: (NSInteger)recoveryWindow + channelsBackupBase64: (NSString *)channelsBackupBase64 + resolver: (RCTPromiseResolveBlock)resolve + rejecter: (RCTPromiseRejectBlock)reject +) + +RCT_EXTERN_METHOD( + unlockWallet: (NSString *)password + resolver: (RCTPromiseResolveBlock)resolve + rejecter: (RCTPromiseRejectBlock)reject +) + +RCT_EXTERN_METHOD( + sendCommand: (NSString *)method + payload: (NSString *)payload + resolver: (RCTPromiseResolveBlock)resolve + rejecter: (RCTPromiseRejectBlock)reject +) + +RCT_EXTERN_METHOD( + sendStreamCommand: (NSString *)method + payload: (NSString *)payload + streamOnlyOnce: (BOOL)streamOnlyOnce + resolver: (RCTPromiseResolveBlock)resolve + rejecter: (RCTPromiseRejectBlock)reject +) + +@end diff --git a/ios/LndMobile/LndMobile.swift b/ios/LndMobile/LndMobile.swift new file mode 100644 index 000000000..f41cc2379 --- /dev/null +++ b/ios/LndMobile/LndMobile.swift @@ -0,0 +1,209 @@ +import Foundation +import Lndmobile +import React + +@objc(LndMobile) +class LndMobile: RCTEventEmitter { + @objc + override static func moduleName() -> String! { + "LndMobile" + } + + var walletUnlockedResolver: RCTPromiseResolveBlock? = nil + + override func supportedEvents() -> [String]! { + var events = Lnd.streamMethods.map{ $0.key } + events.append("WalletUnlocked") + return events + } + + @objc + override static func requiresMainQueueSetup() -> Bool { + return false + } + + @objc(initialize:rejecter:) + func initialize(resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) { + // If regtest, we need to ask for LAN access permission + // before lnd requests it, otherwise it won't have time and crash + // https://developer.apple.com/forums/thread/663768 + let chain = Bundle.main.object(forInfoDictionaryKey: "CHAIN") as? String + if (chain == "regtest") { + NSLog("Triggering LAN access permission dialog") + triggerLocalNetworkPrivacyAlert() + } + resolve([ + "data": "" + ]) + } + + func triggerLocalNetworkPrivacyAlert() { + let sock4 = socket(AF_INET, SOCK_DGRAM, 0) + guard sock4 >= 0 else { return } + defer { close(sock4) } + let sock6 = socket(AF_INET6, SOCK_DGRAM, 0) + guard sock6 >= 0 else { return } + defer { close(sock6) } + + let addresses = addressesOfDiscardServiceOnBroadcastCapableInterfaces() + var message = [UInt8]("!".utf8) + for address in addresses { + address.withUnsafeBytes { buf in + let sa = buf.baseAddress!.assumingMemoryBound(to: sockaddr.self) + let saLen = socklen_t(buf.count) + let sock = sa.pointee.sa_family == AF_INET ? sock4 : sock6 + _ = sendto(sock, &message, message.count, MSG_DONTWAIT, sa, saLen) + } + } + } + + /// Returns the addresses of the discard service (port 9) on every + /// broadcast-capable interface. + /// + /// Each array entry is contains either a `sockaddr_in` or `sockaddr_in6`. + private func addressesOfDiscardServiceOnBroadcastCapableInterfaces() -> [Data] { + var addrList: UnsafeMutablePointer? = nil + let err = getifaddrs(&addrList) + guard err == 0, let start = addrList else { return [] } + defer { freeifaddrs(start) } + return sequence(first: start, next: { $0.pointee.ifa_next }) + .compactMap { i -> Data? in + guard + (i.pointee.ifa_flags & UInt32(bitPattern: IFF_BROADCAST)) != 0, + let sa = i.pointee.ifa_addr + else { return nil } + var result = Data(UnsafeRawBufferPointer(start: sa, count: Int(sa.pointee.sa_len))) + switch CInt(sa.pointee.sa_family) { + case AF_INET: + result.withUnsafeMutableBytes { buf in + let sin = buf.baseAddress!.assumingMemoryBound(to: sockaddr_in.self) + sin.pointee.sin_port = UInt16(9).bigEndian + } + case AF_INET6: + result.withUnsafeMutableBytes { buf in + let sin6 = buf.baseAddress!.assumingMemoryBound(to: sockaddr_in6.self) + sin6.pointee.sin6_port = UInt16(9).bigEndian + } + default: + return nil + } + return result + } + } + + @objc(checkStatus:rejecter:) + func checkStatus(resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) { + resolve(Lnd.shared.checkStatus()) + } + + @objc(startLnd:resolver:rejecter:) + func startLnd(_ torEnabled: Bool, resolve: @escaping RCTPromiseResolveBlock, rejecter reject:@escaping RCTPromiseRejectBlock) { + Lnd.shared.startLnd(torEnabled) { (data, error) in + if let e = error { + reject("error", e.localizedDescription, e) + return + } + resolve([ + "data": data?.base64EncodedString() + ]) + } walletUnlockedCallback: { (data, error) in + if let e = error { + NSLog("unlock error" + e.localizedDescription) + return + } + self.sendEvent(withName: "WalletUnlocked", body: [ + "data": data?.base64EncodedString() + ]) + if (self.walletUnlockedResolver != nil) { + NSLog("Resolving walletUnlockedResolver") + self.walletUnlockedResolver!("done") + } + } + } + + @objc(startLnd:rejecter:) + func stopLnd(_ resolve: @escaping RCTPromiseResolveBlock, rejecter reject:@escaping RCTPromiseRejectBlock) { + Lnd.shared.stopLnd() { (data, error) in + if let e = error { + reject("error", e.localizedDescription, e) + return + } + resolve([ + "data": data?.base64EncodedString() + ]) + } + } + + @objc(initWallet:password:recoveryWindow:channelsBackupBase64:resolver:rejecter:) + func initWallet(_ seed: [AnyHashable], password: String, recoveryWindow: Int, channelsBackupBase64: String, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) { + NSLog("seed " + (seed as! [String]).joined()) + NSLog("password " + password) + NSLog("recoveryWindow " + String(recoveryWindow)) + NSLog("channelsBackupBase64 ", channelsBackupBase64) + + self.walletUnlockedResolver = resolve + Lnd.shared.initWallet( + seed as! [String], + password: password, + recoveryWindow: Int32(recoveryWindow), + channelsBackupsBase64: channelsBackupBase64 + ) { (data, error) in + if let e = error { + reject("error", e.localizedDescription, e) + return + } + // IMPORTANT: + // Promise resolve is happening in startLnd + // by self.walletUnlockerResolver + } + } + + @objc(unlockWallet:resolver:rejecter:) + func unlockWallet(_ password: String, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) { + Lnd.shared.unlockWallet(password) { (data, error) in + if let e = error { + reject("error", e.localizedDescription, e) + return + } + resolve([ + "data": data?.base64EncodedString() + ]) + } + } + + @objc(sendCommand:payload:resolver:rejecter:) + func sendCommand(_ method: String, payload: String, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) { + Lnd.shared.sendCommand( + method, + payload: payload + ) { (data, error) in + if let e = error { + reject("error", e.localizedDescription, e) + return + } + resolve([ + "data": data?.base64EncodedString() + ]) + } + } + + @objc(sendStreamCommand:payload:streamOnlyOnce:resolver:rejecter:) + func sendStreamCommand(_ method: String, payload: String, streamOnlyOnce: Bool, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) { + Lnd.shared.sendStreamCommand( + method, + payload: payload, + streamOnlyOnce: streamOnlyOnce + ) { (data, error) in + if let e = error { + // TODO(hsjoberg): handle error... + NSLog("stream error") + NSLog(e.localizedDescription) + } + self.sendEvent( + withName: method, + body: ["data": data?.base64EncodedString()] + ) + } + resolve("done") + } +} diff --git a/ios/LndMobile/LndMobileScheduledSync.m b/ios/LndMobile/LndMobileScheduledSync.m new file mode 100644 index 000000000..3b60e4440 --- /dev/null +++ b/ios/LndMobile/LndMobileScheduledSync.m @@ -0,0 +1,21 @@ +#import +#import + +@interface RCT_EXTERN_MODULE(LndMobileScheduledSync, NSObject) + +RCT_EXTERN_METHOD( + setupScheduledSyncWork: (RCTPromiseResolveBlock)resolve + rejecter: (RCTPromiseRejectBlock)reject +) + +RCT_EXTERN_METHOD( + removeScheduledSyncWork: (RCTPromiseResolveBlock)resolve + rejecter: (RCTPromiseRejectBlock)reject +) + +RCT_EXTERN_METHOD( + checkScheduledSyncWorkStatus: (RCTPromiseResolveBlock)resolve + rejecter: (RCTPromiseRejectBlock)reject +) + +@end diff --git a/ios/LndMobile/LndMobileScheduledSync.swift b/ios/LndMobile/LndMobileScheduledSync.swift new file mode 100644 index 000000000..b314068d5 --- /dev/null +++ b/ios/LndMobile/LndMobileScheduledSync.swift @@ -0,0 +1,28 @@ +import Foundation + +@objc(LndMobileScheduledSync) +class LndMobileScheduledSync: NSObject, RCTBridgeModule { + @objc + static func moduleName() -> String! { + "LndMobileScheduledSync" + } + + @objc + static func requiresMainQueueSetup() -> Bool { + return false + } + + @objc(setupScheduledSyncWork:rejecter:) + func setupScheduledSyncWork(resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock ) -> Void { + resolve(true) + } + + @objc(removeScheduledSyncWork:rejecter:) + func removeScheduledSyncWork(resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) -> Void { + resolve(true) + } + + @objc(checkScheduledSyncWorkStatus:rejecter:) + func checkScheduledSyncWorkStatus(resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) -> Void { + } +} diff --git a/ios/LndMobile/LndMobileTools.m b/ios/LndMobile/LndMobileTools.m new file mode 100644 index 000000000..e2b244d98 --- /dev/null +++ b/ios/LndMobile/LndMobileTools.m @@ -0,0 +1,74 @@ +#import +#import + +@interface RCT_EXTERN_MODULE(LndMobileTools, NSObject) + +RCT_EXTERN_METHOD( + writeConfigFile: (RCTPromiseResolveBlock)resolve + rejecter: (RCTPromiseRejectBlock)reject +) + +RCT_EXTERN_METHOD( + log: (NSString *)level + tag: (NSString *)tag + msg: (NSString *)msg +) + +RCT_EXTERN_METHOD( + DEBUG_getWalletPasswordFromKeychain: (RCTPromiseResolveBlock)resolve + rejecter: (RCTPromiseRejectBlock)reject +) + +RCT_EXTERN_METHOD( + getTorEnabled: (RCTPromiseResolveBlock)resolve + rejecter: (RCTPromiseRejectBlock)reject +) + +RCT_EXTERN_METHOD( + saveChannelsBackup: (NSString *)base64Backups + resolver: (RCTPromiseResolveBlock)resolve + rejecter: (RCTPromiseRejectBlock)reject +) + +RCT_EXTERN_METHOD( + checkICloudEnabled: (RCTPromiseResolveBlock)resolve + rejecter: (RCTPromiseRejectBlock)reject +) + +RCT_EXTERN_METHOD( + DEBUG_listFilesInDocuments: (RCTPromiseResolveBlock)resolve + rejecter: (RCTPromiseRejectBlock)reject +) + +RCT_EXTERN_METHOD( + DEBUG_listFilesInApplicationSupport: (RCTPromiseResolveBlock)resolve + rejecter: (RCTPromiseRejectBlock)reject +) + +RCT_EXTERN_METHOD( + checkApplicationSupportExists: (RCTPromiseResolveBlock)resolve + rejecter: (RCTPromiseRejectBlock)reject +) + +RCT_EXTERN_METHOD( + checkLndFolderExists: (RCTPromiseResolveBlock)resolve + rejecter: (RCTPromiseRejectBlock)reject +) + +RCT_EXTERN_METHOD( + createIOSApplicationSupportAndLndDirectories: (RCTPromiseResolveBlock)resolve + rejecter: (RCTPromiseRejectBlock)reject +) + +RCT_EXTERN_METHOD( + excludeLndICloudBackup: (RCTPromiseResolveBlock)resolve + rejecter: (RCTPromiseRejectBlock)reject +) + +RCT_EXTERN_METHOD( + TEMP_moveLndToApplicationSupport: (RCTPromiseResolveBlock)resolve + rejecter: (RCTPromiseRejectBlock)reject +) + +@end + diff --git a/ios/LndMobile/LndMobileTools.swift b/ios/LndMobile/LndMobileTools.swift new file mode 100644 index 000000000..4505e55a6 --- /dev/null +++ b/ios/LndMobile/LndMobileTools.swift @@ -0,0 +1,334 @@ +import Foundation +import React + +public struct LndMobileToolsError: Error { + let msg: String +} + +extension LndMobileToolsError: LocalizedError { + public var errorDescription: String? { + return NSLocalizedString(msg, comment: "") + } +} + +@objc(LndMobileTools) +class LndMobileTools: NSObject, RCTBridgeModule { + @objc + static func moduleName() -> String! { + "LndMobileTools" + } + + @objc + static func requiresMainQueueSetup() -> Bool { + return false + } + + @objc(writeConfigFile:rejecter:) + func writeConfigFile(resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) -> Void { + let chain = Bundle.main.object(forInfoDictionaryKey: "CHAIN") as? String + var str = "" + + if (chain == "mainnet") { + str = +""" +[Application Options] +debuglevel=info +maxbackoff=2s +norest=1 +sync-freelist=1 +accept-keysend=1 + +[Routing] +routing.assumechanvalid=1 + +[Bitcoin] +bitcoin.active=1 +bitcoin.mainnet=1 +bitcoin.node=neutrino + +[Neutrino] +neutrino.connect=btcd-mainnet.lightning.computer +neutrino.feeurl=https://nodes.lightning.computer/fees/v1/btc-fee-estimates.json + +[autopilot] +autopilot.active=0 +autopilot.private=1 +autopilot.minconfs=1 +autopilot.conftarget=3 +autopilot.allocation=1.0 +autopilot.heuristic=externalscore:0.95 +autopilot.heuristic=preferential:0.05 + +""" + } else if (chain == "testnet") { + str = +""" +[Application Options] +debuglevel=info +maxbackoff=2s +norest=1 +sync-freelist=1 +accept-keysend=1 + +[Routing] +routing.assumechanvalid=1 + +[Bitcoin] +bitcoin.active=1 +bitcoin.testnet=1 +bitcoin.node=neutrino + +[Neutrino] +neutrino.connect=btcd-testnet.lightning.computer +neutrino.feeurl=https://nodes.lightning.computer/fees/v1/btc-fee-estimates.json + +[autopilot] +autopilot.active=0 +autopilot.private=1 +autopilot.minconfs=1 +autopilot.conftarget=3 +autopilot.allocation=1.0 +autopilot.heuristic=externalscore:0.95 +autopilot.heuristic=preferential:0.05 + +""" + } else if (chain == "regtest") { + str = +""" +[Application Options] +debuglevel=info +maxbackoff=2s +norest=1 +sync-freelist=1 +accept-keysend=1 + +[Routing] +routing.assumechanvalid=1 + +[Bitcoin] +bitcoin.active=1 +bitcoin.regtest=1 +bitcoin.node=bitcoind + +[Bitcoind] +bitcoind.rpchost=192.168.1.113:18443 +bitcoind.rpcuser=polaruser +bitcoind.rpcpass=polarpass +bitcoind.zmqpubrawblock=192.168.1.113:28334 +bitcoind.zmqpubrawtx=192.168.1.113:29335 + +[autopilot] +autopilot.active=0 +autopilot.private=1 +autopilot.minconfs=1 +autopilot.conftarget=3 +autopilot.allocation=1.0 +autopilot.heuristic=externalscore:0.95 +autopilot.heuristic=preferential:0.05 + +""" + } + + do { + let paths = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask) + let url = paths[0].appendingPathComponent("lnd", isDirectory: true).appendingPathComponent("lnd.conf", isDirectory: false) + + try str.write(to: url, atomically: true, encoding: .utf8) + let input = try String(contentsOf: url) + NSLog("Read config: " + input) + resolve("Config written") + } catch let error { + NSLog(error.localizedDescription) + reject("error", error.localizedDescription, error) + } + } + + @objc(log:tag:msg:) + func log(level: String, tag: String, msg: String) { + NSLog("[" + tag + "] " + msg) + } + + @objc(DEBUG_getWalletPasswordFromKeychain:rejecter:) + func DEBUG_getWalletPasswordFromKeychain(resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) { + let server = "password" + + let query = [ + kSecClass as String: kSecClassInternetPassword, + kSecAttrServer as String: server, + kSecReturnAttributes as String: kCFBooleanTrue!, + kSecReturnData as String: kCFBooleanTrue!, + kSecMatchLimit as String: kSecMatchLimitOne as String + ] as CFDictionary + + var result: AnyObject? + let osStatus = SecItemCopyMatching(query, &result) + if osStatus != noErr && osStatus != errSecItemNotFound { + let error = NSError(domain: NSOSStatusErrorDomain, code: Int(osStatus), userInfo: nil) + return reject("error", error.localizedDescription, error) + } else if (result == nil) { + return resolve(NSNumber(value: false)) + } + + if let passwordData = result![kSecValueData] as? Data { + let password = String(data: passwordData, encoding: .utf8) + return resolve(password) + } + } + + @objc(getTorEnabled:rejecter:) + func getTorEnabled(resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) { + // let asyncStorage = self.bridge.module(forClass: RNCAsyncStorage.self) + let asyncStorage = RNCAsyncStorage.init() + + asyncStorage.methodQueue.async { + asyncStorage.multiGet(["torEnabled"], callback: { (result) in + if let result = result { + let count = result[0] + if count is Error { + let error = count as! Error + reject("error", error.localizedDescription, error) + return + } + + if let values = result[1] as? [[String]] { + if let first = values[0] as [String]? { + resolve(first[1]) + } + } + } + }) + } + } + + @objc(saveChannelsBackup:resolver:rejecter:) + func saveChannelsBackup(base64Backups: String, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) { + DispatchQueue.main.async { + // let data = Data(base64Encoded: base64Backups, options: []) + let activityController = UIActivityViewController(activityItems: [base64Backups], applicationActivities: nil) + RCTSharedApplication()?.delegate?.window??.rootViewController?.present(activityController, animated: true, completion: { + resolve(true) + }) + } + } + + @objc(checkICloudEnabled:rejecter:) + func checkICloudEnabled(resolver resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) { + let token = FileManager.default.ubiquityIdentityToken + resolve(token != nil) + } + + @objc(DEBUG_listFilesInDocuments:rejecter:) + func DEBUG_listFilesInDocuments(resolver resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) { + let fileManager = FileManager.default + let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask)[0] + do { + let fileURLs = try fileManager.contentsOfDirectory(at: documentsURL, includingPropertiesForKeys: nil) + print(fileURLs) + resolve(fileURLs.description) + } catch { + print("Error while enumerating files \(documentsURL.path): \(error.localizedDescription)") + reject("error", error.localizedDescription, error) + } + } + + @objc(DEBUG_listFilesInApplicationSupport:rejecter:) + func DEBUG_listFilesInApplicationSupport(resolver resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) { + let fileManager = FileManager.default + let applicationSupportUrl = fileManager.urls(for: .applicationSupportDirectory, in: .userDomainMask)[0] + let lndUrl = applicationSupportUrl.appendingPathComponent("lnd") + do { + let fileURLs = try fileManager.contentsOfDirectory(at: lndUrl, includingPropertiesForKeys: nil) + // process files + print(fileURLs) + resolve(fileURLs.description) + } catch { + print("Error while enumerating files \(lndUrl.path): \(error.localizedDescription)") + reject("error", error.localizedDescription, error) + } + } + + @objc(checkApplicationSupportExists:rejecter:) + func checkApplicationSupportExists(resolver resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) { + let applicationSupport = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first! + resolve(FileManager.default.fileExists(atPath: applicationSupport.path)) + } + + @objc(checkLndFolderExists:rejecter:) + func checkLndFolderExists(resolver resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) { + let applicationSupport = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first! + let lndFolder = applicationSupport.appendingPathComponent("lnd", isDirectory: true) + resolve(FileManager.default.fileExists(atPath: lndFolder.path)) + } + + @objc(createIOSApplicationSupportAndLndDirectories:rejecter:) + func createIOSApplicationSupportAndLndDirectories(resolver resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) { + do { +// try FileManager.default.url( +// for: .applicationSupportDirectory, +// in: .userDomainMask, +// appropriateFor: nil, +// create: true +// ) + let applicationSupport = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first! + let lndFolder = applicationSupport.appendingPathComponent("lnd", isDirectory: true) + // This will create the lnd folder as well as "Application Support" + try FileManager.default.createDirectory(at: lndFolder, withIntermediateDirectories: true) + + resolve(true) + } catch let error { + reject("error", error.localizedDescription, error) + } + } + + @objc(excludeLndICloudBackup:rejecter:) + func excludeLndICloudBackup(resolver resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) { + let applicationSupport = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first! + var lndFolder = applicationSupport.appendingPathComponent("lnd", isDirectory: true) + + do { + if FileManager.default.fileExists(atPath: lndFolder.path) { + var resourceValues = URLResourceValues() + resourceValues.isExcludedFromBackup = true + try lndFolder.setResourceValues(resourceValues) + resolve(true) + } else { + let error = LndMobileToolsError(msg: "lnd path " + lndFolder.path + " doesn't exist") + reject("error", error.localizedDescription, error) + } + } catch let error { + print("failed setting isExcludedFromBackup: \(error)") + reject("error", error.localizedDescription, error) + } + } + + @objc(TEMP_moveLndToApplicationSupport:rejecter:) + func TEMP_moveLndToApplicationSupport(resolver resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) { + let documents = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! + let applicationSupport = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first! + + let newLndFolder = applicationSupport.appendingPathComponent("lnd", isDirectory: true) + + let lndData = documents.appendingPathComponent("data", isDirectory: true) + let lndConfig = documents.appendingPathComponent("lnd.conf") + + let newlndDataPath = newLndFolder.appendingPathComponent("data") + let newLndConfigPath = newLndFolder.appendingPathComponent("lnd.conf") + + NSLog("FROM: \(lndData.path)") + NSLog("TO: \(newlndDataPath.path)") + + do { + if FileManager.default.fileExists(atPath: newLndFolder.path) { + try FileManager.default.moveItem(at: lndData, to: newlndDataPath) + try FileManager.default.moveItem(at: lndConfig, to: newLndConfigPath) + resolve(true) + } else { + let error = LndMobileToolsError(msg: "lnd path \(newLndFolder.path) doesn't exist") + reject("error", error.localizedDescription, error) + } + } catch let error { + NSLog("Failed moving lnd files: \(error)") + reject("error", error.localizedDescription, error) + } + } +} diff --git a/ios/LndMobile/rpc.pb.swift b/ios/LndMobile/rpc.pb.swift new file mode 100644 index 000000000..b0ee449ce --- /dev/null +++ b/ios/LndMobile/rpc.pb.swift @@ -0,0 +1,15267 @@ +// DO NOT EDIT. +// swift-format-ignore-file +// +// Generated by the Swift generator plugin for the protocol buffer compiler. +// Source: rpc.proto +// +// For information on using the generated types, please see the documentation: +// https://github.com/apple/swift-protobuf/ + +import Foundation +import SwiftProtobuf + +// If the compiler emits an error on this type, it is because this file +// was generated by a version of the `protoc` Swift plug-in that is +// incompatible with the version of SwiftProtobuf to which you are linking. +// Please ensure that you are building against the same version of the API +// that was used to generate this file. +fileprivate struct _GeneratedWithProtocGenSwiftVersion: SwiftProtobuf.ProtobufAPIVersionCheck { + struct _2: SwiftProtobuf.ProtobufAPIVersion_2 {} + typealias Version = _2 +} + +/// +///`AddressType` has to be one of: +/// +///- `p2wkh`: Pay to witness key hash (`WITNESS_PUBKEY_HASH` = 0) +///- `np2wkh`: Pay to nested witness key hash (`NESTED_PUBKEY_HASH` = 1) +enum Lnrpc_AddressType: SwiftProtobuf.Enum { + typealias RawValue = Int + case witnessPubkeyHash // = 0 + case nestedPubkeyHash // = 1 + case unusedWitnessPubkeyHash // = 2 + case unusedNestedPubkeyHash // = 3 + case UNRECOGNIZED(Int) + + init() { + self = .witnessPubkeyHash + } + + init?(rawValue: Int) { + switch rawValue { + case 0: self = .witnessPubkeyHash + case 1: self = .nestedPubkeyHash + case 2: self = .unusedWitnessPubkeyHash + case 3: self = .unusedNestedPubkeyHash + default: self = .UNRECOGNIZED(rawValue) + } + } + + var rawValue: Int { + switch self { + case .witnessPubkeyHash: return 0 + case .nestedPubkeyHash: return 1 + case .unusedWitnessPubkeyHash: return 2 + case .unusedNestedPubkeyHash: return 3 + case .UNRECOGNIZED(let i): return i + } + } + +} + +#if swift(>=4.2) + +extension Lnrpc_AddressType: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + static var allCases: [Lnrpc_AddressType] = [ + .witnessPubkeyHash, + .nestedPubkeyHash, + .unusedWitnessPubkeyHash, + .unusedNestedPubkeyHash, + ] +} + +#endif // swift(>=4.2) + +enum Lnrpc_CommitmentType: SwiftProtobuf.Enum { + typealias RawValue = Int + + /// + ///A channel using the legacy commitment format having tweaked to_remote + ///keys. + case legacy // = 0 + + /// + ///A channel that uses the modern commitment format where the key in the + ///output of the remote party does not change each state. This makes back + ///up and recovery easier as when the channel is closed, the funds go + ///directly to that key. + case staticRemoteKey // = 1 + + /// + ///A channel that uses a commitment format that has anchor outputs on the + ///commitments, allowing fee bumping after a force close transaction has + ///been broadcast. + case anchors // = 2 + + /// + ///Returned when the commitment type isn't known or unavailable. + case unknownCommitmentType // = 999 + case UNRECOGNIZED(Int) + + init() { + self = .legacy + } + + init?(rawValue: Int) { + switch rawValue { + case 0: self = .legacy + case 1: self = .staticRemoteKey + case 2: self = .anchors + case 999: self = .unknownCommitmentType + default: self = .UNRECOGNIZED(rawValue) + } + } + + var rawValue: Int { + switch self { + case .legacy: return 0 + case .staticRemoteKey: return 1 + case .anchors: return 2 + case .unknownCommitmentType: return 999 + case .UNRECOGNIZED(let i): return i + } + } + +} + +#if swift(>=4.2) + +extension Lnrpc_CommitmentType: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + static var allCases: [Lnrpc_CommitmentType] = [ + .legacy, + .staticRemoteKey, + .anchors, + .unknownCommitmentType, + ] +} + +#endif // swift(>=4.2) + +enum Lnrpc_Initiator: SwiftProtobuf.Enum { + typealias RawValue = Int + case unknown // = 0 + case local // = 1 + case remote // = 2 + case both // = 3 + case UNRECOGNIZED(Int) + + init() { + self = .unknown + } + + init?(rawValue: Int) { + switch rawValue { + case 0: self = .unknown + case 1: self = .local + case 2: self = .remote + case 3: self = .both + default: self = .UNRECOGNIZED(rawValue) + } + } + + var rawValue: Int { + switch self { + case .unknown: return 0 + case .local: return 1 + case .remote: return 2 + case .both: return 3 + case .UNRECOGNIZED(let i): return i + } + } + +} + +#if swift(>=4.2) + +extension Lnrpc_Initiator: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + static var allCases: [Lnrpc_Initiator] = [ + .unknown, + .local, + .remote, + .both, + ] +} + +#endif // swift(>=4.2) + +enum Lnrpc_ResolutionType: SwiftProtobuf.Enum { + typealias RawValue = Int + case typeUnknown // = 0 + + /// We resolved an anchor output. + case anchor // = 1 + + /// + ///We are resolving an incoming htlc on chain. This if this htlc is + ///claimed, we swept the incoming htlc with the preimage. If it is timed + ///out, our peer swept the timeout path. + case incomingHtlc // = 2 + + /// + ///We are resolving an outgoing htlc on chain. If this htlc is claimed, + ///the remote party swept the htlc with the preimage. If it is timed out, + ///we swept it with the timeout path. + case outgoingHtlc // = 3 + + /// We force closed and need to sweep our time locked commitment output. + case commit // = 4 + case UNRECOGNIZED(Int) + + init() { + self = .typeUnknown + } + + init?(rawValue: Int) { + switch rawValue { + case 0: self = .typeUnknown + case 1: self = .anchor + case 2: self = .incomingHtlc + case 3: self = .outgoingHtlc + case 4: self = .commit + default: self = .UNRECOGNIZED(rawValue) + } + } + + var rawValue: Int { + switch self { + case .typeUnknown: return 0 + case .anchor: return 1 + case .incomingHtlc: return 2 + case .outgoingHtlc: return 3 + case .commit: return 4 + case .UNRECOGNIZED(let i): return i + } + } + +} + +#if swift(>=4.2) + +extension Lnrpc_ResolutionType: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + static var allCases: [Lnrpc_ResolutionType] = [ + .typeUnknown, + .anchor, + .incomingHtlc, + .outgoingHtlc, + .commit, + ] +} + +#endif // swift(>=4.2) + +enum Lnrpc_ResolutionOutcome: SwiftProtobuf.Enum { + typealias RawValue = Int + + /// Outcome unknown. + case outcomeUnknown // = 0 + + /// An output was claimed on chain. + case claimed // = 1 + + /// An output was left unclaimed on chain. + case unclaimed // = 2 + + /// + ///ResolverOutcomeAbandoned indicates that an output that we did not + ///claim on chain, for example an anchor that we did not sweep and a + ///third party claimed on chain, or a htlc that we could not decode + ///so left unclaimed. + case abandoned // = 3 + + /// + ///If we force closed our channel, our htlcs need to be claimed in two + ///stages. This outcome represents the broadcast of a timeout or success + ///transaction for this two stage htlc claim. + case firstStage // = 4 + + /// A htlc was timed out on chain. + case timeout // = 5 + case UNRECOGNIZED(Int) + + init() { + self = .outcomeUnknown + } + + init?(rawValue: Int) { + switch rawValue { + case 0: self = .outcomeUnknown + case 1: self = .claimed + case 2: self = .unclaimed + case 3: self = .abandoned + case 4: self = .firstStage + case 5: self = .timeout + default: self = .UNRECOGNIZED(rawValue) + } + } + + var rawValue: Int { + switch self { + case .outcomeUnknown: return 0 + case .claimed: return 1 + case .unclaimed: return 2 + case .abandoned: return 3 + case .firstStage: return 4 + case .timeout: return 5 + case .UNRECOGNIZED(let i): return i + } + } + +} + +#if swift(>=4.2) + +extension Lnrpc_ResolutionOutcome: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + static var allCases: [Lnrpc_ResolutionOutcome] = [ + .outcomeUnknown, + .claimed, + .unclaimed, + .abandoned, + .firstStage, + .timeout, + ] +} + +#endif // swift(>=4.2) + +enum Lnrpc_NodeMetricType: SwiftProtobuf.Enum { + typealias RawValue = Int + case unknown // = 0 + case betweennessCentrality // = 1 + case UNRECOGNIZED(Int) + + init() { + self = .unknown + } + + init?(rawValue: Int) { + switch rawValue { + case 0: self = .unknown + case 1: self = .betweennessCentrality + default: self = .UNRECOGNIZED(rawValue) + } + } + + var rawValue: Int { + switch self { + case .unknown: return 0 + case .betweennessCentrality: return 1 + case .UNRECOGNIZED(let i): return i + } + } + +} + +#if swift(>=4.2) + +extension Lnrpc_NodeMetricType: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + static var allCases: [Lnrpc_NodeMetricType] = [ + .unknown, + .betweennessCentrality, + ] +} + +#endif // swift(>=4.2) + +enum Lnrpc_InvoiceHTLCState: SwiftProtobuf.Enum { + typealias RawValue = Int + case accepted // = 0 + case settled // = 1 + case canceled // = 2 + case UNRECOGNIZED(Int) + + init() { + self = .accepted + } + + init?(rawValue: Int) { + switch rawValue { + case 0: self = .accepted + case 1: self = .settled + case 2: self = .canceled + default: self = .UNRECOGNIZED(rawValue) + } + } + + var rawValue: Int { + switch self { + case .accepted: return 0 + case .settled: return 1 + case .canceled: return 2 + case .UNRECOGNIZED(let i): return i + } + } + +} + +#if swift(>=4.2) + +extension Lnrpc_InvoiceHTLCState: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + static var allCases: [Lnrpc_InvoiceHTLCState] = [ + .accepted, + .settled, + .canceled, + ] +} + +#endif // swift(>=4.2) + +enum Lnrpc_PaymentFailureReason: SwiftProtobuf.Enum { + typealias RawValue = Int + + /// + ///Payment isn't failed (yet). + case failureReasonNone // = 0 + + /// + ///There are more routes to try, but the payment timeout was exceeded. + case failureReasonTimeout // = 1 + + /// + ///All possible routes were tried and failed permanently. Or were no + ///routes to the destination at all. + case failureReasonNoRoute // = 2 + + /// + ///A non-recoverable error has occured. + case failureReasonError // = 3 + + /// + ///Payment details incorrect (unknown hash, invalid amt or + ///invalid final cltv delta) + case failureReasonIncorrectPaymentDetails // = 4 + + /// + ///Insufficient local balance. + case failureReasonInsufficientBalance // = 5 + case UNRECOGNIZED(Int) + + init() { + self = .failureReasonNone + } + + init?(rawValue: Int) { + switch rawValue { + case 0: self = .failureReasonNone + case 1: self = .failureReasonTimeout + case 2: self = .failureReasonNoRoute + case 3: self = .failureReasonError + case 4: self = .failureReasonIncorrectPaymentDetails + case 5: self = .failureReasonInsufficientBalance + default: self = .UNRECOGNIZED(rawValue) + } + } + + var rawValue: Int { + switch self { + case .failureReasonNone: return 0 + case .failureReasonTimeout: return 1 + case .failureReasonNoRoute: return 2 + case .failureReasonError: return 3 + case .failureReasonIncorrectPaymentDetails: return 4 + case .failureReasonInsufficientBalance: return 5 + case .UNRECOGNIZED(let i): return i + } + } + +} + +#if swift(>=4.2) + +extension Lnrpc_PaymentFailureReason: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + static var allCases: [Lnrpc_PaymentFailureReason] = [ + .failureReasonNone, + .failureReasonTimeout, + .failureReasonNoRoute, + .failureReasonError, + .failureReasonIncorrectPaymentDetails, + .failureReasonInsufficientBalance, + ] +} + +#endif // swift(>=4.2) + +enum Lnrpc_FeatureBit: SwiftProtobuf.Enum { + typealias RawValue = Int + case datalossProtectReq // = 0 + case datalossProtectOpt // = 1 + case initialRouingSync // = 3 + case upfrontShutdownScriptReq // = 4 + case upfrontShutdownScriptOpt // = 5 + case gossipQueriesReq // = 6 + case gossipQueriesOpt // = 7 + case tlvOnionReq // = 8 + case tlvOnionOpt // = 9 + case extGossipQueriesReq // = 10 + case extGossipQueriesOpt // = 11 + case staticRemoteKeyReq // = 12 + case staticRemoteKeyOpt // = 13 + case paymentAddrReq // = 14 + case paymentAddrOpt // = 15 + case mppReq // = 16 + case mppOpt // = 17 + case UNRECOGNIZED(Int) + + init() { + self = .datalossProtectReq + } + + init?(rawValue: Int) { + switch rawValue { + case 0: self = .datalossProtectReq + case 1: self = .datalossProtectOpt + case 3: self = .initialRouingSync + case 4: self = .upfrontShutdownScriptReq + case 5: self = .upfrontShutdownScriptOpt + case 6: self = .gossipQueriesReq + case 7: self = .gossipQueriesOpt + case 8: self = .tlvOnionReq + case 9: self = .tlvOnionOpt + case 10: self = .extGossipQueriesReq + case 11: self = .extGossipQueriesOpt + case 12: self = .staticRemoteKeyReq + case 13: self = .staticRemoteKeyOpt + case 14: self = .paymentAddrReq + case 15: self = .paymentAddrOpt + case 16: self = .mppReq + case 17: self = .mppOpt + default: self = .UNRECOGNIZED(rawValue) + } + } + + var rawValue: Int { + switch self { + case .datalossProtectReq: return 0 + case .datalossProtectOpt: return 1 + case .initialRouingSync: return 3 + case .upfrontShutdownScriptReq: return 4 + case .upfrontShutdownScriptOpt: return 5 + case .gossipQueriesReq: return 6 + case .gossipQueriesOpt: return 7 + case .tlvOnionReq: return 8 + case .tlvOnionOpt: return 9 + case .extGossipQueriesReq: return 10 + case .extGossipQueriesOpt: return 11 + case .staticRemoteKeyReq: return 12 + case .staticRemoteKeyOpt: return 13 + case .paymentAddrReq: return 14 + case .paymentAddrOpt: return 15 + case .mppReq: return 16 + case .mppOpt: return 17 + case .UNRECOGNIZED(let i): return i + } + } + +} + +#if swift(>=4.2) + +extension Lnrpc_FeatureBit: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + static var allCases: [Lnrpc_FeatureBit] = [ + .datalossProtectReq, + .datalossProtectOpt, + .initialRouingSync, + .upfrontShutdownScriptReq, + .upfrontShutdownScriptOpt, + .gossipQueriesReq, + .gossipQueriesOpt, + .tlvOnionReq, + .tlvOnionOpt, + .extGossipQueriesReq, + .extGossipQueriesOpt, + .staticRemoteKeyReq, + .staticRemoteKeyOpt, + .paymentAddrReq, + .paymentAddrOpt, + .mppReq, + .mppOpt, + ] +} + +#endif // swift(>=4.2) + +struct Lnrpc_Utxo { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The type of address + var addressType: Lnrpc_AddressType = .witnessPubkeyHash + + /// The address + var address: String = String() + + /// The value of the unspent coin in satoshis + var amountSat: Int64 = 0 + + /// The pkscript in hex + var pkScript: String = String() + + /// The outpoint in format txid:n + var outpoint: Lnrpc_OutPoint { + get {return _outpoint ?? Lnrpc_OutPoint()} + set {_outpoint = newValue} + } + /// Returns true if `outpoint` has been explicitly set. + var hasOutpoint: Bool {return self._outpoint != nil} + /// Clears the value of `outpoint`. Subsequent reads from it will return its default value. + mutating func clearOutpoint() {self._outpoint = nil} + + /// The number of confirmations for the Utxo + var confirmations: Int64 = 0 + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + + fileprivate var _outpoint: Lnrpc_OutPoint? = nil +} + +struct Lnrpc_Transaction { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The transaction hash + var txHash: String = String() + + /// The transaction amount, denominated in satoshis + var amount: Int64 = 0 + + /// The number of confirmations + var numConfirmations: Int32 = 0 + + /// The hash of the block this transaction was included in + var blockHash: String = String() + + /// The height of the block this transaction was included in + var blockHeight: Int32 = 0 + + /// Timestamp of this transaction + var timeStamp: Int64 = 0 + + /// Fees paid for this transaction + var totalFees: Int64 = 0 + + /// Addresses that received funds for this transaction + var destAddresses: [String] = [] + + /// The raw transaction hex. + var rawTxHex: String = String() + + /// A label that was optionally set on transaction broadcast. + var label: String = String() + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_GetTransactionsRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + ///The height from which to list transactions, inclusive. If this value is + ///greater than end_height, transactions will be read in reverse. + var startHeight: Int32 = 0 + + /// + ///The height until which to list transactions, inclusive. To include + ///unconfirmed transactions, this value should be set to -1, which will + ///return transactions from start_height until the current chain tip and + ///unconfirmed transactions. If no end_height is provided, the call will + ///default to this option. + var endHeight: Int32 = 0 + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_TransactionDetails { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The list of transactions relevant to the wallet. + var transactions: [Lnrpc_Transaction] = [] + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_FeeLimit { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var limit: Lnrpc_FeeLimit.OneOf_Limit? = nil + + /// + ///The fee limit expressed as a fixed amount of satoshis. + /// + ///The fields fixed and fixed_msat are mutually exclusive. + var fixed: Int64 { + get { + if case .fixed(let v)? = limit {return v} + return 0 + } + set {limit = .fixed(newValue)} + } + + /// + ///The fee limit expressed as a fixed amount of millisatoshis. + /// + ///The fields fixed and fixed_msat are mutually exclusive. + var fixedMsat: Int64 { + get { + if case .fixedMsat(let v)? = limit {return v} + return 0 + } + set {limit = .fixedMsat(newValue)} + } + + /// The fee limit expressed as a percentage of the payment amount. + var percent: Int64 { + get { + if case .percent(let v)? = limit {return v} + return 0 + } + set {limit = .percent(newValue)} + } + + var unknownFields = SwiftProtobuf.UnknownStorage() + + enum OneOf_Limit: Equatable { + /// + ///The fee limit expressed as a fixed amount of satoshis. + /// + ///The fields fixed and fixed_msat are mutually exclusive. + case fixed(Int64) + /// + ///The fee limit expressed as a fixed amount of millisatoshis. + /// + ///The fields fixed and fixed_msat are mutually exclusive. + case fixedMsat(Int64) + /// The fee limit expressed as a percentage of the payment amount. + case percent(Int64) + + #if !swift(>=4.1) + static func ==(lhs: Lnrpc_FeeLimit.OneOf_Limit, rhs: Lnrpc_FeeLimit.OneOf_Limit) -> Bool { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch (lhs, rhs) { + case (.fixed, .fixed): return { + guard case .fixed(let l) = lhs, case .fixed(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.fixedMsat, .fixedMsat): return { + guard case .fixedMsat(let l) = lhs, case .fixedMsat(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.percent, .percent): return { + guard case .percent(let l) = lhs, case .percent(let r) = rhs else { preconditionFailure() } + return l == r + }() + default: return false + } + } + #endif + } + + init() {} +} + +struct Lnrpc_SendRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + ///The identity pubkey of the payment recipient. When using REST, this field + ///must be encoded as base64. + var dest: Data = Data() + + /// + ///The hex-encoded identity pubkey of the payment recipient. Deprecated now + ///that the REST gateway supports base64 encoding of bytes fields. + var destString: String = String() + + /// + ///The amount to send expressed in satoshis. + /// + ///The fields amt and amt_msat are mutually exclusive. + var amt: Int64 = 0 + + /// + ///The amount to send expressed in millisatoshis. + /// + ///The fields amt and amt_msat are mutually exclusive. + var amtMsat: Int64 = 0 + + /// + ///The hash to use within the payment's HTLC. When using REST, this field + ///must be encoded as base64. + var paymentHash: Data = Data() + + /// + ///The hex-encoded hash to use within the payment's HTLC. Deprecated now + ///that the REST gateway supports base64 encoding of bytes fields. + var paymentHashString: String = String() + + /// + ///A bare-bones invoice for a payment within the Lightning Network. With the + ///details of the invoice, the sender has all the data necessary to send a + ///payment to the recipient. + var paymentRequest: String = String() + + /// + ///The CLTV delta from the current height that should be used to set the + ///timelock for the final hop. + var finalCltvDelta: Int32 = 0 + + /// + ///The maximum number of satoshis that will be paid as a fee of the payment. + ///This value can be represented either as a percentage of the amount being + ///sent, or as a fixed amount of the maximum fee the user is willing the pay to + ///send the payment. + var feeLimit: Lnrpc_FeeLimit { + get {return _feeLimit ?? Lnrpc_FeeLimit()} + set {_feeLimit = newValue} + } + /// Returns true if `feeLimit` has been explicitly set. + var hasFeeLimit: Bool {return self._feeLimit != nil} + /// Clears the value of `feeLimit`. Subsequent reads from it will return its default value. + mutating func clearFeeLimit() {self._feeLimit = nil} + + /// + ///The channel id of the channel that must be taken to the first hop. If zero, + ///any channel may be used. + var outgoingChanID: UInt64 = 0 + + /// + ///The pubkey of the last hop of the route. If empty, any hop may be used. + var lastHopPubkey: Data = Data() + + /// + ///An optional maximum total time lock for the route. This should not exceed + ///lnd's `--max-cltv-expiry` setting. If zero, then the value of + ///`--max-cltv-expiry` is enforced. + var cltvLimit: UInt32 = 0 + + /// + ///An optional field that can be used to pass an arbitrary set of TLV records + ///to a peer which understands the new records. This can be used to pass + ///application specific data during the payment attempt. Record types are + ///required to be in the custom range >= 65536. When using REST, the values + ///must be encoded as base64. + var destCustomRecords: Dictionary = [:] + + /// If set, circular payments to self are permitted. + var allowSelfPayment: Bool = false + + /// + ///Features assumed to be supported by the final node. All transitive feature + ///dependencies must also be set properly. For a given feature bit pair, either + ///optional or remote may be set, but not both. If this field is nil or empty, + ///the router will try to load destination features from the graph as a + ///fallback. + var destFeatures: [Lnrpc_FeatureBit] = [] + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + + fileprivate var _feeLimit: Lnrpc_FeeLimit? = nil +} + +struct Lnrpc_SendResponse { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var paymentError: String = String() + + var paymentPreimage: Data = Data() + + var paymentRoute: Lnrpc_Route { + get {return _paymentRoute ?? Lnrpc_Route()} + set {_paymentRoute = newValue} + } + /// Returns true if `paymentRoute` has been explicitly set. + var hasPaymentRoute: Bool {return self._paymentRoute != nil} + /// Clears the value of `paymentRoute`. Subsequent reads from it will return its default value. + mutating func clearPaymentRoute() {self._paymentRoute = nil} + + var paymentHash: Data = Data() + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + + fileprivate var _paymentRoute: Lnrpc_Route? = nil +} + +struct Lnrpc_SendToRouteRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + ///The payment hash to use for the HTLC. When using REST, this field must be + ///encoded as base64. + var paymentHash: Data = Data() + + /// + ///An optional hex-encoded payment hash to be used for the HTLC. Deprecated now + ///that the REST gateway supports base64 encoding of bytes fields. + var paymentHashString: String = String() + + /// Route that should be used to attempt to complete the payment. + var route: Lnrpc_Route { + get {return _route ?? Lnrpc_Route()} + set {_route = newValue} + } + /// Returns true if `route` has been explicitly set. + var hasRoute: Bool {return self._route != nil} + /// Clears the value of `route`. Subsequent reads from it will return its default value. + mutating func clearRoute() {self._route = nil} + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + + fileprivate var _route: Lnrpc_Route? = nil +} + +struct Lnrpc_ChannelAcceptRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The pubkey of the node that wishes to open an inbound channel. + var nodePubkey: Data = Data() + + /// The hash of the genesis block that the proposed channel resides in. + var chainHash: Data = Data() + + /// The pending channel id. + var pendingChanID: Data = Data() + + /// The funding amount in satoshis that initiator wishes to use in the + /// channel. + var fundingAmt: UInt64 = 0 + + /// The push amount of the proposed channel in millisatoshis. + var pushAmt: UInt64 = 0 + + /// The dust limit of the initiator's commitment tx. + var dustLimit: UInt64 = 0 + + /// The maximum amount of coins in millisatoshis that can be pending in this + /// channel. + var maxValueInFlight: UInt64 = 0 + + /// The minimum amount of satoshis the initiator requires us to have at all + /// times. + var channelReserve: UInt64 = 0 + + /// The smallest HTLC in millisatoshis that the initiator will accept. + var minHtlc: UInt64 = 0 + + /// The initial fee rate that the initiator suggests for both commitment + /// transactions. + var feePerKw: UInt64 = 0 + + /// + ///The number of blocks to use for the relative time lock in the pay-to-self + ///output of both commitment transactions. + var csvDelay: UInt32 = 0 + + /// The total number of incoming HTLC's that the initiator will accept. + var maxAcceptedHtlcs: UInt32 = 0 + + /// A bit-field which the initiator uses to specify proposed channel + /// behavior. + var channelFlags: UInt32 = 0 + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_ChannelAcceptResponse { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// Whether or not the client accepts the channel. + var accept: Bool = false + + /// The pending channel id to which this response applies. + var pendingChanID: Data = Data() + + /// + ///An optional error to send the initiating party to indicate why the channel + ///was rejected. This field *should not* contain sensitive information, it will + ///be sent to the initiating party. This field should only be set if accept is + ///false, the channel will be rejected if an error is set with accept=true + ///because the meaning of this response is ambiguous. Limited to 500 + ///characters. + var error: String = String() + + /// + ///The upfront shutdown address to use if the initiating peer supports option + ///upfront shutdown script (see ListPeers for the features supported). Note + ///that the channel open will fail if this value is set for a peer that does + ///not support this feature bit. + var upfrontShutdown: String = String() + + /// + ///The csv delay (in blocks) that we require for the remote party. + var csvDelay: UInt32 = 0 + + /// + ///The reserve amount in satoshis that we require the remote peer to adhere to. + ///We require that the remote peer always have some reserve amount allocated to + ///them so that there is always a disincentive to broadcast old state (if they + ///hold 0 sats on their side of the channel, there is nothing to lose). + var reserveSat: UInt64 = 0 + + /// + ///The maximum amount of funds in millisatoshis that we allow the remote peer + ///to have in outstanding htlcs. + var inFlightMaxMsat: UInt64 = 0 + + /// + ///The maximum number of htlcs that the remote peer can offer us. + var maxHtlcCount: UInt32 = 0 + + /// + ///The minimum value in millisatoshis for incoming htlcs on the channel. + var minHtlcIn: UInt64 = 0 + + /// + ///The number of confirmations we require before we consider the channel open. + var minAcceptDepth: UInt32 = 0 + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_ChannelPoint { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var fundingTxid: Lnrpc_ChannelPoint.OneOf_FundingTxid? = nil + + /// + ///Txid of the funding transaction. When using REST, this field must be + ///encoded as base64. + var fundingTxidBytes: Data { + get { + if case .fundingTxidBytes(let v)? = fundingTxid {return v} + return Data() + } + set {fundingTxid = .fundingTxidBytes(newValue)} + } + + /// + ///Hex-encoded string representing the byte-reversed hash of the funding + ///transaction. + var fundingTxidStr: String { + get { + if case .fundingTxidStr(let v)? = fundingTxid {return v} + return String() + } + set {fundingTxid = .fundingTxidStr(newValue)} + } + + /// The index of the output of the funding transaction + var outputIndex: UInt32 = 0 + + var unknownFields = SwiftProtobuf.UnknownStorage() + + enum OneOf_FundingTxid: Equatable { + /// + ///Txid of the funding transaction. When using REST, this field must be + ///encoded as base64. + case fundingTxidBytes(Data) + /// + ///Hex-encoded string representing the byte-reversed hash of the funding + ///transaction. + case fundingTxidStr(String) + + #if !swift(>=4.1) + static func ==(lhs: Lnrpc_ChannelPoint.OneOf_FundingTxid, rhs: Lnrpc_ChannelPoint.OneOf_FundingTxid) -> Bool { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch (lhs, rhs) { + case (.fundingTxidBytes, .fundingTxidBytes): return { + guard case .fundingTxidBytes(let l) = lhs, case .fundingTxidBytes(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.fundingTxidStr, .fundingTxidStr): return { + guard case .fundingTxidStr(let l) = lhs, case .fundingTxidStr(let r) = rhs else { preconditionFailure() } + return l == r + }() + default: return false + } + } + #endif + } + + init() {} +} + +struct Lnrpc_OutPoint { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// Raw bytes representing the transaction id. + var txidBytes: Data = Data() + + /// Reversed, hex-encoded string representing the transaction id. + var txidStr: String = String() + + /// The index of the output on the transaction. + var outputIndex: UInt32 = 0 + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_LightningAddress { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The identity pubkey of the Lightning node + var pubkey: String = String() + + /// The network location of the lightning node, e.g. `69.69.69.69:1337` or + /// `localhost:10011` + var host: String = String() + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_EstimateFeeRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The map from addresses to amounts for the transaction. + var addrToAmount: Dictionary = [:] + + /// The target number of blocks that this transaction should be confirmed + /// by. + var targetConf: Int32 = 0 + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_EstimateFeeResponse { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The total fee in satoshis. + var feeSat: Int64 = 0 + + /// The fee rate in satoshi/byte. + var feerateSatPerByte: Int64 = 0 + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_SendManyRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The map from addresses to amounts + var addrToAmount: Dictionary = [:] + + /// The target number of blocks that this transaction should be confirmed + /// by. + var targetConf: Int32 = 0 + + /// A manual fee rate set in sat/byte that should be used when crafting the + /// transaction. + var satPerByte: Int64 = 0 + + /// An optional label for the transaction, limited to 500 characters. + var label: String = String() + + /// The minimum number of confirmations each one of your outputs used for + /// the transaction must satisfy. + var minConfs: Int32 = 0 + + /// Whether unconfirmed outputs should be used as inputs for the transaction. + var spendUnconfirmed: Bool = false + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_SendManyResponse { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The id of the transaction + var txid: String = String() + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_SendCoinsRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The address to send coins to + var addr: String = String() + + /// The amount in satoshis to send + var amount: Int64 = 0 + + /// The target number of blocks that this transaction should be confirmed + /// by. + var targetConf: Int32 = 0 + + /// A manual fee rate set in sat/byte that should be used when crafting the + /// transaction. + var satPerByte: Int64 = 0 + + /// + ///If set, then the amount field will be ignored, and lnd will attempt to + ///send all the coins under control of the internal wallet to the specified + ///address. + var sendAll: Bool = false + + /// An optional label for the transaction, limited to 500 characters. + var label: String = String() + + /// The minimum number of confirmations each one of your outputs used for + /// the transaction must satisfy. + var minConfs: Int32 = 0 + + /// Whether unconfirmed outputs should be used as inputs for the transaction. + var spendUnconfirmed: Bool = false + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_SendCoinsResponse { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The transaction ID of the transaction + var txid: String = String() + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_ListUnspentRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The minimum number of confirmations to be included. + var minConfs: Int32 = 0 + + /// The maximum number of confirmations to be included. + var maxConfs: Int32 = 0 + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_ListUnspentResponse { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// A list of utxos + var utxos: [Lnrpc_Utxo] = [] + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_NewAddressRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The address type + var type: Lnrpc_AddressType = .witnessPubkeyHash + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_NewAddressResponse { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The newly generated wallet address + var address: String = String() + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_SignMessageRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + ///The message to be signed. When using REST, this field must be encoded as + ///base64. + var msg: Data = Data() + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_SignMessageResponse { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The signature for the given message + var signature: String = String() + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_VerifyMessageRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + ///The message over which the signature is to be verified. When using REST, + ///this field must be encoded as base64. + var msg: Data = Data() + + /// The signature to be verified over the given message + var signature: String = String() + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_VerifyMessageResponse { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// Whether the signature was valid over the given message + var valid: Bool = false + + /// The pubkey recovered from the signature + var pubkey: String = String() + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_ConnectPeerRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// Lightning address of the peer, in the format `@host` + var addr: Lnrpc_LightningAddress { + get {return _addr ?? Lnrpc_LightningAddress()} + set {_addr = newValue} + } + /// Returns true if `addr` has been explicitly set. + var hasAddr: Bool {return self._addr != nil} + /// Clears the value of `addr`. Subsequent reads from it will return its default value. + mutating func clearAddr() {self._addr = nil} + + /// If set, the daemon will attempt to persistently connect to the target + /// peer. Otherwise, the call will be synchronous. + var perm: Bool = false + + /// + ///The connection timeout value (in seconds) for this request. It won't affect + ///other requests. + var timeout: UInt64 = 0 + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + + fileprivate var _addr: Lnrpc_LightningAddress? = nil +} + +struct Lnrpc_ConnectPeerResponse { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_DisconnectPeerRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The pubkey of the node to disconnect from + var pubKey: String = String() + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_DisconnectPeerResponse { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_HTLC { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var incoming: Bool = false + + var amount: Int64 = 0 + + var hashLock: Data = Data() + + var expirationHeight: UInt32 = 0 + + /// Index identifying the htlc on the channel. + var htlcIndex: UInt64 = 0 + + /// If this HTLC is involved in a forwarding operation, this field indicates + /// the forwarding channel. For an outgoing htlc, it is the incoming channel. + /// For an incoming htlc, it is the outgoing channel. When the htlc + /// originates from this node or this node is the final destination, + /// forwarding_channel will be zero. The forwarding channel will also be zero + /// for htlcs that need to be forwarded but don't have a forwarding decision + /// persisted yet. + var forwardingChannel: UInt64 = 0 + + /// Index identifying the htlc on the forwarding channel. + var forwardingHtlcIndex: UInt64 = 0 + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_ChannelConstraints { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + ///The CSV delay expressed in relative blocks. If the channel is force closed, + ///we will need to wait for this many blocks before we can regain our funds. + var csvDelay: UInt32 = 0 + + /// The minimum satoshis this node is required to reserve in its balance. + var chanReserveSat: UInt64 = 0 + + /// The dust limit (in satoshis) of the initiator's commitment tx. + var dustLimitSat: UInt64 = 0 + + /// The maximum amount of coins in millisatoshis that can be pending in this + /// channel. + var maxPendingAmtMsat: UInt64 = 0 + + /// The smallest HTLC in millisatoshis that the initiator will accept. + var minHtlcMsat: UInt64 = 0 + + /// The total number of incoming HTLC's that the initiator will accept. + var maxAcceptedHtlcs: UInt32 = 0 + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_Channel { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// Whether this channel is active or not + var active: Bool { + get {return _storage._active} + set {_uniqueStorage()._active = newValue} + } + + /// The identity pubkey of the remote node + var remotePubkey: String { + get {return _storage._remotePubkey} + set {_uniqueStorage()._remotePubkey = newValue} + } + + /// + ///The outpoint (txid:index) of the funding transaction. With this value, Bob + ///will be able to generate a signature for Alice's version of the commitment + ///transaction. + var channelPoint: String { + get {return _storage._channelPoint} + set {_uniqueStorage()._channelPoint = newValue} + } + + /// + ///The unique channel ID for the channel. The first 3 bytes are the block + ///height, the next 3 the index within the block, and the last 2 bytes are the + ///output index for the channel. + var chanID: UInt64 { + get {return _storage._chanID} + set {_uniqueStorage()._chanID = newValue} + } + + /// The total amount of funds held in this channel + var capacity: Int64 { + get {return _storage._capacity} + set {_uniqueStorage()._capacity = newValue} + } + + /// This node's current balance in this channel + var localBalance: Int64 { + get {return _storage._localBalance} + set {_uniqueStorage()._localBalance = newValue} + } + + /// The counterparty's current balance in this channel + var remoteBalance: Int64 { + get {return _storage._remoteBalance} + set {_uniqueStorage()._remoteBalance = newValue} + } + + /// + ///The amount calculated to be paid in fees for the current set of commitment + ///transactions. The fee amount is persisted with the channel in order to + ///allow the fee amount to be removed and recalculated with each channel state + ///update, including updates that happen after a system restart. + var commitFee: Int64 { + get {return _storage._commitFee} + set {_uniqueStorage()._commitFee = newValue} + } + + /// The weight of the commitment transaction + var commitWeight: Int64 { + get {return _storage._commitWeight} + set {_uniqueStorage()._commitWeight = newValue} + } + + /// + ///The required number of satoshis per kilo-weight that the requester will pay + ///at all times, for both the funding transaction and commitment transaction. + ///This value can later be updated once the channel is open. + var feePerKw: Int64 { + get {return _storage._feePerKw} + set {_uniqueStorage()._feePerKw = newValue} + } + + /// The unsettled balance in this channel + var unsettledBalance: Int64 { + get {return _storage._unsettledBalance} + set {_uniqueStorage()._unsettledBalance = newValue} + } + + /// + ///The total number of satoshis we've sent within this channel. + var totalSatoshisSent: Int64 { + get {return _storage._totalSatoshisSent} + set {_uniqueStorage()._totalSatoshisSent = newValue} + } + + /// + ///The total number of satoshis we've received within this channel. + var totalSatoshisReceived: Int64 { + get {return _storage._totalSatoshisReceived} + set {_uniqueStorage()._totalSatoshisReceived = newValue} + } + + /// + ///The total number of updates conducted within this channel. + var numUpdates: UInt64 { + get {return _storage._numUpdates} + set {_uniqueStorage()._numUpdates = newValue} + } + + /// + ///The list of active, uncleared HTLCs currently pending within the channel. + var pendingHtlcs: [Lnrpc_HTLC] { + get {return _storage._pendingHtlcs} + set {_uniqueStorage()._pendingHtlcs = newValue} + } + + /// + ///Deprecated. The CSV delay expressed in relative blocks. If the channel is + ///force closed, we will need to wait for this many blocks before we can regain + ///our funds. + var csvDelay: UInt32 { + get {return _storage._csvDelay} + set {_uniqueStorage()._csvDelay = newValue} + } + + /// Whether this channel is advertised to the network or not. + var `private`: Bool { + get {return _storage._private} + set {_uniqueStorage()._private = newValue} + } + + /// True if we were the ones that created the channel. + var initiator: Bool { + get {return _storage._initiator} + set {_uniqueStorage()._initiator = newValue} + } + + /// A set of flags showing the current state of the channel. + var chanStatusFlags: String { + get {return _storage._chanStatusFlags} + set {_uniqueStorage()._chanStatusFlags = newValue} + } + + /// Deprecated. The minimum satoshis this node is required to reserve in its + /// balance. + var localChanReserveSat: Int64 { + get {return _storage._localChanReserveSat} + set {_uniqueStorage()._localChanReserveSat = newValue} + } + + /// + ///Deprecated. The minimum satoshis the other node is required to reserve in + ///its balance. + var remoteChanReserveSat: Int64 { + get {return _storage._remoteChanReserveSat} + set {_uniqueStorage()._remoteChanReserveSat = newValue} + } + + /// Deprecated. Use commitment_type. + var staticRemoteKey: Bool { + get {return _storage._staticRemoteKey} + set {_uniqueStorage()._staticRemoteKey = newValue} + } + + /// The commitment type used by this channel. + var commitmentType: Lnrpc_CommitmentType { + get {return _storage._commitmentType} + set {_uniqueStorage()._commitmentType = newValue} + } + + /// + ///The number of seconds that the channel has been monitored by the channel + ///scoring system. Scores are currently not persisted, so this value may be + ///less than the lifetime of the channel [EXPERIMENTAL]. + var lifetime: Int64 { + get {return _storage._lifetime} + set {_uniqueStorage()._lifetime = newValue} + } + + /// + ///The number of seconds that the remote peer has been observed as being online + ///by the channel scoring system over the lifetime of the channel + ///[EXPERIMENTAL]. + var uptime: Int64 { + get {return _storage._uptime} + set {_uniqueStorage()._uptime = newValue} + } + + /// + ///Close address is the address that we will enforce payout to on cooperative + ///close if the channel was opened utilizing option upfront shutdown. This + ///value can be set on channel open by setting close_address in an open channel + ///request. If this value is not set, you can still choose a payout address by + ///cooperatively closing with the delivery_address field set. + var closeAddress: String { + get {return _storage._closeAddress} + set {_uniqueStorage()._closeAddress = newValue} + } + + /// + ///The amount that the initiator of the channel optionally pushed to the remote + ///party on channel open. This amount will be zero if the channel initiator did + ///not push any funds to the remote peer. If the initiator field is true, we + ///pushed this amount to our peer, if it is false, the remote peer pushed this + ///amount to us. + var pushAmountSat: UInt64 { + get {return _storage._pushAmountSat} + set {_uniqueStorage()._pushAmountSat = newValue} + } + + /// + ///This uint32 indicates if this channel is to be considered 'frozen'. A + ///frozen channel doest not allow a cooperative channel close by the + ///initiator. The thaw_height is the height that this restriction stops + ///applying to the channel. This field is optional, not setting it or using a + ///value of zero will mean the channel has no additional restrictions. The + ///height can be interpreted in two ways: as a relative height if the value is + ///less than 500,000, or as an absolute height otherwise. + var thawHeight: UInt32 { + get {return _storage._thawHeight} + set {_uniqueStorage()._thawHeight = newValue} + } + + /// List constraints for the local node. + var localConstraints: Lnrpc_ChannelConstraints { + get {return _storage._localConstraints ?? Lnrpc_ChannelConstraints()} + set {_uniqueStorage()._localConstraints = newValue} + } + /// Returns true if `localConstraints` has been explicitly set. + var hasLocalConstraints: Bool {return _storage._localConstraints != nil} + /// Clears the value of `localConstraints`. Subsequent reads from it will return its default value. + mutating func clearLocalConstraints() {_uniqueStorage()._localConstraints = nil} + + /// List constraints for the remote node. + var remoteConstraints: Lnrpc_ChannelConstraints { + get {return _storage._remoteConstraints ?? Lnrpc_ChannelConstraints()} + set {_uniqueStorage()._remoteConstraints = newValue} + } + /// Returns true if `remoteConstraints` has been explicitly set. + var hasRemoteConstraints: Bool {return _storage._remoteConstraints != nil} + /// Clears the value of `remoteConstraints`. Subsequent reads from it will return its default value. + mutating func clearRemoteConstraints() {_uniqueStorage()._remoteConstraints = nil} + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + + fileprivate var _storage = _StorageClass.defaultInstance +} + +struct Lnrpc_ListChannelsRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var activeOnly: Bool = false + + var inactiveOnly: Bool = false + + var publicOnly: Bool = false + + var privateOnly: Bool = false + + /// + ///Filters the response for channels with a target peer's pubkey. If peer is + ///empty, all channels will be returned. + var peer: Data = Data() + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_ListChannelsResponse { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The list of active channels + var channels: [Lnrpc_Channel] = [] + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_ChannelCloseSummary { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The outpoint (txid:index) of the funding transaction. + var channelPoint: String = String() + + /// The unique channel ID for the channel. + var chanID: UInt64 = 0 + + /// The hash of the genesis block that this channel resides within. + var chainHash: String = String() + + /// The txid of the transaction which ultimately closed this channel. + var closingTxHash: String = String() + + /// Public key of the remote peer that we formerly had a channel with. + var remotePubkey: String = String() + + /// Total capacity of the channel. + var capacity: Int64 = 0 + + /// Height at which the funding transaction was spent. + var closeHeight: UInt32 = 0 + + /// Settled balance at the time of channel closure + var settledBalance: Int64 = 0 + + /// The sum of all the time-locked outputs at the time of channel closure + var timeLockedBalance: Int64 = 0 + + /// Details on how the channel was closed. + var closeType: Lnrpc_ChannelCloseSummary.ClosureType = .cooperativeClose + + /// + ///Open initiator is the party that initiated opening the channel. Note that + ///this value may be unknown if the channel was closed before we migrated to + ///store open channel information after close. + var openInitiator: Lnrpc_Initiator = .unknown + + /// + ///Close initiator indicates which party initiated the close. This value will + ///be unknown for channels that were cooperatively closed before we started + ///tracking cooperative close initiators. Note that this indicates which party + ///initiated a close, and it is possible for both to initiate cooperative or + ///force closes, although only one party's close will be confirmed on chain. + var closeInitiator: Lnrpc_Initiator = .unknown + + var resolutions: [Lnrpc_Resolution] = [] + + var unknownFields = SwiftProtobuf.UnknownStorage() + + enum ClosureType: SwiftProtobuf.Enum { + typealias RawValue = Int + case cooperativeClose // = 0 + case localForceClose // = 1 + case remoteForceClose // = 2 + case breachClose // = 3 + case fundingCanceled // = 4 + case abandoned // = 5 + case UNRECOGNIZED(Int) + + init() { + self = .cooperativeClose + } + + init?(rawValue: Int) { + switch rawValue { + case 0: self = .cooperativeClose + case 1: self = .localForceClose + case 2: self = .remoteForceClose + case 3: self = .breachClose + case 4: self = .fundingCanceled + case 5: self = .abandoned + default: self = .UNRECOGNIZED(rawValue) + } + } + + var rawValue: Int { + switch self { + case .cooperativeClose: return 0 + case .localForceClose: return 1 + case .remoteForceClose: return 2 + case .breachClose: return 3 + case .fundingCanceled: return 4 + case .abandoned: return 5 + case .UNRECOGNIZED(let i): return i + } + } + + } + + init() {} +} + +#if swift(>=4.2) + +extension Lnrpc_ChannelCloseSummary.ClosureType: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + static var allCases: [Lnrpc_ChannelCloseSummary.ClosureType] = [ + .cooperativeClose, + .localForceClose, + .remoteForceClose, + .breachClose, + .fundingCanceled, + .abandoned, + ] +} + +#endif // swift(>=4.2) + +struct Lnrpc_Resolution { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The type of output we are resolving. + var resolutionType: Lnrpc_ResolutionType = .typeUnknown + + /// The outcome of our on chain action that resolved the outpoint. + var outcome: Lnrpc_ResolutionOutcome = .outcomeUnknown + + /// The outpoint that was spent by the resolution. + var outpoint: Lnrpc_OutPoint { + get {return _outpoint ?? Lnrpc_OutPoint()} + set {_outpoint = newValue} + } + /// Returns true if `outpoint` has been explicitly set. + var hasOutpoint: Bool {return self._outpoint != nil} + /// Clears the value of `outpoint`. Subsequent reads from it will return its default value. + mutating func clearOutpoint() {self._outpoint = nil} + + /// The amount that was claimed by the resolution. + var amountSat: UInt64 = 0 + + /// The hex-encoded transaction ID of the sweep transaction that spent the + /// output. + var sweepTxid: String = String() + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + + fileprivate var _outpoint: Lnrpc_OutPoint? = nil +} + +struct Lnrpc_ClosedChannelsRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var cooperative: Bool = false + + var localForce: Bool = false + + var remoteForce: Bool = false + + var breach: Bool = false + + var fundingCanceled: Bool = false + + var abandoned: Bool = false + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_ClosedChannelsResponse { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var channels: [Lnrpc_ChannelCloseSummary] = [] + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_Peer { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The identity pubkey of the peer + var pubKey: String = String() + + /// Network address of the peer; eg `127.0.0.1:10011` + var address: String = String() + + /// Bytes of data transmitted to this peer + var bytesSent: UInt64 = 0 + + /// Bytes of data transmitted from this peer + var bytesRecv: UInt64 = 0 + + /// Satoshis sent to this peer + var satSent: Int64 = 0 + + /// Satoshis received from this peer + var satRecv: Int64 = 0 + + /// A channel is inbound if the counterparty initiated the channel + var inbound: Bool = false + + /// Ping time to this peer + var pingTime: Int64 = 0 + + /// The type of sync we are currently performing with this peer. + var syncType: Lnrpc_Peer.SyncType = .unknownSync + + /// Features advertised by the remote peer in their init message. + var features: Dictionary = [:] + + /// + ///The latest errors received from our peer with timestamps, limited to the 10 + ///most recent errors. These errors are tracked across peer connections, but + ///are not persisted across lnd restarts. Note that these errors are only + ///stored for peers that we have channels open with, to prevent peers from + ///spamming us with errors at no cost. + var errors: [Lnrpc_TimestampedError] = [] + + /// + ///The number of times we have recorded this peer going offline or coming + ///online, recorded across restarts. Note that this value is decreased over + ///time if the peer has not recently flapped, so that we can forgive peers + ///with historically high flap counts. + var flapCount: Int32 = 0 + + /// + ///The timestamp of the last flap we observed for this peer. If this value is + ///zero, we have not observed any flaps for this peer. + var lastFlapNs: Int64 = 0 + + var unknownFields = SwiftProtobuf.UnknownStorage() + + enum SyncType: SwiftProtobuf.Enum { + typealias RawValue = Int + + /// + ///Denotes that we cannot determine the peer's current sync type. + case unknownSync // = 0 + + /// + ///Denotes that we are actively receiving new graph updates from the peer. + case activeSync // = 1 + + /// + ///Denotes that we are not receiving new graph updates from the peer. + case passiveSync // = 2 + case UNRECOGNIZED(Int) + + init() { + self = .unknownSync + } + + init?(rawValue: Int) { + switch rawValue { + case 0: self = .unknownSync + case 1: self = .activeSync + case 2: self = .passiveSync + default: self = .UNRECOGNIZED(rawValue) + } + } + + var rawValue: Int { + switch self { + case .unknownSync: return 0 + case .activeSync: return 1 + case .passiveSync: return 2 + case .UNRECOGNIZED(let i): return i + } + } + + } + + init() {} +} + +#if swift(>=4.2) + +extension Lnrpc_Peer.SyncType: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + static var allCases: [Lnrpc_Peer.SyncType] = [ + .unknownSync, + .activeSync, + .passiveSync, + ] +} + +#endif // swift(>=4.2) + +struct Lnrpc_TimestampedError { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The unix timestamp in seconds when the error occurred. + var timestamp: UInt64 = 0 + + /// The string representation of the error sent by our peer. + var error: String = String() + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_ListPeersRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + ///If true, only the last error that our peer sent us will be returned with + ///the peer's information, rather than the full set of historic errors we have + ///stored. + var latestError: Bool = false + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_ListPeersResponse { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The list of currently connected peers + var peers: [Lnrpc_Peer] = [] + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_PeerEventSubscription { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_PeerEvent { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The identity pubkey of the peer. + var pubKey: String = String() + + var type: Lnrpc_PeerEvent.EventType = .peerOnline + + var unknownFields = SwiftProtobuf.UnknownStorage() + + enum EventType: SwiftProtobuf.Enum { + typealias RawValue = Int + case peerOnline // = 0 + case peerOffline // = 1 + case UNRECOGNIZED(Int) + + init() { + self = .peerOnline + } + + init?(rawValue: Int) { + switch rawValue { + case 0: self = .peerOnline + case 1: self = .peerOffline + default: self = .UNRECOGNIZED(rawValue) + } + } + + var rawValue: Int { + switch self { + case .peerOnline: return 0 + case .peerOffline: return 1 + case .UNRECOGNIZED(let i): return i + } + } + + } + + init() {} +} + +#if swift(>=4.2) + +extension Lnrpc_PeerEvent.EventType: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + static var allCases: [Lnrpc_PeerEvent.EventType] = [ + .peerOnline, + .peerOffline, + ] +} + +#endif // swift(>=4.2) + +struct Lnrpc_GetInfoRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_GetInfoResponse { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The version of the LND software that the node is running. + var version: String { + get {return _storage._version} + set {_uniqueStorage()._version = newValue} + } + + /// The SHA1 commit hash that the daemon is compiled with. + var commitHash: String { + get {return _storage._commitHash} + set {_uniqueStorage()._commitHash = newValue} + } + + /// The identity pubkey of the current node. + var identityPubkey: String { + get {return _storage._identityPubkey} + set {_uniqueStorage()._identityPubkey = newValue} + } + + /// If applicable, the alias of the current node, e.g. "bob" + var alias: String { + get {return _storage._alias} + set {_uniqueStorage()._alias = newValue} + } + + /// The color of the current node in hex code format + var color: String { + get {return _storage._color} + set {_uniqueStorage()._color = newValue} + } + + /// Number of pending channels + var numPendingChannels: UInt32 { + get {return _storage._numPendingChannels} + set {_uniqueStorage()._numPendingChannels = newValue} + } + + /// Number of active channels + var numActiveChannels: UInt32 { + get {return _storage._numActiveChannels} + set {_uniqueStorage()._numActiveChannels = newValue} + } + + /// Number of inactive channels + var numInactiveChannels: UInt32 { + get {return _storage._numInactiveChannels} + set {_uniqueStorage()._numInactiveChannels = newValue} + } + + /// Number of peers + var numPeers: UInt32 { + get {return _storage._numPeers} + set {_uniqueStorage()._numPeers = newValue} + } + + /// The node's current view of the height of the best block + var blockHeight: UInt32 { + get {return _storage._blockHeight} + set {_uniqueStorage()._blockHeight = newValue} + } + + /// The node's current view of the hash of the best block + var blockHash: String { + get {return _storage._blockHash} + set {_uniqueStorage()._blockHash = newValue} + } + + /// Timestamp of the block best known to the wallet + var bestHeaderTimestamp: Int64 { + get {return _storage._bestHeaderTimestamp} + set {_uniqueStorage()._bestHeaderTimestamp = newValue} + } + + /// Whether the wallet's view is synced to the main chain + var syncedToChain: Bool { + get {return _storage._syncedToChain} + set {_uniqueStorage()._syncedToChain = newValue} + } + + /// Whether we consider ourselves synced with the public channel graph. + var syncedToGraph: Bool { + get {return _storage._syncedToGraph} + set {_uniqueStorage()._syncedToGraph = newValue} + } + + /// + ///Whether the current node is connected to testnet. This field is + ///deprecated and the network field should be used instead + var testnet: Bool { + get {return _storage._testnet} + set {_uniqueStorage()._testnet = newValue} + } + + /// A list of active chains the node is connected to + var chains: [Lnrpc_Chain] { + get {return _storage._chains} + set {_uniqueStorage()._chains = newValue} + } + + /// The URIs of the current node. + var uris: [String] { + get {return _storage._uris} + set {_uniqueStorage()._uris = newValue} + } + + /// + ///Features that our node has advertised in our init message, node + ///announcements and invoices. + var features: Dictionary { + get {return _storage._features} + set {_uniqueStorage()._features = newValue} + } + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + + fileprivate var _storage = _StorageClass.defaultInstance +} + +struct Lnrpc_GetRecoveryInfoRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_GetRecoveryInfoResponse { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// Whether the wallet is in recovery mode + var recoveryMode: Bool = false + + /// Whether the wallet recovery progress is finished + var recoveryFinished: Bool = false + + /// The recovery progress, ranging from 0 to 1. + var progress: Double = 0 + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_Chain { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The blockchain the node is on (eg bitcoin, litecoin) + var chain: String = String() + + /// The network the node is on (eg regtest, testnet, mainnet) + var network: String = String() + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_ConfirmationUpdate { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var blockSha: Data = Data() + + var blockHeight: Int32 = 0 + + var numConfsLeft: UInt32 = 0 + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_ChannelOpenUpdate { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var channelPoint: Lnrpc_ChannelPoint { + get {return _channelPoint ?? Lnrpc_ChannelPoint()} + set {_channelPoint = newValue} + } + /// Returns true if `channelPoint` has been explicitly set. + var hasChannelPoint: Bool {return self._channelPoint != nil} + /// Clears the value of `channelPoint`. Subsequent reads from it will return its default value. + mutating func clearChannelPoint() {self._channelPoint = nil} + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + + fileprivate var _channelPoint: Lnrpc_ChannelPoint? = nil +} + +struct Lnrpc_ChannelCloseUpdate { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var closingTxid: Data = Data() + + var success: Bool = false + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_CloseChannelRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + ///The outpoint (txid:index) of the funding transaction. With this value, Bob + ///will be able to generate a signature for Alice's version of the commitment + ///transaction. + var channelPoint: Lnrpc_ChannelPoint { + get {return _channelPoint ?? Lnrpc_ChannelPoint()} + set {_channelPoint = newValue} + } + /// Returns true if `channelPoint` has been explicitly set. + var hasChannelPoint: Bool {return self._channelPoint != nil} + /// Clears the value of `channelPoint`. Subsequent reads from it will return its default value. + mutating func clearChannelPoint() {self._channelPoint = nil} + + /// If true, then the channel will be closed forcibly. This means the + /// current commitment transaction will be signed and broadcast. + var force: Bool = false + + /// The target number of blocks that the closure transaction should be + /// confirmed by. + var targetConf: Int32 = 0 + + /// A manual fee rate set in sat/byte that should be used when crafting the + /// closure transaction. + var satPerByte: Int64 = 0 + + /// + ///An optional address to send funds to in the case of a cooperative close. + ///If the channel was opened with an upfront shutdown script and this field + ///is set, the request to close will fail because the channel must pay out + ///to the upfront shutdown addresss. + var deliveryAddress: String = String() + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + + fileprivate var _channelPoint: Lnrpc_ChannelPoint? = nil +} + +struct Lnrpc_CloseStatusUpdate { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var update: Lnrpc_CloseStatusUpdate.OneOf_Update? = nil + + var closePending: Lnrpc_PendingUpdate { + get { + if case .closePending(let v)? = update {return v} + return Lnrpc_PendingUpdate() + } + set {update = .closePending(newValue)} + } + + var chanClose: Lnrpc_ChannelCloseUpdate { + get { + if case .chanClose(let v)? = update {return v} + return Lnrpc_ChannelCloseUpdate() + } + set {update = .chanClose(newValue)} + } + + var unknownFields = SwiftProtobuf.UnknownStorage() + + enum OneOf_Update: Equatable { + case closePending(Lnrpc_PendingUpdate) + case chanClose(Lnrpc_ChannelCloseUpdate) + + #if !swift(>=4.1) + static func ==(lhs: Lnrpc_CloseStatusUpdate.OneOf_Update, rhs: Lnrpc_CloseStatusUpdate.OneOf_Update) -> Bool { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch (lhs, rhs) { + case (.closePending, .closePending): return { + guard case .closePending(let l) = lhs, case .closePending(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.chanClose, .chanClose): return { + guard case .chanClose(let l) = lhs, case .chanClose(let r) = rhs else { preconditionFailure() } + return l == r + }() + default: return false + } + } + #endif + } + + init() {} +} + +struct Lnrpc_PendingUpdate { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var txid: Data = Data() + + var outputIndex: UInt32 = 0 + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_ReadyForPsbtFunding { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + ///The P2WSH address of the channel funding multisig address that the below + ///specified amount in satoshis needs to be sent to. + var fundingAddress: String = String() + + /// + ///The exact amount in satoshis that needs to be sent to the above address to + ///fund the pending channel. + var fundingAmount: Int64 = 0 + + /// + ///A raw PSBT that contains the pending channel output. If a base PSBT was + ///provided in the PsbtShim, this is the base PSBT with one additional output. + ///If no base PSBT was specified, this is an otherwise empty PSBT with exactly + ///one output. + var psbt: Data = Data() + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_OpenChannelRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + ///The pubkey of the node to open a channel with. When using REST, this field + ///must be encoded as base64. + var nodePubkey: Data { + get {return _storage._nodePubkey} + set {_uniqueStorage()._nodePubkey = newValue} + } + + /// + ///The hex encoded pubkey of the node to open a channel with. Deprecated now + ///that the REST gateway supports base64 encoding of bytes fields. + var nodePubkeyString: String { + get {return _storage._nodePubkeyString} + set {_uniqueStorage()._nodePubkeyString = newValue} + } + + /// The number of satoshis the wallet should commit to the channel + var localFundingAmount: Int64 { + get {return _storage._localFundingAmount} + set {_uniqueStorage()._localFundingAmount = newValue} + } + + /// The number of satoshis to push to the remote side as part of the initial + /// commitment state + var pushSat: Int64 { + get {return _storage._pushSat} + set {_uniqueStorage()._pushSat = newValue} + } + + /// The target number of blocks that the funding transaction should be + /// confirmed by. + var targetConf: Int32 { + get {return _storage._targetConf} + set {_uniqueStorage()._targetConf = newValue} + } + + /// A manual fee rate set in sat/byte that should be used when crafting the + /// funding transaction. + var satPerByte: Int64 { + get {return _storage._satPerByte} + set {_uniqueStorage()._satPerByte = newValue} + } + + /// Whether this channel should be private, not announced to the greater + /// network. + var `private`: Bool { + get {return _storage._private} + set {_uniqueStorage()._private = newValue} + } + + /// The minimum value in millisatoshi we will require for incoming HTLCs on + /// the channel. + var minHtlcMsat: Int64 { + get {return _storage._minHtlcMsat} + set {_uniqueStorage()._minHtlcMsat = newValue} + } + + /// The delay we require on the remote's commitment transaction. If this is + /// not set, it will be scaled automatically with the channel size. + var remoteCsvDelay: UInt32 { + get {return _storage._remoteCsvDelay} + set {_uniqueStorage()._remoteCsvDelay = newValue} + } + + /// The minimum number of confirmations each one of your outputs used for + /// the funding transaction must satisfy. + var minConfs: Int32 { + get {return _storage._minConfs} + set {_uniqueStorage()._minConfs = newValue} + } + + /// Whether unconfirmed outputs should be used as inputs for the funding + /// transaction. + var spendUnconfirmed: Bool { + get {return _storage._spendUnconfirmed} + set {_uniqueStorage()._spendUnconfirmed = newValue} + } + + /// + ///Close address is an optional address which specifies the address to which + ///funds should be paid out to upon cooperative close. This field may only be + ///set if the peer supports the option upfront feature bit (call listpeers + ///to check). The remote peer will only accept cooperative closes to this + ///address if it is set. + /// + ///Note: If this value is set on channel creation, you will *not* be able to + ///cooperatively close out to a different address. + var closeAddress: String { + get {return _storage._closeAddress} + set {_uniqueStorage()._closeAddress = newValue} + } + + /// + ///Funding shims are an optional argument that allow the caller to intercept + ///certain funding functionality. For example, a shim can be provided to use a + ///particular key for the commitment key (ideally cold) rather than use one + ///that is generated by the wallet as normal, or signal that signing will be + ///carried out in an interactive manner (PSBT based). + var fundingShim: Lnrpc_FundingShim { + get {return _storage._fundingShim ?? Lnrpc_FundingShim()} + set {_uniqueStorage()._fundingShim = newValue} + } + /// Returns true if `fundingShim` has been explicitly set. + var hasFundingShim: Bool {return _storage._fundingShim != nil} + /// Clears the value of `fundingShim`. Subsequent reads from it will return its default value. + mutating func clearFundingShim() {_uniqueStorage()._fundingShim = nil} + + /// + ///The maximum amount of coins in millisatoshi that can be pending within + ///the channel. It only applies to the remote party. + var remoteMaxValueInFlightMsat: UInt64 { + get {return _storage._remoteMaxValueInFlightMsat} + set {_uniqueStorage()._remoteMaxValueInFlightMsat = newValue} + } + + /// + ///The maximum number of concurrent HTLCs we will allow the remote party to add + ///to the commitment transaction. + var remoteMaxHtlcs: UInt32 { + get {return _storage._remoteMaxHtlcs} + set {_uniqueStorage()._remoteMaxHtlcs = newValue} + } + + /// + ///Max local csv is the maximum csv delay we will allow for our own commitment + ///transaction. + var maxLocalCsv: UInt32 { + get {return _storage._maxLocalCsv} + set {_uniqueStorage()._maxLocalCsv = newValue} + } + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + + fileprivate var _storage = _StorageClass.defaultInstance +} + +struct Lnrpc_OpenStatusUpdate { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var update: Lnrpc_OpenStatusUpdate.OneOf_Update? = nil + + /// + ///Signals that the channel is now fully negotiated and the funding + ///transaction published. + var chanPending: Lnrpc_PendingUpdate { + get { + if case .chanPending(let v)? = update {return v} + return Lnrpc_PendingUpdate() + } + set {update = .chanPending(newValue)} + } + + /// + ///Signals that the channel's funding transaction has now reached the + ///required number of confirmations on chain and can be used. + var chanOpen: Lnrpc_ChannelOpenUpdate { + get { + if case .chanOpen(let v)? = update {return v} + return Lnrpc_ChannelOpenUpdate() + } + set {update = .chanOpen(newValue)} + } + + /// + ///Signals that the funding process has been suspended and the construction + ///of a PSBT that funds the channel PK script is now required. + var psbtFund: Lnrpc_ReadyForPsbtFunding { + get { + if case .psbtFund(let v)? = update {return v} + return Lnrpc_ReadyForPsbtFunding() + } + set {update = .psbtFund(newValue)} + } + + /// + ///The pending channel ID of the created channel. This value may be used to + ///further the funding flow manually via the FundingStateStep method. + var pendingChanID: Data = Data() + + var unknownFields = SwiftProtobuf.UnknownStorage() + + enum OneOf_Update: Equatable { + /// + ///Signals that the channel is now fully negotiated and the funding + ///transaction published. + case chanPending(Lnrpc_PendingUpdate) + /// + ///Signals that the channel's funding transaction has now reached the + ///required number of confirmations on chain and can be used. + case chanOpen(Lnrpc_ChannelOpenUpdate) + /// + ///Signals that the funding process has been suspended and the construction + ///of a PSBT that funds the channel PK script is now required. + case psbtFund(Lnrpc_ReadyForPsbtFunding) + + #if !swift(>=4.1) + static func ==(lhs: Lnrpc_OpenStatusUpdate.OneOf_Update, rhs: Lnrpc_OpenStatusUpdate.OneOf_Update) -> Bool { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch (lhs, rhs) { + case (.chanPending, .chanPending): return { + guard case .chanPending(let l) = lhs, case .chanPending(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.chanOpen, .chanOpen): return { + guard case .chanOpen(let l) = lhs, case .chanOpen(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.psbtFund, .psbtFund): return { + guard case .psbtFund(let l) = lhs, case .psbtFund(let r) = rhs else { preconditionFailure() } + return l == r + }() + default: return false + } + } + #endif + } + + init() {} +} + +struct Lnrpc_KeyLocator { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The family of key being identified. + var keyFamily: Int32 = 0 + + /// The precise index of the key being identified. + var keyIndex: Int32 = 0 + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_KeyDescriptor { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + ///The raw bytes of the key being identified. + var rawKeyBytes: Data = Data() + + /// + ///The key locator that identifies which key to use for signing. + var keyLoc: Lnrpc_KeyLocator { + get {return _keyLoc ?? Lnrpc_KeyLocator()} + set {_keyLoc = newValue} + } + /// Returns true if `keyLoc` has been explicitly set. + var hasKeyLoc: Bool {return self._keyLoc != nil} + /// Clears the value of `keyLoc`. Subsequent reads from it will return its default value. + mutating func clearKeyLoc() {self._keyLoc = nil} + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + + fileprivate var _keyLoc: Lnrpc_KeyLocator? = nil +} + +struct Lnrpc_ChanPointShim { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + ///The size of the pre-crafted output to be used as the channel point for this + ///channel funding. + var amt: Int64 = 0 + + /// The target channel point to refrence in created commitment transactions. + var chanPoint: Lnrpc_ChannelPoint { + get {return _chanPoint ?? Lnrpc_ChannelPoint()} + set {_chanPoint = newValue} + } + /// Returns true if `chanPoint` has been explicitly set. + var hasChanPoint: Bool {return self._chanPoint != nil} + /// Clears the value of `chanPoint`. Subsequent reads from it will return its default value. + mutating func clearChanPoint() {self._chanPoint = nil} + + /// Our local key to use when creating the multi-sig output. + var localKey: Lnrpc_KeyDescriptor { + get {return _localKey ?? Lnrpc_KeyDescriptor()} + set {_localKey = newValue} + } + /// Returns true if `localKey` has been explicitly set. + var hasLocalKey: Bool {return self._localKey != nil} + /// Clears the value of `localKey`. Subsequent reads from it will return its default value. + mutating func clearLocalKey() {self._localKey = nil} + + /// The key of the remote party to use when creating the multi-sig output. + var remoteKey: Data = Data() + + /// + ///If non-zero, then this will be used as the pending channel ID on the wire + ///protocol to initate the funding request. This is an optional field, and + ///should only be set if the responder is already expecting a specific pending + ///channel ID. + var pendingChanID: Data = Data() + + /// + ///This uint32 indicates if this channel is to be considered 'frozen'. A frozen + ///channel does not allow a cooperative channel close by the initiator. The + ///thaw_height is the height that this restriction stops applying to the + ///channel. The height can be interpreted in two ways: as a relative height if + ///the value is less than 500,000, or as an absolute height otherwise. + var thawHeight: UInt32 = 0 + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + + fileprivate var _chanPoint: Lnrpc_ChannelPoint? = nil + fileprivate var _localKey: Lnrpc_KeyDescriptor? = nil +} + +struct Lnrpc_PsbtShim { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + ///A unique identifier of 32 random bytes that will be used as the pending + ///channel ID to identify the PSBT state machine when interacting with it and + ///on the wire protocol to initiate the funding request. + var pendingChanID: Data = Data() + + /// + ///An optional base PSBT the new channel output will be added to. If this is + ///non-empty, it must be a binary serialized PSBT. + var basePsbt: Data = Data() + + /// + ///If a channel should be part of a batch (multiple channel openings in one + ///transaction), it can be dangerous if the whole batch transaction is + ///published too early before all channel opening negotiations are completed. + ///This flag prevents this particular channel from broadcasting the transaction + ///after the negotiation with the remote peer. In a batch of channel openings + ///this flag should be set to true for every channel but the very last. + var noPublish: Bool = false + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_FundingShim { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var shim: Lnrpc_FundingShim.OneOf_Shim? = nil + + /// + ///A channel shim where the channel point was fully constructed outside + ///of lnd's wallet and the transaction might already be published. + var chanPointShim: Lnrpc_ChanPointShim { + get { + if case .chanPointShim(let v)? = shim {return v} + return Lnrpc_ChanPointShim() + } + set {shim = .chanPointShim(newValue)} + } + + /// + ///A channel shim that uses a PSBT to fund and sign the channel funding + ///transaction. + var psbtShim: Lnrpc_PsbtShim { + get { + if case .psbtShim(let v)? = shim {return v} + return Lnrpc_PsbtShim() + } + set {shim = .psbtShim(newValue)} + } + + var unknownFields = SwiftProtobuf.UnknownStorage() + + enum OneOf_Shim: Equatable { + /// + ///A channel shim where the channel point was fully constructed outside + ///of lnd's wallet and the transaction might already be published. + case chanPointShim(Lnrpc_ChanPointShim) + /// + ///A channel shim that uses a PSBT to fund and sign the channel funding + ///transaction. + case psbtShim(Lnrpc_PsbtShim) + + #if !swift(>=4.1) + static func ==(lhs: Lnrpc_FundingShim.OneOf_Shim, rhs: Lnrpc_FundingShim.OneOf_Shim) -> Bool { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch (lhs, rhs) { + case (.chanPointShim, .chanPointShim): return { + guard case .chanPointShim(let l) = lhs, case .chanPointShim(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.psbtShim, .psbtShim): return { + guard case .psbtShim(let l) = lhs, case .psbtShim(let r) = rhs else { preconditionFailure() } + return l == r + }() + default: return false + } + } + #endif + } + + init() {} +} + +struct Lnrpc_FundingShimCancel { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The pending channel ID of the channel to cancel the funding shim for. + var pendingChanID: Data = Data() + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_FundingPsbtVerify { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + ///The funded but not yet signed PSBT that sends the exact channel capacity + ///amount to the PK script returned in the open channel message in a previous + ///step. + var fundedPsbt: Data = Data() + + /// The pending channel ID of the channel to get the PSBT for. + var pendingChanID: Data = Data() + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_FundingPsbtFinalize { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + ///The funded PSBT that contains all witness data to send the exact channel + ///capacity amount to the PK script returned in the open channel message in a + ///previous step. Cannot be set at the same time as final_raw_tx. + var signedPsbt: Data = Data() + + /// The pending channel ID of the channel to get the PSBT for. + var pendingChanID: Data = Data() + + /// + ///As an alternative to the signed PSBT with all witness data, the final raw + ///wire format transaction can also be specified directly. Cannot be set at the + ///same time as signed_psbt. + var finalRawTx: Data = Data() + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_FundingTransitionMsg { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var trigger: Lnrpc_FundingTransitionMsg.OneOf_Trigger? = nil + + /// + ///The funding shim to register. This should be used before any + ///channel funding has began by the remote party, as it is intended as a + ///preparatory step for the full channel funding. + var shimRegister: Lnrpc_FundingShim { + get { + if case .shimRegister(let v)? = trigger {return v} + return Lnrpc_FundingShim() + } + set {trigger = .shimRegister(newValue)} + } + + /// Used to cancel an existing registered funding shim. + var shimCancel: Lnrpc_FundingShimCancel { + get { + if case .shimCancel(let v)? = trigger {return v} + return Lnrpc_FundingShimCancel() + } + set {trigger = .shimCancel(newValue)} + } + + /// + ///Used to continue a funding flow that was initiated to be executed + ///through a PSBT. This step verifies that the PSBT contains the correct + ///outputs to fund the channel. + var psbtVerify: Lnrpc_FundingPsbtVerify { + get { + if case .psbtVerify(let v)? = trigger {return v} + return Lnrpc_FundingPsbtVerify() + } + set {trigger = .psbtVerify(newValue)} + } + + /// + ///Used to continue a funding flow that was initiated to be executed + ///through a PSBT. This step finalizes the funded and signed PSBT, finishes + ///negotiation with the peer and finally publishes the resulting funding + ///transaction. + var psbtFinalize: Lnrpc_FundingPsbtFinalize { + get { + if case .psbtFinalize(let v)? = trigger {return v} + return Lnrpc_FundingPsbtFinalize() + } + set {trigger = .psbtFinalize(newValue)} + } + + var unknownFields = SwiftProtobuf.UnknownStorage() + + enum OneOf_Trigger: Equatable { + /// + ///The funding shim to register. This should be used before any + ///channel funding has began by the remote party, as it is intended as a + ///preparatory step for the full channel funding. + case shimRegister(Lnrpc_FundingShim) + /// Used to cancel an existing registered funding shim. + case shimCancel(Lnrpc_FundingShimCancel) + /// + ///Used to continue a funding flow that was initiated to be executed + ///through a PSBT. This step verifies that the PSBT contains the correct + ///outputs to fund the channel. + case psbtVerify(Lnrpc_FundingPsbtVerify) + /// + ///Used to continue a funding flow that was initiated to be executed + ///through a PSBT. This step finalizes the funded and signed PSBT, finishes + ///negotiation with the peer and finally publishes the resulting funding + ///transaction. + case psbtFinalize(Lnrpc_FundingPsbtFinalize) + + #if !swift(>=4.1) + static func ==(lhs: Lnrpc_FundingTransitionMsg.OneOf_Trigger, rhs: Lnrpc_FundingTransitionMsg.OneOf_Trigger) -> Bool { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch (lhs, rhs) { + case (.shimRegister, .shimRegister): return { + guard case .shimRegister(let l) = lhs, case .shimRegister(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.shimCancel, .shimCancel): return { + guard case .shimCancel(let l) = lhs, case .shimCancel(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.psbtVerify, .psbtVerify): return { + guard case .psbtVerify(let l) = lhs, case .psbtVerify(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.psbtFinalize, .psbtFinalize): return { + guard case .psbtFinalize(let l) = lhs, case .psbtFinalize(let r) = rhs else { preconditionFailure() } + return l == r + }() + default: return false + } + } + #endif + } + + init() {} +} + +struct Lnrpc_FundingStateStepResp { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_PendingHTLC { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The direction within the channel that the htlc was sent + var incoming: Bool = false + + /// The total value of the htlc + var amount: Int64 = 0 + + /// The final output to be swept back to the user's wallet + var outpoint: String = String() + + /// The next block height at which we can spend the current stage + var maturityHeight: UInt32 = 0 + + /// + ///The number of blocks remaining until the current stage can be swept. + ///Negative values indicate how many blocks have passed since becoming + ///mature. + var blocksTilMaturity: Int32 = 0 + + /// Indicates whether the htlc is in its first or second stage of recovery + var stage: UInt32 = 0 + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_PendingChannelsRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_PendingChannelsResponse { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The balance in satoshis encumbered in pending channels + var totalLimboBalance: Int64 = 0 + + /// Channels pending opening + var pendingOpenChannels: [Lnrpc_PendingChannelsResponse.PendingOpenChannel] = [] + + /// + ///Deprecated: Channels pending closing previously contained cooperatively + ///closed channels with a single confirmation. These channels are now + ///considered closed from the time we see them on chain. + var pendingClosingChannels: [Lnrpc_PendingChannelsResponse.ClosedChannel] = [] + + /// Channels pending force closing + var pendingForceClosingChannels: [Lnrpc_PendingChannelsResponse.ForceClosedChannel] = [] + + /// Channels waiting for closing tx to confirm + var waitingCloseChannels: [Lnrpc_PendingChannelsResponse.WaitingCloseChannel] = [] + + var unknownFields = SwiftProtobuf.UnknownStorage() + + struct PendingChannel { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var remoteNodePub: String = String() + + var channelPoint: String = String() + + var capacity: Int64 = 0 + + var localBalance: Int64 = 0 + + var remoteBalance: Int64 = 0 + + /// The minimum satoshis this node is required to reserve in its + /// balance. + var localChanReserveSat: Int64 = 0 + + /// + ///The minimum satoshis the other node is required to reserve in its + ///balance. + var remoteChanReserveSat: Int64 = 0 + + /// The party that initiated opening the channel. + var initiator: Lnrpc_Initiator = .unknown + + /// The commitment type used by this channel. + var commitmentType: Lnrpc_CommitmentType = .legacy + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + } + + struct PendingOpenChannel { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The pending channel + var channel: Lnrpc_PendingChannelsResponse.PendingChannel { + get {return _channel ?? Lnrpc_PendingChannelsResponse.PendingChannel()} + set {_channel = newValue} + } + /// Returns true if `channel` has been explicitly set. + var hasChannel: Bool {return self._channel != nil} + /// Clears the value of `channel`. Subsequent reads from it will return its default value. + mutating func clearChannel() {self._channel = nil} + + /// The height at which this channel will be confirmed + var confirmationHeight: UInt32 = 0 + + /// + ///The amount calculated to be paid in fees for the current set of + ///commitment transactions. The fee amount is persisted with the channel + ///in order to allow the fee amount to be removed and recalculated with + ///each channel state update, including updates that happen after a system + ///restart. + var commitFee: Int64 = 0 + + /// The weight of the commitment transaction + var commitWeight: Int64 = 0 + + /// + ///The required number of satoshis per kilo-weight that the requester will + ///pay at all times, for both the funding transaction and commitment + ///transaction. This value can later be updated once the channel is open. + var feePerKw: Int64 = 0 + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + + fileprivate var _channel: Lnrpc_PendingChannelsResponse.PendingChannel? = nil + } + + struct WaitingCloseChannel { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The pending channel waiting for closing tx to confirm + var channel: Lnrpc_PendingChannelsResponse.PendingChannel { + get {return _channel ?? Lnrpc_PendingChannelsResponse.PendingChannel()} + set {_channel = newValue} + } + /// Returns true if `channel` has been explicitly set. + var hasChannel: Bool {return self._channel != nil} + /// Clears the value of `channel`. Subsequent reads from it will return its default value. + mutating func clearChannel() {self._channel = nil} + + /// The balance in satoshis encumbered in this channel + var limboBalance: Int64 = 0 + + /// + ///A list of valid commitment transactions. Any of these can confirm at + ///this point. + var commitments: Lnrpc_PendingChannelsResponse.Commitments { + get {return _commitments ?? Lnrpc_PendingChannelsResponse.Commitments()} + set {_commitments = newValue} + } + /// Returns true if `commitments` has been explicitly set. + var hasCommitments: Bool {return self._commitments != nil} + /// Clears the value of `commitments`. Subsequent reads from it will return its default value. + mutating func clearCommitments() {self._commitments = nil} + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + + fileprivate var _channel: Lnrpc_PendingChannelsResponse.PendingChannel? = nil + fileprivate var _commitments: Lnrpc_PendingChannelsResponse.Commitments? = nil + } + + struct Commitments { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// Hash of the local version of the commitment tx. + var localTxid: String = String() + + /// Hash of the remote version of the commitment tx. + var remoteTxid: String = String() + + /// Hash of the remote pending version of the commitment tx. + var remotePendingTxid: String = String() + + /// + ///The amount in satoshis calculated to be paid in fees for the local + ///commitment. + var localCommitFeeSat: UInt64 = 0 + + /// + ///The amount in satoshis calculated to be paid in fees for the remote + ///commitment. + var remoteCommitFeeSat: UInt64 = 0 + + /// + ///The amount in satoshis calculated to be paid in fees for the remote + ///pending commitment. + var remotePendingCommitFeeSat: UInt64 = 0 + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + } + + struct ClosedChannel { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The pending channel to be closed + var channel: Lnrpc_PendingChannelsResponse.PendingChannel { + get {return _channel ?? Lnrpc_PendingChannelsResponse.PendingChannel()} + set {_channel = newValue} + } + /// Returns true if `channel` has been explicitly set. + var hasChannel: Bool {return self._channel != nil} + /// Clears the value of `channel`. Subsequent reads from it will return its default value. + mutating func clearChannel() {self._channel = nil} + + /// The transaction id of the closing transaction + var closingTxid: String = String() + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + + fileprivate var _channel: Lnrpc_PendingChannelsResponse.PendingChannel? = nil + } + + struct ForceClosedChannel { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The pending channel to be force closed + var channel: Lnrpc_PendingChannelsResponse.PendingChannel { + get {return _channel ?? Lnrpc_PendingChannelsResponse.PendingChannel()} + set {_channel = newValue} + } + /// Returns true if `channel` has been explicitly set. + var hasChannel: Bool {return self._channel != nil} + /// Clears the value of `channel`. Subsequent reads from it will return its default value. + mutating func clearChannel() {self._channel = nil} + + /// The transaction id of the closing transaction + var closingTxid: String = String() + + /// The balance in satoshis encumbered in this pending channel + var limboBalance: Int64 = 0 + + /// The height at which funds can be swept into the wallet + var maturityHeight: UInt32 = 0 + + /// + ///Remaining # of blocks until the commitment output can be swept. + ///Negative values indicate how many blocks have passed since becoming + ///mature. + var blocksTilMaturity: Int32 = 0 + + /// The total value of funds successfully recovered from this channel + var recoveredBalance: Int64 = 0 + + var pendingHtlcs: [Lnrpc_PendingHTLC] = [] + + var anchor: Lnrpc_PendingChannelsResponse.ForceClosedChannel.AnchorState = .limbo + + var unknownFields = SwiftProtobuf.UnknownStorage() + + enum AnchorState: SwiftProtobuf.Enum { + typealias RawValue = Int + case limbo // = 0 + case recovered // = 1 + case lost // = 2 + case UNRECOGNIZED(Int) + + init() { + self = .limbo + } + + init?(rawValue: Int) { + switch rawValue { + case 0: self = .limbo + case 1: self = .recovered + case 2: self = .lost + default: self = .UNRECOGNIZED(rawValue) + } + } + + var rawValue: Int { + switch self { + case .limbo: return 0 + case .recovered: return 1 + case .lost: return 2 + case .UNRECOGNIZED(let i): return i + } + } + + } + + init() {} + + fileprivate var _channel: Lnrpc_PendingChannelsResponse.PendingChannel? = nil + } + + init() {} +} + +#if swift(>=4.2) + +extension Lnrpc_PendingChannelsResponse.ForceClosedChannel.AnchorState: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + static var allCases: [Lnrpc_PendingChannelsResponse.ForceClosedChannel.AnchorState] = [ + .limbo, + .recovered, + .lost, + ] +} + +#endif // swift(>=4.2) + +struct Lnrpc_ChannelEventSubscription { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_ChannelEventUpdate { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var channel: Lnrpc_ChannelEventUpdate.OneOf_Channel? = nil + + var openChannel: Lnrpc_Channel { + get { + if case .openChannel(let v)? = channel {return v} + return Lnrpc_Channel() + } + set {channel = .openChannel(newValue)} + } + + var closedChannel: Lnrpc_ChannelCloseSummary { + get { + if case .closedChannel(let v)? = channel {return v} + return Lnrpc_ChannelCloseSummary() + } + set {channel = .closedChannel(newValue)} + } + + var activeChannel: Lnrpc_ChannelPoint { + get { + if case .activeChannel(let v)? = channel {return v} + return Lnrpc_ChannelPoint() + } + set {channel = .activeChannel(newValue)} + } + + var inactiveChannel: Lnrpc_ChannelPoint { + get { + if case .inactiveChannel(let v)? = channel {return v} + return Lnrpc_ChannelPoint() + } + set {channel = .inactiveChannel(newValue)} + } + + var pendingOpenChannel: Lnrpc_PendingUpdate { + get { + if case .pendingOpenChannel(let v)? = channel {return v} + return Lnrpc_PendingUpdate() + } + set {channel = .pendingOpenChannel(newValue)} + } + + var type: Lnrpc_ChannelEventUpdate.UpdateType = .openChannel + + var unknownFields = SwiftProtobuf.UnknownStorage() + + enum OneOf_Channel: Equatable { + case openChannel(Lnrpc_Channel) + case closedChannel(Lnrpc_ChannelCloseSummary) + case activeChannel(Lnrpc_ChannelPoint) + case inactiveChannel(Lnrpc_ChannelPoint) + case pendingOpenChannel(Lnrpc_PendingUpdate) + + #if !swift(>=4.1) + static func ==(lhs: Lnrpc_ChannelEventUpdate.OneOf_Channel, rhs: Lnrpc_ChannelEventUpdate.OneOf_Channel) -> Bool { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch (lhs, rhs) { + case (.openChannel, .openChannel): return { + guard case .openChannel(let l) = lhs, case .openChannel(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.closedChannel, .closedChannel): return { + guard case .closedChannel(let l) = lhs, case .closedChannel(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.activeChannel, .activeChannel): return { + guard case .activeChannel(let l) = lhs, case .activeChannel(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.inactiveChannel, .inactiveChannel): return { + guard case .inactiveChannel(let l) = lhs, case .inactiveChannel(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.pendingOpenChannel, .pendingOpenChannel): return { + guard case .pendingOpenChannel(let l) = lhs, case .pendingOpenChannel(let r) = rhs else { preconditionFailure() } + return l == r + }() + default: return false + } + } + #endif + } + + enum UpdateType: SwiftProtobuf.Enum { + typealias RawValue = Int + case openChannel // = 0 + case closedChannel // = 1 + case activeChannel // = 2 + case inactiveChannel // = 3 + case pendingOpenChannel // = 4 + case UNRECOGNIZED(Int) + + init() { + self = .openChannel + } + + init?(rawValue: Int) { + switch rawValue { + case 0: self = .openChannel + case 1: self = .closedChannel + case 2: self = .activeChannel + case 3: self = .inactiveChannel + case 4: self = .pendingOpenChannel + default: self = .UNRECOGNIZED(rawValue) + } + } + + var rawValue: Int { + switch self { + case .openChannel: return 0 + case .closedChannel: return 1 + case .activeChannel: return 2 + case .inactiveChannel: return 3 + case .pendingOpenChannel: return 4 + case .UNRECOGNIZED(let i): return i + } + } + + } + + init() {} +} + +#if swift(>=4.2) + +extension Lnrpc_ChannelEventUpdate.UpdateType: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + static var allCases: [Lnrpc_ChannelEventUpdate.UpdateType] = [ + .openChannel, + .closedChannel, + .activeChannel, + .inactiveChannel, + .pendingOpenChannel, + ] +} + +#endif // swift(>=4.2) + +struct Lnrpc_WalletBalanceRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_WalletBalanceResponse { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The balance of the wallet + var totalBalance: Int64 = 0 + + /// The confirmed balance of a wallet(with >= 1 confirmations) + var confirmedBalance: Int64 = 0 + + /// The unconfirmed balance of a wallet(with 0 confirmations) + var unconfirmedBalance: Int64 = 0 + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_Amount { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// Value denominated in satoshis. + var sat: UInt64 = 0 + + /// Value denominated in milli-satoshis. + var msat: UInt64 = 0 + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_ChannelBalanceRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_ChannelBalanceResponse { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// Deprecated. Sum of channels balances denominated in satoshis + var balance: Int64 = 0 + + /// Deprecated. Sum of channels pending balances denominated in satoshis + var pendingOpenBalance: Int64 = 0 + + /// Sum of channels local balances. + var localBalance: Lnrpc_Amount { + get {return _localBalance ?? Lnrpc_Amount()} + set {_localBalance = newValue} + } + /// Returns true if `localBalance` has been explicitly set. + var hasLocalBalance: Bool {return self._localBalance != nil} + /// Clears the value of `localBalance`. Subsequent reads from it will return its default value. + mutating func clearLocalBalance() {self._localBalance = nil} + + /// Sum of channels remote balances. + var remoteBalance: Lnrpc_Amount { + get {return _remoteBalance ?? Lnrpc_Amount()} + set {_remoteBalance = newValue} + } + /// Returns true if `remoteBalance` has been explicitly set. + var hasRemoteBalance: Bool {return self._remoteBalance != nil} + /// Clears the value of `remoteBalance`. Subsequent reads from it will return its default value. + mutating func clearRemoteBalance() {self._remoteBalance = nil} + + /// Sum of channels local unsettled balances. + var unsettledLocalBalance: Lnrpc_Amount { + get {return _unsettledLocalBalance ?? Lnrpc_Amount()} + set {_unsettledLocalBalance = newValue} + } + /// Returns true if `unsettledLocalBalance` has been explicitly set. + var hasUnsettledLocalBalance: Bool {return self._unsettledLocalBalance != nil} + /// Clears the value of `unsettledLocalBalance`. Subsequent reads from it will return its default value. + mutating func clearUnsettledLocalBalance() {self._unsettledLocalBalance = nil} + + /// Sum of channels remote unsettled balances. + var unsettledRemoteBalance: Lnrpc_Amount { + get {return _unsettledRemoteBalance ?? Lnrpc_Amount()} + set {_unsettledRemoteBalance = newValue} + } + /// Returns true if `unsettledRemoteBalance` has been explicitly set. + var hasUnsettledRemoteBalance: Bool {return self._unsettledRemoteBalance != nil} + /// Clears the value of `unsettledRemoteBalance`. Subsequent reads from it will return its default value. + mutating func clearUnsettledRemoteBalance() {self._unsettledRemoteBalance = nil} + + /// Sum of channels pending local balances. + var pendingOpenLocalBalance: Lnrpc_Amount { + get {return _pendingOpenLocalBalance ?? Lnrpc_Amount()} + set {_pendingOpenLocalBalance = newValue} + } + /// Returns true if `pendingOpenLocalBalance` has been explicitly set. + var hasPendingOpenLocalBalance: Bool {return self._pendingOpenLocalBalance != nil} + /// Clears the value of `pendingOpenLocalBalance`. Subsequent reads from it will return its default value. + mutating func clearPendingOpenLocalBalance() {self._pendingOpenLocalBalance = nil} + + /// Sum of channels pending remote balances. + var pendingOpenRemoteBalance: Lnrpc_Amount { + get {return _pendingOpenRemoteBalance ?? Lnrpc_Amount()} + set {_pendingOpenRemoteBalance = newValue} + } + /// Returns true if `pendingOpenRemoteBalance` has been explicitly set. + var hasPendingOpenRemoteBalance: Bool {return self._pendingOpenRemoteBalance != nil} + /// Clears the value of `pendingOpenRemoteBalance`. Subsequent reads from it will return its default value. + mutating func clearPendingOpenRemoteBalance() {self._pendingOpenRemoteBalance = nil} + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + + fileprivate var _localBalance: Lnrpc_Amount? = nil + fileprivate var _remoteBalance: Lnrpc_Amount? = nil + fileprivate var _unsettledLocalBalance: Lnrpc_Amount? = nil + fileprivate var _unsettledRemoteBalance: Lnrpc_Amount? = nil + fileprivate var _pendingOpenLocalBalance: Lnrpc_Amount? = nil + fileprivate var _pendingOpenRemoteBalance: Lnrpc_Amount? = nil +} + +struct Lnrpc_QueryRoutesRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The 33-byte hex-encoded public key for the payment destination + var pubKey: String = String() + + /// + ///The amount to send expressed in satoshis. + /// + ///The fields amt and amt_msat are mutually exclusive. + var amt: Int64 = 0 + + /// + ///The amount to send expressed in millisatoshis. + /// + ///The fields amt and amt_msat are mutually exclusive. + var amtMsat: Int64 = 0 + + /// + ///An optional CLTV delta from the current height that should be used for the + ///timelock of the final hop. Note that unlike SendPayment, QueryRoutes does + ///not add any additional block padding on top of final_ctlv_delta. This + ///padding of a few blocks needs to be added manually or otherwise failures may + ///happen when a block comes in while the payment is in flight. + var finalCltvDelta: Int32 = 0 + + /// + ///The maximum number of satoshis that will be paid as a fee of the payment. + ///This value can be represented either as a percentage of the amount being + ///sent, or as a fixed amount of the maximum fee the user is willing the pay to + ///send the payment. + var feeLimit: Lnrpc_FeeLimit { + get {return _feeLimit ?? Lnrpc_FeeLimit()} + set {_feeLimit = newValue} + } + /// Returns true if `feeLimit` has been explicitly set. + var hasFeeLimit: Bool {return self._feeLimit != nil} + /// Clears the value of `feeLimit`. Subsequent reads from it will return its default value. + mutating func clearFeeLimit() {self._feeLimit = nil} + + /// + ///A list of nodes to ignore during path finding. When using REST, these fields + ///must be encoded as base64. + var ignoredNodes: [Data] = [] + + /// + ///Deprecated. A list of edges to ignore during path finding. + var ignoredEdges: [Lnrpc_EdgeLocator] = [] + + /// + ///The source node where the request route should originated from. If empty, + ///self is assumed. + var sourcePubKey: String = String() + + /// + ///If set to true, edge probabilities from mission control will be used to get + ///the optimal route. + var useMissionControl: Bool = false + + /// + ///A list of directed node pairs that will be ignored during path finding. + var ignoredPairs: [Lnrpc_NodePair] = [] + + /// + ///An optional maximum total time lock for the route. If the source is empty or + ///ourselves, this should not exceed lnd's `--max-cltv-expiry` setting. If + ///zero, then the value of `--max-cltv-expiry` is used as the limit. + var cltvLimit: UInt32 = 0 + + /// + ///An optional field that can be used to pass an arbitrary set of TLV records + ///to a peer which understands the new records. This can be used to pass + ///application specific data during the payment attempt. If the destination + ///does not support the specified recrods, and error will be returned. + ///Record types are required to be in the custom range >= 65536. When using + ///REST, the values must be encoded as base64. + var destCustomRecords: Dictionary = [:] + + /// + ///The channel id of the channel that must be taken to the first hop. If zero, + ///any channel may be used. + var outgoingChanID: UInt64 = 0 + + /// + ///The pubkey of the last hop of the route. If empty, any hop may be used. + var lastHopPubkey: Data = Data() + + /// + ///Optional route hints to reach the destination through private channels. + var routeHints: [Lnrpc_RouteHint] = [] + + /// + ///Features assumed to be supported by the final node. All transitive feature + ///dependencies must also be set properly. For a given feature bit pair, either + ///optional or remote may be set, but not both. If this field is nil or empty, + ///the router will try to load destination features from the graph as a + ///fallback. + var destFeatures: [Lnrpc_FeatureBit] = [] + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + + fileprivate var _feeLimit: Lnrpc_FeeLimit? = nil +} + +struct Lnrpc_NodePair { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + ///The sending node of the pair. When using REST, this field must be encoded as + ///base64. + var from: Data = Data() + + /// + ///The receiving node of the pair. When using REST, this field must be encoded + ///as base64. + var to: Data = Data() + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_EdgeLocator { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The short channel id of this edge. + var channelID: UInt64 = 0 + + /// + ///The direction of this edge. If direction_reverse is false, the direction + ///of this edge is from the channel endpoint with the lexicographically smaller + ///pub key to the endpoint with the larger pub key. If direction_reverse is + ///is true, the edge goes the other way. + var directionReverse: Bool = false + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_QueryRoutesResponse { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + ///The route that results from the path finding operation. This is still a + ///repeated field to retain backwards compatibility. + var routes: [Lnrpc_Route] = [] + + /// + ///The success probability of the returned route based on the current mission + ///control state. [EXPERIMENTAL] + var successProb: Double = 0 + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_Hop { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + ///The unique channel ID for the channel. The first 3 bytes are the block + ///height, the next 3 the index within the block, and the last 2 bytes are the + ///output index for the channel. + var chanID: UInt64 = 0 + + var chanCapacity: Int64 = 0 + + var amtToForward: Int64 = 0 + + var fee: Int64 = 0 + + var expiry: UInt32 = 0 + + var amtToForwardMsat: Int64 = 0 + + var feeMsat: Int64 = 0 + + /// + ///An optional public key of the hop. If the public key is given, the payment + ///can be executed without relying on a copy of the channel graph. + var pubKey: String = String() + + /// + ///If set to true, then this hop will be encoded using the new variable length + ///TLV format. Note that if any custom tlv_records below are specified, then + ///this field MUST be set to true for them to be encoded properly. + var tlvPayload: Bool = false + + /// + ///An optional TLV record that signals the use of an MPP payment. If present, + ///the receiver will enforce that that the same mpp_record is included in the + ///final hop payload of all non-zero payments in the HTLC set. If empty, a + ///regular single-shot payment is or was attempted. + var mppRecord: Lnrpc_MPPRecord { + get {return _mppRecord ?? Lnrpc_MPPRecord()} + set {_mppRecord = newValue} + } + /// Returns true if `mppRecord` has been explicitly set. + var hasMppRecord: Bool {return self._mppRecord != nil} + /// Clears the value of `mppRecord`. Subsequent reads from it will return its default value. + mutating func clearMppRecord() {self._mppRecord = nil} + + /// + ///An optional set of key-value TLV records. This is useful within the context + ///of the SendToRoute call as it allows callers to specify arbitrary K-V pairs + ///to drop off at each hop within the onion. + var customRecords: Dictionary = [:] + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + + fileprivate var _mppRecord: Lnrpc_MPPRecord? = nil +} + +struct Lnrpc_MPPRecord { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + ///A unique, random identifier used to authenticate the sender as the intended + ///payer of a multi-path payment. The payment_addr must be the same for all + ///subpayments, and match the payment_addr provided in the receiver's invoice. + ///The same payment_addr must be used on all subpayments. + var paymentAddr: Data = Data() + + /// + ///The total amount in milli-satoshis being sent as part of a larger multi-path + ///payment. The caller is responsible for ensuring subpayments to the same node + ///and payment_hash sum exactly to total_amt_msat. The same + ///total_amt_msat must be used on all subpayments. + var totalAmtMsat: Int64 = 0 + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +/// +///A path through the channel graph which runs over one or more channels in +///succession. This struct carries all the information required to craft the +///Sphinx onion packet, and send the payment along the first hop in the path. A +///route is only selected as valid if all the channels have sufficient capacity to +///carry the initial payment amount after fees are accounted for. +struct Lnrpc_Route { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + ///The cumulative (final) time lock across the entire route. This is the CLTV + ///value that should be extended to the first hop in the route. All other hops + ///will decrement the time-lock as advertised, leaving enough time for all + ///hops to wait for or present the payment preimage to complete the payment. + var totalTimeLock: UInt32 = 0 + + /// + ///The sum of the fees paid at each hop within the final route. In the case + ///of a one-hop payment, this value will be zero as we don't need to pay a fee + ///to ourselves. + var totalFees: Int64 = 0 + + /// + ///The total amount of funds required to complete a payment over this route. + ///This value includes the cumulative fees at each hop. As a result, the HTLC + ///extended to the first-hop in the route will need to have at least this many + ///satoshis, otherwise the route will fail at an intermediate node due to an + ///insufficient amount of fees. + var totalAmt: Int64 = 0 + + /// + ///Contains details concerning the specific forwarding details at each hop. + var hops: [Lnrpc_Hop] = [] + + /// + ///The total fees in millisatoshis. + var totalFeesMsat: Int64 = 0 + + /// + ///The total amount in millisatoshis. + var totalAmtMsat: Int64 = 0 + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_NodeInfoRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The 33-byte hex-encoded compressed public of the target node + var pubKey: String = String() + + /// If true, will include all known channels associated with the node. + var includeChannels: Bool = false + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_NodeInfo { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + ///An individual vertex/node within the channel graph. A node is + ///connected to other nodes by one or more channel edges emanating from it. As + ///the graph is directed, a node will also have an incoming edge attached to + ///it for each outgoing edge. + var node: Lnrpc_LightningNode { + get {return _node ?? Lnrpc_LightningNode()} + set {_node = newValue} + } + /// Returns true if `node` has been explicitly set. + var hasNode: Bool {return self._node != nil} + /// Clears the value of `node`. Subsequent reads from it will return its default value. + mutating func clearNode() {self._node = nil} + + /// The total number of channels for the node. + var numChannels: UInt32 = 0 + + /// The sum of all channels capacity for the node, denominated in satoshis. + var totalCapacity: Int64 = 0 + + /// A list of all public channels for the node. + var channels: [Lnrpc_ChannelEdge] = [] + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + + fileprivate var _node: Lnrpc_LightningNode? = nil +} + +/// +///An individual vertex/node within the channel graph. A node is +///connected to other nodes by one or more channel edges emanating from it. As the +///graph is directed, a node will also have an incoming edge attached to it for +///each outgoing edge. +struct Lnrpc_LightningNode { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var lastUpdate: UInt32 = 0 + + var pubKey: String = String() + + var alias: String = String() + + var addresses: [Lnrpc_NodeAddress] = [] + + var color: String = String() + + var features: Dictionary = [:] + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_NodeAddress { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var network: String = String() + + var addr: String = String() + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_RoutingPolicy { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var timeLockDelta: UInt32 = 0 + + var minHtlc: Int64 = 0 + + var feeBaseMsat: Int64 = 0 + + var feeRateMilliMsat: Int64 = 0 + + var disabled: Bool = false + + var maxHtlcMsat: UInt64 = 0 + + var lastUpdate: UInt32 = 0 + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +/// +///A fully authenticated channel along with all its unique attributes. +///Once an authenticated channel announcement has been processed on the network, +///then an instance of ChannelEdgeInfo encapsulating the channels attributes is +///stored. The other portions relevant to routing policy of a channel are stored +///within a ChannelEdgePolicy for each direction of the channel. +struct Lnrpc_ChannelEdge { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + ///The unique channel ID for the channel. The first 3 bytes are the block + ///height, the next 3 the index within the block, and the last 2 bytes are the + ///output index for the channel. + var channelID: UInt64 { + get {return _storage._channelID} + set {_uniqueStorage()._channelID = newValue} + } + + var chanPoint: String { + get {return _storage._chanPoint} + set {_uniqueStorage()._chanPoint = newValue} + } + + var lastUpdate: UInt32 { + get {return _storage._lastUpdate} + set {_uniqueStorage()._lastUpdate = newValue} + } + + var node1Pub: String { + get {return _storage._node1Pub} + set {_uniqueStorage()._node1Pub = newValue} + } + + var node2Pub: String { + get {return _storage._node2Pub} + set {_uniqueStorage()._node2Pub = newValue} + } + + var capacity: Int64 { + get {return _storage._capacity} + set {_uniqueStorage()._capacity = newValue} + } + + var node1Policy: Lnrpc_RoutingPolicy { + get {return _storage._node1Policy ?? Lnrpc_RoutingPolicy()} + set {_uniqueStorage()._node1Policy = newValue} + } + /// Returns true if `node1Policy` has been explicitly set. + var hasNode1Policy: Bool {return _storage._node1Policy != nil} + /// Clears the value of `node1Policy`. Subsequent reads from it will return its default value. + mutating func clearNode1Policy() {_uniqueStorage()._node1Policy = nil} + + var node2Policy: Lnrpc_RoutingPolicy { + get {return _storage._node2Policy ?? Lnrpc_RoutingPolicy()} + set {_uniqueStorage()._node2Policy = newValue} + } + /// Returns true if `node2Policy` has been explicitly set. + var hasNode2Policy: Bool {return _storage._node2Policy != nil} + /// Clears the value of `node2Policy`. Subsequent reads from it will return its default value. + mutating func clearNode2Policy() {_uniqueStorage()._node2Policy = nil} + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + + fileprivate var _storage = _StorageClass.defaultInstance +} + +struct Lnrpc_ChannelGraphRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + ///Whether unannounced channels are included in the response or not. If set, + ///unannounced channels are included. Unannounced channels are both private + ///channels, and public channels that are not yet announced to the network. + var includeUnannounced: Bool = false + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +/// Returns a new instance of the directed channel graph. +struct Lnrpc_ChannelGraph { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The list of `LightningNode`s in this channel graph + var nodes: [Lnrpc_LightningNode] = [] + + /// The list of `ChannelEdge`s in this channel graph + var edges: [Lnrpc_ChannelEdge] = [] + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_NodeMetricsRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The requested node metrics. + var types: [Lnrpc_NodeMetricType] = [] + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_NodeMetricsResponse { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + ///Betweenness centrality is the sum of the ratio of shortest paths that pass + ///through the node for each pair of nodes in the graph (not counting paths + ///starting or ending at this node). + ///Map of node pubkey to betweenness centrality of the node. Normalized + ///values are in the [0,1] closed interval. + var betweennessCentrality: Dictionary = [:] + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_FloatMetric { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// Arbitrary float value. + var value: Double = 0 + + /// The value normalized to [0,1] or [-1,1]. + var normalizedValue: Double = 0 + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_ChanInfoRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + ///The unique channel ID for the channel. The first 3 bytes are the block + ///height, the next 3 the index within the block, and the last 2 bytes are the + ///output index for the channel. + var chanID: UInt64 = 0 + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_NetworkInfoRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_NetworkInfo { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var graphDiameter: UInt32 = 0 + + var avgOutDegree: Double = 0 + + var maxOutDegree: UInt32 = 0 + + var numNodes: UInt32 = 0 + + var numChannels: UInt32 = 0 + + var totalNetworkCapacity: Int64 = 0 + + var avgChannelSize: Double = 0 + + var minChannelSize: Int64 = 0 + + var maxChannelSize: Int64 = 0 + + var medianChannelSizeSat: Int64 = 0 + + /// The number of edges marked as zombies. + var numZombieChans: UInt64 = 0 + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_StopRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_StopResponse { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_GraphTopologySubscription { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_GraphTopologyUpdate { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var nodeUpdates: [Lnrpc_NodeUpdate] = [] + + var channelUpdates: [Lnrpc_ChannelEdgeUpdate] = [] + + var closedChans: [Lnrpc_ClosedChannelUpdate] = [] + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_NodeUpdate { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var addresses: [String] = [] + + var identityKey: String = String() + + var globalFeatures: Data = Data() + + var alias: String = String() + + var color: String = String() + + /// + ///Features that the node has advertised in the init message, node + ///announcements and invoices. + var features: Dictionary = [:] + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_ChannelEdgeUpdate { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + ///The unique channel ID for the channel. The first 3 bytes are the block + ///height, the next 3 the index within the block, and the last 2 bytes are the + ///output index for the channel. + var chanID: UInt64 = 0 + + var chanPoint: Lnrpc_ChannelPoint { + get {return _chanPoint ?? Lnrpc_ChannelPoint()} + set {_chanPoint = newValue} + } + /// Returns true if `chanPoint` has been explicitly set. + var hasChanPoint: Bool {return self._chanPoint != nil} + /// Clears the value of `chanPoint`. Subsequent reads from it will return its default value. + mutating func clearChanPoint() {self._chanPoint = nil} + + var capacity: Int64 = 0 + + var routingPolicy: Lnrpc_RoutingPolicy { + get {return _routingPolicy ?? Lnrpc_RoutingPolicy()} + set {_routingPolicy = newValue} + } + /// Returns true if `routingPolicy` has been explicitly set. + var hasRoutingPolicy: Bool {return self._routingPolicy != nil} + /// Clears the value of `routingPolicy`. Subsequent reads from it will return its default value. + mutating func clearRoutingPolicy() {self._routingPolicy = nil} + + var advertisingNode: String = String() + + var connectingNode: String = String() + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + + fileprivate var _chanPoint: Lnrpc_ChannelPoint? = nil + fileprivate var _routingPolicy: Lnrpc_RoutingPolicy? = nil +} + +struct Lnrpc_ClosedChannelUpdate { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + ///The unique channel ID for the channel. The first 3 bytes are the block + ///height, the next 3 the index within the block, and the last 2 bytes are the + ///output index for the channel. + var chanID: UInt64 = 0 + + var capacity: Int64 = 0 + + var closedHeight: UInt32 = 0 + + var chanPoint: Lnrpc_ChannelPoint { + get {return _chanPoint ?? Lnrpc_ChannelPoint()} + set {_chanPoint = newValue} + } + /// Returns true if `chanPoint` has been explicitly set. + var hasChanPoint: Bool {return self._chanPoint != nil} + /// Clears the value of `chanPoint`. Subsequent reads from it will return its default value. + mutating func clearChanPoint() {self._chanPoint = nil} + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + + fileprivate var _chanPoint: Lnrpc_ChannelPoint? = nil +} + +struct Lnrpc_HopHint { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The public key of the node at the start of the channel. + var nodeID: String = String() + + /// The unique identifier of the channel. + var chanID: UInt64 = 0 + + /// The base fee of the channel denominated in millisatoshis. + var feeBaseMsat: UInt32 = 0 + + /// + ///The fee rate of the channel for sending one satoshi across it denominated in + ///millionths of a satoshi. + var feeProportionalMillionths: UInt32 = 0 + + /// The time-lock delta of the channel. + var cltvExpiryDelta: UInt32 = 0 + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_RouteHint { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + ///A list of hop hints that when chained together can assist in reaching a + ///specific destination. + var hopHints: [Lnrpc_HopHint] = [] + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_Invoice { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + ///An optional memo to attach along with the invoice. Used for record keeping + ///purposes for the invoice's creator, and will also be set in the description + ///field of the encoded payment request if the description_hash field is not + ///being used. + var memo: String { + get {return _storage._memo} + set {_uniqueStorage()._memo = newValue} + } + + /// + ///The hex-encoded preimage (32 byte) which will allow settling an incoming + ///HTLC payable to this preimage. When using REST, this field must be encoded + ///as base64. + var rPreimage: Data { + get {return _storage._rPreimage} + set {_uniqueStorage()._rPreimage = newValue} + } + + /// + ///The hash of the preimage. When using REST, this field must be encoded as + ///base64. + var rHash: Data { + get {return _storage._rHash} + set {_uniqueStorage()._rHash = newValue} + } + + /// + ///The value of this invoice in satoshis + /// + ///The fields value and value_msat are mutually exclusive. + var value: Int64 { + get {return _storage._value} + set {_uniqueStorage()._value = newValue} + } + + /// + ///The value of this invoice in millisatoshis + /// + ///The fields value and value_msat are mutually exclusive. + var valueMsat: Int64 { + get {return _storage._valueMsat} + set {_uniqueStorage()._valueMsat = newValue} + } + + /// Whether this invoice has been fulfilled + var settled: Bool { + get {return _storage._settled} + set {_uniqueStorage()._settled = newValue} + } + + /// When this invoice was created + var creationDate: Int64 { + get {return _storage._creationDate} + set {_uniqueStorage()._creationDate = newValue} + } + + /// When this invoice was settled + var settleDate: Int64 { + get {return _storage._settleDate} + set {_uniqueStorage()._settleDate = newValue} + } + + /// + ///A bare-bones invoice for a payment within the Lightning Network. With the + ///details of the invoice, the sender has all the data necessary to send a + ///payment to the recipient. + var paymentRequest: String { + get {return _storage._paymentRequest} + set {_uniqueStorage()._paymentRequest = newValue} + } + + /// + ///Hash (SHA-256) of a description of the payment. Used if the description of + ///payment (memo) is too long to naturally fit within the description field + ///of an encoded payment request. When using REST, this field must be encoded + ///as base64. + var descriptionHash: Data { + get {return _storage._descriptionHash} + set {_uniqueStorage()._descriptionHash = newValue} + } + + /// Payment request expiry time in seconds. Default is 3600 (1 hour). + var expiry: Int64 { + get {return _storage._expiry} + set {_uniqueStorage()._expiry = newValue} + } + + /// Fallback on-chain address. + var fallbackAddr: String { + get {return _storage._fallbackAddr} + set {_uniqueStorage()._fallbackAddr = newValue} + } + + /// Delta to use for the time-lock of the CLTV extended to the final hop. + var cltvExpiry: UInt64 { + get {return _storage._cltvExpiry} + set {_uniqueStorage()._cltvExpiry = newValue} + } + + /// + ///Route hints that can each be individually used to assist in reaching the + ///invoice's destination. + var routeHints: [Lnrpc_RouteHint] { + get {return _storage._routeHints} + set {_uniqueStorage()._routeHints = newValue} + } + + /// Whether this invoice should include routing hints for private channels. + var `private`: Bool { + get {return _storage._private} + set {_uniqueStorage()._private = newValue} + } + + /// + ///The "add" index of this invoice. Each newly created invoice will increment + ///this index making it monotonically increasing. Callers to the + ///SubscribeInvoices call can use this to instantly get notified of all added + ///invoices with an add_index greater than this one. + var addIndex: UInt64 { + get {return _storage._addIndex} + set {_uniqueStorage()._addIndex = newValue} + } + + /// + ///The "settle" index of this invoice. Each newly settled invoice will + ///increment this index making it monotonically increasing. Callers to the + ///SubscribeInvoices call can use this to instantly get notified of all + ///settled invoices with an settle_index greater than this one. + var settleIndex: UInt64 { + get {return _storage._settleIndex} + set {_uniqueStorage()._settleIndex = newValue} + } + + /// Deprecated, use amt_paid_sat or amt_paid_msat. + var amtPaid: Int64 { + get {return _storage._amtPaid} + set {_uniqueStorage()._amtPaid = newValue} + } + + /// + ///The amount that was accepted for this invoice, in satoshis. This will ONLY + ///be set if this invoice has been settled. We provide this field as if the + ///invoice was created with a zero value, then we need to record what amount + ///was ultimately accepted. Additionally, it's possible that the sender paid + ///MORE that was specified in the original invoice. So we'll record that here + ///as well. + var amtPaidSat: Int64 { + get {return _storage._amtPaidSat} + set {_uniqueStorage()._amtPaidSat = newValue} + } + + /// + ///The amount that was accepted for this invoice, in millisatoshis. This will + ///ONLY be set if this invoice has been settled. We provide this field as if + ///the invoice was created with a zero value, then we need to record what + ///amount was ultimately accepted. Additionally, it's possible that the sender + ///paid MORE that was specified in the original invoice. So we'll record that + ///here as well. + var amtPaidMsat: Int64 { + get {return _storage._amtPaidMsat} + set {_uniqueStorage()._amtPaidMsat = newValue} + } + + /// + ///The state the invoice is in. + var state: Lnrpc_Invoice.InvoiceState { + get {return _storage._state} + set {_uniqueStorage()._state = newValue} + } + + /// List of HTLCs paying to this invoice [EXPERIMENTAL]. + var htlcs: [Lnrpc_InvoiceHTLC] { + get {return _storage._htlcs} + set {_uniqueStorage()._htlcs = newValue} + } + + /// List of features advertised on the invoice. + var features: Dictionary { + get {return _storage._features} + set {_uniqueStorage()._features = newValue} + } + + /// + ///Indicates if this invoice was a spontaneous payment that arrived via keysend + ///[EXPERIMENTAL]. + var isKeysend: Bool { + get {return _storage._isKeysend} + set {_uniqueStorage()._isKeysend = newValue} + } + + /// + ///The payment address of this invoice. This value will be used in MPP + ///payments, and also for newer invoies that always require the MPP paylaod + ///for added end-to-end security. + var paymentAddr: Data { + get {return _storage._paymentAddr} + set {_uniqueStorage()._paymentAddr = newValue} + } + + var unknownFields = SwiftProtobuf.UnknownStorage() + + enum InvoiceState: SwiftProtobuf.Enum { + typealias RawValue = Int + case `open` // = 0 + case settled // = 1 + case canceled // = 2 + case accepted // = 3 + case UNRECOGNIZED(Int) + + init() { + self = .open + } + + init?(rawValue: Int) { + switch rawValue { + case 0: self = .open + case 1: self = .settled + case 2: self = .canceled + case 3: self = .accepted + default: self = .UNRECOGNIZED(rawValue) + } + } + + var rawValue: Int { + switch self { + case .open: return 0 + case .settled: return 1 + case .canceled: return 2 + case .accepted: return 3 + case .UNRECOGNIZED(let i): return i + } + } + + } + + init() {} + + fileprivate var _storage = _StorageClass.defaultInstance +} + +#if swift(>=4.2) + +extension Lnrpc_Invoice.InvoiceState: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + static var allCases: [Lnrpc_Invoice.InvoiceState] = [ + .open, + .settled, + .canceled, + .accepted, + ] +} + +#endif // swift(>=4.2) + +/// Details of an HTLC that paid to an invoice +struct Lnrpc_InvoiceHTLC { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// Short channel id over which the htlc was received. + var chanID: UInt64 = 0 + + /// Index identifying the htlc on the channel. + var htlcIndex: UInt64 = 0 + + /// The amount of the htlc in msat. + var amtMsat: UInt64 = 0 + + /// Block height at which this htlc was accepted. + var acceptHeight: Int32 = 0 + + /// Time at which this htlc was accepted. + var acceptTime: Int64 = 0 + + /// Time at which this htlc was settled or canceled. + var resolveTime: Int64 = 0 + + /// Block height at which this htlc expires. + var expiryHeight: Int32 = 0 + + /// Current state the htlc is in. + var state: Lnrpc_InvoiceHTLCState = .accepted + + /// Custom tlv records. + var customRecords: Dictionary = [:] + + /// The total amount of the mpp payment in msat. + var mppTotalAmtMsat: UInt64 = 0 + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_AddInvoiceResponse { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var rHash: Data = Data() + + /// + ///A bare-bones invoice for a payment within the Lightning Network. With the + ///details of the invoice, the sender has all the data necessary to send a + ///payment to the recipient. + var paymentRequest: String = String() + + /// + ///The "add" index of this invoice. Each newly created invoice will increment + ///this index making it monotonically increasing. Callers to the + ///SubscribeInvoices call can use this to instantly get notified of all added + ///invoices with an add_index greater than this one. + var addIndex: UInt64 = 0 + + /// + ///The payment address of the generated invoice. This value should be used + ///in all payments for this invoice as we require it for end to end + ///security. + var paymentAddr: Data = Data() + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_PaymentHash { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + ///The hex-encoded payment hash of the invoice to be looked up. The passed + ///payment hash must be exactly 32 bytes, otherwise an error is returned. + ///Deprecated now that the REST gateway supports base64 encoding of bytes + ///fields. + var rHashStr: String = String() + + /// + ///The payment hash of the invoice to be looked up. When using REST, this field + ///must be encoded as base64. + var rHash: Data = Data() + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_ListInvoiceRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + ///If set, only invoices that are not settled and not canceled will be returned + ///in the response. + var pendingOnly: Bool = false + + /// + ///The index of an invoice that will be used as either the start or end of a + ///query to determine which invoices should be returned in the response. + var indexOffset: UInt64 = 0 + + /// The max number of invoices to return in the response to this query. + var numMaxInvoices: UInt64 = 0 + + /// + ///If set, the invoices returned will result from seeking backwards from the + ///specified index offset. This can be used to paginate backwards. + var reversed: Bool = false + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_ListInvoiceResponse { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + ///A list of invoices from the time slice of the time series specified in the + ///request. + var invoices: [Lnrpc_Invoice] = [] + + /// + ///The index of the last item in the set of returned invoices. This can be used + ///to seek further, pagination style. + var lastIndexOffset: UInt64 = 0 + + /// + ///The index of the last item in the set of returned invoices. This can be used + ///to seek backwards, pagination style. + var firstIndexOffset: UInt64 = 0 + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_InvoiceSubscription { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + ///If specified (non-zero), then we'll first start by sending out + ///notifications for all added indexes with an add_index greater than this + ///value. This allows callers to catch up on any events they missed while they + ///weren't connected to the streaming RPC. + var addIndex: UInt64 = 0 + + /// + ///If specified (non-zero), then we'll first start by sending out + ///notifications for all settled indexes with an settle_index greater than + ///this value. This allows callers to catch up on any events they missed while + ///they weren't connected to the streaming RPC. + var settleIndex: UInt64 = 0 + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_Payment { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The payment hash + var paymentHash: String = String() + + /// Deprecated, use value_sat or value_msat. + var value: Int64 = 0 + + /// Deprecated, use creation_time_ns + var creationDate: Int64 = 0 + + /// Deprecated, use fee_sat or fee_msat. + var fee: Int64 = 0 + + /// The payment preimage + var paymentPreimage: String = String() + + /// The value of the payment in satoshis + var valueSat: Int64 = 0 + + /// The value of the payment in milli-satoshis + var valueMsat: Int64 = 0 + + /// The optional payment request being fulfilled. + var paymentRequest: String = String() + + /// The status of the payment. + var status: Lnrpc_Payment.PaymentStatus = .unknown + + /// The fee paid for this payment in satoshis + var feeSat: Int64 = 0 + + /// The fee paid for this payment in milli-satoshis + var feeMsat: Int64 = 0 + + /// The time in UNIX nanoseconds at which the payment was created. + var creationTimeNs: Int64 = 0 + + /// The HTLCs made in attempt to settle the payment. + var htlcs: [Lnrpc_HTLCAttempt] = [] + + /// + ///The creation index of this payment. Each payment can be uniquely identified + ///by this index, which may not strictly increment by 1 for payments made in + ///older versions of lnd. + var paymentIndex: UInt64 = 0 + + var failureReason: Lnrpc_PaymentFailureReason = .failureReasonNone + + var unknownFields = SwiftProtobuf.UnknownStorage() + + enum PaymentStatus: SwiftProtobuf.Enum { + typealias RawValue = Int + case unknown // = 0 + case inFlight // = 1 + case succeeded // = 2 + case failed // = 3 + case UNRECOGNIZED(Int) + + init() { + self = .unknown + } + + init?(rawValue: Int) { + switch rawValue { + case 0: self = .unknown + case 1: self = .inFlight + case 2: self = .succeeded + case 3: self = .failed + default: self = .UNRECOGNIZED(rawValue) + } + } + + var rawValue: Int { + switch self { + case .unknown: return 0 + case .inFlight: return 1 + case .succeeded: return 2 + case .failed: return 3 + case .UNRECOGNIZED(let i): return i + } + } + + } + + init() {} +} + +#if swift(>=4.2) + +extension Lnrpc_Payment.PaymentStatus: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + static var allCases: [Lnrpc_Payment.PaymentStatus] = [ + .unknown, + .inFlight, + .succeeded, + .failed, + ] +} + +#endif // swift(>=4.2) + +struct Lnrpc_HTLCAttempt { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The status of the HTLC. + var status: Lnrpc_HTLCAttempt.HTLCStatus = .inFlight + + /// The route taken by this HTLC. + var route: Lnrpc_Route { + get {return _route ?? Lnrpc_Route()} + set {_route = newValue} + } + /// Returns true if `route` has been explicitly set. + var hasRoute: Bool {return self._route != nil} + /// Clears the value of `route`. Subsequent reads from it will return its default value. + mutating func clearRoute() {self._route = nil} + + /// The time in UNIX nanoseconds at which this HTLC was sent. + var attemptTimeNs: Int64 = 0 + + /// + ///The time in UNIX nanoseconds at which this HTLC was settled or failed. + ///This value will not be set if the HTLC is still IN_FLIGHT. + var resolveTimeNs: Int64 = 0 + + /// Detailed htlc failure info. + var failure: Lnrpc_Failure { + get {return _failure ?? Lnrpc_Failure()} + set {_failure = newValue} + } + /// Returns true if `failure` has been explicitly set. + var hasFailure: Bool {return self._failure != nil} + /// Clears the value of `failure`. Subsequent reads from it will return its default value. + mutating func clearFailure() {self._failure = nil} + + /// The preimage that was used to settle the HTLC. + var preimage: Data = Data() + + var unknownFields = SwiftProtobuf.UnknownStorage() + + enum HTLCStatus: SwiftProtobuf.Enum { + typealias RawValue = Int + case inFlight // = 0 + case succeeded // = 1 + case failed // = 2 + case UNRECOGNIZED(Int) + + init() { + self = .inFlight + } + + init?(rawValue: Int) { + switch rawValue { + case 0: self = .inFlight + case 1: self = .succeeded + case 2: self = .failed + default: self = .UNRECOGNIZED(rawValue) + } + } + + var rawValue: Int { + switch self { + case .inFlight: return 0 + case .succeeded: return 1 + case .failed: return 2 + case .UNRECOGNIZED(let i): return i + } + } + + } + + init() {} + + fileprivate var _route: Lnrpc_Route? = nil + fileprivate var _failure: Lnrpc_Failure? = nil +} + +#if swift(>=4.2) + +extension Lnrpc_HTLCAttempt.HTLCStatus: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + static var allCases: [Lnrpc_HTLCAttempt.HTLCStatus] = [ + .inFlight, + .succeeded, + .failed, + ] +} + +#endif // swift(>=4.2) + +struct Lnrpc_ListPaymentsRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + ///If true, then return payments that have not yet fully completed. This means + ///that pending payments, as well as failed payments will show up if this + ///field is set to true. This flag doesn't change the meaning of the indices, + ///which are tied to individual payments. + var includeIncomplete: Bool = false + + /// + ///The index of a payment that will be used as either the start or end of a + ///query to determine which payments should be returned in the response. The + ///index_offset is exclusive. In the case of a zero index_offset, the query + ///will start with the oldest payment when paginating forwards, or will end + ///with the most recent payment when paginating backwards. + var indexOffset: UInt64 = 0 + + /// The maximal number of payments returned in the response to this query. + var maxPayments: UInt64 = 0 + + /// + ///If set, the payments returned will result from seeking backwards from the + ///specified index offset. This can be used to paginate backwards. The order + ///of the returned payments is always oldest first (ascending index order). + var reversed: Bool = false + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_ListPaymentsResponse { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The list of payments + var payments: [Lnrpc_Payment] = [] + + /// + ///The index of the first item in the set of returned payments. This can be + ///used as the index_offset to continue seeking backwards in the next request. + var firstIndexOffset: UInt64 = 0 + + /// + ///The index of the last item in the set of returned payments. This can be used + ///as the index_offset to continue seeking forwards in the next request. + var lastIndexOffset: UInt64 = 0 + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_DeleteAllPaymentsRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_DeleteAllPaymentsResponse { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_AbandonChannelRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var channelPoint: Lnrpc_ChannelPoint { + get {return _channelPoint ?? Lnrpc_ChannelPoint()} + set {_channelPoint = newValue} + } + /// Returns true if `channelPoint` has been explicitly set. + var hasChannelPoint: Bool {return self._channelPoint != nil} + /// Clears the value of `channelPoint`. Subsequent reads from it will return its default value. + mutating func clearChannelPoint() {self._channelPoint = nil} + + var pendingFundingShimOnly: Bool = false + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + + fileprivate var _channelPoint: Lnrpc_ChannelPoint? = nil +} + +struct Lnrpc_AbandonChannelResponse { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_DebugLevelRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var show: Bool = false + + var levelSpec: String = String() + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_DebugLevelResponse { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var subSystems: String = String() + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_PayReqString { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The payment request string to be decoded + var payReq: String = String() + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_PayReq { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var destination: String = String() + + var paymentHash: String = String() + + var numSatoshis: Int64 = 0 + + var timestamp: Int64 = 0 + + var expiry: Int64 = 0 + + var description_p: String = String() + + var descriptionHash: String = String() + + var fallbackAddr: String = String() + + var cltvExpiry: Int64 = 0 + + var routeHints: [Lnrpc_RouteHint] = [] + + var paymentAddr: Data = Data() + + var numMsat: Int64 = 0 + + var features: Dictionary = [:] + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_Feature { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var name: String = String() + + var isRequired: Bool = false + + var isKnown: Bool = false + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_FeeReportRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_ChannelFeeReport { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The short channel id that this fee report belongs to. + var chanID: UInt64 = 0 + + /// The channel that this fee report belongs to. + var channelPoint: String = String() + + /// The base fee charged regardless of the number of milli-satoshis sent. + var baseFeeMsat: Int64 = 0 + + /// The amount charged per milli-satoshis transferred expressed in + /// millionths of a satoshi. + var feePerMil: Int64 = 0 + + /// The effective fee rate in milli-satoshis. Computed by dividing the + /// fee_per_mil value by 1 million. + var feeRate: Double = 0 + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_FeeReportResponse { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// An array of channel fee reports which describes the current fee schedule + /// for each channel. + var channelFees: [Lnrpc_ChannelFeeReport] = [] + + /// The total amount of fee revenue (in satoshis) the switch has collected + /// over the past 24 hrs. + var dayFeeSum: UInt64 = 0 + + /// The total amount of fee revenue (in satoshis) the switch has collected + /// over the past 1 week. + var weekFeeSum: UInt64 = 0 + + /// The total amount of fee revenue (in satoshis) the switch has collected + /// over the past 1 month. + var monthFeeSum: UInt64 = 0 + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_PolicyUpdateRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var scope: Lnrpc_PolicyUpdateRequest.OneOf_Scope? = nil + + /// If set, then this update applies to all currently active channels. + var global: Bool { + get { + if case .global(let v)? = scope {return v} + return false + } + set {scope = .global(newValue)} + } + + /// If set, this update will target a specific channel. + var chanPoint: Lnrpc_ChannelPoint { + get { + if case .chanPoint(let v)? = scope {return v} + return Lnrpc_ChannelPoint() + } + set {scope = .chanPoint(newValue)} + } + + /// The base fee charged regardless of the number of milli-satoshis sent. + var baseFeeMsat: Int64 = 0 + + /// The effective fee rate in milli-satoshis. The precision of this value + /// goes up to 6 decimal places, so 1e-6. + var feeRate: Double = 0 + + /// The required timelock delta for HTLCs forwarded over the channel. + var timeLockDelta: UInt32 = 0 + + /// If set, the maximum HTLC size in milli-satoshis. If unset, the maximum + /// HTLC will be unchanged. + var maxHtlcMsat: UInt64 = 0 + + /// The minimum HTLC size in milli-satoshis. Only applied if + /// min_htlc_msat_specified is true. + var minHtlcMsat: UInt64 = 0 + + /// If true, min_htlc_msat is applied. + var minHtlcMsatSpecified: Bool = false + + var unknownFields = SwiftProtobuf.UnknownStorage() + + enum OneOf_Scope: Equatable { + /// If set, then this update applies to all currently active channels. + case global(Bool) + /// If set, this update will target a specific channel. + case chanPoint(Lnrpc_ChannelPoint) + + #if !swift(>=4.1) + static func ==(lhs: Lnrpc_PolicyUpdateRequest.OneOf_Scope, rhs: Lnrpc_PolicyUpdateRequest.OneOf_Scope) -> Bool { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch (lhs, rhs) { + case (.global, .global): return { + guard case .global(let l) = lhs, case .global(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.chanPoint, .chanPoint): return { + guard case .chanPoint(let l) = lhs, case .chanPoint(let r) = rhs else { preconditionFailure() } + return l == r + }() + default: return false + } + } + #endif + } + + init() {} +} + +struct Lnrpc_PolicyUpdateResponse { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_ForwardingHistoryRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// Start time is the starting point of the forwarding history request. All + /// records beyond this point will be included, respecting the end time, and + /// the index offset. + var startTime: UInt64 = 0 + + /// End time is the end point of the forwarding history request. The + /// response will carry at most 50k records between the start time and the + /// end time. The index offset can be used to implement pagination. + var endTime: UInt64 = 0 + + /// Index offset is the offset in the time series to start at. As each + /// response can only contain 50k records, callers can use this to skip + /// around within a packed time series. + var indexOffset: UInt32 = 0 + + /// The max number of events to return in the response to this query. + var numMaxEvents: UInt32 = 0 + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_ForwardingEvent { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// Timestamp is the time (unix epoch offset) that this circuit was + /// completed. + var timestamp: UInt64 = 0 + + /// The incoming channel ID that carried the HTLC that created the circuit. + var chanIDIn: UInt64 = 0 + + /// The outgoing channel ID that carried the preimage that completed the + /// circuit. + var chanIDOut: UInt64 = 0 + + /// The total amount (in satoshis) of the incoming HTLC that created half + /// the circuit. + var amtIn: UInt64 = 0 + + /// The total amount (in satoshis) of the outgoing HTLC that created the + /// second half of the circuit. + var amtOut: UInt64 = 0 + + /// The total fee (in satoshis) that this payment circuit carried. + var fee: UInt64 = 0 + + /// The total fee (in milli-satoshis) that this payment circuit carried. + var feeMsat: UInt64 = 0 + + /// The total amount (in milli-satoshis) of the incoming HTLC that created + /// half the circuit. + var amtInMsat: UInt64 = 0 + + /// The total amount (in milli-satoshis) of the outgoing HTLC that created + /// the second half of the circuit. + var amtOutMsat: UInt64 = 0 + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_ForwardingHistoryResponse { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// A list of forwarding events from the time slice of the time series + /// specified in the request. + var forwardingEvents: [Lnrpc_ForwardingEvent] = [] + + /// The index of the last time in the set of returned forwarding events. Can + /// be used to seek further, pagination style. + var lastOffsetIndex: UInt32 = 0 + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_ExportChannelBackupRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The target channel point to obtain a back up for. + var chanPoint: Lnrpc_ChannelPoint { + get {return _chanPoint ?? Lnrpc_ChannelPoint()} + set {_chanPoint = newValue} + } + /// Returns true if `chanPoint` has been explicitly set. + var hasChanPoint: Bool {return self._chanPoint != nil} + /// Clears the value of `chanPoint`. Subsequent reads from it will return its default value. + mutating func clearChanPoint() {self._chanPoint = nil} + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + + fileprivate var _chanPoint: Lnrpc_ChannelPoint? = nil +} + +struct Lnrpc_ChannelBackup { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + ///Identifies the channel that this backup belongs to. + var chanPoint: Lnrpc_ChannelPoint { + get {return _chanPoint ?? Lnrpc_ChannelPoint()} + set {_chanPoint = newValue} + } + /// Returns true if `chanPoint` has been explicitly set. + var hasChanPoint: Bool {return self._chanPoint != nil} + /// Clears the value of `chanPoint`. Subsequent reads from it will return its default value. + mutating func clearChanPoint() {self._chanPoint = nil} + + /// + ///Is an encrypted single-chan backup. this can be passed to + ///RestoreChannelBackups, or the WalletUnlocker Init and Unlock methods in + ///order to trigger the recovery protocol. When using REST, this field must be + ///encoded as base64. + var chanBackup: Data = Data() + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + + fileprivate var _chanPoint: Lnrpc_ChannelPoint? = nil +} + +struct Lnrpc_MultiChanBackup { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + ///Is the set of all channels that are included in this multi-channel backup. + var chanPoints: [Lnrpc_ChannelPoint] = [] + + /// + ///A single encrypted blob containing all the static channel backups of the + ///channel listed above. This can be stored as a single file or blob, and + ///safely be replaced with any prior/future versions. When using REST, this + ///field must be encoded as base64. + var multiChanBackup: Data = Data() + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_ChanBackupExportRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_ChanBackupSnapshot { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + ///The set of new channels that have been added since the last channel backup + ///snapshot was requested. + var singleChanBackups: Lnrpc_ChannelBackups { + get {return _singleChanBackups ?? Lnrpc_ChannelBackups()} + set {_singleChanBackups = newValue} + } + /// Returns true if `singleChanBackups` has been explicitly set. + var hasSingleChanBackups: Bool {return self._singleChanBackups != nil} + /// Clears the value of `singleChanBackups`. Subsequent reads from it will return its default value. + mutating func clearSingleChanBackups() {self._singleChanBackups = nil} + + /// + ///A multi-channel backup that covers all open channels currently known to + ///lnd. + var multiChanBackup: Lnrpc_MultiChanBackup { + get {return _multiChanBackup ?? Lnrpc_MultiChanBackup()} + set {_multiChanBackup = newValue} + } + /// Returns true if `multiChanBackup` has been explicitly set. + var hasMultiChanBackup: Bool {return self._multiChanBackup != nil} + /// Clears the value of `multiChanBackup`. Subsequent reads from it will return its default value. + mutating func clearMultiChanBackup() {self._multiChanBackup = nil} + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + + fileprivate var _singleChanBackups: Lnrpc_ChannelBackups? = nil + fileprivate var _multiChanBackup: Lnrpc_MultiChanBackup? = nil +} + +struct Lnrpc_ChannelBackups { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + ///A set of single-chan static channel backups. + var chanBackups: [Lnrpc_ChannelBackup] = [] + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_RestoreChanBackupRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var backup: Lnrpc_RestoreChanBackupRequest.OneOf_Backup? = nil + + /// + ///The channels to restore as a list of channel/backup pairs. + var chanBackups: Lnrpc_ChannelBackups { + get { + if case .chanBackups(let v)? = backup {return v} + return Lnrpc_ChannelBackups() + } + set {backup = .chanBackups(newValue)} + } + + /// + ///The channels to restore in the packed multi backup format. When using + ///REST, this field must be encoded as base64. + var multiChanBackup: Data { + get { + if case .multiChanBackup(let v)? = backup {return v} + return Data() + } + set {backup = .multiChanBackup(newValue)} + } + + var unknownFields = SwiftProtobuf.UnknownStorage() + + enum OneOf_Backup: Equatable { + /// + ///The channels to restore as a list of channel/backup pairs. + case chanBackups(Lnrpc_ChannelBackups) + /// + ///The channels to restore in the packed multi backup format. When using + ///REST, this field must be encoded as base64. + case multiChanBackup(Data) + + #if !swift(>=4.1) + static func ==(lhs: Lnrpc_RestoreChanBackupRequest.OneOf_Backup, rhs: Lnrpc_RestoreChanBackupRequest.OneOf_Backup) -> Bool { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch (lhs, rhs) { + case (.chanBackups, .chanBackups): return { + guard case .chanBackups(let l) = lhs, case .chanBackups(let r) = rhs else { preconditionFailure() } + return l == r + }() + case (.multiChanBackup, .multiChanBackup): return { + guard case .multiChanBackup(let l) = lhs, case .multiChanBackup(let r) = rhs else { preconditionFailure() } + return l == r + }() + default: return false + } + } + #endif + } + + init() {} +} + +struct Lnrpc_RestoreBackupResponse { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_ChannelBackupSubscription { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_VerifyChanBackupResponse { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_MacaroonPermission { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The entity a permission grants access to. + var entity: String = String() + + /// The action that is granted. + var action: String = String() + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_BakeMacaroonRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The list of permissions the new macaroon should grant. + var permissions: [Lnrpc_MacaroonPermission] = [] + + /// The root key ID used to create the macaroon, must be a positive integer. + var rootKeyID: UInt64 = 0 + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_BakeMacaroonResponse { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The hex encoded macaroon, serialized in binary format. + var macaroon: String = String() + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_ListMacaroonIDsRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_ListMacaroonIDsResponse { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The list of root key IDs that are in use. + var rootKeyIds: [UInt64] = [] + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_DeleteMacaroonIDRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// The root key ID to be removed. + var rootKeyID: UInt64 = 0 + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_DeleteMacaroonIDResponse { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// A boolean indicates that the deletion is successful. + var deleted: Bool = false + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_MacaroonPermissionList { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// A list of macaroon permissions. + var permissions: [Lnrpc_MacaroonPermission] = [] + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_ListPermissionsRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_ListPermissionsResponse { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + ///A map between all RPC method URIs and their required macaroon permissions to + ///access them. + var methodPermissions: Dictionary = [:] + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_Failure { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// Failure code as defined in the Lightning spec + var code: Lnrpc_Failure.FailureCode { + get {return _storage._code} + set {_uniqueStorage()._code = newValue} + } + + /// An optional channel update message. + var channelUpdate: Lnrpc_ChannelUpdate { + get {return _storage._channelUpdate ?? Lnrpc_ChannelUpdate()} + set {_uniqueStorage()._channelUpdate = newValue} + } + /// Returns true if `channelUpdate` has been explicitly set. + var hasChannelUpdate: Bool {return _storage._channelUpdate != nil} + /// Clears the value of `channelUpdate`. Subsequent reads from it will return its default value. + mutating func clearChannelUpdate() {_uniqueStorage()._channelUpdate = nil} + + /// A failure type-dependent htlc value. + var htlcMsat: UInt64 { + get {return _storage._htlcMsat} + set {_uniqueStorage()._htlcMsat = newValue} + } + + /// The sha256 sum of the onion payload. + var onionSha256: Data { + get {return _storage._onionSha256} + set {_uniqueStorage()._onionSha256 = newValue} + } + + /// A failure type-dependent cltv expiry value. + var cltvExpiry: UInt32 { + get {return _storage._cltvExpiry} + set {_uniqueStorage()._cltvExpiry = newValue} + } + + /// A failure type-dependent flags value. + var flags: UInt32 { + get {return _storage._flags} + set {_uniqueStorage()._flags = newValue} + } + + /// + ///The position in the path of the intermediate or final node that generated + ///the failure message. Position zero is the sender node. + var failureSourceIndex: UInt32 { + get {return _storage._failureSourceIndex} + set {_uniqueStorage()._failureSourceIndex = newValue} + } + + /// A failure type-dependent block height. + var height: UInt32 { + get {return _storage._height} + set {_uniqueStorage()._height = newValue} + } + + var unknownFields = SwiftProtobuf.UnknownStorage() + + enum FailureCode: SwiftProtobuf.Enum { + typealias RawValue = Int + + /// + ///The numbers assigned in this enumeration match the failure codes as + ///defined in BOLT #4. Because protobuf 3 requires enums to start with 0, + ///a RESERVED value is added. + case reserved // = 0 + case incorrectOrUnknownPaymentDetails // = 1 + case incorrectPaymentAmount // = 2 + case finalIncorrectCltvExpiry // = 3 + case finalIncorrectHtlcAmount // = 4 + case finalExpiryTooSoon // = 5 + case invalidRealm // = 6 + case expiryTooSoon // = 7 + case invalidOnionVersion // = 8 + case invalidOnionHmac // = 9 + case invalidOnionKey // = 10 + case amountBelowMinimum // = 11 + case feeInsufficient // = 12 + case incorrectCltvExpiry // = 13 + case channelDisabled // = 14 + case temporaryChannelFailure // = 15 + case requiredNodeFeatureMissing // = 16 + case requiredChannelFeatureMissing // = 17 + case unknownNextPeer // = 18 + case temporaryNodeFailure // = 19 + case permanentNodeFailure // = 20 + case permanentChannelFailure // = 21 + case expiryTooFar // = 22 + case mppTimeout // = 23 + + /// + ///An internal error occurred. + case internalFailure // = 997 + + /// + ///The error source is known, but the failure itself couldn't be decoded. + case unknownFailure // = 998 + + /// + ///An unreadable failure result is returned if the received failure message + ///cannot be decrypted. In that case the error source is unknown. + case unreadableFailure // = 999 + case UNRECOGNIZED(Int) + + init() { + self = .reserved + } + + init?(rawValue: Int) { + switch rawValue { + case 0: self = .reserved + case 1: self = .incorrectOrUnknownPaymentDetails + case 2: self = .incorrectPaymentAmount + case 3: self = .finalIncorrectCltvExpiry + case 4: self = .finalIncorrectHtlcAmount + case 5: self = .finalExpiryTooSoon + case 6: self = .invalidRealm + case 7: self = .expiryTooSoon + case 8: self = .invalidOnionVersion + case 9: self = .invalidOnionHmac + case 10: self = .invalidOnionKey + case 11: self = .amountBelowMinimum + case 12: self = .feeInsufficient + case 13: self = .incorrectCltvExpiry + case 14: self = .channelDisabled + case 15: self = .temporaryChannelFailure + case 16: self = .requiredNodeFeatureMissing + case 17: self = .requiredChannelFeatureMissing + case 18: self = .unknownNextPeer + case 19: self = .temporaryNodeFailure + case 20: self = .permanentNodeFailure + case 21: self = .permanentChannelFailure + case 22: self = .expiryTooFar + case 23: self = .mppTimeout + case 997: self = .internalFailure + case 998: self = .unknownFailure + case 999: self = .unreadableFailure + default: self = .UNRECOGNIZED(rawValue) + } + } + + var rawValue: Int { + switch self { + case .reserved: return 0 + case .incorrectOrUnknownPaymentDetails: return 1 + case .incorrectPaymentAmount: return 2 + case .finalIncorrectCltvExpiry: return 3 + case .finalIncorrectHtlcAmount: return 4 + case .finalExpiryTooSoon: return 5 + case .invalidRealm: return 6 + case .expiryTooSoon: return 7 + case .invalidOnionVersion: return 8 + case .invalidOnionHmac: return 9 + case .invalidOnionKey: return 10 + case .amountBelowMinimum: return 11 + case .feeInsufficient: return 12 + case .incorrectCltvExpiry: return 13 + case .channelDisabled: return 14 + case .temporaryChannelFailure: return 15 + case .requiredNodeFeatureMissing: return 16 + case .requiredChannelFeatureMissing: return 17 + case .unknownNextPeer: return 18 + case .temporaryNodeFailure: return 19 + case .permanentNodeFailure: return 20 + case .permanentChannelFailure: return 21 + case .expiryTooFar: return 22 + case .mppTimeout: return 23 + case .internalFailure: return 997 + case .unknownFailure: return 998 + case .unreadableFailure: return 999 + case .UNRECOGNIZED(let i): return i + } + } + + } + + init() {} + + fileprivate var _storage = _StorageClass.defaultInstance +} + +#if swift(>=4.2) + +extension Lnrpc_Failure.FailureCode: CaseIterable { + // The compiler won't synthesize support with the UNRECOGNIZED case. + static var allCases: [Lnrpc_Failure.FailureCode] = [ + .reserved, + .incorrectOrUnknownPaymentDetails, + .incorrectPaymentAmount, + .finalIncorrectCltvExpiry, + .finalIncorrectHtlcAmount, + .finalExpiryTooSoon, + .invalidRealm, + .expiryTooSoon, + .invalidOnionVersion, + .invalidOnionHmac, + .invalidOnionKey, + .amountBelowMinimum, + .feeInsufficient, + .incorrectCltvExpiry, + .channelDisabled, + .temporaryChannelFailure, + .requiredNodeFeatureMissing, + .requiredChannelFeatureMissing, + .unknownNextPeer, + .temporaryNodeFailure, + .permanentNodeFailure, + .permanentChannelFailure, + .expiryTooFar, + .mppTimeout, + .internalFailure, + .unknownFailure, + .unreadableFailure, + ] +} + +#endif // swift(>=4.2) + +struct Lnrpc_ChannelUpdate { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + ///The signature that validates the announced data and proves the ownership + ///of node id. + var signature: Data = Data() + + /// + ///The target chain that this channel was opened within. This value + ///should be the genesis hash of the target chain. Along with the short + ///channel ID, this uniquely identifies the channel globally in a + ///blockchain. + var chainHash: Data = Data() + + /// + ///The unique description of the funding transaction. + var chanID: UInt64 = 0 + + /// + ///A timestamp that allows ordering in the case of multiple announcements. + ///We should ignore the message if timestamp is not greater than the + ///last-received. + var timestamp: UInt32 = 0 + + /// + ///The bitfield that describes whether optional fields are present in this + ///update. Currently, the least-significant bit must be set to 1 if the + ///optional field MaxHtlc is present. + var messageFlags: UInt32 = 0 + + /// + ///The bitfield that describes additional meta-data concerning how the + ///update is to be interpreted. Currently, the least-significant bit must be + ///set to 0 if the creating node corresponds to the first node in the + ///previously sent channel announcement and 1 otherwise. If the second bit + ///is set, then the channel is set to be disabled. + var channelFlags: UInt32 = 0 + + /// + ///The minimum number of blocks this node requires to be added to the expiry + ///of HTLCs. This is a security parameter determined by the node operator. + ///This value represents the required gap between the time locks of the + ///incoming and outgoing HTLC's set to this node. + var timeLockDelta: UInt32 = 0 + + /// + ///The minimum HTLC value which will be accepted. + var htlcMinimumMsat: UInt64 = 0 + + /// + ///The base fee that must be used for incoming HTLC's to this particular + ///channel. This value will be tacked onto the required for a payment + ///independent of the size of the payment. + var baseFee: UInt32 = 0 + + /// + ///The fee rate that will be charged per millionth of a satoshi. + var feeRate: UInt32 = 0 + + /// + ///The maximum HTLC value which will be accepted. + var htlcMaximumMsat: UInt64 = 0 + + /// + ///The set of data that was appended to this message, some of which we may + ///not actually know how to iterate or parse. By holding onto this data, we + ///ensure that we're able to properly validate the set of signatures that + ///cover these new fields, and ensure we're able to make upgrades to the + ///network in a forwards compatible manner. + var extraOpaqueData: Data = Data() + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_MacaroonId { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var nonce: Data = Data() + + var storageID: Data = Data() + + var ops: [Lnrpc_Op] = [] + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_Op { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var entity: String = String() + + var actions: [String] = [] + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +// MARK: - Code below here is support for the SwiftProtobuf runtime. + +fileprivate let _protobuf_package = "lnrpc" + +extension Lnrpc_AddressType: SwiftProtobuf._ProtoNameProviding { + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 0: .same(proto: "WITNESS_PUBKEY_HASH"), + 1: .same(proto: "NESTED_PUBKEY_HASH"), + 2: .same(proto: "UNUSED_WITNESS_PUBKEY_HASH"), + 3: .same(proto: "UNUSED_NESTED_PUBKEY_HASH"), + ] +} + +extension Lnrpc_CommitmentType: SwiftProtobuf._ProtoNameProviding { + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 0: .same(proto: "LEGACY"), + 1: .same(proto: "STATIC_REMOTE_KEY"), + 2: .same(proto: "ANCHORS"), + 999: .same(proto: "UNKNOWN_COMMITMENT_TYPE"), + ] +} + +extension Lnrpc_Initiator: SwiftProtobuf._ProtoNameProviding { + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 0: .same(proto: "INITIATOR_UNKNOWN"), + 1: .same(proto: "INITIATOR_LOCAL"), + 2: .same(proto: "INITIATOR_REMOTE"), + 3: .same(proto: "INITIATOR_BOTH"), + ] +} + +extension Lnrpc_ResolutionType: SwiftProtobuf._ProtoNameProviding { + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 0: .same(proto: "TYPE_UNKNOWN"), + 1: .same(proto: "ANCHOR"), + 2: .same(proto: "INCOMING_HTLC"), + 3: .same(proto: "OUTGOING_HTLC"), + 4: .same(proto: "COMMIT"), + ] +} + +extension Lnrpc_ResolutionOutcome: SwiftProtobuf._ProtoNameProviding { + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 0: .same(proto: "OUTCOME_UNKNOWN"), + 1: .same(proto: "CLAIMED"), + 2: .same(proto: "UNCLAIMED"), + 3: .same(proto: "ABANDONED"), + 4: .same(proto: "FIRST_STAGE"), + 5: .same(proto: "TIMEOUT"), + ] +} + +extension Lnrpc_NodeMetricType: SwiftProtobuf._ProtoNameProviding { + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 0: .same(proto: "UNKNOWN"), + 1: .same(proto: "BETWEENNESS_CENTRALITY"), + ] +} + +extension Lnrpc_InvoiceHTLCState: SwiftProtobuf._ProtoNameProviding { + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 0: .same(proto: "ACCEPTED"), + 1: .same(proto: "SETTLED"), + 2: .same(proto: "CANCELED"), + ] +} + +extension Lnrpc_PaymentFailureReason: SwiftProtobuf._ProtoNameProviding { + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 0: .same(proto: "FAILURE_REASON_NONE"), + 1: .same(proto: "FAILURE_REASON_TIMEOUT"), + 2: .same(proto: "FAILURE_REASON_NO_ROUTE"), + 3: .same(proto: "FAILURE_REASON_ERROR"), + 4: .same(proto: "FAILURE_REASON_INCORRECT_PAYMENT_DETAILS"), + 5: .same(proto: "FAILURE_REASON_INSUFFICIENT_BALANCE"), + ] +} + +extension Lnrpc_FeatureBit: SwiftProtobuf._ProtoNameProviding { + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 0: .same(proto: "DATALOSS_PROTECT_REQ"), + 1: .same(proto: "DATALOSS_PROTECT_OPT"), + 3: .same(proto: "INITIAL_ROUING_SYNC"), + 4: .same(proto: "UPFRONT_SHUTDOWN_SCRIPT_REQ"), + 5: .same(proto: "UPFRONT_SHUTDOWN_SCRIPT_OPT"), + 6: .same(proto: "GOSSIP_QUERIES_REQ"), + 7: .same(proto: "GOSSIP_QUERIES_OPT"), + 8: .same(proto: "TLV_ONION_REQ"), + 9: .same(proto: "TLV_ONION_OPT"), + 10: .same(proto: "EXT_GOSSIP_QUERIES_REQ"), + 11: .same(proto: "EXT_GOSSIP_QUERIES_OPT"), + 12: .same(proto: "STATIC_REMOTE_KEY_REQ"), + 13: .same(proto: "STATIC_REMOTE_KEY_OPT"), + 14: .same(proto: "PAYMENT_ADDR_REQ"), + 15: .same(proto: "PAYMENT_ADDR_OPT"), + 16: .same(proto: "MPP_REQ"), + 17: .same(proto: "MPP_OPT"), + ] +} + +extension Lnrpc_Utxo: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".Utxo" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "address_type"), + 2: .same(proto: "address"), + 3: .standard(proto: "amount_sat"), + 4: .standard(proto: "pk_script"), + 5: .same(proto: "outpoint"), + 6: .same(proto: "confirmations"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularEnumField(value: &self.addressType) }() + case 2: try { try decoder.decodeSingularStringField(value: &self.address) }() + case 3: try { try decoder.decodeSingularInt64Field(value: &self.amountSat) }() + case 4: try { try decoder.decodeSingularStringField(value: &self.pkScript) }() + case 5: try { try decoder.decodeSingularMessageField(value: &self._outpoint) }() + case 6: try { try decoder.decodeSingularInt64Field(value: &self.confirmations) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.addressType != .witnessPubkeyHash { + try visitor.visitSingularEnumField(value: self.addressType, fieldNumber: 1) + } + if !self.address.isEmpty { + try visitor.visitSingularStringField(value: self.address, fieldNumber: 2) + } + if self.amountSat != 0 { + try visitor.visitSingularInt64Field(value: self.amountSat, fieldNumber: 3) + } + if !self.pkScript.isEmpty { + try visitor.visitSingularStringField(value: self.pkScript, fieldNumber: 4) + } + if let v = self._outpoint { + try visitor.visitSingularMessageField(value: v, fieldNumber: 5) + } + if self.confirmations != 0 { + try visitor.visitSingularInt64Field(value: self.confirmations, fieldNumber: 6) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_Utxo, rhs: Lnrpc_Utxo) -> Bool { + if lhs.addressType != rhs.addressType {return false} + if lhs.address != rhs.address {return false} + if lhs.amountSat != rhs.amountSat {return false} + if lhs.pkScript != rhs.pkScript {return false} + if lhs._outpoint != rhs._outpoint {return false} + if lhs.confirmations != rhs.confirmations {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_Transaction: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".Transaction" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "tx_hash"), + 2: .same(proto: "amount"), + 3: .standard(proto: "num_confirmations"), + 4: .standard(proto: "block_hash"), + 5: .standard(proto: "block_height"), + 6: .standard(proto: "time_stamp"), + 7: .standard(proto: "total_fees"), + 8: .standard(proto: "dest_addresses"), + 9: .standard(proto: "raw_tx_hex"), + 10: .same(proto: "label"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.txHash) }() + case 2: try { try decoder.decodeSingularInt64Field(value: &self.amount) }() + case 3: try { try decoder.decodeSingularInt32Field(value: &self.numConfirmations) }() + case 4: try { try decoder.decodeSingularStringField(value: &self.blockHash) }() + case 5: try { try decoder.decodeSingularInt32Field(value: &self.blockHeight) }() + case 6: try { try decoder.decodeSingularInt64Field(value: &self.timeStamp) }() + case 7: try { try decoder.decodeSingularInt64Field(value: &self.totalFees) }() + case 8: try { try decoder.decodeRepeatedStringField(value: &self.destAddresses) }() + case 9: try { try decoder.decodeSingularStringField(value: &self.rawTxHex) }() + case 10: try { try decoder.decodeSingularStringField(value: &self.label) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.txHash.isEmpty { + try visitor.visitSingularStringField(value: self.txHash, fieldNumber: 1) + } + if self.amount != 0 { + try visitor.visitSingularInt64Field(value: self.amount, fieldNumber: 2) + } + if self.numConfirmations != 0 { + try visitor.visitSingularInt32Field(value: self.numConfirmations, fieldNumber: 3) + } + if !self.blockHash.isEmpty { + try visitor.visitSingularStringField(value: self.blockHash, fieldNumber: 4) + } + if self.blockHeight != 0 { + try visitor.visitSingularInt32Field(value: self.blockHeight, fieldNumber: 5) + } + if self.timeStamp != 0 { + try visitor.visitSingularInt64Field(value: self.timeStamp, fieldNumber: 6) + } + if self.totalFees != 0 { + try visitor.visitSingularInt64Field(value: self.totalFees, fieldNumber: 7) + } + if !self.destAddresses.isEmpty { + try visitor.visitRepeatedStringField(value: self.destAddresses, fieldNumber: 8) + } + if !self.rawTxHex.isEmpty { + try visitor.visitSingularStringField(value: self.rawTxHex, fieldNumber: 9) + } + if !self.label.isEmpty { + try visitor.visitSingularStringField(value: self.label, fieldNumber: 10) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_Transaction, rhs: Lnrpc_Transaction) -> Bool { + if lhs.txHash != rhs.txHash {return false} + if lhs.amount != rhs.amount {return false} + if lhs.numConfirmations != rhs.numConfirmations {return false} + if lhs.blockHash != rhs.blockHash {return false} + if lhs.blockHeight != rhs.blockHeight {return false} + if lhs.timeStamp != rhs.timeStamp {return false} + if lhs.totalFees != rhs.totalFees {return false} + if lhs.destAddresses != rhs.destAddresses {return false} + if lhs.rawTxHex != rhs.rawTxHex {return false} + if lhs.label != rhs.label {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_GetTransactionsRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".GetTransactionsRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "start_height"), + 2: .standard(proto: "end_height"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularInt32Field(value: &self.startHeight) }() + case 2: try { try decoder.decodeSingularInt32Field(value: &self.endHeight) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.startHeight != 0 { + try visitor.visitSingularInt32Field(value: self.startHeight, fieldNumber: 1) + } + if self.endHeight != 0 { + try visitor.visitSingularInt32Field(value: self.endHeight, fieldNumber: 2) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_GetTransactionsRequest, rhs: Lnrpc_GetTransactionsRequest) -> Bool { + if lhs.startHeight != rhs.startHeight {return false} + if lhs.endHeight != rhs.endHeight {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_TransactionDetails: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".TransactionDetails" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "transactions"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeRepeatedMessageField(value: &self.transactions) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.transactions.isEmpty { + try visitor.visitRepeatedMessageField(value: self.transactions, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_TransactionDetails, rhs: Lnrpc_TransactionDetails) -> Bool { + if lhs.transactions != rhs.transactions {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_FeeLimit: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".FeeLimit" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "fixed"), + 3: .standard(proto: "fixed_msat"), + 2: .same(proto: "percent"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { + if self.limit != nil {try decoder.handleConflictingOneOf()} + var v: Int64? + try decoder.decodeSingularInt64Field(value: &v) + if let v = v {self.limit = .fixed(v)} + }() + case 2: try { + if self.limit != nil {try decoder.handleConflictingOneOf()} + var v: Int64? + try decoder.decodeSingularInt64Field(value: &v) + if let v = v {self.limit = .percent(v)} + }() + case 3: try { + if self.limit != nil {try decoder.handleConflictingOneOf()} + var v: Int64? + try decoder.decodeSingularInt64Field(value: &v) + if let v = v {self.limit = .fixedMsat(v)} + }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch self.limit { + case .fixed?: try { + guard case .fixed(let v)? = self.limit else { preconditionFailure() } + try visitor.visitSingularInt64Field(value: v, fieldNumber: 1) + }() + case .percent?: try { + guard case .percent(let v)? = self.limit else { preconditionFailure() } + try visitor.visitSingularInt64Field(value: v, fieldNumber: 2) + }() + case .fixedMsat?: try { + guard case .fixedMsat(let v)? = self.limit else { preconditionFailure() } + try visitor.visitSingularInt64Field(value: v, fieldNumber: 3) + }() + case nil: break + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_FeeLimit, rhs: Lnrpc_FeeLimit) -> Bool { + if lhs.limit != rhs.limit {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_SendRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".SendRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "dest"), + 2: .standard(proto: "dest_string"), + 3: .same(proto: "amt"), + 12: .standard(proto: "amt_msat"), + 4: .standard(proto: "payment_hash"), + 5: .standard(proto: "payment_hash_string"), + 6: .standard(proto: "payment_request"), + 7: .standard(proto: "final_cltv_delta"), + 8: .standard(proto: "fee_limit"), + 9: .standard(proto: "outgoing_chan_id"), + 13: .standard(proto: "last_hop_pubkey"), + 10: .standard(proto: "cltv_limit"), + 11: .standard(proto: "dest_custom_records"), + 14: .standard(proto: "allow_self_payment"), + 15: .standard(proto: "dest_features"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularBytesField(value: &self.dest) }() + case 2: try { try decoder.decodeSingularStringField(value: &self.destString) }() + case 3: try { try decoder.decodeSingularInt64Field(value: &self.amt) }() + case 4: try { try decoder.decodeSingularBytesField(value: &self.paymentHash) }() + case 5: try { try decoder.decodeSingularStringField(value: &self.paymentHashString) }() + case 6: try { try decoder.decodeSingularStringField(value: &self.paymentRequest) }() + case 7: try { try decoder.decodeSingularInt32Field(value: &self.finalCltvDelta) }() + case 8: try { try decoder.decodeSingularMessageField(value: &self._feeLimit) }() + case 9: try { try decoder.decodeSingularUInt64Field(value: &self.outgoingChanID) }() + case 10: try { try decoder.decodeSingularUInt32Field(value: &self.cltvLimit) }() + case 11: try { try decoder.decodeMapField(fieldType: SwiftProtobuf._ProtobufMap.self, value: &self.destCustomRecords) }() + case 12: try { try decoder.decodeSingularInt64Field(value: &self.amtMsat) }() + case 13: try { try decoder.decodeSingularBytesField(value: &self.lastHopPubkey) }() + case 14: try { try decoder.decodeSingularBoolField(value: &self.allowSelfPayment) }() + case 15: try { try decoder.decodeRepeatedEnumField(value: &self.destFeatures) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.dest.isEmpty { + try visitor.visitSingularBytesField(value: self.dest, fieldNumber: 1) + } + if !self.destString.isEmpty { + try visitor.visitSingularStringField(value: self.destString, fieldNumber: 2) + } + if self.amt != 0 { + try visitor.visitSingularInt64Field(value: self.amt, fieldNumber: 3) + } + if !self.paymentHash.isEmpty { + try visitor.visitSingularBytesField(value: self.paymentHash, fieldNumber: 4) + } + if !self.paymentHashString.isEmpty { + try visitor.visitSingularStringField(value: self.paymentHashString, fieldNumber: 5) + } + if !self.paymentRequest.isEmpty { + try visitor.visitSingularStringField(value: self.paymentRequest, fieldNumber: 6) + } + if self.finalCltvDelta != 0 { + try visitor.visitSingularInt32Field(value: self.finalCltvDelta, fieldNumber: 7) + } + if let v = self._feeLimit { + try visitor.visitSingularMessageField(value: v, fieldNumber: 8) + } + if self.outgoingChanID != 0 { + try visitor.visitSingularUInt64Field(value: self.outgoingChanID, fieldNumber: 9) + } + if self.cltvLimit != 0 { + try visitor.visitSingularUInt32Field(value: self.cltvLimit, fieldNumber: 10) + } + if !self.destCustomRecords.isEmpty { + try visitor.visitMapField(fieldType: SwiftProtobuf._ProtobufMap.self, value: self.destCustomRecords, fieldNumber: 11) + } + if self.amtMsat != 0 { + try visitor.visitSingularInt64Field(value: self.amtMsat, fieldNumber: 12) + } + if !self.lastHopPubkey.isEmpty { + try visitor.visitSingularBytesField(value: self.lastHopPubkey, fieldNumber: 13) + } + if self.allowSelfPayment != false { + try visitor.visitSingularBoolField(value: self.allowSelfPayment, fieldNumber: 14) + } + if !self.destFeatures.isEmpty { + try visitor.visitPackedEnumField(value: self.destFeatures, fieldNumber: 15) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_SendRequest, rhs: Lnrpc_SendRequest) -> Bool { + if lhs.dest != rhs.dest {return false} + if lhs.destString != rhs.destString {return false} + if lhs.amt != rhs.amt {return false} + if lhs.amtMsat != rhs.amtMsat {return false} + if lhs.paymentHash != rhs.paymentHash {return false} + if lhs.paymentHashString != rhs.paymentHashString {return false} + if lhs.paymentRequest != rhs.paymentRequest {return false} + if lhs.finalCltvDelta != rhs.finalCltvDelta {return false} + if lhs._feeLimit != rhs._feeLimit {return false} + if lhs.outgoingChanID != rhs.outgoingChanID {return false} + if lhs.lastHopPubkey != rhs.lastHopPubkey {return false} + if lhs.cltvLimit != rhs.cltvLimit {return false} + if lhs.destCustomRecords != rhs.destCustomRecords {return false} + if lhs.allowSelfPayment != rhs.allowSelfPayment {return false} + if lhs.destFeatures != rhs.destFeatures {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_SendResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".SendResponse" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "payment_error"), + 2: .standard(proto: "payment_preimage"), + 3: .standard(proto: "payment_route"), + 4: .standard(proto: "payment_hash"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.paymentError) }() + case 2: try { try decoder.decodeSingularBytesField(value: &self.paymentPreimage) }() + case 3: try { try decoder.decodeSingularMessageField(value: &self._paymentRoute) }() + case 4: try { try decoder.decodeSingularBytesField(value: &self.paymentHash) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.paymentError.isEmpty { + try visitor.visitSingularStringField(value: self.paymentError, fieldNumber: 1) + } + if !self.paymentPreimage.isEmpty { + try visitor.visitSingularBytesField(value: self.paymentPreimage, fieldNumber: 2) + } + if let v = self._paymentRoute { + try visitor.visitSingularMessageField(value: v, fieldNumber: 3) + } + if !self.paymentHash.isEmpty { + try visitor.visitSingularBytesField(value: self.paymentHash, fieldNumber: 4) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_SendResponse, rhs: Lnrpc_SendResponse) -> Bool { + if lhs.paymentError != rhs.paymentError {return false} + if lhs.paymentPreimage != rhs.paymentPreimage {return false} + if lhs._paymentRoute != rhs._paymentRoute {return false} + if lhs.paymentHash != rhs.paymentHash {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_SendToRouteRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".SendToRouteRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "payment_hash"), + 2: .standard(proto: "payment_hash_string"), + 4: .same(proto: "route"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularBytesField(value: &self.paymentHash) }() + case 2: try { try decoder.decodeSingularStringField(value: &self.paymentHashString) }() + case 4: try { try decoder.decodeSingularMessageField(value: &self._route) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.paymentHash.isEmpty { + try visitor.visitSingularBytesField(value: self.paymentHash, fieldNumber: 1) + } + if !self.paymentHashString.isEmpty { + try visitor.visitSingularStringField(value: self.paymentHashString, fieldNumber: 2) + } + if let v = self._route { + try visitor.visitSingularMessageField(value: v, fieldNumber: 4) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_SendToRouteRequest, rhs: Lnrpc_SendToRouteRequest) -> Bool { + if lhs.paymentHash != rhs.paymentHash {return false} + if lhs.paymentHashString != rhs.paymentHashString {return false} + if lhs._route != rhs._route {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ChannelAcceptRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ChannelAcceptRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "node_pubkey"), + 2: .standard(proto: "chain_hash"), + 3: .standard(proto: "pending_chan_id"), + 4: .standard(proto: "funding_amt"), + 5: .standard(proto: "push_amt"), + 6: .standard(proto: "dust_limit"), + 7: .standard(proto: "max_value_in_flight"), + 8: .standard(proto: "channel_reserve"), + 9: .standard(proto: "min_htlc"), + 10: .standard(proto: "fee_per_kw"), + 11: .standard(proto: "csv_delay"), + 12: .standard(proto: "max_accepted_htlcs"), + 13: .standard(proto: "channel_flags"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularBytesField(value: &self.nodePubkey) }() + case 2: try { try decoder.decodeSingularBytesField(value: &self.chainHash) }() + case 3: try { try decoder.decodeSingularBytesField(value: &self.pendingChanID) }() + case 4: try { try decoder.decodeSingularUInt64Field(value: &self.fundingAmt) }() + case 5: try { try decoder.decodeSingularUInt64Field(value: &self.pushAmt) }() + case 6: try { try decoder.decodeSingularUInt64Field(value: &self.dustLimit) }() + case 7: try { try decoder.decodeSingularUInt64Field(value: &self.maxValueInFlight) }() + case 8: try { try decoder.decodeSingularUInt64Field(value: &self.channelReserve) }() + case 9: try { try decoder.decodeSingularUInt64Field(value: &self.minHtlc) }() + case 10: try { try decoder.decodeSingularUInt64Field(value: &self.feePerKw) }() + case 11: try { try decoder.decodeSingularUInt32Field(value: &self.csvDelay) }() + case 12: try { try decoder.decodeSingularUInt32Field(value: &self.maxAcceptedHtlcs) }() + case 13: try { try decoder.decodeSingularUInt32Field(value: &self.channelFlags) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.nodePubkey.isEmpty { + try visitor.visitSingularBytesField(value: self.nodePubkey, fieldNumber: 1) + } + if !self.chainHash.isEmpty { + try visitor.visitSingularBytesField(value: self.chainHash, fieldNumber: 2) + } + if !self.pendingChanID.isEmpty { + try visitor.visitSingularBytesField(value: self.pendingChanID, fieldNumber: 3) + } + if self.fundingAmt != 0 { + try visitor.visitSingularUInt64Field(value: self.fundingAmt, fieldNumber: 4) + } + if self.pushAmt != 0 { + try visitor.visitSingularUInt64Field(value: self.pushAmt, fieldNumber: 5) + } + if self.dustLimit != 0 { + try visitor.visitSingularUInt64Field(value: self.dustLimit, fieldNumber: 6) + } + if self.maxValueInFlight != 0 { + try visitor.visitSingularUInt64Field(value: self.maxValueInFlight, fieldNumber: 7) + } + if self.channelReserve != 0 { + try visitor.visitSingularUInt64Field(value: self.channelReserve, fieldNumber: 8) + } + if self.minHtlc != 0 { + try visitor.visitSingularUInt64Field(value: self.minHtlc, fieldNumber: 9) + } + if self.feePerKw != 0 { + try visitor.visitSingularUInt64Field(value: self.feePerKw, fieldNumber: 10) + } + if self.csvDelay != 0 { + try visitor.visitSingularUInt32Field(value: self.csvDelay, fieldNumber: 11) + } + if self.maxAcceptedHtlcs != 0 { + try visitor.visitSingularUInt32Field(value: self.maxAcceptedHtlcs, fieldNumber: 12) + } + if self.channelFlags != 0 { + try visitor.visitSingularUInt32Field(value: self.channelFlags, fieldNumber: 13) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ChannelAcceptRequest, rhs: Lnrpc_ChannelAcceptRequest) -> Bool { + if lhs.nodePubkey != rhs.nodePubkey {return false} + if lhs.chainHash != rhs.chainHash {return false} + if lhs.pendingChanID != rhs.pendingChanID {return false} + if lhs.fundingAmt != rhs.fundingAmt {return false} + if lhs.pushAmt != rhs.pushAmt {return false} + if lhs.dustLimit != rhs.dustLimit {return false} + if lhs.maxValueInFlight != rhs.maxValueInFlight {return false} + if lhs.channelReserve != rhs.channelReserve {return false} + if lhs.minHtlc != rhs.minHtlc {return false} + if lhs.feePerKw != rhs.feePerKw {return false} + if lhs.csvDelay != rhs.csvDelay {return false} + if lhs.maxAcceptedHtlcs != rhs.maxAcceptedHtlcs {return false} + if lhs.channelFlags != rhs.channelFlags {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ChannelAcceptResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ChannelAcceptResponse" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "accept"), + 2: .standard(proto: "pending_chan_id"), + 3: .same(proto: "error"), + 4: .standard(proto: "upfront_shutdown"), + 5: .standard(proto: "csv_delay"), + 6: .standard(proto: "reserve_sat"), + 7: .standard(proto: "in_flight_max_msat"), + 8: .standard(proto: "max_htlc_count"), + 9: .standard(proto: "min_htlc_in"), + 10: .standard(proto: "min_accept_depth"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularBoolField(value: &self.accept) }() + case 2: try { try decoder.decodeSingularBytesField(value: &self.pendingChanID) }() + case 3: try { try decoder.decodeSingularStringField(value: &self.error) }() + case 4: try { try decoder.decodeSingularStringField(value: &self.upfrontShutdown) }() + case 5: try { try decoder.decodeSingularUInt32Field(value: &self.csvDelay) }() + case 6: try { try decoder.decodeSingularUInt64Field(value: &self.reserveSat) }() + case 7: try { try decoder.decodeSingularUInt64Field(value: &self.inFlightMaxMsat) }() + case 8: try { try decoder.decodeSingularUInt32Field(value: &self.maxHtlcCount) }() + case 9: try { try decoder.decodeSingularUInt64Field(value: &self.minHtlcIn) }() + case 10: try { try decoder.decodeSingularUInt32Field(value: &self.minAcceptDepth) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.accept != false { + try visitor.visitSingularBoolField(value: self.accept, fieldNumber: 1) + } + if !self.pendingChanID.isEmpty { + try visitor.visitSingularBytesField(value: self.pendingChanID, fieldNumber: 2) + } + if !self.error.isEmpty { + try visitor.visitSingularStringField(value: self.error, fieldNumber: 3) + } + if !self.upfrontShutdown.isEmpty { + try visitor.visitSingularStringField(value: self.upfrontShutdown, fieldNumber: 4) + } + if self.csvDelay != 0 { + try visitor.visitSingularUInt32Field(value: self.csvDelay, fieldNumber: 5) + } + if self.reserveSat != 0 { + try visitor.visitSingularUInt64Field(value: self.reserveSat, fieldNumber: 6) + } + if self.inFlightMaxMsat != 0 { + try visitor.visitSingularUInt64Field(value: self.inFlightMaxMsat, fieldNumber: 7) + } + if self.maxHtlcCount != 0 { + try visitor.visitSingularUInt32Field(value: self.maxHtlcCount, fieldNumber: 8) + } + if self.minHtlcIn != 0 { + try visitor.visitSingularUInt64Field(value: self.minHtlcIn, fieldNumber: 9) + } + if self.minAcceptDepth != 0 { + try visitor.visitSingularUInt32Field(value: self.minAcceptDepth, fieldNumber: 10) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ChannelAcceptResponse, rhs: Lnrpc_ChannelAcceptResponse) -> Bool { + if lhs.accept != rhs.accept {return false} + if lhs.pendingChanID != rhs.pendingChanID {return false} + if lhs.error != rhs.error {return false} + if lhs.upfrontShutdown != rhs.upfrontShutdown {return false} + if lhs.csvDelay != rhs.csvDelay {return false} + if lhs.reserveSat != rhs.reserveSat {return false} + if lhs.inFlightMaxMsat != rhs.inFlightMaxMsat {return false} + if lhs.maxHtlcCount != rhs.maxHtlcCount {return false} + if lhs.minHtlcIn != rhs.minHtlcIn {return false} + if lhs.minAcceptDepth != rhs.minAcceptDepth {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ChannelPoint: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ChannelPoint" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "funding_txid_bytes"), + 2: .standard(proto: "funding_txid_str"), + 3: .standard(proto: "output_index"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { + if self.fundingTxid != nil {try decoder.handleConflictingOneOf()} + var v: Data? + try decoder.decodeSingularBytesField(value: &v) + if let v = v {self.fundingTxid = .fundingTxidBytes(v)} + }() + case 2: try { + if self.fundingTxid != nil {try decoder.handleConflictingOneOf()} + var v: String? + try decoder.decodeSingularStringField(value: &v) + if let v = v {self.fundingTxid = .fundingTxidStr(v)} + }() + case 3: try { try decoder.decodeSingularUInt32Field(value: &self.outputIndex) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch self.fundingTxid { + case .fundingTxidBytes?: try { + guard case .fundingTxidBytes(let v)? = self.fundingTxid else { preconditionFailure() } + try visitor.visitSingularBytesField(value: v, fieldNumber: 1) + }() + case .fundingTxidStr?: try { + guard case .fundingTxidStr(let v)? = self.fundingTxid else { preconditionFailure() } + try visitor.visitSingularStringField(value: v, fieldNumber: 2) + }() + case nil: break + } + if self.outputIndex != 0 { + try visitor.visitSingularUInt32Field(value: self.outputIndex, fieldNumber: 3) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ChannelPoint, rhs: Lnrpc_ChannelPoint) -> Bool { + if lhs.fundingTxid != rhs.fundingTxid {return false} + if lhs.outputIndex != rhs.outputIndex {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_OutPoint: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".OutPoint" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "txid_bytes"), + 2: .standard(proto: "txid_str"), + 3: .standard(proto: "output_index"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularBytesField(value: &self.txidBytes) }() + case 2: try { try decoder.decodeSingularStringField(value: &self.txidStr) }() + case 3: try { try decoder.decodeSingularUInt32Field(value: &self.outputIndex) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.txidBytes.isEmpty { + try visitor.visitSingularBytesField(value: self.txidBytes, fieldNumber: 1) + } + if !self.txidStr.isEmpty { + try visitor.visitSingularStringField(value: self.txidStr, fieldNumber: 2) + } + if self.outputIndex != 0 { + try visitor.visitSingularUInt32Field(value: self.outputIndex, fieldNumber: 3) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_OutPoint, rhs: Lnrpc_OutPoint) -> Bool { + if lhs.txidBytes != rhs.txidBytes {return false} + if lhs.txidStr != rhs.txidStr {return false} + if lhs.outputIndex != rhs.outputIndex {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_LightningAddress: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".LightningAddress" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "pubkey"), + 2: .same(proto: "host"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.pubkey) }() + case 2: try { try decoder.decodeSingularStringField(value: &self.host) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.pubkey.isEmpty { + try visitor.visitSingularStringField(value: self.pubkey, fieldNumber: 1) + } + if !self.host.isEmpty { + try visitor.visitSingularStringField(value: self.host, fieldNumber: 2) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_LightningAddress, rhs: Lnrpc_LightningAddress) -> Bool { + if lhs.pubkey != rhs.pubkey {return false} + if lhs.host != rhs.host {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_EstimateFeeRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".EstimateFeeRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "AddrToAmount"), + 2: .standard(proto: "target_conf"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeMapField(fieldType: SwiftProtobuf._ProtobufMap.self, value: &self.addrToAmount) }() + case 2: try { try decoder.decodeSingularInt32Field(value: &self.targetConf) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.addrToAmount.isEmpty { + try visitor.visitMapField(fieldType: SwiftProtobuf._ProtobufMap.self, value: self.addrToAmount, fieldNumber: 1) + } + if self.targetConf != 0 { + try visitor.visitSingularInt32Field(value: self.targetConf, fieldNumber: 2) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_EstimateFeeRequest, rhs: Lnrpc_EstimateFeeRequest) -> Bool { + if lhs.addrToAmount != rhs.addrToAmount {return false} + if lhs.targetConf != rhs.targetConf {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_EstimateFeeResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".EstimateFeeResponse" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "fee_sat"), + 2: .standard(proto: "feerate_sat_per_byte"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularInt64Field(value: &self.feeSat) }() + case 2: try { try decoder.decodeSingularInt64Field(value: &self.feerateSatPerByte) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.feeSat != 0 { + try visitor.visitSingularInt64Field(value: self.feeSat, fieldNumber: 1) + } + if self.feerateSatPerByte != 0 { + try visitor.visitSingularInt64Field(value: self.feerateSatPerByte, fieldNumber: 2) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_EstimateFeeResponse, rhs: Lnrpc_EstimateFeeResponse) -> Bool { + if lhs.feeSat != rhs.feeSat {return false} + if lhs.feerateSatPerByte != rhs.feerateSatPerByte {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_SendManyRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".SendManyRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "AddrToAmount"), + 3: .standard(proto: "target_conf"), + 5: .standard(proto: "sat_per_byte"), + 6: .same(proto: "label"), + 7: .standard(proto: "min_confs"), + 8: .standard(proto: "spend_unconfirmed"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeMapField(fieldType: SwiftProtobuf._ProtobufMap.self, value: &self.addrToAmount) }() + case 3: try { try decoder.decodeSingularInt32Field(value: &self.targetConf) }() + case 5: try { try decoder.decodeSingularInt64Field(value: &self.satPerByte) }() + case 6: try { try decoder.decodeSingularStringField(value: &self.label) }() + case 7: try { try decoder.decodeSingularInt32Field(value: &self.minConfs) }() + case 8: try { try decoder.decodeSingularBoolField(value: &self.spendUnconfirmed) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.addrToAmount.isEmpty { + try visitor.visitMapField(fieldType: SwiftProtobuf._ProtobufMap.self, value: self.addrToAmount, fieldNumber: 1) + } + if self.targetConf != 0 { + try visitor.visitSingularInt32Field(value: self.targetConf, fieldNumber: 3) + } + if self.satPerByte != 0 { + try visitor.visitSingularInt64Field(value: self.satPerByte, fieldNumber: 5) + } + if !self.label.isEmpty { + try visitor.visitSingularStringField(value: self.label, fieldNumber: 6) + } + if self.minConfs != 0 { + try visitor.visitSingularInt32Field(value: self.minConfs, fieldNumber: 7) + } + if self.spendUnconfirmed != false { + try visitor.visitSingularBoolField(value: self.spendUnconfirmed, fieldNumber: 8) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_SendManyRequest, rhs: Lnrpc_SendManyRequest) -> Bool { + if lhs.addrToAmount != rhs.addrToAmount {return false} + if lhs.targetConf != rhs.targetConf {return false} + if lhs.satPerByte != rhs.satPerByte {return false} + if lhs.label != rhs.label {return false} + if lhs.minConfs != rhs.minConfs {return false} + if lhs.spendUnconfirmed != rhs.spendUnconfirmed {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_SendManyResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".SendManyResponse" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "txid"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.txid) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.txid.isEmpty { + try visitor.visitSingularStringField(value: self.txid, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_SendManyResponse, rhs: Lnrpc_SendManyResponse) -> Bool { + if lhs.txid != rhs.txid {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_SendCoinsRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".SendCoinsRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "addr"), + 2: .same(proto: "amount"), + 3: .standard(proto: "target_conf"), + 5: .standard(proto: "sat_per_byte"), + 6: .standard(proto: "send_all"), + 7: .same(proto: "label"), + 8: .standard(proto: "min_confs"), + 9: .standard(proto: "spend_unconfirmed"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.addr) }() + case 2: try { try decoder.decodeSingularInt64Field(value: &self.amount) }() + case 3: try { try decoder.decodeSingularInt32Field(value: &self.targetConf) }() + case 5: try { try decoder.decodeSingularInt64Field(value: &self.satPerByte) }() + case 6: try { try decoder.decodeSingularBoolField(value: &self.sendAll) }() + case 7: try { try decoder.decodeSingularStringField(value: &self.label) }() + case 8: try { try decoder.decodeSingularInt32Field(value: &self.minConfs) }() + case 9: try { try decoder.decodeSingularBoolField(value: &self.spendUnconfirmed) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.addr.isEmpty { + try visitor.visitSingularStringField(value: self.addr, fieldNumber: 1) + } + if self.amount != 0 { + try visitor.visitSingularInt64Field(value: self.amount, fieldNumber: 2) + } + if self.targetConf != 0 { + try visitor.visitSingularInt32Field(value: self.targetConf, fieldNumber: 3) + } + if self.satPerByte != 0 { + try visitor.visitSingularInt64Field(value: self.satPerByte, fieldNumber: 5) + } + if self.sendAll != false { + try visitor.visitSingularBoolField(value: self.sendAll, fieldNumber: 6) + } + if !self.label.isEmpty { + try visitor.visitSingularStringField(value: self.label, fieldNumber: 7) + } + if self.minConfs != 0 { + try visitor.visitSingularInt32Field(value: self.minConfs, fieldNumber: 8) + } + if self.spendUnconfirmed != false { + try visitor.visitSingularBoolField(value: self.spendUnconfirmed, fieldNumber: 9) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_SendCoinsRequest, rhs: Lnrpc_SendCoinsRequest) -> Bool { + if lhs.addr != rhs.addr {return false} + if lhs.amount != rhs.amount {return false} + if lhs.targetConf != rhs.targetConf {return false} + if lhs.satPerByte != rhs.satPerByte {return false} + if lhs.sendAll != rhs.sendAll {return false} + if lhs.label != rhs.label {return false} + if lhs.minConfs != rhs.minConfs {return false} + if lhs.spendUnconfirmed != rhs.spendUnconfirmed {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_SendCoinsResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".SendCoinsResponse" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "txid"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.txid) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.txid.isEmpty { + try visitor.visitSingularStringField(value: self.txid, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_SendCoinsResponse, rhs: Lnrpc_SendCoinsResponse) -> Bool { + if lhs.txid != rhs.txid {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ListUnspentRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ListUnspentRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "min_confs"), + 2: .standard(proto: "max_confs"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularInt32Field(value: &self.minConfs) }() + case 2: try { try decoder.decodeSingularInt32Field(value: &self.maxConfs) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.minConfs != 0 { + try visitor.visitSingularInt32Field(value: self.minConfs, fieldNumber: 1) + } + if self.maxConfs != 0 { + try visitor.visitSingularInt32Field(value: self.maxConfs, fieldNumber: 2) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ListUnspentRequest, rhs: Lnrpc_ListUnspentRequest) -> Bool { + if lhs.minConfs != rhs.minConfs {return false} + if lhs.maxConfs != rhs.maxConfs {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ListUnspentResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ListUnspentResponse" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "utxos"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeRepeatedMessageField(value: &self.utxos) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.utxos.isEmpty { + try visitor.visitRepeatedMessageField(value: self.utxos, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ListUnspentResponse, rhs: Lnrpc_ListUnspentResponse) -> Bool { + if lhs.utxos != rhs.utxos {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_NewAddressRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".NewAddressRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "type"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularEnumField(value: &self.type) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.type != .witnessPubkeyHash { + try visitor.visitSingularEnumField(value: self.type, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_NewAddressRequest, rhs: Lnrpc_NewAddressRequest) -> Bool { + if lhs.type != rhs.type {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_NewAddressResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".NewAddressResponse" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "address"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.address) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.address.isEmpty { + try visitor.visitSingularStringField(value: self.address, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_NewAddressResponse, rhs: Lnrpc_NewAddressResponse) -> Bool { + if lhs.address != rhs.address {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_SignMessageRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".SignMessageRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "msg"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularBytesField(value: &self.msg) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.msg.isEmpty { + try visitor.visitSingularBytesField(value: self.msg, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_SignMessageRequest, rhs: Lnrpc_SignMessageRequest) -> Bool { + if lhs.msg != rhs.msg {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_SignMessageResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".SignMessageResponse" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "signature"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.signature) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.signature.isEmpty { + try visitor.visitSingularStringField(value: self.signature, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_SignMessageResponse, rhs: Lnrpc_SignMessageResponse) -> Bool { + if lhs.signature != rhs.signature {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_VerifyMessageRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".VerifyMessageRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "msg"), + 2: .same(proto: "signature"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularBytesField(value: &self.msg) }() + case 2: try { try decoder.decodeSingularStringField(value: &self.signature) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.msg.isEmpty { + try visitor.visitSingularBytesField(value: self.msg, fieldNumber: 1) + } + if !self.signature.isEmpty { + try visitor.visitSingularStringField(value: self.signature, fieldNumber: 2) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_VerifyMessageRequest, rhs: Lnrpc_VerifyMessageRequest) -> Bool { + if lhs.msg != rhs.msg {return false} + if lhs.signature != rhs.signature {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_VerifyMessageResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".VerifyMessageResponse" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "valid"), + 2: .same(proto: "pubkey"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularBoolField(value: &self.valid) }() + case 2: try { try decoder.decodeSingularStringField(value: &self.pubkey) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.valid != false { + try visitor.visitSingularBoolField(value: self.valid, fieldNumber: 1) + } + if !self.pubkey.isEmpty { + try visitor.visitSingularStringField(value: self.pubkey, fieldNumber: 2) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_VerifyMessageResponse, rhs: Lnrpc_VerifyMessageResponse) -> Bool { + if lhs.valid != rhs.valid {return false} + if lhs.pubkey != rhs.pubkey {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ConnectPeerRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ConnectPeerRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "addr"), + 2: .same(proto: "perm"), + 3: .same(proto: "timeout"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularMessageField(value: &self._addr) }() + case 2: try { try decoder.decodeSingularBoolField(value: &self.perm) }() + case 3: try { try decoder.decodeSingularUInt64Field(value: &self.timeout) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if let v = self._addr { + try visitor.visitSingularMessageField(value: v, fieldNumber: 1) + } + if self.perm != false { + try visitor.visitSingularBoolField(value: self.perm, fieldNumber: 2) + } + if self.timeout != 0 { + try visitor.visitSingularUInt64Field(value: self.timeout, fieldNumber: 3) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ConnectPeerRequest, rhs: Lnrpc_ConnectPeerRequest) -> Bool { + if lhs._addr != rhs._addr {return false} + if lhs.perm != rhs.perm {return false} + if lhs.timeout != rhs.timeout {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ConnectPeerResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ConnectPeerResponse" + static let _protobuf_nameMap = SwiftProtobuf._NameMap() + + mutating func decodeMessage(decoder: inout D) throws { + while let _ = try decoder.nextFieldNumber() { + } + } + + func traverse(visitor: inout V) throws { + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ConnectPeerResponse, rhs: Lnrpc_ConnectPeerResponse) -> Bool { + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_DisconnectPeerRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".DisconnectPeerRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "pub_key"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.pubKey) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.pubKey.isEmpty { + try visitor.visitSingularStringField(value: self.pubKey, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_DisconnectPeerRequest, rhs: Lnrpc_DisconnectPeerRequest) -> Bool { + if lhs.pubKey != rhs.pubKey {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_DisconnectPeerResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".DisconnectPeerResponse" + static let _protobuf_nameMap = SwiftProtobuf._NameMap() + + mutating func decodeMessage(decoder: inout D) throws { + while let _ = try decoder.nextFieldNumber() { + } + } + + func traverse(visitor: inout V) throws { + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_DisconnectPeerResponse, rhs: Lnrpc_DisconnectPeerResponse) -> Bool { + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_HTLC: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".HTLC" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "incoming"), + 2: .same(proto: "amount"), + 3: .standard(proto: "hash_lock"), + 4: .standard(proto: "expiration_height"), + 5: .standard(proto: "htlc_index"), + 6: .standard(proto: "forwarding_channel"), + 7: .standard(proto: "forwarding_htlc_index"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularBoolField(value: &self.incoming) }() + case 2: try { try decoder.decodeSingularInt64Field(value: &self.amount) }() + case 3: try { try decoder.decodeSingularBytesField(value: &self.hashLock) }() + case 4: try { try decoder.decodeSingularUInt32Field(value: &self.expirationHeight) }() + case 5: try { try decoder.decodeSingularUInt64Field(value: &self.htlcIndex) }() + case 6: try { try decoder.decodeSingularUInt64Field(value: &self.forwardingChannel) }() + case 7: try { try decoder.decodeSingularUInt64Field(value: &self.forwardingHtlcIndex) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.incoming != false { + try visitor.visitSingularBoolField(value: self.incoming, fieldNumber: 1) + } + if self.amount != 0 { + try visitor.visitSingularInt64Field(value: self.amount, fieldNumber: 2) + } + if !self.hashLock.isEmpty { + try visitor.visitSingularBytesField(value: self.hashLock, fieldNumber: 3) + } + if self.expirationHeight != 0 { + try visitor.visitSingularUInt32Field(value: self.expirationHeight, fieldNumber: 4) + } + if self.htlcIndex != 0 { + try visitor.visitSingularUInt64Field(value: self.htlcIndex, fieldNumber: 5) + } + if self.forwardingChannel != 0 { + try visitor.visitSingularUInt64Field(value: self.forwardingChannel, fieldNumber: 6) + } + if self.forwardingHtlcIndex != 0 { + try visitor.visitSingularUInt64Field(value: self.forwardingHtlcIndex, fieldNumber: 7) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_HTLC, rhs: Lnrpc_HTLC) -> Bool { + if lhs.incoming != rhs.incoming {return false} + if lhs.amount != rhs.amount {return false} + if lhs.hashLock != rhs.hashLock {return false} + if lhs.expirationHeight != rhs.expirationHeight {return false} + if lhs.htlcIndex != rhs.htlcIndex {return false} + if lhs.forwardingChannel != rhs.forwardingChannel {return false} + if lhs.forwardingHtlcIndex != rhs.forwardingHtlcIndex {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ChannelConstraints: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ChannelConstraints" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "csv_delay"), + 2: .standard(proto: "chan_reserve_sat"), + 3: .standard(proto: "dust_limit_sat"), + 4: .standard(proto: "max_pending_amt_msat"), + 5: .standard(proto: "min_htlc_msat"), + 6: .standard(proto: "max_accepted_htlcs"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularUInt32Field(value: &self.csvDelay) }() + case 2: try { try decoder.decodeSingularUInt64Field(value: &self.chanReserveSat) }() + case 3: try { try decoder.decodeSingularUInt64Field(value: &self.dustLimitSat) }() + case 4: try { try decoder.decodeSingularUInt64Field(value: &self.maxPendingAmtMsat) }() + case 5: try { try decoder.decodeSingularUInt64Field(value: &self.minHtlcMsat) }() + case 6: try { try decoder.decodeSingularUInt32Field(value: &self.maxAcceptedHtlcs) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.csvDelay != 0 { + try visitor.visitSingularUInt32Field(value: self.csvDelay, fieldNumber: 1) + } + if self.chanReserveSat != 0 { + try visitor.visitSingularUInt64Field(value: self.chanReserveSat, fieldNumber: 2) + } + if self.dustLimitSat != 0 { + try visitor.visitSingularUInt64Field(value: self.dustLimitSat, fieldNumber: 3) + } + if self.maxPendingAmtMsat != 0 { + try visitor.visitSingularUInt64Field(value: self.maxPendingAmtMsat, fieldNumber: 4) + } + if self.minHtlcMsat != 0 { + try visitor.visitSingularUInt64Field(value: self.minHtlcMsat, fieldNumber: 5) + } + if self.maxAcceptedHtlcs != 0 { + try visitor.visitSingularUInt32Field(value: self.maxAcceptedHtlcs, fieldNumber: 6) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ChannelConstraints, rhs: Lnrpc_ChannelConstraints) -> Bool { + if lhs.csvDelay != rhs.csvDelay {return false} + if lhs.chanReserveSat != rhs.chanReserveSat {return false} + if lhs.dustLimitSat != rhs.dustLimitSat {return false} + if lhs.maxPendingAmtMsat != rhs.maxPendingAmtMsat {return false} + if lhs.minHtlcMsat != rhs.minHtlcMsat {return false} + if lhs.maxAcceptedHtlcs != rhs.maxAcceptedHtlcs {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_Channel: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".Channel" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "active"), + 2: .standard(proto: "remote_pubkey"), + 3: .standard(proto: "channel_point"), + 4: .standard(proto: "chan_id"), + 5: .same(proto: "capacity"), + 6: .standard(proto: "local_balance"), + 7: .standard(proto: "remote_balance"), + 8: .standard(proto: "commit_fee"), + 9: .standard(proto: "commit_weight"), + 10: .standard(proto: "fee_per_kw"), + 11: .standard(proto: "unsettled_balance"), + 12: .standard(proto: "total_satoshis_sent"), + 13: .standard(proto: "total_satoshis_received"), + 14: .standard(proto: "num_updates"), + 15: .standard(proto: "pending_htlcs"), + 16: .standard(proto: "csv_delay"), + 17: .same(proto: "private"), + 18: .same(proto: "initiator"), + 19: .standard(proto: "chan_status_flags"), + 20: .standard(proto: "local_chan_reserve_sat"), + 21: .standard(proto: "remote_chan_reserve_sat"), + 22: .standard(proto: "static_remote_key"), + 26: .standard(proto: "commitment_type"), + 23: .same(proto: "lifetime"), + 24: .same(proto: "uptime"), + 25: .standard(proto: "close_address"), + 27: .standard(proto: "push_amount_sat"), + 28: .standard(proto: "thaw_height"), + 29: .standard(proto: "local_constraints"), + 30: .standard(proto: "remote_constraints"), + ] + + fileprivate class _StorageClass { + var _active: Bool = false + var _remotePubkey: String = String() + var _channelPoint: String = String() + var _chanID: UInt64 = 0 + var _capacity: Int64 = 0 + var _localBalance: Int64 = 0 + var _remoteBalance: Int64 = 0 + var _commitFee: Int64 = 0 + var _commitWeight: Int64 = 0 + var _feePerKw: Int64 = 0 + var _unsettledBalance: Int64 = 0 + var _totalSatoshisSent: Int64 = 0 + var _totalSatoshisReceived: Int64 = 0 + var _numUpdates: UInt64 = 0 + var _pendingHtlcs: [Lnrpc_HTLC] = [] + var _csvDelay: UInt32 = 0 + var _private: Bool = false + var _initiator: Bool = false + var _chanStatusFlags: String = String() + var _localChanReserveSat: Int64 = 0 + var _remoteChanReserveSat: Int64 = 0 + var _staticRemoteKey: Bool = false + var _commitmentType: Lnrpc_CommitmentType = .legacy + var _lifetime: Int64 = 0 + var _uptime: Int64 = 0 + var _closeAddress: String = String() + var _pushAmountSat: UInt64 = 0 + var _thawHeight: UInt32 = 0 + var _localConstraints: Lnrpc_ChannelConstraints? = nil + var _remoteConstraints: Lnrpc_ChannelConstraints? = nil + + static let defaultInstance = _StorageClass() + + private init() {} + + init(copying source: _StorageClass) { + _active = source._active + _remotePubkey = source._remotePubkey + _channelPoint = source._channelPoint + _chanID = source._chanID + _capacity = source._capacity + _localBalance = source._localBalance + _remoteBalance = source._remoteBalance + _commitFee = source._commitFee + _commitWeight = source._commitWeight + _feePerKw = source._feePerKw + _unsettledBalance = source._unsettledBalance + _totalSatoshisSent = source._totalSatoshisSent + _totalSatoshisReceived = source._totalSatoshisReceived + _numUpdates = source._numUpdates + _pendingHtlcs = source._pendingHtlcs + _csvDelay = source._csvDelay + _private = source._private + _initiator = source._initiator + _chanStatusFlags = source._chanStatusFlags + _localChanReserveSat = source._localChanReserveSat + _remoteChanReserveSat = source._remoteChanReserveSat + _staticRemoteKey = source._staticRemoteKey + _commitmentType = source._commitmentType + _lifetime = source._lifetime + _uptime = source._uptime + _closeAddress = source._closeAddress + _pushAmountSat = source._pushAmountSat + _thawHeight = source._thawHeight + _localConstraints = source._localConstraints + _remoteConstraints = source._remoteConstraints + } + } + + fileprivate mutating func _uniqueStorage() -> _StorageClass { + if !isKnownUniquelyReferenced(&_storage) { + _storage = _StorageClass(copying: _storage) + } + return _storage + } + + mutating func decodeMessage(decoder: inout D) throws { + _ = _uniqueStorage() + try withExtendedLifetime(_storage) { (_storage: _StorageClass) in + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularBoolField(value: &_storage._active) }() + case 2: try { try decoder.decodeSingularStringField(value: &_storage._remotePubkey) }() + case 3: try { try decoder.decodeSingularStringField(value: &_storage._channelPoint) }() + case 4: try { try decoder.decodeSingularUInt64Field(value: &_storage._chanID) }() + case 5: try { try decoder.decodeSingularInt64Field(value: &_storage._capacity) }() + case 6: try { try decoder.decodeSingularInt64Field(value: &_storage._localBalance) }() + case 7: try { try decoder.decodeSingularInt64Field(value: &_storage._remoteBalance) }() + case 8: try { try decoder.decodeSingularInt64Field(value: &_storage._commitFee) }() + case 9: try { try decoder.decodeSingularInt64Field(value: &_storage._commitWeight) }() + case 10: try { try decoder.decodeSingularInt64Field(value: &_storage._feePerKw) }() + case 11: try { try decoder.decodeSingularInt64Field(value: &_storage._unsettledBalance) }() + case 12: try { try decoder.decodeSingularInt64Field(value: &_storage._totalSatoshisSent) }() + case 13: try { try decoder.decodeSingularInt64Field(value: &_storage._totalSatoshisReceived) }() + case 14: try { try decoder.decodeSingularUInt64Field(value: &_storage._numUpdates) }() + case 15: try { try decoder.decodeRepeatedMessageField(value: &_storage._pendingHtlcs) }() + case 16: try { try decoder.decodeSingularUInt32Field(value: &_storage._csvDelay) }() + case 17: try { try decoder.decodeSingularBoolField(value: &_storage._private) }() + case 18: try { try decoder.decodeSingularBoolField(value: &_storage._initiator) }() + case 19: try { try decoder.decodeSingularStringField(value: &_storage._chanStatusFlags) }() + case 20: try { try decoder.decodeSingularInt64Field(value: &_storage._localChanReserveSat) }() + case 21: try { try decoder.decodeSingularInt64Field(value: &_storage._remoteChanReserveSat) }() + case 22: try { try decoder.decodeSingularBoolField(value: &_storage._staticRemoteKey) }() + case 23: try { try decoder.decodeSingularInt64Field(value: &_storage._lifetime) }() + case 24: try { try decoder.decodeSingularInt64Field(value: &_storage._uptime) }() + case 25: try { try decoder.decodeSingularStringField(value: &_storage._closeAddress) }() + case 26: try { try decoder.decodeSingularEnumField(value: &_storage._commitmentType) }() + case 27: try { try decoder.decodeSingularUInt64Field(value: &_storage._pushAmountSat) }() + case 28: try { try decoder.decodeSingularUInt32Field(value: &_storage._thawHeight) }() + case 29: try { try decoder.decodeSingularMessageField(value: &_storage._localConstraints) }() + case 30: try { try decoder.decodeSingularMessageField(value: &_storage._remoteConstraints) }() + default: break + } + } + } + } + + func traverse(visitor: inout V) throws { + try withExtendedLifetime(_storage) { (_storage: _StorageClass) in + if _storage._active != false { + try visitor.visitSingularBoolField(value: _storage._active, fieldNumber: 1) + } + if !_storage._remotePubkey.isEmpty { + try visitor.visitSingularStringField(value: _storage._remotePubkey, fieldNumber: 2) + } + if !_storage._channelPoint.isEmpty { + try visitor.visitSingularStringField(value: _storage._channelPoint, fieldNumber: 3) + } + if _storage._chanID != 0 { + try visitor.visitSingularUInt64Field(value: _storage._chanID, fieldNumber: 4) + } + if _storage._capacity != 0 { + try visitor.visitSingularInt64Field(value: _storage._capacity, fieldNumber: 5) + } + if _storage._localBalance != 0 { + try visitor.visitSingularInt64Field(value: _storage._localBalance, fieldNumber: 6) + } + if _storage._remoteBalance != 0 { + try visitor.visitSingularInt64Field(value: _storage._remoteBalance, fieldNumber: 7) + } + if _storage._commitFee != 0 { + try visitor.visitSingularInt64Field(value: _storage._commitFee, fieldNumber: 8) + } + if _storage._commitWeight != 0 { + try visitor.visitSingularInt64Field(value: _storage._commitWeight, fieldNumber: 9) + } + if _storage._feePerKw != 0 { + try visitor.visitSingularInt64Field(value: _storage._feePerKw, fieldNumber: 10) + } + if _storage._unsettledBalance != 0 { + try visitor.visitSingularInt64Field(value: _storage._unsettledBalance, fieldNumber: 11) + } + if _storage._totalSatoshisSent != 0 { + try visitor.visitSingularInt64Field(value: _storage._totalSatoshisSent, fieldNumber: 12) + } + if _storage._totalSatoshisReceived != 0 { + try visitor.visitSingularInt64Field(value: _storage._totalSatoshisReceived, fieldNumber: 13) + } + if _storage._numUpdates != 0 { + try visitor.visitSingularUInt64Field(value: _storage._numUpdates, fieldNumber: 14) + } + if !_storage._pendingHtlcs.isEmpty { + try visitor.visitRepeatedMessageField(value: _storage._pendingHtlcs, fieldNumber: 15) + } + if _storage._csvDelay != 0 { + try visitor.visitSingularUInt32Field(value: _storage._csvDelay, fieldNumber: 16) + } + if _storage._private != false { + try visitor.visitSingularBoolField(value: _storage._private, fieldNumber: 17) + } + if _storage._initiator != false { + try visitor.visitSingularBoolField(value: _storage._initiator, fieldNumber: 18) + } + if !_storage._chanStatusFlags.isEmpty { + try visitor.visitSingularStringField(value: _storage._chanStatusFlags, fieldNumber: 19) + } + if _storage._localChanReserveSat != 0 { + try visitor.visitSingularInt64Field(value: _storage._localChanReserveSat, fieldNumber: 20) + } + if _storage._remoteChanReserveSat != 0 { + try visitor.visitSingularInt64Field(value: _storage._remoteChanReserveSat, fieldNumber: 21) + } + if _storage._staticRemoteKey != false { + try visitor.visitSingularBoolField(value: _storage._staticRemoteKey, fieldNumber: 22) + } + if _storage._lifetime != 0 { + try visitor.visitSingularInt64Field(value: _storage._lifetime, fieldNumber: 23) + } + if _storage._uptime != 0 { + try visitor.visitSingularInt64Field(value: _storage._uptime, fieldNumber: 24) + } + if !_storage._closeAddress.isEmpty { + try visitor.visitSingularStringField(value: _storage._closeAddress, fieldNumber: 25) + } + if _storage._commitmentType != .legacy { + try visitor.visitSingularEnumField(value: _storage._commitmentType, fieldNumber: 26) + } + if _storage._pushAmountSat != 0 { + try visitor.visitSingularUInt64Field(value: _storage._pushAmountSat, fieldNumber: 27) + } + if _storage._thawHeight != 0 { + try visitor.visitSingularUInt32Field(value: _storage._thawHeight, fieldNumber: 28) + } + if let v = _storage._localConstraints { + try visitor.visitSingularMessageField(value: v, fieldNumber: 29) + } + if let v = _storage._remoteConstraints { + try visitor.visitSingularMessageField(value: v, fieldNumber: 30) + } + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_Channel, rhs: Lnrpc_Channel) -> Bool { + if lhs._storage !== rhs._storage { + let storagesAreEqual: Bool = withExtendedLifetime((lhs._storage, rhs._storage)) { (_args: (_StorageClass, _StorageClass)) in + let _storage = _args.0 + let rhs_storage = _args.1 + if _storage._active != rhs_storage._active {return false} + if _storage._remotePubkey != rhs_storage._remotePubkey {return false} + if _storage._channelPoint != rhs_storage._channelPoint {return false} + if _storage._chanID != rhs_storage._chanID {return false} + if _storage._capacity != rhs_storage._capacity {return false} + if _storage._localBalance != rhs_storage._localBalance {return false} + if _storage._remoteBalance != rhs_storage._remoteBalance {return false} + if _storage._commitFee != rhs_storage._commitFee {return false} + if _storage._commitWeight != rhs_storage._commitWeight {return false} + if _storage._feePerKw != rhs_storage._feePerKw {return false} + if _storage._unsettledBalance != rhs_storage._unsettledBalance {return false} + if _storage._totalSatoshisSent != rhs_storage._totalSatoshisSent {return false} + if _storage._totalSatoshisReceived != rhs_storage._totalSatoshisReceived {return false} + if _storage._numUpdates != rhs_storage._numUpdates {return false} + if _storage._pendingHtlcs != rhs_storage._pendingHtlcs {return false} + if _storage._csvDelay != rhs_storage._csvDelay {return false} + if _storage._private != rhs_storage._private {return false} + if _storage._initiator != rhs_storage._initiator {return false} + if _storage._chanStatusFlags != rhs_storage._chanStatusFlags {return false} + if _storage._localChanReserveSat != rhs_storage._localChanReserveSat {return false} + if _storage._remoteChanReserveSat != rhs_storage._remoteChanReserveSat {return false} + if _storage._staticRemoteKey != rhs_storage._staticRemoteKey {return false} + if _storage._commitmentType != rhs_storage._commitmentType {return false} + if _storage._lifetime != rhs_storage._lifetime {return false} + if _storage._uptime != rhs_storage._uptime {return false} + if _storage._closeAddress != rhs_storage._closeAddress {return false} + if _storage._pushAmountSat != rhs_storage._pushAmountSat {return false} + if _storage._thawHeight != rhs_storage._thawHeight {return false} + if _storage._localConstraints != rhs_storage._localConstraints {return false} + if _storage._remoteConstraints != rhs_storage._remoteConstraints {return false} + return true + } + if !storagesAreEqual {return false} + } + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ListChannelsRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ListChannelsRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "active_only"), + 2: .standard(proto: "inactive_only"), + 3: .standard(proto: "public_only"), + 4: .standard(proto: "private_only"), + 5: .same(proto: "peer"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularBoolField(value: &self.activeOnly) }() + case 2: try { try decoder.decodeSingularBoolField(value: &self.inactiveOnly) }() + case 3: try { try decoder.decodeSingularBoolField(value: &self.publicOnly) }() + case 4: try { try decoder.decodeSingularBoolField(value: &self.privateOnly) }() + case 5: try { try decoder.decodeSingularBytesField(value: &self.peer) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.activeOnly != false { + try visitor.visitSingularBoolField(value: self.activeOnly, fieldNumber: 1) + } + if self.inactiveOnly != false { + try visitor.visitSingularBoolField(value: self.inactiveOnly, fieldNumber: 2) + } + if self.publicOnly != false { + try visitor.visitSingularBoolField(value: self.publicOnly, fieldNumber: 3) + } + if self.privateOnly != false { + try visitor.visitSingularBoolField(value: self.privateOnly, fieldNumber: 4) + } + if !self.peer.isEmpty { + try visitor.visitSingularBytesField(value: self.peer, fieldNumber: 5) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ListChannelsRequest, rhs: Lnrpc_ListChannelsRequest) -> Bool { + if lhs.activeOnly != rhs.activeOnly {return false} + if lhs.inactiveOnly != rhs.inactiveOnly {return false} + if lhs.publicOnly != rhs.publicOnly {return false} + if lhs.privateOnly != rhs.privateOnly {return false} + if lhs.peer != rhs.peer {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ListChannelsResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ListChannelsResponse" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 11: .same(proto: "channels"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 11: try { try decoder.decodeRepeatedMessageField(value: &self.channels) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.channels.isEmpty { + try visitor.visitRepeatedMessageField(value: self.channels, fieldNumber: 11) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ListChannelsResponse, rhs: Lnrpc_ListChannelsResponse) -> Bool { + if lhs.channels != rhs.channels {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ChannelCloseSummary: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ChannelCloseSummary" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "channel_point"), + 2: .standard(proto: "chan_id"), + 3: .standard(proto: "chain_hash"), + 4: .standard(proto: "closing_tx_hash"), + 5: .standard(proto: "remote_pubkey"), + 6: .same(proto: "capacity"), + 7: .standard(proto: "close_height"), + 8: .standard(proto: "settled_balance"), + 9: .standard(proto: "time_locked_balance"), + 10: .standard(proto: "close_type"), + 11: .standard(proto: "open_initiator"), + 12: .standard(proto: "close_initiator"), + 13: .same(proto: "resolutions"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.channelPoint) }() + case 2: try { try decoder.decodeSingularUInt64Field(value: &self.chanID) }() + case 3: try { try decoder.decodeSingularStringField(value: &self.chainHash) }() + case 4: try { try decoder.decodeSingularStringField(value: &self.closingTxHash) }() + case 5: try { try decoder.decodeSingularStringField(value: &self.remotePubkey) }() + case 6: try { try decoder.decodeSingularInt64Field(value: &self.capacity) }() + case 7: try { try decoder.decodeSingularUInt32Field(value: &self.closeHeight) }() + case 8: try { try decoder.decodeSingularInt64Field(value: &self.settledBalance) }() + case 9: try { try decoder.decodeSingularInt64Field(value: &self.timeLockedBalance) }() + case 10: try { try decoder.decodeSingularEnumField(value: &self.closeType) }() + case 11: try { try decoder.decodeSingularEnumField(value: &self.openInitiator) }() + case 12: try { try decoder.decodeSingularEnumField(value: &self.closeInitiator) }() + case 13: try { try decoder.decodeRepeatedMessageField(value: &self.resolutions) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.channelPoint.isEmpty { + try visitor.visitSingularStringField(value: self.channelPoint, fieldNumber: 1) + } + if self.chanID != 0 { + try visitor.visitSingularUInt64Field(value: self.chanID, fieldNumber: 2) + } + if !self.chainHash.isEmpty { + try visitor.visitSingularStringField(value: self.chainHash, fieldNumber: 3) + } + if !self.closingTxHash.isEmpty { + try visitor.visitSingularStringField(value: self.closingTxHash, fieldNumber: 4) + } + if !self.remotePubkey.isEmpty { + try visitor.visitSingularStringField(value: self.remotePubkey, fieldNumber: 5) + } + if self.capacity != 0 { + try visitor.visitSingularInt64Field(value: self.capacity, fieldNumber: 6) + } + if self.closeHeight != 0 { + try visitor.visitSingularUInt32Field(value: self.closeHeight, fieldNumber: 7) + } + if self.settledBalance != 0 { + try visitor.visitSingularInt64Field(value: self.settledBalance, fieldNumber: 8) + } + if self.timeLockedBalance != 0 { + try visitor.visitSingularInt64Field(value: self.timeLockedBalance, fieldNumber: 9) + } + if self.closeType != .cooperativeClose { + try visitor.visitSingularEnumField(value: self.closeType, fieldNumber: 10) + } + if self.openInitiator != .unknown { + try visitor.visitSingularEnumField(value: self.openInitiator, fieldNumber: 11) + } + if self.closeInitiator != .unknown { + try visitor.visitSingularEnumField(value: self.closeInitiator, fieldNumber: 12) + } + if !self.resolutions.isEmpty { + try visitor.visitRepeatedMessageField(value: self.resolutions, fieldNumber: 13) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ChannelCloseSummary, rhs: Lnrpc_ChannelCloseSummary) -> Bool { + if lhs.channelPoint != rhs.channelPoint {return false} + if lhs.chanID != rhs.chanID {return false} + if lhs.chainHash != rhs.chainHash {return false} + if lhs.closingTxHash != rhs.closingTxHash {return false} + if lhs.remotePubkey != rhs.remotePubkey {return false} + if lhs.capacity != rhs.capacity {return false} + if lhs.closeHeight != rhs.closeHeight {return false} + if lhs.settledBalance != rhs.settledBalance {return false} + if lhs.timeLockedBalance != rhs.timeLockedBalance {return false} + if lhs.closeType != rhs.closeType {return false} + if lhs.openInitiator != rhs.openInitiator {return false} + if lhs.closeInitiator != rhs.closeInitiator {return false} + if lhs.resolutions != rhs.resolutions {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ChannelCloseSummary.ClosureType: SwiftProtobuf._ProtoNameProviding { + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 0: .same(proto: "COOPERATIVE_CLOSE"), + 1: .same(proto: "LOCAL_FORCE_CLOSE"), + 2: .same(proto: "REMOTE_FORCE_CLOSE"), + 3: .same(proto: "BREACH_CLOSE"), + 4: .same(proto: "FUNDING_CANCELED"), + 5: .same(proto: "ABANDONED"), + ] +} + +extension Lnrpc_Resolution: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".Resolution" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "resolution_type"), + 2: .same(proto: "outcome"), + 3: .same(proto: "outpoint"), + 4: .standard(proto: "amount_sat"), + 5: .standard(proto: "sweep_txid"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularEnumField(value: &self.resolutionType) }() + case 2: try { try decoder.decodeSingularEnumField(value: &self.outcome) }() + case 3: try { try decoder.decodeSingularMessageField(value: &self._outpoint) }() + case 4: try { try decoder.decodeSingularUInt64Field(value: &self.amountSat) }() + case 5: try { try decoder.decodeSingularStringField(value: &self.sweepTxid) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.resolutionType != .typeUnknown { + try visitor.visitSingularEnumField(value: self.resolutionType, fieldNumber: 1) + } + if self.outcome != .outcomeUnknown { + try visitor.visitSingularEnumField(value: self.outcome, fieldNumber: 2) + } + if let v = self._outpoint { + try visitor.visitSingularMessageField(value: v, fieldNumber: 3) + } + if self.amountSat != 0 { + try visitor.visitSingularUInt64Field(value: self.amountSat, fieldNumber: 4) + } + if !self.sweepTxid.isEmpty { + try visitor.visitSingularStringField(value: self.sweepTxid, fieldNumber: 5) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_Resolution, rhs: Lnrpc_Resolution) -> Bool { + if lhs.resolutionType != rhs.resolutionType {return false} + if lhs.outcome != rhs.outcome {return false} + if lhs._outpoint != rhs._outpoint {return false} + if lhs.amountSat != rhs.amountSat {return false} + if lhs.sweepTxid != rhs.sweepTxid {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ClosedChannelsRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ClosedChannelsRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "cooperative"), + 2: .standard(proto: "local_force"), + 3: .standard(proto: "remote_force"), + 4: .same(proto: "breach"), + 5: .standard(proto: "funding_canceled"), + 6: .same(proto: "abandoned"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularBoolField(value: &self.cooperative) }() + case 2: try { try decoder.decodeSingularBoolField(value: &self.localForce) }() + case 3: try { try decoder.decodeSingularBoolField(value: &self.remoteForce) }() + case 4: try { try decoder.decodeSingularBoolField(value: &self.breach) }() + case 5: try { try decoder.decodeSingularBoolField(value: &self.fundingCanceled) }() + case 6: try { try decoder.decodeSingularBoolField(value: &self.abandoned) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.cooperative != false { + try visitor.visitSingularBoolField(value: self.cooperative, fieldNumber: 1) + } + if self.localForce != false { + try visitor.visitSingularBoolField(value: self.localForce, fieldNumber: 2) + } + if self.remoteForce != false { + try visitor.visitSingularBoolField(value: self.remoteForce, fieldNumber: 3) + } + if self.breach != false { + try visitor.visitSingularBoolField(value: self.breach, fieldNumber: 4) + } + if self.fundingCanceled != false { + try visitor.visitSingularBoolField(value: self.fundingCanceled, fieldNumber: 5) + } + if self.abandoned != false { + try visitor.visitSingularBoolField(value: self.abandoned, fieldNumber: 6) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ClosedChannelsRequest, rhs: Lnrpc_ClosedChannelsRequest) -> Bool { + if lhs.cooperative != rhs.cooperative {return false} + if lhs.localForce != rhs.localForce {return false} + if lhs.remoteForce != rhs.remoteForce {return false} + if lhs.breach != rhs.breach {return false} + if lhs.fundingCanceled != rhs.fundingCanceled {return false} + if lhs.abandoned != rhs.abandoned {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ClosedChannelsResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ClosedChannelsResponse" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "channels"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeRepeatedMessageField(value: &self.channels) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.channels.isEmpty { + try visitor.visitRepeatedMessageField(value: self.channels, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ClosedChannelsResponse, rhs: Lnrpc_ClosedChannelsResponse) -> Bool { + if lhs.channels != rhs.channels {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_Peer: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".Peer" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "pub_key"), + 3: .same(proto: "address"), + 4: .standard(proto: "bytes_sent"), + 5: .standard(proto: "bytes_recv"), + 6: .standard(proto: "sat_sent"), + 7: .standard(proto: "sat_recv"), + 8: .same(proto: "inbound"), + 9: .standard(proto: "ping_time"), + 10: .standard(proto: "sync_type"), + 11: .same(proto: "features"), + 12: .same(proto: "errors"), + 13: .standard(proto: "flap_count"), + 14: .standard(proto: "last_flap_ns"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.pubKey) }() + case 3: try { try decoder.decodeSingularStringField(value: &self.address) }() + case 4: try { try decoder.decodeSingularUInt64Field(value: &self.bytesSent) }() + case 5: try { try decoder.decodeSingularUInt64Field(value: &self.bytesRecv) }() + case 6: try { try decoder.decodeSingularInt64Field(value: &self.satSent) }() + case 7: try { try decoder.decodeSingularInt64Field(value: &self.satRecv) }() + case 8: try { try decoder.decodeSingularBoolField(value: &self.inbound) }() + case 9: try { try decoder.decodeSingularInt64Field(value: &self.pingTime) }() + case 10: try { try decoder.decodeSingularEnumField(value: &self.syncType) }() + case 11: try { try decoder.decodeMapField(fieldType: SwiftProtobuf._ProtobufMessageMap.self, value: &self.features) }() + case 12: try { try decoder.decodeRepeatedMessageField(value: &self.errors) }() + case 13: try { try decoder.decodeSingularInt32Field(value: &self.flapCount) }() + case 14: try { try decoder.decodeSingularInt64Field(value: &self.lastFlapNs) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.pubKey.isEmpty { + try visitor.visitSingularStringField(value: self.pubKey, fieldNumber: 1) + } + if !self.address.isEmpty { + try visitor.visitSingularStringField(value: self.address, fieldNumber: 3) + } + if self.bytesSent != 0 { + try visitor.visitSingularUInt64Field(value: self.bytesSent, fieldNumber: 4) + } + if self.bytesRecv != 0 { + try visitor.visitSingularUInt64Field(value: self.bytesRecv, fieldNumber: 5) + } + if self.satSent != 0 { + try visitor.visitSingularInt64Field(value: self.satSent, fieldNumber: 6) + } + if self.satRecv != 0 { + try visitor.visitSingularInt64Field(value: self.satRecv, fieldNumber: 7) + } + if self.inbound != false { + try visitor.visitSingularBoolField(value: self.inbound, fieldNumber: 8) + } + if self.pingTime != 0 { + try visitor.visitSingularInt64Field(value: self.pingTime, fieldNumber: 9) + } + if self.syncType != .unknownSync { + try visitor.visitSingularEnumField(value: self.syncType, fieldNumber: 10) + } + if !self.features.isEmpty { + try visitor.visitMapField(fieldType: SwiftProtobuf._ProtobufMessageMap.self, value: self.features, fieldNumber: 11) + } + if !self.errors.isEmpty { + try visitor.visitRepeatedMessageField(value: self.errors, fieldNumber: 12) + } + if self.flapCount != 0 { + try visitor.visitSingularInt32Field(value: self.flapCount, fieldNumber: 13) + } + if self.lastFlapNs != 0 { + try visitor.visitSingularInt64Field(value: self.lastFlapNs, fieldNumber: 14) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_Peer, rhs: Lnrpc_Peer) -> Bool { + if lhs.pubKey != rhs.pubKey {return false} + if lhs.address != rhs.address {return false} + if lhs.bytesSent != rhs.bytesSent {return false} + if lhs.bytesRecv != rhs.bytesRecv {return false} + if lhs.satSent != rhs.satSent {return false} + if lhs.satRecv != rhs.satRecv {return false} + if lhs.inbound != rhs.inbound {return false} + if lhs.pingTime != rhs.pingTime {return false} + if lhs.syncType != rhs.syncType {return false} + if lhs.features != rhs.features {return false} + if lhs.errors != rhs.errors {return false} + if lhs.flapCount != rhs.flapCount {return false} + if lhs.lastFlapNs != rhs.lastFlapNs {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_Peer.SyncType: SwiftProtobuf._ProtoNameProviding { + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 0: .same(proto: "UNKNOWN_SYNC"), + 1: .same(proto: "ACTIVE_SYNC"), + 2: .same(proto: "PASSIVE_SYNC"), + ] +} + +extension Lnrpc_TimestampedError: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".TimestampedError" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "timestamp"), + 2: .same(proto: "error"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularUInt64Field(value: &self.timestamp) }() + case 2: try { try decoder.decodeSingularStringField(value: &self.error) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.timestamp != 0 { + try visitor.visitSingularUInt64Field(value: self.timestamp, fieldNumber: 1) + } + if !self.error.isEmpty { + try visitor.visitSingularStringField(value: self.error, fieldNumber: 2) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_TimestampedError, rhs: Lnrpc_TimestampedError) -> Bool { + if lhs.timestamp != rhs.timestamp {return false} + if lhs.error != rhs.error {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ListPeersRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ListPeersRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "latest_error"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularBoolField(value: &self.latestError) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.latestError != false { + try visitor.visitSingularBoolField(value: self.latestError, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ListPeersRequest, rhs: Lnrpc_ListPeersRequest) -> Bool { + if lhs.latestError != rhs.latestError {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ListPeersResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ListPeersResponse" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "peers"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeRepeatedMessageField(value: &self.peers) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.peers.isEmpty { + try visitor.visitRepeatedMessageField(value: self.peers, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ListPeersResponse, rhs: Lnrpc_ListPeersResponse) -> Bool { + if lhs.peers != rhs.peers {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_PeerEventSubscription: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".PeerEventSubscription" + static let _protobuf_nameMap = SwiftProtobuf._NameMap() + + mutating func decodeMessage(decoder: inout D) throws { + while let _ = try decoder.nextFieldNumber() { + } + } + + func traverse(visitor: inout V) throws { + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_PeerEventSubscription, rhs: Lnrpc_PeerEventSubscription) -> Bool { + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_PeerEvent: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".PeerEvent" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "pub_key"), + 2: .same(proto: "type"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.pubKey) }() + case 2: try { try decoder.decodeSingularEnumField(value: &self.type) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.pubKey.isEmpty { + try visitor.visitSingularStringField(value: self.pubKey, fieldNumber: 1) + } + if self.type != .peerOnline { + try visitor.visitSingularEnumField(value: self.type, fieldNumber: 2) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_PeerEvent, rhs: Lnrpc_PeerEvent) -> Bool { + if lhs.pubKey != rhs.pubKey {return false} + if lhs.type != rhs.type {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_PeerEvent.EventType: SwiftProtobuf._ProtoNameProviding { + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 0: .same(proto: "PEER_ONLINE"), + 1: .same(proto: "PEER_OFFLINE"), + ] +} + +extension Lnrpc_GetInfoRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".GetInfoRequest" + static let _protobuf_nameMap = SwiftProtobuf._NameMap() + + mutating func decodeMessage(decoder: inout D) throws { + while let _ = try decoder.nextFieldNumber() { + } + } + + func traverse(visitor: inout V) throws { + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_GetInfoRequest, rhs: Lnrpc_GetInfoRequest) -> Bool { + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_GetInfoResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".GetInfoResponse" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 14: .same(proto: "version"), + 20: .standard(proto: "commit_hash"), + 1: .standard(proto: "identity_pubkey"), + 2: .same(proto: "alias"), + 17: .same(proto: "color"), + 3: .standard(proto: "num_pending_channels"), + 4: .standard(proto: "num_active_channels"), + 15: .standard(proto: "num_inactive_channels"), + 5: .standard(proto: "num_peers"), + 6: .standard(proto: "block_height"), + 8: .standard(proto: "block_hash"), + 13: .standard(proto: "best_header_timestamp"), + 9: .standard(proto: "synced_to_chain"), + 18: .standard(proto: "synced_to_graph"), + 10: .same(proto: "testnet"), + 16: .same(proto: "chains"), + 12: .same(proto: "uris"), + 19: .same(proto: "features"), + ] + + fileprivate class _StorageClass { + var _version: String = String() + var _commitHash: String = String() + var _identityPubkey: String = String() + var _alias: String = String() + var _color: String = String() + var _numPendingChannels: UInt32 = 0 + var _numActiveChannels: UInt32 = 0 + var _numInactiveChannels: UInt32 = 0 + var _numPeers: UInt32 = 0 + var _blockHeight: UInt32 = 0 + var _blockHash: String = String() + var _bestHeaderTimestamp: Int64 = 0 + var _syncedToChain: Bool = false + var _syncedToGraph: Bool = false + var _testnet: Bool = false + var _chains: [Lnrpc_Chain] = [] + var _uris: [String] = [] + var _features: Dictionary = [:] + + static let defaultInstance = _StorageClass() + + private init() {} + + init(copying source: _StorageClass) { + _version = source._version + _commitHash = source._commitHash + _identityPubkey = source._identityPubkey + _alias = source._alias + _color = source._color + _numPendingChannels = source._numPendingChannels + _numActiveChannels = source._numActiveChannels + _numInactiveChannels = source._numInactiveChannels + _numPeers = source._numPeers + _blockHeight = source._blockHeight + _blockHash = source._blockHash + _bestHeaderTimestamp = source._bestHeaderTimestamp + _syncedToChain = source._syncedToChain + _syncedToGraph = source._syncedToGraph + _testnet = source._testnet + _chains = source._chains + _uris = source._uris + _features = source._features + } + } + + fileprivate mutating func _uniqueStorage() -> _StorageClass { + if !isKnownUniquelyReferenced(&_storage) { + _storage = _StorageClass(copying: _storage) + } + return _storage + } + + mutating func decodeMessage(decoder: inout D) throws { + _ = _uniqueStorage() + try withExtendedLifetime(_storage) { (_storage: _StorageClass) in + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &_storage._identityPubkey) }() + case 2: try { try decoder.decodeSingularStringField(value: &_storage._alias) }() + case 3: try { try decoder.decodeSingularUInt32Field(value: &_storage._numPendingChannels) }() + case 4: try { try decoder.decodeSingularUInt32Field(value: &_storage._numActiveChannels) }() + case 5: try { try decoder.decodeSingularUInt32Field(value: &_storage._numPeers) }() + case 6: try { try decoder.decodeSingularUInt32Field(value: &_storage._blockHeight) }() + case 8: try { try decoder.decodeSingularStringField(value: &_storage._blockHash) }() + case 9: try { try decoder.decodeSingularBoolField(value: &_storage._syncedToChain) }() + case 10: try { try decoder.decodeSingularBoolField(value: &_storage._testnet) }() + case 12: try { try decoder.decodeRepeatedStringField(value: &_storage._uris) }() + case 13: try { try decoder.decodeSingularInt64Field(value: &_storage._bestHeaderTimestamp) }() + case 14: try { try decoder.decodeSingularStringField(value: &_storage._version) }() + case 15: try { try decoder.decodeSingularUInt32Field(value: &_storage._numInactiveChannels) }() + case 16: try { try decoder.decodeRepeatedMessageField(value: &_storage._chains) }() + case 17: try { try decoder.decodeSingularStringField(value: &_storage._color) }() + case 18: try { try decoder.decodeSingularBoolField(value: &_storage._syncedToGraph) }() + case 19: try { try decoder.decodeMapField(fieldType: SwiftProtobuf._ProtobufMessageMap.self, value: &_storage._features) }() + case 20: try { try decoder.decodeSingularStringField(value: &_storage._commitHash) }() + default: break + } + } + } + } + + func traverse(visitor: inout V) throws { + try withExtendedLifetime(_storage) { (_storage: _StorageClass) in + if !_storage._identityPubkey.isEmpty { + try visitor.visitSingularStringField(value: _storage._identityPubkey, fieldNumber: 1) + } + if !_storage._alias.isEmpty { + try visitor.visitSingularStringField(value: _storage._alias, fieldNumber: 2) + } + if _storage._numPendingChannels != 0 { + try visitor.visitSingularUInt32Field(value: _storage._numPendingChannels, fieldNumber: 3) + } + if _storage._numActiveChannels != 0 { + try visitor.visitSingularUInt32Field(value: _storage._numActiveChannels, fieldNumber: 4) + } + if _storage._numPeers != 0 { + try visitor.visitSingularUInt32Field(value: _storage._numPeers, fieldNumber: 5) + } + if _storage._blockHeight != 0 { + try visitor.visitSingularUInt32Field(value: _storage._blockHeight, fieldNumber: 6) + } + if !_storage._blockHash.isEmpty { + try visitor.visitSingularStringField(value: _storage._blockHash, fieldNumber: 8) + } + if _storage._syncedToChain != false { + try visitor.visitSingularBoolField(value: _storage._syncedToChain, fieldNumber: 9) + } + if _storage._testnet != false { + try visitor.visitSingularBoolField(value: _storage._testnet, fieldNumber: 10) + } + if !_storage._uris.isEmpty { + try visitor.visitRepeatedStringField(value: _storage._uris, fieldNumber: 12) + } + if _storage._bestHeaderTimestamp != 0 { + try visitor.visitSingularInt64Field(value: _storage._bestHeaderTimestamp, fieldNumber: 13) + } + if !_storage._version.isEmpty { + try visitor.visitSingularStringField(value: _storage._version, fieldNumber: 14) + } + if _storage._numInactiveChannels != 0 { + try visitor.visitSingularUInt32Field(value: _storage._numInactiveChannels, fieldNumber: 15) + } + if !_storage._chains.isEmpty { + try visitor.visitRepeatedMessageField(value: _storage._chains, fieldNumber: 16) + } + if !_storage._color.isEmpty { + try visitor.visitSingularStringField(value: _storage._color, fieldNumber: 17) + } + if _storage._syncedToGraph != false { + try visitor.visitSingularBoolField(value: _storage._syncedToGraph, fieldNumber: 18) + } + if !_storage._features.isEmpty { + try visitor.visitMapField(fieldType: SwiftProtobuf._ProtobufMessageMap.self, value: _storage._features, fieldNumber: 19) + } + if !_storage._commitHash.isEmpty { + try visitor.visitSingularStringField(value: _storage._commitHash, fieldNumber: 20) + } + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_GetInfoResponse, rhs: Lnrpc_GetInfoResponse) -> Bool { + if lhs._storage !== rhs._storage { + let storagesAreEqual: Bool = withExtendedLifetime((lhs._storage, rhs._storage)) { (_args: (_StorageClass, _StorageClass)) in + let _storage = _args.0 + let rhs_storage = _args.1 + if _storage._version != rhs_storage._version {return false} + if _storage._commitHash != rhs_storage._commitHash {return false} + if _storage._identityPubkey != rhs_storage._identityPubkey {return false} + if _storage._alias != rhs_storage._alias {return false} + if _storage._color != rhs_storage._color {return false} + if _storage._numPendingChannels != rhs_storage._numPendingChannels {return false} + if _storage._numActiveChannels != rhs_storage._numActiveChannels {return false} + if _storage._numInactiveChannels != rhs_storage._numInactiveChannels {return false} + if _storage._numPeers != rhs_storage._numPeers {return false} + if _storage._blockHeight != rhs_storage._blockHeight {return false} + if _storage._blockHash != rhs_storage._blockHash {return false} + if _storage._bestHeaderTimestamp != rhs_storage._bestHeaderTimestamp {return false} + if _storage._syncedToChain != rhs_storage._syncedToChain {return false} + if _storage._syncedToGraph != rhs_storage._syncedToGraph {return false} + if _storage._testnet != rhs_storage._testnet {return false} + if _storage._chains != rhs_storage._chains {return false} + if _storage._uris != rhs_storage._uris {return false} + if _storage._features != rhs_storage._features {return false} + return true + } + if !storagesAreEqual {return false} + } + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_GetRecoveryInfoRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".GetRecoveryInfoRequest" + static let _protobuf_nameMap = SwiftProtobuf._NameMap() + + mutating func decodeMessage(decoder: inout D) throws { + while let _ = try decoder.nextFieldNumber() { + } + } + + func traverse(visitor: inout V) throws { + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_GetRecoveryInfoRequest, rhs: Lnrpc_GetRecoveryInfoRequest) -> Bool { + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_GetRecoveryInfoResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".GetRecoveryInfoResponse" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "recovery_mode"), + 2: .standard(proto: "recovery_finished"), + 3: .same(proto: "progress"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularBoolField(value: &self.recoveryMode) }() + case 2: try { try decoder.decodeSingularBoolField(value: &self.recoveryFinished) }() + case 3: try { try decoder.decodeSingularDoubleField(value: &self.progress) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.recoveryMode != false { + try visitor.visitSingularBoolField(value: self.recoveryMode, fieldNumber: 1) + } + if self.recoveryFinished != false { + try visitor.visitSingularBoolField(value: self.recoveryFinished, fieldNumber: 2) + } + if self.progress != 0 { + try visitor.visitSingularDoubleField(value: self.progress, fieldNumber: 3) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_GetRecoveryInfoResponse, rhs: Lnrpc_GetRecoveryInfoResponse) -> Bool { + if lhs.recoveryMode != rhs.recoveryMode {return false} + if lhs.recoveryFinished != rhs.recoveryFinished {return false} + if lhs.progress != rhs.progress {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_Chain: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".Chain" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "chain"), + 2: .same(proto: "network"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.chain) }() + case 2: try { try decoder.decodeSingularStringField(value: &self.network) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.chain.isEmpty { + try visitor.visitSingularStringField(value: self.chain, fieldNumber: 1) + } + if !self.network.isEmpty { + try visitor.visitSingularStringField(value: self.network, fieldNumber: 2) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_Chain, rhs: Lnrpc_Chain) -> Bool { + if lhs.chain != rhs.chain {return false} + if lhs.network != rhs.network {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ConfirmationUpdate: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ConfirmationUpdate" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "block_sha"), + 2: .standard(proto: "block_height"), + 3: .standard(proto: "num_confs_left"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularBytesField(value: &self.blockSha) }() + case 2: try { try decoder.decodeSingularInt32Field(value: &self.blockHeight) }() + case 3: try { try decoder.decodeSingularUInt32Field(value: &self.numConfsLeft) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.blockSha.isEmpty { + try visitor.visitSingularBytesField(value: self.blockSha, fieldNumber: 1) + } + if self.blockHeight != 0 { + try visitor.visitSingularInt32Field(value: self.blockHeight, fieldNumber: 2) + } + if self.numConfsLeft != 0 { + try visitor.visitSingularUInt32Field(value: self.numConfsLeft, fieldNumber: 3) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ConfirmationUpdate, rhs: Lnrpc_ConfirmationUpdate) -> Bool { + if lhs.blockSha != rhs.blockSha {return false} + if lhs.blockHeight != rhs.blockHeight {return false} + if lhs.numConfsLeft != rhs.numConfsLeft {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ChannelOpenUpdate: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ChannelOpenUpdate" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "channel_point"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularMessageField(value: &self._channelPoint) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if let v = self._channelPoint { + try visitor.visitSingularMessageField(value: v, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ChannelOpenUpdate, rhs: Lnrpc_ChannelOpenUpdate) -> Bool { + if lhs._channelPoint != rhs._channelPoint {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ChannelCloseUpdate: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ChannelCloseUpdate" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "closing_txid"), + 2: .same(proto: "success"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularBytesField(value: &self.closingTxid) }() + case 2: try { try decoder.decodeSingularBoolField(value: &self.success) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.closingTxid.isEmpty { + try visitor.visitSingularBytesField(value: self.closingTxid, fieldNumber: 1) + } + if self.success != false { + try visitor.visitSingularBoolField(value: self.success, fieldNumber: 2) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ChannelCloseUpdate, rhs: Lnrpc_ChannelCloseUpdate) -> Bool { + if lhs.closingTxid != rhs.closingTxid {return false} + if lhs.success != rhs.success {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_CloseChannelRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".CloseChannelRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "channel_point"), + 2: .same(proto: "force"), + 3: .standard(proto: "target_conf"), + 4: .standard(proto: "sat_per_byte"), + 5: .standard(proto: "delivery_address"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularMessageField(value: &self._channelPoint) }() + case 2: try { try decoder.decodeSingularBoolField(value: &self.force) }() + case 3: try { try decoder.decodeSingularInt32Field(value: &self.targetConf) }() + case 4: try { try decoder.decodeSingularInt64Field(value: &self.satPerByte) }() + case 5: try { try decoder.decodeSingularStringField(value: &self.deliveryAddress) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if let v = self._channelPoint { + try visitor.visitSingularMessageField(value: v, fieldNumber: 1) + } + if self.force != false { + try visitor.visitSingularBoolField(value: self.force, fieldNumber: 2) + } + if self.targetConf != 0 { + try visitor.visitSingularInt32Field(value: self.targetConf, fieldNumber: 3) + } + if self.satPerByte != 0 { + try visitor.visitSingularInt64Field(value: self.satPerByte, fieldNumber: 4) + } + if !self.deliveryAddress.isEmpty { + try visitor.visitSingularStringField(value: self.deliveryAddress, fieldNumber: 5) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_CloseChannelRequest, rhs: Lnrpc_CloseChannelRequest) -> Bool { + if lhs._channelPoint != rhs._channelPoint {return false} + if lhs.force != rhs.force {return false} + if lhs.targetConf != rhs.targetConf {return false} + if lhs.satPerByte != rhs.satPerByte {return false} + if lhs.deliveryAddress != rhs.deliveryAddress {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_CloseStatusUpdate: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".CloseStatusUpdate" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "close_pending"), + 3: .standard(proto: "chan_close"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { + var v: Lnrpc_PendingUpdate? + if let current = self.update { + try decoder.handleConflictingOneOf() + if case .closePending(let m) = current {v = m} + } + try decoder.decodeSingularMessageField(value: &v) + if let v = v {self.update = .closePending(v)} + }() + case 3: try { + var v: Lnrpc_ChannelCloseUpdate? + if let current = self.update { + try decoder.handleConflictingOneOf() + if case .chanClose(let m) = current {v = m} + } + try decoder.decodeSingularMessageField(value: &v) + if let v = v {self.update = .chanClose(v)} + }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch self.update { + case .closePending?: try { + guard case .closePending(let v)? = self.update else { preconditionFailure() } + try visitor.visitSingularMessageField(value: v, fieldNumber: 1) + }() + case .chanClose?: try { + guard case .chanClose(let v)? = self.update else { preconditionFailure() } + try visitor.visitSingularMessageField(value: v, fieldNumber: 3) + }() + case nil: break + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_CloseStatusUpdate, rhs: Lnrpc_CloseStatusUpdate) -> Bool { + if lhs.update != rhs.update {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_PendingUpdate: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".PendingUpdate" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "txid"), + 2: .standard(proto: "output_index"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularBytesField(value: &self.txid) }() + case 2: try { try decoder.decodeSingularUInt32Field(value: &self.outputIndex) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.txid.isEmpty { + try visitor.visitSingularBytesField(value: self.txid, fieldNumber: 1) + } + if self.outputIndex != 0 { + try visitor.visitSingularUInt32Field(value: self.outputIndex, fieldNumber: 2) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_PendingUpdate, rhs: Lnrpc_PendingUpdate) -> Bool { + if lhs.txid != rhs.txid {return false} + if lhs.outputIndex != rhs.outputIndex {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ReadyForPsbtFunding: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ReadyForPsbtFunding" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "funding_address"), + 2: .standard(proto: "funding_amount"), + 3: .same(proto: "psbt"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.fundingAddress) }() + case 2: try { try decoder.decodeSingularInt64Field(value: &self.fundingAmount) }() + case 3: try { try decoder.decodeSingularBytesField(value: &self.psbt) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.fundingAddress.isEmpty { + try visitor.visitSingularStringField(value: self.fundingAddress, fieldNumber: 1) + } + if self.fundingAmount != 0 { + try visitor.visitSingularInt64Field(value: self.fundingAmount, fieldNumber: 2) + } + if !self.psbt.isEmpty { + try visitor.visitSingularBytesField(value: self.psbt, fieldNumber: 3) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ReadyForPsbtFunding, rhs: Lnrpc_ReadyForPsbtFunding) -> Bool { + if lhs.fundingAddress != rhs.fundingAddress {return false} + if lhs.fundingAmount != rhs.fundingAmount {return false} + if lhs.psbt != rhs.psbt {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_OpenChannelRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".OpenChannelRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 2: .standard(proto: "node_pubkey"), + 3: .standard(proto: "node_pubkey_string"), + 4: .standard(proto: "local_funding_amount"), + 5: .standard(proto: "push_sat"), + 6: .standard(proto: "target_conf"), + 7: .standard(proto: "sat_per_byte"), + 8: .same(proto: "private"), + 9: .standard(proto: "min_htlc_msat"), + 10: .standard(proto: "remote_csv_delay"), + 11: .standard(proto: "min_confs"), + 12: .standard(proto: "spend_unconfirmed"), + 13: .standard(proto: "close_address"), + 14: .standard(proto: "funding_shim"), + 15: .standard(proto: "remote_max_value_in_flight_msat"), + 16: .standard(proto: "remote_max_htlcs"), + 17: .standard(proto: "max_local_csv"), + ] + + fileprivate class _StorageClass { + var _nodePubkey: Data = Data() + var _nodePubkeyString: String = String() + var _localFundingAmount: Int64 = 0 + var _pushSat: Int64 = 0 + var _targetConf: Int32 = 0 + var _satPerByte: Int64 = 0 + var _private: Bool = false + var _minHtlcMsat: Int64 = 0 + var _remoteCsvDelay: UInt32 = 0 + var _minConfs: Int32 = 0 + var _spendUnconfirmed: Bool = false + var _closeAddress: String = String() + var _fundingShim: Lnrpc_FundingShim? = nil + var _remoteMaxValueInFlightMsat: UInt64 = 0 + var _remoteMaxHtlcs: UInt32 = 0 + var _maxLocalCsv: UInt32 = 0 + + static let defaultInstance = _StorageClass() + + private init() {} + + init(copying source: _StorageClass) { + _nodePubkey = source._nodePubkey + _nodePubkeyString = source._nodePubkeyString + _localFundingAmount = source._localFundingAmount + _pushSat = source._pushSat + _targetConf = source._targetConf + _satPerByte = source._satPerByte + _private = source._private + _minHtlcMsat = source._minHtlcMsat + _remoteCsvDelay = source._remoteCsvDelay + _minConfs = source._minConfs + _spendUnconfirmed = source._spendUnconfirmed + _closeAddress = source._closeAddress + _fundingShim = source._fundingShim + _remoteMaxValueInFlightMsat = source._remoteMaxValueInFlightMsat + _remoteMaxHtlcs = source._remoteMaxHtlcs + _maxLocalCsv = source._maxLocalCsv + } + } + + fileprivate mutating func _uniqueStorage() -> _StorageClass { + if !isKnownUniquelyReferenced(&_storage) { + _storage = _StorageClass(copying: _storage) + } + return _storage + } + + mutating func decodeMessage(decoder: inout D) throws { + _ = _uniqueStorage() + try withExtendedLifetime(_storage) { (_storage: _StorageClass) in + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 2: try { try decoder.decodeSingularBytesField(value: &_storage._nodePubkey) }() + case 3: try { try decoder.decodeSingularStringField(value: &_storage._nodePubkeyString) }() + case 4: try { try decoder.decodeSingularInt64Field(value: &_storage._localFundingAmount) }() + case 5: try { try decoder.decodeSingularInt64Field(value: &_storage._pushSat) }() + case 6: try { try decoder.decodeSingularInt32Field(value: &_storage._targetConf) }() + case 7: try { try decoder.decodeSingularInt64Field(value: &_storage._satPerByte) }() + case 8: try { try decoder.decodeSingularBoolField(value: &_storage._private) }() + case 9: try { try decoder.decodeSingularInt64Field(value: &_storage._minHtlcMsat) }() + case 10: try { try decoder.decodeSingularUInt32Field(value: &_storage._remoteCsvDelay) }() + case 11: try { try decoder.decodeSingularInt32Field(value: &_storage._minConfs) }() + case 12: try { try decoder.decodeSingularBoolField(value: &_storage._spendUnconfirmed) }() + case 13: try { try decoder.decodeSingularStringField(value: &_storage._closeAddress) }() + case 14: try { try decoder.decodeSingularMessageField(value: &_storage._fundingShim) }() + case 15: try { try decoder.decodeSingularUInt64Field(value: &_storage._remoteMaxValueInFlightMsat) }() + case 16: try { try decoder.decodeSingularUInt32Field(value: &_storage._remoteMaxHtlcs) }() + case 17: try { try decoder.decodeSingularUInt32Field(value: &_storage._maxLocalCsv) }() + default: break + } + } + } + } + + func traverse(visitor: inout V) throws { + try withExtendedLifetime(_storage) { (_storage: _StorageClass) in + if !_storage._nodePubkey.isEmpty { + try visitor.visitSingularBytesField(value: _storage._nodePubkey, fieldNumber: 2) + } + if !_storage._nodePubkeyString.isEmpty { + try visitor.visitSingularStringField(value: _storage._nodePubkeyString, fieldNumber: 3) + } + if _storage._localFundingAmount != 0 { + try visitor.visitSingularInt64Field(value: _storage._localFundingAmount, fieldNumber: 4) + } + if _storage._pushSat != 0 { + try visitor.visitSingularInt64Field(value: _storage._pushSat, fieldNumber: 5) + } + if _storage._targetConf != 0 { + try visitor.visitSingularInt32Field(value: _storage._targetConf, fieldNumber: 6) + } + if _storage._satPerByte != 0 { + try visitor.visitSingularInt64Field(value: _storage._satPerByte, fieldNumber: 7) + } + if _storage._private != false { + try visitor.visitSingularBoolField(value: _storage._private, fieldNumber: 8) + } + if _storage._minHtlcMsat != 0 { + try visitor.visitSingularInt64Field(value: _storage._minHtlcMsat, fieldNumber: 9) + } + if _storage._remoteCsvDelay != 0 { + try visitor.visitSingularUInt32Field(value: _storage._remoteCsvDelay, fieldNumber: 10) + } + if _storage._minConfs != 0 { + try visitor.visitSingularInt32Field(value: _storage._minConfs, fieldNumber: 11) + } + if _storage._spendUnconfirmed != false { + try visitor.visitSingularBoolField(value: _storage._spendUnconfirmed, fieldNumber: 12) + } + if !_storage._closeAddress.isEmpty { + try visitor.visitSingularStringField(value: _storage._closeAddress, fieldNumber: 13) + } + if let v = _storage._fundingShim { + try visitor.visitSingularMessageField(value: v, fieldNumber: 14) + } + if _storage._remoteMaxValueInFlightMsat != 0 { + try visitor.visitSingularUInt64Field(value: _storage._remoteMaxValueInFlightMsat, fieldNumber: 15) + } + if _storage._remoteMaxHtlcs != 0 { + try visitor.visitSingularUInt32Field(value: _storage._remoteMaxHtlcs, fieldNumber: 16) + } + if _storage._maxLocalCsv != 0 { + try visitor.visitSingularUInt32Field(value: _storage._maxLocalCsv, fieldNumber: 17) + } + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_OpenChannelRequest, rhs: Lnrpc_OpenChannelRequest) -> Bool { + if lhs._storage !== rhs._storage { + let storagesAreEqual: Bool = withExtendedLifetime((lhs._storage, rhs._storage)) { (_args: (_StorageClass, _StorageClass)) in + let _storage = _args.0 + let rhs_storage = _args.1 + if _storage._nodePubkey != rhs_storage._nodePubkey {return false} + if _storage._nodePubkeyString != rhs_storage._nodePubkeyString {return false} + if _storage._localFundingAmount != rhs_storage._localFundingAmount {return false} + if _storage._pushSat != rhs_storage._pushSat {return false} + if _storage._targetConf != rhs_storage._targetConf {return false} + if _storage._satPerByte != rhs_storage._satPerByte {return false} + if _storage._private != rhs_storage._private {return false} + if _storage._minHtlcMsat != rhs_storage._minHtlcMsat {return false} + if _storage._remoteCsvDelay != rhs_storage._remoteCsvDelay {return false} + if _storage._minConfs != rhs_storage._minConfs {return false} + if _storage._spendUnconfirmed != rhs_storage._spendUnconfirmed {return false} + if _storage._closeAddress != rhs_storage._closeAddress {return false} + if _storage._fundingShim != rhs_storage._fundingShim {return false} + if _storage._remoteMaxValueInFlightMsat != rhs_storage._remoteMaxValueInFlightMsat {return false} + if _storage._remoteMaxHtlcs != rhs_storage._remoteMaxHtlcs {return false} + if _storage._maxLocalCsv != rhs_storage._maxLocalCsv {return false} + return true + } + if !storagesAreEqual {return false} + } + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_OpenStatusUpdate: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".OpenStatusUpdate" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "chan_pending"), + 3: .standard(proto: "chan_open"), + 5: .standard(proto: "psbt_fund"), + 4: .standard(proto: "pending_chan_id"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { + var v: Lnrpc_PendingUpdate? + if let current = self.update { + try decoder.handleConflictingOneOf() + if case .chanPending(let m) = current {v = m} + } + try decoder.decodeSingularMessageField(value: &v) + if let v = v {self.update = .chanPending(v)} + }() + case 3: try { + var v: Lnrpc_ChannelOpenUpdate? + if let current = self.update { + try decoder.handleConflictingOneOf() + if case .chanOpen(let m) = current {v = m} + } + try decoder.decodeSingularMessageField(value: &v) + if let v = v {self.update = .chanOpen(v)} + }() + case 4: try { try decoder.decodeSingularBytesField(value: &self.pendingChanID) }() + case 5: try { + var v: Lnrpc_ReadyForPsbtFunding? + if let current = self.update { + try decoder.handleConflictingOneOf() + if case .psbtFund(let m) = current {v = m} + } + try decoder.decodeSingularMessageField(value: &v) + if let v = v {self.update = .psbtFund(v)} + }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch self.update { + case .chanPending?: try { + guard case .chanPending(let v)? = self.update else { preconditionFailure() } + try visitor.visitSingularMessageField(value: v, fieldNumber: 1) + }() + case .chanOpen?: try { + guard case .chanOpen(let v)? = self.update else { preconditionFailure() } + try visitor.visitSingularMessageField(value: v, fieldNumber: 3) + }() + default: break + } + if !self.pendingChanID.isEmpty { + try visitor.visitSingularBytesField(value: self.pendingChanID, fieldNumber: 4) + } + if case .psbtFund(let v)? = self.update { + try visitor.visitSingularMessageField(value: v, fieldNumber: 5) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_OpenStatusUpdate, rhs: Lnrpc_OpenStatusUpdate) -> Bool { + if lhs.update != rhs.update {return false} + if lhs.pendingChanID != rhs.pendingChanID {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_KeyLocator: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".KeyLocator" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "key_family"), + 2: .standard(proto: "key_index"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularInt32Field(value: &self.keyFamily) }() + case 2: try { try decoder.decodeSingularInt32Field(value: &self.keyIndex) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.keyFamily != 0 { + try visitor.visitSingularInt32Field(value: self.keyFamily, fieldNumber: 1) + } + if self.keyIndex != 0 { + try visitor.visitSingularInt32Field(value: self.keyIndex, fieldNumber: 2) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_KeyLocator, rhs: Lnrpc_KeyLocator) -> Bool { + if lhs.keyFamily != rhs.keyFamily {return false} + if lhs.keyIndex != rhs.keyIndex {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_KeyDescriptor: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".KeyDescriptor" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "raw_key_bytes"), + 2: .standard(proto: "key_loc"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularBytesField(value: &self.rawKeyBytes) }() + case 2: try { try decoder.decodeSingularMessageField(value: &self._keyLoc) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.rawKeyBytes.isEmpty { + try visitor.visitSingularBytesField(value: self.rawKeyBytes, fieldNumber: 1) + } + if let v = self._keyLoc { + try visitor.visitSingularMessageField(value: v, fieldNumber: 2) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_KeyDescriptor, rhs: Lnrpc_KeyDescriptor) -> Bool { + if lhs.rawKeyBytes != rhs.rawKeyBytes {return false} + if lhs._keyLoc != rhs._keyLoc {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ChanPointShim: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ChanPointShim" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "amt"), + 2: .standard(proto: "chan_point"), + 3: .standard(proto: "local_key"), + 4: .standard(proto: "remote_key"), + 5: .standard(proto: "pending_chan_id"), + 6: .standard(proto: "thaw_height"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularInt64Field(value: &self.amt) }() + case 2: try { try decoder.decodeSingularMessageField(value: &self._chanPoint) }() + case 3: try { try decoder.decodeSingularMessageField(value: &self._localKey) }() + case 4: try { try decoder.decodeSingularBytesField(value: &self.remoteKey) }() + case 5: try { try decoder.decodeSingularBytesField(value: &self.pendingChanID) }() + case 6: try { try decoder.decodeSingularUInt32Field(value: &self.thawHeight) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.amt != 0 { + try visitor.visitSingularInt64Field(value: self.amt, fieldNumber: 1) + } + if let v = self._chanPoint { + try visitor.visitSingularMessageField(value: v, fieldNumber: 2) + } + if let v = self._localKey { + try visitor.visitSingularMessageField(value: v, fieldNumber: 3) + } + if !self.remoteKey.isEmpty { + try visitor.visitSingularBytesField(value: self.remoteKey, fieldNumber: 4) + } + if !self.pendingChanID.isEmpty { + try visitor.visitSingularBytesField(value: self.pendingChanID, fieldNumber: 5) + } + if self.thawHeight != 0 { + try visitor.visitSingularUInt32Field(value: self.thawHeight, fieldNumber: 6) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ChanPointShim, rhs: Lnrpc_ChanPointShim) -> Bool { + if lhs.amt != rhs.amt {return false} + if lhs._chanPoint != rhs._chanPoint {return false} + if lhs._localKey != rhs._localKey {return false} + if lhs.remoteKey != rhs.remoteKey {return false} + if lhs.pendingChanID != rhs.pendingChanID {return false} + if lhs.thawHeight != rhs.thawHeight {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_PsbtShim: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".PsbtShim" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "pending_chan_id"), + 2: .standard(proto: "base_psbt"), + 3: .standard(proto: "no_publish"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularBytesField(value: &self.pendingChanID) }() + case 2: try { try decoder.decodeSingularBytesField(value: &self.basePsbt) }() + case 3: try { try decoder.decodeSingularBoolField(value: &self.noPublish) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.pendingChanID.isEmpty { + try visitor.visitSingularBytesField(value: self.pendingChanID, fieldNumber: 1) + } + if !self.basePsbt.isEmpty { + try visitor.visitSingularBytesField(value: self.basePsbt, fieldNumber: 2) + } + if self.noPublish != false { + try visitor.visitSingularBoolField(value: self.noPublish, fieldNumber: 3) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_PsbtShim, rhs: Lnrpc_PsbtShim) -> Bool { + if lhs.pendingChanID != rhs.pendingChanID {return false} + if lhs.basePsbt != rhs.basePsbt {return false} + if lhs.noPublish != rhs.noPublish {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_FundingShim: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".FundingShim" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "chan_point_shim"), + 2: .standard(proto: "psbt_shim"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { + var v: Lnrpc_ChanPointShim? + if let current = self.shim { + try decoder.handleConflictingOneOf() + if case .chanPointShim(let m) = current {v = m} + } + try decoder.decodeSingularMessageField(value: &v) + if let v = v {self.shim = .chanPointShim(v)} + }() + case 2: try { + var v: Lnrpc_PsbtShim? + if let current = self.shim { + try decoder.handleConflictingOneOf() + if case .psbtShim(let m) = current {v = m} + } + try decoder.decodeSingularMessageField(value: &v) + if let v = v {self.shim = .psbtShim(v)} + }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch self.shim { + case .chanPointShim?: try { + guard case .chanPointShim(let v)? = self.shim else { preconditionFailure() } + try visitor.visitSingularMessageField(value: v, fieldNumber: 1) + }() + case .psbtShim?: try { + guard case .psbtShim(let v)? = self.shim else { preconditionFailure() } + try visitor.visitSingularMessageField(value: v, fieldNumber: 2) + }() + case nil: break + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_FundingShim, rhs: Lnrpc_FundingShim) -> Bool { + if lhs.shim != rhs.shim {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_FundingShimCancel: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".FundingShimCancel" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "pending_chan_id"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularBytesField(value: &self.pendingChanID) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.pendingChanID.isEmpty { + try visitor.visitSingularBytesField(value: self.pendingChanID, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_FundingShimCancel, rhs: Lnrpc_FundingShimCancel) -> Bool { + if lhs.pendingChanID != rhs.pendingChanID {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_FundingPsbtVerify: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".FundingPsbtVerify" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "funded_psbt"), + 2: .standard(proto: "pending_chan_id"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularBytesField(value: &self.fundedPsbt) }() + case 2: try { try decoder.decodeSingularBytesField(value: &self.pendingChanID) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.fundedPsbt.isEmpty { + try visitor.visitSingularBytesField(value: self.fundedPsbt, fieldNumber: 1) + } + if !self.pendingChanID.isEmpty { + try visitor.visitSingularBytesField(value: self.pendingChanID, fieldNumber: 2) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_FundingPsbtVerify, rhs: Lnrpc_FundingPsbtVerify) -> Bool { + if lhs.fundedPsbt != rhs.fundedPsbt {return false} + if lhs.pendingChanID != rhs.pendingChanID {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_FundingPsbtFinalize: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".FundingPsbtFinalize" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "signed_psbt"), + 2: .standard(proto: "pending_chan_id"), + 3: .standard(proto: "final_raw_tx"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularBytesField(value: &self.signedPsbt) }() + case 2: try { try decoder.decodeSingularBytesField(value: &self.pendingChanID) }() + case 3: try { try decoder.decodeSingularBytesField(value: &self.finalRawTx) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.signedPsbt.isEmpty { + try visitor.visitSingularBytesField(value: self.signedPsbt, fieldNumber: 1) + } + if !self.pendingChanID.isEmpty { + try visitor.visitSingularBytesField(value: self.pendingChanID, fieldNumber: 2) + } + if !self.finalRawTx.isEmpty { + try visitor.visitSingularBytesField(value: self.finalRawTx, fieldNumber: 3) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_FundingPsbtFinalize, rhs: Lnrpc_FundingPsbtFinalize) -> Bool { + if lhs.signedPsbt != rhs.signedPsbt {return false} + if lhs.pendingChanID != rhs.pendingChanID {return false} + if lhs.finalRawTx != rhs.finalRawTx {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_FundingTransitionMsg: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".FundingTransitionMsg" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "shim_register"), + 2: .standard(proto: "shim_cancel"), + 3: .standard(proto: "psbt_verify"), + 4: .standard(proto: "psbt_finalize"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { + var v: Lnrpc_FundingShim? + if let current = self.trigger { + try decoder.handleConflictingOneOf() + if case .shimRegister(let m) = current {v = m} + } + try decoder.decodeSingularMessageField(value: &v) + if let v = v {self.trigger = .shimRegister(v)} + }() + case 2: try { + var v: Lnrpc_FundingShimCancel? + if let current = self.trigger { + try decoder.handleConflictingOneOf() + if case .shimCancel(let m) = current {v = m} + } + try decoder.decodeSingularMessageField(value: &v) + if let v = v {self.trigger = .shimCancel(v)} + }() + case 3: try { + var v: Lnrpc_FundingPsbtVerify? + if let current = self.trigger { + try decoder.handleConflictingOneOf() + if case .psbtVerify(let m) = current {v = m} + } + try decoder.decodeSingularMessageField(value: &v) + if let v = v {self.trigger = .psbtVerify(v)} + }() + case 4: try { + var v: Lnrpc_FundingPsbtFinalize? + if let current = self.trigger { + try decoder.handleConflictingOneOf() + if case .psbtFinalize(let m) = current {v = m} + } + try decoder.decodeSingularMessageField(value: &v) + if let v = v {self.trigger = .psbtFinalize(v)} + }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch self.trigger { + case .shimRegister?: try { + guard case .shimRegister(let v)? = self.trigger else { preconditionFailure() } + try visitor.visitSingularMessageField(value: v, fieldNumber: 1) + }() + case .shimCancel?: try { + guard case .shimCancel(let v)? = self.trigger else { preconditionFailure() } + try visitor.visitSingularMessageField(value: v, fieldNumber: 2) + }() + case .psbtVerify?: try { + guard case .psbtVerify(let v)? = self.trigger else { preconditionFailure() } + try visitor.visitSingularMessageField(value: v, fieldNumber: 3) + }() + case .psbtFinalize?: try { + guard case .psbtFinalize(let v)? = self.trigger else { preconditionFailure() } + try visitor.visitSingularMessageField(value: v, fieldNumber: 4) + }() + case nil: break + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_FundingTransitionMsg, rhs: Lnrpc_FundingTransitionMsg) -> Bool { + if lhs.trigger != rhs.trigger {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_FundingStateStepResp: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".FundingStateStepResp" + static let _protobuf_nameMap = SwiftProtobuf._NameMap() + + mutating func decodeMessage(decoder: inout D) throws { + while let _ = try decoder.nextFieldNumber() { + } + } + + func traverse(visitor: inout V) throws { + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_FundingStateStepResp, rhs: Lnrpc_FundingStateStepResp) -> Bool { + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_PendingHTLC: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".PendingHTLC" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "incoming"), + 2: .same(proto: "amount"), + 3: .same(proto: "outpoint"), + 4: .standard(proto: "maturity_height"), + 5: .standard(proto: "blocks_til_maturity"), + 6: .same(proto: "stage"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularBoolField(value: &self.incoming) }() + case 2: try { try decoder.decodeSingularInt64Field(value: &self.amount) }() + case 3: try { try decoder.decodeSingularStringField(value: &self.outpoint) }() + case 4: try { try decoder.decodeSingularUInt32Field(value: &self.maturityHeight) }() + case 5: try { try decoder.decodeSingularInt32Field(value: &self.blocksTilMaturity) }() + case 6: try { try decoder.decodeSingularUInt32Field(value: &self.stage) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.incoming != false { + try visitor.visitSingularBoolField(value: self.incoming, fieldNumber: 1) + } + if self.amount != 0 { + try visitor.visitSingularInt64Field(value: self.amount, fieldNumber: 2) + } + if !self.outpoint.isEmpty { + try visitor.visitSingularStringField(value: self.outpoint, fieldNumber: 3) + } + if self.maturityHeight != 0 { + try visitor.visitSingularUInt32Field(value: self.maturityHeight, fieldNumber: 4) + } + if self.blocksTilMaturity != 0 { + try visitor.visitSingularInt32Field(value: self.blocksTilMaturity, fieldNumber: 5) + } + if self.stage != 0 { + try visitor.visitSingularUInt32Field(value: self.stage, fieldNumber: 6) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_PendingHTLC, rhs: Lnrpc_PendingHTLC) -> Bool { + if lhs.incoming != rhs.incoming {return false} + if lhs.amount != rhs.amount {return false} + if lhs.outpoint != rhs.outpoint {return false} + if lhs.maturityHeight != rhs.maturityHeight {return false} + if lhs.blocksTilMaturity != rhs.blocksTilMaturity {return false} + if lhs.stage != rhs.stage {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_PendingChannelsRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".PendingChannelsRequest" + static let _protobuf_nameMap = SwiftProtobuf._NameMap() + + mutating func decodeMessage(decoder: inout D) throws { + while let _ = try decoder.nextFieldNumber() { + } + } + + func traverse(visitor: inout V) throws { + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_PendingChannelsRequest, rhs: Lnrpc_PendingChannelsRequest) -> Bool { + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_PendingChannelsResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".PendingChannelsResponse" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "total_limbo_balance"), + 2: .standard(proto: "pending_open_channels"), + 3: .standard(proto: "pending_closing_channels"), + 4: .standard(proto: "pending_force_closing_channels"), + 5: .standard(proto: "waiting_close_channels"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularInt64Field(value: &self.totalLimboBalance) }() + case 2: try { try decoder.decodeRepeatedMessageField(value: &self.pendingOpenChannels) }() + case 3: try { try decoder.decodeRepeatedMessageField(value: &self.pendingClosingChannels) }() + case 4: try { try decoder.decodeRepeatedMessageField(value: &self.pendingForceClosingChannels) }() + case 5: try { try decoder.decodeRepeatedMessageField(value: &self.waitingCloseChannels) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.totalLimboBalance != 0 { + try visitor.visitSingularInt64Field(value: self.totalLimboBalance, fieldNumber: 1) + } + if !self.pendingOpenChannels.isEmpty { + try visitor.visitRepeatedMessageField(value: self.pendingOpenChannels, fieldNumber: 2) + } + if !self.pendingClosingChannels.isEmpty { + try visitor.visitRepeatedMessageField(value: self.pendingClosingChannels, fieldNumber: 3) + } + if !self.pendingForceClosingChannels.isEmpty { + try visitor.visitRepeatedMessageField(value: self.pendingForceClosingChannels, fieldNumber: 4) + } + if !self.waitingCloseChannels.isEmpty { + try visitor.visitRepeatedMessageField(value: self.waitingCloseChannels, fieldNumber: 5) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_PendingChannelsResponse, rhs: Lnrpc_PendingChannelsResponse) -> Bool { + if lhs.totalLimboBalance != rhs.totalLimboBalance {return false} + if lhs.pendingOpenChannels != rhs.pendingOpenChannels {return false} + if lhs.pendingClosingChannels != rhs.pendingClosingChannels {return false} + if lhs.pendingForceClosingChannels != rhs.pendingForceClosingChannels {return false} + if lhs.waitingCloseChannels != rhs.waitingCloseChannels {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_PendingChannelsResponse.PendingChannel: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = Lnrpc_PendingChannelsResponse.protoMessageName + ".PendingChannel" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "remote_node_pub"), + 2: .standard(proto: "channel_point"), + 3: .same(proto: "capacity"), + 4: .standard(proto: "local_balance"), + 5: .standard(proto: "remote_balance"), + 6: .standard(proto: "local_chan_reserve_sat"), + 7: .standard(proto: "remote_chan_reserve_sat"), + 8: .same(proto: "initiator"), + 9: .standard(proto: "commitment_type"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.remoteNodePub) }() + case 2: try { try decoder.decodeSingularStringField(value: &self.channelPoint) }() + case 3: try { try decoder.decodeSingularInt64Field(value: &self.capacity) }() + case 4: try { try decoder.decodeSingularInt64Field(value: &self.localBalance) }() + case 5: try { try decoder.decodeSingularInt64Field(value: &self.remoteBalance) }() + case 6: try { try decoder.decodeSingularInt64Field(value: &self.localChanReserveSat) }() + case 7: try { try decoder.decodeSingularInt64Field(value: &self.remoteChanReserveSat) }() + case 8: try { try decoder.decodeSingularEnumField(value: &self.initiator) }() + case 9: try { try decoder.decodeSingularEnumField(value: &self.commitmentType) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.remoteNodePub.isEmpty { + try visitor.visitSingularStringField(value: self.remoteNodePub, fieldNumber: 1) + } + if !self.channelPoint.isEmpty { + try visitor.visitSingularStringField(value: self.channelPoint, fieldNumber: 2) + } + if self.capacity != 0 { + try visitor.visitSingularInt64Field(value: self.capacity, fieldNumber: 3) + } + if self.localBalance != 0 { + try visitor.visitSingularInt64Field(value: self.localBalance, fieldNumber: 4) + } + if self.remoteBalance != 0 { + try visitor.visitSingularInt64Field(value: self.remoteBalance, fieldNumber: 5) + } + if self.localChanReserveSat != 0 { + try visitor.visitSingularInt64Field(value: self.localChanReserveSat, fieldNumber: 6) + } + if self.remoteChanReserveSat != 0 { + try visitor.visitSingularInt64Field(value: self.remoteChanReserveSat, fieldNumber: 7) + } + if self.initiator != .unknown { + try visitor.visitSingularEnumField(value: self.initiator, fieldNumber: 8) + } + if self.commitmentType != .legacy { + try visitor.visitSingularEnumField(value: self.commitmentType, fieldNumber: 9) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_PendingChannelsResponse.PendingChannel, rhs: Lnrpc_PendingChannelsResponse.PendingChannel) -> Bool { + if lhs.remoteNodePub != rhs.remoteNodePub {return false} + if lhs.channelPoint != rhs.channelPoint {return false} + if lhs.capacity != rhs.capacity {return false} + if lhs.localBalance != rhs.localBalance {return false} + if lhs.remoteBalance != rhs.remoteBalance {return false} + if lhs.localChanReserveSat != rhs.localChanReserveSat {return false} + if lhs.remoteChanReserveSat != rhs.remoteChanReserveSat {return false} + if lhs.initiator != rhs.initiator {return false} + if lhs.commitmentType != rhs.commitmentType {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_PendingChannelsResponse.PendingOpenChannel: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = Lnrpc_PendingChannelsResponse.protoMessageName + ".PendingOpenChannel" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "channel"), + 2: .standard(proto: "confirmation_height"), + 4: .standard(proto: "commit_fee"), + 5: .standard(proto: "commit_weight"), + 6: .standard(proto: "fee_per_kw"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularMessageField(value: &self._channel) }() + case 2: try { try decoder.decodeSingularUInt32Field(value: &self.confirmationHeight) }() + case 4: try { try decoder.decodeSingularInt64Field(value: &self.commitFee) }() + case 5: try { try decoder.decodeSingularInt64Field(value: &self.commitWeight) }() + case 6: try { try decoder.decodeSingularInt64Field(value: &self.feePerKw) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if let v = self._channel { + try visitor.visitSingularMessageField(value: v, fieldNumber: 1) + } + if self.confirmationHeight != 0 { + try visitor.visitSingularUInt32Field(value: self.confirmationHeight, fieldNumber: 2) + } + if self.commitFee != 0 { + try visitor.visitSingularInt64Field(value: self.commitFee, fieldNumber: 4) + } + if self.commitWeight != 0 { + try visitor.visitSingularInt64Field(value: self.commitWeight, fieldNumber: 5) + } + if self.feePerKw != 0 { + try visitor.visitSingularInt64Field(value: self.feePerKw, fieldNumber: 6) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_PendingChannelsResponse.PendingOpenChannel, rhs: Lnrpc_PendingChannelsResponse.PendingOpenChannel) -> Bool { + if lhs._channel != rhs._channel {return false} + if lhs.confirmationHeight != rhs.confirmationHeight {return false} + if lhs.commitFee != rhs.commitFee {return false} + if lhs.commitWeight != rhs.commitWeight {return false} + if lhs.feePerKw != rhs.feePerKw {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_PendingChannelsResponse.WaitingCloseChannel: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = Lnrpc_PendingChannelsResponse.protoMessageName + ".WaitingCloseChannel" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "channel"), + 2: .standard(proto: "limbo_balance"), + 3: .same(proto: "commitments"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularMessageField(value: &self._channel) }() + case 2: try { try decoder.decodeSingularInt64Field(value: &self.limboBalance) }() + case 3: try { try decoder.decodeSingularMessageField(value: &self._commitments) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if let v = self._channel { + try visitor.visitSingularMessageField(value: v, fieldNumber: 1) + } + if self.limboBalance != 0 { + try visitor.visitSingularInt64Field(value: self.limboBalance, fieldNumber: 2) + } + if let v = self._commitments { + try visitor.visitSingularMessageField(value: v, fieldNumber: 3) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_PendingChannelsResponse.WaitingCloseChannel, rhs: Lnrpc_PendingChannelsResponse.WaitingCloseChannel) -> Bool { + if lhs._channel != rhs._channel {return false} + if lhs.limboBalance != rhs.limboBalance {return false} + if lhs._commitments != rhs._commitments {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_PendingChannelsResponse.Commitments: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = Lnrpc_PendingChannelsResponse.protoMessageName + ".Commitments" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "local_txid"), + 2: .standard(proto: "remote_txid"), + 3: .standard(proto: "remote_pending_txid"), + 4: .standard(proto: "local_commit_fee_sat"), + 5: .standard(proto: "remote_commit_fee_sat"), + 6: .standard(proto: "remote_pending_commit_fee_sat"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.localTxid) }() + case 2: try { try decoder.decodeSingularStringField(value: &self.remoteTxid) }() + case 3: try { try decoder.decodeSingularStringField(value: &self.remotePendingTxid) }() + case 4: try { try decoder.decodeSingularUInt64Field(value: &self.localCommitFeeSat) }() + case 5: try { try decoder.decodeSingularUInt64Field(value: &self.remoteCommitFeeSat) }() + case 6: try { try decoder.decodeSingularUInt64Field(value: &self.remotePendingCommitFeeSat) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.localTxid.isEmpty { + try visitor.visitSingularStringField(value: self.localTxid, fieldNumber: 1) + } + if !self.remoteTxid.isEmpty { + try visitor.visitSingularStringField(value: self.remoteTxid, fieldNumber: 2) + } + if !self.remotePendingTxid.isEmpty { + try visitor.visitSingularStringField(value: self.remotePendingTxid, fieldNumber: 3) + } + if self.localCommitFeeSat != 0 { + try visitor.visitSingularUInt64Field(value: self.localCommitFeeSat, fieldNumber: 4) + } + if self.remoteCommitFeeSat != 0 { + try visitor.visitSingularUInt64Field(value: self.remoteCommitFeeSat, fieldNumber: 5) + } + if self.remotePendingCommitFeeSat != 0 { + try visitor.visitSingularUInt64Field(value: self.remotePendingCommitFeeSat, fieldNumber: 6) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_PendingChannelsResponse.Commitments, rhs: Lnrpc_PendingChannelsResponse.Commitments) -> Bool { + if lhs.localTxid != rhs.localTxid {return false} + if lhs.remoteTxid != rhs.remoteTxid {return false} + if lhs.remotePendingTxid != rhs.remotePendingTxid {return false} + if lhs.localCommitFeeSat != rhs.localCommitFeeSat {return false} + if lhs.remoteCommitFeeSat != rhs.remoteCommitFeeSat {return false} + if lhs.remotePendingCommitFeeSat != rhs.remotePendingCommitFeeSat {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_PendingChannelsResponse.ClosedChannel: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = Lnrpc_PendingChannelsResponse.protoMessageName + ".ClosedChannel" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "channel"), + 2: .standard(proto: "closing_txid"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularMessageField(value: &self._channel) }() + case 2: try { try decoder.decodeSingularStringField(value: &self.closingTxid) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if let v = self._channel { + try visitor.visitSingularMessageField(value: v, fieldNumber: 1) + } + if !self.closingTxid.isEmpty { + try visitor.visitSingularStringField(value: self.closingTxid, fieldNumber: 2) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_PendingChannelsResponse.ClosedChannel, rhs: Lnrpc_PendingChannelsResponse.ClosedChannel) -> Bool { + if lhs._channel != rhs._channel {return false} + if lhs.closingTxid != rhs.closingTxid {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_PendingChannelsResponse.ForceClosedChannel: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = Lnrpc_PendingChannelsResponse.protoMessageName + ".ForceClosedChannel" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "channel"), + 2: .standard(proto: "closing_txid"), + 3: .standard(proto: "limbo_balance"), + 4: .standard(proto: "maturity_height"), + 5: .standard(proto: "blocks_til_maturity"), + 6: .standard(proto: "recovered_balance"), + 8: .standard(proto: "pending_htlcs"), + 9: .same(proto: "anchor"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularMessageField(value: &self._channel) }() + case 2: try { try decoder.decodeSingularStringField(value: &self.closingTxid) }() + case 3: try { try decoder.decodeSingularInt64Field(value: &self.limboBalance) }() + case 4: try { try decoder.decodeSingularUInt32Field(value: &self.maturityHeight) }() + case 5: try { try decoder.decodeSingularInt32Field(value: &self.blocksTilMaturity) }() + case 6: try { try decoder.decodeSingularInt64Field(value: &self.recoveredBalance) }() + case 8: try { try decoder.decodeRepeatedMessageField(value: &self.pendingHtlcs) }() + case 9: try { try decoder.decodeSingularEnumField(value: &self.anchor) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if let v = self._channel { + try visitor.visitSingularMessageField(value: v, fieldNumber: 1) + } + if !self.closingTxid.isEmpty { + try visitor.visitSingularStringField(value: self.closingTxid, fieldNumber: 2) + } + if self.limboBalance != 0 { + try visitor.visitSingularInt64Field(value: self.limboBalance, fieldNumber: 3) + } + if self.maturityHeight != 0 { + try visitor.visitSingularUInt32Field(value: self.maturityHeight, fieldNumber: 4) + } + if self.blocksTilMaturity != 0 { + try visitor.visitSingularInt32Field(value: self.blocksTilMaturity, fieldNumber: 5) + } + if self.recoveredBalance != 0 { + try visitor.visitSingularInt64Field(value: self.recoveredBalance, fieldNumber: 6) + } + if !self.pendingHtlcs.isEmpty { + try visitor.visitRepeatedMessageField(value: self.pendingHtlcs, fieldNumber: 8) + } + if self.anchor != .limbo { + try visitor.visitSingularEnumField(value: self.anchor, fieldNumber: 9) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_PendingChannelsResponse.ForceClosedChannel, rhs: Lnrpc_PendingChannelsResponse.ForceClosedChannel) -> Bool { + if lhs._channel != rhs._channel {return false} + if lhs.closingTxid != rhs.closingTxid {return false} + if lhs.limboBalance != rhs.limboBalance {return false} + if lhs.maturityHeight != rhs.maturityHeight {return false} + if lhs.blocksTilMaturity != rhs.blocksTilMaturity {return false} + if lhs.recoveredBalance != rhs.recoveredBalance {return false} + if lhs.pendingHtlcs != rhs.pendingHtlcs {return false} + if lhs.anchor != rhs.anchor {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_PendingChannelsResponse.ForceClosedChannel.AnchorState: SwiftProtobuf._ProtoNameProviding { + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 0: .same(proto: "LIMBO"), + 1: .same(proto: "RECOVERED"), + 2: .same(proto: "LOST"), + ] +} + +extension Lnrpc_ChannelEventSubscription: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ChannelEventSubscription" + static let _protobuf_nameMap = SwiftProtobuf._NameMap() + + mutating func decodeMessage(decoder: inout D) throws { + while let _ = try decoder.nextFieldNumber() { + } + } + + func traverse(visitor: inout V) throws { + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ChannelEventSubscription, rhs: Lnrpc_ChannelEventSubscription) -> Bool { + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ChannelEventUpdate: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ChannelEventUpdate" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "open_channel"), + 2: .standard(proto: "closed_channel"), + 3: .standard(proto: "active_channel"), + 4: .standard(proto: "inactive_channel"), + 6: .standard(proto: "pending_open_channel"), + 5: .same(proto: "type"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { + var v: Lnrpc_Channel? + if let current = self.channel { + try decoder.handleConflictingOneOf() + if case .openChannel(let m) = current {v = m} + } + try decoder.decodeSingularMessageField(value: &v) + if let v = v {self.channel = .openChannel(v)} + }() + case 2: try { + var v: Lnrpc_ChannelCloseSummary? + if let current = self.channel { + try decoder.handleConflictingOneOf() + if case .closedChannel(let m) = current {v = m} + } + try decoder.decodeSingularMessageField(value: &v) + if let v = v {self.channel = .closedChannel(v)} + }() + case 3: try { + var v: Lnrpc_ChannelPoint? + if let current = self.channel { + try decoder.handleConflictingOneOf() + if case .activeChannel(let m) = current {v = m} + } + try decoder.decodeSingularMessageField(value: &v) + if let v = v {self.channel = .activeChannel(v)} + }() + case 4: try { + var v: Lnrpc_ChannelPoint? + if let current = self.channel { + try decoder.handleConflictingOneOf() + if case .inactiveChannel(let m) = current {v = m} + } + try decoder.decodeSingularMessageField(value: &v) + if let v = v {self.channel = .inactiveChannel(v)} + }() + case 5: try { try decoder.decodeSingularEnumField(value: &self.type) }() + case 6: try { + var v: Lnrpc_PendingUpdate? + if let current = self.channel { + try decoder.handleConflictingOneOf() + if case .pendingOpenChannel(let m) = current {v = m} + } + try decoder.decodeSingularMessageField(value: &v) + if let v = v {self.channel = .pendingOpenChannel(v)} + }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch self.channel { + case .openChannel?: try { + guard case .openChannel(let v)? = self.channel else { preconditionFailure() } + try visitor.visitSingularMessageField(value: v, fieldNumber: 1) + }() + case .closedChannel?: try { + guard case .closedChannel(let v)? = self.channel else { preconditionFailure() } + try visitor.visitSingularMessageField(value: v, fieldNumber: 2) + }() + case .activeChannel?: try { + guard case .activeChannel(let v)? = self.channel else { preconditionFailure() } + try visitor.visitSingularMessageField(value: v, fieldNumber: 3) + }() + case .inactiveChannel?: try { + guard case .inactiveChannel(let v)? = self.channel else { preconditionFailure() } + try visitor.visitSingularMessageField(value: v, fieldNumber: 4) + }() + default: break + } + if self.type != .openChannel { + try visitor.visitSingularEnumField(value: self.type, fieldNumber: 5) + } + if case .pendingOpenChannel(let v)? = self.channel { + try visitor.visitSingularMessageField(value: v, fieldNumber: 6) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ChannelEventUpdate, rhs: Lnrpc_ChannelEventUpdate) -> Bool { + if lhs.channel != rhs.channel {return false} + if lhs.type != rhs.type {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ChannelEventUpdate.UpdateType: SwiftProtobuf._ProtoNameProviding { + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 0: .same(proto: "OPEN_CHANNEL"), + 1: .same(proto: "CLOSED_CHANNEL"), + 2: .same(proto: "ACTIVE_CHANNEL"), + 3: .same(proto: "INACTIVE_CHANNEL"), + 4: .same(proto: "PENDING_OPEN_CHANNEL"), + ] +} + +extension Lnrpc_WalletBalanceRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".WalletBalanceRequest" + static let _protobuf_nameMap = SwiftProtobuf._NameMap() + + mutating func decodeMessage(decoder: inout D) throws { + while let _ = try decoder.nextFieldNumber() { + } + } + + func traverse(visitor: inout V) throws { + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_WalletBalanceRequest, rhs: Lnrpc_WalletBalanceRequest) -> Bool { + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_WalletBalanceResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".WalletBalanceResponse" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "total_balance"), + 2: .standard(proto: "confirmed_balance"), + 3: .standard(proto: "unconfirmed_balance"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularInt64Field(value: &self.totalBalance) }() + case 2: try { try decoder.decodeSingularInt64Field(value: &self.confirmedBalance) }() + case 3: try { try decoder.decodeSingularInt64Field(value: &self.unconfirmedBalance) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.totalBalance != 0 { + try visitor.visitSingularInt64Field(value: self.totalBalance, fieldNumber: 1) + } + if self.confirmedBalance != 0 { + try visitor.visitSingularInt64Field(value: self.confirmedBalance, fieldNumber: 2) + } + if self.unconfirmedBalance != 0 { + try visitor.visitSingularInt64Field(value: self.unconfirmedBalance, fieldNumber: 3) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_WalletBalanceResponse, rhs: Lnrpc_WalletBalanceResponse) -> Bool { + if lhs.totalBalance != rhs.totalBalance {return false} + if lhs.confirmedBalance != rhs.confirmedBalance {return false} + if lhs.unconfirmedBalance != rhs.unconfirmedBalance {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_Amount: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".Amount" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "sat"), + 2: .same(proto: "msat"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularUInt64Field(value: &self.sat) }() + case 2: try { try decoder.decodeSingularUInt64Field(value: &self.msat) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.sat != 0 { + try visitor.visitSingularUInt64Field(value: self.sat, fieldNumber: 1) + } + if self.msat != 0 { + try visitor.visitSingularUInt64Field(value: self.msat, fieldNumber: 2) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_Amount, rhs: Lnrpc_Amount) -> Bool { + if lhs.sat != rhs.sat {return false} + if lhs.msat != rhs.msat {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ChannelBalanceRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ChannelBalanceRequest" + static let _protobuf_nameMap = SwiftProtobuf._NameMap() + + mutating func decodeMessage(decoder: inout D) throws { + while let _ = try decoder.nextFieldNumber() { + } + } + + func traverse(visitor: inout V) throws { + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ChannelBalanceRequest, rhs: Lnrpc_ChannelBalanceRequest) -> Bool { + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ChannelBalanceResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ChannelBalanceResponse" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "balance"), + 2: .standard(proto: "pending_open_balance"), + 3: .standard(proto: "local_balance"), + 4: .standard(proto: "remote_balance"), + 5: .standard(proto: "unsettled_local_balance"), + 6: .standard(proto: "unsettled_remote_balance"), + 7: .standard(proto: "pending_open_local_balance"), + 8: .standard(proto: "pending_open_remote_balance"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularInt64Field(value: &self.balance) }() + case 2: try { try decoder.decodeSingularInt64Field(value: &self.pendingOpenBalance) }() + case 3: try { try decoder.decodeSingularMessageField(value: &self._localBalance) }() + case 4: try { try decoder.decodeSingularMessageField(value: &self._remoteBalance) }() + case 5: try { try decoder.decodeSingularMessageField(value: &self._unsettledLocalBalance) }() + case 6: try { try decoder.decodeSingularMessageField(value: &self._unsettledRemoteBalance) }() + case 7: try { try decoder.decodeSingularMessageField(value: &self._pendingOpenLocalBalance) }() + case 8: try { try decoder.decodeSingularMessageField(value: &self._pendingOpenRemoteBalance) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.balance != 0 { + try visitor.visitSingularInt64Field(value: self.balance, fieldNumber: 1) + } + if self.pendingOpenBalance != 0 { + try visitor.visitSingularInt64Field(value: self.pendingOpenBalance, fieldNumber: 2) + } + if let v = self._localBalance { + try visitor.visitSingularMessageField(value: v, fieldNumber: 3) + } + if let v = self._remoteBalance { + try visitor.visitSingularMessageField(value: v, fieldNumber: 4) + } + if let v = self._unsettledLocalBalance { + try visitor.visitSingularMessageField(value: v, fieldNumber: 5) + } + if let v = self._unsettledRemoteBalance { + try visitor.visitSingularMessageField(value: v, fieldNumber: 6) + } + if let v = self._pendingOpenLocalBalance { + try visitor.visitSingularMessageField(value: v, fieldNumber: 7) + } + if let v = self._pendingOpenRemoteBalance { + try visitor.visitSingularMessageField(value: v, fieldNumber: 8) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ChannelBalanceResponse, rhs: Lnrpc_ChannelBalanceResponse) -> Bool { + if lhs.balance != rhs.balance {return false} + if lhs.pendingOpenBalance != rhs.pendingOpenBalance {return false} + if lhs._localBalance != rhs._localBalance {return false} + if lhs._remoteBalance != rhs._remoteBalance {return false} + if lhs._unsettledLocalBalance != rhs._unsettledLocalBalance {return false} + if lhs._unsettledRemoteBalance != rhs._unsettledRemoteBalance {return false} + if lhs._pendingOpenLocalBalance != rhs._pendingOpenLocalBalance {return false} + if lhs._pendingOpenRemoteBalance != rhs._pendingOpenRemoteBalance {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_QueryRoutesRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".QueryRoutesRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "pub_key"), + 2: .same(proto: "amt"), + 12: .standard(proto: "amt_msat"), + 4: .standard(proto: "final_cltv_delta"), + 5: .standard(proto: "fee_limit"), + 6: .standard(proto: "ignored_nodes"), + 7: .standard(proto: "ignored_edges"), + 8: .standard(proto: "source_pub_key"), + 9: .standard(proto: "use_mission_control"), + 10: .standard(proto: "ignored_pairs"), + 11: .standard(proto: "cltv_limit"), + 13: .standard(proto: "dest_custom_records"), + 14: .standard(proto: "outgoing_chan_id"), + 15: .standard(proto: "last_hop_pubkey"), + 16: .standard(proto: "route_hints"), + 17: .standard(proto: "dest_features"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.pubKey) }() + case 2: try { try decoder.decodeSingularInt64Field(value: &self.amt) }() + case 4: try { try decoder.decodeSingularInt32Field(value: &self.finalCltvDelta) }() + case 5: try { try decoder.decodeSingularMessageField(value: &self._feeLimit) }() + case 6: try { try decoder.decodeRepeatedBytesField(value: &self.ignoredNodes) }() + case 7: try { try decoder.decodeRepeatedMessageField(value: &self.ignoredEdges) }() + case 8: try { try decoder.decodeSingularStringField(value: &self.sourcePubKey) }() + case 9: try { try decoder.decodeSingularBoolField(value: &self.useMissionControl) }() + case 10: try { try decoder.decodeRepeatedMessageField(value: &self.ignoredPairs) }() + case 11: try { try decoder.decodeSingularUInt32Field(value: &self.cltvLimit) }() + case 12: try { try decoder.decodeSingularInt64Field(value: &self.amtMsat) }() + case 13: try { try decoder.decodeMapField(fieldType: SwiftProtobuf._ProtobufMap.self, value: &self.destCustomRecords) }() + case 14: try { try decoder.decodeSingularUInt64Field(value: &self.outgoingChanID) }() + case 15: try { try decoder.decodeSingularBytesField(value: &self.lastHopPubkey) }() + case 16: try { try decoder.decodeRepeatedMessageField(value: &self.routeHints) }() + case 17: try { try decoder.decodeRepeatedEnumField(value: &self.destFeatures) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.pubKey.isEmpty { + try visitor.visitSingularStringField(value: self.pubKey, fieldNumber: 1) + } + if self.amt != 0 { + try visitor.visitSingularInt64Field(value: self.amt, fieldNumber: 2) + } + if self.finalCltvDelta != 0 { + try visitor.visitSingularInt32Field(value: self.finalCltvDelta, fieldNumber: 4) + } + if let v = self._feeLimit { + try visitor.visitSingularMessageField(value: v, fieldNumber: 5) + } + if !self.ignoredNodes.isEmpty { + try visitor.visitRepeatedBytesField(value: self.ignoredNodes, fieldNumber: 6) + } + if !self.ignoredEdges.isEmpty { + try visitor.visitRepeatedMessageField(value: self.ignoredEdges, fieldNumber: 7) + } + if !self.sourcePubKey.isEmpty { + try visitor.visitSingularStringField(value: self.sourcePubKey, fieldNumber: 8) + } + if self.useMissionControl != false { + try visitor.visitSingularBoolField(value: self.useMissionControl, fieldNumber: 9) + } + if !self.ignoredPairs.isEmpty { + try visitor.visitRepeatedMessageField(value: self.ignoredPairs, fieldNumber: 10) + } + if self.cltvLimit != 0 { + try visitor.visitSingularUInt32Field(value: self.cltvLimit, fieldNumber: 11) + } + if self.amtMsat != 0 { + try visitor.visitSingularInt64Field(value: self.amtMsat, fieldNumber: 12) + } + if !self.destCustomRecords.isEmpty { + try visitor.visitMapField(fieldType: SwiftProtobuf._ProtobufMap.self, value: self.destCustomRecords, fieldNumber: 13) + } + if self.outgoingChanID != 0 { + try visitor.visitSingularUInt64Field(value: self.outgoingChanID, fieldNumber: 14) + } + if !self.lastHopPubkey.isEmpty { + try visitor.visitSingularBytesField(value: self.lastHopPubkey, fieldNumber: 15) + } + if !self.routeHints.isEmpty { + try visitor.visitRepeatedMessageField(value: self.routeHints, fieldNumber: 16) + } + if !self.destFeatures.isEmpty { + try visitor.visitPackedEnumField(value: self.destFeatures, fieldNumber: 17) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_QueryRoutesRequest, rhs: Lnrpc_QueryRoutesRequest) -> Bool { + if lhs.pubKey != rhs.pubKey {return false} + if lhs.amt != rhs.amt {return false} + if lhs.amtMsat != rhs.amtMsat {return false} + if lhs.finalCltvDelta != rhs.finalCltvDelta {return false} + if lhs._feeLimit != rhs._feeLimit {return false} + if lhs.ignoredNodes != rhs.ignoredNodes {return false} + if lhs.ignoredEdges != rhs.ignoredEdges {return false} + if lhs.sourcePubKey != rhs.sourcePubKey {return false} + if lhs.useMissionControl != rhs.useMissionControl {return false} + if lhs.ignoredPairs != rhs.ignoredPairs {return false} + if lhs.cltvLimit != rhs.cltvLimit {return false} + if lhs.destCustomRecords != rhs.destCustomRecords {return false} + if lhs.outgoingChanID != rhs.outgoingChanID {return false} + if lhs.lastHopPubkey != rhs.lastHopPubkey {return false} + if lhs.routeHints != rhs.routeHints {return false} + if lhs.destFeatures != rhs.destFeatures {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_NodePair: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".NodePair" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "from"), + 2: .same(proto: "to"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularBytesField(value: &self.from) }() + case 2: try { try decoder.decodeSingularBytesField(value: &self.to) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.from.isEmpty { + try visitor.visitSingularBytesField(value: self.from, fieldNumber: 1) + } + if !self.to.isEmpty { + try visitor.visitSingularBytesField(value: self.to, fieldNumber: 2) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_NodePair, rhs: Lnrpc_NodePair) -> Bool { + if lhs.from != rhs.from {return false} + if lhs.to != rhs.to {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_EdgeLocator: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".EdgeLocator" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "channel_id"), + 2: .standard(proto: "direction_reverse"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularUInt64Field(value: &self.channelID) }() + case 2: try { try decoder.decodeSingularBoolField(value: &self.directionReverse) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.channelID != 0 { + try visitor.visitSingularUInt64Field(value: self.channelID, fieldNumber: 1) + } + if self.directionReverse != false { + try visitor.visitSingularBoolField(value: self.directionReverse, fieldNumber: 2) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_EdgeLocator, rhs: Lnrpc_EdgeLocator) -> Bool { + if lhs.channelID != rhs.channelID {return false} + if lhs.directionReverse != rhs.directionReverse {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_QueryRoutesResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".QueryRoutesResponse" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "routes"), + 2: .standard(proto: "success_prob"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeRepeatedMessageField(value: &self.routes) }() + case 2: try { try decoder.decodeSingularDoubleField(value: &self.successProb) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.routes.isEmpty { + try visitor.visitRepeatedMessageField(value: self.routes, fieldNumber: 1) + } + if self.successProb != 0 { + try visitor.visitSingularDoubleField(value: self.successProb, fieldNumber: 2) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_QueryRoutesResponse, rhs: Lnrpc_QueryRoutesResponse) -> Bool { + if lhs.routes != rhs.routes {return false} + if lhs.successProb != rhs.successProb {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_Hop: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".Hop" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "chan_id"), + 2: .standard(proto: "chan_capacity"), + 3: .standard(proto: "amt_to_forward"), + 4: .same(proto: "fee"), + 5: .same(proto: "expiry"), + 6: .standard(proto: "amt_to_forward_msat"), + 7: .standard(proto: "fee_msat"), + 8: .standard(proto: "pub_key"), + 9: .standard(proto: "tlv_payload"), + 10: .standard(proto: "mpp_record"), + 11: .standard(proto: "custom_records"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularUInt64Field(value: &self.chanID) }() + case 2: try { try decoder.decodeSingularInt64Field(value: &self.chanCapacity) }() + case 3: try { try decoder.decodeSingularInt64Field(value: &self.amtToForward) }() + case 4: try { try decoder.decodeSingularInt64Field(value: &self.fee) }() + case 5: try { try decoder.decodeSingularUInt32Field(value: &self.expiry) }() + case 6: try { try decoder.decodeSingularInt64Field(value: &self.amtToForwardMsat) }() + case 7: try { try decoder.decodeSingularInt64Field(value: &self.feeMsat) }() + case 8: try { try decoder.decodeSingularStringField(value: &self.pubKey) }() + case 9: try { try decoder.decodeSingularBoolField(value: &self.tlvPayload) }() + case 10: try { try decoder.decodeSingularMessageField(value: &self._mppRecord) }() + case 11: try { try decoder.decodeMapField(fieldType: SwiftProtobuf._ProtobufMap.self, value: &self.customRecords) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.chanID != 0 { + try visitor.visitSingularUInt64Field(value: self.chanID, fieldNumber: 1) + } + if self.chanCapacity != 0 { + try visitor.visitSingularInt64Field(value: self.chanCapacity, fieldNumber: 2) + } + if self.amtToForward != 0 { + try visitor.visitSingularInt64Field(value: self.amtToForward, fieldNumber: 3) + } + if self.fee != 0 { + try visitor.visitSingularInt64Field(value: self.fee, fieldNumber: 4) + } + if self.expiry != 0 { + try visitor.visitSingularUInt32Field(value: self.expiry, fieldNumber: 5) + } + if self.amtToForwardMsat != 0 { + try visitor.visitSingularInt64Field(value: self.amtToForwardMsat, fieldNumber: 6) + } + if self.feeMsat != 0 { + try visitor.visitSingularInt64Field(value: self.feeMsat, fieldNumber: 7) + } + if !self.pubKey.isEmpty { + try visitor.visitSingularStringField(value: self.pubKey, fieldNumber: 8) + } + if self.tlvPayload != false { + try visitor.visitSingularBoolField(value: self.tlvPayload, fieldNumber: 9) + } + if let v = self._mppRecord { + try visitor.visitSingularMessageField(value: v, fieldNumber: 10) + } + if !self.customRecords.isEmpty { + try visitor.visitMapField(fieldType: SwiftProtobuf._ProtobufMap.self, value: self.customRecords, fieldNumber: 11) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_Hop, rhs: Lnrpc_Hop) -> Bool { + if lhs.chanID != rhs.chanID {return false} + if lhs.chanCapacity != rhs.chanCapacity {return false} + if lhs.amtToForward != rhs.amtToForward {return false} + if lhs.fee != rhs.fee {return false} + if lhs.expiry != rhs.expiry {return false} + if lhs.amtToForwardMsat != rhs.amtToForwardMsat {return false} + if lhs.feeMsat != rhs.feeMsat {return false} + if lhs.pubKey != rhs.pubKey {return false} + if lhs.tlvPayload != rhs.tlvPayload {return false} + if lhs._mppRecord != rhs._mppRecord {return false} + if lhs.customRecords != rhs.customRecords {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_MPPRecord: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".MPPRecord" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 11: .standard(proto: "payment_addr"), + 10: .standard(proto: "total_amt_msat"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 10: try { try decoder.decodeSingularInt64Field(value: &self.totalAmtMsat) }() + case 11: try { try decoder.decodeSingularBytesField(value: &self.paymentAddr) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.totalAmtMsat != 0 { + try visitor.visitSingularInt64Field(value: self.totalAmtMsat, fieldNumber: 10) + } + if !self.paymentAddr.isEmpty { + try visitor.visitSingularBytesField(value: self.paymentAddr, fieldNumber: 11) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_MPPRecord, rhs: Lnrpc_MPPRecord) -> Bool { + if lhs.paymentAddr != rhs.paymentAddr {return false} + if lhs.totalAmtMsat != rhs.totalAmtMsat {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_Route: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".Route" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "total_time_lock"), + 2: .standard(proto: "total_fees"), + 3: .standard(proto: "total_amt"), + 4: .same(proto: "hops"), + 5: .standard(proto: "total_fees_msat"), + 6: .standard(proto: "total_amt_msat"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularUInt32Field(value: &self.totalTimeLock) }() + case 2: try { try decoder.decodeSingularInt64Field(value: &self.totalFees) }() + case 3: try { try decoder.decodeSingularInt64Field(value: &self.totalAmt) }() + case 4: try { try decoder.decodeRepeatedMessageField(value: &self.hops) }() + case 5: try { try decoder.decodeSingularInt64Field(value: &self.totalFeesMsat) }() + case 6: try { try decoder.decodeSingularInt64Field(value: &self.totalAmtMsat) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.totalTimeLock != 0 { + try visitor.visitSingularUInt32Field(value: self.totalTimeLock, fieldNumber: 1) + } + if self.totalFees != 0 { + try visitor.visitSingularInt64Field(value: self.totalFees, fieldNumber: 2) + } + if self.totalAmt != 0 { + try visitor.visitSingularInt64Field(value: self.totalAmt, fieldNumber: 3) + } + if !self.hops.isEmpty { + try visitor.visitRepeatedMessageField(value: self.hops, fieldNumber: 4) + } + if self.totalFeesMsat != 0 { + try visitor.visitSingularInt64Field(value: self.totalFeesMsat, fieldNumber: 5) + } + if self.totalAmtMsat != 0 { + try visitor.visitSingularInt64Field(value: self.totalAmtMsat, fieldNumber: 6) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_Route, rhs: Lnrpc_Route) -> Bool { + if lhs.totalTimeLock != rhs.totalTimeLock {return false} + if lhs.totalFees != rhs.totalFees {return false} + if lhs.totalAmt != rhs.totalAmt {return false} + if lhs.hops != rhs.hops {return false} + if lhs.totalFeesMsat != rhs.totalFeesMsat {return false} + if lhs.totalAmtMsat != rhs.totalAmtMsat {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_NodeInfoRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".NodeInfoRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "pub_key"), + 2: .standard(proto: "include_channels"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.pubKey) }() + case 2: try { try decoder.decodeSingularBoolField(value: &self.includeChannels) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.pubKey.isEmpty { + try visitor.visitSingularStringField(value: self.pubKey, fieldNumber: 1) + } + if self.includeChannels != false { + try visitor.visitSingularBoolField(value: self.includeChannels, fieldNumber: 2) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_NodeInfoRequest, rhs: Lnrpc_NodeInfoRequest) -> Bool { + if lhs.pubKey != rhs.pubKey {return false} + if lhs.includeChannels != rhs.includeChannels {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_NodeInfo: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".NodeInfo" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "node"), + 2: .standard(proto: "num_channels"), + 3: .standard(proto: "total_capacity"), + 4: .same(proto: "channels"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularMessageField(value: &self._node) }() + case 2: try { try decoder.decodeSingularUInt32Field(value: &self.numChannels) }() + case 3: try { try decoder.decodeSingularInt64Field(value: &self.totalCapacity) }() + case 4: try { try decoder.decodeRepeatedMessageField(value: &self.channels) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if let v = self._node { + try visitor.visitSingularMessageField(value: v, fieldNumber: 1) + } + if self.numChannels != 0 { + try visitor.visitSingularUInt32Field(value: self.numChannels, fieldNumber: 2) + } + if self.totalCapacity != 0 { + try visitor.visitSingularInt64Field(value: self.totalCapacity, fieldNumber: 3) + } + if !self.channels.isEmpty { + try visitor.visitRepeatedMessageField(value: self.channels, fieldNumber: 4) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_NodeInfo, rhs: Lnrpc_NodeInfo) -> Bool { + if lhs._node != rhs._node {return false} + if lhs.numChannels != rhs.numChannels {return false} + if lhs.totalCapacity != rhs.totalCapacity {return false} + if lhs.channels != rhs.channels {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_LightningNode: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".LightningNode" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "last_update"), + 2: .standard(proto: "pub_key"), + 3: .same(proto: "alias"), + 4: .same(proto: "addresses"), + 5: .same(proto: "color"), + 6: .same(proto: "features"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularUInt32Field(value: &self.lastUpdate) }() + case 2: try { try decoder.decodeSingularStringField(value: &self.pubKey) }() + case 3: try { try decoder.decodeSingularStringField(value: &self.alias) }() + case 4: try { try decoder.decodeRepeatedMessageField(value: &self.addresses) }() + case 5: try { try decoder.decodeSingularStringField(value: &self.color) }() + case 6: try { try decoder.decodeMapField(fieldType: SwiftProtobuf._ProtobufMessageMap.self, value: &self.features) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.lastUpdate != 0 { + try visitor.visitSingularUInt32Field(value: self.lastUpdate, fieldNumber: 1) + } + if !self.pubKey.isEmpty { + try visitor.visitSingularStringField(value: self.pubKey, fieldNumber: 2) + } + if !self.alias.isEmpty { + try visitor.visitSingularStringField(value: self.alias, fieldNumber: 3) + } + if !self.addresses.isEmpty { + try visitor.visitRepeatedMessageField(value: self.addresses, fieldNumber: 4) + } + if !self.color.isEmpty { + try visitor.visitSingularStringField(value: self.color, fieldNumber: 5) + } + if !self.features.isEmpty { + try visitor.visitMapField(fieldType: SwiftProtobuf._ProtobufMessageMap.self, value: self.features, fieldNumber: 6) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_LightningNode, rhs: Lnrpc_LightningNode) -> Bool { + if lhs.lastUpdate != rhs.lastUpdate {return false} + if lhs.pubKey != rhs.pubKey {return false} + if lhs.alias != rhs.alias {return false} + if lhs.addresses != rhs.addresses {return false} + if lhs.color != rhs.color {return false} + if lhs.features != rhs.features {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_NodeAddress: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".NodeAddress" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "network"), + 2: .same(proto: "addr"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.network) }() + case 2: try { try decoder.decodeSingularStringField(value: &self.addr) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.network.isEmpty { + try visitor.visitSingularStringField(value: self.network, fieldNumber: 1) + } + if !self.addr.isEmpty { + try visitor.visitSingularStringField(value: self.addr, fieldNumber: 2) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_NodeAddress, rhs: Lnrpc_NodeAddress) -> Bool { + if lhs.network != rhs.network {return false} + if lhs.addr != rhs.addr {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_RoutingPolicy: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".RoutingPolicy" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "time_lock_delta"), + 2: .standard(proto: "min_htlc"), + 3: .standard(proto: "fee_base_msat"), + 4: .standard(proto: "fee_rate_milli_msat"), + 5: .same(proto: "disabled"), + 6: .standard(proto: "max_htlc_msat"), + 7: .standard(proto: "last_update"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularUInt32Field(value: &self.timeLockDelta) }() + case 2: try { try decoder.decodeSingularInt64Field(value: &self.minHtlc) }() + case 3: try { try decoder.decodeSingularInt64Field(value: &self.feeBaseMsat) }() + case 4: try { try decoder.decodeSingularInt64Field(value: &self.feeRateMilliMsat) }() + case 5: try { try decoder.decodeSingularBoolField(value: &self.disabled) }() + case 6: try { try decoder.decodeSingularUInt64Field(value: &self.maxHtlcMsat) }() + case 7: try { try decoder.decodeSingularUInt32Field(value: &self.lastUpdate) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.timeLockDelta != 0 { + try visitor.visitSingularUInt32Field(value: self.timeLockDelta, fieldNumber: 1) + } + if self.minHtlc != 0 { + try visitor.visitSingularInt64Field(value: self.minHtlc, fieldNumber: 2) + } + if self.feeBaseMsat != 0 { + try visitor.visitSingularInt64Field(value: self.feeBaseMsat, fieldNumber: 3) + } + if self.feeRateMilliMsat != 0 { + try visitor.visitSingularInt64Field(value: self.feeRateMilliMsat, fieldNumber: 4) + } + if self.disabled != false { + try visitor.visitSingularBoolField(value: self.disabled, fieldNumber: 5) + } + if self.maxHtlcMsat != 0 { + try visitor.visitSingularUInt64Field(value: self.maxHtlcMsat, fieldNumber: 6) + } + if self.lastUpdate != 0 { + try visitor.visitSingularUInt32Field(value: self.lastUpdate, fieldNumber: 7) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_RoutingPolicy, rhs: Lnrpc_RoutingPolicy) -> Bool { + if lhs.timeLockDelta != rhs.timeLockDelta {return false} + if lhs.minHtlc != rhs.minHtlc {return false} + if lhs.feeBaseMsat != rhs.feeBaseMsat {return false} + if lhs.feeRateMilliMsat != rhs.feeRateMilliMsat {return false} + if lhs.disabled != rhs.disabled {return false} + if lhs.maxHtlcMsat != rhs.maxHtlcMsat {return false} + if lhs.lastUpdate != rhs.lastUpdate {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ChannelEdge: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ChannelEdge" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "channel_id"), + 2: .standard(proto: "chan_point"), + 3: .standard(proto: "last_update"), + 4: .standard(proto: "node1_pub"), + 5: .standard(proto: "node2_pub"), + 6: .same(proto: "capacity"), + 7: .standard(proto: "node1_policy"), + 8: .standard(proto: "node2_policy"), + ] + + fileprivate class _StorageClass { + var _channelID: UInt64 = 0 + var _chanPoint: String = String() + var _lastUpdate: UInt32 = 0 + var _node1Pub: String = String() + var _node2Pub: String = String() + var _capacity: Int64 = 0 + var _node1Policy: Lnrpc_RoutingPolicy? = nil + var _node2Policy: Lnrpc_RoutingPolicy? = nil + + static let defaultInstance = _StorageClass() + + private init() {} + + init(copying source: _StorageClass) { + _channelID = source._channelID + _chanPoint = source._chanPoint + _lastUpdate = source._lastUpdate + _node1Pub = source._node1Pub + _node2Pub = source._node2Pub + _capacity = source._capacity + _node1Policy = source._node1Policy + _node2Policy = source._node2Policy + } + } + + fileprivate mutating func _uniqueStorage() -> _StorageClass { + if !isKnownUniquelyReferenced(&_storage) { + _storage = _StorageClass(copying: _storage) + } + return _storage + } + + mutating func decodeMessage(decoder: inout D) throws { + _ = _uniqueStorage() + try withExtendedLifetime(_storage) { (_storage: _StorageClass) in + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularUInt64Field(value: &_storage._channelID) }() + case 2: try { try decoder.decodeSingularStringField(value: &_storage._chanPoint) }() + case 3: try { try decoder.decodeSingularUInt32Field(value: &_storage._lastUpdate) }() + case 4: try { try decoder.decodeSingularStringField(value: &_storage._node1Pub) }() + case 5: try { try decoder.decodeSingularStringField(value: &_storage._node2Pub) }() + case 6: try { try decoder.decodeSingularInt64Field(value: &_storage._capacity) }() + case 7: try { try decoder.decodeSingularMessageField(value: &_storage._node1Policy) }() + case 8: try { try decoder.decodeSingularMessageField(value: &_storage._node2Policy) }() + default: break + } + } + } + } + + func traverse(visitor: inout V) throws { + try withExtendedLifetime(_storage) { (_storage: _StorageClass) in + if _storage._channelID != 0 { + try visitor.visitSingularUInt64Field(value: _storage._channelID, fieldNumber: 1) + } + if !_storage._chanPoint.isEmpty { + try visitor.visitSingularStringField(value: _storage._chanPoint, fieldNumber: 2) + } + if _storage._lastUpdate != 0 { + try visitor.visitSingularUInt32Field(value: _storage._lastUpdate, fieldNumber: 3) + } + if !_storage._node1Pub.isEmpty { + try visitor.visitSingularStringField(value: _storage._node1Pub, fieldNumber: 4) + } + if !_storage._node2Pub.isEmpty { + try visitor.visitSingularStringField(value: _storage._node2Pub, fieldNumber: 5) + } + if _storage._capacity != 0 { + try visitor.visitSingularInt64Field(value: _storage._capacity, fieldNumber: 6) + } + if let v = _storage._node1Policy { + try visitor.visitSingularMessageField(value: v, fieldNumber: 7) + } + if let v = _storage._node2Policy { + try visitor.visitSingularMessageField(value: v, fieldNumber: 8) + } + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ChannelEdge, rhs: Lnrpc_ChannelEdge) -> Bool { + if lhs._storage !== rhs._storage { + let storagesAreEqual: Bool = withExtendedLifetime((lhs._storage, rhs._storage)) { (_args: (_StorageClass, _StorageClass)) in + let _storage = _args.0 + let rhs_storage = _args.1 + if _storage._channelID != rhs_storage._channelID {return false} + if _storage._chanPoint != rhs_storage._chanPoint {return false} + if _storage._lastUpdate != rhs_storage._lastUpdate {return false} + if _storage._node1Pub != rhs_storage._node1Pub {return false} + if _storage._node2Pub != rhs_storage._node2Pub {return false} + if _storage._capacity != rhs_storage._capacity {return false} + if _storage._node1Policy != rhs_storage._node1Policy {return false} + if _storage._node2Policy != rhs_storage._node2Policy {return false} + return true + } + if !storagesAreEqual {return false} + } + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ChannelGraphRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ChannelGraphRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "include_unannounced"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularBoolField(value: &self.includeUnannounced) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.includeUnannounced != false { + try visitor.visitSingularBoolField(value: self.includeUnannounced, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ChannelGraphRequest, rhs: Lnrpc_ChannelGraphRequest) -> Bool { + if lhs.includeUnannounced != rhs.includeUnannounced {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ChannelGraph: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ChannelGraph" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "nodes"), + 2: .same(proto: "edges"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeRepeatedMessageField(value: &self.nodes) }() + case 2: try { try decoder.decodeRepeatedMessageField(value: &self.edges) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.nodes.isEmpty { + try visitor.visitRepeatedMessageField(value: self.nodes, fieldNumber: 1) + } + if !self.edges.isEmpty { + try visitor.visitRepeatedMessageField(value: self.edges, fieldNumber: 2) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ChannelGraph, rhs: Lnrpc_ChannelGraph) -> Bool { + if lhs.nodes != rhs.nodes {return false} + if lhs.edges != rhs.edges {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_NodeMetricsRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".NodeMetricsRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "types"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeRepeatedEnumField(value: &self.types) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.types.isEmpty { + try visitor.visitPackedEnumField(value: self.types, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_NodeMetricsRequest, rhs: Lnrpc_NodeMetricsRequest) -> Bool { + if lhs.types != rhs.types {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_NodeMetricsResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".NodeMetricsResponse" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "betweenness_centrality"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeMapField(fieldType: SwiftProtobuf._ProtobufMessageMap.self, value: &self.betweennessCentrality) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.betweennessCentrality.isEmpty { + try visitor.visitMapField(fieldType: SwiftProtobuf._ProtobufMessageMap.self, value: self.betweennessCentrality, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_NodeMetricsResponse, rhs: Lnrpc_NodeMetricsResponse) -> Bool { + if lhs.betweennessCentrality != rhs.betweennessCentrality {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_FloatMetric: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".FloatMetric" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "value"), + 2: .standard(proto: "normalized_value"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularDoubleField(value: &self.value) }() + case 2: try { try decoder.decodeSingularDoubleField(value: &self.normalizedValue) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.value != 0 { + try visitor.visitSingularDoubleField(value: self.value, fieldNumber: 1) + } + if self.normalizedValue != 0 { + try visitor.visitSingularDoubleField(value: self.normalizedValue, fieldNumber: 2) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_FloatMetric, rhs: Lnrpc_FloatMetric) -> Bool { + if lhs.value != rhs.value {return false} + if lhs.normalizedValue != rhs.normalizedValue {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ChanInfoRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ChanInfoRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "chan_id"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularUInt64Field(value: &self.chanID) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.chanID != 0 { + try visitor.visitSingularUInt64Field(value: self.chanID, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ChanInfoRequest, rhs: Lnrpc_ChanInfoRequest) -> Bool { + if lhs.chanID != rhs.chanID {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_NetworkInfoRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".NetworkInfoRequest" + static let _protobuf_nameMap = SwiftProtobuf._NameMap() + + mutating func decodeMessage(decoder: inout D) throws { + while let _ = try decoder.nextFieldNumber() { + } + } + + func traverse(visitor: inout V) throws { + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_NetworkInfoRequest, rhs: Lnrpc_NetworkInfoRequest) -> Bool { + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_NetworkInfo: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".NetworkInfo" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "graph_diameter"), + 2: .standard(proto: "avg_out_degree"), + 3: .standard(proto: "max_out_degree"), + 4: .standard(proto: "num_nodes"), + 5: .standard(proto: "num_channels"), + 6: .standard(proto: "total_network_capacity"), + 7: .standard(proto: "avg_channel_size"), + 8: .standard(proto: "min_channel_size"), + 9: .standard(proto: "max_channel_size"), + 10: .standard(proto: "median_channel_size_sat"), + 11: .standard(proto: "num_zombie_chans"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularUInt32Field(value: &self.graphDiameter) }() + case 2: try { try decoder.decodeSingularDoubleField(value: &self.avgOutDegree) }() + case 3: try { try decoder.decodeSingularUInt32Field(value: &self.maxOutDegree) }() + case 4: try { try decoder.decodeSingularUInt32Field(value: &self.numNodes) }() + case 5: try { try decoder.decodeSingularUInt32Field(value: &self.numChannels) }() + case 6: try { try decoder.decodeSingularInt64Field(value: &self.totalNetworkCapacity) }() + case 7: try { try decoder.decodeSingularDoubleField(value: &self.avgChannelSize) }() + case 8: try { try decoder.decodeSingularInt64Field(value: &self.minChannelSize) }() + case 9: try { try decoder.decodeSingularInt64Field(value: &self.maxChannelSize) }() + case 10: try { try decoder.decodeSingularInt64Field(value: &self.medianChannelSizeSat) }() + case 11: try { try decoder.decodeSingularUInt64Field(value: &self.numZombieChans) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.graphDiameter != 0 { + try visitor.visitSingularUInt32Field(value: self.graphDiameter, fieldNumber: 1) + } + if self.avgOutDegree != 0 { + try visitor.visitSingularDoubleField(value: self.avgOutDegree, fieldNumber: 2) + } + if self.maxOutDegree != 0 { + try visitor.visitSingularUInt32Field(value: self.maxOutDegree, fieldNumber: 3) + } + if self.numNodes != 0 { + try visitor.visitSingularUInt32Field(value: self.numNodes, fieldNumber: 4) + } + if self.numChannels != 0 { + try visitor.visitSingularUInt32Field(value: self.numChannels, fieldNumber: 5) + } + if self.totalNetworkCapacity != 0 { + try visitor.visitSingularInt64Field(value: self.totalNetworkCapacity, fieldNumber: 6) + } + if self.avgChannelSize != 0 { + try visitor.visitSingularDoubleField(value: self.avgChannelSize, fieldNumber: 7) + } + if self.minChannelSize != 0 { + try visitor.visitSingularInt64Field(value: self.minChannelSize, fieldNumber: 8) + } + if self.maxChannelSize != 0 { + try visitor.visitSingularInt64Field(value: self.maxChannelSize, fieldNumber: 9) + } + if self.medianChannelSizeSat != 0 { + try visitor.visitSingularInt64Field(value: self.medianChannelSizeSat, fieldNumber: 10) + } + if self.numZombieChans != 0 { + try visitor.visitSingularUInt64Field(value: self.numZombieChans, fieldNumber: 11) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_NetworkInfo, rhs: Lnrpc_NetworkInfo) -> Bool { + if lhs.graphDiameter != rhs.graphDiameter {return false} + if lhs.avgOutDegree != rhs.avgOutDegree {return false} + if lhs.maxOutDegree != rhs.maxOutDegree {return false} + if lhs.numNodes != rhs.numNodes {return false} + if lhs.numChannels != rhs.numChannels {return false} + if lhs.totalNetworkCapacity != rhs.totalNetworkCapacity {return false} + if lhs.avgChannelSize != rhs.avgChannelSize {return false} + if lhs.minChannelSize != rhs.minChannelSize {return false} + if lhs.maxChannelSize != rhs.maxChannelSize {return false} + if lhs.medianChannelSizeSat != rhs.medianChannelSizeSat {return false} + if lhs.numZombieChans != rhs.numZombieChans {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_StopRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".StopRequest" + static let _protobuf_nameMap = SwiftProtobuf._NameMap() + + mutating func decodeMessage(decoder: inout D) throws { + while let _ = try decoder.nextFieldNumber() { + } + } + + func traverse(visitor: inout V) throws { + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_StopRequest, rhs: Lnrpc_StopRequest) -> Bool { + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_StopResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".StopResponse" + static let _protobuf_nameMap = SwiftProtobuf._NameMap() + + mutating func decodeMessage(decoder: inout D) throws { + while let _ = try decoder.nextFieldNumber() { + } + } + + func traverse(visitor: inout V) throws { + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_StopResponse, rhs: Lnrpc_StopResponse) -> Bool { + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_GraphTopologySubscription: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".GraphTopologySubscription" + static let _protobuf_nameMap = SwiftProtobuf._NameMap() + + mutating func decodeMessage(decoder: inout D) throws { + while let _ = try decoder.nextFieldNumber() { + } + } + + func traverse(visitor: inout V) throws { + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_GraphTopologySubscription, rhs: Lnrpc_GraphTopologySubscription) -> Bool { + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_GraphTopologyUpdate: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".GraphTopologyUpdate" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "node_updates"), + 2: .standard(proto: "channel_updates"), + 3: .standard(proto: "closed_chans"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeRepeatedMessageField(value: &self.nodeUpdates) }() + case 2: try { try decoder.decodeRepeatedMessageField(value: &self.channelUpdates) }() + case 3: try { try decoder.decodeRepeatedMessageField(value: &self.closedChans) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.nodeUpdates.isEmpty { + try visitor.visitRepeatedMessageField(value: self.nodeUpdates, fieldNumber: 1) + } + if !self.channelUpdates.isEmpty { + try visitor.visitRepeatedMessageField(value: self.channelUpdates, fieldNumber: 2) + } + if !self.closedChans.isEmpty { + try visitor.visitRepeatedMessageField(value: self.closedChans, fieldNumber: 3) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_GraphTopologyUpdate, rhs: Lnrpc_GraphTopologyUpdate) -> Bool { + if lhs.nodeUpdates != rhs.nodeUpdates {return false} + if lhs.channelUpdates != rhs.channelUpdates {return false} + if lhs.closedChans != rhs.closedChans {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_NodeUpdate: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".NodeUpdate" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "addresses"), + 2: .standard(proto: "identity_key"), + 3: .standard(proto: "global_features"), + 4: .same(proto: "alias"), + 5: .same(proto: "color"), + 6: .same(proto: "features"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeRepeatedStringField(value: &self.addresses) }() + case 2: try { try decoder.decodeSingularStringField(value: &self.identityKey) }() + case 3: try { try decoder.decodeSingularBytesField(value: &self.globalFeatures) }() + case 4: try { try decoder.decodeSingularStringField(value: &self.alias) }() + case 5: try { try decoder.decodeSingularStringField(value: &self.color) }() + case 6: try { try decoder.decodeMapField(fieldType: SwiftProtobuf._ProtobufMessageMap.self, value: &self.features) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.addresses.isEmpty { + try visitor.visitRepeatedStringField(value: self.addresses, fieldNumber: 1) + } + if !self.identityKey.isEmpty { + try visitor.visitSingularStringField(value: self.identityKey, fieldNumber: 2) + } + if !self.globalFeatures.isEmpty { + try visitor.visitSingularBytesField(value: self.globalFeatures, fieldNumber: 3) + } + if !self.alias.isEmpty { + try visitor.visitSingularStringField(value: self.alias, fieldNumber: 4) + } + if !self.color.isEmpty { + try visitor.visitSingularStringField(value: self.color, fieldNumber: 5) + } + if !self.features.isEmpty { + try visitor.visitMapField(fieldType: SwiftProtobuf._ProtobufMessageMap.self, value: self.features, fieldNumber: 6) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_NodeUpdate, rhs: Lnrpc_NodeUpdate) -> Bool { + if lhs.addresses != rhs.addresses {return false} + if lhs.identityKey != rhs.identityKey {return false} + if lhs.globalFeatures != rhs.globalFeatures {return false} + if lhs.alias != rhs.alias {return false} + if lhs.color != rhs.color {return false} + if lhs.features != rhs.features {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ChannelEdgeUpdate: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ChannelEdgeUpdate" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "chan_id"), + 2: .standard(proto: "chan_point"), + 3: .same(proto: "capacity"), + 4: .standard(proto: "routing_policy"), + 5: .standard(proto: "advertising_node"), + 6: .standard(proto: "connecting_node"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularUInt64Field(value: &self.chanID) }() + case 2: try { try decoder.decodeSingularMessageField(value: &self._chanPoint) }() + case 3: try { try decoder.decodeSingularInt64Field(value: &self.capacity) }() + case 4: try { try decoder.decodeSingularMessageField(value: &self._routingPolicy) }() + case 5: try { try decoder.decodeSingularStringField(value: &self.advertisingNode) }() + case 6: try { try decoder.decodeSingularStringField(value: &self.connectingNode) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.chanID != 0 { + try visitor.visitSingularUInt64Field(value: self.chanID, fieldNumber: 1) + } + if let v = self._chanPoint { + try visitor.visitSingularMessageField(value: v, fieldNumber: 2) + } + if self.capacity != 0 { + try visitor.visitSingularInt64Field(value: self.capacity, fieldNumber: 3) + } + if let v = self._routingPolicy { + try visitor.visitSingularMessageField(value: v, fieldNumber: 4) + } + if !self.advertisingNode.isEmpty { + try visitor.visitSingularStringField(value: self.advertisingNode, fieldNumber: 5) + } + if !self.connectingNode.isEmpty { + try visitor.visitSingularStringField(value: self.connectingNode, fieldNumber: 6) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ChannelEdgeUpdate, rhs: Lnrpc_ChannelEdgeUpdate) -> Bool { + if lhs.chanID != rhs.chanID {return false} + if lhs._chanPoint != rhs._chanPoint {return false} + if lhs.capacity != rhs.capacity {return false} + if lhs._routingPolicy != rhs._routingPolicy {return false} + if lhs.advertisingNode != rhs.advertisingNode {return false} + if lhs.connectingNode != rhs.connectingNode {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ClosedChannelUpdate: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ClosedChannelUpdate" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "chan_id"), + 2: .same(proto: "capacity"), + 3: .standard(proto: "closed_height"), + 4: .standard(proto: "chan_point"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularUInt64Field(value: &self.chanID) }() + case 2: try { try decoder.decodeSingularInt64Field(value: &self.capacity) }() + case 3: try { try decoder.decodeSingularUInt32Field(value: &self.closedHeight) }() + case 4: try { try decoder.decodeSingularMessageField(value: &self._chanPoint) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.chanID != 0 { + try visitor.visitSingularUInt64Field(value: self.chanID, fieldNumber: 1) + } + if self.capacity != 0 { + try visitor.visitSingularInt64Field(value: self.capacity, fieldNumber: 2) + } + if self.closedHeight != 0 { + try visitor.visitSingularUInt32Field(value: self.closedHeight, fieldNumber: 3) + } + if let v = self._chanPoint { + try visitor.visitSingularMessageField(value: v, fieldNumber: 4) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ClosedChannelUpdate, rhs: Lnrpc_ClosedChannelUpdate) -> Bool { + if lhs.chanID != rhs.chanID {return false} + if lhs.capacity != rhs.capacity {return false} + if lhs.closedHeight != rhs.closedHeight {return false} + if lhs._chanPoint != rhs._chanPoint {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_HopHint: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".HopHint" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "node_id"), + 2: .standard(proto: "chan_id"), + 3: .standard(proto: "fee_base_msat"), + 4: .standard(proto: "fee_proportional_millionths"), + 5: .standard(proto: "cltv_expiry_delta"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.nodeID) }() + case 2: try { try decoder.decodeSingularUInt64Field(value: &self.chanID) }() + case 3: try { try decoder.decodeSingularUInt32Field(value: &self.feeBaseMsat) }() + case 4: try { try decoder.decodeSingularUInt32Field(value: &self.feeProportionalMillionths) }() + case 5: try { try decoder.decodeSingularUInt32Field(value: &self.cltvExpiryDelta) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.nodeID.isEmpty { + try visitor.visitSingularStringField(value: self.nodeID, fieldNumber: 1) + } + if self.chanID != 0 { + try visitor.visitSingularUInt64Field(value: self.chanID, fieldNumber: 2) + } + if self.feeBaseMsat != 0 { + try visitor.visitSingularUInt32Field(value: self.feeBaseMsat, fieldNumber: 3) + } + if self.feeProportionalMillionths != 0 { + try visitor.visitSingularUInt32Field(value: self.feeProportionalMillionths, fieldNumber: 4) + } + if self.cltvExpiryDelta != 0 { + try visitor.visitSingularUInt32Field(value: self.cltvExpiryDelta, fieldNumber: 5) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_HopHint, rhs: Lnrpc_HopHint) -> Bool { + if lhs.nodeID != rhs.nodeID {return false} + if lhs.chanID != rhs.chanID {return false} + if lhs.feeBaseMsat != rhs.feeBaseMsat {return false} + if lhs.feeProportionalMillionths != rhs.feeProportionalMillionths {return false} + if lhs.cltvExpiryDelta != rhs.cltvExpiryDelta {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_RouteHint: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".RouteHint" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "hop_hints"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeRepeatedMessageField(value: &self.hopHints) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.hopHints.isEmpty { + try visitor.visitRepeatedMessageField(value: self.hopHints, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_RouteHint, rhs: Lnrpc_RouteHint) -> Bool { + if lhs.hopHints != rhs.hopHints {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_Invoice: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".Invoice" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "memo"), + 3: .standard(proto: "r_preimage"), + 4: .standard(proto: "r_hash"), + 5: .same(proto: "value"), + 23: .standard(proto: "value_msat"), + 6: .same(proto: "settled"), + 7: .standard(proto: "creation_date"), + 8: .standard(proto: "settle_date"), + 9: .standard(proto: "payment_request"), + 10: .standard(proto: "description_hash"), + 11: .same(proto: "expiry"), + 12: .standard(proto: "fallback_addr"), + 13: .standard(proto: "cltv_expiry"), + 14: .standard(proto: "route_hints"), + 15: .same(proto: "private"), + 16: .standard(proto: "add_index"), + 17: .standard(proto: "settle_index"), + 18: .standard(proto: "amt_paid"), + 19: .standard(proto: "amt_paid_sat"), + 20: .standard(proto: "amt_paid_msat"), + 21: .same(proto: "state"), + 22: .same(proto: "htlcs"), + 24: .same(proto: "features"), + 25: .standard(proto: "is_keysend"), + 26: .standard(proto: "payment_addr"), + ] + + fileprivate class _StorageClass { + var _memo: String = String() + var _rPreimage: Data = Data() + var _rHash: Data = Data() + var _value: Int64 = 0 + var _valueMsat: Int64 = 0 + var _settled: Bool = false + var _creationDate: Int64 = 0 + var _settleDate: Int64 = 0 + var _paymentRequest: String = String() + var _descriptionHash: Data = Data() + var _expiry: Int64 = 0 + var _fallbackAddr: String = String() + var _cltvExpiry: UInt64 = 0 + var _routeHints: [Lnrpc_RouteHint] = [] + var _private: Bool = false + var _addIndex: UInt64 = 0 + var _settleIndex: UInt64 = 0 + var _amtPaid: Int64 = 0 + var _amtPaidSat: Int64 = 0 + var _amtPaidMsat: Int64 = 0 + var _state: Lnrpc_Invoice.InvoiceState = .open + var _htlcs: [Lnrpc_InvoiceHTLC] = [] + var _features: Dictionary = [:] + var _isKeysend: Bool = false + var _paymentAddr: Data = Data() + + static let defaultInstance = _StorageClass() + + private init() {} + + init(copying source: _StorageClass) { + _memo = source._memo + _rPreimage = source._rPreimage + _rHash = source._rHash + _value = source._value + _valueMsat = source._valueMsat + _settled = source._settled + _creationDate = source._creationDate + _settleDate = source._settleDate + _paymentRequest = source._paymentRequest + _descriptionHash = source._descriptionHash + _expiry = source._expiry + _fallbackAddr = source._fallbackAddr + _cltvExpiry = source._cltvExpiry + _routeHints = source._routeHints + _private = source._private + _addIndex = source._addIndex + _settleIndex = source._settleIndex + _amtPaid = source._amtPaid + _amtPaidSat = source._amtPaidSat + _amtPaidMsat = source._amtPaidMsat + _state = source._state + _htlcs = source._htlcs + _features = source._features + _isKeysend = source._isKeysend + _paymentAddr = source._paymentAddr + } + } + + fileprivate mutating func _uniqueStorage() -> _StorageClass { + if !isKnownUniquelyReferenced(&_storage) { + _storage = _StorageClass(copying: _storage) + } + return _storage + } + + mutating func decodeMessage(decoder: inout D) throws { + _ = _uniqueStorage() + try withExtendedLifetime(_storage) { (_storage: _StorageClass) in + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &_storage._memo) }() + case 3: try { try decoder.decodeSingularBytesField(value: &_storage._rPreimage) }() + case 4: try { try decoder.decodeSingularBytesField(value: &_storage._rHash) }() + case 5: try { try decoder.decodeSingularInt64Field(value: &_storage._value) }() + case 6: try { try decoder.decodeSingularBoolField(value: &_storage._settled) }() + case 7: try { try decoder.decodeSingularInt64Field(value: &_storage._creationDate) }() + case 8: try { try decoder.decodeSingularInt64Field(value: &_storage._settleDate) }() + case 9: try { try decoder.decodeSingularStringField(value: &_storage._paymentRequest) }() + case 10: try { try decoder.decodeSingularBytesField(value: &_storage._descriptionHash) }() + case 11: try { try decoder.decodeSingularInt64Field(value: &_storage._expiry) }() + case 12: try { try decoder.decodeSingularStringField(value: &_storage._fallbackAddr) }() + case 13: try { try decoder.decodeSingularUInt64Field(value: &_storage._cltvExpiry) }() + case 14: try { try decoder.decodeRepeatedMessageField(value: &_storage._routeHints) }() + case 15: try { try decoder.decodeSingularBoolField(value: &_storage._private) }() + case 16: try { try decoder.decodeSingularUInt64Field(value: &_storage._addIndex) }() + case 17: try { try decoder.decodeSingularUInt64Field(value: &_storage._settleIndex) }() + case 18: try { try decoder.decodeSingularInt64Field(value: &_storage._amtPaid) }() + case 19: try { try decoder.decodeSingularInt64Field(value: &_storage._amtPaidSat) }() + case 20: try { try decoder.decodeSingularInt64Field(value: &_storage._amtPaidMsat) }() + case 21: try { try decoder.decodeSingularEnumField(value: &_storage._state) }() + case 22: try { try decoder.decodeRepeatedMessageField(value: &_storage._htlcs) }() + case 23: try { try decoder.decodeSingularInt64Field(value: &_storage._valueMsat) }() + case 24: try { try decoder.decodeMapField(fieldType: SwiftProtobuf._ProtobufMessageMap.self, value: &_storage._features) }() + case 25: try { try decoder.decodeSingularBoolField(value: &_storage._isKeysend) }() + case 26: try { try decoder.decodeSingularBytesField(value: &_storage._paymentAddr) }() + default: break + } + } + } + } + + func traverse(visitor: inout V) throws { + try withExtendedLifetime(_storage) { (_storage: _StorageClass) in + if !_storage._memo.isEmpty { + try visitor.visitSingularStringField(value: _storage._memo, fieldNumber: 1) + } + if !_storage._rPreimage.isEmpty { + try visitor.visitSingularBytesField(value: _storage._rPreimage, fieldNumber: 3) + } + if !_storage._rHash.isEmpty { + try visitor.visitSingularBytesField(value: _storage._rHash, fieldNumber: 4) + } + if _storage._value != 0 { + try visitor.visitSingularInt64Field(value: _storage._value, fieldNumber: 5) + } + if _storage._settled != false { + try visitor.visitSingularBoolField(value: _storage._settled, fieldNumber: 6) + } + if _storage._creationDate != 0 { + try visitor.visitSingularInt64Field(value: _storage._creationDate, fieldNumber: 7) + } + if _storage._settleDate != 0 { + try visitor.visitSingularInt64Field(value: _storage._settleDate, fieldNumber: 8) + } + if !_storage._paymentRequest.isEmpty { + try visitor.visitSingularStringField(value: _storage._paymentRequest, fieldNumber: 9) + } + if !_storage._descriptionHash.isEmpty { + try visitor.visitSingularBytesField(value: _storage._descriptionHash, fieldNumber: 10) + } + if _storage._expiry != 0 { + try visitor.visitSingularInt64Field(value: _storage._expiry, fieldNumber: 11) + } + if !_storage._fallbackAddr.isEmpty { + try visitor.visitSingularStringField(value: _storage._fallbackAddr, fieldNumber: 12) + } + if _storage._cltvExpiry != 0 { + try visitor.visitSingularUInt64Field(value: _storage._cltvExpiry, fieldNumber: 13) + } + if !_storage._routeHints.isEmpty { + try visitor.visitRepeatedMessageField(value: _storage._routeHints, fieldNumber: 14) + } + if _storage._private != false { + try visitor.visitSingularBoolField(value: _storage._private, fieldNumber: 15) + } + if _storage._addIndex != 0 { + try visitor.visitSingularUInt64Field(value: _storage._addIndex, fieldNumber: 16) + } + if _storage._settleIndex != 0 { + try visitor.visitSingularUInt64Field(value: _storage._settleIndex, fieldNumber: 17) + } + if _storage._amtPaid != 0 { + try visitor.visitSingularInt64Field(value: _storage._amtPaid, fieldNumber: 18) + } + if _storage._amtPaidSat != 0 { + try visitor.visitSingularInt64Field(value: _storage._amtPaidSat, fieldNumber: 19) + } + if _storage._amtPaidMsat != 0 { + try visitor.visitSingularInt64Field(value: _storage._amtPaidMsat, fieldNumber: 20) + } + if _storage._state != .open { + try visitor.visitSingularEnumField(value: _storage._state, fieldNumber: 21) + } + if !_storage._htlcs.isEmpty { + try visitor.visitRepeatedMessageField(value: _storage._htlcs, fieldNumber: 22) + } + if _storage._valueMsat != 0 { + try visitor.visitSingularInt64Field(value: _storage._valueMsat, fieldNumber: 23) + } + if !_storage._features.isEmpty { + try visitor.visitMapField(fieldType: SwiftProtobuf._ProtobufMessageMap.self, value: _storage._features, fieldNumber: 24) + } + if _storage._isKeysend != false { + try visitor.visitSingularBoolField(value: _storage._isKeysend, fieldNumber: 25) + } + if !_storage._paymentAddr.isEmpty { + try visitor.visitSingularBytesField(value: _storage._paymentAddr, fieldNumber: 26) + } + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_Invoice, rhs: Lnrpc_Invoice) -> Bool { + if lhs._storage !== rhs._storage { + let storagesAreEqual: Bool = withExtendedLifetime((lhs._storage, rhs._storage)) { (_args: (_StorageClass, _StorageClass)) in + let _storage = _args.0 + let rhs_storage = _args.1 + if _storage._memo != rhs_storage._memo {return false} + if _storage._rPreimage != rhs_storage._rPreimage {return false} + if _storage._rHash != rhs_storage._rHash {return false} + if _storage._value != rhs_storage._value {return false} + if _storage._valueMsat != rhs_storage._valueMsat {return false} + if _storage._settled != rhs_storage._settled {return false} + if _storage._creationDate != rhs_storage._creationDate {return false} + if _storage._settleDate != rhs_storage._settleDate {return false} + if _storage._paymentRequest != rhs_storage._paymentRequest {return false} + if _storage._descriptionHash != rhs_storage._descriptionHash {return false} + if _storage._expiry != rhs_storage._expiry {return false} + if _storage._fallbackAddr != rhs_storage._fallbackAddr {return false} + if _storage._cltvExpiry != rhs_storage._cltvExpiry {return false} + if _storage._routeHints != rhs_storage._routeHints {return false} + if _storage._private != rhs_storage._private {return false} + if _storage._addIndex != rhs_storage._addIndex {return false} + if _storage._settleIndex != rhs_storage._settleIndex {return false} + if _storage._amtPaid != rhs_storage._amtPaid {return false} + if _storage._amtPaidSat != rhs_storage._amtPaidSat {return false} + if _storage._amtPaidMsat != rhs_storage._amtPaidMsat {return false} + if _storage._state != rhs_storage._state {return false} + if _storage._htlcs != rhs_storage._htlcs {return false} + if _storage._features != rhs_storage._features {return false} + if _storage._isKeysend != rhs_storage._isKeysend {return false} + if _storage._paymentAddr != rhs_storage._paymentAddr {return false} + return true + } + if !storagesAreEqual {return false} + } + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_Invoice.InvoiceState: SwiftProtobuf._ProtoNameProviding { + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 0: .same(proto: "OPEN"), + 1: .same(proto: "SETTLED"), + 2: .same(proto: "CANCELED"), + 3: .same(proto: "ACCEPTED"), + ] +} + +extension Lnrpc_InvoiceHTLC: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".InvoiceHTLC" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "chan_id"), + 2: .standard(proto: "htlc_index"), + 3: .standard(proto: "amt_msat"), + 4: .standard(proto: "accept_height"), + 5: .standard(proto: "accept_time"), + 6: .standard(proto: "resolve_time"), + 7: .standard(proto: "expiry_height"), + 8: .same(proto: "state"), + 9: .standard(proto: "custom_records"), + 10: .standard(proto: "mpp_total_amt_msat"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularUInt64Field(value: &self.chanID) }() + case 2: try { try decoder.decodeSingularUInt64Field(value: &self.htlcIndex) }() + case 3: try { try decoder.decodeSingularUInt64Field(value: &self.amtMsat) }() + case 4: try { try decoder.decodeSingularInt32Field(value: &self.acceptHeight) }() + case 5: try { try decoder.decodeSingularInt64Field(value: &self.acceptTime) }() + case 6: try { try decoder.decodeSingularInt64Field(value: &self.resolveTime) }() + case 7: try { try decoder.decodeSingularInt32Field(value: &self.expiryHeight) }() + case 8: try { try decoder.decodeSingularEnumField(value: &self.state) }() + case 9: try { try decoder.decodeMapField(fieldType: SwiftProtobuf._ProtobufMap.self, value: &self.customRecords) }() + case 10: try { try decoder.decodeSingularUInt64Field(value: &self.mppTotalAmtMsat) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.chanID != 0 { + try visitor.visitSingularUInt64Field(value: self.chanID, fieldNumber: 1) + } + if self.htlcIndex != 0 { + try visitor.visitSingularUInt64Field(value: self.htlcIndex, fieldNumber: 2) + } + if self.amtMsat != 0 { + try visitor.visitSingularUInt64Field(value: self.amtMsat, fieldNumber: 3) + } + if self.acceptHeight != 0 { + try visitor.visitSingularInt32Field(value: self.acceptHeight, fieldNumber: 4) + } + if self.acceptTime != 0 { + try visitor.visitSingularInt64Field(value: self.acceptTime, fieldNumber: 5) + } + if self.resolveTime != 0 { + try visitor.visitSingularInt64Field(value: self.resolveTime, fieldNumber: 6) + } + if self.expiryHeight != 0 { + try visitor.visitSingularInt32Field(value: self.expiryHeight, fieldNumber: 7) + } + if self.state != .accepted { + try visitor.visitSingularEnumField(value: self.state, fieldNumber: 8) + } + if !self.customRecords.isEmpty { + try visitor.visitMapField(fieldType: SwiftProtobuf._ProtobufMap.self, value: self.customRecords, fieldNumber: 9) + } + if self.mppTotalAmtMsat != 0 { + try visitor.visitSingularUInt64Field(value: self.mppTotalAmtMsat, fieldNumber: 10) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_InvoiceHTLC, rhs: Lnrpc_InvoiceHTLC) -> Bool { + if lhs.chanID != rhs.chanID {return false} + if lhs.htlcIndex != rhs.htlcIndex {return false} + if lhs.amtMsat != rhs.amtMsat {return false} + if lhs.acceptHeight != rhs.acceptHeight {return false} + if lhs.acceptTime != rhs.acceptTime {return false} + if lhs.resolveTime != rhs.resolveTime {return false} + if lhs.expiryHeight != rhs.expiryHeight {return false} + if lhs.state != rhs.state {return false} + if lhs.customRecords != rhs.customRecords {return false} + if lhs.mppTotalAmtMsat != rhs.mppTotalAmtMsat {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_AddInvoiceResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".AddInvoiceResponse" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "r_hash"), + 2: .standard(proto: "payment_request"), + 16: .standard(proto: "add_index"), + 17: .standard(proto: "payment_addr"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularBytesField(value: &self.rHash) }() + case 2: try { try decoder.decodeSingularStringField(value: &self.paymentRequest) }() + case 16: try { try decoder.decodeSingularUInt64Field(value: &self.addIndex) }() + case 17: try { try decoder.decodeSingularBytesField(value: &self.paymentAddr) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.rHash.isEmpty { + try visitor.visitSingularBytesField(value: self.rHash, fieldNumber: 1) + } + if !self.paymentRequest.isEmpty { + try visitor.visitSingularStringField(value: self.paymentRequest, fieldNumber: 2) + } + if self.addIndex != 0 { + try visitor.visitSingularUInt64Field(value: self.addIndex, fieldNumber: 16) + } + if !self.paymentAddr.isEmpty { + try visitor.visitSingularBytesField(value: self.paymentAddr, fieldNumber: 17) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_AddInvoiceResponse, rhs: Lnrpc_AddInvoiceResponse) -> Bool { + if lhs.rHash != rhs.rHash {return false} + if lhs.paymentRequest != rhs.paymentRequest {return false} + if lhs.addIndex != rhs.addIndex {return false} + if lhs.paymentAddr != rhs.paymentAddr {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_PaymentHash: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".PaymentHash" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "r_hash_str"), + 2: .standard(proto: "r_hash"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.rHashStr) }() + case 2: try { try decoder.decodeSingularBytesField(value: &self.rHash) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.rHashStr.isEmpty { + try visitor.visitSingularStringField(value: self.rHashStr, fieldNumber: 1) + } + if !self.rHash.isEmpty { + try visitor.visitSingularBytesField(value: self.rHash, fieldNumber: 2) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_PaymentHash, rhs: Lnrpc_PaymentHash) -> Bool { + if lhs.rHashStr != rhs.rHashStr {return false} + if lhs.rHash != rhs.rHash {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ListInvoiceRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ListInvoiceRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "pending_only"), + 4: .standard(proto: "index_offset"), + 5: .standard(proto: "num_max_invoices"), + 6: .same(proto: "reversed"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularBoolField(value: &self.pendingOnly) }() + case 4: try { try decoder.decodeSingularUInt64Field(value: &self.indexOffset) }() + case 5: try { try decoder.decodeSingularUInt64Field(value: &self.numMaxInvoices) }() + case 6: try { try decoder.decodeSingularBoolField(value: &self.reversed) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.pendingOnly != false { + try visitor.visitSingularBoolField(value: self.pendingOnly, fieldNumber: 1) + } + if self.indexOffset != 0 { + try visitor.visitSingularUInt64Field(value: self.indexOffset, fieldNumber: 4) + } + if self.numMaxInvoices != 0 { + try visitor.visitSingularUInt64Field(value: self.numMaxInvoices, fieldNumber: 5) + } + if self.reversed != false { + try visitor.visitSingularBoolField(value: self.reversed, fieldNumber: 6) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ListInvoiceRequest, rhs: Lnrpc_ListInvoiceRequest) -> Bool { + if lhs.pendingOnly != rhs.pendingOnly {return false} + if lhs.indexOffset != rhs.indexOffset {return false} + if lhs.numMaxInvoices != rhs.numMaxInvoices {return false} + if lhs.reversed != rhs.reversed {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ListInvoiceResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ListInvoiceResponse" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "invoices"), + 2: .standard(proto: "last_index_offset"), + 3: .standard(proto: "first_index_offset"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeRepeatedMessageField(value: &self.invoices) }() + case 2: try { try decoder.decodeSingularUInt64Field(value: &self.lastIndexOffset) }() + case 3: try { try decoder.decodeSingularUInt64Field(value: &self.firstIndexOffset) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.invoices.isEmpty { + try visitor.visitRepeatedMessageField(value: self.invoices, fieldNumber: 1) + } + if self.lastIndexOffset != 0 { + try visitor.visitSingularUInt64Field(value: self.lastIndexOffset, fieldNumber: 2) + } + if self.firstIndexOffset != 0 { + try visitor.visitSingularUInt64Field(value: self.firstIndexOffset, fieldNumber: 3) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ListInvoiceResponse, rhs: Lnrpc_ListInvoiceResponse) -> Bool { + if lhs.invoices != rhs.invoices {return false} + if lhs.lastIndexOffset != rhs.lastIndexOffset {return false} + if lhs.firstIndexOffset != rhs.firstIndexOffset {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_InvoiceSubscription: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".InvoiceSubscription" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "add_index"), + 2: .standard(proto: "settle_index"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularUInt64Field(value: &self.addIndex) }() + case 2: try { try decoder.decodeSingularUInt64Field(value: &self.settleIndex) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.addIndex != 0 { + try visitor.visitSingularUInt64Field(value: self.addIndex, fieldNumber: 1) + } + if self.settleIndex != 0 { + try visitor.visitSingularUInt64Field(value: self.settleIndex, fieldNumber: 2) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_InvoiceSubscription, rhs: Lnrpc_InvoiceSubscription) -> Bool { + if lhs.addIndex != rhs.addIndex {return false} + if lhs.settleIndex != rhs.settleIndex {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_Payment: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".Payment" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "payment_hash"), + 2: .same(proto: "value"), + 3: .standard(proto: "creation_date"), + 5: .same(proto: "fee"), + 6: .standard(proto: "payment_preimage"), + 7: .standard(proto: "value_sat"), + 8: .standard(proto: "value_msat"), + 9: .standard(proto: "payment_request"), + 10: .same(proto: "status"), + 11: .standard(proto: "fee_sat"), + 12: .standard(proto: "fee_msat"), + 13: .standard(proto: "creation_time_ns"), + 14: .same(proto: "htlcs"), + 15: .standard(proto: "payment_index"), + 16: .standard(proto: "failure_reason"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.paymentHash) }() + case 2: try { try decoder.decodeSingularInt64Field(value: &self.value) }() + case 3: try { try decoder.decodeSingularInt64Field(value: &self.creationDate) }() + case 5: try { try decoder.decodeSingularInt64Field(value: &self.fee) }() + case 6: try { try decoder.decodeSingularStringField(value: &self.paymentPreimage) }() + case 7: try { try decoder.decodeSingularInt64Field(value: &self.valueSat) }() + case 8: try { try decoder.decodeSingularInt64Field(value: &self.valueMsat) }() + case 9: try { try decoder.decodeSingularStringField(value: &self.paymentRequest) }() + case 10: try { try decoder.decodeSingularEnumField(value: &self.status) }() + case 11: try { try decoder.decodeSingularInt64Field(value: &self.feeSat) }() + case 12: try { try decoder.decodeSingularInt64Field(value: &self.feeMsat) }() + case 13: try { try decoder.decodeSingularInt64Field(value: &self.creationTimeNs) }() + case 14: try { try decoder.decodeRepeatedMessageField(value: &self.htlcs) }() + case 15: try { try decoder.decodeSingularUInt64Field(value: &self.paymentIndex) }() + case 16: try { try decoder.decodeSingularEnumField(value: &self.failureReason) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.paymentHash.isEmpty { + try visitor.visitSingularStringField(value: self.paymentHash, fieldNumber: 1) + } + if self.value != 0 { + try visitor.visitSingularInt64Field(value: self.value, fieldNumber: 2) + } + if self.creationDate != 0 { + try visitor.visitSingularInt64Field(value: self.creationDate, fieldNumber: 3) + } + if self.fee != 0 { + try visitor.visitSingularInt64Field(value: self.fee, fieldNumber: 5) + } + if !self.paymentPreimage.isEmpty { + try visitor.visitSingularStringField(value: self.paymentPreimage, fieldNumber: 6) + } + if self.valueSat != 0 { + try visitor.visitSingularInt64Field(value: self.valueSat, fieldNumber: 7) + } + if self.valueMsat != 0 { + try visitor.visitSingularInt64Field(value: self.valueMsat, fieldNumber: 8) + } + if !self.paymentRequest.isEmpty { + try visitor.visitSingularStringField(value: self.paymentRequest, fieldNumber: 9) + } + if self.status != .unknown { + try visitor.visitSingularEnumField(value: self.status, fieldNumber: 10) + } + if self.feeSat != 0 { + try visitor.visitSingularInt64Field(value: self.feeSat, fieldNumber: 11) + } + if self.feeMsat != 0 { + try visitor.visitSingularInt64Field(value: self.feeMsat, fieldNumber: 12) + } + if self.creationTimeNs != 0 { + try visitor.visitSingularInt64Field(value: self.creationTimeNs, fieldNumber: 13) + } + if !self.htlcs.isEmpty { + try visitor.visitRepeatedMessageField(value: self.htlcs, fieldNumber: 14) + } + if self.paymentIndex != 0 { + try visitor.visitSingularUInt64Field(value: self.paymentIndex, fieldNumber: 15) + } + if self.failureReason != .failureReasonNone { + try visitor.visitSingularEnumField(value: self.failureReason, fieldNumber: 16) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_Payment, rhs: Lnrpc_Payment) -> Bool { + if lhs.paymentHash != rhs.paymentHash {return false} + if lhs.value != rhs.value {return false} + if lhs.creationDate != rhs.creationDate {return false} + if lhs.fee != rhs.fee {return false} + if lhs.paymentPreimage != rhs.paymentPreimage {return false} + if lhs.valueSat != rhs.valueSat {return false} + if lhs.valueMsat != rhs.valueMsat {return false} + if lhs.paymentRequest != rhs.paymentRequest {return false} + if lhs.status != rhs.status {return false} + if lhs.feeSat != rhs.feeSat {return false} + if lhs.feeMsat != rhs.feeMsat {return false} + if lhs.creationTimeNs != rhs.creationTimeNs {return false} + if lhs.htlcs != rhs.htlcs {return false} + if lhs.paymentIndex != rhs.paymentIndex {return false} + if lhs.failureReason != rhs.failureReason {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_Payment.PaymentStatus: SwiftProtobuf._ProtoNameProviding { + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 0: .same(proto: "UNKNOWN"), + 1: .same(proto: "IN_FLIGHT"), + 2: .same(proto: "SUCCEEDED"), + 3: .same(proto: "FAILED"), + ] +} + +extension Lnrpc_HTLCAttempt: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".HTLCAttempt" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "status"), + 2: .same(proto: "route"), + 3: .standard(proto: "attempt_time_ns"), + 4: .standard(proto: "resolve_time_ns"), + 5: .same(proto: "failure"), + 6: .same(proto: "preimage"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularEnumField(value: &self.status) }() + case 2: try { try decoder.decodeSingularMessageField(value: &self._route) }() + case 3: try { try decoder.decodeSingularInt64Field(value: &self.attemptTimeNs) }() + case 4: try { try decoder.decodeSingularInt64Field(value: &self.resolveTimeNs) }() + case 5: try { try decoder.decodeSingularMessageField(value: &self._failure) }() + case 6: try { try decoder.decodeSingularBytesField(value: &self.preimage) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.status != .inFlight { + try visitor.visitSingularEnumField(value: self.status, fieldNumber: 1) + } + if let v = self._route { + try visitor.visitSingularMessageField(value: v, fieldNumber: 2) + } + if self.attemptTimeNs != 0 { + try visitor.visitSingularInt64Field(value: self.attemptTimeNs, fieldNumber: 3) + } + if self.resolveTimeNs != 0 { + try visitor.visitSingularInt64Field(value: self.resolveTimeNs, fieldNumber: 4) + } + if let v = self._failure { + try visitor.visitSingularMessageField(value: v, fieldNumber: 5) + } + if !self.preimage.isEmpty { + try visitor.visitSingularBytesField(value: self.preimage, fieldNumber: 6) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_HTLCAttempt, rhs: Lnrpc_HTLCAttempt) -> Bool { + if lhs.status != rhs.status {return false} + if lhs._route != rhs._route {return false} + if lhs.attemptTimeNs != rhs.attemptTimeNs {return false} + if lhs.resolveTimeNs != rhs.resolveTimeNs {return false} + if lhs._failure != rhs._failure {return false} + if lhs.preimage != rhs.preimage {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_HTLCAttempt.HTLCStatus: SwiftProtobuf._ProtoNameProviding { + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 0: .same(proto: "IN_FLIGHT"), + 1: .same(proto: "SUCCEEDED"), + 2: .same(proto: "FAILED"), + ] +} + +extension Lnrpc_ListPaymentsRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ListPaymentsRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "include_incomplete"), + 2: .standard(proto: "index_offset"), + 3: .standard(proto: "max_payments"), + 4: .same(proto: "reversed"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularBoolField(value: &self.includeIncomplete) }() + case 2: try { try decoder.decodeSingularUInt64Field(value: &self.indexOffset) }() + case 3: try { try decoder.decodeSingularUInt64Field(value: &self.maxPayments) }() + case 4: try { try decoder.decodeSingularBoolField(value: &self.reversed) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.includeIncomplete != false { + try visitor.visitSingularBoolField(value: self.includeIncomplete, fieldNumber: 1) + } + if self.indexOffset != 0 { + try visitor.visitSingularUInt64Field(value: self.indexOffset, fieldNumber: 2) + } + if self.maxPayments != 0 { + try visitor.visitSingularUInt64Field(value: self.maxPayments, fieldNumber: 3) + } + if self.reversed != false { + try visitor.visitSingularBoolField(value: self.reversed, fieldNumber: 4) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ListPaymentsRequest, rhs: Lnrpc_ListPaymentsRequest) -> Bool { + if lhs.includeIncomplete != rhs.includeIncomplete {return false} + if lhs.indexOffset != rhs.indexOffset {return false} + if lhs.maxPayments != rhs.maxPayments {return false} + if lhs.reversed != rhs.reversed {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ListPaymentsResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ListPaymentsResponse" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "payments"), + 2: .standard(proto: "first_index_offset"), + 3: .standard(proto: "last_index_offset"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeRepeatedMessageField(value: &self.payments) }() + case 2: try { try decoder.decodeSingularUInt64Field(value: &self.firstIndexOffset) }() + case 3: try { try decoder.decodeSingularUInt64Field(value: &self.lastIndexOffset) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.payments.isEmpty { + try visitor.visitRepeatedMessageField(value: self.payments, fieldNumber: 1) + } + if self.firstIndexOffset != 0 { + try visitor.visitSingularUInt64Field(value: self.firstIndexOffset, fieldNumber: 2) + } + if self.lastIndexOffset != 0 { + try visitor.visitSingularUInt64Field(value: self.lastIndexOffset, fieldNumber: 3) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ListPaymentsResponse, rhs: Lnrpc_ListPaymentsResponse) -> Bool { + if lhs.payments != rhs.payments {return false} + if lhs.firstIndexOffset != rhs.firstIndexOffset {return false} + if lhs.lastIndexOffset != rhs.lastIndexOffset {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_DeleteAllPaymentsRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".DeleteAllPaymentsRequest" + static let _protobuf_nameMap = SwiftProtobuf._NameMap() + + mutating func decodeMessage(decoder: inout D) throws { + while let _ = try decoder.nextFieldNumber() { + } + } + + func traverse(visitor: inout V) throws { + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_DeleteAllPaymentsRequest, rhs: Lnrpc_DeleteAllPaymentsRequest) -> Bool { + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_DeleteAllPaymentsResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".DeleteAllPaymentsResponse" + static let _protobuf_nameMap = SwiftProtobuf._NameMap() + + mutating func decodeMessage(decoder: inout D) throws { + while let _ = try decoder.nextFieldNumber() { + } + } + + func traverse(visitor: inout V) throws { + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_DeleteAllPaymentsResponse, rhs: Lnrpc_DeleteAllPaymentsResponse) -> Bool { + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_AbandonChannelRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".AbandonChannelRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "channel_point"), + 2: .standard(proto: "pending_funding_shim_only"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularMessageField(value: &self._channelPoint) }() + case 2: try { try decoder.decodeSingularBoolField(value: &self.pendingFundingShimOnly) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if let v = self._channelPoint { + try visitor.visitSingularMessageField(value: v, fieldNumber: 1) + } + if self.pendingFundingShimOnly != false { + try visitor.visitSingularBoolField(value: self.pendingFundingShimOnly, fieldNumber: 2) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_AbandonChannelRequest, rhs: Lnrpc_AbandonChannelRequest) -> Bool { + if lhs._channelPoint != rhs._channelPoint {return false} + if lhs.pendingFundingShimOnly != rhs.pendingFundingShimOnly {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_AbandonChannelResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".AbandonChannelResponse" + static let _protobuf_nameMap = SwiftProtobuf._NameMap() + + mutating func decodeMessage(decoder: inout D) throws { + while let _ = try decoder.nextFieldNumber() { + } + } + + func traverse(visitor: inout V) throws { + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_AbandonChannelResponse, rhs: Lnrpc_AbandonChannelResponse) -> Bool { + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_DebugLevelRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".DebugLevelRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "show"), + 2: .standard(proto: "level_spec"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularBoolField(value: &self.show) }() + case 2: try { try decoder.decodeSingularStringField(value: &self.levelSpec) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.show != false { + try visitor.visitSingularBoolField(value: self.show, fieldNumber: 1) + } + if !self.levelSpec.isEmpty { + try visitor.visitSingularStringField(value: self.levelSpec, fieldNumber: 2) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_DebugLevelRequest, rhs: Lnrpc_DebugLevelRequest) -> Bool { + if lhs.show != rhs.show {return false} + if lhs.levelSpec != rhs.levelSpec {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_DebugLevelResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".DebugLevelResponse" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "sub_systems"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.subSystems) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.subSystems.isEmpty { + try visitor.visitSingularStringField(value: self.subSystems, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_DebugLevelResponse, rhs: Lnrpc_DebugLevelResponse) -> Bool { + if lhs.subSystems != rhs.subSystems {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_PayReqString: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".PayReqString" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "pay_req"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.payReq) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.payReq.isEmpty { + try visitor.visitSingularStringField(value: self.payReq, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_PayReqString, rhs: Lnrpc_PayReqString) -> Bool { + if lhs.payReq != rhs.payReq {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_PayReq: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".PayReq" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "destination"), + 2: .standard(proto: "payment_hash"), + 3: .standard(proto: "num_satoshis"), + 4: .same(proto: "timestamp"), + 5: .same(proto: "expiry"), + 6: .same(proto: "description"), + 7: .standard(proto: "description_hash"), + 8: .standard(proto: "fallback_addr"), + 9: .standard(proto: "cltv_expiry"), + 10: .standard(proto: "route_hints"), + 11: .standard(proto: "payment_addr"), + 12: .standard(proto: "num_msat"), + 13: .same(proto: "features"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.destination) }() + case 2: try { try decoder.decodeSingularStringField(value: &self.paymentHash) }() + case 3: try { try decoder.decodeSingularInt64Field(value: &self.numSatoshis) }() + case 4: try { try decoder.decodeSingularInt64Field(value: &self.timestamp) }() + case 5: try { try decoder.decodeSingularInt64Field(value: &self.expiry) }() + case 6: try { try decoder.decodeSingularStringField(value: &self.description_p) }() + case 7: try { try decoder.decodeSingularStringField(value: &self.descriptionHash) }() + case 8: try { try decoder.decodeSingularStringField(value: &self.fallbackAddr) }() + case 9: try { try decoder.decodeSingularInt64Field(value: &self.cltvExpiry) }() + case 10: try { try decoder.decodeRepeatedMessageField(value: &self.routeHints) }() + case 11: try { try decoder.decodeSingularBytesField(value: &self.paymentAddr) }() + case 12: try { try decoder.decodeSingularInt64Field(value: &self.numMsat) }() + case 13: try { try decoder.decodeMapField(fieldType: SwiftProtobuf._ProtobufMessageMap.self, value: &self.features) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.destination.isEmpty { + try visitor.visitSingularStringField(value: self.destination, fieldNumber: 1) + } + if !self.paymentHash.isEmpty { + try visitor.visitSingularStringField(value: self.paymentHash, fieldNumber: 2) + } + if self.numSatoshis != 0 { + try visitor.visitSingularInt64Field(value: self.numSatoshis, fieldNumber: 3) + } + if self.timestamp != 0 { + try visitor.visitSingularInt64Field(value: self.timestamp, fieldNumber: 4) + } + if self.expiry != 0 { + try visitor.visitSingularInt64Field(value: self.expiry, fieldNumber: 5) + } + if !self.description_p.isEmpty { + try visitor.visitSingularStringField(value: self.description_p, fieldNumber: 6) + } + if !self.descriptionHash.isEmpty { + try visitor.visitSingularStringField(value: self.descriptionHash, fieldNumber: 7) + } + if !self.fallbackAddr.isEmpty { + try visitor.visitSingularStringField(value: self.fallbackAddr, fieldNumber: 8) + } + if self.cltvExpiry != 0 { + try visitor.visitSingularInt64Field(value: self.cltvExpiry, fieldNumber: 9) + } + if !self.routeHints.isEmpty { + try visitor.visitRepeatedMessageField(value: self.routeHints, fieldNumber: 10) + } + if !self.paymentAddr.isEmpty { + try visitor.visitSingularBytesField(value: self.paymentAddr, fieldNumber: 11) + } + if self.numMsat != 0 { + try visitor.visitSingularInt64Field(value: self.numMsat, fieldNumber: 12) + } + if !self.features.isEmpty { + try visitor.visitMapField(fieldType: SwiftProtobuf._ProtobufMessageMap.self, value: self.features, fieldNumber: 13) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_PayReq, rhs: Lnrpc_PayReq) -> Bool { + if lhs.destination != rhs.destination {return false} + if lhs.paymentHash != rhs.paymentHash {return false} + if lhs.numSatoshis != rhs.numSatoshis {return false} + if lhs.timestamp != rhs.timestamp {return false} + if lhs.expiry != rhs.expiry {return false} + if lhs.description_p != rhs.description_p {return false} + if lhs.descriptionHash != rhs.descriptionHash {return false} + if lhs.fallbackAddr != rhs.fallbackAddr {return false} + if lhs.cltvExpiry != rhs.cltvExpiry {return false} + if lhs.routeHints != rhs.routeHints {return false} + if lhs.paymentAddr != rhs.paymentAddr {return false} + if lhs.numMsat != rhs.numMsat {return false} + if lhs.features != rhs.features {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_Feature: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".Feature" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 2: .same(proto: "name"), + 3: .standard(proto: "is_required"), + 4: .standard(proto: "is_known"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 2: try { try decoder.decodeSingularStringField(value: &self.name) }() + case 3: try { try decoder.decodeSingularBoolField(value: &self.isRequired) }() + case 4: try { try decoder.decodeSingularBoolField(value: &self.isKnown) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.name.isEmpty { + try visitor.visitSingularStringField(value: self.name, fieldNumber: 2) + } + if self.isRequired != false { + try visitor.visitSingularBoolField(value: self.isRequired, fieldNumber: 3) + } + if self.isKnown != false { + try visitor.visitSingularBoolField(value: self.isKnown, fieldNumber: 4) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_Feature, rhs: Lnrpc_Feature) -> Bool { + if lhs.name != rhs.name {return false} + if lhs.isRequired != rhs.isRequired {return false} + if lhs.isKnown != rhs.isKnown {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_FeeReportRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".FeeReportRequest" + static let _protobuf_nameMap = SwiftProtobuf._NameMap() + + mutating func decodeMessage(decoder: inout D) throws { + while let _ = try decoder.nextFieldNumber() { + } + } + + func traverse(visitor: inout V) throws { + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_FeeReportRequest, rhs: Lnrpc_FeeReportRequest) -> Bool { + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ChannelFeeReport: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ChannelFeeReport" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 5: .standard(proto: "chan_id"), + 1: .standard(proto: "channel_point"), + 2: .standard(proto: "base_fee_msat"), + 3: .standard(proto: "fee_per_mil"), + 4: .standard(proto: "fee_rate"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.channelPoint) }() + case 2: try { try decoder.decodeSingularInt64Field(value: &self.baseFeeMsat) }() + case 3: try { try decoder.decodeSingularInt64Field(value: &self.feePerMil) }() + case 4: try { try decoder.decodeSingularDoubleField(value: &self.feeRate) }() + case 5: try { try decoder.decodeSingularUInt64Field(value: &self.chanID) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.channelPoint.isEmpty { + try visitor.visitSingularStringField(value: self.channelPoint, fieldNumber: 1) + } + if self.baseFeeMsat != 0 { + try visitor.visitSingularInt64Field(value: self.baseFeeMsat, fieldNumber: 2) + } + if self.feePerMil != 0 { + try visitor.visitSingularInt64Field(value: self.feePerMil, fieldNumber: 3) + } + if self.feeRate != 0 { + try visitor.visitSingularDoubleField(value: self.feeRate, fieldNumber: 4) + } + if self.chanID != 0 { + try visitor.visitSingularUInt64Field(value: self.chanID, fieldNumber: 5) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ChannelFeeReport, rhs: Lnrpc_ChannelFeeReport) -> Bool { + if lhs.chanID != rhs.chanID {return false} + if lhs.channelPoint != rhs.channelPoint {return false} + if lhs.baseFeeMsat != rhs.baseFeeMsat {return false} + if lhs.feePerMil != rhs.feePerMil {return false} + if lhs.feeRate != rhs.feeRate {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_FeeReportResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".FeeReportResponse" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "channel_fees"), + 2: .standard(proto: "day_fee_sum"), + 3: .standard(proto: "week_fee_sum"), + 4: .standard(proto: "month_fee_sum"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeRepeatedMessageField(value: &self.channelFees) }() + case 2: try { try decoder.decodeSingularUInt64Field(value: &self.dayFeeSum) }() + case 3: try { try decoder.decodeSingularUInt64Field(value: &self.weekFeeSum) }() + case 4: try { try decoder.decodeSingularUInt64Field(value: &self.monthFeeSum) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.channelFees.isEmpty { + try visitor.visitRepeatedMessageField(value: self.channelFees, fieldNumber: 1) + } + if self.dayFeeSum != 0 { + try visitor.visitSingularUInt64Field(value: self.dayFeeSum, fieldNumber: 2) + } + if self.weekFeeSum != 0 { + try visitor.visitSingularUInt64Field(value: self.weekFeeSum, fieldNumber: 3) + } + if self.monthFeeSum != 0 { + try visitor.visitSingularUInt64Field(value: self.monthFeeSum, fieldNumber: 4) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_FeeReportResponse, rhs: Lnrpc_FeeReportResponse) -> Bool { + if lhs.channelFees != rhs.channelFees {return false} + if lhs.dayFeeSum != rhs.dayFeeSum {return false} + if lhs.weekFeeSum != rhs.weekFeeSum {return false} + if lhs.monthFeeSum != rhs.monthFeeSum {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_PolicyUpdateRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".PolicyUpdateRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "global"), + 2: .standard(proto: "chan_point"), + 3: .standard(proto: "base_fee_msat"), + 4: .standard(proto: "fee_rate"), + 5: .standard(proto: "time_lock_delta"), + 6: .standard(proto: "max_htlc_msat"), + 7: .standard(proto: "min_htlc_msat"), + 8: .standard(proto: "min_htlc_msat_specified"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { + if self.scope != nil {try decoder.handleConflictingOneOf()} + var v: Bool? + try decoder.decodeSingularBoolField(value: &v) + if let v = v {self.scope = .global(v)} + }() + case 2: try { + var v: Lnrpc_ChannelPoint? + if let current = self.scope { + try decoder.handleConflictingOneOf() + if case .chanPoint(let m) = current {v = m} + } + try decoder.decodeSingularMessageField(value: &v) + if let v = v {self.scope = .chanPoint(v)} + }() + case 3: try { try decoder.decodeSingularInt64Field(value: &self.baseFeeMsat) }() + case 4: try { try decoder.decodeSingularDoubleField(value: &self.feeRate) }() + case 5: try { try decoder.decodeSingularUInt32Field(value: &self.timeLockDelta) }() + case 6: try { try decoder.decodeSingularUInt64Field(value: &self.maxHtlcMsat) }() + case 7: try { try decoder.decodeSingularUInt64Field(value: &self.minHtlcMsat) }() + case 8: try { try decoder.decodeSingularBoolField(value: &self.minHtlcMsatSpecified) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch self.scope { + case .global?: try { + guard case .global(let v)? = self.scope else { preconditionFailure() } + try visitor.visitSingularBoolField(value: v, fieldNumber: 1) + }() + case .chanPoint?: try { + guard case .chanPoint(let v)? = self.scope else { preconditionFailure() } + try visitor.visitSingularMessageField(value: v, fieldNumber: 2) + }() + case nil: break + } + if self.baseFeeMsat != 0 { + try visitor.visitSingularInt64Field(value: self.baseFeeMsat, fieldNumber: 3) + } + if self.feeRate != 0 { + try visitor.visitSingularDoubleField(value: self.feeRate, fieldNumber: 4) + } + if self.timeLockDelta != 0 { + try visitor.visitSingularUInt32Field(value: self.timeLockDelta, fieldNumber: 5) + } + if self.maxHtlcMsat != 0 { + try visitor.visitSingularUInt64Field(value: self.maxHtlcMsat, fieldNumber: 6) + } + if self.minHtlcMsat != 0 { + try visitor.visitSingularUInt64Field(value: self.minHtlcMsat, fieldNumber: 7) + } + if self.minHtlcMsatSpecified != false { + try visitor.visitSingularBoolField(value: self.minHtlcMsatSpecified, fieldNumber: 8) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_PolicyUpdateRequest, rhs: Lnrpc_PolicyUpdateRequest) -> Bool { + if lhs.scope != rhs.scope {return false} + if lhs.baseFeeMsat != rhs.baseFeeMsat {return false} + if lhs.feeRate != rhs.feeRate {return false} + if lhs.timeLockDelta != rhs.timeLockDelta {return false} + if lhs.maxHtlcMsat != rhs.maxHtlcMsat {return false} + if lhs.minHtlcMsat != rhs.minHtlcMsat {return false} + if lhs.minHtlcMsatSpecified != rhs.minHtlcMsatSpecified {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_PolicyUpdateResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".PolicyUpdateResponse" + static let _protobuf_nameMap = SwiftProtobuf._NameMap() + + mutating func decodeMessage(decoder: inout D) throws { + while let _ = try decoder.nextFieldNumber() { + } + } + + func traverse(visitor: inout V) throws { + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_PolicyUpdateResponse, rhs: Lnrpc_PolicyUpdateResponse) -> Bool { + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ForwardingHistoryRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ForwardingHistoryRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "start_time"), + 2: .standard(proto: "end_time"), + 3: .standard(proto: "index_offset"), + 4: .standard(proto: "num_max_events"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularUInt64Field(value: &self.startTime) }() + case 2: try { try decoder.decodeSingularUInt64Field(value: &self.endTime) }() + case 3: try { try decoder.decodeSingularUInt32Field(value: &self.indexOffset) }() + case 4: try { try decoder.decodeSingularUInt32Field(value: &self.numMaxEvents) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.startTime != 0 { + try visitor.visitSingularUInt64Field(value: self.startTime, fieldNumber: 1) + } + if self.endTime != 0 { + try visitor.visitSingularUInt64Field(value: self.endTime, fieldNumber: 2) + } + if self.indexOffset != 0 { + try visitor.visitSingularUInt32Field(value: self.indexOffset, fieldNumber: 3) + } + if self.numMaxEvents != 0 { + try visitor.visitSingularUInt32Field(value: self.numMaxEvents, fieldNumber: 4) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ForwardingHistoryRequest, rhs: Lnrpc_ForwardingHistoryRequest) -> Bool { + if lhs.startTime != rhs.startTime {return false} + if lhs.endTime != rhs.endTime {return false} + if lhs.indexOffset != rhs.indexOffset {return false} + if lhs.numMaxEvents != rhs.numMaxEvents {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ForwardingEvent: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ForwardingEvent" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "timestamp"), + 2: .standard(proto: "chan_id_in"), + 4: .standard(proto: "chan_id_out"), + 5: .standard(proto: "amt_in"), + 6: .standard(proto: "amt_out"), + 7: .same(proto: "fee"), + 8: .standard(proto: "fee_msat"), + 9: .standard(proto: "amt_in_msat"), + 10: .standard(proto: "amt_out_msat"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularUInt64Field(value: &self.timestamp) }() + case 2: try { try decoder.decodeSingularUInt64Field(value: &self.chanIDIn) }() + case 4: try { try decoder.decodeSingularUInt64Field(value: &self.chanIDOut) }() + case 5: try { try decoder.decodeSingularUInt64Field(value: &self.amtIn) }() + case 6: try { try decoder.decodeSingularUInt64Field(value: &self.amtOut) }() + case 7: try { try decoder.decodeSingularUInt64Field(value: &self.fee) }() + case 8: try { try decoder.decodeSingularUInt64Field(value: &self.feeMsat) }() + case 9: try { try decoder.decodeSingularUInt64Field(value: &self.amtInMsat) }() + case 10: try { try decoder.decodeSingularUInt64Field(value: &self.amtOutMsat) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.timestamp != 0 { + try visitor.visitSingularUInt64Field(value: self.timestamp, fieldNumber: 1) + } + if self.chanIDIn != 0 { + try visitor.visitSingularUInt64Field(value: self.chanIDIn, fieldNumber: 2) + } + if self.chanIDOut != 0 { + try visitor.visitSingularUInt64Field(value: self.chanIDOut, fieldNumber: 4) + } + if self.amtIn != 0 { + try visitor.visitSingularUInt64Field(value: self.amtIn, fieldNumber: 5) + } + if self.amtOut != 0 { + try visitor.visitSingularUInt64Field(value: self.amtOut, fieldNumber: 6) + } + if self.fee != 0 { + try visitor.visitSingularUInt64Field(value: self.fee, fieldNumber: 7) + } + if self.feeMsat != 0 { + try visitor.visitSingularUInt64Field(value: self.feeMsat, fieldNumber: 8) + } + if self.amtInMsat != 0 { + try visitor.visitSingularUInt64Field(value: self.amtInMsat, fieldNumber: 9) + } + if self.amtOutMsat != 0 { + try visitor.visitSingularUInt64Field(value: self.amtOutMsat, fieldNumber: 10) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ForwardingEvent, rhs: Lnrpc_ForwardingEvent) -> Bool { + if lhs.timestamp != rhs.timestamp {return false} + if lhs.chanIDIn != rhs.chanIDIn {return false} + if lhs.chanIDOut != rhs.chanIDOut {return false} + if lhs.amtIn != rhs.amtIn {return false} + if lhs.amtOut != rhs.amtOut {return false} + if lhs.fee != rhs.fee {return false} + if lhs.feeMsat != rhs.feeMsat {return false} + if lhs.amtInMsat != rhs.amtInMsat {return false} + if lhs.amtOutMsat != rhs.amtOutMsat {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ForwardingHistoryResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ForwardingHistoryResponse" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "forwarding_events"), + 2: .standard(proto: "last_offset_index"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeRepeatedMessageField(value: &self.forwardingEvents) }() + case 2: try { try decoder.decodeSingularUInt32Field(value: &self.lastOffsetIndex) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.forwardingEvents.isEmpty { + try visitor.visitRepeatedMessageField(value: self.forwardingEvents, fieldNumber: 1) + } + if self.lastOffsetIndex != 0 { + try visitor.visitSingularUInt32Field(value: self.lastOffsetIndex, fieldNumber: 2) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ForwardingHistoryResponse, rhs: Lnrpc_ForwardingHistoryResponse) -> Bool { + if lhs.forwardingEvents != rhs.forwardingEvents {return false} + if lhs.lastOffsetIndex != rhs.lastOffsetIndex {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ExportChannelBackupRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ExportChannelBackupRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "chan_point"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularMessageField(value: &self._chanPoint) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if let v = self._chanPoint { + try visitor.visitSingularMessageField(value: v, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ExportChannelBackupRequest, rhs: Lnrpc_ExportChannelBackupRequest) -> Bool { + if lhs._chanPoint != rhs._chanPoint {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ChannelBackup: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ChannelBackup" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "chan_point"), + 2: .standard(proto: "chan_backup"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularMessageField(value: &self._chanPoint) }() + case 2: try { try decoder.decodeSingularBytesField(value: &self.chanBackup) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if let v = self._chanPoint { + try visitor.visitSingularMessageField(value: v, fieldNumber: 1) + } + if !self.chanBackup.isEmpty { + try visitor.visitSingularBytesField(value: self.chanBackup, fieldNumber: 2) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ChannelBackup, rhs: Lnrpc_ChannelBackup) -> Bool { + if lhs._chanPoint != rhs._chanPoint {return false} + if lhs.chanBackup != rhs.chanBackup {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_MultiChanBackup: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".MultiChanBackup" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "chan_points"), + 2: .standard(proto: "multi_chan_backup"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeRepeatedMessageField(value: &self.chanPoints) }() + case 2: try { try decoder.decodeSingularBytesField(value: &self.multiChanBackup) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.chanPoints.isEmpty { + try visitor.visitRepeatedMessageField(value: self.chanPoints, fieldNumber: 1) + } + if !self.multiChanBackup.isEmpty { + try visitor.visitSingularBytesField(value: self.multiChanBackup, fieldNumber: 2) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_MultiChanBackup, rhs: Lnrpc_MultiChanBackup) -> Bool { + if lhs.chanPoints != rhs.chanPoints {return false} + if lhs.multiChanBackup != rhs.multiChanBackup {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ChanBackupExportRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ChanBackupExportRequest" + static let _protobuf_nameMap = SwiftProtobuf._NameMap() + + mutating func decodeMessage(decoder: inout D) throws { + while let _ = try decoder.nextFieldNumber() { + } + } + + func traverse(visitor: inout V) throws { + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ChanBackupExportRequest, rhs: Lnrpc_ChanBackupExportRequest) -> Bool { + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ChanBackupSnapshot: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ChanBackupSnapshot" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "single_chan_backups"), + 2: .standard(proto: "multi_chan_backup"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularMessageField(value: &self._singleChanBackups) }() + case 2: try { try decoder.decodeSingularMessageField(value: &self._multiChanBackup) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if let v = self._singleChanBackups { + try visitor.visitSingularMessageField(value: v, fieldNumber: 1) + } + if let v = self._multiChanBackup { + try visitor.visitSingularMessageField(value: v, fieldNumber: 2) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ChanBackupSnapshot, rhs: Lnrpc_ChanBackupSnapshot) -> Bool { + if lhs._singleChanBackups != rhs._singleChanBackups {return false} + if lhs._multiChanBackup != rhs._multiChanBackup {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ChannelBackups: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ChannelBackups" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "chan_backups"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeRepeatedMessageField(value: &self.chanBackups) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.chanBackups.isEmpty { + try visitor.visitRepeatedMessageField(value: self.chanBackups, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ChannelBackups, rhs: Lnrpc_ChannelBackups) -> Bool { + if lhs.chanBackups != rhs.chanBackups {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_RestoreChanBackupRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".RestoreChanBackupRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "chan_backups"), + 2: .standard(proto: "multi_chan_backup"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { + var v: Lnrpc_ChannelBackups? + if let current = self.backup { + try decoder.handleConflictingOneOf() + if case .chanBackups(let m) = current {v = m} + } + try decoder.decodeSingularMessageField(value: &v) + if let v = v {self.backup = .chanBackups(v)} + }() + case 2: try { + if self.backup != nil {try decoder.handleConflictingOneOf()} + var v: Data? + try decoder.decodeSingularBytesField(value: &v) + if let v = v {self.backup = .multiChanBackup(v)} + }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch self.backup { + case .chanBackups?: try { + guard case .chanBackups(let v)? = self.backup else { preconditionFailure() } + try visitor.visitSingularMessageField(value: v, fieldNumber: 1) + }() + case .multiChanBackup?: try { + guard case .multiChanBackup(let v)? = self.backup else { preconditionFailure() } + try visitor.visitSingularBytesField(value: v, fieldNumber: 2) + }() + case nil: break + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_RestoreChanBackupRequest, rhs: Lnrpc_RestoreChanBackupRequest) -> Bool { + if lhs.backup != rhs.backup {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_RestoreBackupResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".RestoreBackupResponse" + static let _protobuf_nameMap = SwiftProtobuf._NameMap() + + mutating func decodeMessage(decoder: inout D) throws { + while let _ = try decoder.nextFieldNumber() { + } + } + + func traverse(visitor: inout V) throws { + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_RestoreBackupResponse, rhs: Lnrpc_RestoreBackupResponse) -> Bool { + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ChannelBackupSubscription: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ChannelBackupSubscription" + static let _protobuf_nameMap = SwiftProtobuf._NameMap() + + mutating func decodeMessage(decoder: inout D) throws { + while let _ = try decoder.nextFieldNumber() { + } + } + + func traverse(visitor: inout V) throws { + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ChannelBackupSubscription, rhs: Lnrpc_ChannelBackupSubscription) -> Bool { + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_VerifyChanBackupResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".VerifyChanBackupResponse" + static let _protobuf_nameMap = SwiftProtobuf._NameMap() + + mutating func decodeMessage(decoder: inout D) throws { + while let _ = try decoder.nextFieldNumber() { + } + } + + func traverse(visitor: inout V) throws { + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_VerifyChanBackupResponse, rhs: Lnrpc_VerifyChanBackupResponse) -> Bool { + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_MacaroonPermission: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".MacaroonPermission" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "entity"), + 2: .same(proto: "action"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.entity) }() + case 2: try { try decoder.decodeSingularStringField(value: &self.action) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.entity.isEmpty { + try visitor.visitSingularStringField(value: self.entity, fieldNumber: 1) + } + if !self.action.isEmpty { + try visitor.visitSingularStringField(value: self.action, fieldNumber: 2) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_MacaroonPermission, rhs: Lnrpc_MacaroonPermission) -> Bool { + if lhs.entity != rhs.entity {return false} + if lhs.action != rhs.action {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_BakeMacaroonRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".BakeMacaroonRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "permissions"), + 2: .standard(proto: "root_key_id"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeRepeatedMessageField(value: &self.permissions) }() + case 2: try { try decoder.decodeSingularUInt64Field(value: &self.rootKeyID) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.permissions.isEmpty { + try visitor.visitRepeatedMessageField(value: self.permissions, fieldNumber: 1) + } + if self.rootKeyID != 0 { + try visitor.visitSingularUInt64Field(value: self.rootKeyID, fieldNumber: 2) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_BakeMacaroonRequest, rhs: Lnrpc_BakeMacaroonRequest) -> Bool { + if lhs.permissions != rhs.permissions {return false} + if lhs.rootKeyID != rhs.rootKeyID {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_BakeMacaroonResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".BakeMacaroonResponse" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "macaroon"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.macaroon) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.macaroon.isEmpty { + try visitor.visitSingularStringField(value: self.macaroon, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_BakeMacaroonResponse, rhs: Lnrpc_BakeMacaroonResponse) -> Bool { + if lhs.macaroon != rhs.macaroon {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ListMacaroonIDsRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ListMacaroonIDsRequest" + static let _protobuf_nameMap = SwiftProtobuf._NameMap() + + mutating func decodeMessage(decoder: inout D) throws { + while let _ = try decoder.nextFieldNumber() { + } + } + + func traverse(visitor: inout V) throws { + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ListMacaroonIDsRequest, rhs: Lnrpc_ListMacaroonIDsRequest) -> Bool { + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ListMacaroonIDsResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ListMacaroonIDsResponse" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "root_key_ids"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeRepeatedUInt64Field(value: &self.rootKeyIds) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.rootKeyIds.isEmpty { + try visitor.visitPackedUInt64Field(value: self.rootKeyIds, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ListMacaroonIDsResponse, rhs: Lnrpc_ListMacaroonIDsResponse) -> Bool { + if lhs.rootKeyIds != rhs.rootKeyIds {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_DeleteMacaroonIDRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".DeleteMacaroonIDRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "root_key_id"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularUInt64Field(value: &self.rootKeyID) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.rootKeyID != 0 { + try visitor.visitSingularUInt64Field(value: self.rootKeyID, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_DeleteMacaroonIDRequest, rhs: Lnrpc_DeleteMacaroonIDRequest) -> Bool { + if lhs.rootKeyID != rhs.rootKeyID {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_DeleteMacaroonIDResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".DeleteMacaroonIDResponse" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "deleted"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularBoolField(value: &self.deleted) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.deleted != false { + try visitor.visitSingularBoolField(value: self.deleted, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_DeleteMacaroonIDResponse, rhs: Lnrpc_DeleteMacaroonIDResponse) -> Bool { + if lhs.deleted != rhs.deleted {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_MacaroonPermissionList: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".MacaroonPermissionList" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "permissions"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeRepeatedMessageField(value: &self.permissions) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.permissions.isEmpty { + try visitor.visitRepeatedMessageField(value: self.permissions, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_MacaroonPermissionList, rhs: Lnrpc_MacaroonPermissionList) -> Bool { + if lhs.permissions != rhs.permissions {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ListPermissionsRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ListPermissionsRequest" + static let _protobuf_nameMap = SwiftProtobuf._NameMap() + + mutating func decodeMessage(decoder: inout D) throws { + while let _ = try decoder.nextFieldNumber() { + } + } + + func traverse(visitor: inout V) throws { + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ListPermissionsRequest, rhs: Lnrpc_ListPermissionsRequest) -> Bool { + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ListPermissionsResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ListPermissionsResponse" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "method_permissions"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeMapField(fieldType: SwiftProtobuf._ProtobufMessageMap.self, value: &self.methodPermissions) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.methodPermissions.isEmpty { + try visitor.visitMapField(fieldType: SwiftProtobuf._ProtobufMessageMap.self, value: self.methodPermissions, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ListPermissionsResponse, rhs: Lnrpc_ListPermissionsResponse) -> Bool { + if lhs.methodPermissions != rhs.methodPermissions {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_Failure: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".Failure" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "code"), + 3: .standard(proto: "channel_update"), + 4: .standard(proto: "htlc_msat"), + 5: .standard(proto: "onion_sha_256"), + 6: .standard(proto: "cltv_expiry"), + 7: .same(proto: "flags"), + 8: .standard(proto: "failure_source_index"), + 9: .same(proto: "height"), + ] + + fileprivate class _StorageClass { + var _code: Lnrpc_Failure.FailureCode = .reserved + var _channelUpdate: Lnrpc_ChannelUpdate? = nil + var _htlcMsat: UInt64 = 0 + var _onionSha256: Data = Data() + var _cltvExpiry: UInt32 = 0 + var _flags: UInt32 = 0 + var _failureSourceIndex: UInt32 = 0 + var _height: UInt32 = 0 + + static let defaultInstance = _StorageClass() + + private init() {} + + init(copying source: _StorageClass) { + _code = source._code + _channelUpdate = source._channelUpdate + _htlcMsat = source._htlcMsat + _onionSha256 = source._onionSha256 + _cltvExpiry = source._cltvExpiry + _flags = source._flags + _failureSourceIndex = source._failureSourceIndex + _height = source._height + } + } + + fileprivate mutating func _uniqueStorage() -> _StorageClass { + if !isKnownUniquelyReferenced(&_storage) { + _storage = _StorageClass(copying: _storage) + } + return _storage + } + + mutating func decodeMessage(decoder: inout D) throws { + _ = _uniqueStorage() + try withExtendedLifetime(_storage) { (_storage: _StorageClass) in + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularEnumField(value: &_storage._code) }() + case 3: try { try decoder.decodeSingularMessageField(value: &_storage._channelUpdate) }() + case 4: try { try decoder.decodeSingularUInt64Field(value: &_storage._htlcMsat) }() + case 5: try { try decoder.decodeSingularBytesField(value: &_storage._onionSha256) }() + case 6: try { try decoder.decodeSingularUInt32Field(value: &_storage._cltvExpiry) }() + case 7: try { try decoder.decodeSingularUInt32Field(value: &_storage._flags) }() + case 8: try { try decoder.decodeSingularUInt32Field(value: &_storage._failureSourceIndex) }() + case 9: try { try decoder.decodeSingularUInt32Field(value: &_storage._height) }() + default: break + } + } + } + } + + func traverse(visitor: inout V) throws { + try withExtendedLifetime(_storage) { (_storage: _StorageClass) in + if _storage._code != .reserved { + try visitor.visitSingularEnumField(value: _storage._code, fieldNumber: 1) + } + if let v = _storage._channelUpdate { + try visitor.visitSingularMessageField(value: v, fieldNumber: 3) + } + if _storage._htlcMsat != 0 { + try visitor.visitSingularUInt64Field(value: _storage._htlcMsat, fieldNumber: 4) + } + if !_storage._onionSha256.isEmpty { + try visitor.visitSingularBytesField(value: _storage._onionSha256, fieldNumber: 5) + } + if _storage._cltvExpiry != 0 { + try visitor.visitSingularUInt32Field(value: _storage._cltvExpiry, fieldNumber: 6) + } + if _storage._flags != 0 { + try visitor.visitSingularUInt32Field(value: _storage._flags, fieldNumber: 7) + } + if _storage._failureSourceIndex != 0 { + try visitor.visitSingularUInt32Field(value: _storage._failureSourceIndex, fieldNumber: 8) + } + if _storage._height != 0 { + try visitor.visitSingularUInt32Field(value: _storage._height, fieldNumber: 9) + } + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_Failure, rhs: Lnrpc_Failure) -> Bool { + if lhs._storage !== rhs._storage { + let storagesAreEqual: Bool = withExtendedLifetime((lhs._storage, rhs._storage)) { (_args: (_StorageClass, _StorageClass)) in + let _storage = _args.0 + let rhs_storage = _args.1 + if _storage._code != rhs_storage._code {return false} + if _storage._channelUpdate != rhs_storage._channelUpdate {return false} + if _storage._htlcMsat != rhs_storage._htlcMsat {return false} + if _storage._onionSha256 != rhs_storage._onionSha256 {return false} + if _storage._cltvExpiry != rhs_storage._cltvExpiry {return false} + if _storage._flags != rhs_storage._flags {return false} + if _storage._failureSourceIndex != rhs_storage._failureSourceIndex {return false} + if _storage._height != rhs_storage._height {return false} + return true + } + if !storagesAreEqual {return false} + } + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_Failure.FailureCode: SwiftProtobuf._ProtoNameProviding { + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 0: .same(proto: "RESERVED"), + 1: .same(proto: "INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS"), + 2: .same(proto: "INCORRECT_PAYMENT_AMOUNT"), + 3: .same(proto: "FINAL_INCORRECT_CLTV_EXPIRY"), + 4: .same(proto: "FINAL_INCORRECT_HTLC_AMOUNT"), + 5: .same(proto: "FINAL_EXPIRY_TOO_SOON"), + 6: .same(proto: "INVALID_REALM"), + 7: .same(proto: "EXPIRY_TOO_SOON"), + 8: .same(proto: "INVALID_ONION_VERSION"), + 9: .same(proto: "INVALID_ONION_HMAC"), + 10: .same(proto: "INVALID_ONION_KEY"), + 11: .same(proto: "AMOUNT_BELOW_MINIMUM"), + 12: .same(proto: "FEE_INSUFFICIENT"), + 13: .same(proto: "INCORRECT_CLTV_EXPIRY"), + 14: .same(proto: "CHANNEL_DISABLED"), + 15: .same(proto: "TEMPORARY_CHANNEL_FAILURE"), + 16: .same(proto: "REQUIRED_NODE_FEATURE_MISSING"), + 17: .same(proto: "REQUIRED_CHANNEL_FEATURE_MISSING"), + 18: .same(proto: "UNKNOWN_NEXT_PEER"), + 19: .same(proto: "TEMPORARY_NODE_FAILURE"), + 20: .same(proto: "PERMANENT_NODE_FAILURE"), + 21: .same(proto: "PERMANENT_CHANNEL_FAILURE"), + 22: .same(proto: "EXPIRY_TOO_FAR"), + 23: .same(proto: "MPP_TIMEOUT"), + 997: .same(proto: "INTERNAL_FAILURE"), + 998: .same(proto: "UNKNOWN_FAILURE"), + 999: .same(proto: "UNREADABLE_FAILURE"), + ] +} + +extension Lnrpc_ChannelUpdate: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ChannelUpdate" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "signature"), + 2: .standard(proto: "chain_hash"), + 3: .standard(proto: "chan_id"), + 4: .same(proto: "timestamp"), + 10: .standard(proto: "message_flags"), + 5: .standard(proto: "channel_flags"), + 6: .standard(proto: "time_lock_delta"), + 7: .standard(proto: "htlc_minimum_msat"), + 8: .standard(proto: "base_fee"), + 9: .standard(proto: "fee_rate"), + 11: .standard(proto: "htlc_maximum_msat"), + 12: .standard(proto: "extra_opaque_data"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularBytesField(value: &self.signature) }() + case 2: try { try decoder.decodeSingularBytesField(value: &self.chainHash) }() + case 3: try { try decoder.decodeSingularUInt64Field(value: &self.chanID) }() + case 4: try { try decoder.decodeSingularUInt32Field(value: &self.timestamp) }() + case 5: try { try decoder.decodeSingularUInt32Field(value: &self.channelFlags) }() + case 6: try { try decoder.decodeSingularUInt32Field(value: &self.timeLockDelta) }() + case 7: try { try decoder.decodeSingularUInt64Field(value: &self.htlcMinimumMsat) }() + case 8: try { try decoder.decodeSingularUInt32Field(value: &self.baseFee) }() + case 9: try { try decoder.decodeSingularUInt32Field(value: &self.feeRate) }() + case 10: try { try decoder.decodeSingularUInt32Field(value: &self.messageFlags) }() + case 11: try { try decoder.decodeSingularUInt64Field(value: &self.htlcMaximumMsat) }() + case 12: try { try decoder.decodeSingularBytesField(value: &self.extraOpaqueData) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.signature.isEmpty { + try visitor.visitSingularBytesField(value: self.signature, fieldNumber: 1) + } + if !self.chainHash.isEmpty { + try visitor.visitSingularBytesField(value: self.chainHash, fieldNumber: 2) + } + if self.chanID != 0 { + try visitor.visitSingularUInt64Field(value: self.chanID, fieldNumber: 3) + } + if self.timestamp != 0 { + try visitor.visitSingularUInt32Field(value: self.timestamp, fieldNumber: 4) + } + if self.channelFlags != 0 { + try visitor.visitSingularUInt32Field(value: self.channelFlags, fieldNumber: 5) + } + if self.timeLockDelta != 0 { + try visitor.visitSingularUInt32Field(value: self.timeLockDelta, fieldNumber: 6) + } + if self.htlcMinimumMsat != 0 { + try visitor.visitSingularUInt64Field(value: self.htlcMinimumMsat, fieldNumber: 7) + } + if self.baseFee != 0 { + try visitor.visitSingularUInt32Field(value: self.baseFee, fieldNumber: 8) + } + if self.feeRate != 0 { + try visitor.visitSingularUInt32Field(value: self.feeRate, fieldNumber: 9) + } + if self.messageFlags != 0 { + try visitor.visitSingularUInt32Field(value: self.messageFlags, fieldNumber: 10) + } + if self.htlcMaximumMsat != 0 { + try visitor.visitSingularUInt64Field(value: self.htlcMaximumMsat, fieldNumber: 11) + } + if !self.extraOpaqueData.isEmpty { + try visitor.visitSingularBytesField(value: self.extraOpaqueData, fieldNumber: 12) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ChannelUpdate, rhs: Lnrpc_ChannelUpdate) -> Bool { + if lhs.signature != rhs.signature {return false} + if lhs.chainHash != rhs.chainHash {return false} + if lhs.chanID != rhs.chanID {return false} + if lhs.timestamp != rhs.timestamp {return false} + if lhs.messageFlags != rhs.messageFlags {return false} + if lhs.channelFlags != rhs.channelFlags {return false} + if lhs.timeLockDelta != rhs.timeLockDelta {return false} + if lhs.htlcMinimumMsat != rhs.htlcMinimumMsat {return false} + if lhs.baseFee != rhs.baseFee {return false} + if lhs.feeRate != rhs.feeRate {return false} + if lhs.htlcMaximumMsat != rhs.htlcMaximumMsat {return false} + if lhs.extraOpaqueData != rhs.extraOpaqueData {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_MacaroonId: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".MacaroonId" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "nonce"), + 2: .same(proto: "storageId"), + 3: .same(proto: "ops"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularBytesField(value: &self.nonce) }() + case 2: try { try decoder.decodeSingularBytesField(value: &self.storageID) }() + case 3: try { try decoder.decodeRepeatedMessageField(value: &self.ops) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.nonce.isEmpty { + try visitor.visitSingularBytesField(value: self.nonce, fieldNumber: 1) + } + if !self.storageID.isEmpty { + try visitor.visitSingularBytesField(value: self.storageID, fieldNumber: 2) + } + if !self.ops.isEmpty { + try visitor.visitRepeatedMessageField(value: self.ops, fieldNumber: 3) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_MacaroonId, rhs: Lnrpc_MacaroonId) -> Bool { + if lhs.nonce != rhs.nonce {return false} + if lhs.storageID != rhs.storageID {return false} + if lhs.ops != rhs.ops {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_Op: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".Op" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "entity"), + 2: .same(proto: "actions"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularStringField(value: &self.entity) }() + case 2: try { try decoder.decodeRepeatedStringField(value: &self.actions) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.entity.isEmpty { + try visitor.visitSingularStringField(value: self.entity, fieldNumber: 1) + } + if !self.actions.isEmpty { + try visitor.visitRepeatedStringField(value: self.actions, fieldNumber: 2) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_Op, rhs: Lnrpc_Op) -> Bool { + if lhs.entity != rhs.entity {return false} + if lhs.actions != rhs.actions {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} diff --git a/ios/LndMobile/walletunlocker.pb.swift b/ios/LndMobile/walletunlocker.pb.swift new file mode 100644 index 000000000..906d18c11 --- /dev/null +++ b/ios/LndMobile/walletunlocker.pb.swift @@ -0,0 +1,580 @@ +// DO NOT EDIT. +// swift-format-ignore-file +// +// Generated by the Swift generator plugin for the protocol buffer compiler. +// Source: walletunlocker.proto +// +// For information on using the generated types, please see the documentation: +// https://github.com/apple/swift-protobuf/ + +import Foundation +import SwiftProtobuf + +// If the compiler emits an error on this type, it is because this file +// was generated by a version of the `protoc` Swift plug-in that is +// incompatible with the version of SwiftProtobuf to which you are linking. +// Please ensure that you are building against the same version of the API +// that was used to generate this file. +fileprivate struct _GeneratedWithProtocGenSwiftVersion: SwiftProtobuf.ProtobufAPIVersionCheck { + struct _2: SwiftProtobuf.ProtobufAPIVersion_2 {} + typealias Version = _2 +} + +struct Lnrpc_GenSeedRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + ///aezeed_passphrase is an optional user provided passphrase that will be used + ///to encrypt the generated aezeed cipher seed. When using REST, this field + ///must be encoded as base64. + var aezeedPassphrase: Data = Data() + + /// + ///seed_entropy is an optional 16-bytes generated via CSPRNG. If not + ///specified, then a fresh set of randomness will be used to create the seed. + ///When using REST, this field must be encoded as base64. + var seedEntropy: Data = Data() + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_GenSeedResponse { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + ///cipher_seed_mnemonic is a 24-word mnemonic that encodes a prior aezeed + ///cipher seed obtained by the user. This field is optional, as if not + ///provided, then the daemon will generate a new cipher seed for the user. + ///Otherwise, then the daemon will attempt to recover the wallet state linked + ///to this cipher seed. + var cipherSeedMnemonic: [String] = [] + + /// + ///enciphered_seed are the raw aezeed cipher seed bytes. This is the raw + ///cipher text before run through our mnemonic encoding scheme. + var encipheredSeed: Data = Data() + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_InitWalletRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + ///wallet_password is the passphrase that should be used to encrypt the + ///wallet. This MUST be at least 8 chars in length. After creation, this + ///password is required to unlock the daemon. When using REST, this field + ///must be encoded as base64. + var walletPassword: Data = Data() + + /// + ///cipher_seed_mnemonic is a 24-word mnemonic that encodes a prior aezeed + ///cipher seed obtained by the user. This may have been generated by the + ///GenSeed method, or be an existing seed. + var cipherSeedMnemonic: [String] = [] + + /// + ///aezeed_passphrase is an optional user provided passphrase that will be used + ///to encrypt the generated aezeed cipher seed. When using REST, this field + ///must be encoded as base64. + var aezeedPassphrase: Data = Data() + + /// + ///recovery_window is an optional argument specifying the address lookahead + ///when restoring a wallet seed. The recovery window applies to each + ///individual branch of the BIP44 derivation paths. Supplying a recovery + ///window of zero indicates that no addresses should be recovered, such after + ///the first initialization of the wallet. + var recoveryWindow: Int32 = 0 + + /// + ///channel_backups is an optional argument that allows clients to recover the + ///settled funds within a set of channels. This should be populated if the + ///user was unable to close out all channels and sweep funds before partial or + ///total data loss occurred. If specified, then after on-chain recovery of + ///funds, lnd begin to carry out the data loss recovery protocol in order to + ///recover the funds in each channel from a remote force closed transaction. + var channelBackups: Lnrpc_ChanBackupSnapshot { + get {return _channelBackups ?? Lnrpc_ChanBackupSnapshot()} + set {_channelBackups = newValue} + } + /// Returns true if `channelBackups` has been explicitly set. + var hasChannelBackups: Bool {return self._channelBackups != nil} + /// Clears the value of `channelBackups`. Subsequent reads from it will return its default value. + mutating func clearChannelBackups() {self._channelBackups = nil} + + /// + ///stateless_init is an optional argument instructing the daemon NOT to create + ///any *.macaroon files in its filesystem. If this parameter is set, then the + ///admin macaroon returned in the response MUST be stored by the caller of the + ///RPC as otherwise all access to the daemon will be lost! + var statelessInit: Bool = false + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + + fileprivate var _channelBackups: Lnrpc_ChanBackupSnapshot? = nil +} + +struct Lnrpc_InitWalletResponse { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + ///The binary serialized admin macaroon that can be used to access the daemon + ///after creating the wallet. If the stateless_init parameter was set to true, + ///this is the ONLY copy of the macaroon and MUST be stored safely by the + ///caller. Otherwise a copy of this macaroon is also persisted on disk by the + ///daemon, together with other macaroon files. + var adminMacaroon: Data = Data() + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_UnlockWalletRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + ///wallet_password should be the current valid passphrase for the daemon. This + ///will be required to decrypt on-disk material that the daemon requires to + ///function properly. When using REST, this field must be encoded as base64. + var walletPassword: Data = Data() + + /// + ///recovery_window is an optional argument specifying the address lookahead + ///when restoring a wallet seed. The recovery window applies to each + ///individual branch of the BIP44 derivation paths. Supplying a recovery + ///window of zero indicates that no addresses should be recovered, such after + ///the first initialization of the wallet. + var recoveryWindow: Int32 = 0 + + /// + ///channel_backups is an optional argument that allows clients to recover the + ///settled funds within a set of channels. This should be populated if the + ///user was unable to close out all channels and sweep funds before partial or + ///total data loss occurred. If specified, then after on-chain recovery of + ///funds, lnd begin to carry out the data loss recovery protocol in order to + ///recover the funds in each channel from a remote force closed transaction. + var channelBackups: Lnrpc_ChanBackupSnapshot { + get {return _channelBackups ?? Lnrpc_ChanBackupSnapshot()} + set {_channelBackups = newValue} + } + /// Returns true if `channelBackups` has been explicitly set. + var hasChannelBackups: Bool {return self._channelBackups != nil} + /// Clears the value of `channelBackups`. Subsequent reads from it will return its default value. + mutating func clearChannelBackups() {self._channelBackups = nil} + + /// + ///stateless_init is an optional argument instructing the daemon NOT to create + ///any *.macaroon files in its file system. + var statelessInit: Bool = false + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + + fileprivate var _channelBackups: Lnrpc_ChanBackupSnapshot? = nil +} + +struct Lnrpc_UnlockWalletResponse { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_ChangePasswordRequest { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + ///current_password should be the current valid passphrase used to unlock the + ///daemon. When using REST, this field must be encoded as base64. + var currentPassword: Data = Data() + + /// + ///new_password should be the new passphrase that will be needed to unlock the + ///daemon. When using REST, this field must be encoded as base64. + var newPassword: Data = Data() + + /// + ///stateless_init is an optional argument instructing the daemon NOT to create + ///any *.macaroon files in its filesystem. If this parameter is set, then the + ///admin macaroon returned in the response MUST be stored by the caller of the + ///RPC as otherwise all access to the daemon will be lost! + var statelessInit: Bool = false + + /// + ///new_macaroon_root_key is an optional argument instructing the daemon to + ///rotate the macaroon root key when set to true. This will invalidate all + ///previously generated macaroons. + var newMacaroonRootKey: Bool = false + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +struct Lnrpc_ChangePasswordResponse { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// + ///The binary serialized admin macaroon that can be used to access the daemon + ///after rotating the macaroon root key. If both the stateless_init and + ///new_macaroon_root_key parameter were set to true, this is the ONLY copy of + ///the macaroon that was created from the new root key and MUST be stored + ///safely by the caller. Otherwise a copy of this macaroon is also persisted on + ///disk by the daemon, together with other macaroon files. + var adminMacaroon: Data = Data() + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +// MARK: - Code below here is support for the SwiftProtobuf runtime. + +fileprivate let _protobuf_package = "lnrpc" + +extension Lnrpc_GenSeedRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".GenSeedRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "aezeed_passphrase"), + 2: .standard(proto: "seed_entropy"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularBytesField(value: &self.aezeedPassphrase) }() + case 2: try { try decoder.decodeSingularBytesField(value: &self.seedEntropy) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.aezeedPassphrase.isEmpty { + try visitor.visitSingularBytesField(value: self.aezeedPassphrase, fieldNumber: 1) + } + if !self.seedEntropy.isEmpty { + try visitor.visitSingularBytesField(value: self.seedEntropy, fieldNumber: 2) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_GenSeedRequest, rhs: Lnrpc_GenSeedRequest) -> Bool { + if lhs.aezeedPassphrase != rhs.aezeedPassphrase {return false} + if lhs.seedEntropy != rhs.seedEntropy {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_GenSeedResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".GenSeedResponse" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "cipher_seed_mnemonic"), + 2: .standard(proto: "enciphered_seed"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeRepeatedStringField(value: &self.cipherSeedMnemonic) }() + case 2: try { try decoder.decodeSingularBytesField(value: &self.encipheredSeed) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.cipherSeedMnemonic.isEmpty { + try visitor.visitRepeatedStringField(value: self.cipherSeedMnemonic, fieldNumber: 1) + } + if !self.encipheredSeed.isEmpty { + try visitor.visitSingularBytesField(value: self.encipheredSeed, fieldNumber: 2) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_GenSeedResponse, rhs: Lnrpc_GenSeedResponse) -> Bool { + if lhs.cipherSeedMnemonic != rhs.cipherSeedMnemonic {return false} + if lhs.encipheredSeed != rhs.encipheredSeed {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_InitWalletRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".InitWalletRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "wallet_password"), + 2: .standard(proto: "cipher_seed_mnemonic"), + 3: .standard(proto: "aezeed_passphrase"), + 4: .standard(proto: "recovery_window"), + 5: .standard(proto: "channel_backups"), + 6: .standard(proto: "stateless_init"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularBytesField(value: &self.walletPassword) }() + case 2: try { try decoder.decodeRepeatedStringField(value: &self.cipherSeedMnemonic) }() + case 3: try { try decoder.decodeSingularBytesField(value: &self.aezeedPassphrase) }() + case 4: try { try decoder.decodeSingularInt32Field(value: &self.recoveryWindow) }() + case 5: try { try decoder.decodeSingularMessageField(value: &self._channelBackups) }() + case 6: try { try decoder.decodeSingularBoolField(value: &self.statelessInit) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.walletPassword.isEmpty { + try visitor.visitSingularBytesField(value: self.walletPassword, fieldNumber: 1) + } + if !self.cipherSeedMnemonic.isEmpty { + try visitor.visitRepeatedStringField(value: self.cipherSeedMnemonic, fieldNumber: 2) + } + if !self.aezeedPassphrase.isEmpty { + try visitor.visitSingularBytesField(value: self.aezeedPassphrase, fieldNumber: 3) + } + if self.recoveryWindow != 0 { + try visitor.visitSingularInt32Field(value: self.recoveryWindow, fieldNumber: 4) + } + if let v = self._channelBackups { + try visitor.visitSingularMessageField(value: v, fieldNumber: 5) + } + if self.statelessInit != false { + try visitor.visitSingularBoolField(value: self.statelessInit, fieldNumber: 6) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_InitWalletRequest, rhs: Lnrpc_InitWalletRequest) -> Bool { + if lhs.walletPassword != rhs.walletPassword {return false} + if lhs.cipherSeedMnemonic != rhs.cipherSeedMnemonic {return false} + if lhs.aezeedPassphrase != rhs.aezeedPassphrase {return false} + if lhs.recoveryWindow != rhs.recoveryWindow {return false} + if lhs._channelBackups != rhs._channelBackups {return false} + if lhs.statelessInit != rhs.statelessInit {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_InitWalletResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".InitWalletResponse" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "admin_macaroon"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularBytesField(value: &self.adminMacaroon) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.adminMacaroon.isEmpty { + try visitor.visitSingularBytesField(value: self.adminMacaroon, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_InitWalletResponse, rhs: Lnrpc_InitWalletResponse) -> Bool { + if lhs.adminMacaroon != rhs.adminMacaroon {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_UnlockWalletRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".UnlockWalletRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "wallet_password"), + 2: .standard(proto: "recovery_window"), + 3: .standard(proto: "channel_backups"), + 4: .standard(proto: "stateless_init"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularBytesField(value: &self.walletPassword) }() + case 2: try { try decoder.decodeSingularInt32Field(value: &self.recoveryWindow) }() + case 3: try { try decoder.decodeSingularMessageField(value: &self._channelBackups) }() + case 4: try { try decoder.decodeSingularBoolField(value: &self.statelessInit) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.walletPassword.isEmpty { + try visitor.visitSingularBytesField(value: self.walletPassword, fieldNumber: 1) + } + if self.recoveryWindow != 0 { + try visitor.visitSingularInt32Field(value: self.recoveryWindow, fieldNumber: 2) + } + if let v = self._channelBackups { + try visitor.visitSingularMessageField(value: v, fieldNumber: 3) + } + if self.statelessInit != false { + try visitor.visitSingularBoolField(value: self.statelessInit, fieldNumber: 4) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_UnlockWalletRequest, rhs: Lnrpc_UnlockWalletRequest) -> Bool { + if lhs.walletPassword != rhs.walletPassword {return false} + if lhs.recoveryWindow != rhs.recoveryWindow {return false} + if lhs._channelBackups != rhs._channelBackups {return false} + if lhs.statelessInit != rhs.statelessInit {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_UnlockWalletResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".UnlockWalletResponse" + static let _protobuf_nameMap = SwiftProtobuf._NameMap() + + mutating func decodeMessage(decoder: inout D) throws { + while let _ = try decoder.nextFieldNumber() { + } + } + + func traverse(visitor: inout V) throws { + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_UnlockWalletResponse, rhs: Lnrpc_UnlockWalletResponse) -> Bool { + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ChangePasswordRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ChangePasswordRequest" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "current_password"), + 2: .standard(proto: "new_password"), + 3: .standard(proto: "stateless_init"), + 4: .standard(proto: "new_macaroon_root_key"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularBytesField(value: &self.currentPassword) }() + case 2: try { try decoder.decodeSingularBytesField(value: &self.newPassword) }() + case 3: try { try decoder.decodeSingularBoolField(value: &self.statelessInit) }() + case 4: try { try decoder.decodeSingularBoolField(value: &self.newMacaroonRootKey) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.currentPassword.isEmpty { + try visitor.visitSingularBytesField(value: self.currentPassword, fieldNumber: 1) + } + if !self.newPassword.isEmpty { + try visitor.visitSingularBytesField(value: self.newPassword, fieldNumber: 2) + } + if self.statelessInit != false { + try visitor.visitSingularBoolField(value: self.statelessInit, fieldNumber: 3) + } + if self.newMacaroonRootKey != false { + try visitor.visitSingularBoolField(value: self.newMacaroonRootKey, fieldNumber: 4) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ChangePasswordRequest, rhs: Lnrpc_ChangePasswordRequest) -> Bool { + if lhs.currentPassword != rhs.currentPassword {return false} + if lhs.newPassword != rhs.newPassword {return false} + if lhs.statelessInit != rhs.statelessInit {return false} + if lhs.newMacaroonRootKey != rhs.newMacaroonRootKey {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension Lnrpc_ChangePasswordResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ChangePasswordResponse" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "admin_macaroon"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularBytesField(value: &self.adminMacaroon) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.adminMacaroon.isEmpty { + try visitor.visitSingularBytesField(value: self.adminMacaroon, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: Lnrpc_ChangePasswordResponse, rhs: Lnrpc_ChangePasswordResponse) -> Bool { + if lhs.adminMacaroon != rhs.adminMacaroon {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} diff --git a/ios/Podfile b/ios/Podfile index ca7ee067a..e3dba8952 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -18,6 +18,9 @@ target 'BlixtWallet' do use_react_native!(:path => config["reactNativePath"]) + # proto + pod 'SwiftProtobuf', '~> 1.0' + # react-native-permissions permissions_path = '../node_modules/react-native-permissions/ios' pod 'Permission-LocationWhenInUse', :path => "#{permissions_path}/LocationWhenInUse" diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 0c188c5bc..ca0616a54 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1,23 +1,18 @@ PODS: - - AppAuth (1.4.0): - - AppAuth/Core (= 1.4.0) - - AppAuth/ExternalUserAgent (= 1.4.0) - - AppAuth/Core (1.4.0) - - AppAuth/ExternalUserAgent (1.4.0) - boost-for-react-native (1.63.0) - BVLinearGradient (2.5.6): - React - CocoaAsyncSocket (7.6.4) - CocoaLibEvent (1.0.0) - DoubleConversion (1.1.6) - - FBLazyVector (0.63.3) - - FBReactNativeSpec (0.63.3): + - FBLazyVector (0.63.4) + - FBReactNativeSpec (0.63.4): - Folly (= 2020.01.13.00) - - RCTRequired (= 0.63.3) - - RCTTypeSafety (= 0.63.3) - - React-Core (= 0.63.3) - - React-jsi (= 0.63.3) - - ReactCommon/turbomodule/core (= 0.63.3) + - RCTRequired (= 0.63.4) + - RCTTypeSafety (= 0.63.4) + - React-Core (= 0.63.4) + - React-jsi (= 0.63.4) + - ReactCommon/turbomodule/core (= 0.63.4) - Flipper (0.54.0): - Flipper-Folly (~> 2.2) - Flipper-RSocket (~> 1.1) @@ -74,189 +69,177 @@ PODS: - DoubleConversion - glog - glog (0.3.5) - - GoogleSignIn (5.0.2): - - AppAuth (~> 1.2) - - GTMAppAuth (~> 1.0) - - GTMSessionFetcher/Core (~> 1.1) - - GTMAppAuth (1.1.0): - - AppAuth/Core (~> 1.4) - - GTMSessionFetcher (~> 1.4) - - GTMSessionFetcher (1.5.0): - - GTMSessionFetcher/Full (= 1.5.0) - - GTMSessionFetcher/Core (1.5.0) - - GTMSessionFetcher/Full (1.5.0): - - GTMSessionFetcher/Core (= 1.5.0) - OpenSSL-Universal (1.0.2.20): - OpenSSL-Universal/Static (= 1.0.2.20) - OpenSSL-Universal/Static (1.0.2.20) - Permission-LocationWhenInUse (3.0.0): - RNPermissions - - RCTRequired (0.63.3) - - RCTTypeSafety (0.63.3): - - FBLazyVector (= 0.63.3) + - RCTRequired (0.63.4) + - RCTTypeSafety (0.63.4): + - FBLazyVector (= 0.63.4) - Folly (= 2020.01.13.00) - - RCTRequired (= 0.63.3) - - React-Core (= 0.63.3) - - React (0.63.3): - - React-Core (= 0.63.3) - - React-Core/DevSupport (= 0.63.3) - - React-Core/RCTWebSocket (= 0.63.3) - - React-RCTActionSheet (= 0.63.3) - - React-RCTAnimation (= 0.63.3) - - React-RCTBlob (= 0.63.3) - - React-RCTImage (= 0.63.3) - - React-RCTLinking (= 0.63.3) - - React-RCTNetwork (= 0.63.3) - - React-RCTSettings (= 0.63.3) - - React-RCTText (= 0.63.3) - - React-RCTVibration (= 0.63.3) - - React-callinvoker (0.63.3) - - React-Core (0.63.3): + - RCTRequired (= 0.63.4) + - React-Core (= 0.63.4) + - React (0.63.4): + - React-Core (= 0.63.4) + - React-Core/DevSupport (= 0.63.4) + - React-Core/RCTWebSocket (= 0.63.4) + - React-RCTActionSheet (= 0.63.4) + - React-RCTAnimation (= 0.63.4) + - React-RCTBlob (= 0.63.4) + - React-RCTImage (= 0.63.4) + - React-RCTLinking (= 0.63.4) + - React-RCTNetwork (= 0.63.4) + - React-RCTSettings (= 0.63.4) + - React-RCTText (= 0.63.4) + - React-RCTVibration (= 0.63.4) + - React-callinvoker (0.63.4) + - React-Core (0.63.4): - Folly (= 2020.01.13.00) - glog - - React-Core/Default (= 0.63.3) - - React-cxxreact (= 0.63.3) - - React-jsi (= 0.63.3) - - React-jsiexecutor (= 0.63.3) + - React-Core/Default (= 0.63.4) + - React-cxxreact (= 0.63.4) + - React-jsi (= 0.63.4) + - React-jsiexecutor (= 0.63.4) - Yoga - - React-Core/CoreModulesHeaders (0.63.3): + - React-Core/CoreModulesHeaders (0.63.4): - Folly (= 2020.01.13.00) - glog - React-Core/Default - - React-cxxreact (= 0.63.3) - - React-jsi (= 0.63.3) - - React-jsiexecutor (= 0.63.3) + - React-cxxreact (= 0.63.4) + - React-jsi (= 0.63.4) + - React-jsiexecutor (= 0.63.4) - Yoga - - React-Core/Default (0.63.3): + - React-Core/Default (0.63.4): - Folly (= 2020.01.13.00) - glog - - React-cxxreact (= 0.63.3) - - React-jsi (= 0.63.3) - - React-jsiexecutor (= 0.63.3) + - React-cxxreact (= 0.63.4) + - React-jsi (= 0.63.4) + - React-jsiexecutor (= 0.63.4) - Yoga - - React-Core/DevSupport (0.63.3): + - React-Core/DevSupport (0.63.4): - Folly (= 2020.01.13.00) - glog - - React-Core/Default (= 0.63.3) - - React-Core/RCTWebSocket (= 0.63.3) - - React-cxxreact (= 0.63.3) - - React-jsi (= 0.63.3) - - React-jsiexecutor (= 0.63.3) - - React-jsinspector (= 0.63.3) + - React-Core/Default (= 0.63.4) + - React-Core/RCTWebSocket (= 0.63.4) + - React-cxxreact (= 0.63.4) + - React-jsi (= 0.63.4) + - React-jsiexecutor (= 0.63.4) + - React-jsinspector (= 0.63.4) - Yoga - - React-Core/RCTActionSheetHeaders (0.63.3): + - React-Core/RCTActionSheetHeaders (0.63.4): - Folly (= 2020.01.13.00) - glog - React-Core/Default - - React-cxxreact (= 0.63.3) - - React-jsi (= 0.63.3) - - React-jsiexecutor (= 0.63.3) + - React-cxxreact (= 0.63.4) + - React-jsi (= 0.63.4) + - React-jsiexecutor (= 0.63.4) - Yoga - - React-Core/RCTAnimationHeaders (0.63.3): + - React-Core/RCTAnimationHeaders (0.63.4): - Folly (= 2020.01.13.00) - glog - React-Core/Default - - React-cxxreact (= 0.63.3) - - React-jsi (= 0.63.3) - - React-jsiexecutor (= 0.63.3) + - React-cxxreact (= 0.63.4) + - React-jsi (= 0.63.4) + - React-jsiexecutor (= 0.63.4) - Yoga - - React-Core/RCTBlobHeaders (0.63.3): + - React-Core/RCTBlobHeaders (0.63.4): - Folly (= 2020.01.13.00) - glog - React-Core/Default - - React-cxxreact (= 0.63.3) - - React-jsi (= 0.63.3) - - React-jsiexecutor (= 0.63.3) + - React-cxxreact (= 0.63.4) + - React-jsi (= 0.63.4) + - React-jsiexecutor (= 0.63.4) - Yoga - - React-Core/RCTImageHeaders (0.63.3): + - React-Core/RCTImageHeaders (0.63.4): - Folly (= 2020.01.13.00) - glog - React-Core/Default - - React-cxxreact (= 0.63.3) - - React-jsi (= 0.63.3) - - React-jsiexecutor (= 0.63.3) + - React-cxxreact (= 0.63.4) + - React-jsi (= 0.63.4) + - React-jsiexecutor (= 0.63.4) - Yoga - - React-Core/RCTLinkingHeaders (0.63.3): + - React-Core/RCTLinkingHeaders (0.63.4): - Folly (= 2020.01.13.00) - glog - React-Core/Default - - React-cxxreact (= 0.63.3) - - React-jsi (= 0.63.3) - - React-jsiexecutor (= 0.63.3) + - React-cxxreact (= 0.63.4) + - React-jsi (= 0.63.4) + - React-jsiexecutor (= 0.63.4) - Yoga - - React-Core/RCTNetworkHeaders (0.63.3): + - React-Core/RCTNetworkHeaders (0.63.4): - Folly (= 2020.01.13.00) - glog - React-Core/Default - - React-cxxreact (= 0.63.3) - - React-jsi (= 0.63.3) - - React-jsiexecutor (= 0.63.3) + - React-cxxreact (= 0.63.4) + - React-jsi (= 0.63.4) + - React-jsiexecutor (= 0.63.4) - Yoga - - React-Core/RCTSettingsHeaders (0.63.3): + - React-Core/RCTSettingsHeaders (0.63.4): - Folly (= 2020.01.13.00) - glog - React-Core/Default - - React-cxxreact (= 0.63.3) - - React-jsi (= 0.63.3) - - React-jsiexecutor (= 0.63.3) + - React-cxxreact (= 0.63.4) + - React-jsi (= 0.63.4) + - React-jsiexecutor (= 0.63.4) - Yoga - - React-Core/RCTTextHeaders (0.63.3): + - React-Core/RCTTextHeaders (0.63.4): - Folly (= 2020.01.13.00) - glog - React-Core/Default - - React-cxxreact (= 0.63.3) - - React-jsi (= 0.63.3) - - React-jsiexecutor (= 0.63.3) + - React-cxxreact (= 0.63.4) + - React-jsi (= 0.63.4) + - React-jsiexecutor (= 0.63.4) - Yoga - - React-Core/RCTVibrationHeaders (0.63.3): + - React-Core/RCTVibrationHeaders (0.63.4): - Folly (= 2020.01.13.00) - glog - React-Core/Default - - React-cxxreact (= 0.63.3) - - React-jsi (= 0.63.3) - - React-jsiexecutor (= 0.63.3) + - React-cxxreact (= 0.63.4) + - React-jsi (= 0.63.4) + - React-jsiexecutor (= 0.63.4) - Yoga - - React-Core/RCTWebSocket (0.63.3): + - React-Core/RCTWebSocket (0.63.4): - Folly (= 2020.01.13.00) - glog - - React-Core/Default (= 0.63.3) - - React-cxxreact (= 0.63.3) - - React-jsi (= 0.63.3) - - React-jsiexecutor (= 0.63.3) + - React-Core/Default (= 0.63.4) + - React-cxxreact (= 0.63.4) + - React-jsi (= 0.63.4) + - React-jsiexecutor (= 0.63.4) - Yoga - - React-CoreModules (0.63.3): - - FBReactNativeSpec (= 0.63.3) + - React-CoreModules (0.63.4): + - FBReactNativeSpec (= 0.63.4) - Folly (= 2020.01.13.00) - - RCTTypeSafety (= 0.63.3) - - React-Core/CoreModulesHeaders (= 0.63.3) - - React-jsi (= 0.63.3) - - React-RCTImage (= 0.63.3) - - ReactCommon/turbomodule/core (= 0.63.3) - - React-cxxreact (0.63.3): + - RCTTypeSafety (= 0.63.4) + - React-Core/CoreModulesHeaders (= 0.63.4) + - React-jsi (= 0.63.4) + - React-RCTImage (= 0.63.4) + - ReactCommon/turbomodule/core (= 0.63.4) + - React-cxxreact (0.63.4): - boost-for-react-native (= 1.63.0) - DoubleConversion - Folly (= 2020.01.13.00) - glog - - React-callinvoker (= 0.63.3) - - React-jsinspector (= 0.63.3) - - React-jsi (0.63.3): + - React-callinvoker (= 0.63.4) + - React-jsinspector (= 0.63.4) + - React-jsi (0.63.4): - boost-for-react-native (= 1.63.0) - DoubleConversion - Folly (= 2020.01.13.00) - glog - - React-jsi/Default (= 0.63.3) - - React-jsi/Default (0.63.3): + - React-jsi/Default (= 0.63.4) + - React-jsi/Default (0.63.4): - boost-for-react-native (= 1.63.0) - DoubleConversion - Folly (= 2020.01.13.00) - glog - - React-jsiexecutor (0.63.3): + - React-jsiexecutor (0.63.4): - DoubleConversion - Folly (= 2020.01.13.00) - glog - - React-cxxreact (= 0.63.3) - - React-jsi (= 0.63.3) - - React-jsinspector (0.63.3) + - React-cxxreact (= 0.63.4) + - React-jsi (= 0.63.4) + - React-jsinspector (0.63.4) - react-native-build-config (0.3.2): - React - react-native-camera (3.40.0): @@ -283,66 +266,66 @@ PODS: - React - react-native-webview (10.10.2): - React-Core - - React-RCTActionSheet (0.63.3): - - React-Core/RCTActionSheetHeaders (= 0.63.3) - - React-RCTAnimation (0.63.3): - - FBReactNativeSpec (= 0.63.3) + - React-RCTActionSheet (0.63.4): + - React-Core/RCTActionSheetHeaders (= 0.63.4) + - React-RCTAnimation (0.63.4): + - FBReactNativeSpec (= 0.63.4) - Folly (= 2020.01.13.00) - - RCTTypeSafety (= 0.63.3) - - React-Core/RCTAnimationHeaders (= 0.63.3) - - React-jsi (= 0.63.3) - - ReactCommon/turbomodule/core (= 0.63.3) - - React-RCTBlob (0.63.3): - - FBReactNativeSpec (= 0.63.3) + - RCTTypeSafety (= 0.63.4) + - React-Core/RCTAnimationHeaders (= 0.63.4) + - React-jsi (= 0.63.4) + - ReactCommon/turbomodule/core (= 0.63.4) + - React-RCTBlob (0.63.4): + - FBReactNativeSpec (= 0.63.4) - Folly (= 2020.01.13.00) - - React-Core/RCTBlobHeaders (= 0.63.3) - - React-Core/RCTWebSocket (= 0.63.3) - - React-jsi (= 0.63.3) - - React-RCTNetwork (= 0.63.3) - - ReactCommon/turbomodule/core (= 0.63.3) - - React-RCTImage (0.63.3): - - FBReactNativeSpec (= 0.63.3) + - React-Core/RCTBlobHeaders (= 0.63.4) + - React-Core/RCTWebSocket (= 0.63.4) + - React-jsi (= 0.63.4) + - React-RCTNetwork (= 0.63.4) + - ReactCommon/turbomodule/core (= 0.63.4) + - React-RCTImage (0.63.4): + - FBReactNativeSpec (= 0.63.4) - Folly (= 2020.01.13.00) - - RCTTypeSafety (= 0.63.3) - - React-Core/RCTImageHeaders (= 0.63.3) - - React-jsi (= 0.63.3) - - React-RCTNetwork (= 0.63.3) - - ReactCommon/turbomodule/core (= 0.63.3) - - React-RCTLinking (0.63.3): - - FBReactNativeSpec (= 0.63.3) - - React-Core/RCTLinkingHeaders (= 0.63.3) - - React-jsi (= 0.63.3) - - ReactCommon/turbomodule/core (= 0.63.3) - - React-RCTNetwork (0.63.3): - - FBReactNativeSpec (= 0.63.3) + - RCTTypeSafety (= 0.63.4) + - React-Core/RCTImageHeaders (= 0.63.4) + - React-jsi (= 0.63.4) + - React-RCTNetwork (= 0.63.4) + - ReactCommon/turbomodule/core (= 0.63.4) + - React-RCTLinking (0.63.4): + - FBReactNativeSpec (= 0.63.4) + - React-Core/RCTLinkingHeaders (= 0.63.4) + - React-jsi (= 0.63.4) + - ReactCommon/turbomodule/core (= 0.63.4) + - React-RCTNetwork (0.63.4): + - FBReactNativeSpec (= 0.63.4) - Folly (= 2020.01.13.00) - - RCTTypeSafety (= 0.63.3) - - React-Core/RCTNetworkHeaders (= 0.63.3) - - React-jsi (= 0.63.3) - - ReactCommon/turbomodule/core (= 0.63.3) - - React-RCTSettings (0.63.3): - - FBReactNativeSpec (= 0.63.3) + - RCTTypeSafety (= 0.63.4) + - React-Core/RCTNetworkHeaders (= 0.63.4) + - React-jsi (= 0.63.4) + - ReactCommon/turbomodule/core (= 0.63.4) + - React-RCTSettings (0.63.4): + - FBReactNativeSpec (= 0.63.4) - Folly (= 2020.01.13.00) - - RCTTypeSafety (= 0.63.3) - - React-Core/RCTSettingsHeaders (= 0.63.3) - - React-jsi (= 0.63.3) - - ReactCommon/turbomodule/core (= 0.63.3) - - React-RCTText (0.63.3): - - React-Core/RCTTextHeaders (= 0.63.3) - - React-RCTVibration (0.63.3): - - FBReactNativeSpec (= 0.63.3) + - RCTTypeSafety (= 0.63.4) + - React-Core/RCTSettingsHeaders (= 0.63.4) + - React-jsi (= 0.63.4) + - ReactCommon/turbomodule/core (= 0.63.4) + - React-RCTText (0.63.4): + - React-Core/RCTTextHeaders (= 0.63.4) + - React-RCTVibration (0.63.4): + - FBReactNativeSpec (= 0.63.4) - Folly (= 2020.01.13.00) - - React-Core/RCTVibrationHeaders (= 0.63.3) - - React-jsi (= 0.63.3) - - ReactCommon/turbomodule/core (= 0.63.3) - - ReactCommon/turbomodule/core (0.63.3): + - React-Core/RCTVibrationHeaders (= 0.63.4) + - React-jsi (= 0.63.4) + - ReactCommon/turbomodule/core (= 0.63.4) + - ReactCommon/turbomodule/core (0.63.4): - DoubleConversion - Folly (= 2020.01.13.00) - glog - - React-callinvoker (= 0.63.3) - - React-Core (= 0.63.3) - - React-cxxreact (= 0.63.3) - - React-jsi (= 0.63.3) + - React-callinvoker (= 0.63.4) + - React-Core (= 0.63.4) + - React-cxxreact (= 0.63.4) + - React-jsi (= 0.63.4) - RNCAsyncStorage (1.12.1): - React-Core - RNCClipboard (1.5.1): @@ -355,9 +338,8 @@ PODS: - React - RNGestureHandler (1.9.0): - React-Core - - RNGoogleSignin (5.0.0): - - GoogleSignIn (~> 5.0.0) - - React-Core + - RNICloudStore (0.1.0): + - React - RNKeychain (4.0.5): - React - RNPermissions (3.0.0): @@ -379,6 +361,7 @@ PODS: - React - RNVectorIcons (7.1.0): - React + - SwiftProtobuf (1.14.0) - Yoga (1.14.0) - YogaKit (1.18.1): - Yoga (~> 1.14) @@ -448,7 +431,7 @@ DEPENDENCIES: - "RNCPushNotificationIOS (from `../node_modules/@react-native-community/push-notification-ios`)" - RNFS (from `../node_modules/react-native-fs`) - RNGestureHandler (from `../node_modules/react-native-gesture-handler`) - - "RNGoogleSignin (from `../node_modules/@react-native-community/google-signin`)" + - RNICloudStore (from `../node_modules/react-native-icloudstore`) - RNKeychain (from `../node_modules/react-native-keychain`) - RNPermissions (from `../node_modules/react-native-permissions`) - RNReactNativeHapticFeedback (from `../node_modules/react-native-haptic-feedback`) @@ -458,11 +441,11 @@ DEPENDENCIES: - RNSound (from `../node_modules/react-native-sound`) - RNSVG (from `../node_modules/react-native-svg`) - RNVectorIcons (from `../node_modules/react-native-vector-icons`) + - SwiftProtobuf (~> 1.0) - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) SPEC REPOS: trunk: - - AppAuth - boost-for-react-native - CocoaAsyncSocket - CocoaLibEvent @@ -473,10 +456,8 @@ SPEC REPOS: - Flipper-PeerTalk - Flipper-RSocket - FlipperKit - - GoogleSignIn - - GTMAppAuth - - GTMSessionFetcher - OpenSSL-Universal + - SwiftProtobuf - YogaKit EXTERNAL SOURCES: @@ -566,8 +547,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native-fs" RNGestureHandler: :path: "../node_modules/react-native-gesture-handler" - RNGoogleSignin: - :path: "../node_modules/@react-native-community/google-signin" + RNICloudStore: + :path: "../node_modules/react-native-icloudstore" RNKeychain: :path: "../node_modules/react-native-keychain" RNPermissions: @@ -590,14 +571,13 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon/yoga" SPEC CHECKSUMS: - AppAuth: 31bcec809a638d7bd2f86ea8a52bd45f6e81e7c7 boost-for-react-native: 39c7adb57c4e60d6c5479dd8623128eb5b3f0f2c BVLinearGradient: e3aad03778a456d77928f594a649e96995f1c872 CocoaAsyncSocket: 694058e7c0ed05a9e217d1b3c7ded962f4180845 CocoaLibEvent: 2fab71b8bd46dd33ddb959f7928ec5909f838e3f DoubleConversion: cde416483dac037923206447da6e1454df403714 - FBLazyVector: 878b59e31113e289e275165efbe4b54fa614d43d - FBReactNativeSpec: 7da9338acfb98d4ef9e5536805a0704572d33c2f + FBLazyVector: 3bb422f41b18121b71783a905c10e58606f7dc3e + FBReactNativeSpec: f2c97f2529dd79c083355182cc158c9f98f4bd6e Flipper: be611d4b742d8c87fbae2ca5f44603a02539e365 Flipper-DoubleConversion: 38631e41ef4f9b12861c67d17cb5518d06badc41 Flipper-Folly: e4493b013c02d9347d5e0cb4d128680239f6c78a @@ -607,21 +587,18 @@ SPEC CHECKSUMS: FlipperKit: ab353d41aea8aae2ea6daaf813e67496642f3d7d Folly: b73c3869541e86821df3c387eb0af5f65addfab4 glog: 40a13f7840415b9a77023fbcae0f1e6f43192af3 - GoogleSignIn: 7137d297ddc022a7e0aa4619c86d72c909fa7213 - GTMAppAuth: 197a8dabfea5d665224aa00d17f164fc2248dab9 - GTMSessionFetcher: b3503b20a988c4e20cc189aa798fd18220133f52 OpenSSL-Universal: ff34003318d5e1163e9529b08470708e389ffcdd Permission-LocationWhenInUse: e2b8c40ce0f3675a521f26787ab47ebb9bace503 - RCTRequired: 48884c74035a0b5b76dbb7a998bd93bcfc5f2047 - RCTTypeSafety: edf4b618033c2f1c5b7bc3d90d8e085ed95ba2ab - React: f36e90f3ceb976546e97df3403e37d226f79d0e3 - React-callinvoker: 18874f621eb96625df7a24a7dc8d6e07391affcd - React-Core: ac3d816b8e3493970153f4aaf0cff18af0bb95e6 - React-CoreModules: 4016d3a4e518bcfc4f5a51252b5a05692ca6f0e1 - React-cxxreact: ffc9129013b87cb36cf3f30a86695a3c397b0f99 - React-jsi: df07aa95b39c5be3e41199921509bfa929ed2b9d - React-jsiexecutor: b56c03e61c0dd5f5801255f2160a815f4a53d451 - React-jsinspector: 8e68ffbfe23880d3ee9bafa8be2777f60b25cbe2 + RCTRequired: 082f10cd3f905d6c124597fd1c14f6f2655ff65e + RCTTypeSafety: 8c9c544ecbf20337d069e4ae7fd9a377aadf504b + React: b0a957a2c44da4113b0c4c9853d8387f8e64e615 + React-callinvoker: c3f44dd3cb195b6aa46621fff95ded79d59043fe + React-Core: d3b2a1ac9a2c13c3bcde712d9281fc1c8a5b315b + React-CoreModules: 0581ff36cb797da0943d424f69e7098e43e9be60 + React-cxxreact: c1480d4fda5720086c90df537ee7d285d4c57ac3 + React-jsi: a0418934cf48f25b485631deb27c64dc40fb4c31 + React-jsiexecutor: 93bd528844ad21dc07aab1c67cb10abae6df6949 + React-jsinspector: 58aef7155bc9a9683f5b60b35eccea8722a4f53a react-native-build-config: 1130ad8668ca251b65e95e002b5b8f308a96726f react-native-camera: 35854c4f764a4a6cf61c1c3525888b92f0fe4b31 react-native-document-picker: d870e0a41510b241d5b764e7a2b5ccf129af7967 @@ -632,23 +609,23 @@ SPEC CHECKSUMS: react-native-slider: e99fc201cefe81270fc9d81714a7a0f5e566b168 react-native-sqlite-storage: 418ef4afc5e6df6ce3574c4617e5f0b65cffde55 react-native-webview: 0aa2cde4ee7e3e1c5fffdf64dbce9c709aa18155 - React-RCTActionSheet: 53ea72699698b0b47a6421cb1c8b4ab215a774aa - React-RCTAnimation: 1befece0b5183c22ae01b966f5583f42e69a83c2 - React-RCTBlob: 0b284339cbe4b15705a05e2313a51c6d8b51fa40 - React-RCTImage: d1756599ebd4dc2cb19d1682fe67c6b976658387 - React-RCTLinking: 9af0a51c6d6a4dd1674daadafffc6d03033a6d18 - React-RCTNetwork: 332c83929cc5eae0b3bbca4add1d668e1fc18bda - React-RCTSettings: d6953772cfd55f2c68ad72b7ef29efc7ec49f773 - React-RCTText: 65a6de06a7389098ce24340d1d3556015c38f746 - React-RCTVibration: 8e9fb25724a0805107fc1acc9075e26f814df454 - ReactCommon: 4167844018c9ed375cc01a843e9ee564399e53c3 + React-RCTActionSheet: 89a0ca9f4a06c1f93c26067af074ccdce0f40336 + React-RCTAnimation: 1bde3ecc0c104c55df246eda516e0deb03c4e49b + React-RCTBlob: a97d378b527740cc667e03ebfa183a75231ab0f0 + React-RCTImage: c1b1f2d3f43a4a528c8946d6092384b5c880d2f0 + React-RCTLinking: 35ae4ab9dc0410d1fcbdce4d7623194a27214fb2 + React-RCTNetwork: 29ec2696f8d8cfff7331fac83d3e893c95ef43ae + React-RCTSettings: 60f0691bba2074ef394f95d4c2265ec284e0a46a + React-RCTText: 5c51df3f08cb9dedc6e790161195d12bac06101c + React-RCTVibration: ae4f914cfe8de7d4de95ae1ea6cc8f6315d73d9d + ReactCommon: 73d79c7039f473b76db6ff7c6b159c478acbbb3b RNCAsyncStorage: b03032fdbdb725bea0bd9e5ec5a7272865ae7398 RNCClipboard: 41d8d918092ae8e676f18adada19104fa3e68495 RNCMaskedView: 5a8ec07677aa885546a0d98da336457e2bea557f RNCPushNotificationIOS: 61a7c72bd1ebad3568025957d001e0f0e7b32191 RNFS: 2bd9eb49dc82fa9676382f0585b992c424cd59df RNGestureHandler: 9b7e605a741412e20e13c512738a31bd1611759b - RNGoogleSignin: ad866d4c4af2651e36801dd3b7771d7715353499 + RNICloudStore: bc6e225811637c09bd1eb055d6cd7448e61cd451 RNKeychain: 840f8e6f13be0576202aefcdffd26a4f54bfe7b5 RNPermissions: 99dd8d4a30ff13509b949ca63cd1f69edc461775 RNReactNativeHapticFeedback: 653a8c126a0f5e88ce15ffe280b3ff37e1fbb285 @@ -658,9 +635,10 @@ SPEC CHECKSUMS: RNSound: da030221e6ac7e8290c6b43f2b5f2133a8e225b0 RNSVG: ce9d996113475209013317e48b05c21ee988d42e RNVectorIcons: bc69e6a278b14842063605de32bec61f0b251a59 - Yoga: 7d13633d129fd179e01b8953d38d47be90db185a + SwiftProtobuf: ed465ed18402f998fd117f631da27e0168e6b59c + Yoga: 4bd86afe9883422a7c4028c00e34790f560923d6 YogaKit: f782866e155069a2cca2517aafea43200b01fd5a -PODFILE CHECKSUM: afb16583a79febb8d0f0fca06f053e4f8c05ed07 +PODFILE CHECKSUM: f1501ba21caa69277e0d2541cd1f0d022211f347 COCOAPODS: 1.10.0 diff --git a/ios/put_Lndmobile.framework_here b/ios/put_Lndmobile.framework_here new file mode 100644 index 000000000..e69de29bb diff --git a/jest.config.js b/jest.config.js index 4398f8d18..534712a9f 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,6 +1,6 @@ module.exports = { preset: 'react-native', - moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], + moduleFileExtensions: ['android.ts', 'android.tsx', 'ts', 'tsx', 'js', 'jsx', 'json', 'node'], transformIgnorePatterns: [ "node_modules/(?!react-native|@shoutem|react-clone-referenced-element|native-base-shoutem-theme|react-native-camera|@react-navigation|react-navigation-tabs|react-navigation|@react-native-community\/async-storage|@react-native-community/slider|@codler\/react-native-keyboard-aware-scroll-view)", ], diff --git a/jestSetup.js b/jestSetup.js index f94922969..35b2da853 100644 --- a/jestSetup.js +++ b/jestSetup.js @@ -26,7 +26,8 @@ jest.mock("./src/utils/constants.ts", () => require("./mocks/utils/constants")); const ReactNative = require("react-native"); ReactNative.NativeModules.LndMobile = {}; -ReactNative.NativeModules.LndMobile.log = jest.fn(); +ReactNative.NativeModules.LndMobileTools = {}; +ReactNative.NativeModules.LndMobileTools.log = jest.fn(); ReactNative.UIManager.configureNext = jest.fn(); ReactNative.UIManager.configureNextLayoutAnimation = jest.fn(); ReactNative.InteractionManager.runAfterInteractions = ((cb) => { diff --git a/mocks/lndmobile/index.ts b/mocks/lndmobile/index.ts index 410dc99b7..4ccf04f06 100644 --- a/mocks/lndmobile/index.ts +++ b/mocks/lndmobile/index.ts @@ -13,7 +13,7 @@ export enum ELndMobileStatusCodes { let LndMobileStatus = 0; -export const init = jest.fn(async (): Promise<{ data: string } | number> => { +export const initialize = jest.fn(async (): Promise<{ data: string } | number> => { await timeout(10); LndMobileStatus += ELndMobileStatusCodes.STATUS_SERVICE_BOUND; // TODO figure out bitmasking... return { data: "" }; diff --git a/package.json b/package.json index 48351b5ac..b4eaa3896 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,6 @@ "scripts": { "start": "react-native run-android --variant chaintestnetNormalDebug --appIdSuffix testnet.debug", "start-metro": "react-native start", - "devtools": "redux-devtools --hostname=192.168.1.100 --port=8000", "test": "jest --silent --roots tests", "test-update-snapshot": "jest --silent --roots tests --updateSnapshot", "gen-proto": "pbjs -t static-module -w es6 --force-long -o proto/proto.js proto/rpc.proto proto/walletunlocker.proto proto/autopilotrpc/autopilot.proto proto/walletrpc/walletkit.proto proto/signrpc/signer.proto proto/routerrpc/router.proto proto/invoicesrpc/invoices.proto && pbts -o proto/proto.d.ts proto/proto.js", @@ -21,11 +20,11 @@ "android:mainnet-fakelnd-debug": "react-native run-android --variant chainmainnetFakelndDebug --appIdSuffix fakelnd.debug", "android:bundle-release": "cd android && ./gradlew clean && ./gradlew bundleChainmainnetNormalRelease && ./gradlew bundleChaintestnetNormalRelease", "ios:regtest-debug": "react-native run-ios --scheme BlixtWalletRegtest --configuration DebugRegtest", - "ios:regtest": "react-native run-ios --scheme BlixtWalletRegtest --configuration Regtest", + "ios:regtest": "react-native run-ios --scheme BlixtWalletRegtest --configuration ReleaseRegtest", "ios:testnet-debug": "react-native run-ios --scheme BlixtWalletTestnet --configuration DebugTestnet", "ios:testnet": "react-native run-ios --scheme BlixtWalletTestnet --configuration ReleaseTestnet", - "ios:mainnet-debug": "react-native run-ios --scheme BlixtWallet --configuration Release", - "ios:mainnet": "react-native run-android --variant chainmainnetNormalRelease", + "ios:mainnet-debug": "react-native run-ios --scheme BlixtWallet --configuration Debug", + "ios:mainnet": "react-native run-ios --scheme BlixtWallet --configuration Release", "ios:mainnet-fakelnd": "react-native run-ios --scheme BlixtWalletFakelnd --configuration ReleaseFakelnd", "ios:mainnet-fakelnd-debug": "react-native run-ios --scheme BlixtWalletFakelnd --configuration DebugFakelnd" }, @@ -60,32 +59,33 @@ "native-base": "2.13.14", "protobufjs": "6.10.2", "react": "17.0.1", - "react-native": "0.63.3", + "react-native": "0.63.4", "react-native-animatable": "1.3.3", "react-native-build-config": "^0.3.2", "react-native-camera": "3.40.0", "react-native-dialogs": "1.1.1", - "react-native-document-picker": "4.1.0", + "react-native-document-picker": "4.2.0", "react-native-easy-grid": "0.2.2", "react-native-enhanced-popup-menu": "^0.7.0", "react-native-fingerprint-scanner": "6.0.0", "react-native-fs": "2.16.6", "react-native-gesture-handler": "1.9.0", "react-native-haptic-feedback": "^1.11.0", + "react-native-icloudstore": "git+https://github.com/manicakes/react-native-icloudstore.git#4c9f668d3121aedf7a5635b0a13f6e3999c0e6f3", "react-native-image-slider-box": "^1.0.12", "react-native-keychain": "4.0.5", "react-native-linear-gradient": "2.5.6", "react-native-maps": "0.27.1", - "react-native-material-menu": "^1.1.3", - "react-native-modal": "11.5.6", - "react-native-paper": "4.4.0", + "react-native-material-menu": "1.2.0", + "react-native-modal": "11.6.1", + "react-native-paper": "4.5.0", "react-native-permissions": "^3.0.0", "react-native-progress": "^4.1.2", "react-native-push-notification": "5.0.1", "react-native-qrcode-svg": "6.0.6", "react-native-reanimated": "1.13.2", "react-native-safe-area-context": "3.1.9", - "react-native-screens": "2.15.0", + "react-native-screens": "2.16.1", "react-native-securerandom": "1.0.0", "react-native-sound": "^0.11.0", "react-native-sqlite-storage": "5.0.0", @@ -94,24 +94,24 @@ "react-native-tab-view": "2.15.2", "react-native-vector-icons": "^7.1.0", "react-native-webln": "0.1.10", - "react-native-webview": "10.10.2", + "react-native-webview": "11.0.2", "secp256k1": "4.0.2", "sha.js": "^2.4.11", - "use-debounce": "5.1.0", + "use-debounce": "5.2.0", "webln": "^0.2.2" }, "devDependencies": { - "@babel/core": "7.12.7", + "@babel/core": "7.12.10", "@babel/runtime": "7.12.5", "@testing-library/react-native": "7.1.0", "@types/base64-js": "1.3.0", "@types/bech32": "1.1.2", "@types/color": "3.0.1", "@types/crypto-js": "4.0.1", - "@types/jest": "26.0.15", + "@types/jest": "26.0.19", "@types/long": "4.0.1", "@types/react": "17.0.0", - "@types/react-native": "0.63.36", + "@types/react-native": "0.63.43", "@types/react-native-push-notification": "5.0.5", "@types/react-native-sqlite-storage": "5.0.0", "@types/react-test-renderer": "17.0.0", @@ -125,12 +125,11 @@ "jetifier": "1.6.6", "metro-react-native-babel-preset": "0.64.0", "react-test-renderer": "16.13.1", - "redux-devtools-cli": "1.0.0-4", "remote-redux-devtools": "^0.5.16", "tslint": "6.1.3", "tslint-config-airbnb": "^5.11.2", "tslint-react": "5.0.0", "tslint-react-native": "0.0.7", - "typescript": "4.1.2" + "typescript": "4.1.3" } } diff --git a/react-native.config.js b/react-native.config.js index 4b31d765f..aca919558 100644 --- a/react-native.config.js +++ b/react-native.config.js @@ -3,6 +3,12 @@ module.exports = { ios: {}, android: {}, }, - dependencies: {}, + dependencies: { + '@react-native-community/google-signin': { + platforms: { + ios: null, + }, + }, + }, assets: ["./assets/fonts/"], -} \ No newline at end of file +} diff --git a/src/App.tsx b/src/App.tsx index 9c600b17d..1eb96dc5f 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -11,6 +11,7 @@ const getTheme = require("../native-base-theme/components").default; const theme = require("../native-base-theme/variables/commonColor").default; import store from "./state/store"; +import SendDone from "./windows/Send/SendDone"; export default function App() { const [debug, setDebug] = useState(__DEV__ ? true : false); diff --git a/src/Main.tsx b/src/Main.tsx index 37438013e..c08d1786b 100644 --- a/src/Main.tsx +++ b/src/Main.tsx @@ -121,8 +121,8 @@ export default function Main() { }, { text: "Restart app", onPress: async () => { - await NativeModules.LndMobile.killLnd(); - NativeModules.LndMobile.restartApp(); + await NativeModules.LndMobileTools.killLnd(); + NativeModules.LndMobileTools.restartApp(); }, }, { text: "Try again", diff --git a/src/components/BlixtWallet.tsx b/src/components/BlixtWallet.tsx new file mode 100644 index 000000000..5c5448b0b --- /dev/null +++ b/src/components/BlixtWallet.tsx @@ -0,0 +1,83 @@ +import { Text } from "native-base"; +import React, { useRef, useState } from "react"; +import { Image, StyleSheet, TouchableWithoutFeedback, View } from "react-native"; +import { Image as AnimatedImage } from 'react-native-animatable'; +import { blixtTheme } from "../../native-base-theme/variables/commonColor"; +import { timeout } from "../utils"; +import { VersionName } from "../utils/build"; + +export default () => { + const blixtLogo = useRef(null); + const [blixtNumPress, setBlixtNumPress] = useState(0); + const [animationActive, setAnimationActive] = useState(false); + + const doAnimation = async () => { + if (!blixtLogo || !blixtLogo.current || animationActive) { + return; + } + + setAnimationActive(true); + if (blixtNumPress === 6) { + blixtLogo.current.zoomOutDown!(2300) + return; + } else { + blixtLogo.current.rubberBand!(1500) + } + + timeout(500).then(() => { + setBlixtNumPress(blixtNumPress + 1); + setAnimationActive(false); + }); + } + + return ( + + + + + + Blixt Wallet + version {VersionName} + + + ) +} + +const style = StyleSheet.create({ + container: { + marginTop: 16, + height: 200, + marginBottom: -13, + justifyContent: "center", + }, + blixtLogo: { + width: 320, + height: 320, + borderRadius: 55, + alignSelf: "center", + margin: 5, + }, + textContainer: { + width: 215, + alignSelf: "center", + }, + blixtTitle: { + fontFamily: blixtTheme.fontMedium, + fontSize: 40, + }, + version: { + textAlign: "right", + marginRight: 5, + fontSize: 10, + }, +}); + +const blixtLogoWebP = "data:image/webp;base64,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"; diff --git a/src/components/BlurModal.tsx b/src/components/BlurModal.tsx index 1ad003c95..dac25e763 100644 --- a/src/components/BlurModal.tsx +++ b/src/components/BlurModal.tsx @@ -3,7 +3,7 @@ import Modal from "react-native-modal"; import { useNavigation } from "@react-navigation/native"; import RealTimeBlur from "../react-native-realtimeblur"; import { KeyboardAvoidingView, View, StyleSheet } from "react-native"; -import { TouchableWithoutFeedback } from "react-native-gesture-handler"; +import { TouchableWithoutFeedback } from "react-native"; export interface ITransactionDetailsProps { children: any; @@ -31,7 +31,7 @@ export default function BlurModal({ children, useModalComponent, goBackByClickin > {!useModal ? - + {children} diff --git a/src/components/Content.tsx b/src/components/Content.tsx index e035e526d..5cb54b3e1 100644 --- a/src/components/Content.tsx +++ b/src/components/Content.tsx @@ -1,7 +1,7 @@ import React, { ReactNode } from "react"; import { Content } from "native-base"; import { StyleProp, ViewStyle, StyleSheet } from "react-native"; -import { ScrollView } from "react-native-gesture-handler"; +import { ScrollView } from "react-native"; export interface IContentProps { children?: ReactNode; diff --git a/src/components/Form.tsx b/src/components/Form.tsx index 56b9aa179..e13fd2acd 100644 --- a/src/components/Form.tsx +++ b/src/components/Form.tsx @@ -3,7 +3,7 @@ import { StyleSheet, KeyboardAvoidingView, StyleProp, ViewStyle, InputAccessoryV import { View, Item, Text, Label, Icon } from "native-base"; import { blixtTheme } from "../../native-base-theme/variables/commonColor"; import { MathPad, IMathPadProps } from "../components/MathPad"; -import { PLATFORM } from "../utils/constants"; +import { MATH_PAD_NATIVEID, MATH_PAD_NATIVE_ID, PLATFORM } from "../utils/constants"; export interface IFormItem { title: string | null; @@ -60,7 +60,7 @@ export default function Form({ buttons, items, style, noticeText, mathPadProps } {PLATFORM === "ios" && - + } diff --git a/src/hooks/useBalance.ts b/src/hooks/useBalance.ts index 952d6aaf9..34ad8db52 100644 --- a/src/hooks/useBalance.ts +++ b/src/hooks/useBalance.ts @@ -85,7 +85,7 @@ export default function useBalance(initialSat?: Long, noConversion = false) { bitcoinUnit: BitcoinUnits[bitcoinUnit], fiatUnit, evalMathExpression(target: "bitcoin" | "fiat") { - const val = evaluateExpression(target === "bitcoin" ? bitcoinValue! : dollarValue!); + const val = evaluateExpression(target === "bitcoin" ? bitcoinValue || "0" : dollarValue || "0"); if (target === "bitcoin") { setBitcoinValue(val); setDollarValue( diff --git a/src/hooks/useFingerprintAuth.ts b/src/hooks/useFingerprintAuth.ts index 97ea865ea..c311b5f93 100644 --- a/src/hooks/useFingerprintAuth.ts +++ b/src/hooks/useFingerprintAuth.ts @@ -21,7 +21,6 @@ export default function useFingerprintAuth(callback: () => void, forceEnabled: b } return () => { fingerprintStopScan(); - // AppState.removeEventListener("change", handler); } }, [fingerprintAvailable, fingerprintEnabled, forceEnabled]); diff --git a/src/lndmobile/LndMobile.d.ts b/src/lndmobile/LndMobile.d.ts index 008f02188..f8e2682ec 100644 --- a/src/lndmobile/LndMobile.d.ts +++ b/src/lndmobile/LndMobile.d.ts @@ -6,29 +6,35 @@ export enum ELndMobileStatusCodes { export interface ILndMobile { // General - init(): Promise; - checkLndMobileServiceConnected(): Promise; - sendPongToLndMobileservice(): Promise<{ data: string }>; - checkStatus(): Promise; - writeConfigFile(): Promise; + initialize(): Promise<{ data: string }>; startLnd(torEnabled: boolean): Promise<{ data: string }> stopLnd(): Promise<{ data: string }>; initWallet(seed: string[], password: string, recoveryWindow: number, channelBackupsBase64: string | null): Promise<{ data: string }>; unlockWallet(password: string): Promise<{ data: string }> + + checkStatus(): Promise; + + // Send gRPC LND API request + sendCommand(method: string, base64Payload: string): Promise<{ data: string }>; + sendStreamCommand(method: string, base64Payload: string, streamOnlyOnce: boolean): Promise<"done">; + + // Android-specific + unbindLndMobileService(): Promise; // TODO(hsjoberg): function looks broken + sendPongToLndMobileservice(): Promise<{ data: string }>; + checkLndMobileServiceConnected(): Promise; +} + +export interface ILndMobileTools { + writeConfigFile(): Promise; killLnd(): Promise; - restartApp(): void; - saveChannelsBackup(base64Backups: string): Promise; log(level: "v" | "d" | "i" | "w" | "e", tag: string, msg: string): void; saveLogs(): Promise; copyLndLog(): Promise; tailLog(numberOfLines: number): Promise; - getTorEnabled(): Promise; observeLndLogFile(): Promise; + saveChannelsBackup(base64Backups: string): Promise; DEBUG_getWalletPasswordFromKeychain(): Promise; - - // Send gRPC LND API request - sendCommand(method: string, base64Payload: string): Promise<{ data: string }>; - sendStreamCommand(method: string, base64Payload: string, streamOnlyOnce: boolean): Promise<"done">; + getTorEnabled(): Promise; // Android-specific getIntentStringData(): Promise; @@ -38,11 +44,29 @@ export interface ILndMobile { DEBUG_listProcesses(): Promise; checkLndProcessExist(): Promise; deleteTLSCerts(): Promise; - unbindLndMobileService(): Promise; // TODO(hsjoberg): function looks broken + restartApp(): void; + + // iOS-specific + checkICloudEnabled(): Promise; + checkApplicationSupportExists(): Promise; + checkLndFolderExists(): Promise; + createIOSApplicationSupportAndLndDirectories(): Promise; + excludeLndICloudBackup(): Promise; + TEMP_moveLndToApplicationSupport(): Promise; +} + +export type WorkInfo = "BLOCKED" | "CANCELLED" | "ENQUEUED" | "FAILED" | "RUNNING" | "SUCCEEDED" | "WORK_NOT_EXIST"; + +export interface ILndMobileScheduledSync { + setupScheduledSyncWork: () => Promise; + removeScheduledSyncWork: () => Promise; + checkScheduledSyncWorkStatus: () => Promise; } declare module "react-native" { interface NativeModulesStatic { LndMobile: ILndMobile; + LndMobileTools: ILndMobileTools; + LndMobileScheduledSync: ILndMobileScheduledSync; } -} \ No newline at end of file +} diff --git a/src/lndmobile/fake/index.ts b/src/lndmobile/fake/index.ts index 9d3bd8617..0ecc22944 100644 --- a/src/lndmobile/fake/index.ts +++ b/src/lndmobile/fake/index.ts @@ -9,13 +9,15 @@ import { TLV_RECORD_NAME } from "../../utils/constants"; import * as base64 from "base64-js"; import payReq from "bolt11"; +const { LndMobileTools } = NativeModules; + let LndMobileStatus = 0; /** * @throws * TODO return values are terrible */ -export const init = async (): Promise<{ data: string } | number> => { +export const initialize = async (): Promise<{ data: string } | number> => { await timeout(10); LndMobileStatus += ELndMobileStatusCodes.STATUS_SERVICE_BOUND; // TODO figure out bitmasking... return { data: "" }; @@ -47,6 +49,45 @@ export const startLnd = async (torEnabled: boolean): Promise => { return "started"; }; +/** + * @throws + */ +export const checkApplicationSupportExists = async () => { + return await LndMobileTools.checkApplicationSupportExists(); +}; + +/** + * @throws + */ +export const checkLndFolderExists = async () => { + return await LndMobileTools.checkLndFolderExists(); +}; + +/** + * @throws + */ +export const createIOSApplicationSupportAndLndDirectories = async () => { + return await LndMobileTools.createIOSApplicationSupportAndLndDirectories(); +}; + +/** + * @throws + */ +export const TEMP_moveLndToApplicationSupport = async () => { + return await LndMobileTools.TEMP_moveLndToApplicationSupport(); +}; + +/** + * @throws + */ +export const excludeLndICloudBackup = async () => { + return await LndMobileTools.excludeLndICloudBackup(); +}; + +export const checkICloudEnabled = async (): Promise => { + return await LndMobileTools.checkICloudEnabled(); +}; + /** * @throws */ diff --git a/src/lndmobile/index.ts b/src/lndmobile/index.ts index 2a9cebdbf..b73ca3872 100644 --- a/src/lndmobile/index.ts +++ b/src/lndmobile/index.ts @@ -5,14 +5,13 @@ import Long from "long"; import sha from "sha.js"; import { stringToUint8Array, hexToUint8Array, decodeTLVRecord } from "../utils"; import { TLV_RECORD_NAME } from "../utils/constants"; -const { LndMobile } = NativeModules; +const { LndMobile, LndMobileTools } = NativeModules; /** * @throws - * TODO return values are terrible */ -export const init = async (): Promise<{ data: string } | number> => { - return await LndMobile.init(); +export const initialize = async (): Promise<{ data: string } | number> => { + return await LndMobile.initialize(); }; export enum ELndMobileStatusCodes { @@ -30,7 +29,7 @@ export const checkStatus = async (): Promise => { * @return string */ export const writeConfigFile = async () => { - return await LndMobile.writeConfigFile(); + return await LndMobileTools.writeConfigFile(); }; /** @@ -40,6 +39,45 @@ export const startLnd = async (torEnabled: boolean): Promise => { return await LndMobile.startLnd(torEnabled); }; +export const checkICloudEnabled = async (): Promise => { + return await LndMobileTools.checkICloudEnabled(); +}; + +/** + * @throws + */ +export const checkApplicationSupportExists = async () => { + return await LndMobileTools.checkApplicationSupportExists(); +}; + +/** + * @throws + */ +export const checkLndFolderExists = async () => { + return await LndMobileTools.checkLndFolderExists(); +}; + +/** + * @throws + */ +export const createIOSApplicationSupportAndLndDirectories = async () => { + return await LndMobileTools.createIOSApplicationSupportAndLndDirectories(); +}; + +/** + * @throws + */ +export const TEMP_moveLndToApplicationSupport = async () => { + return await LndMobileTools.TEMP_moveLndToApplicationSupport(); +}; + +/** + * @throws + */ +export const excludeLndICloudBackup = async () => { + return await LndMobileTools.excludeLndICloudBackup(); +}; + /** * @throws */ @@ -57,6 +95,20 @@ export const connectPeer = async (pubkey: string, host: string): Promise => { + const response = await sendCommand({ + request: lnrpc.DisconnectPeerRequest, + response: lnrpc.DisconnectPeerResponse, + method: "DisconnectPeer", + options: { + pubKey, + }, + }); + return response; +}; /** * @throws @@ -410,7 +462,6 @@ export const listPeers = async (): Promise => { return response; }; - /** * @throws */ diff --git a/src/lndmobile/scheduled-sync.ts b/src/lndmobile/scheduled-sync.ts index 75ec77ed5..915d1ee6d 100644 --- a/src/lndmobile/scheduled-sync.ts +++ b/src/lndmobile/scheduled-sync.ts @@ -1,8 +1,7 @@ import { NativeModules } from "react-native"; +import { WorkInfo } from "./LndMobile"; const { LndMobileScheduledSync } = NativeModules; -export type WorkInfo = "BLOCKED" | "CANCELLED" | "ENQUEUED" | "FAILED" | "RUNNING" | "SUCCEEDED" | "WORK_NOT_EXIST"; - export const checkScheduledSyncWorkStatus = async (): Promise => { return await LndMobileScheduledSync.checkScheduledSyncWorkStatus(); }; \ No newline at end of file diff --git a/src/lndmobile/utils.ts b/src/lndmobile/utils.ts index d5cd29322..2c8d68a78 100644 --- a/src/lndmobile/utils.ts +++ b/src/lndmobile/utils.ts @@ -39,7 +39,7 @@ export const sendCommand = async ({ request, response, method, o try { const instance = request.create(options); const b64 = await LndMobile.sendCommand(method, base64.fromByteArray(request.encode(instance).finish())); - return response.decode(base64.toByteArray(b64.data)); + return response.decode(base64.toByteArray(b64.data || "")); } catch (e) { throw e; } }; diff --git a/src/lndmobile/wallet.ts b/src/lndmobile/wallet.ts index cb2e020af..ffafd88a4 100644 --- a/src/lndmobile/wallet.ts +++ b/src/lndmobile/wallet.ts @@ -4,6 +4,7 @@ import { stringToUint8Array } from "../utils/index"; import * as base64 from "base64-js"; import { lnrpc, walletrpc, signrpc } from "../../proto/proto"; +import { PLATFORM } from "../utils/constants"; const { LndMobile } = NativeModules; @@ -23,7 +24,6 @@ export const genSeed = async (): Promise => { export const initWallet = async (seed: string[], password: string, recoveryWindow?: number, channelBackupsBase64?: string): Promise => { await NativeModules.LndMobile.initWallet(seed, password, recoveryWindow ?? 0, channelBackupsBase64 ?? null); - return; // const options: lnrpc.IInitWalletRequest = { // cipherSeedMnemonic: seed, // walletPassword: stringToUint8Array(password), @@ -123,6 +123,7 @@ export const signMessage = async (keyFamily: number, keyIndex: number, msg: Uint }; // TODO exception? +// TODO move to a more appropiate file? export const subscribeInvoices = async (): Promise => { try { const response = await sendStreamCommand({ diff --git a/src/migration/app-migration.ts b/src/migration/app-migration.ts index 593bae1d8..0d90f5f1d 100644 --- a/src/migration/app-migration.ts +++ b/src/migration/app-migration.ts @@ -2,7 +2,7 @@ import { NativeModules } from "react-native"; import { SQLiteDatabase } from "react-native-sqlite-storage"; import { getWalletCreated, StorageItem, getItemObject, setItemObject, setItem, getItem } from "../storage/app"; import { getPin, getSeed, removeSeed, setSeed, setPin, removePin, setWalletPassword } from "../storage/keystore"; -const { LndMobile } = NativeModules; +const { LndMobile, LndMobileTools } = NativeModules; export interface IAppMigration { beforeLnd: (db: SQLiteDatabase, currentVersion: number) => Promise; @@ -16,14 +16,14 @@ export const appMigration: IAppMigration[] = [ // Version 1 { async beforeLnd(db, i) { - await LndMobile.writeConfigFile(); + await LndMobileTools.writeConfigFile(); }, }, // Version 2 { async beforeLnd(db, i) { await setItemObject(StorageItem.clipboardInvoiceCheck, true); - await LndMobile.writeConfigFile(); + await LndMobileTools.writeConfigFile(); }, }, // Version 3 @@ -39,7 +39,7 @@ export const appMigration: IAppMigration[] = [ { async beforeLnd(db, i) { // Might not be needed: - // const result = await NativeModules.LndMobile.deleteTLSCerts(); + // const result = await NativeModules.LndMobileTools.deleteTLSCerts(); // if (!result) { // throw new Error("Failed to delete TLS certificates"); // } @@ -94,7 +94,7 @@ export const appMigration: IAppMigration[] = [ // Version 11 { async beforeLnd(db, i) { - await LndMobile.writeConfigFile(); + await LndMobileTools.writeConfigFile(); }, }, // Version 12 @@ -118,7 +118,7 @@ export const appMigration: IAppMigration[] = [ // Version 15 { async beforeLnd(db, i) { - await LndMobile.writeConfigFile(); + await LndMobileTools.writeConfigFile(); }, }, // Version 16 @@ -133,7 +133,7 @@ export const appMigration: IAppMigration[] = [ await db.executeSql("ALTER TABLE tx ADD identifiedService TEXT NULL"); await setItemObject(StorageItem.hideExpiredInvoices, true); await setItemObject(StorageItem.lastGoogleDriveBackup, new Date().getTime()); - await LndMobile.writeConfigFile(); + await LndMobileTools.writeConfigFile(); }, }, // Version 18 @@ -148,4 +148,10 @@ export const appMigration: IAppMigration[] = [ await db.executeSql("ALTER TABLE tx ADD note TEXT NULL"); }, }, + // Version 20 + { + async beforeLnd(db, i) { + await setItemObject(StorageItem.lastICloudBackup, new Date().getTime()); + }, + }, ]; \ No newline at end of file diff --git a/src/state/Channel.ts b/src/state/Channel.ts index 952fbf931..28db9c741 100644 --- a/src/state/Channel.ts +++ b/src/state/Channel.ts @@ -9,6 +9,7 @@ import { IStoreInjections } from "./store"; import { IStoreModel } from "../state"; import { IChannelEvent, getChannelEvents, createChannelEvent } from "../storage/database/channel-events"; import { bytesToHexString, uint8ArrayToString } from "../utils"; +import { LndMobileEventEmitter } from "../utils/event-listener"; import logger from "./../utils/log"; const log = logger("Channel"); @@ -99,7 +100,7 @@ export const channel: IChannelModel = { setupChannelUpdateSubscriptions: thunk(async (actions, _2, { getStoreState, getStoreActions, injections }) => { log.i("Starting channel update subscription"); await injections.lndMobile.channel.subscribeChannelEvents(); - DeviceEventEmitter.addListener("SubscribeChannelEvents", async (e: any) => { + LndMobileEventEmitter.addListener("SubscribeChannelEvents", async (e: any) => { if (e.data === "") { log.i("Got e.data empty from SubscribeChannelEvent. Skipping event"); return; @@ -198,7 +199,7 @@ export const channel: IChannelModel = { ]); }); - DeviceEventEmitter.addListener("CloseChannel", async (e: any) => { + LndMobileEventEmitter.addListener("CloseChannel", async (e: any) => { log.i("Event CloseChannel", [e]); await actions.getChannels(); }); @@ -282,7 +283,7 @@ export const channel: IChannelModel = { exportChannelsBackup: thunk(async (_, _2, { injections }) => { const response = await injections.lndMobile.channel.exportAllChannelBackups(); if (response.multiChanBackup && response.multiChanBackup.multiChanBackup) { - const exportResponse = await NativeModules.LndMobile.saveChannelsBackup( + const exportResponse = await NativeModules.LndMobileTools.saveChannelsBackup( base64.fromByteArray(response.multiChanBackup.multiChanBackup) ); return exportResponse; diff --git a/src/state/AndroidDeeplinkManager.ts b/src/state/DeeplinkManager.ts similarity index 80% rename from src/state/AndroidDeeplinkManager.ts rename to src/state/DeeplinkManager.ts index 7be7b4640..241883429 100644 --- a/src/state/AndroidDeeplinkManager.ts +++ b/src/state/DeeplinkManager.ts @@ -8,27 +8,28 @@ import { timeout } from "../utils"; import { LnBech32Prefix } from "../utils/build"; import logger from "./../utils/log"; -const log = logger("AndroidDeeplinkManager"); +import { PLATFORM } from "../utils/constants"; +const log = logger("DeeplinkManager"); -export interface IAndroidDeeplinkManager { - initialize: Thunk; - setupAppStateChangeListener: Thunk; +export interface IDeeplinkManager { + initialize: Thunk; + setupAppStateChangeListener: Thunk; - checkDeeplink: Thunk; - tryInvoice: Thunk; - tryLNUrl: Thunk; - addToCache: Action; + checkDeeplink: Thunk; + tryInvoice: Thunk; + tryLNUrl: Thunk; + addToCache: Action; cache: string[]; } -export const androidDeeplinkManager: IAndroidDeeplinkManager = { +export const deeplinkManager: IDeeplinkManager = { initialize: thunk((actions) => { actions.setupAppStateChangeListener(); // Used for checking for URL intent invocations Linking.addListener("url", async (e: { url: string }) => { - log.i("url eventlistener"); - const result = await actions.checkDeeplink(); + log.i("url eventlistener", [e]); + const result = await actions.checkDeeplink(e.url); console.log(result); if (result) { result(getNavigator()); @@ -50,14 +51,18 @@ export const androidDeeplinkManager: IAndroidDeeplinkManager = { }); }), - checkDeeplink: thunk(async (actions, _, { getState, getStoreState }) => { + checkDeeplink: thunk(async (actions, data, { getState, getStoreState }) => { try { - let data = await Linking.getInitialURL(); - if (data === null) { - data = await NativeModules.LndMobile.getIntentStringData(); + if (data === undefined || data === null) { + data = await Linking.getInitialURL(); } - if (data === null) { - data = await NativeModules.LndMobile.getIntentNfcData(); + if (PLATFORM === "android") { + if (data === null) { + data = await NativeModules.LndMobileTools.getIntentStringData(); + } + if (data === null) { + data = await NativeModules.LndMobileTools.getIntentNfcData(); + } } log.d("Deeplink", [data]); if (data) { diff --git a/src/state/Google.android.ts b/src/state/Google.android.ts new file mode 100644 index 000000000..991352251 --- /dev/null +++ b/src/state/Google.android.ts @@ -0,0 +1,100 @@ +import { Action, action, Thunk, thunk } from "easy-peasy"; +import { GoogleSignin, statusCodes, User } from '@react-native-community/google-signin'; + +import logger from "./../utils/log"; +import { PLATFORM } from "../utils/constants"; +const log = logger("Google"); + +export interface IGoogleDriveToken { + idToken: string; + accessToken: string; +} + +export interface IGoogleModel { + initialize: Thunk; + + signIn: Thunk; + signOut: Thunk; + getTokens: Thunk>; + + setIsSignedIn: Action; + setHasPlayServices: Action; + setUser: Action; + + isSignedIn: boolean; + hasPlayServices: boolean; + user?: User; +}; + +export const google: IGoogleModel = { + initialize: thunk(async (actions) => { + log.i("Initializing", [PLATFORM]); + + GoogleSignin.configure({ + scopes: ["https://www.googleapis.com/auth/drive.appdata"], + }); + + const hasPlayServices = await GoogleSignin.hasPlayServices({ + showPlayServicesUpdateDialog: true, + }); + actions.setHasPlayServices(hasPlayServices); + + if (hasPlayServices) { + try { + const user = await GoogleSignin.signInSilently(); + actions.setIsSignedIn(true); + actions.setUser(user); + } catch (e) { + if (e.code !== statusCodes.SIGN_IN_REQUIRED) { + log.w(`Got unexpected error from GoogleSignin.signInSilently(): ${e.code}`, [e]); + } + } + } + log.d("Done"); + }), + + signIn: thunk(async (actions, _, { getState }) => { + if (!(getState().hasPlayServices)) { + throw new Error("Google Play Services needed to login to Google"); + } + + try { + const user = await GoogleSignin.signIn(); + actions.setUser(user); + actions.setIsSignedIn(true); + } catch (error) { + if (error.code === statusCodes.SIGN_IN_CANCELLED) { + // user cancelled the login flow + } else if (error.code === statusCodes.IN_PROGRESS) { + // operation (e.g. sign in) is in progress already + } else if (error.code === statusCodes.PLAY_SERVICES_NOT_AVAILABLE) { + // play services not available or outdated + } else { + // some other error happened + log.e("Got expected error from GoogleSignin.signIn(): ${e.code}", [error]); + } + return false + } + return true; + }), + + signOut: thunk(async (actions) => { + // await GoogleSignin.revokeAccess(); + await GoogleSignin.signOut(); + actions.setIsSignedIn(false); + }), + + getTokens: thunk(async (_, _2, { getState }) => { + if (!getState().isSignedIn) { + throw new Error("Attempting to call Google.getTokens() when user not logged in"); + } + return await GoogleSignin.getTokens(); + }), + + setIsSignedIn: action((store, payload) => { store.isSignedIn = payload; }), + setHasPlayServices: action((store, payload) => { store.hasPlayServices = payload; }), + setUser: action((store, payload) => { store.user = payload; }), + + isSignedIn: false, + hasPlayServices: false, +} diff --git a/src/state/Google.ts b/src/state/Google.ts index a84ed95a6..f3f549201 100644 --- a/src/state/Google.ts +++ b/src/state/Google.ts @@ -1,5 +1,4 @@ import { Action, action, Thunk, thunk } from "easy-peasy"; -import { GoogleSignin, statusCodes, User } from '@react-native-community/google-signin'; import logger from "./../utils/log"; const log = logger("Google"); @@ -14,79 +13,28 @@ export interface IGoogleModel { signIn: Thunk; signOut: Thunk; - getTokens: Thunk>; + getTokens: Thunk>; setIsSignedIn: Action; setHasPlayServices: Action; - setUser: Action; + setUser: Action; isSignedIn: boolean; hasPlayServices: boolean; - user?: User; + user?: any; }; export const google: IGoogleModel = { initialize: thunk(async (actions) => { - log.d("Initializing"); - GoogleSignin.configure({ - scopes: ["https://www.googleapis.com/auth/drive.appdata"], - }); - - const hasPlayServices = await GoogleSignin.hasPlayServices({ - showPlayServicesUpdateDialog: true, - }); - actions.setHasPlayServices(hasPlayServices); - - if (hasPlayServices) { - try { - const user = await GoogleSignin.signInSilently(); - actions.setIsSignedIn(true); - actions.setUser(user); - } catch (e) { - if (e.code !== statusCodes.SIGN_IN_REQUIRED) { - log.w(`Got unexpected error from GoogleSignin.signInSilently(): ${e.code}`, [e]); - } - } - } - log.d("Done"); }), signIn: thunk(async (actions, _, { getState }) => { - if (!(getState().hasPlayServices)) { - throw new Error("Google Play Services needed to login to Google"); - } - - try { - const user = await GoogleSignin.signIn(); - actions.setUser(user); - actions.setIsSignedIn(true); - } catch (error) { - if (error.code === statusCodes.SIGN_IN_CANCELLED) { - // user cancelled the login flow - } else if (error.code === statusCodes.IN_PROGRESS) { - // operation (e.g. sign in) is in progress already - } else if (error.code === statusCodes.PLAY_SERVICES_NOT_AVAILABLE) { - // play services not available or outdated - } else { - // some other error happened - log.e("Got expected error from GoogleSignin.signIn(): ${e.code}", [error]); - } - return false - } - return true; }), signOut: thunk(async (actions) => { - // await GoogleSignin.revokeAccess(); - await GoogleSignin.signOut(); - actions.setIsSignedIn(false); }), getTokens: thunk(async (_, _2, { getState }) => { - if (!getState().isSignedIn) { - throw new Error("Attempting to call Google.getTokens() when user not logged in"); - } - return await GoogleSignin.getTokens(); }), setIsSignedIn: action((store, payload) => { store.isSignedIn = payload; }), @@ -95,4 +43,4 @@ export const google: IGoogleModel = { isSignedIn: false, hasPlayServices: false, -} \ No newline at end of file +} diff --git a/src/state/ICloudBackup.ts b/src/state/ICloudBackup.ts new file mode 100644 index 000000000..7a0e7af85 --- /dev/null +++ b/src/state/ICloudBackup.ts @@ -0,0 +1,111 @@ +import { DeviceEventEmitter } from "react-native"; +import { Action, action, Thunk, thunk } from "easy-peasy"; +import * as base64 from "base64-js"; +import { differenceInDays } from "date-fns"; +import iCloudStorage from "react-native-icloudstore"; + +import { IStoreInjections } from "./store"; +import { IStoreModel } from "../state"; +import { waitUntilTrue, timeout } from "../utils"; +import { Chain, Debug, Flavor } from "../utils/build"; +import { getItemObject, StorageItem, setItemObject } from "../storage/app"; + +import logger from "./../utils/log"; +const log = logger("ICloudBackup"); + +export const ICLOUD_BACKUP_KEY = `blixt-wallet-backup-${Chain}${Debug ? "-debug" : ""}${Flavor ? `-${Flavor}` : ""}`; + +export interface IICloudBackupModel { + initialize: Thunk; + + setupChannelUpdateSubscriptions: Thunk; + makeBackup: Thunk; + getBackup: Thunk>; + + setChannelUpdateSubscriptionStarted: Action; + setICloudActive: Action; + + channelUpdateSubscriptionStarted: boolean; + iCloudActive: boolean; // Whether iCloud is active on the system +}; + +export const iCloudBackup: IICloudBackupModel = { + initialize: thunk(async (actions, _, { getState, getStoreState, injections }) => { + log.d("Initializing"); + if (!getState().channelUpdateSubscriptionStarted) { + await actions.setupChannelUpdateSubscriptions(); + } + + const iCloudActive = await injections.lndMobile.index.checkICloudEnabled(); + log.i("iCloudActive", [iCloudActive]); + actions.setICloudActive(iCloudActive); + + // Automatically backup every 3 days + // tslint:disable-next-line: no-floating-promises + (async () => { + if (getStoreState().settings.iCloudBackupEnabled) { + try { + let lastICloudBackup = await getItemObject(StorageItem.lastICloudBackup); + log.d("lastICloudBackup", [lastICloudBackup]); + lastICloudBackup = lastICloudBackup - (60 * 60 * 24 * 1000); + const currentDate = new Date().getTime(); + const diff = differenceInDays(currentDate, lastICloudBackup); + if (diff >= 3) { + log.i(">= 3 days since last iCloud backup"); + await waitUntilTrue(() => getStoreState().lightning.rpcReady); + await timeout(2500); + await actions.makeBackup(); + await setItemObject(StorageItem.lastICloudBackup, currentDate); + } + } catch (error) { + log.e("Error while doing auto backup", [error]); + } + } + })(); + + log.d("Done"); + }), + + setupChannelUpdateSubscriptions: thunk((actions, _2, { getStoreState, injections }) => { + log.i("Starting channel update subscription for iCloud channel backup"); + + DeviceEventEmitter.addListener("SubscribeChannelEvents", async (e: any) => { + if (!getStoreState().settings.iCloudBackupEnabled) { + return; + } + log.d("Received SubscribeChannelEvents"); + const decodeChannelEvent = injections.lndMobile.channel.decodeChannelEvent; + const channelEvent = decodeChannelEvent(e.data); + if (channelEvent.openChannel || channelEvent.closedChannel) { + log.i("New channel event received, starting new iCloud backup"); + await actions.makeBackup(); + } + }); + actions.setChannelUpdateSubscriptionStarted(true); + }), + + makeBackup: thunk(async (_, _2, { injections }) => { + const exportAllChannelBackups = injections.lndMobile.channel.exportAllChannelBackups; + const backup = await exportAllChannelBackups(); + const backupsB64 = base64.fromByteArray(backup.multiChanBackup!.multiChanBackup!); + await iCloudStorage.setItem(ICLOUD_BACKUP_KEY, backupsB64); + + const remoteStoredBackupsB64 = await iCloudStorage.getItem(ICLOUD_BACKUP_KEY); + if (remoteStoredBackupsB64 !== backupsB64) { + log.i("iCloud storage missmatch, local, remote:", [backupsB64, remoteStoredBackupsB64]) + throw new Error("Could not save iCloud backup"); + } + + log.i("Backing up channels to iCloud succeeded"); + }), + + getBackup: thunk(async () => { + return await iCloudStorage.getItem(ICLOUD_BACKUP_KEY); + }), + + setChannelUpdateSubscriptionStarted: action((state, payload) => { state.channelUpdateSubscriptionStarted = payload; }), + setICloudActive: action((state, payload) => { state.iCloudActive = payload; }), + + channelUpdateSubscriptionStarted: false, + iCloudActive: false, +} \ No newline at end of file diff --git a/src/state/LNURL.ts b/src/state/LNURL.ts index b560e5653..80ce58989 100644 --- a/src/state/LNURL.ts +++ b/src/state/LNURL.ts @@ -12,6 +12,7 @@ import Long from "long"; import { DeviceEventEmitter } from "react-native"; import { lnrpc } from "../../proto/proto"; import { deriveKey, signMessage } from "../lndmobile/wallet"; +import { LndMobileEventEmitter } from "../utils/event-listener"; const log = logger("LNURL"); @@ -319,7 +320,7 @@ export const lnUrl: ILNUrlModel = { if (lnUrlStr && type === "withdrawRequest" && lnUrlObject && lnUrlObject.tag === "withdrawRequest") { // 5. Once accepted by the user, LN WALLET sends a GET to LN SERVICE in the form of ?k1=&pr= - const listener = DeviceEventEmitter.addListener("SubscribeInvoices", async (e) => { + const listener = LndMobileEventEmitter.addListener("SubscribeInvoices", async (e) => { log.d("SubscribeInvoices event", [e]); listener.remove(); diff --git a/src/state/Lightning.ts b/src/state/Lightning.ts index 522179594..7a1c6e870 100644 --- a/src/state/Lightning.ts +++ b/src/state/Lightning.ts @@ -1,4 +1,3 @@ -import { DeviceEventEmitter, Alert } from "react-native"; import { Action, action, Thunk, thunk, Computed, computed } from "easy-peasy"; import { differenceInDays } from "date-fns"; @@ -11,12 +10,23 @@ import { toast, timeout } from "../utils"; import { Chain } from "../utils/build"; import { getWalletPassword } from "../storage/keystore"; import { PLATFORM } from "../utils/constants"; +import { LndMobileEventEmitter } from "../utils/event-listener"; import logger from "./../utils/log"; const log = logger("Lightning"); const SYNC_UNLOCK_WALLET = false; +interface ILightningPeer { + peer: lnrpc.Peer; + node?: lnrpc.LightningNode; +} + +interface ISetLightningPeersPayload { + peer: lnrpc.IPeer; + node?: lnrpc.ILightningNode; +} + export interface ILightningModel { initialize: Thunk; @@ -27,6 +37,8 @@ export interface ILightningModel { waitForChainSync: Thunk; waitForGraphSync: Thunk; setupAutopilot: Thunk; + getLightningPeers: Thunk; + disconnectPeer: Thunk; setNodeInfo: Action; setRPCServerReady: Action; @@ -35,6 +47,7 @@ export interface ILightningModel { setSyncedToGraph: Action; setFirstSync: Action; setAutopilotSet: Action; + setLightningPeers: Action setBestBlockheight: Action; @@ -45,6 +58,7 @@ export interface ILightningModel { ready: boolean; firstSync: boolean; autopilotSet?: boolean; + lightningPeers: ILightningPeer[]; bestBlockheight?: number; initialKnownBlockheight?: number; @@ -61,7 +75,8 @@ export const lightning: ILightningModel = { // When the RPC server is ready // WalletUnlocked event will be emitted log.v("Starting WalletUnlocked event listener"); - DeviceEventEmitter.addListener("WalletUnlocked", async () => { + + LndMobileEventEmitter.addListener("WalletUnlocked", async () => { debugShowStartupInfo && toast("RPC server ready time: " + (new Date().getTime() - start.getTime()) / 1000 + "s", 1000); actions.setRPCServerReady(true); try { @@ -178,9 +193,7 @@ export const lightning: ILightningModel = { ]); await dispatch.notificationManager.initialize(); await dispatch.clipboardManager.initialize(); - if (PLATFORM === "android") { - await dispatch.androidDeeplinkManager.initialize(); - } + await dispatch.deeplinkManager.initialize(); } catch (e) { toast(e.message, 0, "danger", "OK"); return; @@ -198,7 +211,7 @@ export const lightning: ILightningModel = { }), setupAutopilot: thunk(async (actions, enabled, { injections }) => { - console.log("Setting up Autopilot"); + log.i("Setting up Autopilot"); const modifyStatus = injections.lndMobile.autopilot.modifyStatus; const status = injections.lndMobile.autopilot.status; @@ -227,6 +240,40 @@ export const lightning: ILightningModel = { } while (true); }), + getLightningPeers: thunk(async (actions, _, { injections }) => { + const listPeers = injections.lndMobile.index.listPeers; + const getNodeInfo = injections.lndMobile.index.getNodeInfo; + + const response = await listPeers(); + + const lightningPeers = await Promise.all(response.peers.map(async (ipeer) => { + let nodeInfo = undefined; + try { + nodeInfo = await getNodeInfo(ipeer.pubKey ?? ""); + } catch(e) { console.log(e) } + return { + peer: ipeer, + node: nodeInfo?.node ?? undefined, + } + })); + + const sortedPeers = lightningPeers.sort((lightningNode, lightningNode2) => { + if (lightningNode.peer.pubKey! < lightningNode2.peer.pubKey!) { + return -1; + } else if (lightningNode.peer.pubKey! > lightningNode2.peer.pubKey!){ + return 1; + } + return 0; + }); + + actions.setLightningPeers(sortedPeers); + }), + + disconnectPeer: thunk(async (_, pubkey, { injections }) => { + const disconnectPeer = injections.lndMobile.index.disconnectPeer; + return await disconnectPeer(pubkey); + }), + getInfo: thunk(async (actions, _, { injections }) => { const { getInfo } = injections.lndMobile.index; const info = await getInfo(); @@ -308,6 +355,12 @@ export const lightning: ILightningModel = { setSyncedToGraph: action((state, payload) => { state.syncedToGraph = payload; }), setFirstSync: action((state, payload) => { state.firstSync = payload; }), setAutopilotSet: action((state, payload) => { state.autopilotSet = payload; }), + setLightningPeers: action((state, payload) => { + state.lightningPeers = payload.map((p) => ({ + peer: lnrpc.Peer.create(p.peer), + node: lnrpc.LightningNode.create(p.node), + })); + }), setBestBlockheight: action((state, payload) => { state.bestBlockheight = payload; }), @@ -317,6 +370,7 @@ export const lightning: ILightningModel = { syncedToGraph: computed((state) => (state.nodeInfo?.syncedToGraph) ?? false), firstSync: false, bestBlockheight: undefined, + lightningPeers: [], }; const getNodeScores = async () => { diff --git a/src/state/LndMobileInjection.ts b/src/state/LndMobileInjection.ts index 2425bf870..a8736fdb3 100644 --- a/src/state/LndMobileInjection.ts +++ b/src/state/LndMobileInjection.ts @@ -1,16 +1,24 @@ import { - init, + initialize, writeConfigFile, checkStatus, startLnd, + checkICloudEnabled, + checkApplicationSupportExists, + checkLndFolderExists, + createIOSApplicationSupportAndLndDirectories, + TEMP_moveLndToApplicationSupport, + excludeLndICloudBackup, addInvoice, cancelInvoice, connectPeer, + disconnectPeer, decodePayReq, getNodeInfo, getInfo, lookupInvoice, + listPeers, readLndLog, sendPaymentSync, sendPaymentV2Sync, @@ -52,25 +60,33 @@ import { setScores, } from "../lndmobile/autopilot"; import { - checkScheduledSyncWorkStatus, WorkInfo + checkScheduledSyncWorkStatus } from "../lndmobile/scheduled-sync"; // TODO(hsjoberg): This could be its own injection "LndMobileScheduledSync" -import { lnrpc, signrpc, invoicesrpc } from "../../proto/proto"; -import { autopilotrpc } from "../../proto/proto-autopilot"; +import { lnrpc, signrpc, invoicesrpc, autopilotrpc } from "../../proto/proto"; +import { WorkInfo } from "../lndmobile/LndMobile"; export interface ILndMobileInjections { index: { - init: () => Promise<{ data: string } | number>; + initialize: () => Promise<{ data: string } | number>; writeConfigFile: () => Promise; checkStatus: () => Promise; startLnd: (torEnabled: boolean) => Promise; + checkICloudEnabled: () => Promise; + checkApplicationSupportExists: () => Promise; + checkLndFolderExists: () => Promise; + createIOSApplicationSupportAndLndDirectories: () => Promise; + TEMP_moveLndToApplicationSupport: () => Promise; + excludeLndICloudBackup: () => Promise; addInvoice: (amount: number, memo: string, expiry?: number) => Promise; cancelInvoice: (paymentHash: string) => Promise connectPeer: (pubkey: string, host: string) => Promise; + disconnectPeer: (pubkey: string) => Promise; decodePayReq: (bolt11: string) => Promise; getInfo: () => Promise; getNodeInfo: (pubKey: string) => Promise; lookupInvoice: (rHash: string) => Promise; + listPeers: () => Promise; readLndLog: () => Promise; sendPaymentSync: (paymentRequest: string, amount?: Long, tlvRecordName?: string | null) => Promise; sendPaymentV2Sync: (paymentRequest: string, amount?: Long, tlvRecordName?: string | null) => Promise; @@ -117,18 +133,26 @@ export interface ILndMobileInjections { export default { index: { - init, + initialize, writeConfigFile, checkStatus, startLnd, + checkICloudEnabled, + checkApplicationSupportExists, + checkLndFolderExists, + createIOSApplicationSupportAndLndDirectories, + TEMP_moveLndToApplicationSupport, + excludeLndICloudBackup, addInvoice, cancelInvoice, connectPeer, + disconnectPeer, decodePayReq, getNodeInfo, getInfo, lookupInvoice, + listPeers, readLndLog, sendPaymentSync, sendPaymentV2Sync, diff --git a/src/state/LndMobileInjectionFake.ts b/src/state/LndMobileInjectionFake.ts index 8bb4575d7..07a67ddff 100644 --- a/src/state/LndMobileInjectionFake.ts +++ b/src/state/LndMobileInjectionFake.ts @@ -1,16 +1,24 @@ import { - init, + initialize, writeConfigFile, checkStatus, startLnd, + checkICloudEnabled, + checkApplicationSupportExists, + checkLndFolderExists, + createIOSApplicationSupportAndLndDirectories, + TEMP_moveLndToApplicationSupport, + excludeLndICloudBackup, addInvoice, cancelInvoice, connectPeer, + // TODO disconnectPeer decodePayReq, getNodeInfo, getInfo, lookupInvoice, + // TODO listPeers readLndLog, sendPaymentSync, sendPaymentV2Sync, @@ -54,15 +62,20 @@ import { import { checkScheduledSyncWorkStatus, WorkInfo } from "../lndmobile/fake/scheduled-sync"; // TODO(hsjoberg): This could be its own injection "LndMobileScheduledSync" -import { lnrpc, signrpc, invoicesrpc } from "../../proto/proto"; -import { autopilotrpc } from "../../proto/proto-autopilot"; +import { lnrpc, signrpc, invoicesrpc, autopilotrpc } from "../../proto/proto"; export interface ILndMobileInjections { index: { - init: () => Promise<{ data: string } | number>; + initialize: () => Promise<{ data: string } | number>; writeConfigFile: () => Promise; checkStatus: () => Promise; startLnd: (torEnabled: boolean) => Promise; + checkICloudEnabled: () => Promise; + checkApplicationSupportExists: () => Promise; + checkLndFolderExists: () => Promise; + createIOSApplicationSupportAndLndDirectories: () => Promise; + TEMP_moveLndToApplicationSupport: () => Promise; + excludeLndICloudBackup: () => Promise; addInvoice: (amount: number, memo: string, expiry?: number) => Promise; cancelInvoice: (paymentHash: string) => Promise @@ -117,10 +130,16 @@ export interface ILndMobileInjections { export default { index: { - init, + initialize, writeConfigFile, checkStatus, startLnd, + checkICloudEnabled, + checkApplicationSupportExists, + checkLndFolderExists, + createIOSApplicationSupportAndLndDirectories, + TEMP_moveLndToApplicationSupport, + excludeLndICloudBackup, addInvoice, cancelInvoice, diff --git a/src/state/NotificationManager.ts b/src/state/NotificationManager.ts index 3c5f5e902..795361f9e 100644 --- a/src/state/NotificationManager.ts +++ b/src/state/NotificationManager.ts @@ -35,15 +35,18 @@ export const notificationManager: INotificationManagerModel = { PushNotification.configure({ requestPermissions: false, onNotification: ((notification) => { - log.i("onNotification"); + log.i("onNotification", [notification]); - if (notification.message.toString().includes("on-chain")) { - log.i("Navigating to OnChainTransactionLog"); - navigate("OnChain", { screen: "OnChainTransactionLog"}); - } - else if (notification.message.toString().toLocaleLowerCase().includes("payment channel")) { - log.i("Navigating to LightningInfo"); - navigate("LightningInfo"); + // TODO(hsjoberg): ios notification deeplinking + if (PLATFORM === "android") { + if (notification.message.toString().includes("on-chain")) { + log.i("Navigating to OnChainTransactionLog"); + navigate("OnChain", { screen: "OnChainTransactionLog"}); + } + else if (notification.message.toString().toLocaleLowerCase().includes("payment channel")) { + log.i("Navigating to LightningInfo"); + navigate("LightningInfo"); + } } }), }); @@ -61,4 +64,4 @@ export const notificationManager: INotificationManagerModel = { }); } }), -}; \ No newline at end of file +}; diff --git a/src/state/OnChain.ts b/src/state/OnChain.ts index 9c12ef194..9e6aacccd 100644 --- a/src/state/OnChain.ts +++ b/src/state/OnChain.ts @@ -8,6 +8,7 @@ import { lnrpc } from "../../proto/proto"; import logger from "./../utils/log"; import { decodeSubscribeTransactionsResult } from "../lndmobile/onchain"; +import { LndMobileEventEmitter } from "../utils/event-listener"; const log = logger("OnChain"); export interface IBlixtTransaction extends lnrpc.ITransaction { @@ -78,7 +79,7 @@ export const onChain: IOnChainModel = { } else { await injections.lndMobile.onchain.subscribeTransactions(); - DeviceEventEmitter.addListener("SubscribeTransactions", async (e: any) => { + LndMobileEventEmitter.addListener("SubscribeTransactions", async (e: any) => { log.d("Event SubscribeTransactions", [e]); if (e.data === "") { log.i("Got e.data empty from SubscribeTransactions. Skipping transaction"); diff --git a/src/state/Receive.ts b/src/state/Receive.ts index acda13890..c3d54ae89 100644 --- a/src/state/Receive.ts +++ b/src/state/Receive.ts @@ -11,6 +11,7 @@ import { valueFiat, formatBitcoin } from "../utils/bitcoin-units"; import { timeout, uint8ArrayToString, decodeTLVRecord, bytesToHexString, toast } from "../utils"; import { TLV_RECORD_NAME } from "../utils/constants"; import { identifyService } from "../utils/lightning-services"; +import { LndMobileEventEmitter } from "../utils/event-listener"; import logger from "./../utils/log"; const log = logger("Receive"); @@ -107,7 +108,7 @@ export const receive: IReceiveModel = { log.d("Receive.subscribeInvoice() called when subsription already started"); return; } - const invoiceSubscription = DeviceEventEmitter.addListener("SubscribeInvoices", async (e: any) => { + const invoiceSubscription = LndMobileEventEmitter.addListener("SubscribeInvoices", async (e: any) => { try { log.i("New invoice event"); if (e.data === "") { diff --git a/src/state/ScheduledSync.ts b/src/state/ScheduledSync.ts index a3abc3796..991832dbf 100644 --- a/src/state/ScheduledSync.ts +++ b/src/state/ScheduledSync.ts @@ -1,7 +1,7 @@ import { NativeModules } from "react-native" import { Action, action, Thunk, thunk, computed, Computed } from "easy-peasy"; import { StorageItem, getItemObject } from "../storage/app"; -import { WorkInfo } from "../lndmobile/scheduled-sync"; +import { WorkInfo } from "../lndmobile/LndMobile"; import { IStoreInjections } from "./store"; import { PLATFORM } from "../utils/constants"; @@ -29,7 +29,7 @@ export interface IScheduledSyncModel { export const scheduledSync: IScheduledSyncModel = { initialize: thunk(async (actions) => { if (PLATFORM !== "android") { - log.w("initialize(): Platform does not support scheduled sync yet"); + log.i("initialize(): Platform does not support scheduled sync yet"); return; } await actions.retrieveSyncInfo(); diff --git a/src/state/Security.ts b/src/state/Security.ts index a0247fb25..2374c1032 100644 --- a/src/state/Security.ts +++ b/src/state/Security.ts @@ -1,5 +1,5 @@ import { Action, action, Thunk, thunk, Computed, computed } from "easy-peasy"; -import FingerprintScanner from "react-native-fingerprint-scanner"; +import FingerprintScanner, { Biometrics } from "react-native-fingerprint-scanner"; import { StorageItem, getItemObject, setItemObject, removeItem } from "../storage/app"; import { Alert, AppState } from "react-native"; @@ -29,13 +29,14 @@ export interface ISecurityModel { setLoggedIn: Action; setLoginMethods: Action>; setSeedAvailable: Action; - setFingerprintAvailable: Action; + setSensor: Action; loggedIn: boolean; loginMethods: Set; seedAvailable: boolean; - fingerprintAvailable: boolean; + fingerprintAvailable: Computed; fingerprintEnabled: Computed; + sensor: Biometrics | null; } export const security: ISecurityModel = { @@ -46,8 +47,8 @@ export const security: ISecurityModel = { actions.setLoggedIn(loginMethods.size === 0); actions.setSeedAvailable(await getItemObject(StorageItem.seedStored) || false); try { - const sensorAvailable = await FingerprintScanner.isSensorAvailable(); - actions.setFingerprintAvailable(sensorAvailable === "Biometrics"); + const sensor = await FingerprintScanner.isSensorAvailable(); + actions.setSensor(sensor); } catch (e) { log.d("Error checking fingerprint availability", [e]); } @@ -145,12 +146,12 @@ export const security: ISecurityModel = { setLoggedIn: action((store, payload) => { store.loggedIn = payload; }), setLoginMethods: action((store, payload) => { store.loginMethods = payload; }), setSeedAvailable: action((store, payload) => { store.seedAvailable = payload; }), - setFingerprintAvailable: action((store, payload) => { store.fingerprintAvailable = payload; }), + setSensor: action((store, payload) => { store.sensor = payload; }), loginMethods: new Set([]), loggedIn: false, seedAvailable: false, - fingerprintAvailable: false, + fingerprintAvailable: computed((store) => store.sensor !== null), fingerprintEnabled: computed((store) => store.loginMethods.has(LoginMethods.fingerprint)), + sensor: null, }; - diff --git a/src/state/Settings.ts b/src/state/Settings.ts index ff07a23d0..b1cf9db79 100644 --- a/src/state/Settings.ts +++ b/src/state/Settings.ts @@ -37,6 +37,7 @@ export interface ISettingsModel { changeTorEnabled: Thunk; changeHideExpiredInvoices: Thunk; changeScreenTransitionsEnabled: Thunk; + changeICloudBackupEnabled: Thunk; setBitcoinUnit: Action; setFiatUnit: Action; @@ -56,6 +57,7 @@ export interface ISettingsModel { setTorEnabled: Action; setHideExpiredInvoices: Action; setScreenTransitionsEnabled: Action; + setICloudBackupEnabled: Action; bitcoinUnit: keyof IBitcoinUnits; fiatUnit: keyof IFiatRates; @@ -75,6 +77,7 @@ export interface ISettingsModel { torEnabled: boolean; hideExpiredInvoices: boolean; screenTransitionsEnabled: boolean; + iCloudBackupEnabled: boolean; } export const settings: ISettingsModel = { @@ -98,6 +101,7 @@ export const settings: ISettingsModel = { actions.setTorEnabled(await getItemObject(StorageItem.torEnabled) || false); actions.setHideExpiredInvoices(await getItemObject(StorageItem.hideExpiredInvoices) || false); actions.setScreenTransitionsEnabled(await getItemObject(StorageItem.screenTransitionsEnabled) ?? true); + actions.setICloudBackupEnabled(await getItemObject(StorageItem.iCloudBackupEnabled ?? false)); log.d("Done"); }), @@ -195,6 +199,11 @@ export const settings: ISettingsModel = { actions.setScreenTransitionsEnabled(payload); }), + changeICloudBackupEnabled: thunk(async (actions, payload) => { + await setItemObject(StorageItem.iCloudBackupEnabled, payload); + actions.setICloudBackupEnabled(payload); + }), + setBitcoinUnit: action((state, payload) => { state.bitcoinUnit = payload; }), setFiatUnit: action((state, payload) => { state.fiatUnit = payload; }), setName: action((state, payload) => { state.name = payload; }), @@ -213,6 +222,7 @@ export const settings: ISettingsModel = { setTorEnabled: action((state, payload) => { state.torEnabled = payload; }), setHideExpiredInvoices: action((state, payload) => { state.hideExpiredInvoices = payload; }), setScreenTransitionsEnabled: action((state, payload) => { state.screenTransitionsEnabled = payload; }), + setICloudBackupEnabled: action((state, payload) => { state.iCloudBackupEnabled = payload; }), bitcoinUnit: "bitcoin", fiatUnit: "USD", @@ -232,4 +242,5 @@ export const settings: ISettingsModel = { torEnabled: false, hideExpiredInvoices: false, screenTransitionsEnabled: true, + iCloudBackupEnabled: false, }; diff --git a/src/state/index.ts b/src/state/index.ts index 21a4579eb..ee01364ab 100644 --- a/src/state/index.ts +++ b/src/state/index.ts @@ -20,9 +20,10 @@ import { ILNUrlModel, lnUrl } from "./LNURL"; import { IGoogleModel, google } from "./Google"; import { IGoogleDriveBackupModel, googleDriveBackup } from "./GoogleDriveBackup"; import { IWebLNModel, webln } from "./WebLN"; -import { IAndroidDeeplinkManager, androidDeeplinkManager } from "./AndroidDeeplinkManager"; +import { IDeeplinkManager, deeplinkManager } from "./DeeplinkManager"; import { INotificationManagerModel, notificationManager } from "./NotificationManager"; import { ILightNameModel, lightName } from "./LightName"; +import { IICloudBackupModel, iCloudBackup } from "./ICloudBackup"; import { ELndMobileStatusCodes } from "../lndmobile/index"; import { clearApp, setupApp, getWalletCreated, StorageItem, getItem as getItemAsyncStorage, getItemObject as getItemObjectAsyncStorage, setItemObject, setItem, getAppVersion, setAppVersion } from "../storage/app"; @@ -87,9 +88,10 @@ export interface IStoreModel { google: IGoogleModel; googleDriveBackup: IGoogleDriveBackupModel; webln: IWebLNModel; - androidDeeplinkManager: IAndroidDeeplinkManager; + deeplinkManager: IDeeplinkManager; notificationManager: INotificationManagerModel; lightName: ILightNameModel; + iCloudBackup: IICloudBackupModel; walletSeed?: string[]; appVersion: number; @@ -106,16 +108,34 @@ export const model: IStoreModel = { log.v("initializeApp()"); - const { init, writeConfigFile, checkStatus, startLnd } = injections.lndMobile.index; + const { initialize, writeConfigFile, checkStatus, startLnd } = injections.lndMobile.index; const db = await openDatabase(); actions.setDb(db); if (!await getItemObjectAsyncStorage(StorageItem.app)) { log.i("Initializing app for the first time"); + if (PLATFORM === "ios") { + log.i("Creating Application Support and lnd directories"); + await injections.lndMobile.index.createIOSApplicationSupportAndLndDirectories(); + log.i("Excluding lnd directory from backup") + await injections.lndMobile.index.excludeLndICloudBackup(); + } + await setupApp(); log.i("Initializing db for the first time"); await setupInitialSchema(db); log.i("Writing lnd.conf"); await writeConfigFile(); + } else { + // Temporarily dealing with moving lnd to "Application Support" folder + if (PLATFORM === "ios") { + if (!(await injections.lndMobile.index.checkLndFolderExists())) { + log.i("Moving lnd from Documents to Application Support"); + await injections.lndMobile.index.createIOSApplicationSupportAndLndDirectories(); + await injections.lndMobile.index.TEMP_moveLndToApplicationSupport(); + log.i("Excluding lnd directory from backup") + await injections.lndMobile.index.excludeLndICloudBackup() + } + } } actions.setAppVersion(await getAppVersion()); await actions.checkAppVersionMigration(); @@ -132,10 +152,9 @@ export const model: IStoreModel = { await NativeModules.BlixtTor.startTor(); // FIXME } - log.v("Running LndMobile init()"); - const initReturn = await init(); - log.v("init done"); - log.d("init", [initReturn]); + log.v("Running LndMobile.initialize()"); + const initReturn = await initialize(); + log.v("initialize done", [initReturn]); const status = await checkStatus(); if (!getState().walletCreated && (status & ELndMobileStatusCodes.STATUS_PROCESS_STARTED) !== ELndMobileStatusCodes.STATUS_PROCESS_STARTED) { @@ -155,6 +174,8 @@ export const model: IStoreModel = { if (PLATFORM === "android") { await dispatch.google.initialize(); await dispatch.googleDriveBackup.initialize(); + } else if (PLATFORM === "ios") { + await dispatch.iCloudBackup.initialize(); } await dispatch.transaction.getTransactions(); await dispatch.channel.setupCachedBalance(); @@ -270,9 +291,10 @@ export const model: IStoreModel = { google, googleDriveBackup, webln, - androidDeeplinkManager, + deeplinkManager, notificationManager, lightName, + iCloudBackup, }; export default model; diff --git a/src/storage/app.ts b/src/storage/app.ts index a4ac68a4c..2b2d5311c 100644 --- a/src/storage/app.ts +++ b/src/storage/app.ts @@ -40,6 +40,8 @@ export enum StorageItem { // const enums not supported in Babel 7... hideExpiredInvoices = "hideExpiredInvoices", lastGoogleDriveBackup = "lastGoogleDriveBackup", screenTransitionsEnabled = "screenTransitionsEnabled", + iCloudBackupEnabled = "iCloudBackupEnabled", + lastICloudBackup = "lastICloudBackup", } export const setItem = async (key: StorageItem, value: string) => await AsyncStorage.setItem(key, value); @@ -92,6 +94,8 @@ export const clearApp = async () => { removeItem(StorageItem.hideExpiredInvoices), removeItem(StorageItem.lastGoogleDriveBackup), removeItem(StorageItem.screenTransitionsEnabled), + removeItem(StorageItem.iCloudBackupEnabled), + removeItem(StorageItem.lastICloudBackup), ]); }; @@ -127,5 +131,7 @@ export const setupApp = async () => { setItemObject(StorageItem.hideExpiredInvoices, false), setItemObject(StorageItem.lastGoogleDriveBackup, new Date().getTime()), setItemObject(StorageItem.screenTransitionsEnabled, true), + setItemObject(StorageItem.iCloudBackupEnabled, false), + setItemObject(StorageItem.lastICloudBackup, new Date().getTime()), ]); }; \ No newline at end of file diff --git a/src/storage/keystore.ts b/src/storage/keystore.ts index e4c127274..3bcb1c2de 100644 --- a/src/storage/keystore.ts +++ b/src/storage/keystore.ts @@ -2,7 +2,7 @@ import * as Keychain from 'react-native-keychain'; const USER = 'blixt'; -export const setItem = async (key: string, value: string, accessible: Keychain.ACCESSIBLE = Keychain.ACCESSIBLE.WHEN_UNLOCKED) => { +export const setItem = async (key: string, value: string, accessible: Keychain.ACCESSIBLE = Keychain.ACCESSIBLE.ALWAYS) => { const options = { accessible, }; diff --git a/src/utils/build.ts b/src/utils/build.ts index 1749b2315..bdf1a1ebb 100644 --- a/src/utils/build.ts +++ b/src/utils/build.ts @@ -3,11 +3,11 @@ import { PLATFORM } from "./constants"; export const Flavor: string = PLATFORM === "android" ? BuildConfig.FLAVOR_custom : BuildConfig.FLAVOR; export const Debug: boolean = PLATFORM === "android" ? BuildConfig.DEBUG : BuildConfig.DEBUG === "true"; -export const VersionCode: number = PLATFORM === "android" ? BuildConfig.VERSION_CODE : 1; -export const BuildType: string = PLATFORM === "android" ? BuildConfig.BUILD_TYPE : "BuildType"; +export const VersionCode: number = PLATFORM === "android" ? BuildConfig.VERSION_CODE : BuildConfig.CFBundleVersion; +export const BuildType: string = PLATFORM === "android" ? BuildConfig.BUILD_TYPE : Debug ? "debug" : "release"; export const ApplicationId: string = PLATFORM === "android" ? BuildConfig.APPLICATION_ID : BuildConfig.CFBundleIdentifier; -export const VersionName: string = PLATFORM === "android" ? BuildConfig.VERSION_NAME : ""; -export const IsHermes: boolean = global.HermesInternal != null; +export const VersionName: string = PLATFORM === "android" ? BuildConfig.VERSION_NAME : BuildConfig.CFBundleShortVersionString; +export const IsHermes: boolean = (global as any).HermesInternal != null; export const Chain: "mainnet" | "testnet" | "regtest" = BuildConfig.CHAIN; diff --git a/src/utils/constants.ts b/src/utils/constants.ts index d205710e8..25dfc5721 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -7,4 +7,6 @@ export const GITHUB_REPO_URL = "https://github.com/hsjoberg/blixt-wallet"; export const HAMPUS_EMAIL = "mailto:hampus.sjoberg💩protonmail.com".replace("💩", "@"); export const TELEGRAM = "https://t.me/blixtwallet"; -export const PLATFORM = Platform.OS; \ No newline at end of file +export const PLATFORM = Platform.OS; + +export const MATH_PAD_NATIVE_ID = "MATH_PAD"; \ No newline at end of file diff --git a/src/utils/event-listener.ts b/src/utils/event-listener.ts new file mode 100644 index 000000000..53de1b75d --- /dev/null +++ b/src/utils/event-listener.ts @@ -0,0 +1,7 @@ +import { DeviceEventEmitter, NativeEventEmitter, NativeModules } from "react-native"; +import { PLATFORM } from "./constants"; + +export const LndMobileEventEmitter = + PLATFORM == "android" + ? DeviceEventEmitter + : new NativeEventEmitter(NativeModules.LndMobile); \ No newline at end of file diff --git a/src/utils/log.ts b/src/utils/log.ts index 48865774c..1a42670d8 100644 --- a/src/utils/log.ts +++ b/src/utils/log.ts @@ -11,9 +11,7 @@ const log = (tag?: string) => { if (Debug) { const msg = fixMessage(message, data); console.debug(`${tag}: ${msg}`); - if (PLATFORM === "android") { - NativeModules.LndMobile.log("v", tag, msg); - } + NativeModules.LndMobileTools.log("v", tag, msg); } }, @@ -21,34 +19,26 @@ const log = (tag?: string) => { if (Debug) { const msg = fixMessage(message, data); console.debug(`${tag}: ${msg}`); - if (PLATFORM === "android") { - NativeModules.LndMobile.log("d", tag, msg); - } + NativeModules.LndMobileTools.log("d", tag, msg); } }, i: (message: string, data: any[] = []) => { const msg = fixMessage(message, data); - console.log(`${tag}: ${msg}`); - if (PLATFORM === "android") { - NativeModules.LndMobile.log("i", tag, msg); - } + console.log(`${tag}: ${msg}`) + NativeModules.LndMobileTools.log("i", tag, msg); }, w: (message: string, data: any[] = []) => { const msg = fixMessage(message, data); - console.warn(`${tag}: ${msg}`); - if (PLATFORM === "android") { - NativeModules.LndMobile.log("w", tag, msg); - } + console.warn(`${tag}: ${msg}`) + NativeModules.LndMobileTools.log("w", tag, msg); }, e: (message: string, data: any[] = []) => { const msg = fixMessage(message, data); - console.error(`${tag}: ${msg}`); - if (PLATFORM === "android") { - NativeModules.LndMobile.log("e", tag, msg); - } + console.error(`${tag}: ${msg}`) + NativeModules.LndMobileTools.log("e", tag, msg); }, }; }; diff --git a/src/utils/push-notification.ts b/src/utils/push-notification.ts index 511dd884e..5a30aabca 100644 --- a/src/utils/push-notification.ts +++ b/src/utils/push-notification.ts @@ -9,4 +9,4 @@ export const localNotification = (message: string, importance: PushNotificationO importance, autoCancel: true, }); -}; \ No newline at end of file +}; diff --git a/src/windows/HelperWindows/SelectList.tsx b/src/windows/HelperWindows/SelectList.tsx index 745457ab3..f12f2d198 100644 --- a/src/windows/HelperWindows/SelectList.tsx +++ b/src/windows/HelperWindows/SelectList.tsx @@ -1,7 +1,7 @@ import React, { useLayoutEffect, useState } from "react"; import { Header, Icon, Input, Item, ListItem, Text } from "native-base"; import Container from "../../components/Container"; -import { FlatList, View } from "react-native"; +import { FlatList, StyleSheet, View } from "react-native"; import { blixtTheme } from "../../../native-base-theme/variables/commonColor"; import { StackNavigationProp } from "@react-navigation/stack"; import { RouteProp } from "@react-navigation/native"; @@ -13,6 +13,7 @@ export interface ISelectListNavigationProps { onPick: (address: T) => void; data: { title: string, value: T }[]; searchEnabled?: boolean; + description?: string } type IFakeStack = { @@ -24,11 +25,12 @@ export interface ISelectListProps { route: RouteProp, "SelectList">; } -export default function({ navigation, route }: ISelectListProps) { +export default function({ navigation, route }: ISelectListProps) { const title = route?.params?.title ?? ""; const onPick = route?.params?.onPick ?? (() => {}); const data = route?.params?.data ?? []; const searchEnabled = route?.params?.searchEnabled ?? false; + const description = route?.params?.description; useLayoutEffect(() => { navigation.setOptions({ @@ -61,27 +63,34 @@ export default function({ navigation, route }: ISelectListProps } - - { - return ( - title.toUpperCase().includes(searchText.toUpperCase()) || - value.toUpperCase().includes(searchText.toUpperCase()) - ); - })} - renderItem={({ item }) => ( - { - onPick(item.value); - navigation.pop(); - }}> - {item.title} - - )} - keyExtractor={(item) => item.value} - /> - + {description} : undefined} + contentContainerStyle={{ paddingTop: 8, paddingHorizontal: 14, paddingBottom: 65 }} + initialNumToRender={20} + data={data.filter(({ title, value }) => { + return ( + title.toUpperCase().includes(searchText.toUpperCase()) || + (typeof value === "string" && value.toUpperCase().includes(searchText.toUpperCase())) + ); + })} + renderItem={({ item }) => ( + { + onPick(item.value); + navigation.pop(); + }}> + {item.title} + + )} + keyExtractor={(item) => item.value} + /> ) -} \ No newline at end of file +} + +const style = StyleSheet.create({ + description: { + marginTop: 35, + marginHorizontal: 10, + marginBottom: 35, + } +}); diff --git a/src/windows/InitProcess/Authentication.tsx b/src/windows/InitProcess/Authentication.tsx index edd2c4e7e..655243529 100644 --- a/src/windows/InitProcess/Authentication.tsx +++ b/src/windows/InitProcess/Authentication.tsx @@ -15,6 +15,7 @@ export default function Authentication() { const fingerprintEnabled = useStoreState((store) => store.security.fingerprintEnabled); const fingerprintStartScan = useStoreActions((store) => store.security.fingerprintStartScan); const fingerprintStopScan = useStoreActions((store) => store.security.fingerprintStopScan); + const biometricsSensor = useStoreState((store) => store.security.sensor); const loginMethods = useStoreState((store) => store.security.loginMethods); const startScan = useFingerprintAuth(async () => {}); @@ -40,7 +41,12 @@ export default function Authentication() { } {loginMethods.has(LoginMethods.fingerprint) && - + {biometricsSensor !== "Face ID" && + + } + {biometricsSensor === "Face ID" && + + } } {loginMethods.size === 0 && Error} diff --git a/src/windows/InitProcess/DEV_Commands.tsx b/src/windows/InitProcess/DEV_Commands.tsx index 38efdd5a2..154414806 100644 --- a/src/windows/InitProcess/DEV_Commands.tsx +++ b/src/windows/InitProcess/DEV_Commands.tsx @@ -1,17 +1,17 @@ import React, { useState } from "react"; -import { StyleSheet, StatusBar, NativeModules, ScrollView, DeviceEventEmitter } from "react-native"; +import { StyleSheet, StatusBar, NativeModules, ScrollView, DeviceEventEmitter, Alert, EventEmitter, NativeEventEmitter } from "react-native"; import Clipboard from "@react-native-community/clipboard"; import { Text, Button, Toast, Input, View, Container } from "native-base"; import Long from "long"; import { StackNavigationProp } from "@react-navigation/stack"; import * as base64 from "base64-js"; import * as Keychain from 'react-native-keychain'; - import Sound from "react-native-sound"; +import iCloudStorage from "react-native-icloudstore"; import { getTransactions, getTransaction, createTransaction, clearTransactions } from "../../storage/database/transaction"; import { useStoreState, useStoreActions } from "../../state/store"; -import { lnrpc } from "../../../proto/proto"; +import { invoicesrpc, lnrpc } from "../../../proto/proto"; import { sendCommand } from "../../lndmobile/utils"; import { getInfo, connectPeer, listPeers, decodePayReq, queryRoutes, checkStatus } from "../../lndmobile/index"; import { initWallet, genSeed, deriveKey, signMessage, derivePrivateKey } from "../../lndmobile/wallet"; @@ -26,14 +26,12 @@ import { blixtTheme } from "../../../native-base-theme/variables/commonColor"; import { LoginMethods } from "../../state/Security"; import Spinner from "../../components/Spinner"; - import secp256k1 from "secp256k1"; import { Hash as sha256Hash, HMAC as sha256HMAC } from "fast-sha256"; -import { bytesToString, bytesToHexString } from "../../utils"; +import { bytesToString, bytesToHexString, stringToUint8Array } from "../../utils"; import { ILightningServices } from "../../utils/lightning-services"; import { localNotification } from "../../utils/push-notification"; - - +import { ICLOUD_BACKUP_KEY } from "../../state/ICloudBackup"; interface IProps { navigation?: StackNavigationProp; @@ -72,7 +70,7 @@ export default function DEV_Commands({ navigation, continueCallback }: IProps) { console.log(await queryRoutes("03abf6f44c355dec0d5aa155bdbdd6e0c8fefe318eff402de65c6eb2e1be55dc3e")) }}>decode() @@ -247,6 +245,65 @@ export default function DEV_Commands({ navigation, continueCallback }: IProps) { console.log(localNotification("TEST NOTIFICATION")); }}>localNotification + iOS LndMobile: + + + + + + + + + + + + + + + + + Security: - {/* Dangerous: + Dangerous: - - */} + + App storage: @@ -296,17 +353,18 @@ export default function DEV_Commands({ navigation, continueCallback }: IProps) { + }}>LndMobileTools.DEBUG_getWalletPasswordFromKeychain() - + + - Sqlite: diff --git a/src/windows/Overview.tsx b/src/windows/Overview.tsx index 2d2b7d3e1..b2a401681 100644 --- a/src/windows/Overview.tsx +++ b/src/windows/Overview.tsx @@ -220,7 +220,7 @@ function Overview({ navigation }: IOverviewProps) { } - {Chain === "mainnet" && nodeInfo && nodeInfo.syncedToChain && experimentWeblnEnabled && + {nodeInfo && nodeInfo.syncedToChain && experimentWeblnEnabled && navigation.navigate("WebLNBrowser")} /> diff --git a/src/windows/Receive/ReceiveSetup.tsx b/src/windows/Receive/ReceiveSetup.tsx index ba4e035da..ed063adc8 100644 --- a/src/windows/Receive/ReceiveSetup.tsx +++ b/src/windows/Receive/ReceiveSetup.tsx @@ -11,7 +11,7 @@ import BlixtForm from "../../components/Form"; import { formatBitcoin, BitcoinUnits, IBitcoinUnits } from "../../utils/bitcoin-units"; import { blixtTheme } from "../../../native-base-theme/variables/commonColor"; import useBalance from "../../hooks/useBalance"; -import { MAX_SAT_INVOICE, PLATFORM } from "../../utils/constants"; +import { MATH_PAD_NATIVE_ID, MAX_SAT_INVOICE, PLATFORM } from "../../utils/constants"; import { toast } from "../../utils"; import { Keyboard } from "react-native"; import Container from "../../components/Container"; @@ -169,6 +169,7 @@ export default function ReceiveSetup({ navigation }: IReceiveSetupProps) { component: ( <> setMathPadVisible(false)} testID="input-amount-sat" onChangeText={onChangeBitcoinInput} placeholder="0" @@ -182,7 +183,7 @@ export default function ReceiveSetup({ navigation }: IReceiveSetupProps) { onBlur={() => { // setMathPadVisible(false); }} - inputAccessoryViewID="MATH_PAD" + inputAccessoryViewID={MATH_PAD_NATIVE_ID} /> @@ -193,7 +194,7 @@ export default function ReceiveSetup({ navigation }: IReceiveSetupProps) { component: ( <> setMathPadVisible(false)} + onSubmitEditing={() => setMathPadVisible(false)} onChangeText={onChangeFiatInput} placeholder="0.00" value={dollarValue !== undefined ? dollarValue.toString() : undefined} @@ -206,7 +207,7 @@ export default function ReceiveSetup({ navigation }: IReceiveSetupProps) { onBlur={() => { // setMathPadVisible(false); }} - inputAccessoryViewID="MATH_PAD" + inputAccessoryViewID={MATH_PAD_NATIVE_ID} /> @@ -270,7 +271,7 @@ export default function ReceiveSetup({ navigation }: IReceiveSetupProps) { addMathOperatorToInput("+"), onSubPress: () => addMathOperatorToInput("-"), onMulPress: () => addMathOperatorToInput("*"), diff --git a/src/windows/Send/SendConfirmation.tsx b/src/windows/Send/SendConfirmation.tsx index e417be2e7..09d053ad9 100644 --- a/src/windows/Send/SendConfirmation.tsx +++ b/src/windows/Send/SendConfirmation.tsx @@ -170,7 +170,7 @@ export default function SendConfirmation({ navigation, route }: ISendConfirmatio formItems.push({ key: "RECIPIENT", title: "Recipient", - component: (), + component: (), }); } else if (nodeInfo && nodeInfo.node && nodeInfo.node.alias) { diff --git a/src/windows/Send/SendDone.tsx b/src/windows/Send/SendDone.tsx index 0aa740151..62e8eaa9c 100644 --- a/src/windows/Send/SendDone.tsx +++ b/src/windows/Send/SendDone.tsx @@ -1,4 +1,4 @@ -import React, { useState, useEffect } from "react"; +import React, { useState, useEffect, useRef } from "react"; import { View, Animated } from "react-native"; import { Text } from "native-base"; import { RouteProp } from "@react-navigation/native"; @@ -6,88 +6,61 @@ import { StackNavigationProp } from "@react-navigation/stack"; import * as Animatable from "react-native-animatable"; import { SendStackParamList } from "./index"; -import Svg, { G, Circle, Polyline, PolylineProps } from "react-native-svg"; +import Svg, { G, Circle, Polyline } from "react-native-svg"; import { blixtTheme } from "../../../native-base-theme/variables/commonColor"; import Container from "../../components/Container"; const AnimatedCircle = Animated.createAnimatedComponent(Circle); const AnimatedPolyline = Animated.createAnimatedComponent(Polyline); +const AnimatedText = Animatable.createAnimatableComponent(Text); -class CheckmarkCircle extends React.Component { - constructor(props) { - super(props); +// https://codepen.io/ottodevs/pen/BMmdMM - this.state = { circleRadius: new Animated.Value(55) }; +function CheckmarkCircle() { + const circleRadius = useRef(new Animated.Value(55)).current; - this.state.circleRadius.addListener((circleRadius) => { - if (this._myCircle) { - this._myCircle.setNativeProps({ r: circleRadius.value.toString() }); - } - }); + useEffect(() => { + Animated.spring(circleRadius, { + toValue: 80, + friction: 4.5, + useNativeDriver: true, + }).start(); + }, []); - setTimeout(() => { - Animated.spring(this.state.circleRadius, { - toValue: 80, - friction: 4.5, - useNativeDriver: true, - }).start(); - }, 1); - } - render() { - return ( - (this._myCircle = ref)} - cx="93" - cy="95" - r="45" - fill={blixtTheme.green} - /> - ); - } + return ( + + ); } -// tslint:disable-next-line: max-classes-per-file -class CheckmarkPolyline extends React.Component { - constructor(props) { - super(props); - - this.state = { strokeWidth: new Animated.Value(0) }; - - this.state.strokeWidth.addListener((strokeWidth) => { - if (this._myPolyline) { - this._myPolyline.setNativeProps({ - strokeWidth: strokeWidth.value.toString(), - }); - } - }); +function CheckmarkPolyline() { + const strokeWidth = useRef(new Animated.Value(0)).current; - setTimeout(() => { - Animated.spring(this.state.strokeWidth, { - toValue: 8, - friction: 4, - useNativeDriver: true, - }).start(); - }, 5); - } + useEffect(() => { + Animated.spring(strokeWidth, { + toValue: 8, + friction: 4, + useNativeDriver: true, + }).start(); + }, []); - render() { - // points="43.5,77.8 63.7,97.9 112.2,49.4" - return ( - (this._myPolyline = ref)} - strokeWidth={0} - strokeDasharray={[100, 100]} - strokeDashoffset={200} - stroke="#fff" - points="59.5,99.8 79.7,119.9 128.2,71.4" - /> - ); - } + return ( + + ); } -const AnimatedText = Animatable.createAnimatableComponent(Text); - export interface ISendConfirmationProps { navigation: StackNavigationProp; route: RouteProp; diff --git a/src/windows/Settings/ChangeFingerprintSettingsAuth.tsx b/src/windows/Settings/ChangeFingerprintSettingsAuth.tsx index 186e9aee8..2ea626c2a 100644 --- a/src/windows/Settings/ChangeFingerprintSettingsAuth.tsx +++ b/src/windows/Settings/ChangeFingerprintSettingsAuth.tsx @@ -1,16 +1,20 @@ import React, { useEffect } from "react"; import { StyleSheet, StatusBar, AppState, AppStateStatus } from "react-native"; -import { Container, Content, View, Text, Icon } from "native-base"; +import { Container, View, Text, Icon } from "native-base"; import { useNavigation } from "@react-navigation/native"; import { useStoreActions, useStoreState, } from "../../state/store"; import { blixtTheme } from "../../../native-base-theme/variables/commonColor"; import useFingerprintAuth from "../../hooks/useFingerprintAuth"; +import { PLATFORM } from "../../utils/constants"; +import { getStatusBarHeight } from "react-native-status-bar-height"; +import BlixtContent from "../../components/Content"; export default function ChangeFingerprintSettingsAuth() { const navigation = useNavigation(); const setFingerprintEnabled = useStoreActions((store) => store.security.setFingerprintEnabled); const fingerPrintEnabled = useStoreState((store) => store.security.fingerprintEnabled); + const sensor = useStoreState((store) => store.security.sensor); const startScan = useFingerprintAuth(async () => { navigation.goBack(); await setFingerprintEnabled(!fingerPrintEnabled); @@ -18,12 +22,28 @@ export default function ChangeFingerprintSettingsAuth() { return ( - - Authenticate to change fingerprint settings - - + + Authenticate to change biometrics settings + + {sensor !== "Face ID" && + + } + {sensor === "Face ID" && + + } - + + {PLATFORM === "ios" && + navigation.goBack()} + /> + } ) } diff --git a/src/windows/Settings/LightningPeers.tsx b/src/windows/Settings/LightningPeers.tsx new file mode 100644 index 000000000..f4af0e3ac --- /dev/null +++ b/src/windows/Settings/LightningPeers.tsx @@ -0,0 +1,217 @@ +import React, { useEffect, useLayoutEffect } from "react"; +import { Body, Button, Card, CardItem, Icon, Left, Right, Row, Text } from "native-base"; +import { Image, StyleSheet } from "react-native"; +import { StackNavigationProp } from "@react-navigation/stack"; +import { RouteProp } from "@react-navigation/native"; +import Long from "long"; + +import Container from "../../components/Container"; +import BlixtContent from "../../components/Content"; +import { useStoreActions, useStoreState } from "../../state/store"; +import { NavigationButton } from "../../components/NavigationButton"; +import { identifyService, lightningServices } from "../../utils/lightning-services"; +import { timeout } from "../../utils"; +import { SettingsStackParamList } from "./index"; +import { lnrpc } from "../../../proto/proto"; + +export interface ISelectListProps { + navigation: StackNavigationProp; + route: RouteProp; +} + +export default function({ navigation }: ISelectListProps) { + const rpcReady = useStoreState((store) => store.lightning.rpcReady); + const syncedToChain = useStoreState((store) => store.lightning.syncedToChain); + const lightningPeers = useStoreState((store) => store.lightning.lightningPeers); + const getLightningPeers = useStoreActions((store) => store.lightning.getLightningPeers); + const disconnectPeer = useStoreActions((store) => store.lightning.disconnectPeer); + + useEffect(() => { + console.log("useeffect"); + if (rpcReady && syncedToChain) { + (async () => { + await timeout(2000) + await getLightningPeers(); + })(); + } + }, [getLightningPeers, rpcReady, syncedToChain]); + + useLayoutEffect(() => { + navigation.setOptions({ + headerTitle: "Lightning Peers", + headerShown: true, + headerRight: () => { + return ( + rpcReady && await getLightningPeers()}> + + + ) + } + }); + }, [navigation]); + + const close = async (pubkey: string) => { + await disconnectPeer(pubkey); + await getLightningPeers(); + }; + + return ( + + + {lightningPeers.map((peer) => { + const serviceKey = identifyService(peer.peer.pubKey, "", null); + let service; + if (lightningServices[serviceKey!]) { + service = lightningServices[serviceKey!]; + } + + return ( + + + + + + Node alias + + + + {peer.node?.alias} + + {service && + + } + + + + + Node public key + + + {peer.peer.pubKey} + + + + + Node address + + + {peer.peer.address} + + + + + Data + + + + {Long.fromValue(peer.peer.bytesSent).toString()} bytes sent{"\n"} + {Long.fromValue(peer.peer.bytesSent).toString()} byes received + + + + + + Transfer + + + + {Long.fromValue(peer.peer.satSent).toString()} sat sent{"\n"} + {Long.fromValue(peer.peer.satRecv).toString()} sat received + + + + + + Inbound + + + + {peer.peer.inbound ? "true" : "false"} + + + + {/* + + Ping time + + + + {Long.fromValue(peer.peer.pingTime).divtoString()} + + + */} + + + Sync type + + + + {getPeerSyncType(peer.peer.syncType)} + + + + {peer.peer.errors.length > 0 && + + + Errors + + + + {(peer.peer.errors.map((error) => ( + + {error.error}{"\n"} + + )))} + + + + } + + + + + + + + + ); + })} + + + ) +} + +const style = StyleSheet.create({ + nodeImage: { + width: 320, + height: 320, + borderRadius: 22, + marginLeft: 10, + marginBottom: 4, + }, + card: { + width: "100%", + marginTop: 8, + }, + cardDataText: { + textAlign: "right", + } +}) + +function getPeerSyncType(type: lnrpc.Peer.SyncType) { + if (type === lnrpc.Peer.SyncType.UNKNOWN_SYNC) { + return "UNKNOWN_SYNC" + } else if (type === lnrpc.Peer.SyncType.ACTIVE_SYNC) { + return "ACTIVE_SYNC" + } else if (type === lnrpc.Peer.SyncType.PASSIVE_SYNC) { + return "PASSIVE_SYNC" + } + return "UNKNOWN"; +} \ No newline at end of file diff --git a/src/windows/Settings/LndMobileHelpCenter.tsx b/src/windows/Settings/LndMobileHelpCenter.tsx index 4042d44d5..46cc89ad7 100644 --- a/src/windows/Settings/LndMobileHelpCenter.tsx +++ b/src/windows/Settings/LndMobileHelpCenter.tsx @@ -33,7 +33,7 @@ export default function LndMobileHelpCenter({ navigation }) { setLndLog(lndLog.slice(0)); }); - NativeModules.LndMobile.observeLndLogFile(); + NativeModules.LndMobileTools.observeLndLogFile(); return () => { listener.remove(); @@ -43,7 +43,7 @@ export default function LndMobileHelpCenter({ navigation }) { const steps = [{ title: "Check LndMobileService process exist", async exec () { - const r = await NativeModules.LndMobile.checkLndProcessExist(); + const r = await NativeModules.LndMobileTools.checkLndProcessExist(); return r; } },{ @@ -170,7 +170,7 @@ export default function LndMobileHelpCenter({ navigation }) { const runSigKill = async () => { try { - const result = await NativeModules.LndMobile.killLnd(); + const result = await NativeModules.LndMobileTools.killLnd(); toast("Result: " + JSON.stringify(result), 0, "success", "OK"); } catch (e) { toast("Error: " + e.message, 0, "danger", "OK"); diff --git a/src/windows/Settings/Settings.tsx b/src/windows/Settings/Settings.tsx index 054887ae2..47b8b3516 100644 --- a/src/windows/Settings/Settings.tsx +++ b/src/windows/Settings/Settings.tsx @@ -9,20 +9,20 @@ import DialogAndroid from "react-native-dialogs"; import { fromUnixTime } from "date-fns"; import { StackNavigationProp } from "@react-navigation/stack"; - import { SettingsStackParamList } from "./index"; import Content from "../../components/Content"; import { useStoreActions, useStoreState } from "../../state/store"; import { LoginMethods } from "../../state/Security"; import { BitcoinUnits, IBitcoinUnits } from "../../utils/bitcoin-units"; import { verifyChanBackup } from "../../lndmobile/channel"; -import { camelCaseToSpace, formatISO, toast } from "../../utils"; +import { camelCaseToSpace, formatISO, timeout, toast } from "../../utils"; import { MapStyle } from "../../utils/google-maps"; import { Chain } from "../../utils/build"; import { OnchainExplorer } from "../../state/Settings"; import TorSvg from "./TorSvg"; import { PLATFORM } from "../../utils/constants"; import { IFiatRates } from "../../state/Fiat"; +import BlixtWallet from "../../components/BlixtWallet"; interface ISettingsProps { navigation: StackNavigationProp; @@ -46,6 +46,7 @@ export default function Settings({ navigation }: ISettingsProps) { // Fingerprint const fingerprintAvailable = useStoreState((store) => store.security.fingerprintAvailable); const fingerPrintEnabled = useStoreState((store) => store.security.fingerprintEnabled); + const biometricsSensor = useStoreState((store) => store.security.sensor); const onToggleFingerprintPress = async () => { navigation.navigate("ChangeFingerprintSettingsAuth"); } @@ -207,14 +208,16 @@ export default function Settings({ navigation }: ISettingsProps) { const checkInvoice = useStoreActions((store) => store.clipboardManager.checkInvoice); const onToggleClipBoardInvoiceCheck = async () => { await changeClipboardInvoiceCheckEnabled(!clipboardInvoiceCheckEnabled); - const clipboardText = await Clipboard.getString(); - await checkInvoice(clipboardText); + if (!clipboardInvoiceCheckEnabled) { + const clipboardText = await Clipboard.getString(); + await checkInvoice(clipboardText); + } }; // Copy log const copyLog = async () => { try { - await NativeModules.LndMobile.copyLndLog(); + await NativeModules.LndMobileTools.copyLndLog(); toast("Copied lnd log file.", undefined, "warning"); } catch (e) { console.error(e); @@ -227,7 +230,9 @@ export default function Settings({ navigation }: ISettingsProps) { const onExportChannelsPress = async () => { try { const response = await exportChannelsBackup(); - toast(`File written:\n ${response}`, 10000, "warning"); + if (PLATFORM === "android") { + toast(`File written:\n ${response}`, 10000, "warning"); + } } catch (e) { console.log(e); toast(e.message, 10000, "danger"); @@ -251,7 +256,6 @@ export default function Settings({ navigation }: ISettingsProps) { const workInfo = useStoreState((store) => store.scheduledSync.workInfo); const lastScheduledSync = useStoreState((store) => store.scheduledSync.lastScheduledSync); const lastScheduledSyncAttempt = useStoreState((store) => store.scheduledSync.lastScheduledSyncAttempt); - console.log(workInfo, lastScheduledSync, lastScheduledSyncAttempt); const scheduledSyncEnabled = useStoreState((store) => store.settings.scheduledSyncEnabled); const changeScheduledSyncEnabled = useStoreActions((store) => store.settings.changeScheduledSyncEnabled); @@ -312,6 +316,27 @@ export default function Settings({ navigation }: ISettingsProps) { } } + const iCloudBackupEnabled = useStoreState((store) => store.settings.iCloudBackupEnabled); + const changeICloudBackupEnabled = useStoreActions((store) => store.settings.changeICloudBackupEnabled); + const iCloudMakeBackup = useStoreActions((store) => store.iCloudBackup.makeBackup); + const onToggleICloudBackup = async () => { + if (!iCloudBackupEnabled) { + await iCloudMakeBackup(); + } + await changeICloudBackupEnabled(!iCloudBackupEnabled); + toast(`iCloud backup ${iCloudBackupEnabled ? "disabled" : "enabled"}`); + }; + + const onDoICloudBackupPress = async () => { + try { + await iCloudMakeBackup(); + toast("Backed up channels to iCloud"); + } + catch (e) { + toast(`Error backup up: ${e.message}`, 10000, "danger"); + } + } + // Transaction geolocation const transactionGeolocationEnabled = useStoreState((store) => store.settings.transactionGeolocationEnabled); const changeTransactionGeolocationEnabled = useStoreActions((store) => store.settings.changeTransactionGeolocationEnabled); @@ -371,38 +396,60 @@ export default function Settings({ navigation }: ISettingsProps) { // Inbound services list const onInboundServiceListPress = async () => { - interface ShowPickerResult { - selectedItem: { - id: "LNBIG" | "BITREFILL_THOR"; - label: "LN Big" | "Bitrefill Thor"; - } | undefined; - } - const { selectedItem }: ShowPickerResult = await DialogAndroid.showPicker(null, null, { - title: "Incoming channel provider", - content: -`Choose an incoming channel provider and press Continue. + const goToSite = async (selectedItem: "LNBIG" | "BITREFILL_THOR") => { + if (selectedItem === "LNBIG") { + await Linking.openURL("https://lnbig.com/"); + } else if (selectedItem === "BITREFILL_THOR") { + await Linking.openURL("https://embed.bitrefill.com/buy/lightning"); + } + }; + + const description = `Choose an incoming channel provider and press Continue. Your web browser will be opened to the corresponding provider's website, where you will be able to request a channel. -When you're done, you can copy the address code and/or open the link using Blixt Wallet.`, - positiveText: "Continue", - negativeText: "Cancel", - type: DialogAndroid.listRadio, - items: [{ - id: "LNBIG", - label: "LN Big" - }, { - id: "BITREFILL_THOR", - label: "Bitrefill Thor" - }], - }); +When you're done, you can copy the address code and/or open the link using Blixt Wallet.` - if (selectedItem) { - if (selectedItem.id === "LNBIG") { - await Linking.openURL("https://lnbig.com/"); - } else if (selectedItem.id === "BITREFILL_THOR") { - await Linking.openURL("https://embed.bitrefill.com/buy/lightning"); + if (PLATFORM === "android") { + interface ShowPickerResult { + selectedItem: { + id: "LNBIG" | "BITREFILL_THOR"; + label: "LN Big" | "Bitrefill Thor"; + } | undefined; } + const { selectedItem }: ShowPickerResult = await DialogAndroid.showPicker(null, null, { + title: "Incoming channel provider", + content: description, + positiveText: "Continue", + negativeText: "Cancel", + type: DialogAndroid.listRadio, + items: [{ + id: "LNBIG", + label: "LN Big" + }, { + id: "BITREFILL_THOR", + label: "Bitrefill Thor" + }], + }); + + if (selectedItem) { + await goToSite(selectedItem.id); + } + } else { + navigation.navigate("ChannelProvider", { + title: "Incoming channel provider", + description, + data: [{ + title: "LN Big", + value: "LNBIG", + }, { + title: "Bitrefill Thor", + value: "BITREFILL_THOR", + }], + onPick: async (selectedItem) => { + goToSite(selectedItem as any) + } + }); } } @@ -482,11 +529,11 @@ Do you wish to proceed?`; await changeTorEnabled(!torEnabled); try { await NativeModules.LndMobile.stopLnd(); - await NativeModules.LndMobile.killLnd(); + await NativeModules.LndMobileTools.killLnd(); } catch(e) { console.log(e); } - NativeModules.LndMobile.restartApp(); + NativeModules.LndMobileTools.restartApp(); }, } ]); @@ -515,6 +562,8 @@ Do you wish to proceed?`; return ( + + General @@ -587,14 +636,12 @@ Do you wish to proceed?`; } } - {PLATFORM === "android" && - - - - Export channel backup - - - } + + + + Export channel backup + + {(PLATFORM === "android" && (name === "Hampus" || __DEV__ === true)) && @@ -619,6 +666,22 @@ Do you wish to proceed?`; Manually trigger Google Drive Backup } + {PLATFORM == "ios" && + + + + iCloud channel backup + Automatically backup channels to iCloud + + + + } + {iCloudBackupEnabled && + + + Manually trigger iCloud Backup + + } Security @@ -631,8 +694,22 @@ Do you wish to proceed?`; {fingerprintAvailable && - - Login with fingerprint + + {biometricsSensor !== "Face ID" && + + } + {biometricsSensor === "Face ID" && + + } + + + + Login with{" "} + {biometricsSensor === "Biometrics" && "fingerprint"} + {biometricsSensor === "Face ID" && "Face ID"} + {biometricsSensor === "Touch ID" && "Touch ID"} + + } @@ -701,9 +778,13 @@ Do you wish to proceed?`; navigation.navigate("LightningNodeInfo")}> - + Show node data + navigation.navigate("LightningPeers")}> + + Show Lightning peers + Automatically open channels @@ -762,7 +843,7 @@ Do you wish to proceed?`; - {Chain === "mainnet" && + {(Chain === "mainnet" || Chain === "regtest") && <> Experiments @@ -822,13 +903,15 @@ Do you wish to proceed?`; } - { - const logLines = await NativeModules.LndMobile.tailLog(30); - Alert.alert("Log", logLines); - }}> - - Read lnd log - + {PLATFORM === "android" && + { + const logLines = await NativeModules.LndMobileTools.tailLog(30); + Alert.alert("Log", logLines); + }}> + + Read lnd log + + } {(PLATFORM === "android" && (name === "Hampus" || __DEV__ === true)) && <> navigation.navigate("KeysendTest")}> diff --git a/src/windows/Settings/index.tsx b/src/windows/Settings/index.tsx index 3d68433d7..26202fa5f 100644 --- a/src/windows/Settings/index.tsx +++ b/src/windows/Settings/index.tsx @@ -13,6 +13,7 @@ import useStackNavigationOptions from "../../hooks/useStackNavigationOptions"; import SelectList, { ISelectListNavigationProps } from "../HelperWindows/SelectList"; import { IFiatRates } from "../../state/Fiat"; import { OnchainExplorer } from "../../state/Settings"; +import LightningPeers from "./LightningPeers"; const Stack = createStackNavigator(); @@ -28,6 +29,8 @@ export type SettingsStackParamList = { ChangeBitcoinUnit: ISelectListNavigationProps; ChangeFiatUnit: ISelectListNavigationProps; ChangeOnchainExplorer: ISelectListNavigationProps; + LightningPeers: undefined; + ChannelProvider: ISelectListNavigationProps; } export default function SettingsIndex() { @@ -49,6 +52,8 @@ export default function SettingsIndex() { + + ); } diff --git a/src/windows/WebLN/Browser.tsx b/src/windows/WebLN/Browser.tsx index 27b5d6de3..0b0f6ad1e 100644 --- a/src/windows/WebLN/Browser.tsx +++ b/src/windows/WebLN/Browser.tsx @@ -115,10 +115,16 @@ export default function WebLNBrowser({ navigation, route }: IBrowserProps) { }, { text: "No", }]) - } + }; + + const onLongPressHome = () => { + if (PLATFORM === "ios" ) { + ToastAndroid.show("Go back to store list", ToastAndroid.SHORT); + } + }; return ( - + - setUrl(INITIAL_URL)} onLongPress={() => ToastAndroid.show("Go back to store list", ToastAndroid.SHORT)}> + setUrl(INITIAL_URL)} onLongPress={() => onLongPressHome()}> {PLATFORM === "ios" && @@ -202,7 +208,7 @@ const style = StyleSheet.create({ }, card: { marginTop: (StatusBar.currentHeight ?? 0) + getStatusBarHeight(true) + 8, - marginBottom: 12 + (PLATFORM === "ios" ? 10 : 0), + marginBottom: 12 + (PLATFORM === "ios" ? 7 : 0), marginLeft: 9, marginRight: 9, paddingTop: 8, diff --git a/src/windows/Welcome/AlmostDone.tsx b/src/windows/Welcome/AlmostDone.tsx index 114e9d980..b5c17c7cc 100644 --- a/src/windows/Welcome/AlmostDone.tsx +++ b/src/windows/Welcome/AlmostDone.tsx @@ -63,6 +63,7 @@ const AlmostDone = ({ navigation }: IProps) => { // Fingerprint const fingerprintAvailable = useStoreState((store) => store.security.fingerprintAvailable); const fingerPrintEnabled = useStoreState((store) => store.security.fingerprintEnabled); + const biometricsSensor = useStoreState((store) => store.security.sensor); const onToggleFingerprintPress = async () => { navigation.navigate("ChangeFingerprintSettingsAuth"); } @@ -161,8 +162,22 @@ const AlmostDone = ({ navigation }: IProps) => { {fingerprintAvailable && - - Login with fingerprint + + {biometricsSensor !== "Face ID" && + + } + {biometricsSensor === "Face ID" && + + } + + + + Login with{" "} + {biometricsSensor === "Biometrics" && "fingerprint"} + {biometricsSensor === "Face ID" && "Face ID"} + {biometricsSensor === "Touch ID" && "Touch ID"} + + } diff --git a/src/windows/Welcome/Confirm.tsx b/src/windows/Welcome/Confirm.tsx index 68344d3ca..cfa99a565 100644 --- a/src/windows/Welcome/Confirm.tsx +++ b/src/windows/Welcome/Confirm.tsx @@ -65,6 +65,8 @@ export default function Confirm({ navigation }: IProps) { if (PLATFORM === "android") { navigation.replace("GoogleDriveBackup"); + } else if (PLATFORM === "ios") { + navigation.replace("ICloudBackup"); } else { navigation.replace("AlmostDone") } diff --git a/src/windows/Welcome/GoogleDriveBackup.tsx b/src/windows/Welcome/GoogleDriveBackup.tsx index d5094558b..1514de555 100644 --- a/src/windows/Welcome/GoogleDriveBackup.tsx +++ b/src/windows/Welcome/GoogleDriveBackup.tsx @@ -43,7 +43,7 @@ export default function GoogleDriveBackup({ navigation }: IProps) { {!googleDriveBackupEnabled && - diff --git a/src/windows/Welcome/ICloudBackup.tsx b/src/windows/Welcome/ICloudBackup.tsx new file mode 100644 index 000000000..1f9c58b08 --- /dev/null +++ b/src/windows/Welcome/ICloudBackup.tsx @@ -0,0 +1,93 @@ +import React from "react"; +import { StatusBar, StyleSheet, } from "react-native"; +import { Icon, Text, View, Button, H1 } from "native-base"; +import { StackNavigationProp } from "@react-navigation/stack"; + +import { WelcomeStackParamList } from "./index"; +import { useStoreState, useStoreActions } from "../../state/store"; +import style from "./style"; +import Container from "../../components/Container"; + +interface IProps { + navigation: StackNavigationProp; +} +export default function ICloudBackup({ navigation }: IProps) { + const iCloudBackupEnabled = useStoreState((store) => store.settings.iCloudBackupEnabled); + const changeICloudBackupEnabled = useStoreActions((store) => store.settings.changeICloudBackupEnabled); + const iCloudMakeBackup = useStoreActions((store) => store.iCloudBackup.makeBackup); + const onPressICloudBackup = async () => { + await iCloudMakeBackup(); + await changeICloudBackupEnabled(true); + }; + + const onPressContinue = () => { + navigation.replace("AlmostDone"); + }; + + return ( + +

iCloud Backup

+ + In order for your off-chain funds to stay secure in the case of a device loss, + we recommend you to keep channels backed up to iCloud.{"\n\n"} + This will keep an encrypted backup of your channels that can only be used together with the wallet seed.{"\n\n"} + When you are ready, press continue. + + + + + + + + + ); +} + +const extraStyle = StyleSheet.create({ + list: { + paddingTop: 12, + marginBottom: 48, + }, + listItem: { + paddingLeft: 8, + paddingRight: 8, + // paddingLeft: 24, + // paddingRight: 24, + }, + itemHeader: { + paddingLeft: 8, + paddingRight: 8, + // paddingRight: 24, + // paddingLeft: 24, + paddingTop: 24, + paddingBottom: 16, + }, + icon: { + fontSize: 22, + }, +}); diff --git a/src/windows/Welcome/Restore.tsx b/src/windows/Welcome/Restore.tsx index be745c1f9..4029544f7 100644 --- a/src/windows/Welcome/Restore.tsx +++ b/src/windows/Welcome/Restore.tsx @@ -21,14 +21,16 @@ interface IProps { export default function Restore({ navigation }: IProps) { const [loading, setLoading] = useState(false); const [seedText, setSeedText] = useState(""); - const [backupType, setBackupType] = useState<"file" | "google_drive" | "none">("none"); + const [backupType, setBackupType] = useState<"file" | "google_drive" | "icloud" | "none">("none"); const [backupFile, setBackupFile] = useState(null); const [b64Backup, setB64Backup] = useState(null); const setWalletSeed = useStoreActions((store) => store.setWalletSeed); const createWallet = useStoreActions((store) => store.createWallet); const isSignedInGoogle = useStoreState((store) => store.google.isSignedIn); const signInGoogle = useStoreActions((store) => store.google.signIn); - const getBackupFile = useStoreActions((store => store.googleDriveBackup.getBackupFile)); + const googleDriveGetBackupFile = useStoreActions((store => store.googleDriveBackup.getBackupFile)); + const iCloudGetBackup = useStoreActions((store => store.iCloudBackup.getBackup)); + const iCloudActive = useStoreState((store) => store.iCloudBackup.iCloudActive); const setSyncEnabled = useStoreActions((state) => state.scheduledSync.setSyncEnabled); const changeScheduledSyncEnabled = useStoreActions((state) => state.settings.changeScheduledSyncEnabled); @@ -53,11 +55,11 @@ export default function Restore({ navigation }: IProps) { if (backupType === "file") { if (backupFile) { - const backupBase64 = await readFile(backupFile.uri, "base64"); + const backupBase64 = await readFile(backupFile.uri, PLATFORM === "android" ? "base64" : undefined); createWalletOpts.restore!.channelsBackup = backupBase64; } } - else if (backupType === "google_drive") { + else if (backupType === "google_drive" || backupType === "icloud") { createWalletOpts.restore!.channelsBackup = b64Backup!; } @@ -87,12 +89,23 @@ export default function Restore({ navigation }: IProps) { } try { - const base64Backup = await getBackupFile(); + const base64Backup = await googleDriveGetBackupFile(); console.log(base64Backup); setB64Backup(base64Backup); setBackupType("google_drive"); } catch (e) { - window.alert(`Restoring via Google Drive failed:\n\n${e.message}`); + Alert.alert(`Restoring via Google Drive failed:\n\n${e.message}`); + } + }; + + const iCloudBackup = async () => { + try { + const base64Backup = await iCloudGetBackup() + console.log(base64Backup); + setB64Backup(base64Backup); + setBackupType("icloud"); + } catch (e) { + Alert.alert(`Restoring via iClouod failed:\n\n${e.message}`); } }; @@ -153,6 +166,13 @@ export default function Restore({ navigation }: IProps) { } + {(PLATFORM === "ios" && iCloudActive) && + + } } {backupType === "file" && @@ -175,6 +195,16 @@ export default function Restore({ navigation }: IProps) { } + {backupType === "icloud" && + + Backup via iCloud + + + } diff --git a/src/windows/Welcome/Start.tsx b/src/windows/Welcome/Start.tsx index 447bc2975..af049ce06 100644 --- a/src/windows/Welcome/Start.tsx +++ b/src/windows/Welcome/Start.tsx @@ -99,11 +99,11 @@ There is currently no WatchTower support to watch your channels while you are of menu.current.hide(); try { // await NativeModules.LndMobile.stopLnd(); - await NativeModules.LndMobile.killLnd(); + await NativeModules.LndMobileTools.killLnd(); } catch(e) { console.log(e); } - NativeModules.LndMobile.restartApp(); + NativeModules.LndMobileTools.restartApp(); } return ( diff --git a/src/windows/Welcome/index.tsx b/src/windows/Welcome/index.tsx index aa4650c72..c2820eced 100644 --- a/src/windows/Welcome/index.tsx +++ b/src/windows/Welcome/index.tsx @@ -6,6 +6,7 @@ import Seed from "./Seed"; import Confirm from "./Confirm"; import AlmostDone from "./AlmostDone"; import GoogleDriveBackup from "./GoogleDriveBackup"; +import ICloudBackup from "./ICloudBackup"; import Restore from "./Restore"; @@ -20,6 +21,7 @@ export type WelcomeStackParamList = { Seed: undefined; Confirm: undefined; GoogleDriveBackup: undefined; + ICloudBackup: undefined; AlmostDone: undefined; Restore: undefined; @@ -44,6 +46,7 @@ export default function WelcomeIndex() { + diff --git a/tests/react/windows/__snapshots__/Receive.test.tsx.snap b/tests/react/windows/__snapshots__/Receive.test.tsx.snap index 9db4e91e7..6f72a50b3 100644 --- a/tests/react/windows/__snapshots__/Receive.test.tsx.snap +++ b/tests/react/windows/__snapshots__/Receive.test.tsx.snap @@ -514,11 +514,11 @@ exports[`renders correctly 1`] = ` - diff --git a/yarn.lock b/yarn.lock index 03baa3a93..3bd9e8587 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16,7 +16,35 @@ dependencies: "@babel/highlight" "^7.10.4" -"@babel/core@7.12.7", "@babel/core@^7.0.0": +"@babel/code-frame@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" + integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/core@7.12.10": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.10.tgz#b79a2e1b9f70ed3d84bbfb6d8c4ef825f606bccd" + integrity sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.12.10" + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helpers" "^7.12.5" + "@babel/parser" "^7.12.10" + "@babel/template" "^7.12.7" + "@babel/traverse" "^7.12.10" + "@babel/types" "^7.12.10" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.19" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/core@^7.0.0": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.7.tgz" integrity sha512-tRKx9B53kJe8NCGGIxEQb2Bkr0riUIEuN7Sc1fxhs5H8lKlCWUvQCSNMVIB0Meva7hcbCRJ76de15KoLltdoqw== @@ -70,12 +98,12 @@ lodash "^4.17.13" source-map "^0.5.0" -"@babel/generator@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.0.tgz" - integrity sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ== +"@babel/generator@^7.12.10", "@babel/generator@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.11.tgz#98a7df7b8c358c9a37ab07a24056853016aba3af" + integrity sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA== dependencies: - "@babel/types" "^7.11.0" + "@babel/types" "^7.12.11" jsesc "^2.5.1" source-map "^0.5.0" @@ -88,13 +116,6 @@ jsesc "^2.5.1" source-map "^0.5.0" -"@babel/helper-annotate-as-pure@^7.0.0": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz" - integrity sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA== - dependencies: - "@babel/types" "^7.10.4" - "@babel/helper-annotate-as-pure@^7.10.1": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.1.tgz" @@ -183,6 +204,15 @@ "@babel/template" "^7.10.4" "@babel/types" "^7.10.4" +"@babel/helper-function-name@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz#1fd7738aee5dcf53c3ecff24f1da9c511ec47b42" + integrity sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA== + dependencies: + "@babel/helper-get-function-arity" "^7.12.10" + "@babel/template" "^7.12.7" + "@babel/types" "^7.12.11" + "@babel/helper-get-function-arity@^7.10.1": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz" @@ -197,6 +227,13 @@ dependencies: "@babel/types" "^7.10.4" +"@babel/helper-get-function-arity@^7.12.10": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz#b158817a3165b5faa2047825dfa61970ddcc16cf" + integrity sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag== + dependencies: + "@babel/types" "^7.12.10" + "@babel/helper-member-expression-to-functions@^7.10.1": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz" @@ -211,13 +248,6 @@ dependencies: "@babel/types" "^7.12.1" -"@babel/helper-module-imports@^7.0.0": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz" - integrity sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw== - dependencies: - "@babel/types" "^7.10.4" - "@babel/helper-module-imports@^7.10.1": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz" @@ -351,6 +381,13 @@ dependencies: "@babel/types" "^7.11.0" +"@babel/helper-split-export-declaration@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz#1b4cc424458643c47d37022223da33d76ea4603a" + integrity sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g== + dependencies: + "@babel/types" "^7.12.11" + "@babel/helper-validator-identifier@^7.10.1": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz" @@ -361,6 +398,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz" integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== +"@babel/helper-validator-identifier@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" + integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== + "@babel/helper-wrap-function@^7.10.1": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.1.tgz" @@ -417,10 +459,10 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.4.tgz" integrity sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA== -"@babel/parser@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.0.tgz" - integrity sha512-qvRvi4oI8xii8NllyEc4MDJjuZiNaRzyb7Y7lup1NqJV8TZHF4O27CcP+72WPn/k1zkgJ6WJfnIbk4jTsVAZHw== +"@babel/parser@^7.12.10", "@babel/parser@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.11.tgz#9ce3595bcd74bc5c466905e86c535b8b25011e79" + integrity sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg== "@babel/parser@^7.12.5": version "7.12.5" @@ -859,14 +901,6 @@ pirates "^4.0.0" source-map-support "^0.5.16" -"@babel/runtime-corejs2@^7.4.5": - version "7.11.2" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs2/-/runtime-corejs2-7.11.2.tgz" - integrity sha512-AC/ciV28adSSpEkBglONBWq4/Lvm6GAZuxIoyVtsnUpZMl0bxLtoChEnYAkP+47KyOCayZanojtflUEUJtR/6Q== - dependencies: - core-js "^2.6.5" - regenerator-runtime "^0.13.4" - "@babel/runtime@7.12.5": version "7.12.5" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz" @@ -874,7 +908,7 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.7": +"@babel/runtime@^7.0.0": version "7.11.2" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.11.2.tgz" integrity sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw== @@ -945,6 +979,21 @@ globals "^11.1.0" lodash "^4.17.19" +"@babel/traverse@^7.12.10": + version "7.12.12" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.12.tgz#d0cd87892704edd8da002d674bc811ce64743376" + integrity sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w== + dependencies: + "@babel/code-frame" "^7.12.11" + "@babel/generator" "^7.12.11" + "@babel/helper-function-name" "^7.12.11" + "@babel/helper-split-export-declaration" "^7.12.11" + "@babel/parser" "^7.12.11" + "@babel/types" "^7.12.12" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.19" + "@babel/traverse@^7.12.7": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.7.tgz" @@ -960,21 +1009,6 @@ globals "^11.1.0" lodash "^4.17.19" -"@babel/traverse@^7.4.5": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.11.0.tgz" - integrity sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.11.0" - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/parser" "^7.11.0" - "@babel/types" "^7.11.0" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.19" - "@babel/types@^7.0.0", "@babel/types@^7.10.1", "@babel/types@^7.10.2", "@babel/types@^7.3.0", "@babel/types@^7.3.3": version "7.10.2" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.2.tgz" @@ -1011,6 +1045,15 @@ lodash "^4.17.19" to-fast-properties "^2.0.0" +"@babel/types@^7.12.10", "@babel/types@^7.12.11", "@babel/types@^7.12.12": + version "7.12.12" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.12.tgz#4608a6ec313abbd87afa55004d373ad04a96c299" + integrity sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ== + dependencies: + "@babel/helper-validator-identifier" "^7.12.11" + lodash "^4.17.19" + to-fast-properties "^2.0.0" + "@babel/types@^7.12.7": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.7.tgz" @@ -1055,106 +1098,6 @@ dependencies: "@types/hammerjs" "^2.0.36" -"@electron/get@^1.0.1": - version "1.12.2" - resolved "https://registry.yarnpkg.com/@electron/get/-/get-1.12.2.tgz" - integrity sha512-vAuHUbfvBQpYTJ5wB7uVIDq5c/Ry0fiTBMs7lnEYAo/qXXppIVcWdfBr57u6eRnKdVso7KSiH6p/LbQAG6Izrg== - dependencies: - debug "^4.1.1" - env-paths "^2.2.0" - fs-extra "^8.1.0" - got "^9.6.0" - progress "^2.0.3" - sanitize-filename "^1.6.2" - sumchecker "^3.0.1" - optionalDependencies: - global-agent "^2.0.2" - global-tunnel-ng "^2.7.1" - -"@emotion/cache@^10.0.27", "@emotion/cache@^10.0.9": - version "10.0.29" - resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-10.0.29.tgz" - integrity sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ== - dependencies: - "@emotion/sheet" "0.9.4" - "@emotion/stylis" "0.8.5" - "@emotion/utils" "0.11.3" - "@emotion/weak-memoize" "0.2.5" - -"@emotion/core@^10.0.9": - version "10.0.35" - resolved "https://registry.yarnpkg.com/@emotion/core/-/core-10.0.35.tgz" - integrity sha512-sH++vJCdk025fBlRZSAhkRlSUoqSqgCzYf5fMOmqqi3bM6how+sQpg3hkgJonj8GxXM4WbD7dRO+4tegDB9fUw== - dependencies: - "@babel/runtime" "^7.5.5" - "@emotion/cache" "^10.0.27" - "@emotion/css" "^10.0.27" - "@emotion/serialize" "^0.11.15" - "@emotion/sheet" "0.9.4" - "@emotion/utils" "0.11.3" - -"@emotion/css@^10.0.27", "@emotion/css@^10.0.9": - version "10.0.27" - resolved "https://registry.yarnpkg.com/@emotion/css/-/css-10.0.27.tgz" - integrity sha512-6wZjsvYeBhyZQYNrGoR5yPMYbMBNEnanDrqmsqS1mzDm1cOTu12shvl2j4QHNS36UaTE0USIJawCH9C8oW34Zw== - dependencies: - "@emotion/serialize" "^0.11.15" - "@emotion/utils" "0.11.3" - babel-plugin-emotion "^10.0.27" - -"@emotion/hash@0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz" - integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== - -"@emotion/is-prop-valid@^0.8.8": - version "0.8.8" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz" - integrity sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA== - dependencies: - "@emotion/memoize" "0.7.4" - -"@emotion/memoize@0.7.4": - version "0.7.4" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz" - integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== - -"@emotion/serialize@^0.11.15", "@emotion/serialize@^0.11.16": - version "0.11.16" - resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-0.11.16.tgz" - integrity sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg== - dependencies: - "@emotion/hash" "0.8.0" - "@emotion/memoize" "0.7.4" - "@emotion/unitless" "0.7.5" - "@emotion/utils" "0.11.3" - csstype "^2.5.7" - -"@emotion/sheet@0.9.4": - version "0.9.4" - resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-0.9.4.tgz" - integrity sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA== - -"@emotion/stylis@0.8.5", "@emotion/stylis@^0.8.4": - version "0.8.5" - resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.5.tgz" - integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ== - -"@emotion/unitless@0.7.5", "@emotion/unitless@^0.7.4": - version "0.7.5" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz" - integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== - -"@emotion/utils@0.11.3": - version "0.11.3" - resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-0.11.3.tgz" - integrity sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw== - -"@emotion/weak-memoize@0.2.5": - version "0.2.5" - resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz" - integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA== - "@fimbul/bifrost@^0.21.0": version "0.21.0" resolved "https://registry.yarnpkg.com/@fimbul/bifrost/-/bifrost-0.21.0.tgz" @@ -1741,11 +1684,6 @@ color "^3.1.3" react-native-iphone-x-helper "^1.3.0" -"@sindresorhus/is@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz" - integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== - "@sinonjs/commons@^1.7.0": version "1.8.0" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.0.tgz" @@ -1760,13 +1698,6 @@ dependencies: "@sinonjs/commons" "^1.7.0" -"@szmarczak/http-timer@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz" - integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== - dependencies: - defer-to-connect "^1.0.1" - "@testing-library/react-native@7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@testing-library/react-native/-/react-native-7.1.0.tgz" @@ -1830,11 +1761,6 @@ dependencies: "@babel/types" "^7.3.0" -"@types/base16@*", "@types/base16@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@types/base16/-/base16-1.0.2.tgz" - integrity sha512-oYO/U4VD1DavwrKuCSQWdLG+5K22SLPem2OQaHmFcQuwHoVeGC+JGVRji2MUqZUAIQZHEonOeVfAX09hYiLsdg== - "@types/base64-js@1.3.0": version "1.3.0" resolved "https://registry.yarnpkg.com/@types/base64-js/-/base64-js-1.3.0.tgz" @@ -1885,11 +1811,6 @@ resolved "https://registry.yarnpkg.com/@types/crypto-js/-/crypto-js-4.0.1.tgz" integrity sha512-6+OPzqhKX/cx5xh+yO8Cqg3u3alrkhoxhE5ZOdSEv0DOzJ13lwJ6laqGU0Kv6+XDMFmlnGId04LtY22PsFLQUw== -"@types/dragula@^3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@types/dragula/-/dragula-3.7.0.tgz" - integrity sha512-Scr3lQ7pDmwic+I4qrzDEIfPVGUhc/qo8S0VJJ9v5pzTyIIJzAXrnFajjsMSL8J84VERIkZUh7wH6wYEisY+TA== - "@types/filesystem@*": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/filesystem/-/filesystem-0.0.29.tgz" @@ -1941,33 +1862,14 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@26.0.15": - version "26.0.15" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.15.tgz" - integrity sha512-s2VMReFXRg9XXxV+CW9e5Nz8fH2K1aEhwgjUqPPbQd7g95T0laAcvLv032EhFHIa5GHsZ8W7iJEQVaJq6k3Gog== +"@types/jest@26.0.19": + version "26.0.19" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.19.tgz#e6fa1e3def5842ec85045bd5210e9bb8289de790" + integrity sha512-jqHoirTG61fee6v6rwbnEuKhpSKih0tuhqeFbCmMmErhtu3BYlOZaXWjffgOstMM4S/3iQD31lI5bGLTrs97yQ== dependencies: jest-diff "^26.0.0" pretty-format "^26.0.0" -"@types/lodash.curry@^4.1.6": - version "4.1.6" - resolved "https://registry.yarnpkg.com/@types/lodash.curry/-/lodash.curry-4.1.6.tgz" - integrity sha512-x3ctCcmOYqRrihNNnQJW6fe/yZFCgnrIa6p80AiPQRO8Jis29bBdy1dEw1FwngoF/mCZa3Bx+33fUZvOEE635Q== - dependencies: - "@types/lodash" "*" - -"@types/lodash.debounce@^4.0.6": - version "4.0.6" - resolved "https://registry.yarnpkg.com/@types/lodash.debounce/-/lodash.debounce-4.0.6.tgz" - integrity sha512-4WTmnnhCfDvvuLMaF3KV4Qfki93KebocUF45msxhYyjMttZDQYzHkO639ohhk8+oco2cluAFL3t5+Jn4mleylQ== - dependencies: - "@types/lodash" "*" - -"@types/lodash@*": - version "4.14.161" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.161.tgz" - integrity sha512-EP6O3Jkr7bXvZZSZYlsgt5DIjiGr0dXP1/jVEwVLTFgg0d+3lWVQkRavYVQszV7dYUwvg0B8R0MBDpcmXg7XIA== - "@types/long@4.0.1", "@types/long@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.1.tgz" @@ -1983,11 +1885,6 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.18.tgz" integrity sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ== -"@types/node@^12.0.12": - version "12.12.54" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.54.tgz" - integrity sha512-ge4xZ3vSBornVYlDnk7yZ0gK6ChHf/CHB7Gl1I0Jhah8DDnEQqBzgohYG4FX4p81TNirSETOiSyn+y1r9/IR6w== - "@types/node@^13.7.0": version "13.13.12" resolved "https://registry.yarnpkg.com/@types/node/-/node-13.13.12.tgz" @@ -1998,17 +1895,12 @@ resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz" integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== -"@types/parse-json@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz" - integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== - "@types/prettier@^2.0.0": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.0.1.tgz" integrity sha512-boy4xPNEtiw6N3abRhBi/e7hNvy3Tt8E9ZRAQrwAGzoCGZS/1wjo9KY7JHhnfnEsG5wSjDbymCozUM9a3ea7OQ== -"@types/prop-types@*", "@types/prop-types@^15.7.3": +"@types/prop-types@*": version "15.7.3" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz" integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== @@ -2038,10 +1930,10 @@ dependencies: "@types/react" "*" -"@types/react-native@0.63.36": - version "0.63.36" - resolved "https://registry.yarnpkg.com/@types/react-native/-/react-native-0.63.36.tgz" - integrity sha512-mCWEiPgi55MkXXMuDe0VsOWO3C4hhj6mO/jnTvy0sXcRD6MbAmGwXnVe5+m1FRCuEQMaJwgG1ZNahZvvyvuGUA== +"@types/react-native@0.63.43": + version "0.63.43" + resolved "https://registry.yarnpkg.com/@types/react-native/-/react-native-0.63.43.tgz#0278dd540f8479b35ae5d6ef373dd9b3be4cffb1" + integrity sha512-zFD+rFf7xmk3ZL5laaGdWB8NLNoN36TjHc2M5PcT5gXcDk7ZJBPsiabNcPDQPSIU/om8YPwBpaFdd1IiyuIM+g== dependencies: "@types/react" "*" @@ -2068,13 +1960,6 @@ "@types/prop-types" "*" csstype "^3.0.2" -"@types/redux-devtools-themes@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/redux-devtools-themes/-/redux-devtools-themes-1.0.0.tgz" - integrity sha512-ul3x0MYM5Nzj57Fh9wINyHFne8vZL04RC4nWAUWLYcL105vHoa/oJyopuKOrQmqVmhqmDiL4c9FfLbUmIB7TWQ== - dependencies: - "@types/base16" "*" - "@types/remote-redux-devtools@0.5.4": version "0.5.4" resolved "https://registry.yarnpkg.com/@types/remote-redux-devtools/-/remote-redux-devtools-0.5.4.tgz" @@ -2125,23 +2010,11 @@ dependencies: "@types/yargs-parser" "*" -"@wry/equality@^0.1.2": - version "0.1.11" - resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.1.11.tgz" - integrity sha512-mwEVBDUVODlsQQ5dfuLUS5/Tf7jqUKyhKYHmVi4fPB6bDMOfWvUPJmKgS1Z7Za/sOI3vzWt4+O7yCiL/70MogA== - dependencies: - tslib "^1.9.3" - abab@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz" integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg== -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - abort-controller@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz" @@ -2195,16 +2068,6 @@ ajv@^6.5.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^6.7.0: - version "6.12.3" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.3.tgz" - integrity sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - anser@^1.4.9: version "1.4.9" resolved "https://registry.yarnpkg.com/anser/-/anser-1.4.9.tgz" @@ -2320,75 +2183,6 @@ anymatch@^3.0.3: normalize-path "^3.0.0" picomatch "^2.0.4" -apollo-cache-control@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/apollo-cache-control/-/apollo-cache-control-0.1.1.tgz" - integrity sha512-XJQs167e9u+e5ybSi51nGYr70NPBbswdvTEHtbtXbwkZ+n9t0SLPvUcoqceayOSwjK1XYOdU/EKPawNdb3rLQA== - dependencies: - graphql-extensions "^0.0.x" - -apollo-link@^1.2.14: - version "1.2.14" - resolved "https://registry.yarnpkg.com/apollo-link/-/apollo-link-1.2.14.tgz" - integrity sha512-p67CMEFP7kOG1JZ0ZkYZwRDa369w5PIjtMjvrQd/HnIV8FRsHRqLqK+oAZQnFa1DDdZtOtHTi+aMIW6EatC2jg== - dependencies: - apollo-utilities "^1.3.0" - ts-invariant "^0.4.0" - tslib "^1.9.3" - zen-observable-ts "^0.8.21" - -apollo-server-core@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-1.4.0.tgz" - integrity sha512-BP1Vh39krgEjkQxbjTdBURUjLHbFq1zeOChDJgaRsMxGtlhzuLWwwC6lLdPatN8jEPbeHq8Tndp9QZ3iQZOKKA== - dependencies: - apollo-cache-control "^0.1.0" - apollo-tracing "^0.1.0" - graphql-extensions "^0.0.x" - -apollo-server-express@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-1.4.0.tgz" - integrity sha512-zkH00nxhLnJfO0HgnNPBTfZw8qI5ILaPZ5TecMCI9+Y9Ssr2b0bFr9pBRsXy9eudPhI+/O4yqegSUsnLdF/CPw== - dependencies: - apollo-server-core "^1.4.0" - apollo-server-module-graphiql "^1.4.0" - -apollo-server-module-graphiql@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/apollo-server-module-graphiql/-/apollo-server-module-graphiql-1.4.0.tgz" - integrity sha512-GmkOcb5he2x5gat+TuiTvabnBf1m4jzdecal3XbXBh/Jg+kx4hcvO3TTDFQ9CuTprtzdcVyA11iqG7iOMOt7vA== - -apollo-tracing@^0.1.0: - version "0.1.4" - resolved "https://registry.yarnpkg.com/apollo-tracing/-/apollo-tracing-0.1.4.tgz" - integrity sha512-Uv+1nh5AsNmC3m130i2u3IqbS+nrxyVV3KYimH5QKsdPjxxIQB3JAT+jJmpeDxBel8gDVstNmCh82QSLxLSIdQ== - dependencies: - graphql-extensions "~0.0.9" - -apollo-utilities@^1.0.1, apollo-utilities@^1.3.0: - version "1.3.4" - resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.3.4.tgz" - integrity sha512-pk2hiWrCXMAy2fRPwEyhvka+mqwzeP60Jr1tRYi5xru+3ko94HI9o6lK0CT33/w4RDlxWchmdhDCrvdr+pHCig== - dependencies: - "@wry/equality" "^0.1.2" - fast-json-stable-stringify "^2.0.0" - ts-invariant "^0.4.0" - tslib "^1.10.0" - -aproba@^1.0.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== - -are-we-there-yet@~1.1.2: - version "1.1.5" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz" - integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" - argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz" @@ -2424,21 +2218,11 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= -array-each@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz" - integrity sha1-p5SvDAWrF1KEbudTofIRoFugxE8= - array-filter@~0.0.0: version "0.0.1" resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz" integrity sha1-fajPLiZijtcygDWB/SH2fKzS7uw= -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz" - integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= - array-map@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz" @@ -2454,11 +2238,6 @@ array-slice@^0.2.3: resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz" integrity sha1-3Tz7gO15c6dRF82sabC5nshhhvU= -array-slice@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz" - integrity sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w== - array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz" @@ -2501,42 +2280,18 @@ async-limiter@^1.0.0: resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== -async@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/async/-/async-2.0.0.tgz" - integrity sha1-0JAK04WvE4BFQKEJxCFm4657K50= - dependencies: - lodash "^4.8.0" - -async@2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/async/-/async-2.3.0.tgz" - integrity sha1-EBPRBRBH3TIP4k5JTVxm7K9hR9k= - dependencies: - lodash "^4.14.0" - -async@^2.4.0, async@^2.6.1: +async@^2.4.0: version "2.6.3" resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz" integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== dependencies: lodash "^4.17.14" -async@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz" - integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw== - asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz" integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= -atoa@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/atoa/-/atoa-1.0.0.tgz" - integrity sha1-DMDpGkgOc4+SPrwQNnZHF3mzSkk= - atob@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz" @@ -2582,22 +2337,6 @@ babel-plugin-dynamic-import-node@^2.3.3: dependencies: object.assign "^4.1.0" -babel-plugin-emotion@^10.0.27: - version "10.0.33" - resolved "https://registry.yarnpkg.com/babel-plugin-emotion/-/babel-plugin-emotion-10.0.33.tgz" - integrity sha512-bxZbTTGz0AJQDHm8k6Rf3RQJ8tX2scsfsRyKVgAbiUPUNIRtlK+7JxP+TAd1kRLABFxe0CFm2VdK4ePkoA9FxQ== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@emotion/hash" "0.8.0" - "@emotion/memoize" "0.7.4" - "@emotion/serialize" "^0.11.16" - babel-plugin-macros "^2.0.0" - babel-plugin-syntax-jsx "^6.18.0" - convert-source-map "^1.5.0" - escape-string-regexp "^1.0.5" - find-root "^1.1.0" - source-map "^0.5.7" - babel-plugin-istanbul@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz" @@ -2619,30 +2358,6 @@ babel-plugin-jest-hoist@^26.6.2: "@types/babel__core" "^7.0.0" "@types/babel__traverse" "^7.0.6" -babel-plugin-macros@^2.0.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz" - integrity sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg== - dependencies: - "@babel/runtime" "^7.7.2" - cosmiconfig "^6.0.0" - resolve "^1.12.0" - -"babel-plugin-styled-components@>= 1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-1.11.1.tgz" - integrity sha512-YwrInHyKUk1PU3avIRdiLyCpM++18Rs1NgyMXEAQC33rIXs/vro0A+stf4sT0Gf22Got+xRWB8Cm0tw+qkRzBA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-module-imports" "^7.0.0" - babel-plugin-syntax-jsx "^6.18.0" - lodash "^4.17.11" - -babel-plugin-syntax-jsx@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz" - integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY= - babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0: version "7.0.0-beta.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz" @@ -2724,11 +2439,6 @@ base-x@^3.0.2: dependencies: safe-buffer "^5.0.1" -base16@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/base16/-/base16-1.0.0.tgz" - integrity sha1-4pf2DX7BAUp6lxo568ipjAtoHnA= - base64-js@*, base64-js@^1.0.2, base64-js@^1.1.2, base64-js@^1.2.3: version "1.3.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz" @@ -2739,11 +2449,6 @@ base64-js@1.5.1: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -base64id@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz" - integrity sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY= - base@^0.11.1: version "0.11.2" resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz" @@ -2757,13 +2462,6 @@ base@^0.11.1: mixin-deep "^1.2.0" pascalcase "^0.1.1" -basic-auth@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz" - integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== - dependencies: - safe-buffer "5.1.2" - bcrypt-pbkdf@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz" @@ -2831,18 +2529,6 @@ bitcoinjs-lib@^3.3.1: varuint-bitcoin "^1.0.4" wif "^2.0.1" -block-stream@*: - version "0.0.9" - resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz" - integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= - dependencies: - inherits "~2.0.0" - -bluebird@^3.7.0: - version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== - blueimp-md5@^2.5.0: version "2.18.0" resolved "https://registry.yarnpkg.com/blueimp-md5/-/blueimp-md5-2.18.0.tgz#1152be1335f0c6b3911ed9e36db54f3e6ac52935" @@ -2853,22 +2539,6 @@ bn.js@^4.11.8, bn.js@^4.4.0: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz" integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== -body-parser@1.19.0, body-parser@^1.19.0: - version "1.19.0" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz" - integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== - dependencies: - bytes "3.1.0" - content-type "~1.0.4" - debug "2.6.9" - depd "~1.1.2" - http-errors "1.7.2" - iconv-lite "0.4.24" - on-finished "~2.3.0" - qs "6.7.0" - raw-body "2.4.0" - type-is "~1.6.17" - bolt11@1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/bolt11/-/bolt11-1.2.7.tgz" @@ -2889,11 +2559,6 @@ boolbase@^1.0.0, boolbase@~1.0.0: resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz" integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= -boolean@^3.0.0, boolean@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.0.1.tgz" - integrity sha512-HRZPIjPcbwAVQvOTxR4YE3o8Xs98NqbbL1iEZDCz7CL8ql0Lt5iOyJFxfnAB0oFs8Oh02F/lLlg30Mexv46LjA== - bplist-creator@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/bplist-creator/-/bplist-creator-0.0.8.tgz" @@ -2997,16 +2662,11 @@ buffer-alloc@^1.2.0: buffer-alloc-unsafe "^1.1.0" buffer-fill "^1.0.0" -buffer-crc32@^0.2.13, buffer-crc32@~0.2.3: +buffer-crc32@^0.2.13: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz" integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= -buffer-equal-constant-time@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz" - integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= - buffer-fill@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz" @@ -3040,11 +2700,6 @@ bytes@3.0.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz" integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= -bytes@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz" - integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== - cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz" @@ -3060,19 +2715,6 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" -cacheable-request@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz" - integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== - dependencies: - clone-response "^1.0.2" - get-stream "^5.1.0" - http-cache-semantics "^4.0.0" - keyv "^3.0.0" - lowercase-keys "^2.0.0" - normalize-url "^4.1.0" - responselike "^1.0.2" - caller-callsite@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz" @@ -3107,11 +2749,6 @@ camelcase@^6.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.0.0.tgz" integrity sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w== -camelize@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz" - integrity sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs= - capture-exit@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz" @@ -3163,7 +2800,7 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.0.0, chalk@^4.1.0: +chalk@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz" integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== @@ -3181,11 +2818,6 @@ chardet@^0.4.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz" integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I= -chownr@^1.1.1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== - ci-info@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz" @@ -3254,13 +2886,6 @@ cliui@^6.0.0: strip-ansi "^6.0.0" wrap-ansi "^6.2.0" -clone-response@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz" - integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= - dependencies: - mimic-response "^1.0.0" - clone@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz" @@ -3276,16 +2901,6 @@ co@^4.6.0: resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz" integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= - -codemirror@^5.56.0: - version "5.56.0" - resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-5.56.0.tgz" - integrity sha512-MfKVmYgifXjQpLSgpETuih7A7WTTIsxvKfSLGseTY5+qt0E1UD1wblZGM6WLenORo8sgmf+3X+WTe2WF7mufyw== - coininfo@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/coininfo/-/coininfo-4.5.0.tgz" @@ -3367,11 +2982,6 @@ color@^3.1.2: color-convert "^1.9.1" color-string "^1.5.2" -colorette@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.1.0.tgz" - integrity sha512-6S062WDQUXi6hOfkO/sBPVwE5ASXY4G2+b4atvhJfSsuUUhIaUKlkjLe9692Ipyt5/a+IPF5aVTu3V5gvXq5cg== - colorette@^1.0.7: version "1.2.0" resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.0.tgz" @@ -3394,11 +3004,6 @@ commander@^2.12.1, commander@^2.19.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz" - integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== - commander@~2.13.0: version "2.13.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz" @@ -3444,7 +3049,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@^1.6.0, concat-stream@^1.6.2: +concat-stream@^1.6.0: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -3454,14 +3059,6 @@ concat-stream@^1.6.0, concat-stream@^1.6.2: readable-stream "^2.2.2" typedarray "^0.0.6" -config-chain@^1.1.11: - version "1.1.12" - resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz" - integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA== - dependencies: - ini "^1.3.4" - proto-list "~1.2.1" - connect@^3.6.5: version "3.7.0" resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz" @@ -3472,48 +3069,13 @@ connect@^3.6.5: parseurl "~1.3.3" utils-merge "1.0.1" -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= - -content-disposition@0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz" - integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== - dependencies: - safe-buffer "5.1.2" - -content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== - -contra@1.9.4: - version "1.9.4" - resolved "https://registry.yarnpkg.com/contra/-/contra-1.9.4.tgz" - integrity sha1-9TveQtfltZhcrk2ZqNYQUm3o8o0= - dependencies: - atoa "1.0.0" - ticky "1.0.1" - -convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: +convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz" integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== dependencies: safe-buffer "~5.1.1" -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz" - integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= - -cookie@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz" - integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== - copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz" @@ -3524,29 +3086,16 @@ core-js@^1.0.0: resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz" integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= -core-js@^2.2.2, core-js@^2.4.1, core-js@^2.5.3, core-js@^2.5.7, core-js@^2.6.5: +core-js@^2.2.2, core-js@^2.4.1: version "2.6.11" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz" integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== -core-js@^3.6.5: - version "3.6.5" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.5.tgz" - integrity sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA== - core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -cors@^2.8.5: - version "2.8.5" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz" - integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== - dependencies: - object-assign "^4" - vary "^1" - cosmiconfig@^5.0.5, cosmiconfig@^5.1.0: version "5.2.1" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz" @@ -3557,17 +3106,6 @@ cosmiconfig@^5.0.5, cosmiconfig@^5.1.0: js-yaml "^3.13.1" parse-json "^4.0.0" -cosmiconfig@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz" - integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.1.0" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.7.2" - create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz" @@ -3627,7 +3165,7 @@ cross-spawn@^6.0.0: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.0, cross-spawn@^7.0.3: +cross-spawn@^7.0.0: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -3636,23 +3174,11 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -crossvent@1.5.4: - version "1.5.4" - resolved "https://registry.yarnpkg.com/crossvent/-/crossvent-1.5.4.tgz" - integrity sha1-2ixPj0DJR4JRe/K+7BBEFIGUq5I= - dependencies: - custom-event "1.0.0" - crypto-js@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.0.0.tgz" integrity sha512-bzHZN8Pn+gS7DQA6n+iUmBfl0hO5DJq++QP3U6uTucDtk/0iGpXd/Gg7CGR0p8tJhofJyaKoWBuJI4eAO00BBg== -css-color-keywords@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz" - integrity sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU= - css-select@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz" @@ -3663,15 +3189,6 @@ css-select@^2.1.0: domutils "^1.7.0" nth-check "^1.0.2" -css-to-react-native@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.0.0.tgz" - integrity sha512-Ro1yETZA813eoyUp2GDBhG2j+YggidUmzO1/v9eYBKR2EHVEniE2MI/NqpTQ954BMpTPZFsGNPm46qFB9dpaPQ== - dependencies: - camelize "^1.0.0" - css-color-keywords "^1.0.0" - postcss-value-parser "^4.0.2" - css-tree@^1.0.0-alpha.39: version "1.0.0-alpha.39" resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.39.tgz" @@ -3680,14 +3197,6 @@ css-tree@^1.0.0-alpha.39: mdn-data "2.0.6" source-map "^0.6.1" -css-vendor@^2.0.8: - version "2.0.8" - resolved "https://registry.yarnpkg.com/css-vendor/-/css-vendor-2.0.8.tgz" - integrity sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ== - dependencies: - "@babel/runtime" "^7.8.3" - is-in-browser "^1.0.2" - css-what@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.3.0.tgz" @@ -3715,44 +3224,11 @@ csstype@^2.2.0: resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.10.tgz" integrity sha512-D34BqZU4cIlMCY93rZHbrq9pjTAQJ3U8S8rfBqjwHxkGPThWFjzZDQpgMJY0QViLxth6ZKYiwFBo14RdN44U/w== -csstype@^2.5.7: - version "2.6.13" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.13.tgz" - integrity sha512-ul26pfSQTZW8dcOnD2iiJssfXw0gdNVX9IJDH/X3K5DGPfj+fUYe3kB+swUY6BF3oZDxaID3AJt+9/ojSAE05A== - csstype@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.2.tgz" integrity sha512-ofovWglpqoqbfLNOTBNZLSbMuGrblAf1efvvArGKOZMBrIoJeu5UsAipQolkijtyQx5MtAzT/J9IHj/CEY1mJw== -custom-event@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.0.tgz" - integrity sha1-LkYovhncSyFLXAJjDFlx6BFhgGI= - -d3-state-visualizer@^1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/d3-state-visualizer/-/d3-state-visualizer-1.3.4.tgz" - integrity sha512-AKksKbczleaV9UvAImfWQmaIiImoe4t7H8edOksytiZ6Yo8BGvZ3P7RGZpddaZ8SnM8k2tEFAHFtyCMd1jVm7w== - dependencies: - d3 "^3.5.17" - d3tooltip "^1.2.3" - deepmerge "^4.2.2" - map2tree "^1.4.2" - ramda "^0.27.1" - -d3@^3.5.17: - version "3.5.17" - resolved "https://registry.yarnpkg.com/d3/-/d3-3.5.17.tgz" - integrity sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g= - -d3tooltip@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/d3tooltip/-/d3tooltip-1.2.3.tgz" - integrity sha512-VoguUK+Hxy9Ruhqm6O1UKmETNWjASNTK+gzR9G5r3AAgGp0ENCGWg860Eh5YJThPpog33eAD+afQ31PfJwAz+A== - dependencies: - ramda "^0.27.1" - dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz" @@ -3774,37 +3250,25 @@ date-fns@2.16.1: resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.16.1.tgz" integrity sha512-sAJVKx/FqrLYHAQeN7VpJrPhagZc9R4ImZIWYRFZaaohR3KzmuK88touwsSwSVT8Qcbd4zoDsnGfX4GFB4imyQ== -dateformat@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz" - integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== - dayjs@^1.8.15: version "1.8.28" resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.8.28.tgz" integrity sha512-ccnYgKC0/hPSGXxj7Ju6AV/BP4HUkXC2u15mikXT5mX9YorEaoi1bEKOmAqdkJHN4EEkmAf97SpH66Try5Mbeg== -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: +debug@2.6.9, debug@^2.2.0, debug@^2.3.3: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@4.1.1, debug@^4.1.0, debug@^4.1.1: +debug@^4.1.0, debug@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz" integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== dependencies: ms "^2.1.1" -debug@^3.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== - dependencies: - ms "^2.1.1" - decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz" @@ -3820,13 +3284,6 @@ decode-uri-component@^0.2.0: resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz" integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= -decompress-response@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz" - integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= - dependencies: - mimic-response "^1.0.0" - deep-assign@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/deep-assign/-/deep-assign-3.0.0.tgz" @@ -3834,11 +3291,6 @@ deep-assign@^3.0.0: dependencies: is-obj "^1.0.0" -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz" @@ -3861,12 +3313,7 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" -defer-to-connect@^1.0.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz" - integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== - -define-properties@^1.1.2, define-properties@^1.1.3: +define-properties@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz" integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== @@ -3900,11 +3347,6 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= - denodeify@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/denodeify/-/denodeify-1.2.1.tgz" @@ -3915,63 +3357,16 @@ depd@~1.1.2: resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz" integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= -depd@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -deprecated-decorator@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz" - integrity sha1-AJZjF7ehL+kvPMgx91g68ym4bDc= - destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= -detect-file@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz" - integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= - -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= - detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== -detect-node@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz" - integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== - -devui@^1.0.0-6: - version "1.0.0-6" - resolved "https://registry.yarnpkg.com/devui/-/devui-1.0.0-6.tgz" - integrity sha512-9hMso1CG4qnpf+6SP4zlnvgCYxEwEXC6tWzhMrTILEE37Ra6veyo9B3Y5MKVNC/xhSqHavmdft780Y9YBnMtqA== - dependencies: - base16 "^1.0.0" - codemirror "^5.56.0" - color "^3.1.2" - prop-types "^15.7.2" - react-icons "^3.10.0" - react-is "^16.13.1" - react-jsonschema-form "^1.8.1" - react-select "^3.1.0" - redux-devtools-themes "^1.0.0" - simple-element-resize-detector "^1.3.0" - styled-components "^5.1.1" - -diff-match-patch@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/diff-match-patch/-/diff-match-patch-1.0.5.tgz" - integrity sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw== - diff-sequences@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz" @@ -4000,14 +3395,6 @@ doctrine@0.7.2: esutils "^1.1.6" isarray "0.0.1" -dom-helpers@^5.0.1: - version "5.2.0" - resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.0.tgz" - integrity sha512-Ru5o9+V8CpunKnz5LGgWXkmrH/20cGKwcHwS4m73zIvs54CN9epEmT/HLqFJW3kXpakAFkEdzgy1hzlJe3E4OQ== - dependencies: - "@babel/runtime" "^7.8.7" - csstype "^3.0.2" - dom-serializer@0: version "0.2.2" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz" @@ -4041,14 +3428,6 @@ domutils@^1.7.0: dom-serializer "0" domelementtype "1" -dragula@3.7.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/dragula/-/dragula-3.7.2.tgz" - integrity sha1-SjXJ05gf+sGpScKcpyhQWOhzk84= - dependencies: - contra "1.9.4" - crossvent "1.5.4" - drbg.js@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/drbg.js/-/drbg.js-1.0.1.tgz" @@ -4058,11 +3437,6 @@ drbg.js@^1.0.1: create-hash "^1.1.2" create-hmac "^1.1.4" -duplexer3@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz" - integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= - easy-peasy@4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/easy-peasy/-/easy-peasy-4.0.1.tgz" @@ -4085,13 +3459,6 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" -ecdsa-sig-formatter@1.0.11: - version "1.0.11" - resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz" - integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== - dependencies: - safe-buffer "^5.0.1" - ecurve@^1.0.0: version "1.0.6" resolved "https://registry.yarnpkg.com/ecurve/-/ecurve-1.0.6.tgz" @@ -4105,15 +3472,6 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron@^9.2.0: - version "9.2.1" - resolved "https://registry.yarnpkg.com/electron/-/electron-9.2.1.tgz" - integrity sha512-ZsetaQjXB8+9/EFW1FnfK4ukpkwXCxMEaiKiUZhZ0ZLFlLnFCpe0Bg4vdDf7e4boWGcnlgN1jAJpBw7w0eXuqA== - dependencies: - "@electron/get" "^1.0.1" - "@types/node" "^12.0.12" - extract-zip "^1.0.3" - elliptic@^6.5.2: version "6.5.3" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz" @@ -4142,7 +3500,7 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -encodeurl@^1.0.2, encodeurl@~1.0.2: +encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= @@ -4166,11 +3524,6 @@ entities@^2.0.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.3.tgz" integrity sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ== -env-paths@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.0.tgz" - integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA== - envinfo@^7.7.2: version "7.7.3" resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.7.3.tgz" @@ -4191,26 +3544,6 @@ errorhandler@^1.5.0: accepts "~1.3.7" escape-html "~1.0.3" -es6-error@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz" - integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== - -es6-template-regex@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/es6-template-regex/-/es6-template-regex-0.1.1.tgz" - integrity sha1-5Re54PdCvuuNMECDRUT9oORlFGc= - -es6template@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/es6template/-/es6template-1.0.5.tgz" - integrity sha1-O7u5efpriudlsMmGMQ9yAHJWKp8= - dependencies: - es6-template-regex "^0.1.1" - extend-shallow "^2.0.1" - get-value "^2.0.2" - sliced "^1.0.1" - escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz" @@ -4344,13 +3677,6 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" -expand-tilde@^2.0.0, expand-tilde@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz" - integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= - dependencies: - homedir-polyfill "^1.0.1" - expect@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/expect/-/expect-26.6.2.tgz" @@ -4363,52 +3689,11 @@ expect@^26.6.2: jest-message-util "^26.6.2" jest-regex-util "^26.0.0" -expirymanager@^0.9.3: - version "0.9.3" - resolved "https://registry.yarnpkg.com/expirymanager/-/expirymanager-0.9.3.tgz" - integrity sha1-5fazugDY12z2MxHCtx19/JvePk8= - expr-eval@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/expr-eval/-/expr-eval-2.0.2.tgz" integrity sha512-4EMSHGOPSwAfBiibw3ndnP0AvjDWLsMvGOvWEZ2F96IGk0bIVdjQisOHxReSkE13mHcfbuCiXw+G4y0zv6N8Eg== -express@^4.17.1: - version "4.17.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz" - integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== - dependencies: - accepts "~1.3.7" - array-flatten "1.1.1" - body-parser "1.19.0" - content-disposition "0.5.3" - content-type "~1.0.4" - cookie "0.4.0" - cookie-signature "1.0.6" - debug "2.6.9" - depd "~1.1.2" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "~1.1.2" - fresh "0.5.2" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "~2.3.0" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.5" - qs "6.7.0" - range-parser "~1.2.1" - safe-buffer "5.1.2" - send "0.17.1" - serve-static "1.14.1" - setprototypeof "1.1.1" - statuses "~1.5.0" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - extend-shallow@^1.1.2: version "1.1.4" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-1.1.4.tgz" @@ -4431,12 +3716,12 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@^3.0.0, extend@~3.0.2: +extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -external-editor@^2.0.4, external-editor@^2.1.0: +external-editor@^2.0.4: version "2.2.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz" integrity sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A== @@ -4459,16 +3744,6 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" -extract-zip@^1.0.3: - version "1.7.0" - resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.7.0.tgz" - integrity sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA== - dependencies: - concat-stream "^1.6.2" - debug "^2.6.9" - mkdirp "^0.5.4" - yauzl "^2.10.0" - extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz" @@ -4577,13 +3852,6 @@ fbjs@^3.0.0: setimmediate "^1.0.5" ua-parser-js "^0.7.18" -fd-slicer@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz" - integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= - dependencies: - pend "~1.2.0" - figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz" @@ -4613,7 +3881,7 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -finalhandler@1.1.2, finalhandler@~1.1.2: +finalhandler@1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz" integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== @@ -4635,11 +3903,6 @@ find-cache-dir@^2.0.0: make-dir "^2.0.0" pkg-dir "^3.0.0" -find-root@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz" - integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== - find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz" @@ -4655,49 +3918,11 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" -findup-sync@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz" - integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== - dependencies: - detect-file "^1.0.0" - is-glob "^4.0.0" - micromatch "^3.0.4" - resolve-dir "^1.0.1" - -fined@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fined/-/fined-1.2.0.tgz" - integrity sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng== - dependencies: - expand-tilde "^2.0.2" - is-plain-object "^2.0.3" - object.defaults "^1.1.0" - object.pick "^1.2.0" - parse-filepath "^1.0.1" - -flagged-respawn@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.1.tgz" - integrity sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q== - -fleximap@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fleximap/-/fleximap-1.0.0.tgz" - integrity sha512-zg/PthjBzESYKomTw/wivo8Id6B+obVkWriIzDuRfuw4wxEIV2/0D/NIGf+LKcGTTifHRfw73+oAAQozZ9MAhA== - -for-in@^1.0.1, for-in@^1.0.2: +for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz" integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= -for-own@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz" - integrity sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs= - dependencies: - for-in "^1.0.1" - forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz" @@ -4712,11 +3937,6 @@ form-data@~2.3.2: combined-stream "^1.0.6" mime-types "^2.1.12" -forwarded@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz" - integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= - fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz" @@ -4729,15 +3949,6 @@ fresh@0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz" integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= -fs-extra@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-6.0.1.tgz" - integrity sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - fs-extra@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz" @@ -4764,13 +3975,6 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-minipass@^1.2.5: - version "1.2.7" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz" - integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== - dependencies: - minipass "^2.6.0" - fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz" @@ -4789,35 +3993,11 @@ fsevents@^2.1.2: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz" integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== -fstream@^1.0.0, fstream@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz" - integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== - dependencies: - graceful-fs "^4.1.2" - inherits "~2.0.0" - mkdirp ">=0.5 0" - rimraf "2" - function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - gensync@^1.0.0-beta.1: version "1.0.0-beta.1" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz" @@ -4843,7 +4023,7 @@ get-stdin@^6.0.0: resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== -get-stream@^4.0.0, get-stream@^4.1.0: +get-stream@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz" integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== @@ -4857,23 +4037,11 @@ get-stream@^5.0.0: dependencies: pump "^3.0.0" -get-stream@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== - dependencies: - pump "^3.0.0" - -get-value@^2.0.2, get-value@^2.0.3, get-value@^2.0.6: +get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz" integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= -getopts@2.2.5: - version "2.2.5" - resolved "https://registry.yarnpkg.com/getopts/-/getopts-2.2.5.tgz" - integrity sha512-9jb7AW5p3in+IiJWhQiZmmwkpLaR/ccTWdWQCtZM66HJcHHLegowh4q4tSD7gouUyeNvFWRavfK9GXosQHDpFA== - getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz" @@ -4881,12 +4049,7 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" -getport@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/getport/-/getport-0.1.0.tgz" - integrity sha1-q93z1dHnfdlnzPorA2oKH7Jv1/c= - -glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: +glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -4898,116 +4061,16 @@ glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" -global-agent@^2.0.2: - version "2.1.12" - resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-2.1.12.tgz" - integrity sha512-caAljRMS/qcDo69X9BfkgrihGUgGx44Fb4QQToNQjsiWh+YlQ66uqYVAdA8Olqit+5Ng0nkz09je3ZzANMZcjg== - dependencies: - boolean "^3.0.1" - core-js "^3.6.5" - es6-error "^4.1.1" - matcher "^3.0.0" - roarr "^2.15.3" - semver "^7.3.2" - serialize-error "^7.0.1" - -global-modules@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz" - integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== - dependencies: - global-prefix "^1.0.1" - is-windows "^1.0.1" - resolve-dir "^1.0.0" - -global-prefix@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz" - integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= - dependencies: - expand-tilde "^2.0.2" - homedir-polyfill "^1.0.1" - ini "^1.3.4" - is-windows "^1.0.1" - which "^1.2.14" - -global-tunnel-ng@^2.7.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz" - integrity sha512-4s+DyciWBV0eK148wqXxcmVAbFVPqtc3sEtUE/GTQfuU80rySLcMhUmHKSHI7/LDj8q0gDYI1lIhRRB7ieRAqg== - dependencies: - encodeurl "^1.0.2" - lodash "^4.17.10" - npm-conf "^1.1.3" - tunnel "^0.0.6" - globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globalthis@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.1.tgz" - integrity sha512-mJPRTc/P39NH/iNG4mXa9aIhNymaQikTrnspeCa2ZuJ+mH2QN/rXwtX3XwKrHqWgUQFbNZKtHM105aHzJalElw== - dependencies: - define-properties "^1.1.3" - -got@^9.6.0: - version "9.6.0" - resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz" - integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== - dependencies: - "@sindresorhus/is" "^0.14.0" - "@szmarczak/http-timer" "^1.1.2" - cacheable-request "^6.0.0" - decompress-response "^3.3.0" - duplexer3 "^0.1.4" - get-stream "^4.1.0" - lowercase-keys "^1.0.1" - mimic-response "^1.0.1" - p-cancelable "^1.0.0" - to-readable-stream "^1.0.0" - url-parse-lax "^3.0.0" - graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.4: version "4.2.4" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz" integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== -graphql-extensions@^0.0.x, graphql-extensions@~0.0.9: - version "0.0.10" - resolved "https://registry.yarnpkg.com/graphql-extensions/-/graphql-extensions-0.0.10.tgz" - integrity sha512-TnQueqUDCYzOSrpQb3q1ngDSP2otJSF+9yNLrQGPzkMsvnQ+v6e2d5tl+B35D4y+XpmvVnAn4T3ZK28mkILveA== - dependencies: - core-js "^2.5.3" - source-map-support "^0.5.1" - -graphql-server-express@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/graphql-server-express/-/graphql-server-express-1.4.1.tgz" - integrity sha512-7HEIz2USTCXgk4YMKIcOVUdVZQT429nZnPQr4Gqp5pydZ08KJM9Y2sl9+VU+3a91HGKyrtF04eUumuYeS2fDcg== - dependencies: - apollo-server-express "^1.4.0" - -graphql-tools@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/graphql-tools/-/graphql-tools-4.0.8.tgz" - integrity sha512-MW+ioleBrwhRjalKjYaLQbr+920pHBgy9vM/n47sswtns8+96sRn5M/G+J1eu7IMeKWiN/9p6tmwCHU7552VJg== - dependencies: - apollo-link "^1.2.14" - apollo-utilities "^1.0.1" - deprecated-decorator "^0.1.6" - iterall "^1.1.3" - uuid "^3.1.0" - -graphql@^0.13.2: - version "0.13.2" - resolved "https://registry.yarnpkg.com/graphql/-/graphql-0.13.2.tgz" - integrity sha512-QZ5BL8ZO/B20VA8APauGBg3GyEgZ19eduvpLWoq5x7gMmWnHoy8rlQWPLmWgFvo1yNgjSEFMesmS4R6pPr7xog== - dependencies: - iterall "^1.2.1" - growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz" @@ -5048,11 +4111,6 @@ has-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz" integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= - has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz" @@ -5125,11 +4183,6 @@ hermes-profile-transformer@^0.0.6: dependencies: source-map "^0.7.3" -hex-rgba@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/hex-rgba/-/hex-rgba-1.0.2.tgz" - integrity sha512-MKla68wFGv+i7zU3Q4giWN74f+zWdkuf2Tk21fISV7aw55r8dH/noBbH5JsVlM4Z2WRTYCEmSxsoZ1QR/o68jg== - hmac-drbg@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz" @@ -5144,25 +4197,13 @@ hoist-non-react-statics@^1.0.5: resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz#aa448cf0986d55cc40773b17174b7dd066cb7cfb" integrity sha1-qkSM8JhtVcxAdzsXF0t90GbLfPs= -hoist-non-react-statics@^2.3.1: - version "2.5.5" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz" - integrity sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw== - -hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.3.0: +hoist-non-react-statics@^3.3.0: version "3.3.2" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== dependencies: react-is "^16.7.0" -homedir-polyfill@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz" - integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== - dependencies: - parse-passwd "^1.0.0" - hosted-git-info@^2.1.4: version "2.8.8" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz" @@ -5175,32 +4216,11 @@ html-encoding-sniffer@^2.0.1: dependencies: whatwg-encoding "^1.0.5" -html-entities@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.3.1.tgz" - integrity sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA== - html-escaper@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== -http-cache-semantics@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz" - integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== - -http-errors@1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz" - integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - http-errors@~1.7.2: version "1.7.3" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz" @@ -5226,12 +4246,7 @@ human-signals@^1.1.1: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz" integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== -hyphenate-style-name@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz" - integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== - -iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@^0.4.4, iconv-lite@~0.4.13: +iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@~0.4.13: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -5243,23 +4258,11 @@ ieee754@^1.1.4: resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz" integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== -ignore-walk@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz" - integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== - dependencies: - minimatch "^3.0.4" - image-size@^0.6.0: version "0.6.3" resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.6.3.tgz" integrity sha512-47xSUiQioGaB96nqtp5/q55m0aBQSQdyIloMOc/x+QVTDZLNmXE892IIDrJ0hM1A5vcNUDD5tDffkSP5lCaIIA== -immediate@~3.0.5: - version "3.0.6" - resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz" - integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps= - immer@7.0.9: version "7.0.9" resolved "https://registry.yarnpkg.com/immer/-/immer-7.0.9.tgz" @@ -5273,14 +4276,6 @@ import-fresh@^2.0.0: caller-path "^2.0.0" resolve-from "^3.0.0" -import-fresh@^3.1.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz" - integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - import-local@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz" @@ -5302,40 +4297,11 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.0, inherits@~2.0.3, inherits@~2.0.4: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= - -ini@^1.3.4, ini@~1.3.0: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz" - integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== - -inquirer@5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-5.2.0.tgz" - integrity sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ== - dependencies: - ansi-escapes "^3.0.0" - chalk "^2.0.0" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^2.1.0" - figures "^2.0.0" - lodash "^4.3.0" - mute-stream "0.0.7" - run-async "^2.2.0" - rxjs "^5.5.2" - string-width "^2.1.0" - strip-ansi "^4.0.0" - through "^2.3.6" - inquirer@^3.0.6: version "3.3.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz" @@ -5356,11 +4322,6 @@ inquirer@^3.0.6: strip-ansi "^4.0.0" through "^2.3.6" -interpret@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== - invariant@2.2.4, invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz" @@ -5383,19 +4344,6 @@ ip@^1.1.5: resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz" integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -is-absolute@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz" - integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA== - dependencies: - is-relative "^1.0.0" - is-windows "^1.0.1" - is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz" @@ -5493,18 +4441,6 @@ is-extendable@^1.0.1: dependencies: is-plain-object "^2.0.4" -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= - dependencies: - number-is-nan "^1.0.0" - is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" @@ -5520,18 +4456,6 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== -is-glob@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== - dependencies: - is-extglob "^2.1.1" - -is-in-browser@^1.0.2, is-in-browser@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/is-in-browser/-/is-in-browser-1.1.3.tgz" - integrity sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU= - is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz" @@ -5566,13 +4490,6 @@ is-potential-custom-element-name@^1.0.0: resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz" integrity sha1-DFLlS8yjkbssSUsh6GJtczbG45c= -is-relative@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz" - integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA== - dependencies: - is-unc-path "^1.0.0" - is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz" @@ -5588,14 +4505,7 @@ is-typedarray@^1.0.0, is-typedarray@~1.0.0: resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= -is-unc-path@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz" - integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ== - dependencies: - unc-path-regex "^0.1.2" - -is-windows@^1.0.1, is-windows@^1.0.2: +is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== @@ -5605,7 +4515,7 @@ is-wsl@^1.1.0: resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz" integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= -is-wsl@^2.1.1, is-wsl@^2.2.0: +is-wsl@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz" integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== @@ -5698,16 +4608,6 @@ istanbul-reports@^3.0.2: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -iterall@^1.1.3, iterall@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.3.0.tgz" - integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg== - -javascript-stringify@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/javascript-stringify/-/javascript-stringify-2.0.1.tgz" - integrity sha512-yV+gqbd5vaOYjqlbk16EG89xB5udgjqQF3C5FAORDg4f/IS1Yc5ERCv5e/57yBcfJYw05V5JyIXabhwb75Xxow== - jest-changed-files@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-26.6.2.tgz" @@ -6272,11 +5172,6 @@ jsesc@~0.5.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz" integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= -json-buffer@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz" - integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= - json-parse-better-errors@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz" @@ -6299,7 +5194,7 @@ json-stable-stringify@^1.0.1: dependencies: jsonify "~0.0.0" -json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: +json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= @@ -6311,14 +5206,6 @@ json5@^2.1.2: dependencies: minimist "^1.2.5" -jsondiffpatch@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/jsondiffpatch/-/jsondiffpatch-0.4.1.tgz" - integrity sha512-t0etAxTUk1w5MYdNOkZBZ8rvYYN5iL+2dHCCx/DpkFm/bW28M6y5nUS83D4XdZiHy35Fpaw6LBb+F88fHZnVCw== - dependencies: - chalk "^2.3.0" - diff-match-patch "^1.0.0" - jsonfile@^2.1.0: version "2.4.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz" @@ -6338,22 +5225,6 @@ jsonify@~0.0.0: resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz" integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= -jsonwebtoken@^8.3.0: - version "8.5.1" - resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz" - integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== - dependencies: - jws "^3.2.2" - lodash.includes "^4.3.0" - lodash.isboolean "^3.0.3" - lodash.isinteger "^4.0.4" - lodash.isnumber "^3.0.3" - lodash.isplainobject "^4.0.6" - lodash.isstring "^4.0.1" - lodash.once "^4.0.0" - ms "^2.1.1" - semver "^5.6.0" - jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz" @@ -6364,164 +5235,6 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" -jss-plugin-camel-case@10.4.0: - version "10.4.0" - resolved "https://registry.yarnpkg.com/jss-plugin-camel-case/-/jss-plugin-camel-case-10.4.0.tgz" - integrity sha512-9oDjsQ/AgdBbMyRjc06Kl3P8lDCSEts2vYZiPZfGAxbGCegqE4RnMob3mDaBby5H9vL9gWmyyImhLRWqIkRUCw== - dependencies: - "@babel/runtime" "^7.3.1" - hyphenate-style-name "^1.0.3" - jss "10.4.0" - -jss-plugin-compose@10.4.0: - version "10.4.0" - resolved "https://registry.yarnpkg.com/jss-plugin-compose/-/jss-plugin-compose-10.4.0.tgz" - integrity sha512-m1MKZQDH/48W2NHqgsfhYBAObVHzDzSCULLLqrc8nZh1fYGvEBUND82oqd6Jh95pJbMhTzx3E9st63MivEuvAw== - dependencies: - "@babel/runtime" "^7.3.1" - jss "10.4.0" - tiny-warning "^1.0.2" - -jss-plugin-default-unit@10.4.0: - version "10.4.0" - resolved "https://registry.yarnpkg.com/jss-plugin-default-unit/-/jss-plugin-default-unit-10.4.0.tgz" - integrity sha512-BYJ+Y3RUYiMEgmlcYMLqwbA49DcSWsGgHpVmEEllTC8MK5iJ7++pT9TnKkKBnNZZxTV75ycyFCR5xeLSOzVm4A== - dependencies: - "@babel/runtime" "^7.3.1" - jss "10.4.0" - -jss-plugin-expand@10.4.0: - version "10.4.0" - resolved "https://registry.yarnpkg.com/jss-plugin-expand/-/jss-plugin-expand-10.4.0.tgz" - integrity sha512-UiZ6D4Ud2Chg3GIzRGjgs3DLiueN4r+g1TkEgc7L/0J/L9wsvuFKOtkahdHn177+YUK5/+N05mIE9xsgREB4+Q== - dependencies: - "@babel/runtime" "^7.3.1" - jss "10.4.0" - -jss-plugin-extend@10.4.0: - version "10.4.0" - resolved "https://registry.yarnpkg.com/jss-plugin-extend/-/jss-plugin-extend-10.4.0.tgz" - integrity sha512-TsgSmvWnpZWvXWpCDHl9Vj/n8wA/Awluutg/dnrfU7rwnM+BKkssHocGai8wQ5mtmIR+lYt+y7zAO+MOeigPiw== - dependencies: - "@babel/runtime" "^7.3.1" - jss "10.4.0" - tiny-warning "^1.0.2" - -jss-plugin-global@10.4.0: - version "10.4.0" - resolved "https://registry.yarnpkg.com/jss-plugin-global/-/jss-plugin-global-10.4.0.tgz" - integrity sha512-b8IHMJUmv29cidt3nI4bUI1+Mo5RZE37kqthaFpmxf5K7r2aAegGliAw4hXvA70ca6ckAoXMUl4SN/zxiRcRag== - dependencies: - "@babel/runtime" "^7.3.1" - jss "10.4.0" - -jss-plugin-nested@10.4.0: - version "10.4.0" - resolved "https://registry.yarnpkg.com/jss-plugin-nested/-/jss-plugin-nested-10.4.0.tgz" - integrity sha512-cKgpeHIxAP0ygeWh+drpLbrxFiak6zzJ2toVRi/NmHbpkNaLjTLgePmOz5+67ln3qzJiPdXXJB1tbOyYKAP4Pw== - dependencies: - "@babel/runtime" "^7.3.1" - jss "10.4.0" - tiny-warning "^1.0.2" - -jss-plugin-props-sort@10.4.0: - version "10.4.0" - resolved "https://registry.yarnpkg.com/jss-plugin-props-sort/-/jss-plugin-props-sort-10.4.0.tgz" - integrity sha512-j/t0R40/2fp+Nzt6GgHeUFnHVY2kPGF5drUVlgkcwYoHCgtBDOhTTsOfdaQFW6sHWfoQYgnGV4CXdjlPiRrzwA== - dependencies: - "@babel/runtime" "^7.3.1" - jss "10.4.0" - -jss-plugin-rule-value-function@10.4.0: - version "10.4.0" - resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.4.0.tgz" - integrity sha512-w8504Cdfu66+0SJoLkr6GUQlEb8keHg8ymtJXdVHWh0YvFxDG2l/nS93SI5Gfx0fV29dO6yUugXnKzDFJxrdFQ== - dependencies: - "@babel/runtime" "^7.3.1" - jss "10.4.0" - tiny-warning "^1.0.2" - -jss-plugin-rule-value-observable@10.4.0: - version "10.4.0" - resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-observable/-/jss-plugin-rule-value-observable-10.4.0.tgz" - integrity sha512-Utnsvopa2Gg9Z/9rJ5uH0Gl5QRWlnx9Hd+K/rnAc7UyxbIpvTAWMv5hsnuCUbmUSyb9RKJPHlohJNwG8rFownQ== - dependencies: - "@babel/runtime" "^7.3.1" - jss "10.4.0" - symbol-observable "^1.2.0" - -jss-plugin-template@10.4.0: - version "10.4.0" - resolved "https://registry.yarnpkg.com/jss-plugin-template/-/jss-plugin-template-10.4.0.tgz" - integrity sha512-bpRu56Dnas1+G/HvB0TdeC2907YujZ8F3pwLls7gNS6oJSYZD3iYbqsJuRVcAkhNINYVdcuW1SCo1aigCI7r/Q== - dependencies: - "@babel/runtime" "^7.3.1" - jss "10.4.0" - tiny-warning "^1.0.2" - -jss-plugin-vendor-prefixer@10.4.0: - version "10.4.0" - resolved "https://registry.yarnpkg.com/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.4.0.tgz" - integrity sha512-DpF+/a+GU8hMh/948sBGnKSNfKkoHg2p9aRFUmyoyxgKjOeH9n74Ht3Yt8lOgdZsuWNJbPrvaa3U4PXKwxVpTQ== - dependencies: - "@babel/runtime" "^7.3.1" - css-vendor "^2.0.8" - jss "10.4.0" - -jss-preset-default@^10.3.0: - version "10.4.0" - resolved "https://registry.yarnpkg.com/jss-preset-default/-/jss-preset-default-10.4.0.tgz" - integrity sha512-WnmqDtQiK7bcw7yOxoW4iwf2ytVhgJfxqsb9R7V0gYOQi8TuApxs99nXgLVr3XN2HfVwk8hXlc9j50N5imozCQ== - dependencies: - "@babel/runtime" "^7.3.1" - jss "10.4.0" - jss-plugin-camel-case "10.4.0" - jss-plugin-compose "10.4.0" - jss-plugin-default-unit "10.4.0" - jss-plugin-expand "10.4.0" - jss-plugin-extend "10.4.0" - jss-plugin-global "10.4.0" - jss-plugin-nested "10.4.0" - jss-plugin-props-sort "10.4.0" - jss-plugin-rule-value-function "10.4.0" - jss-plugin-rule-value-observable "10.4.0" - jss-plugin-template "10.4.0" - jss-plugin-vendor-prefixer "10.4.0" - -jss@10.4.0, jss@^10.3.0: - version "10.4.0" - resolved "https://registry.yarnpkg.com/jss/-/jss-10.4.0.tgz" - integrity sha512-l7EwdwhsDishXzqTc3lbsbyZ83tlUl5L/Hb16pHCvZliA9lRDdNBZmHzeJHP0sxqD0t1mrMmMR8XroR12JBYzw== - dependencies: - "@babel/runtime" "^7.3.1" - csstype "^3.0.2" - is-in-browser "^1.1.3" - tiny-warning "^1.0.2" - -jwa@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz" - integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== - dependencies: - buffer-equal-constant-time "1.0.1" - ecdsa-sig-formatter "1.0.11" - safe-buffer "^5.0.1" - -jws@^3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz" - integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== - dependencies: - jwa "^1.4.1" - safe-buffer "^5.0.1" - -keyv@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz" - integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== - dependencies: - json-buffer "3.0.0" - kind-of@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-1.1.0.tgz" @@ -6563,27 +5276,6 @@ kleur@^3.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== -knex@^0.19.5: - version "0.19.5" - resolved "https://registry.yarnpkg.com/knex/-/knex-0.19.5.tgz" - integrity sha512-Hy258avCVircQq+oj3WBqPzl8jDIte438Qlq+8pt1i/TyLYVA4zPh2uKc7Bx0t+qOpa6D42HJ2jjtl2vagzilw== - dependencies: - bluebird "^3.7.0" - colorette "1.1.0" - commander "^3.0.2" - debug "4.1.1" - getopts "2.2.5" - inherits "~2.0.4" - interpret "^1.2.0" - liftoff "3.1.0" - lodash "^4.17.15" - mkdirp "^0.5.1" - pg-connection-string "2.1.0" - tarn "^2.0.0" - tildify "2.0.0" - uuid "^3.3.3" - v8flags "^3.1.3" - leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz" @@ -6597,27 +5289,6 @@ levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -lie@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lie/-/lie-3.1.1.tgz" - integrity sha1-mkNrLMd0bKWd56QfpGmz77dr2H4= - dependencies: - immediate "~3.0.5" - -liftoff@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-3.1.0.tgz" - integrity sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog== - dependencies: - extend "^3.0.0" - findup-sync "^3.0.0" - fined "^1.0.1" - flagged-respawn "^1.0.0" - is-plain-object "^2.0.4" - object.map "^1.0.0" - rechoir "^0.6.2" - resolve "^1.1.7" - lines-and-columns@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz" @@ -6628,13 +5299,6 @@ linked-list@0.1.0: resolved "https://registry.yarnpkg.com/linked-list/-/linked-list-0.1.0.tgz" integrity sha1-eYsP+X0bkqT9CEgPVa6k6dSdN78= -localforage@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/localforage/-/localforage-1.9.0.tgz" - integrity sha512-rR1oyNrKulpe+VM9cYmcFn6tsHuokyVHFaCM3+osEmxaHTbEk8oQu6eGDfS6DQLWi/N67XRmB8ECG37OES368g== - dependencies: - lie "3.1.1" - locate-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz" @@ -6650,66 +5314,21 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" -lodash-es@^4.17.4: - version "4.17.15" - resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.15.tgz" - integrity sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ== - lodash._reinterpolate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= -lodash.clonedeep@4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz" - integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= - -lodash.curry@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.curry/-/lodash.curry-4.1.1.tgz" - integrity sha1-JI42By7ekGUB11lmIAqG2riyMXA= - -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz" - integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= - lodash.frompairs@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/lodash.frompairs/-/lodash.frompairs-4.0.1.tgz#bc4e5207fa2757c136e573614e9664506b2b1bd2" integrity sha1-vE5SB/onV8E25XNhTpZkUGsrG9I= -lodash.includes@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz" - integrity sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8= - -lodash.isboolean@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz" - integrity sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY= - lodash.isequal@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= -lodash.isinteger@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz" - integrity sha1-YZwK89A/iwTDH1iChAt3sRzWg0M= - -lodash.isnumber@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz" - integrity sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w= - -lodash.isplainobject@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz" - integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= - lodash.isstring@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz" @@ -6720,11 +5339,6 @@ lodash.omit@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.omit/-/lodash.omit-4.5.0.tgz#6eb19ae5a1ee1dd9df0b969e66ce0b7fa30b5e60" integrity sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA= -lodash.once@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz" - integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= - lodash.pick@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" @@ -6755,7 +5369,7 @@ lodash.throttle@^4.1.1: resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz" integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ= -lodash@^4.14.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.8.0: +lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.2.0, lodash@^4.3.0: version "4.17.19" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz" integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== @@ -6788,16 +5402,6 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1, loose-envify@^1.4 dependencies: js-tokens "^3.0.0 || ^4.0.0" -lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz" - integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== - -lowercase-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz" - integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== - lru-cache@^4.0.1: version "4.1.5" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz" @@ -6821,13 +5425,6 @@ make-dir@^3.0.0: dependencies: semver "^6.0.0" -make-iterator@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.1.tgz" - integrity sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw== - dependencies: - kind-of "^6.0.2" - makeerror@1.0.x: version "1.0.11" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz" @@ -6835,7 +5432,7 @@ makeerror@1.0.x: dependencies: tmpl "1.0.x" -map-cache@^0.2.0, map-cache@^0.2.2: +map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz" integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= @@ -6852,20 +5449,6 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -map2tree@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/map2tree/-/map2tree-1.4.2.tgz" - integrity sha512-Dczesn85J/bfBuW2XedxQQOG5+hNCK1OC09DjZ2ZL2VFSs9J59ZNeGEvXlEHfPM4sG6Ss/QYloQTM9NKx6Vi5Q== - dependencies: - lodash "^4.17.19" - -matcher@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/matcher/-/matcher-3.0.0.tgz" - integrity sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng== - dependencies: - escape-string-regexp "^4.0.0" - md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz" @@ -6880,16 +5463,6 @@ mdn-data@2.0.6: resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.6.tgz" integrity sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA== -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz" - integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= - -memoize-one@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.1.1.tgz" - integrity sha512-HKeeBpWvqiVJD57ZUAsJNm71eHTykffzcLZVYWiVfQeI1rJtuEaS7hQiEpWfVVk18donPwJEcFKIkCmPJNOhHA== - memoizerific@^1.11.3: version "1.11.3" resolved "https://registry.yarnpkg.com/memoizerific/-/memoizerific-1.11.3.tgz" @@ -6897,11 +5470,6 @@ memoizerific@^1.11.3: dependencies: map-or-similar "^1.5.0" -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz" - integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= - merge-stream@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz" @@ -6919,11 +5487,6 @@ merkle-lib@^2.0.10: resolved "https://registry.yarnpkg.com/merkle-lib/-/merkle-lib-2.0.10.tgz" integrity sha1-grjbrnXieneFOItz+ddyXQ9vMyY= -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz" - integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= - metro-babel-register@0.58.0: version "0.58.0" resolved "https://registry.yarnpkg.com/metro-babel-register/-/metro-babel-register-0.58.0.tgz" @@ -7291,7 +5854,7 @@ metro@0.58.0, metro@^0.58.0: xpipe "^1.0.5" yargs "^14.2.0" -micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: +micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -7362,11 +5925,6 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -mimic-response@^1.0.0, mimic-response@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz" - integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== - minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" @@ -7384,31 +5942,11 @@ minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -minimist@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz" - integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= - minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== -minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz" - integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minizlib@^1.2.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz" - integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== - dependencies: - minipass "^2.9.0" - mixin-deep@^1.2.0: version "1.3.2" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz" @@ -7417,24 +5955,13 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.4: +mkdirp@^0.5.1, mkdirp@^0.5.3: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== dependencies: minimist "^1.2.5" -morgan@^1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.10.0.tgz" - integrity sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ== - dependencies: - basic-auth "~2.0.1" - debug "2.6.9" - depd "~2.0.0" - on-finished "~2.3.0" - on-headers "~1.0.2" - ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz" @@ -7460,16 +5987,11 @@ nan@^2.12.1, nan@^2.14.0: resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz" integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== -nanoid@^2.0.0, nanoid@^2.1.0: +nanoid@^2.0.0: version "2.1.11" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-2.1.11.tgz" integrity sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA== -nanoid@^3.1.12: - version "3.1.12" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.12.tgz" - integrity sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A== - nanoid@^3.1.15: version "3.1.16" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.16.tgz" @@ -7530,22 +6052,6 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= -ncom@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/ncom/-/ncom-1.0.3.tgz" - integrity sha512-PfA7rjxxMAItsGo2qXrGn2GvKJIwN0bUTa3GehsblrKRVdCCEwB0QG2ymM6/DppQGUt7YqbfxQB7LaMWMiHHWQ== - dependencies: - sc-formatter "~3.0.1" - -needle@^2.2.1: - version "2.5.0" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.5.0.tgz" - integrity sha512-o/qITSDR0JCyCKEQ1/1bnUXMmznxabbwi/Y4WwJElf+evwJNFNwIDMCCt5IigFVxgeGBJESLohGtIS9gEzo1fA== - dependencies: - debug "^3.2.6" - iconv-lite "^0.4.4" - sax "^1.2.4" - negotiator@0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz" @@ -7556,11 +6062,6 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -node-addon-api@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.0.tgz" - integrity sha512-ASCL5U13as7HhOExbT6OlWJJUV/lLzL2voOSP1UVehpRD8FbSrSDjfScK/KwAvVTI5AS6r4VwbOMlIqtvRidnA== - node-addon-api@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.1.tgz" @@ -7584,24 +6085,6 @@ node-gyp-build@^4.2.0: resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.2.2.tgz" integrity sha512-Lqh7mrByWCM8Cf9UPqpeoVBBo5Ugx+RKu885GAzmLBVYjeywScxHXPGLa4JfYNZmcNGwzR0Glu5/9GaQZMFqyA== -node-gyp@3.x: - version "3.8.0" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz" - integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA== - dependencies: - fstream "^1.0.0" - glob "^7.0.3" - graceful-fs "^4.1.2" - mkdirp "^0.5.0" - nopt "2 || 3" - npmlog "0 || 1 || 2 || 3 || 4" - osenv "0" - request "^2.87.0" - rimraf "2" - semver "~5.3.0" - tar "^2.0.0" - which "1" - node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz" @@ -7624,42 +6107,11 @@ node-notifier@^8.0.0: uuid "^8.3.0" which "^2.0.2" -node-pre-gyp@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz" - integrity sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q== - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.1" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4" - node-stream-zip@^1.9.1: version "1.11.2" resolved "https://registry.yarnpkg.com/node-stream-zip/-/node-stream-zip-1.11.2.tgz" integrity sha512-cowCX+OyzS3tN2i4BMMFxCr/pE6cQlEMTbVCugmos0TNEJQNtcG04tR41CY8lumO1I7F5GFiLaU4WavomJthaA== -"nopt@2 || 3": - version "3.0.6" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz" - integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= - dependencies: - abbrev "1" - -nopt@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz" - integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== - dependencies: - abbrev "1" - osenv "^0.1.4" - normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz" @@ -7682,40 +6134,6 @@ normalize-path@^3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -normalize-url@^4.1.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz" - integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ== - -npm-bundled@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz" - integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA== - dependencies: - npm-normalize-package-bin "^1.0.1" - -npm-conf@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/npm-conf/-/npm-conf-1.1.3.tgz" - integrity sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw== - dependencies: - config-chain "^1.1.11" - pify "^3.0.0" - -npm-normalize-package-bin@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz" - integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== - -npm-packlist@^1.1.6: - version "1.4.8" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz" - integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - npm-normalize-package-bin "^1.0.1" - npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz" @@ -7730,16 +6148,6 @@ npm-run-path@^4.0.0: dependencies: path-key "^3.0.0" -"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - nth-check@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz" @@ -7752,11 +6160,6 @@ nullthrows@^1.1.1: resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz" integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= - nwsapi@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz" @@ -7777,7 +6180,7 @@ ob1@0.59.0: resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.59.0.tgz" integrity sha512-opXMTxyWJ9m68ZglCxwo0OPRESIC/iGmKFPXEXzMZqsVIrgoRXOHmoMDkQzz4y3irVjbyPJRAh5pI9fd0MJTFQ== -object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -7796,11 +6199,6 @@ object-keys@^1.0.11, object-keys@^1.0.12: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object-path@^0.11.4: - version "0.11.4" - resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.4.tgz" - integrity sha1-NwrnUvvzfePqcKhhwju6iRVpGUk= - object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz" @@ -7818,25 +6216,7 @@ object.assign@^4.1.0: has-symbols "^1.0.0" object-keys "^1.0.11" -object.defaults@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz" - integrity sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8= - dependencies: - array-each "^1.0.1" - array-slice "^1.0.0" - for-own "^1.0.0" - isobject "^3.0.0" - -object.map@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object.map/-/object.map-1.0.1.tgz" - integrity sha1-z4Plncj8wK1fQlDh94s7gb2AHTc= - dependencies: - for-own "^1.0.0" - make-iterator "^1.0.0" - -object.pick@^1.2.0, object.pick@^1.3.0: +object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz" integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= @@ -7883,14 +6263,6 @@ open@^6.2.0: dependencies: is-wsl "^1.1.0" -open@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/open/-/open-7.2.0.tgz" - integrity sha512-4HeyhxCvBTI5uBePsAdi55C5fmqnWZ2e2MlmvWi5KW5tdH5rxoiv/aMtbeVxKZc3eWkT1GymMnLG8XC4Rq4TDQ== - dependencies: - is-docker "^2.0.0" - is-wsl "^2.1.1" - opencollective-postinstall@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259" @@ -7925,29 +6297,11 @@ ora@^3.4.0: strip-ansi "^5.2.0" wcwidth "^1.0.1" -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= - os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= -osenv@0, osenv@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz" - integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -p-cancelable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz" - integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== - p-each-series@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.1.0.tgz" @@ -7984,22 +6338,6 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-filepath@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz" - integrity sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE= - dependencies: - is-absolute "^1.0.0" - map-cache "^0.2.0" - path-root "^0.1.1" - parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz" @@ -8023,11 +6361,6 @@ parse-node-version@^1.0.0: resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz" integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== -parse-passwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz" - integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= - parse5@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz" @@ -8073,53 +6406,16 @@ path-parse@^1.0.6: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz" integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== -path-root-regex@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz" - integrity sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0= - -path-root@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz" - integrity sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc= - dependencies: - path-root-regex "^0.1.0" - -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz" - integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -pend@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz" - integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= - performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -pg-connection-string@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.1.0.tgz" - integrity sha512-bhlV7Eq09JrRIvo1eKngpwuqKtJnNhZdpdOlvrPrA4dxqXPjxSrbNrfnIDmTpwMyRszrcV4kU5ZA4mMsQUrjdg== - picomatch@^2.0.4, picomatch@^2.0.5: version "2.2.2" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz" integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= - pify@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz" @@ -8176,21 +6472,11 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= -postcss-value-parser@^4.0.2: - version "4.1.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz" - integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== - prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz" integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= -prepend-http@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz" - integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= - pretty-format@^24.7.0, pretty-format@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz" @@ -8248,11 +6534,6 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -progress@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - promise-polyfill@^8.1.3: version "8.1.3" resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-8.1.3.tgz" @@ -8280,7 +6561,7 @@ prompts@^2.0.1: kleur "^3.0.3" sisteransi "^1.0.4" -prop-types@^15.5.10, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: +prop-types@^15.5.10, prop-types@^15.5.8, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== @@ -8289,11 +6570,6 @@ prop-types@^15.5.10, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, object-assign "^4.1.1" react-is "^16.8.1" -proto-list@~1.2.1: - version "1.2.4" - resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz" - integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= - protobufjs@6.10.2: version "6.10.2" resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.10.2.tgz" @@ -8313,14 +6589,6 @@ protobufjs@6.10.2: "@types/node" "^13.7.0" long "^4.0.0" -proxy-addr@~2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz" - integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== - dependencies: - forwarded "~0.1.2" - ipaddr.js "1.9.1" - pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz" @@ -8364,11 +6632,6 @@ qrcode@^1.3.2: pngjs "^3.3.0" yargs "^13.2.4" -qs@6.7.0: - version "6.7.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz" - integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== - qs@~6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz" @@ -8393,12 +6656,7 @@ raf@^3.1.0: resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== dependencies: - performance-now "^2.1.0" - -ramda@^0.27.1: - version "0.27.1" - resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.27.1.tgz" - integrity sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw== + performance-now "^2.1.0" randombytes@^2.0.1: version "2.1.0" @@ -8412,26 +6670,6 @@ range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz" - integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== - dependencies: - bytes "3.1.0" - http-errors "1.7.2" - iconv-lite "0.4.24" - unpipe "1.0.0" - -rc@^1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - react-addons-shallow-compare@15.6.2: version "15.6.2" resolved "https://registry.yarnpkg.com/react-addons-shallow-compare/-/react-addons-shallow-compare-15.6.2.tgz" @@ -8440,18 +6678,6 @@ react-addons-shallow-compare@15.6.2: fbjs "^0.8.4" object-assign "^4.1.0" -react-base16-styling@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/react-base16-styling/-/react-base16-styling-0.8.0.tgz" - integrity sha512-ElvciPaL4xpWh7ISX7ugkNS/dvoh7DpVMp4t93ngnEsS2LkMd8Gu+cDDOLis2rj4889CNK662UdjOfv3wvZg9w== - dependencies: - "@types/base16" "^1.0.2" - "@types/lodash.curry" "^4.1.6" - base16 "^1.0.0" - color "^3.1.2" - csstype "^3.0.2" - lodash.curry "^4.1.1" - react-devtools-core@^4.6.0: version "4.8.2" resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.8.2.tgz" @@ -8460,39 +6686,7 @@ react-devtools-core@^4.6.0: shell-quote "^1.6.1" ws "^7" -react-dom@^16.13.1: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.13.1.tgz" - integrity sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - prop-types "^15.6.2" - scheduler "^0.19.1" - -react-dragula@^1.1.17: - version "1.1.17" - resolved "https://registry.yarnpkg.com/react-dragula/-/react-dragula-1.1.17.tgz" - integrity sha1-s8s1KkcKcZNnupnWpUAcYPrU9v8= - dependencies: - atoa "1.0.0" - dragula "3.7.2" - -react-icons@^3.10.0: - version "3.11.0" - resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-3.11.0.tgz" - integrity sha512-JRgiI/vdF6uyBgyZhVyYJUZAop95Sy4XDe/jmT3R/bKliFWpO/uZBwvSjWEdxwzec7SYbEPNPck0Kff2tUGM2Q== - dependencies: - camelcase "^5.0.0" - -react-input-autosize@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/react-input-autosize/-/react-input-autosize-2.2.2.tgz" - integrity sha512-jQJgYCA3S0j+cuOwzuCd1OjmBmnZLdqQdiLKRYrsMMzbjUrVDS5RvJUDwJqA7sKuksDuzFtm6hZGKFu7Mjk5aw== - dependencies: - prop-types "^15.5.8" - -react-is@^16.12.0, react-is@^16.13.0, react-is@^16.13.1, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.8.6, react-is@^16.9.0: +react-is@^16.12.0, react-is@^16.13.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.8.6: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== @@ -8502,34 +6696,6 @@ react-is@^17.0.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.1.tgz" integrity sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA== -react-json-tree@^0.13.0: - version "0.13.0" - resolved "https://registry.yarnpkg.com/react-json-tree/-/react-json-tree-0.13.0.tgz" - integrity sha512-FPJUQzYWi7pvBUAnMd9ENOnAUT2mXLhe01VUbPfKH9Q4gk4FQ0fpS1e1WZ3o7g6zfYJpYJeBTo1WwlMHlMlZOw== - dependencies: - "@types/prop-types" "^15.7.3" - prop-types "^15.7.2" - react-base16-styling "^0.8.0" - -react-jsonschema-form@^1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/react-jsonschema-form/-/react-jsonschema-form-1.8.1.tgz" - integrity sha512-aaDloxNAcGXOOOcdKOxxqEEn5oDlPUZgWcs8unXXB9vjBRgCF8rCm/wVSv1u2G5ih0j/BX6Ewd/WjI2g00lPdg== - dependencies: - "@babel/runtime-corejs2" "^7.4.5" - ajv "^6.7.0" - core-js "^2.5.7" - lodash "^4.17.15" - prop-types "^15.5.8" - react-is "^16.8.4" - react-lifecycles-compat "^3.0.4" - shortid "^2.2.14" - -react-lifecycles-compat@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz" - integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== - react-native-animatable@1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/react-native-animatable/-/react-native-animatable-1.3.3.tgz" @@ -8554,10 +6720,10 @@ react-native-dialogs@1.1.1: resolved "https://registry.yarnpkg.com/react-native-dialogs/-/react-native-dialogs-1.1.1.tgz" integrity sha512-JduVYRXvLTT4k4VfXuKt3HF2/fixsR1EDXkvNf8fJwxKZUs2kzs1E0EtgiAx4IgYMTOewLPVtzTVfiv0GWeHuA== -react-native-document-picker@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/react-native-document-picker/-/react-native-document-picker-4.1.0.tgz" - integrity sha512-tHYNng9GrnVrOoLk9K2j+T1xa8gAfC2Mk2dbJq32QBYD3zkHGMkFYGd2FZt0nuYxCBnd768tOQWuEZXwXM1tsg== +react-native-document-picker@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/react-native-document-picker/-/react-native-document-picker-4.2.0.tgz#2d6f560fd902c5f9034c287941a9505f037b6eeb" + integrity sha512-bZlQ3ooOO+2G0J0vSvcWWv1OojMwhEhiF5M7gCKp3LT/VPikZnmzIGgCkhcu8HexxWLuaGToSAQAUL2VcSo5oQ== react-native-drawer@2.5.1: version "2.5.1" @@ -8608,6 +6774,10 @@ react-native-haptic-feedback@^1.11.0: resolved "https://registry.yarnpkg.com/react-native-haptic-feedback/-/react-native-haptic-feedback-1.11.0.tgz#adfd841f3b67046532f912c6ec827aea0037d8ad" integrity sha512-KTIy7lExwMtB6pOpCARyUzFj5EzYTh+A1GN/FB5Eb0LrW5C6hbb1kdj9K2/RHyZC+wyAJD1M823ZaDCU6n6cLA== +"react-native-icloudstore@git+https://github.com/manicakes/react-native-icloudstore.git#4c9f668d3121aedf7a5635b0a13f6e3999c0e6f3": + version "0.9.0" + resolved "git+https://github.com/manicakes/react-native-icloudstore.git#4c9f668d3121aedf7a5635b0a13f6e3999c0e6f3" + react-native-image-slider-box@^1.0.12: version "1.0.12" resolved "https://registry.yarnpkg.com/react-native-image-slider-box/-/react-native-image-slider-box-1.0.12.tgz" @@ -8615,7 +6785,7 @@ react-native-image-slider-box@^1.0.12: dependencies: react-native-snap-carousel "*" -react-native-iphone-x-helper@^1.0.3, react-native-iphone-x-helper@^1.3.0: +react-native-iphone-x-helper@^1.0.3, react-native-iphone-x-helper@^1.3.0, react-native-iphone-x-helper@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/react-native-iphone-x-helper/-/react-native-iphone-x-helper-1.3.1.tgz" integrity sha512-HOf0jzRnq2/aFUcdCJ9w9JGzN3gdEg0zFE4FyYlp4jtidqU03D5X7ZegGKfT1EWteR0gPBGp9ye5T5FvSWi9Yg== @@ -8635,27 +6805,27 @@ react-native-maps@0.27.1: resolved "https://registry.yarnpkg.com/react-native-maps/-/react-native-maps-0.27.1.tgz" integrity sha512-HygBkZBecTnIVRYrSiLRAvu4OmXOYso/A7c6Cy73HkOh9CgGV8Ap5eBea24tvmFGptjj5Hg8AJ94/YbmWK1Okw== -react-native-material-menu@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/react-native-material-menu/-/react-native-material-menu-1.1.3.tgz" - integrity sha512-/4j47dWP7x0laIYKkbKxgaG2663u8o02+OrNe4Qpdmmt9KrBAuAaU3wMpry1WC/ECh6ZjnACJYx0s06mSvdOlA== +react-native-material-menu@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/react-native-material-menu/-/react-native-material-menu-1.2.0.tgz#07fac14ccc6e1cd7b995016340efbfbddc6a7a58" + integrity sha512-1XbzJP8Uo09YjW0G8xuKcL2BD76BL/IYOq1KQuQ2yGMuwqBvfU/+AKvhvHWuckQK+bhcDSUgTWbH8qv1mRAX6w== -react-native-modal@11.5.6: - version "11.5.6" - resolved "https://registry.yarnpkg.com/react-native-modal/-/react-native-modal-11.5.6.tgz" - integrity sha512-APGNfbvgC4hXbJqcSADu79GLoMKIHUmgR3fDQ7rCGZNBypkStSP8imZ4PKK/OzIZZfjGU9aP49jhMgGbhY9KHA== +react-native-modal@11.6.1: + version "11.6.1" + resolved "https://registry.yarnpkg.com/react-native-modal/-/react-native-modal-11.6.1.tgz#6162a39731860fb3b6e8304059f72dc0a961f9fd" + integrity sha512-Xsd79nuBvbLOYwpRuur4btwJFQ3WkV9zp5LbAREidUtjl/Ajlp4QbNBx888FOPjo+EpOO3+U0riCRqs1dkdIzQ== dependencies: prop-types "^15.6.2" react-native-animatable "1.3.3" -react-native-paper@4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/react-native-paper/-/react-native-paper-4.4.0.tgz" - integrity sha512-yDb9ME9cP+tOoGV/OZcUX6QpD+kN6fcLXkehfMBDKJ/3rKfq3uA2HhT4mOFKLLCLsGkd4oZwIz7POkJpB+k0aw== +react-native-paper@4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/react-native-paper/-/react-native-paper-4.5.0.tgz#5f1f1e658dbd7a322a299e08ce76e22be44c01d5" + integrity sha512-mQtOL9yAs5B5b+HPWVMMbFFuKVpTDn1YuR0h5SCtDkR+3deZjJNRLtrNgPnsrwRfBhA/F8j/p2yps4DY8AiyMg== dependencies: "@callstack/react-theme-provider" "^3.0.5" color "^3.1.2" - react-native-safe-area-view "^0.14.9" + react-native-iphone-x-helper "^1.3.1" react-native-permissions@^3.0.0: version "3.0.0" @@ -8697,17 +6867,10 @@ react-native-safe-area-context@3.1.9: resolved "https://registry.yarnpkg.com/react-native-safe-area-context/-/react-native-safe-area-context-3.1.9.tgz" integrity sha512-wmcGbdyE/vBSL5IjDPReoJUEqxkZsywZw5gPwsVUV1NBpw5eTIdnL6Y0uNKHE25Z661moxPHQz6kwAkYQyorxA== -react-native-safe-area-view@^0.14.9: - version "0.14.9" - resolved "https://registry.yarnpkg.com/react-native-safe-area-view/-/react-native-safe-area-view-0.14.9.tgz" - integrity sha512-WII/ulhpVyL/qbYb7vydq7dJAfZRBcEhg4/UWt6F6nAKpLa3gAceMOxBxI914ppwSP/TdUsandFy6lkJQE0z4A== - dependencies: - hoist-non-react-statics "^2.3.1" - -react-native-screens@2.15.0: - version "2.15.0" - resolved "https://registry.yarnpkg.com/react-native-screens/-/react-native-screens-2.15.0.tgz" - integrity sha512-qTSQPy0WKHtlb8xt5gY0Gt6sdvfQUQAnFSqgsggW9UEvySbkHzpqOrOYNA79Ca8oXO0dCFwp6X8buIiDefa7+Q== +react-native-screens@2.16.1: + version "2.16.1" + resolved "https://registry.yarnpkg.com/react-native-screens/-/react-native-screens-2.16.1.tgz#b105a127378d90018a46daf0c2f6518fca60c06f" + integrity sha512-WZ7m0sBDVaHbBnlHxwQnUlI6KNfQKHq+Unfw+VBuAlnSXvT+aw6Bb/K2bUlHzBgvrPjwY3Spc7ZERFuTwRLLwg== react-native-securerandom@1.0.0: version "1.0.0" @@ -8771,18 +6934,18 @@ react-native-webln@0.1.10: resolved "https://registry.yarnpkg.com/react-native-webln/-/react-native-webln-0.1.10.tgz" integrity sha512-H0it8l07rEHCCqDBfl6tt8EuTZKsEJYVzOr9d2ZolU0sKOv07J9+/8tQAUiEbaUB9tFi/HvBbSpr1KUgJCKefg== -react-native-webview@10.10.2: - version "10.10.2" - resolved "https://registry.yarnpkg.com/react-native-webview/-/react-native-webview-10.10.2.tgz" - integrity sha512-98Dh7q1gEflicFZ8KNL3nK5XRjx50OZXqw87jHofVjKfjbK0LKmvI5X8ymgUMGg61JVgI3AF+g8qpDvqjgQsfg== +react-native-webview@11.0.2: + version "11.0.2" + resolved "https://registry.yarnpkg.com/react-native-webview/-/react-native-webview-11.0.2.tgz#c88e84fa470f04ff070ff8a2c7f4d7295d46bb06" + integrity sha512-GDyIBRbCZ2wbMUGCxA7LufSEbSoWKOzkFB8YljmAffA15tzN6ccvGEquB/hkk5KhvoYy300kwJyEmyBeG6d/AA== dependencies: escape-string-regexp "2.0.0" invariant "2.2.4" -react-native@0.63.3: - version "0.63.3" - resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.63.3.tgz" - integrity sha512-71wq13uNo5W8QVQnFlnzZ3AD+XgUBYGhpsxysQFW/hJ8GAt/J5o+Bvhy81FXichp6IBDJDh/JgfHH2gNji8dFA== +react-native@0.63.4: + version "0.63.4" + resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.63.4.tgz#2210fdd404c94a5fa6b423c6de86f8e48810ec36" + integrity sha512-I4kM8kYO2mWEYUFITMcpRulcy4/jd+j9T6PbIzR0FuMcz/xwd+JwHoLPa1HmCesvR1RDOw9o4D+OFLwuXXfmGw== dependencies: "@babel/runtime" "^7.0.0" "@react-native-community/cli" "^4.10.0" @@ -8812,44 +6975,14 @@ react-native@0.63.3: use-subscription "^1.0.0" whatwg-fetch "^3.0.0" -react-pure-render@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/react-pure-render/-/react-pure-render-1.0.2.tgz" - integrity sha1-nYqSjH8sN1E8LQZOV7Pjw1bp+rs= - -react-redux@^7.2.1: - version "7.2.1" - resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.1.tgz" - integrity sha512-T+VfD/bvgGTUA74iW9d2i5THrDQWbweXP0AVNI8tNd1Rk5ch1rnMiJkDD67ejw7YBKM4+REvcvqRuWJb7BLuEg== - dependencies: - "@babel/runtime" "^7.5.5" - hoist-non-react-statics "^3.3.0" - loose-envify "^1.4.0" - prop-types "^15.7.2" - react-is "^16.9.0" - react-refresh@^0.4.0: version "0.4.3" resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.4.3.tgz" integrity sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA== -react-select@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/react-select/-/react-select-3.1.0.tgz" - integrity sha512-wBFVblBH1iuCBprtpyGtd1dGMadsG36W5/t2Aj8OE6WbByDg5jIFyT7X5gT+l0qmT5TqWhxX+VsKJvCEl2uL9g== - dependencies: - "@babel/runtime" "^7.4.4" - "@emotion/cache" "^10.0.9" - "@emotion/core" "^10.0.9" - "@emotion/css" "^10.0.9" - memoize-one "^5.0.0" - prop-types "^15.6.0" - react-input-autosize "^2.2.2" - react-transition-group "^4.3.0" - react-test-renderer@16.13.1: version "16.13.1" - resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.13.1.tgz" + resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.13.1.tgz#de25ea358d9012606de51e012d9742e7f0deabc1" integrity sha512-Sn2VRyOK2YJJldOqoh8Tn/lWQ+ZiKhyZTPtaO0Q6yNj+QDbmRkVFap6pZPy3YQk8DScRDfyqm/KxKYP9gCMRiQ== dependencies: object-assign "^4.1.1" @@ -8857,16 +6990,6 @@ react-test-renderer@16.13.1: react-is "^16.8.6" scheduler "^0.19.1" -react-transition-group@^4.3.0: - version "4.4.1" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.1.tgz" - integrity sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw== - dependencies: - "@babel/runtime" "^7.5.5" - dom-helpers "^5.0.1" - loose-envify "^1.4.0" - prop-types "^15.6.2" - react-tween-state@^0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/react-tween-state/-/react-tween-state-0.1.5.tgz#e98b066551efb93cb92dd1be14995c2e3deae339" @@ -8883,15 +7006,6 @@ react@17.0.1: loose-envify "^1.1.0" object-assign "^4.1.1" -react@^16.13.1: - version "16.14.0" - resolved "https://registry.yarnpkg.com/react/-/react-16.14.0.tgz#94d776ddd0aaa37da3eda8fc5b6b18a4c9a3114d" - integrity sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - prop-types "^15.6.2" - read-pkg-up@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz" @@ -8911,7 +7025,7 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -readable-stream@^2.0.1, readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@~2.3.6: +readable-stream@^2.0.1, readable-stream@^2.2.2, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -8933,52 +7047,6 @@ readable-stream@^3.6.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz" - integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= - dependencies: - resolve "^1.1.6" - -redux-devtools-chart-monitor@^1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/redux-devtools-chart-monitor/-/redux-devtools-chart-monitor-1.7.2.tgz" - integrity sha512-QlDcWn45IeDURUKxMnA7q3fseUFPPBwT0izpHaafaq5ycTyfId8clJbPlKKMZ6BzLeiorYbBzfLq1KUyGJHqbg== - dependencies: - d3-state-visualizer "^1.3.4" - deepmerge "^4.2.2" - prop-types "^15.7.2" - react-pure-render "^1.0.2" - redux-devtools-themes "^1.0.0" - -redux-devtools-cli@1.0.0-4: - version "1.0.0-4" - resolved "https://registry.yarnpkg.com/redux-devtools-cli/-/redux-devtools-cli-1.0.0-4.tgz" - integrity sha512-pT/oJfpAMmUyEDIX3NxpXByu1sOJZ3Qzy0FTllVvCWRScSlPdA8XyQhstL6saZdjJdHO+uZHLGMTmdzkEDcNRw== - dependencies: - body-parser "^1.19.0" - chalk "^4.1.0" - cors "^2.8.5" - cross-spawn "^7.0.3" - electron "^9.2.0" - express "^4.17.1" - getport "^0.1.0" - graphql "^0.13.2" - graphql-server-express "^1.4.1" - graphql-tools "^4.0.8" - knex "^0.19.5" - lodash "^4.17.19" - minimist "^1.2.5" - morgan "^1.10.0" - open "^7.1.0" - react "^16.13.1" - react-dom "^16.13.1" - redux-devtools-core "^1.0.0-4" - semver "^7.3.2" - socketcluster "^14.4.2" - sqlite3 "^5.0.0" - uuid "^8.3.0" - redux-devtools-core@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/redux-devtools-core/-/redux-devtools-core-0.2.1.tgz" @@ -8990,66 +7058,6 @@ redux-devtools-core@^0.2.1: nanoid "^2.0.0" remotedev-serialize "^0.1.8" -redux-devtools-core@^1.0.0-4: - version "1.0.0-4" - resolved "https://registry.yarnpkg.com/redux-devtools-core/-/redux-devtools-core-1.0.0-4.tgz" - integrity sha512-vgmWeTRYXS0Ndi+HPwaQm158dt7iImyN4iKTw/LeaNXLoginfrYBmmMBgsUrCBlIaA0Po7wF7IpzEPOH8rOX0Q== - dependencies: - d3-state-visualizer "^1.3.4" - devui "^1.0.0-6" - get-params "^0.1.2" - javascript-stringify "^2.0.1" - jsan "^3.1.13" - jsondiffpatch "^0.4.1" - localforage "^1.9.0" - lodash "^4.17.19" - nanoid "^3.1.12" - prop-types "^15.7.2" - react-icons "^3.10.0" - react-is "^16.13.1" - react-redux "^7.2.1" - redux "^4.0.5" - redux-devtools "^3.7.0" - redux-devtools-chart-monitor "^1.7.2" - redux-devtools-inspector "^0.14.0" - redux-devtools-instrument "^1.10.0" - redux-devtools-log-monitor "^2.1.0" - redux-devtools-serialize "^0.2.0" - redux-devtools-slider-monitor "^2.0.0-5" - redux-devtools-test-generator "^0.6.2" - redux-devtools-trace-monitor "^0.1.3" - redux-persist "^4.10.2" - socketcluster-client "^14.3.1" - styled-components "^5.1.1" - -redux-devtools-inspector@^0.14.0: - version "0.14.0" - resolved "https://registry.yarnpkg.com/redux-devtools-inspector/-/redux-devtools-inspector-0.14.0.tgz" - integrity sha512-NRLCUqyzzHwBIE2GQeAc/6uRZMIXG15yhSOlmoPareqiQyBuxYU6bSCcJUhOJrJP2TlAADlb3jfuQQVbMd8w3A== - dependencies: - "@types/dragula" "^3.7.0" - "@types/prop-types" "^15.7.3" - dateformat "^3.0.3" - hex-rgba "^1.0.2" - javascript-stringify "^2.0.1" - jsondiffpatch "^0.4.1" - jss "^10.3.0" - jss-preset-default "^10.3.0" - lodash.debounce "^4.0.8" - prop-types "^15.7.2" - react-base16-styling "^0.8.0" - react-dragula "^1.1.17" - react-json-tree "^0.13.0" - redux-devtools-themes "^1.0.0" - -redux-devtools-instrument@^1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/redux-devtools-instrument/-/redux-devtools-instrument-1.10.0.tgz" - integrity sha512-X8JRBCzX2ADSMp+iiV7YQ8uoTNyEm0VPFPd4T854coz6lvRiBrFSqAr9YAS2n8Kzxx8CJQotR0QF9wsMM+3DvA== - dependencies: - lodash "^4.17.19" - symbol-observable "^1.2.0" - redux-devtools-instrument@^1.9.4: version "1.9.6" resolved "https://registry.yarnpkg.com/redux-devtools-instrument/-/redux-devtools-instrument-1.9.6.tgz" @@ -9058,88 +7066,6 @@ redux-devtools-instrument@^1.9.4: lodash "^4.2.0" symbol-observable "^1.0.2" -redux-devtools-log-monitor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/redux-devtools-log-monitor/-/redux-devtools-log-monitor-2.1.0.tgz" - integrity sha512-68YOl45psVVXNzE4LZEnbb6Jsc2JiNyy6SZDgaJDXUOODVdzIQbjd30wUODoRx4P0J/1oSyJdYrb8PUtmtYbtA== - dependencies: - "@types/lodash.debounce" "^4.0.6" - "@types/prop-types" "^15.7.3" - "@types/redux-devtools-themes" "^1.0.0" - lodash.debounce "^4.0.8" - prop-types "^15.7.2" - react-json-tree "^0.13.0" - redux-devtools-themes "^1.0.0" - -redux-devtools-serialize@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/redux-devtools-serialize/-/redux-devtools-serialize-0.2.0.tgz" - integrity sha512-Oy1U9HdPCBsJtK1nte+CkOc0yKVACVwawAO3l3t0O5Y9omHqauxBNxjDNtAGMw6njmPIR4uomOEfTqTeS7bOJQ== - dependencies: - jsan "^3.1.13" - -redux-devtools-slider-monitor@^2.0.0-5: - version "2.0.0-5" - resolved "https://registry.yarnpkg.com/redux-devtools-slider-monitor/-/redux-devtools-slider-monitor-2.0.0-5.tgz" - integrity sha512-IrcxBMJU011lsQqsChnYdhVTg14sBkjIpm9NSkHC4ZKYKXsJan3D2nj+CQpuVQoFpwza0KfKf8o63qUHVVFJtQ== - dependencies: - devui "^1.0.0-6" - prop-types "^15.7.2" - redux-devtools-themes "^1.0.0" - -redux-devtools-test-generator@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/redux-devtools-test-generator/-/redux-devtools-test-generator-0.6.2.tgz" - integrity sha512-HpXEGCY6auiJVo58gvjeXGGSWxrUl01yeGX4z/i+IyFr90GkPyqCgDWnwGgXPbh4rqDHJ/bUkuO/CQT+SPy5kQ== - dependencies: - devui "^1.0.0-6" - es6template "^1.0.5" - javascript-stringify "^2.0.1" - jsan "^3.1.13" - object-path "^0.11.4" - prop-types "^15.7.2" - react "^16.13.1" - react-icons "^3.10.0" - simple-diff "^1.6.0" - -redux-devtools-themes@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/redux-devtools-themes/-/redux-devtools-themes-1.0.0.tgz" - integrity sha1-xILc48U3OXYEX0ATSQfZ3LOuPV0= - dependencies: - base16 "^1.0.0" - -redux-devtools-trace-monitor@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/redux-devtools-trace-monitor/-/redux-devtools-trace-monitor-0.1.3.tgz" - integrity sha512-dHiRFdAsRkBebOTGVokRT0ZTO7fEz92L9YseUhwPwkxskVmXywIubhlLB+CYmgME8yppleYwwqlPD5XiVoengA== - dependencies: - "@babel/code-frame" "^7.10.4" - anser "^1.4.9" - html-entities "^1.3.1" - react "^16.13.1" - redux-devtools-themes "^1.0.0" - settle-promise "^1.0.0" - -redux-devtools@^3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/redux-devtools/-/redux-devtools-3.7.0.tgz" - integrity sha512-Lnx3UX7mnJij2Xs+RicPK1GyKkbuodrCKtfYmJsN603wC0mc99W//xCAskGVNmRhIXg4e57m2k1CyX0kVzCsBg== - dependencies: - "@types/prop-types" "^15.7.3" - lodash "^4.17.19" - prop-types "^15.7.2" - redux-devtools-instrument "^1.10.0" - -redux-persist@^4.10.2: - version "4.10.2" - resolved "https://registry.yarnpkg.com/redux-persist/-/redux-persist-4.10.2.tgz" - integrity sha512-U+e0ieMGC69Zr72929iJW40dEld7Mflh6mu0eJtVMLGfMq/aJqjxUM1hzyUWMR1VUyAEEdPHuQmeq5ti9krIgg== - dependencies: - json-stringify-safe "^5.0.1" - lodash "^4.17.4" - lodash-es "^4.17.4" - redux-thunk@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.3.0.tgz" @@ -9265,7 +7191,7 @@ request-promise-native@^1.0.8: stealthy-require "^1.1.1" tough-cookie "^2.3.3" -request@^2.87.0, request@^2.88.2: +request@^2.88.2: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== @@ -9308,24 +7234,11 @@ resolve-cwd@^3.0.0: dependencies: resolve-from "^5.0.0" -resolve-dir@^1.0.0, resolve-dir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz" - integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= - dependencies: - expand-tilde "^2.0.0" - global-modules "^1.0.0" - resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz" integrity sha1-six699nWiBvItuZTM17rywoYh0g= -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - resolve-from@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz" @@ -9336,7 +7249,7 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.8.1: +resolve@^1.10.0, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.8.1: version "1.17.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz" integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== @@ -9351,13 +7264,6 @@ resolve@^1.18.1: is-core-module "^2.1.0" path-parse "^1.0.6" -responselike@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz" - integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= - dependencies: - lowercase-keys "^1.0.0" - restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz" @@ -9371,7 +7277,7 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== -rimraf@2, rimraf@^2.5.4, rimraf@^2.6.1: +rimraf@^2.5.4: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -9403,18 +7309,6 @@ rn-host-detect@^1.1.5: resolved "https://registry.yarnpkg.com/rn-host-detect/-/rn-host-detect-1.2.0.tgz" integrity sha512-btNg5kzHcjZZ7t7mvvV/4wNJ9e3MPgrWivkRgWURzXL0JJ0pwWlU4zrbmdlz3HHzHOxhBhHB4D+/dbMFfu4/4A== -roarr@^2.15.3: - version "2.15.3" - resolved "https://registry.yarnpkg.com/roarr/-/roarr-2.15.3.tgz" - integrity sha512-AEjYvmAhlyxOeB9OqPUzQCo3kuAkNfuDk/HqWbZdFsqDFpapkTjiw+p4svNEoRLvuqNTxqfL+s+gtD4eDgZ+CA== - dependencies: - boolean "^3.0.0" - detect-node "^2.0.4" - globalthis "^1.0.1" - json-stringify-safe "^5.0.1" - semver-compare "^1.0.0" - sprintf-js "^1.1.2" - rsvp@^4.8.4: version "4.8.5" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz" @@ -9437,7 +7331,7 @@ rx-lite@*, rx-lite@^4.0.8: resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz" integrity sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ= -rxjs@^5.4.3, rxjs@^5.5.2: +rxjs@^5.4.3: version "5.5.12" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.12.tgz" integrity sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw== @@ -9481,14 +7375,7 @@ sane@^4.0.3: minimist "^1.1.1" walker "~1.0.5" -sanitize-filename@^1.6.2: - version "1.6.3" - resolved "https://registry.yarnpkg.com/sanitize-filename/-/sanitize-filename-1.6.3.tgz" - integrity sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg== - dependencies: - truncate-utf8-bytes "^1.0.0" - -sax@^1.2.1, sax@^1.2.4: +sax@^1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== @@ -9500,37 +7387,6 @@ saxes@^5.0.0: dependencies: xmlchars "^2.2.0" -sc-auth@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/sc-auth/-/sc-auth-5.0.2.tgz" - integrity sha512-Le3YBsFjzv5g6wIH6Y+vD+KFkK0HDXiaWy1Gm4nXtYebMQUyNYSf1cS83MtHrYzVEMlhYElRva1b0bvZ0hBqQw== - dependencies: - jsonwebtoken "^8.3.0" - sc-errors "^1.4.1" - -sc-broker-cluster@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/sc-broker-cluster/-/sc-broker-cluster-7.0.0.tgz" - integrity sha512-DNG8sxiFwmRSMS0sUXA25UvDV8QTwEfYnzrutqbp4HlMU9JP65FBcs6GuNFPhjQN4s9VtwAE8BBaCNK5BjNV0g== - dependencies: - async "2.0.0" - sc-broker "^6.0.0" - sc-channel "^1.2.0" - sc-errors "^1.4.1" - sc-hasher "^1.0.1" - -sc-broker@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/sc-broker/-/sc-broker-6.0.0.tgz" - integrity sha512-c1mFIllUdPnEXDDFxTiX3obYW+cT0hb56fdNM5k+Xo5DI3+3Q9MYxTc8jD23qBIXOHokt4+d/CHocmZQPlAjAQ== - dependencies: - async "^2.6.1" - expirymanager "^0.9.3" - fleximap "^1.0.0" - ncom "^1.0.2" - sc-errors "^1.4.1" - uuid "3.1.0" - sc-channel@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/sc-channel/-/sc-channel-1.2.0.tgz" @@ -9538,33 +7394,16 @@ sc-channel@^1.2.0: dependencies: component-emitter "1.2.1" -sc-errors@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/sc-errors/-/sc-errors-1.4.1.tgz" - integrity sha512-dBn92iIonpChTxYLgKkIT/PCApvmYT6EPIbRvbQKTgY6tbEbIy8XVUv4pGyKwEK4nCmvX4TKXcN0iXC6tNW6rQ== - sc-errors@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/sc-errors/-/sc-errors-2.0.1.tgz" integrity sha512-JoVhq3Ud+3Ujv2SIG7W0XtjRHsrNgl6iXuHHsh0s+Kdt5NwI6N2EGAZD4iteitdDv68ENBkpjtSvN597/wxPSQ== -sc-formatter@^3.0.1, sc-formatter@^3.0.2, sc-formatter@~3.0.1: +sc-formatter@^3.0.1: version "3.0.2" resolved "https://registry.yarnpkg.com/sc-formatter/-/sc-formatter-3.0.2.tgz" integrity sha512-9PbqYBpCq+OoEeRQ3QfFIGE6qwjjBcd2j7UjgDlhnZbtSnuGgHdcRklPKYGuYFH82V/dwd+AIpu8XvA1zqTd+A== -sc-hasher@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/sc-hasher/-/sc-hasher-1.0.1.tgz" - integrity sha512-whZWw70Gp5ibXXMcz6+Tulmk8xkwWMs42gG70p12hGscdUg8BICBvihS3pX2T3dWTw+yeZuGKiULr3MwL37SOQ== - -sc-simple-broker@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/sc-simple-broker/-/sc-simple-broker-2.1.3.tgz" - integrity sha512-ldt0ybOS5fVZSMea5Z8qVu7lmDBTy0qO9BD6TseJjRuPx+g+stfSqmPAb0RsCsQUXRH8A1koCbwsuUnI9BOxvw== - dependencies: - sc-channel "^1.2.0" - scheduler@0.19.1, scheduler@^0.19.1: version "0.19.1" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz" @@ -9596,11 +7435,6 @@ secp256k1@^3.4.0: nan "^2.14.0" safe-buffer "^5.1.2" -semver-compare@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz" - integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= - "semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz" @@ -9616,11 +7450,6 @@ semver@^7.3.2: resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz" integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== -semver@~5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz" - integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= - send@0.17.1: version "0.17.1" resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz" @@ -9645,14 +7474,7 @@ serialize-error@^2.1.0: resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-2.1.0.tgz" integrity sha1-ULZ51WNc34Rme9yOWa9OW4HV9go= -serialize-error@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-7.0.1.tgz" - integrity sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw== - dependencies: - type-fest "^0.13.1" - -serve-static@1.14.1, serve-static@^1.13.1: +serve-static@^1.13.1: version "1.14.1" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz" integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== @@ -9662,7 +7484,7 @@ serve-static@1.14.1, serve-static@^1.13.1: parseurl "~1.3.3" send "0.17.1" -set-blocking@^2.0.0, set-blocking@~2.0.0: +set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= @@ -9687,11 +7509,6 @@ setprototypeof@1.1.1: resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz" integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== -settle-promise@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/settle-promise/-/settle-promise-1.0.0.tgz" - integrity sha1-aXrbWLgh84fOJ1fAbvyd5fDuM9g= - sha.js@^2.4.0, sha.js@^2.4.11, sha.js@^2.4.8: version "2.4.11" resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz" @@ -9700,11 +7517,6 @@ sha.js@^2.4.0, sha.js@^2.4.11, sha.js@^2.4.8: inherits "^2.0.1" safe-buffer "^5.0.1" -shallowequal@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz" - integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== - shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz" @@ -9749,28 +7561,11 @@ shellwords@^0.1.1: resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz" integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== -shortid@^2.2.14: - version "2.2.15" - resolved "https://registry.yarnpkg.com/shortid/-/shortid-2.2.15.tgz" - integrity sha512-5EaCy2mx2Jgc/Fdn9uuDuNIIfWBpzY4XIlhoqtXF6qsf+/+SGZ+FxDdX/ZsMZiWupIWNqAEmiNY4RC+LSmCeOw== - dependencies: - nanoid "^2.1.0" - signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz" integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== -simple-diff@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/simple-diff/-/simple-diff-1.6.0.tgz" - integrity sha1-m7XZUKe0ZNHsyG8gTog2UBnVpUI= - -simple-element-resize-detector@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/simple-element-resize-detector/-/simple-element-resize-detector-1.3.0.tgz" - integrity sha512-cCFTDpFMgz/OikrV9R++wOQgLbFwqrneci8FmAOH79xrfn1sQVZg9LJV2RvproMgdN2LnfZXZPrM+Z12GXN7jA== - simple-plist@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/simple-plist/-/simple-plist-1.1.0.tgz" @@ -9811,11 +7606,6 @@ slice-ansi@^2.0.0: astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" -sliced@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/sliced/-/sliced-1.0.1.tgz" - integrity sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E= - slide@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz" @@ -9851,7 +7641,7 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" -socketcluster-client@^14.2.1, socketcluster-client@^14.3.1: +socketcluster-client@^14.2.1: version "14.3.1" resolved "https://registry.yarnpkg.com/socketcluster-client/-/socketcluster-client-14.3.1.tgz" integrity sha512-Sd/T0K/9UlqTfz+HUuFq90dshA5OBJPQbdkRzGtcKIOm52fkdsBTt0FYpiuzzxv5VrU7PWpRm6KIfNXyPwlLpw== @@ -9867,38 +7657,6 @@ socketcluster-client@^14.2.1, socketcluster-client@^14.3.1: uuid "3.2.1" ws "7.1.0" -socketcluster-server@^14.7.0: - version "14.7.1" - resolved "https://registry.yarnpkg.com/socketcluster-server/-/socketcluster-server-14.7.1.tgz" - integrity sha512-KhZ1c6BKOtGaUWAA9Jdvvs+qSzMq/rBzB8O1Jpq4EpX4+zbq2B4igH6yxnflZw2EamAcAX06XokX+nre5PY+vA== - dependencies: - async "^3.1.0" - base64id "1.0.0" - component-emitter "1.2.1" - lodash.clonedeep "4.5.0" - sc-auth "^5.0.2" - sc-errors "^2.0.1" - sc-formatter "^3.0.2" - sc-simple-broker "^2.1.3" - uuid "3.2.1" - ws "7.1.0" - -socketcluster@^14.4.2: - version "14.4.2" - resolved "https://registry.yarnpkg.com/socketcluster/-/socketcluster-14.4.2.tgz" - integrity sha512-Z45tSQ6K/XUEyftrID1hyBXSdaK/gDeq6BMqhNR3XvjnUQ6HkkeTrxZUoXIn/In/J8KLl1WRVtvZAB0Zf9pEjA== - dependencies: - async "2.3.0" - fs-extra "6.0.1" - inquirer "5.2.0" - minimist "1.2.0" - sc-auth "^5.0.2" - sc-broker-cluster "^7.0.0" - sc-errors "^1.4.1" - socketcluster-server "^14.7.0" - uid-number "0.0.6" - uuid "3.2.1" - source-map-resolve@^0.5.0: version "0.5.3" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz" @@ -9910,7 +7668,7 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.5.1, source-map-support@^0.5.16, source-map-support@^0.5.6: +source-map-support@^0.5.16, source-map-support@^0.5.6: version "0.5.19" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz" integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== @@ -9923,7 +7681,7 @@ source-map-url@^0.4.0: resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz" integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= -source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7: +source-map@^0.5.0, source-map@^0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= @@ -9976,26 +7734,11 @@ split-string@^3.0.1, split-string@^3.0.2: dependencies: extend-shallow "^3.0.0" -sprintf-js@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz" - integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== - sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= -sqlite3@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-5.0.0.tgz" - integrity sha512-rjvqHFUaSGnzxDy2AHCwhHy6Zp6MNJzCPGYju4kD8yi6bze4d1/zMTg6C7JI49b7/EM7jKMTvyfN/4ylBKdwfw== - dependencies: - node-addon-api "2.0.0" - node-pre-gyp "^0.11.0" - optionalDependencies: - node-gyp "3.x" - sshpk@^1.7.0: version "1.16.1" resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz" @@ -10066,16 +7809,7 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -"string-width@^1.0.2 || 2", string-width@^2.1.0: +string-width@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -10115,7 +7849,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -strip-ansi@^3.0.0, strip-ansi@^3.0.1: +strip-ansi@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz" integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= @@ -10158,45 +7892,17 @@ strip-final-newline@^2.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= - -styled-components@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-5.1.1.tgz" - integrity sha512-1ps8ZAYu2Husx+Vz8D+MvXwEwvMwFv+hqqUwhNlDN5ybg6A+3xyW1ECrAgywhvXapNfXiz79jJyU0x22z0FFTg== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/traverse" "^7.4.5" - "@emotion/is-prop-valid" "^0.8.8" - "@emotion/stylis" "^0.8.4" - "@emotion/unitless" "^0.7.4" - babel-plugin-styled-components ">= 1" - css-to-react-native "^3.0.0" - hoist-non-react-statics "^3.0.0" - shallowequal "^1.1.0" - supports-color "^5.5.0" - sudo-prompt@^9.0.0: version "9.2.1" resolved "https://registry.yarnpkg.com/sudo-prompt/-/sudo-prompt-9.2.1.tgz" integrity sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw== -sumchecker@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-3.0.1.tgz" - integrity sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg== - dependencies: - debug "^4.1.0" - supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz" integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= -supports-color@^5.3.0, supports-color@^5.5.0: +supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== @@ -10245,33 +7951,6 @@ symbol-tree@^3.2.4: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== -tar@^2.0.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz" - integrity sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA== - dependencies: - block-stream "*" - fstream "^1.0.12" - inherits "2" - -tar@^4: - version "4.4.13" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz" - integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== - dependencies: - chownr "^1.1.1" - fs-minipass "^1.2.5" - minipass "^2.8.6" - minizlib "^1.2.1" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.3" - -tarn@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/tarn/-/tarn-2.0.0.tgz" - integrity sha512-7rNMCZd3s9bhQh47ksAQd92ADFcJUjjbyOvyFjNLwTPpGieFHMC84S+LOzw0fx1uh6hnDz/19r8CPMnIjJlMMA== - temp@0.8.3: version "0.8.3" resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz" @@ -10320,26 +7999,11 @@ through@^2.3.6: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= -ticky@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ticky/-/ticky-1.0.1.tgz" - integrity sha1-t8+nHnaPHJAAxJe5FRswlHxQ5G0= - -tildify@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/tildify/-/tildify-2.0.0.tgz" - integrity sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw== - time-stamp@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz" integrity sha1-dkpaEa9QVhkhsTPztE5hhofg9cM= -tiny-warning@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz" - integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== - tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz" @@ -10364,11 +8028,6 @@ to-object-path@^0.3.0: dependencies: kind-of "^3.0.2" -to-readable-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz" - integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== - to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz" @@ -10423,20 +8082,6 @@ tr46@^2.0.2: dependencies: punycode "^2.1.1" -truncate-utf8-bytes@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz" - integrity sha1-QFkjkJWS1W94pYGENLC3hInKXys= - dependencies: - utf8-byte-length "^1.0.1" - -ts-invariant@^0.4.0: - version "0.4.4" - resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.4.4.tgz" - integrity sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA== - dependencies: - tslib "^1.9.3" - ts-toolbelt@^8.0.7: version "8.0.7" resolved "https://registry.yarnpkg.com/ts-toolbelt/-/ts-toolbelt-8.0.7.tgz" @@ -10447,7 +8092,7 @@ tslib@1.9.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.0.tgz" integrity sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ== -tslib@^1.10.0, tslib@^1.13.0, tslib@^1.7.1, tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.3: +tslib@^1.13.0, tslib@^1.7.1, tslib@^1.8.0, tslib@^1.8.1: version "1.13.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz" integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== @@ -10567,11 +8212,6 @@ tunnel-agent@^0.6.0: dependencies: safe-buffer "^5.0.1" -tunnel@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz" - integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg== - tween-functions@^1.0.1: version "1.2.0" resolved "https://registry.yarnpkg.com/tween-functions/-/tween-functions-1.2.0.tgz#1ae3a50e7c60bb3def774eac707acbca73bbc3ff" @@ -10599,11 +8239,6 @@ type-fest@^0.11.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz" integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== -type-fest@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz" - integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== - type-fest@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz" @@ -10619,14 +8254,6 @@ type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -type-is@~1.6.17, type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz" @@ -10649,10 +8276,10 @@ typescript@3.2.2: resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.2.2.tgz" integrity sha512-VCj5UiSyHBjwfYacmDuc/NOk4QQixbE+Wn7MFJuS0nRuPQbof132Pw4u53dm264O8LPc2MVsc7RJNml5szurkg== -typescript@4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.2.tgz" - integrity sha512-thGloWsGH3SOxv1SoY7QojKi0tc+8FnOmiarEGMbd/lar7QOEd3hvlx3Fp5y6FlDUGl9L+pd4n2e+oToGMmhRQ== +typescript@4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.3.tgz#519d582bd94cba0cf8934c7d8e8467e473f53bb7" + integrity sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg== ua-parser-js@^0.7.18: version "0.7.21" @@ -10667,21 +8294,11 @@ uglify-es@^3.1.9: commander "~2.13.0" source-map "~0.6.1" -uid-number@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz" - integrity sha1-DqEOgDXo61uOREnwbaHHMGY7qoE= - ultron@1.0.x: version "1.0.2" resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz" integrity sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po= -unc-path-regex@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz" - integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo= - unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz" @@ -10720,7 +8337,7 @@ universalify@^0.1.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== -unpipe@1.0.0, unpipe@~1.0.0: +unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz" integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= @@ -10745,17 +8362,10 @@ urix@^0.1.0: resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz" integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= -url-parse-lax@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz" - integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= - dependencies: - prepend-http "^2.0.0" - -use-debounce@5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/use-debounce/-/use-debounce-5.1.0.tgz" - integrity sha512-fU7O7iel2bA19fxSiPfRkieVGxrow503phSUAGZ/EqiJtCPrU9AdUdrKOAdgh803IrjdIzhj+8eDsDGn4OPy8g== +use-debounce@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/use-debounce/-/use-debounce-5.2.0.tgz#3cb63f5c46f40092c570356e441dbc016ffb2f8b" + integrity sha512-lW4tbPsTnvPKYqOYXp5xZ7SP7No/ARLqqQqoyRKuSzP0HxR9arhSAhznXUZFoNPWDRij8fog+N6sYbjb8c3kzw== use-memo-one@^1.1.1: version "1.1.1" @@ -10774,11 +8384,6 @@ use@^3.1.0: resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== -utf8-byte-length@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz" - integrity sha1-9F8VDExm7uloGGUFq5P8u4rWv2E= - utf8@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz" @@ -10794,17 +8399,12 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -uuid@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz" - integrity sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g== - uuid@3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz" integrity sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA== -uuid@^3.1.0, uuid@^3.3.2, uuid@^3.3.3: +uuid@^3.3.2: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== @@ -10823,13 +8423,6 @@ v8-to-istanbul@^7.0.0: convert-source-map "^1.6.0" source-map "^0.7.3" -v8flags@^3.1.3: - version "3.2.0" - resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.2.0.tgz" - integrity sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg== - dependencies: - homedir-polyfill "^1.0.1" - validate-npm-package-license@^3.0.1: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" @@ -10845,7 +8438,7 @@ varuint-bitcoin@^1.0.4: dependencies: safe-buffer "^5.1.1" -vary@^1, vary@~1.1.2: +vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz" integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= @@ -10940,7 +8533,7 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@1, which@^1.2.14, which@^1.2.9: +which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -10954,13 +8547,6 @@ which@^2.0.1, which@^2.0.2: dependencies: isexe "^2.0.0" -wide-align@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - dependencies: - string-width "^1.0.2 || 2" - wif@^2.0.1: version "2.0.6" resolved "https://registry.yarnpkg.com/wif/-/wif-2.0.6.tgz" @@ -11095,16 +8681,6 @@ yallist@^2.1.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz" integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= -yallist@^3.0.0, yallist@^3.0.3: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yaml@^1.7.2: - version "1.10.0" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz" - integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== - yargs-parser@^13.1.2: version "13.1.2" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz" @@ -11195,24 +8771,3 @@ yargs@^15.1.0: which-module "^2.0.0" y18n "^4.0.0" yargs-parser "^18.1.1" - -yauzl@^2.10.0: - version "2.10.0" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz" - integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= - dependencies: - buffer-crc32 "~0.2.3" - fd-slicer "~1.1.0" - -zen-observable-ts@^0.8.21: - version "0.8.21" - resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.8.21.tgz" - integrity sha512-Yj3yXweRc8LdRMrCC8nIc4kkjWecPAUVh0TI0OUrWXx6aX790vLcDlWca6I4vsyCGH3LpWxq0dJRcMOFoVqmeg== - dependencies: - tslib "^1.9.3" - zen-observable "^0.8.0" - -zen-observable@^0.8.0: - version "0.8.15" - resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz" - integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==