Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[feature] v0.9.0 #2145

Merged
merged 32 commits into from
Apr 28, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
e6867a0
Embedded LND: v0.17.4-beta-zeus.3
kaloudis Apr 15, 2024
19925f2
LND: wire up fundPsbt, finalizePsbt, publishTransaction calls
kaloudis Apr 15, 2024
571e0af
External Accounts: importing, and UTXO picker enhancements
kaloudis Apr 15, 2024
4dc757f
PSBT handling, BC-UR + BBQr rendering
kaloudis Apr 15, 2024
cd38b60
PSBT, BC-UR + BBQr scanning
kaloudis Apr 15, 2024
4c2f9be
External Accounts: open channels
kaloudis Apr 17, 2024
1a2800a
External Accounts: publishTransaction: format fixes for Embedded + LNC
kaloudis Apr 17, 2024
f4d9319
External Accounts: fix scanning of wallet exports
kaloudis Apr 17, 2024
a948ade
External Accounts: add support for various wallet import formats, des…
kaloudis Apr 18, 2024
89bf4bd
improve PaymentPath
myxmaster Apr 18, 2024
1291ac5
LND: CloseChannel: close to external address
kaloudis Apr 19, 2024
3deecc7
LND: onchain batching
kaloudis Apr 22, 2024
0e1ad03
LND: batch channel opens
kaloudis Apr 23, 2024
608efff
Merge branch 'v0-9-0-branch' into hwi
kaloudis Apr 23, 2024
5c5e4cc
Merge pull request #2127 from kaloudis/hwi
kaloudis Apr 23, 2024
567ef8f
Merge pull request #2135 from kaloudis/closechannel-delivery-address
kaloudis Apr 23, 2024
1ab2be1
Merge branch 'v0-9-0-branch' into improve-path
kaloudis Apr 23, 2024
1182647
Merge pull request #2130 from myxmaster/improve-path
kaloudis Apr 23, 2024
ca42dfe
[v0.9.0] Version bump: v0.9.0-alpha1
kaloudis Apr 23, 2024
d0cc089
Merge pull request #2146 from kaloudis/version-bump-v0-9-0-alpha1
kaloudis Apr 23, 2024
117f734
PSBT/TxHex: fix pending chan IDs logic
kaloudis Apr 23, 2024
6eaaed7
iOS: v0.9.0 (2)
kaloudis Apr 23, 2024
f254f8e
Accounts: add ability to hide account
kaloudis Apr 24, 2024
ebe1d5c
Accounts: add processing of keystore format
kaloudis Apr 24, 2024
2de9bf4
Accounts: update xpub label
kaloudis Apr 25, 2024
1feb274
Merge remote-tracking branch 'upstream/master' into v0-9-0-branch
kaloudis Apr 25, 2024
3ec5daf
Version bump: v0.9.0-alpha2
kaloudis Apr 25, 2024
8204dca
ImportAccount: handle new props
kaloudis Apr 25, 2024
42378ed
AddressUtils: flesh out xpub validation
kaloudis Apr 27, 2024
3f9de61
LayerBalances: fix width on unified payment selection
kaloudis Apr 27, 2024
489a06d
Merge branch 'master' into v0-9-0-branch
kaloudis Apr 28, 2024
044ec0e
Version bump: v0.9.0-alpha3
kaloudis Apr 28, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ body:
label: ZEUS version
description: What version of ZEUS were you running when the bug occurred?
options:
- v0.9.0
- v0.8.4
- v0.8.3
- v0.8.2
Expand Down
17 changes: 13 additions & 4 deletions Navigation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ import CoinControl from './views/UTXOs/CoinControl';
import Utxo from './views/UTXOs/UTXO';
import Accounts from './views/Accounts/Accounts';
import ImportAccount from './views/Accounts/ImportAccount';
import ImportAccountQRScanner from './views/Accounts/ImportAccountQRScanner';
import ImportingAccount from './views/Accounts/ImportingAccount';
import BumpFee from './views/BumpFee';
import QR from './views/QR';
import AddNotes from './views/AddNotes';
Expand Down Expand Up @@ -129,6 +129,9 @@ import RawTxHex from './views/RawTxHex';

