aboutsummaryrefslogtreecommitdiffstats
path: root/lib/utils.js
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2022-09-30 15:07:30 -0700
committerAdam Soltys <[email protected]>2022-09-30 15:07:30 -0700
commit4ee46fee0cbf23f51228c7c4895ee1e0565b074f (patch)
tree803dc7399926ff508114f6e7e315b72ada399b87 /lib/utils.js
parenta8aaef0abb75cf00e28cd3bd5f747246cf83049a (diff)
downloadcoinos-server-4ee46fee0cbf23f51228c7c4895ee1e0565b074f.tar.gz
coinos-server-4ee46fee0cbf23f51228c7c4895ee1e0565b074f.zip
derive address/payreq server side
Diffstat (limited to 'lib/utils.js')
-rw-r--r--lib/utils.js84
1 files changed, 84 insertions, 0 deletions
diff --git a/lib/utils.js b/lib/utils.js
index 1ff24c67..036ccd6d 100644
--- a/lib/utils.js
+++ b/lib/utils.js
@@ -1,5 +1,13 @@
+import config from "$config";
import db from "$db";
import sequelize from "@sequelize/core";
+import { fromBase58 } from "bip32";
+import { payments as bcPayments, networks as bcNetworks } from "bitcoinjs-lib";
+import { payments as lqPayments, networks as lqNetworks } from "liquidjs-lib";
+import { createInvoice } from "lightning";
+import lnd from "$lib/lnd";
+import ln from "$lib/ln";
+
const { Op } = sequelize;
export const getUser = async (username, transaction) => {
@@ -90,3 +98,79 @@ export const getBlockHeight = message => {
readUInt32();
return readUInt32();
};
+
+export const deriveAddress = async (account, type) => {
+ let { index, pubkey, path, network } = account;
+ let n = { bitcoin: bcNetworks, liquid: lqNetworks }[network][
+ prod ? "bitcoin" : "regtest"
+ ];
+ let p = { bitcoin: bcPayments, liquid: lqPayments }[network];
+ let root = fromBase58(pubkey, n);
+ let parts = path.split("/");
+ let hd = root.derive(parseInt(parts[parts.length - 1]));
+
+ type = {
+ bech32: "p2wpkh",
+ "p2sh-segwit": "p2sh",
+ legacy: "p2pkh"
+ }[type];
+
+ console.log("TYPE", type);
+
+ let r;
+ if (type !== "p2sh") {
+ r = p[type]({
+ pubkey: hd.publicKey,
+ network: n
+ });
+ } else {
+ r = p[type]({
+ redeem: p.p2wpkh({
+ pubkey: hd.publicKey,
+ network: n
+ }),
+ network: n
+ });
+ }
+
+ index++;
+ account.index = index;
+ account.address = r.address;
+ await account.save();
+
+ return r;
+};
+
+export const bip21 = ({ address, amount, memo, tip, network }, { asset }) => {
+ if (network === "liquid") network = "liquidnetwork";
+
+ let url = amount || memo ? `${network}:${address}?` : address;
+ if (amount)
+ url += `amount=${((amount + tip) / SATS).toFixed(8)}${memo ? "&" : ""}`;
+ if (memo) url += `message=${memo}`;
+
+ if (network === "liquidnetwork" && amount) {
+ url += `&asset=${asset}`;
+ }
+
+ return url;
+};
+
+export const derivePayRequest = async ({ amount, memo, tip }) => {
+ if (!tip) tip = 0;
+ let value = amount + tip;
+
+ if (config.lna.clightning) {
+ if (!memo) memo = "coinos";
+ return (await ln.invoice(value ? `${value}sat` : "any", new Date(), memo, 360))
+ .bolt11;
+ } else {
+ return (
+ await createInvoice({
+ lnd,
+ tokens: value,
+ description: memo
+ })
+ ).request;
+ }
+};