From 5fb9f33b2be3102fb1a4ba2ebf26614f33cd7438 Mon Sep 17 00:00:00 2001 From: CrypticaScriptura <7396812+CrypticaScriptura@users.noreply.github.com> Date: Mon, 12 Feb 2024 16:53:51 -0500 Subject: [PATCH 1/8] chore: v9.0.0-beta.9 (#1650) --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 58bc3dc4..1e641c43 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "lamassu-server", - "version": "9.0.0-beta.8", + "version": "9.0.0-beta.9", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index f3c3bdce..582ff9ce 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "lamassu-server", "description": "bitcoin atm client server protocol module", "keywords": [], - "version": "9.0.0-beta.8", + "version": "9.0.0-beta.9", "license": "./LICENSE", "author": "Lamassu (https://lamassu.is)", "dependencies": { From 459f7148f8731ea7f5e9f5c888a844d65318fc99 Mon Sep 17 00:00:00 2001 From: Rafael Taranto Date: Thu, 22 Feb 2024 10:50:48 +0000 Subject: [PATCH 2/8] fix: use simplified LN deposit URL --- lib/plugins/wallet/galoy/galoy.js | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/lib/plugins/wallet/galoy/galoy.js b/lib/plugins/wallet/galoy/galoy.js index cc47da35..dd75f4b2 100644 --- a/lib/plugins/wallet/galoy/galoy.js +++ b/lib/plugins/wallet/galoy/galoy.js @@ -240,16 +240,7 @@ function newAddress (account, info, tx, settings, operatorId) { const { cryptoAtoms, cryptoCode } = tx return checkCryptoCode(cryptoCode) .then(() => getGaloyWallet(account.apiSecret, account.endpoint, account.walletId)) - .then(wallet => { - const promises = [ - newOnChainAddress(wallet.id, account.apiSecret, account.endpoint), - newInvoice(wallet.id, cryptoAtoms, account.apiSecret, account.endpoint) - ] - return Promise.all(promises) - }) - .then(([onChainAddress, invoice]) => { - return `bitcoin:${onChainAddress}?amount=${cryptoAtoms}&lightning=${invoice}` - }) + .then(wallet => newInvoice(wallet.id, cryptoAtoms, account.apiSecret, account.endpoint)) } function getInvoiceStatus (token, endpoint, address) { From 83d18f9a1095e0aae6b85d7e244f5ce1d06884e0 Mon Sep 17 00:00:00 2001 From: CrypticaScriptura <7396812+CrypticaScriptura@users.noreply.github.com> Date: Thu, 22 Feb 2024 08:44:51 -0500 Subject: [PATCH 3/8] chore: v9.0.0-beta.10 (#1655) --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1e641c43..5f9bd74e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "lamassu-server", - "version": "9.0.0-beta.9", + "version": "9.0.0-beta.10", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 582ff9ce..731cf246 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "lamassu-server", "description": "bitcoin atm client server protocol module", "keywords": [], - "version": "9.0.0-beta.9", + "version": "9.0.0-beta.10", "license": "./LICENSE", "author": "Lamassu (https://lamassu.is)", "dependencies": { From 45fa1a8d936436b8a144090a28a1109b167b30e3 Mon Sep 17 00:00:00 2001 From: Rafael Taranto Date: Thu, 29 Feb 2024 13:23:49 +0000 Subject: [PATCH 4/8] feat: lnurl support --- lib/logger.js | 2 +- lib/plugins/wallet/galoy/galoy.js | 32 ++++++++++++++++++++--- package-lock.json | 42 ++++++++++++++++--------------- package.json | 2 +- 4 files changed, 52 insertions(+), 26 deletions(-) diff --git a/lib/logger.js b/lib/logger.js index 65298e64..3fa0f242 100644 --- a/lib/logger.js +++ b/lib/logger.js @@ -21,7 +21,7 @@ const logger = new winston.Logger({ }) ], rewriters: [ - (...[,, meta]) => meta instanceof Error ? { message: meta.message, stack: meta.stack } : meta + (...[,, meta]) => meta instanceof Error ? { message: meta.message, stack: meta.stack, meta } : meta ], exitOnError: false }) diff --git a/lib/plugins/wallet/galoy/galoy.js b/lib/plugins/wallet/galoy/galoy.js index dd75f4b2..e0eeee63 100644 --- a/lib/plugins/wallet/galoy/galoy.js +++ b/lib/plugins/wallet/galoy/galoy.js @@ -92,8 +92,12 @@ function getGaloyWallet (token, endpoint, walletId) { }) } -function isLightning (address) { - return address.substr(0, 2) === 'ln' +function isLnInvoice (address) { + return address.startsWith('lnbc') +} + +function isLnurl (address) { + return address.startsWith('lnurl') } function sendFundsOnChain (walletId, address, cryptoAtoms, token, endpoint) { @@ -116,6 +120,23 @@ function sendFundsOnChain (walletId, address, cryptoAtoms, token, endpoint) { }) } +function sendFundsLNURL (walletId, lnurl, cryptoAtoms, token, endpoint) { + const sendLnNoAmount = { + 'operationName': 'lnurlPaymentSend', + 'query': `mutation lnurlPaymentSend($input: LnurlPaymentSendInput!) { + lnurlPaymentSend(input: $input) { + errors { + message + path + } + status + } + }`, + 'variables': { 'input': { 'lnurl': `${lnurl}`, 'walletId': `${walletId}`, 'amount': `${cryptoAtoms}` } } + } + return request(sendLnNoAmount, token, endpoint).then(result => result.data.lnurlPaymentSend) +} + function sendFundsLN (walletId, invoice, cryptoAtoms, token, endpoint) { const sendLnNoAmount = { 'operationName': 'lnNoAmountInvoicePaymentSend', @@ -155,9 +176,12 @@ function sendCoins (account, tx, settings, operatorId) { return checkCryptoCode(cryptoCode) .then(() => getGaloyWallet(account.apiSecret, account.endpoint, account.walletId)) .then(wallet => { - if (isLightning(toAddress)) { + if (isLnInvoice(toAddress)) { return sendFundsLN(wallet.id, toAddress, cryptoAtoms, account.apiSecret, account.endpoint) } + if (isLnurl(toAddress)) { + return sendFundsLNURL(wallet.id, toAddress, cryptoAtoms, account.apiSecret, account.endpoint) + } return sendFundsOnChain(wallet.id, toAddress, cryptoAtoms, account.apiSecret, account.endpoint) }) .then(result => { @@ -272,7 +296,7 @@ function getStatus (account, tx, requested, settings, operatorId) { return checkCryptoCode(cryptoCode) .then(() => { const address = coinUtils.parseUrl(cryptoCode, account.environment, toAddress, false) - if (isLightning(address)) { + if (isLnInvoice(address)) { return getInvoiceStatus(account.apiSecret, account.endpoint, address) .then(it => { const isPaid = it === 'PAID' diff --git a/package-lock.json b/package-lock.json index 5f9bd74e..7f79dc8e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1078,6 +1078,25 @@ "fastpriorityqueue": "^0.7.1", "typeforce": "^1.11.3", "varuint-bitcoin": "^1.1.2" + }, + "dependencies": { + "bitcoinjs-lib": { + "version": "npm:@bitgo-forks/bitcoinjs-lib@7.1.0-master.7", + "resolved": "https://registry.npmjs.org/@bitgo-forks/bitcoinjs-lib/-/bitcoinjs-lib-7.1.0-master.7.tgz", + "integrity": "sha512-FZle7954KnbbVXFCc5uYGtjq+0PFOnFxVchNwt3Kcv2nVusezTp29aeQwDi2Y+lM1dCoup2gJGXMkkREenY7KQ==", + "requires": { + "bech32": "^2.0.0", + "bip174": "npm:@bitgo-forks/bip174@3.1.0-master.4", + "bs58check": "^2.1.2", + "create-hash": "^1.1.0", + "fastpriorityqueue": "^0.7.1", + "json5": "^2.2.3", + "ripemd160": "^2.0.2", + "typeforce": "^1.11.3", + "varuint-bitcoin": "^1.1.2", + "wif": "^2.0.1" + } + } } }, "@bitgo/utxo-ord": { @@ -2132,9 +2151,9 @@ } }, "@lamassu/coins": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/@lamassu/coins/-/coins-1.4.3.tgz", - "integrity": "sha512-29XRlhYZcKYQeUWUohBLvjdvhkIYUe+TAxWYN+crw/JXSd8Bz3yId88v+n6+F3eTAN6iCDtHnTTiYRhYD4DQ/Q==", + "version": "1.4.9", + "resolved": "https://registry.npmjs.org/@lamassu/coins/-/coins-1.4.9.tgz", + "integrity": "sha512-psOTHCGJBaIP7mnMSY3zmAsX3k9m6PffnL1Kq9SE4waMyTX4fQu/heEkmWk/OACk2CSonahA4FbLNKc284cizg==", "requires": { "@lamassu/bolt11": "1.5.1", "bech32": "2.0.0", @@ -4393,23 +4412,6 @@ "resolved": "https://registry.npmjs.org/bitcoind-rpc/-/bitcoind-rpc-0.7.2.tgz", "integrity": "sha512-3alq5pH4/mAdEscucew98ls0s7BEaDvKTuYW34nSkTsmTC7G9R7Xh+ABXOxeVBfG/+rKfyQLmFAm2aRq92tJqw==" }, - "bitcoinjs-lib": { - "version": "npm:@bitgo-forks/bitcoinjs-lib@7.1.0-master.7", - "resolved": "https://registry.npmjs.org/@bitgo-forks/bitcoinjs-lib/-/bitcoinjs-lib-7.1.0-master.7.tgz", - "integrity": "sha512-FZle7954KnbbVXFCc5uYGtjq+0PFOnFxVchNwt3Kcv2nVusezTp29aeQwDi2Y+lM1dCoup2gJGXMkkREenY7KQ==", - "requires": { - "bech32": "^2.0.0", - "bip174": "npm:@bitgo-forks/bip174@3.1.0-master.4", - "bs58check": "^2.1.2", - "create-hash": "^1.1.0", - "fastpriorityqueue": "^0.7.1", - "json5": "^2.2.3", - "ripemd160": "^2.0.2", - "typeforce": "^1.11.3", - "varuint-bitcoin": "^1.1.2", - "wif": "^2.0.1" - } - }, "bitcoinjs-message": { "version": "npm:@bitgo-forks/bitcoinjs-message@1.0.0-master.2", "resolved": "https://registry.npmjs.org/@bitgo-forks/bitcoinjs-message/-/bitcoinjs-message-1.0.0-master.2.tgz", diff --git a/package.json b/package.json index 731cf246..3c3f4aeb 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "@ethereumjs/common": "^2.6.4", "@ethereumjs/tx": "^3.5.1", "@graphql-tools/merge": "^6.2.5", - "@lamassu/coins": "v1.4.3", + "@lamassu/coins": "v1.4.9", "@simplewebauthn/server": "^3.0.0", "@vonage/auth": "^1.5.0", "@vonage/sms": "^1.7.0", From b371bccf6c976a6e757effd0a10de433eb4e215f Mon Sep 17 00:00:00 2001 From: CrypticaScriptura <7396812+CrypticaScriptura@users.noreply.github.com> Date: Thu, 29 Feb 2024 13:41:06 +0000 Subject: [PATCH 5/8] chore: v9.0.0-beta.11 (#1656) --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7f79dc8e..a0570c7a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "lamassu-server", - "version": "9.0.0-beta.10", + "version": "9.0.0-beta.11", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 3c3f4aeb..d0debe9e 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "lamassu-server", "description": "bitcoin atm client server protocol module", "keywords": [], - "version": "9.0.0-beta.10", + "version": "9.0.0-beta.11", "license": "./LICENSE", "author": "Lamassu (https://lamassu.is)", "dependencies": { From 508adb573fe63dafe36baecb4afdefc7d1aabb24 Mon Sep 17 00:00:00 2001 From: Rafael Taranto Date: Thu, 29 Feb 2024 18:13:42 +0000 Subject: [PATCH 6/8] fix: case sensitivity --- lib/plugins/wallet/galoy/galoy.js | 4 +- package-lock.json | 127 +++++++++++------------------- package.json | 2 +- 3 files changed, 48 insertions(+), 85 deletions(-) diff --git a/lib/plugins/wallet/galoy/galoy.js b/lib/plugins/wallet/galoy/galoy.js index e0eeee63..e4a9a43e 100644 --- a/lib/plugins/wallet/galoy/galoy.js +++ b/lib/plugins/wallet/galoy/galoy.js @@ -93,11 +93,11 @@ function getGaloyWallet (token, endpoint, walletId) { } function isLnInvoice (address) { - return address.startsWith('lnbc') + return address.toLowerCase().startsWith('lnbc') } function isLnurl (address) { - return address.startsWith('lnurl') + return address.toLowerCase().startsWith('lnurl') } function sendFundsOnChain (walletId, address, cryptoAtoms, token, endpoint) { diff --git a/package-lock.json b/package-lock.json index a0570c7a..7f57679a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2108,41 +2108,6 @@ "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" }, - "bip32": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/bip32/-/bip32-1.0.4.tgz", - "integrity": "sha512-8T21eLWylZETolyqCPgia+MNp+kY37zFr7PTFDTPObHeNi9JlfG4qGIh8WzerIJidtwoK+NsWq2I5i66YfHoIw==", - "requires": { - "bs58check": "^2.1.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "tiny-secp256k1": "^1.0.0", - "typeforce": "^1.11.5", - "wif": "^2.0.6" - } - }, - "bitcoinjs-lib": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-4.0.3.tgz", - "integrity": "sha512-cb5t55MYUpwQi095J+u6eyltgIU7lbhZfC6+annstncDhfH4cyctW5jmU/tac7NonZZFYH7DktWnDxUm9AWWDQ==", - "requires": { - "bech32": "^1.1.2", - "bip32": "^1.0.0", - "bip66": "^1.1.0", - "bitcoin-ops": "^1.4.0", - "bs58check": "^2.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.3", - "merkle-lib": "^2.0.10", - "pushdata-bitcoin": "^1.0.1", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.1", - "tiny-secp256k1": "^1.0.0", - "typeforce": "^1.11.3", - "varuint-bitcoin": "^1.0.4", - "wif": "^2.0.1" - } - }, "bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", @@ -2151,9 +2116,9 @@ } }, "@lamassu/coins": { - "version": "1.4.9", - "resolved": "https://registry.npmjs.org/@lamassu/coins/-/coins-1.4.9.tgz", - "integrity": "sha512-psOTHCGJBaIP7mnMSY3zmAsX3k9m6PffnL1Kq9SE4waMyTX4fQu/heEkmWk/OACk2CSonahA4FbLNKc284cizg==", + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/@lamassu/coins/-/coins-1.4.10.tgz", + "integrity": "sha512-0B3axtDVWE93Yss+DB/utQD7Mlcr0oF0kS7NB+HUxDGmzvc8qO02H0woGsJm/Pub9kf9bHic01Bv+G4U2K5Tzg==", "requires": { "@lamassu/bolt11": "1.5.1", "bech32": "2.0.0", @@ -2168,50 +2133,6 @@ "ethereumjs-icap": "^0.3.1", "keccak256": "^1.0.2", "lodash": "^4.17.10" - }, - "dependencies": { - "bip32": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/bip32/-/bip32-1.0.4.tgz", - "integrity": "sha512-8T21eLWylZETolyqCPgia+MNp+kY37zFr7PTFDTPObHeNi9JlfG4qGIh8WzerIJidtwoK+NsWq2I5i66YfHoIw==", - "requires": { - "bs58check": "^2.1.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "tiny-secp256k1": "^1.0.0", - "typeforce": "^1.11.5", - "wif": "^2.0.6" - } - }, - "bitcoinjs-lib": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-4.0.3.tgz", - "integrity": "sha512-cb5t55MYUpwQi095J+u6eyltgIU7lbhZfC6+annstncDhfH4cyctW5jmU/tac7NonZZFYH7DktWnDxUm9AWWDQ==", - "requires": { - "bech32": "^1.1.2", - "bip32": "^1.0.0", - "bip66": "^1.1.0", - "bitcoin-ops": "^1.4.0", - "bs58check": "^2.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.3", - "merkle-lib": "^2.0.10", - "pushdata-bitcoin": "^1.0.1", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.1", - "tiny-secp256k1": "^1.0.0", - "typeforce": "^1.11.3", - "varuint-bitcoin": "^1.0.4", - "wif": "^2.0.1" - }, - "dependencies": { - "bech32": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" - } - } - } } }, "@mapbox/node-pre-gyp": { @@ -4412,6 +4333,48 @@ "resolved": "https://registry.npmjs.org/bitcoind-rpc/-/bitcoind-rpc-0.7.2.tgz", "integrity": "sha512-3alq5pH4/mAdEscucew98ls0s7BEaDvKTuYW34nSkTsmTC7G9R7Xh+ABXOxeVBfG/+rKfyQLmFAm2aRq92tJqw==" }, + "bitcoinjs-lib": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-4.0.3.tgz", + "integrity": "sha512-cb5t55MYUpwQi095J+u6eyltgIU7lbhZfC6+annstncDhfH4cyctW5jmU/tac7NonZZFYH7DktWnDxUm9AWWDQ==", + "requires": { + "bech32": "^1.1.2", + "bip32": "^1.0.0", + "bip66": "^1.1.0", + "bitcoin-ops": "^1.4.0", + "bs58check": "^2.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.3", + "merkle-lib": "^2.0.10", + "pushdata-bitcoin": "^1.0.1", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.1", + "tiny-secp256k1": "^1.0.0", + "typeforce": "^1.11.3", + "varuint-bitcoin": "^1.0.4", + "wif": "^2.0.1" + }, + "dependencies": { + "bech32": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" + }, + "bip32": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/bip32/-/bip32-1.0.4.tgz", + "integrity": "sha512-8T21eLWylZETolyqCPgia+MNp+kY37zFr7PTFDTPObHeNi9JlfG4qGIh8WzerIJidtwoK+NsWq2I5i66YfHoIw==", + "requires": { + "bs58check": "^2.1.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "tiny-secp256k1": "^1.0.0", + "typeforce": "^1.11.5", + "wif": "^2.0.6" + } + } + } + }, "bitcoinjs-message": { "version": "npm:@bitgo-forks/bitcoinjs-message@1.0.0-master.2", "resolved": "https://registry.npmjs.org/@bitgo-forks/bitcoinjs-message/-/bitcoinjs-message-1.0.0-master.2.tgz", diff --git a/package.json b/package.json index d0debe9e..2290875a 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "@ethereumjs/common": "^2.6.4", "@ethereumjs/tx": "^3.5.1", "@graphql-tools/merge": "^6.2.5", - "@lamassu/coins": "v1.4.9", + "@lamassu/coins": "v1.4.10", "@simplewebauthn/server": "^3.0.0", "@vonage/auth": "^1.5.0", "@vonage/sms": "^1.7.0", From 8b4e34644bd48a0833fbe5bfc979ebc8def5049d Mon Sep 17 00:00:00 2001 From: Rafael Taranto Date: Mon, 11 Mar 2024 10:47:31 +0000 Subject: [PATCH 7/8] feat: new version of galoy API --- lib/plugins/wallet/galoy/galoy.js | 75 +++++++++++++++++++------------ 1 file changed, 47 insertions(+), 28 deletions(-) diff --git a/lib/plugins/wallet/galoy/galoy.js b/lib/plugins/wallet/galoy/galoy.js index e4a9a43e..a2e57906 100644 --- a/lib/plugins/wallet/galoy/galoy.js +++ b/lib/plugins/wallet/galoy/galoy.js @@ -3,14 +3,14 @@ const axios = require('axios') const { utils: coinUtils } = require('@lamassu/coins') const NAME = 'LN' -const SUPPORTED_COINS = ['LN', 'BTC'] +const SUPPORTED_COINS = ['LN'] const BN = require('../../../bn') function request (graphqlQuery, token, endpoint) { const headers = { 'content-type': 'application/json', - 'Authorization': `Bearer ${token}` + 'X-API-KEY': token } return axios({ method: 'post', @@ -38,12 +38,11 @@ function checkCryptoCode (cryptoCode) { function getTransactionsByAddress (token, endpoint, walletId, address) { const accountInfo = { 'operationName': 'me', - 'query': `query me { + 'query': `query me($walletId: WalletId!, , $address: OnChainAddress!) { me { defaultAccount { - wallets { - id - transactionsByAddress (address: "${address}") { + walletById(walletId: $walletId) { + transactionsByAddress (address: $address) { edges { node { direction @@ -56,11 +55,11 @@ function getTransactionsByAddress (token, endpoint, walletId, address) { } } }`, - 'variables': {} + 'variables': { walletId, address } } return request(accountInfo, token, endpoint) .then(r => { - return _.find(it => it.id === walletId, r.data.me.defaultAccount.wallets).transactionsByAddress + return r.data.me.defaultAccount.walletById.transactionsByAddress }) .catch(err => { throw new Error(err) @@ -70,10 +69,10 @@ function getTransactionsByAddress (token, endpoint, walletId, address) { function getGaloyWallet (token, endpoint, walletId) { const accountInfo = { 'operationName': 'me', - 'query': `query me { + 'query': `query me($walletId: WalletId!) { me { defaultAccount { - wallets { + walletById(walletId: $walletId) { id walletCurrency balance @@ -81,11 +80,11 @@ function getGaloyWallet (token, endpoint, walletId) { } } }`, - 'variables': {} + 'variables': { walletId } } return request(accountInfo, token, endpoint) .then(r => { - return _.find(it => it.id === walletId, r.data.me.defaultAccount.wallets) + return r.data.me.defaultAccount.walletById }) .catch(err => { throw new Error(err) @@ -112,7 +111,7 @@ function sendFundsOnChain (walletId, address, cryptoAtoms, token, endpoint) { status } }`, - 'variables': { 'input': { 'address': `${address}`, 'amount': `${cryptoAtoms}`, 'walletId': `${walletId}` } } + 'variables': { 'input': { address, amount: cryptoAtoms.toString(), walletId } } } return request(sendOnChain, token, endpoint) .then(result => { @@ -149,7 +148,7 @@ function sendFundsLN (walletId, invoice, cryptoAtoms, token, endpoint) { status } }`, - 'variables': { 'input': { 'paymentRequest': `${invoice}`, 'walletId': `${walletId}`, 'amount': `${cryptoAtoms}` } } + 'variables': { 'input': { 'paymentRequest': invoice, walletId, amount: cryptoAtoms.toString() } } } return request(sendLnNoAmount, token, endpoint).then(result => result.data.lnNoAmountInvoicePaymentSend) } @@ -166,7 +165,7 @@ function sendProbeRequest (walletId, invoice, cryptoAtoms, token, endpoint) { } } }`, - 'variables': { 'input': { 'paymentRequest': `${invoice}`, 'walletId': `${walletId}`, 'amount': `${cryptoAtoms}` } } + 'variables': { 'input': { paymentRequest: invoice, walletId, amount: cryptoAtoms.toString() } } } return request(sendProbeNoAmount, token, endpoint).then(result => result.data.lnNoAmountInvoiceFeeProbe) } @@ -174,15 +173,14 @@ function sendProbeRequest (walletId, invoice, cryptoAtoms, token, endpoint) { function sendCoins (account, tx, settings, operatorId) { const { toAddress, cryptoAtoms, cryptoCode } = tx return checkCryptoCode(cryptoCode) - .then(() => getGaloyWallet(account.apiSecret, account.endpoint, account.walletId)) - .then(wallet => { + .then(() => { if (isLnInvoice(toAddress)) { - return sendFundsLN(wallet.id, toAddress, cryptoAtoms, account.apiSecret, account.endpoint) + return sendFundsLN(account.walletId, toAddress, cryptoAtoms, account.apiSecret, account.endpoint) } if (isLnurl(toAddress)) { - return sendFundsLNURL(wallet.id, toAddress, cryptoAtoms, account.apiSecret, account.endpoint) + return sendFundsLNURL(account.walletId, toAddress, cryptoAtoms, account.apiSecret, account.endpoint) } - return sendFundsOnChain(wallet.id, toAddress, cryptoAtoms, account.apiSecret, account.endpoint) + return sendFundsOnChain(account.walletId, toAddress, cryptoAtoms, account.apiSecret, account.endpoint) }) .then(result => { switch (result.status) { @@ -222,7 +220,7 @@ function newOnChainAddress (walletId, token, endpoint) { } } }`, - 'variables': { 'input': { 'walletId': `${walletId}` } } + 'variables': { 'input': { walletId } } } return request(createOnChainAddress, token, endpoint) .then(result => { @@ -230,6 +228,29 @@ function newOnChainAddress (walletId, token, endpoint) { }) } +function newNoAmountInvoice (walletId, token, endpoint) { + const createInvoice = { + 'operationName': 'lnNoAmountInvoiceCreate', + 'query': `mutation lnNoAmountInvoiceCreate($input: LnNoAmountInvoiceCreateInput!) { + lnNoAmountInvoiceCreate(input: $input) { + errors { + message + path + } + invoice { + paymentRequest + } + } + }`, + 'variables': { 'input': { walletId } } + } + return request(createInvoice, token, endpoint) + .then(result => { + return result.data.lnNoAmountInvoiceCreate.invoice.paymentRequest + }) + +} + function newInvoice (walletId, cryptoAtoms, token, endpoint) { const createInvoice = { 'operationName': 'lnInvoiceCreate', @@ -244,7 +265,7 @@ function newInvoice (walletId, cryptoAtoms, token, endpoint) { } } }`, - 'variables': { 'input': { 'walletId': `${walletId}`, 'amount': `${cryptoAtoms}` } } + 'variables': { 'input': { walletId, amount: cryptoAtoms.toString() } } } return request(createInvoice, token, endpoint) .then(result => { @@ -263,8 +284,7 @@ function balance (account, cryptoCode, settings, operatorId) { function newAddress (account, info, tx, settings, operatorId) { const { cryptoAtoms, cryptoCode } = tx return checkCryptoCode(cryptoCode) - .then(() => getGaloyWallet(account.apiSecret, account.endpoint, account.walletId)) - .then(wallet => newInvoice(wallet.id, cryptoAtoms, account.apiSecret, account.endpoint)) + .then(() => newInvoice(account.walletId, cryptoAtoms, account.apiSecret, account.endpoint)) } function getInvoiceStatus (token, endpoint, address) { @@ -275,7 +295,7 @@ function getInvoiceStatus (token, endpoint, address) { status } }`, - 'variables': {"input": {"paymentRequest": address}} + 'variables': { input: { paymentRequest: address } } } return request(query, token, endpoint) .then(r => { @@ -307,8 +327,7 @@ function getStatus (account, tx, requested, settings, operatorId) { // On-chain and intra-ledger transactions return getTransactionsByAddress(account.apiSecret, account.endpoint, account.walletId, address) .then(transactions => { - const txEdges = transactions.edges - const { SUCCESS: confirmed, PENDING: pending } = getBalance(txEdges) + const { SUCCESS: confirmed, PENDING: pending } = getBalance(transactions.edges) if (confirmed.gte(requested)) return { receivedCryptoAtoms: confirmed, status: 'confirmed' } if (pending.gte(requested)) return { receivedCryptoAtoms: pending, status: 'authorized' } if (pending.gt(0)) return { receivedCryptoAtoms: pending, status: 'insufficientFunds' } @@ -322,7 +341,7 @@ function newFunding (account, cryptoCode, settings, operatorId) { return checkCryptoCode(cryptoCode) .then(() => getGaloyWallet(account.apiSecret, account.endpoint, account.walletId)) .then(wallet => { - return newOnChainAddress(wallet.id, account.apiSecret, account.endpoint) + return newOnChainAddress(account.walletId, account.apiSecret, account.endpoint) .then(onChainAddress => [onChainAddress, wallet.balance]) }) .then(([onChainAddress, balance]) => { From c06b373d5aa4782baad127a40237062979c765ab Mon Sep 17 00:00:00 2001 From: Rafael Taranto Date: Mon, 11 Mar 2024 12:42:17 +0000 Subject: [PATCH 8/8] chore: beta status on LN --- lib/new-admin/config/index.js | 4 +++- lib/new-admin/graphql/types/currency.type.js | 1 + new-lamassu-admin/src/pages/Locales/Locales.js | 1 + new-lamassu-admin/src/pages/Locales/helper.js | 11 ++++++++--- new-lamassu-admin/src/pages/Wallet/Wallet.js | 1 + new-lamassu-admin/src/pages/Wallet/helper.js | 2 +- 6 files changed, 15 insertions(+), 5 deletions(-) diff --git a/lib/new-admin/config/index.js b/lib/new-admin/config/index.js index d64a6246..832945e2 100644 --- a/lib/new-admin/config/index.js +++ b/lib/new-admin/config/index.js @@ -32,10 +32,12 @@ const mapLanguage = lang => { } const massageCryptos = cryptos => { + const betaList = ['LN'] const convert = crypto => ({ code: crypto['cryptoCode'], display: crypto['display'], - codeDisplay: crypto['cryptoCodeDisplay'] ?? crypto['cryptoCode'] + codeDisplay: crypto['cryptoCodeDisplay'] ?? crypto['cryptoCode'], + isBeta: betaList.includes(crypto.cryptoCode) }) return _.map(convert, cryptos) diff --git a/lib/new-admin/graphql/types/currency.type.js b/lib/new-admin/graphql/types/currency.type.js index a2d8afb4..adef4997 100644 --- a/lib/new-admin/graphql/types/currency.type.js +++ b/lib/new-admin/graphql/types/currency.type.js @@ -10,6 +10,7 @@ const typeDef = gql` code: String! display: String! codeDisplay: String! + isBeta: Boolean } type Query { diff --git a/new-lamassu-admin/src/pages/Locales/Locales.js b/new-lamassu-admin/src/pages/Locales/Locales.js index a91459e5..3a820c8a 100644 --- a/new-lamassu-admin/src/pages/Locales/Locales.js +++ b/new-lamassu-admin/src/pages/Locales/Locales.js @@ -47,6 +47,7 @@ const GET_DATA = gql` cryptoCurrencies { code display + isBeta } languages { code diff --git a/new-lamassu-admin/src/pages/Locales/helper.js b/new-lamassu-admin/src/pages/Locales/helper.js index 738fc75f..32b14e4e 100644 --- a/new-lamassu-admin/src/pages/Locales/helper.js +++ b/new-lamassu-admin/src/pages/Locales/helper.js @@ -16,7 +16,7 @@ const allFields = (getData, onChange, auxElements = []) => { if (!data) return '' return R.compose( - R.prop(code), + it => `${R.prop(code)(it)} ${it?.isBeta ? '(Beta)' : ''}`, R.find(R.propEq(compare ?? 'code', it)) )(data) } @@ -36,7 +36,12 @@ const allFields = (getData, onChange, auxElements = []) => { const countryData = getData(['countries']) const currencyData = getData(['currencies']) const languageData = getData(['languages']) - const cryptoData = getData(['cryptoCurrencies']) + const rawCryptoData = getData(['cryptoCurrencies']) + const cryptoData = rawCryptoData?.map(it => { + it.codeLabel = `${it.code}${it.isBeta ? ' (Beta)' : ''}` + return it + }) + const timezonesData = timezoneList const findSuggestion = it => { @@ -104,7 +109,7 @@ const allFields = (getData, onChange, auxElements = []) => { inputProps: { options: cryptoData, valueProp: 'code', - labelProp: 'code', + labelProp: 'codeLabel', multiple: true, optionsLimit: null, onChange diff --git a/new-lamassu-admin/src/pages/Wallet/Wallet.js b/new-lamassu-admin/src/pages/Wallet/Wallet.js index b0a9c0c8..11067cbc 100644 --- a/new-lamassu-admin/src/pages/Wallet/Wallet.js +++ b/new-lamassu-admin/src/pages/Wallet/Wallet.js @@ -45,6 +45,7 @@ const GET_INFO = gql` cryptoCurrencies { code display + isBeta } } ` diff --git a/new-lamassu-admin/src/pages/Wallet/helper.js b/new-lamassu-admin/src/pages/Wallet/helper.js index 14f303e9..cf2871bd 100644 --- a/new-lamassu-admin/src/pages/Wallet/helper.js +++ b/new-lamassu-admin/src/pages/Wallet/helper.js @@ -208,7 +208,7 @@ const getElements = (cryptoCurrencies, accounts, onChange, wizard = false) => { const widthAdjust = wizard ? 11 : 0 const viewCryptoCurrency = it => { const currencyDisplay = R.compose( - R.prop(['display']), + it => `${R.prop(['display'])(it)} ${it.isBeta ? '(Beta)' : ''}`, R.find(R.propEq('code', it)) )(cryptoCurrencies) return currencyDisplay