import CustodialWalletWarning from './views/Settings/CustodialWalletWarning';

import PSBT from './views/PSBT';
import TxHex from './views/TxHex';

const AppScenes = {
Wallet: {
screen: Wallet
Expand Down Expand Up @@ -286,15 +289,15 @@ const AppScenes = {
ImportAccount: {
screen: ImportAccount
},
ImportingAccount: {
screen: ImportingAccount
},
HandleAnythingQRScanner: {
screen: HandleAnythingQRScanner
},
NodeQRCodeScanner: {
screen: NodeQRScanner
},
ImportAccountQRScanner: {
screen: ImportAccountQRScanner
},
SparkQRScanner: {
screen: SparkQRScanner
},
Expand Down Expand Up @@ -450,6 +453,12 @@ const AppScenes = {
},
CustodialWalletWarning: {
screen: CustodialWalletWarning
},
PSBT: {
screen: PSBT
},
TxHex: {
screen: TxHex
}
};

Expand Down
2 changes: 1 addition & 1 deletion android/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ android {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 84
versionName "0.8.4-beta3"
versionName "0.9.0-alpha3"
multiDexEnabled true
missingDimensionStrategy 'react-native-camera', 'general'
}
Expand Down
1 change: 1 addition & 0 deletions assets/images/SVG/Account.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
32 changes: 32 additions & 0 deletions assets/images/SVG/DynamicSVG/MatiSvg.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import React from 'react';
import { Svg, Circle, Path } from 'react-native-svg';
import { themeColor } from '../../../../utils/ThemeUtils';

export default function MatiSvg({ width = 70, height = 70 }) {
const svgProps = {
width: `${width}`,
height: `${height}`,
viewBox: '0 0 50 50',
fill: 'none',
xmlns: 'http://www.w3.org/2000/svg'
};

const circleProps = {
cx: '25',
cy: '25',
r: '20',
fill: themeColor('background')
};

const path1Props = {
d: 'M34.45 28.3045l-9.4486 4.6305L15.55 28.3045l4.1137 -2.0184c1.0616 1.8058 3.055 3.0196 5.3348 3.0196s4.2732 -1.2137 5.3348 -3.0196zM24.9986 17.065L15.55 21.6955l4.1137 2.0184c1.0616 -1.8058 3.0535 -3.0196 5.3348 -3.0196c2.2828 0 4.2732 1.2137 5.3348 3.0196L34.45 21.6955zM24.9986 23.0067c-1.1252 0 -2.0391 0.8933 -2.0391 1.9933s0.914 1.9948 2.0391 1.9948S27.0376 26.1001 27.0376 25s-0.914 -1.9933 -2.0391 -1.9933zM24.9986 23.0067',
fill: themeColor('chain')
};

return React.createElement(
Svg,
svgProps,
React.createElement(Circle, circleProps),
React.createElement(Path, path1Props)
);
}
2 changes: 2 additions & 0 deletions backends/CLightningREST.ts
Original file line number Diff line number Diff line change
Expand Up @@ -272,5 +272,7 @@ export default class CLightningREST extends LND {
supportsSimpleTaprootChannels = () => false;
supportsCustomPreimages = () => false;
supportsSweep = () => true;
supportsOnchainBatching = () => false;
supportsChannelBatching = () => false;
isLNDBased = () => false;
}
2 changes: 2 additions & 0 deletions backends/Eclair.ts
Original file line number Diff line number Diff line change
Expand Up @@ -504,6 +504,8 @@ export default class Eclair {
supportsSimpleTaprootChannels = () => false;
supportsCustomPreimages = () => false;
supportsSweep = () => false;
supportsOnchainBatching = () => false;
supportsChannelBatching = () => false;
isLNDBased = () => false;
}

Expand Down
139 changes: 108 additions & 31 deletions backends/EmbeddedLND.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,11 @@ import Base64Utils from './../utils/Base64Utils';

import lndMobile from '../lndmobile/LndMobileInjection';

import {
checkLndStreamErrorResponse,
LndMobileEventEmitter
} from '../utils/LndMobileUtils';

const {
addInvoice,
getInfo,
Expand All @@ -17,7 +22,8 @@ const {
listPayments,
getNetworkInfo,
queryRoutes,
lookupInvoice
lookupInvoice,
fundingStateStep
} = lndMobile.index;
const {
channelBalance,
Expand All @@ -26,26 +32,33 @@ const {
pendingChannels,
closedChannels,
closeChannel,
openChannel
openChannel,
openChannelSync,
decodeOpenStatusUpdate
} = lndMobile.channel;
const {
signMessageNodePubkey,
verifyMessageNodePubkey,
bumpFee,
fundPsbt,
signPsbt,
finalizePsbt,
publishTransaction
publishTransaction,
listAccounts,
importAccount
} = lndMobile.wallet;
const { walletBalance, newAddress, getTransactions, sendCoins } =
lndMobile.onchain;

export default class EmbeddedLND extends LND {
openChannelListener: any;

getTransactions = async () => await getTransactions();
getChannels = async () => await listChannels();
getPendingChannels = async () => await pendingChannels();
getClosedChannels = async () => await closedChannels();
getChannelInfo = async (chanId: string) => await getChanInfo(chanId);
getBlockchainBalance = async () => await walletBalance();
getBlockchainBalance = async (data: any) => await walletBalance(data);
getLightningBalance = async () => await channelBalance();
sendCoins = async (data: any) =>
await sendCoins(
Expand All @@ -69,9 +82,10 @@ export default class EmbeddedLND extends LND {
preimage: data.preimage
});
getPayments = async () => await listPayments();
getNewAddress = async (data: any) => await newAddress(data.type);
openChannel = async (data: OpenChannelRequest) =>
await openChannel(
getNewAddress = async (data: any) =>
await newAddress(data.type, data.account);
openChannelSync = async (data: OpenChannelRequest) =>
await openChannelSync(
data.node_pubkey_string,
Number(data.local_funding_amount),
data.privateChannel || false,
Expand All @@ -83,6 +97,45 @@ export default class EmbeddedLND extends LND {
data.fundMax,
data.utxos
);
openChannelStream = async (data: OpenChannelRequest) => {
return await new Promise((resolve, reject) => {
LndMobileEventEmitter.addListener('OpenChannel', (e: any) => {
try {
const error = checkLndStreamErrorResponse('OpenChannel', e);
if (error === 'EOF') {
return;
} else if (error) {
console.error('Got error from OpenChannel', [error]);
reject(error);
return;
}

const result = decodeOpenStatusUpdate(e.data);
if (result?.psbt_fund) {
resolve({ result });
}
} catch (error) {
console.error(error);
}
});

openChannel(
data.node_pubkey_string,
Number(data.local_funding_amount),
data.privateChannel || false,
data.sat_per_vbyte && !data.funding_shim
? Number(data.sat_per_vbyte)
: undefined,
data.scidAlias,
data.min_confs,
data.spend_unconfirmed,
data.simpleTaprootChannel,
data.fundMax,
data.utxos,
data.funding_shim
);
});
};
connectPeer = async (data: any) =>
await connectPeer(data.addr.pubkey, data.addr.host, data.perm);
decodePaymentRequest = async (urlParams?: string[]) =>
Expand Down Expand Up @@ -129,8 +182,16 @@ export default class EmbeddedLND extends LND {
const force = urlParams && urlParams[2] ? true : false;
const sat_per_vbyte =
urlParams && urlParams[3] ? Number(urlParams[3]) : undefined;
const delivery_address =
urlParams && urlParams[4] ? urlParams[4] : undefined;

await closeChannel(fundingTxId, outputIndex, force, sat_per_vbyte);
return await closeChannel(
fundingTxId,
outputIndex,
force,
sat_per_vbyte,
delivery_address
);
};

getNodeInfo = async (urlParams?: Array<string>) =>
Expand All @@ -152,30 +213,46 @@ export default class EmbeddedLND extends LND {
urlParams && (await queryRoutes(urlParams[0], urlParams[1]));
// getForwardingHistory = () => N/A
// // Coin Control
fundPsbt = async (data: any) =>
await fundPsbt({
raw: data.raw,
spend_unconfirmed: data.spend_unconfirmed,
sat_per_vbyte: data.sat_per_vbyte
});
finalizePsbt = async (data: any) =>
await finalizePsbt({
funded_psbt: data.funded_psbt
});
publishTransaction = async (data: any) =>
await publishTransaction({
tx_hex: data.tx_hex
});
fundPsbt = async (data: any) => await fundPsbt(data);
signPsbt = async (data: any) => await signPsbt(data);
finalizePsbt = async (data: any) => await finalizePsbt(data);
publishTransaction = async (data: any) => {
if (data.tx_hex) data.tx_hex = Base64Utils.hexToBase64(data.tx_hex);
return await publishTransaction(data);
};
fundingStateStep = async (data: any) => {
// Verify
if (
data.psbt_finalize?.funded_psbt &&
Base64Utils.isHex(data.psbt_finalize?.funded_psbt)
)
data.psbt_finalize.funded_psbt = Base64Utils.hexToBase64(
data.psbt_finalize.funded_psbt
);
// Finalize
if (
data.psbt_finalize?.final_raw_tx &&
Base64Utils.isHex(data.psbt_finalize?.final_raw_tx)
)
data.psbt_finalize.final_raw_tx = Base64Utils.hexToBase64(
data.psbt_finalize.final_raw_tx
);
if (
data.psbt_finalize?.signed_psbt &&
Base64Utils.isHex(data.psbt_finalize?.signed_psbt)
)
data.psbt_finalize.signed_psbt = Base64Utils.hexToBase64(
data.psbt_finalize.signed_psbt
);
return await fundingStateStep(data);
};

getUTXOs = async () => await listUnspent();
getUTXOs = async (data: any) => await listUnspent(data);
bumpFee = async (data: any) => await bumpFee(data);
lookupInvoice = async (data: any) => await lookupInvoice(data.r_hash);

// TODO inject
// listAccounts = () => this.getRequest('/v2/wallet/accounts');
// TODO inject
// importAccount = (data: any) =>
// this.postRequest('/v2/wallet/accounts/import', data);
listAccounts = async () => await listAccounts();
importAccount = async (data: any) => await importAccount(data);

// TODO rewrite subscription logic, starting on Receive view
// subscribeInvoice = (r_hash: string) =>
Expand All @@ -197,9 +274,7 @@ export default class EmbeddedLND extends LND {
supportsCoinControl = () => this.supports('v0.12.0');
supportsChannelCoinControl = () => this.supports('v0.17.0');
supportsHopPicking = () => this.supports('v0.11.0');
// TODO wire up accounts
// supportsAccounts = () => this.supports('v0.13.0');
supportsAccounts = () => false;
supportsAccounts = () => true;
supportsRouting = () => false;
supportsNodeInfo = () => true;
singleFeesEarnedTotal = () => false;
Expand All @@ -211,5 +286,7 @@ export default class EmbeddedLND extends LND {
supportsSimpleTaprootChannels = () => this.supports('v0.17.0');
supportsCustomPreimages = () => true;
supportsSweep = () => true;
supportsOnchainBatching = () => true;
supportsChannelBatching = () => true;
isLNDBased = () => true;
}
Loading
Loading