aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2020-09-16 23:05:14 -0700
committerAdam Soltys <[email protected]>2020-09-16 23:05:14 -0700
commit49883ffcf2b01f4ca85f87cd55ba17cc8d6aaea9 (patch)
treeeb3befe88898a91a153690729d025e5f339f4cbf
parent55a37c3a545928553d6a540431f6266cb24fa401 (diff)
downloadcoinos-server-49883ffcf2b01f4ca85f87cd55ba17cc8d6aaea9.tar.gz
coinos-server-49883ffcf2b01f4ca85f87cd55ba17cc8d6aaea9.zip
add account network, fix internal asset transfers
-rw-r--r--db/models/accounts.js9
-rw-r--r--db/schema.sql13
-rw-r--r--lib/account.js2
-rw-r--r--lib/register.js2
-rw-r--r--routes/assets.js12
-rw-r--r--routes/invoices.js3
-rw-r--r--routes/liquid/receive.js13
-rw-r--r--routes/send.js60
-rw-r--r--routes/users.js15
9 files changed, 70 insertions, 59 deletions
diff --git a/db/models/accounts.js b/db/models/accounts.js
index fc386816..17e03857 100644
--- a/db/models/accounts.js
+++ b/db/models/accounts.js
@@ -55,6 +55,15 @@ const attributes = {
comment: null,
field: "seed"
},
+ network: {
+ type: DataTypes.STRING(255),
+ allowNull: true,
+ defaultValue: null,
+ primaryKey: false,
+ autoIncrement: false,
+ comment: null,
+ field: "network"
+ },
name: {
type: DataTypes.STRING(255),
allowNull: true,
diff --git a/db/schema.sql b/db/schema.sql
index 5bfc5c85..82248e1d 100644
--- a/db/schema.sql
+++ b/db/schema.sql
@@ -63,8 +63,9 @@ CREATE TABLE `accounts` (
`hide` tinyint(1) DEFAULT NULL,
`seed` varchar(255) DEFAULT NULL,
`path` varchar(255) DEFAULT NULL,
+ `network` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
-) ENGINE=InnoDB AUTO_INCREMENT=3943 DEFAULT CHARSET=latin1;
+) ENGINE=InnoDB AUTO_INCREMENT=4030 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -107,7 +108,7 @@ CREATE TABLE `invoices` (
`account_id` int(11) DEFAULT NULL,
`path` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
-) ENGINE=InnoDB AUTO_INCREMENT=5161 DEFAULT CHARSET=latin1;
+) ENGINE=InnoDB AUTO_INCREMENT=6191 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -124,7 +125,7 @@ CREATE TABLE `linkingkeys` (
`createdAt` datetime NOT NULL,
`updatedAt` datetime NOT NULL,
PRIMARY KEY (`id`)
-) ENGINE=InnoDB AUTO_INCREMENT=4554 DEFAULT CHARSET=latin1;
+) ENGINE=InnoDB AUTO_INCREMENT=4583 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -156,7 +157,7 @@ CREATE TABLE `payments` (
`redeemed` tinyint(1) NOT NULL DEFAULT 0,
`path` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
-) ENGINE=InnoDB AUTO_INCREMENT=5300 DEFAULT CHARSET=latin1;
+) ENGINE=InnoDB AUTO_INCREMENT=5488 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -225,7 +226,7 @@ CREATE TABLE `users` (
`index` int(11) NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
KEY `ip` (`ip`)
-) ENGINE=InnoDB AUTO_INCREMENT=690 DEFAULT CHARSET=latin1;
+) ENGINE=InnoDB AUTO_INCREMENT=712 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
@@ -237,4 +238,4 @@ CREATE TABLE `users` (
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
--- Dump completed on 2020-09-08 7:24:41
+-- Dump completed on 2020-09-16 23:05:04
diff --git a/lib/account.js b/lib/account.js
index 9355bd97..27ef830a 100644
--- a/lib/account.js
+++ b/lib/account.js
@@ -19,7 +19,7 @@ module.exports = async (asset, user) => {
let ticker = asset.substr(0, 3).toUpperCase();
let precision = 8;
- const assets = (await axios.get("https://assets.blockstream.info/")).data;
+ const assets = app.get('assets');
if (assets[asset]) {
({ domain, ticker, precision, name } = assets[asset]);
diff --git a/lib/register.js b/lib/register.js
index c8aa8e5d..7502c626 100644
--- a/lib/register.js
+++ b/lib/register.js
@@ -58,7 +58,7 @@ register = async (user, ip, requireChallenge) => {
user.currency = countries[info.data.country_code] || "USD";
}
- user.currencies = [...new Set([user.currency, "CAD", "USD", "JPY"])];
+ user.currencies = [...new Set([user.currency, "CAD", "USD"])];
user.fiat = false;
user.otpsecret = authenticator.generateSecret();
diff --git a/routes/assets.js b/routes/assets.js
index 06ad42dc..2468b394 100644
--- a/routes/assets.js
+++ b/routes/assets.js
@@ -1,7 +1,8 @@
const axios = require("axios");
const crypto = require("crypto");
-app.get("/assets", ah(async (req, res) => {
+let fetchAssets;
+(fetchAssets = async () => {
try {
const { data: assets } = await axios.get(
"https://assets.blockstream.info/"
@@ -16,11 +17,18 @@ app.get("/assets", ah(async (req, res) => {
if (!assets[a.asset]) assets[a.asset] = a;
});
- res.send(assets);
+ app.set('assets', assets);
} catch (e) {
l.error("error fetching assets", e.message);
res.status(500).send("error fetching assets");
}
+
+ setTimeout(fetchAssets, 7200000);
+})();
+
+app.get("/assets", ah(async (req, res) => {
+ if (app.get('assets')) res.send(app.get('assets'));
+ else app.status(500).send('Problem fetching blockstream asset registry data');
}));
app.post("/assets", auth, ah(async (req, res) => {
diff --git a/routes/invoices.js b/routes/invoices.js
index 092b5eae..934ff96c 100644
--- a/routes/invoices.js
+++ b/routes/invoices.js
@@ -47,7 +47,8 @@ app.post("/invoice", ah(async (req, res, next) => {
const exists = await db.Invoice.findOne({
where: {
[Op.or]: {
- address: invoice.address || "undefined",
+ address: invoice.address || "",
+ unconfidential: invoice.unconfidential || "",
text: invoice.text,
},
},
diff --git a/routes/liquid/receive.js b/routes/liquid/receive.js
index 64b8e37d..097dc53a 100644
--- a/routes/liquid/receive.js
+++ b/routes/liquid/receive.js
@@ -12,7 +12,7 @@ const network =
config.liquid.network === "mainnet" ? "liquid" : config.liquid.network
];
-const getAccount = async (params, pending) => {
+const getAccount = async (params) => {
let account = await db.Account.findOne({
where: params
});
@@ -29,7 +29,7 @@ const getAccount = async (params, pending) => {
let ticker = asset.substr(0, 3).toUpperCase();
let precision = 8;
- const assets = (await axios.get("https://assets.blockstream.info/")).data;
+ const assets = app.get('assets');
if (assets[asset]) {
({ domain, ticker, precision, name } = assets[asset]);
@@ -51,7 +51,7 @@ const getAccount = async (params, pending) => {
params = { ...params, ...{ domain, ticker, precision, name } };
params.balance = 0;
- params.pending = pending;
+ params.network = 'liquid';
return db.Account.create(params);
};
@@ -103,17 +103,20 @@ zmqRawTx.on("message", async (topic, message, sequence) => {
let { account } = invoice;
- if (account.asset === asset) {
+ if (account.asset === asset && (!account.pubkey || account.network === 'liquid')) {
account.pending += value;
await account.save();
} else {
account = await getAccount(
{
+ seed: account.seed,
+ path: account.path,
user_id: user.id,
asset,
pubkey: account.pubkey,
+ pending: value,
+ index: 0,
},
- value
);
}
diff --git a/routes/send.js b/routes/send.js
index b0047010..9080dc0c 100644
--- a/routes/send.js
+++ b/routes/send.js
@@ -58,7 +58,7 @@ module.exports = ah(async (req, res, next) => {
emit(user.username, "user", user);
if (username) {
- user = await db.User.findOne({
+ let recipient = await db.User.findOne({
where: { username },
include: {
model: db.Account,
@@ -66,46 +66,33 @@ module.exports = ah(async (req, res, next) => {
}
});
- const invoice = await db.Invoice.findOne({
- where: {
- user_id: user.id,
- network: "bitcoin"
- },
- order: [["id", "DESC"]],
- include: {
- model: db.Account,
- as: "account"
- }
- });
-
- if (invoice) ({ account } = invoice);
- else if (user.account.asset === asset && !user.account.pubkey)
- ({ account } = user);
+ let a2;
+ if (recipient.account.asset === asset && !recipient.account.pubkey)
+ ({ a2 } = recipient);
else {
let params = {
- user_id: user.id,
+ user_id: recipient.id,
asset,
pubkey: null
};
- account = await db.Account.findOne({
+ a2 = await db.Account.findOne({
where: params,
lock: transaction.LOCK.UPDATE,
transaction
});
}
- if (account) {
- account.balance += amount;
- await account.save({ transaction });
+ if (a2) {
+ a2.balance += amount;
+ await a2.save({ transaction });
} else {
let name = asset.substr(0, 6);
let domain;
let ticker = asset.substr(0, 3).toUpperCase();
let precision = 8;
- const assets = (await axios.get("https://assets.blockstream.info/"))
- .data;
+ const assets = app.get('assets');
if (assets[asset]) {
({ domain, ticker, precision, name } = assets[asset]);
@@ -125,19 +112,20 @@ module.exports = ah(async (req, res, next) => {
}
}
- params = { ...params, ...{ domain, ticker, precision, name } };
+ params = { asset, ...params, ...{ domain, ticker, precision, name } };
params.balance = amount;
params.pending = 0;
- account = await db.Account.create(params, { transaction });
+ params.network = 'liquid';
+ a2 = await db.Account.create(params, { transaction });
}
- payment = await db.Payment.create(
+ let p2 = await db.Payment.create(
{
amount,
- account_id: account.id,
- user_id: user.id,
- rate: app.get("rates")[user.currency],
- currency: user.currency,
+ account_id: a2.id,
+ user_id: recipient.id,
+ rate: app.get("rates")[recipient.currency],
+ currency: recipient.currency,
confirmed: true,
hash: "Internal Transfer",
memo,
@@ -147,13 +135,13 @@ module.exports = ah(async (req, res, next) => {
{ transaction }
);
- payment = payment.get({ plain: true });
- payment.account = account.get({ plain: true });
- emit(user.username, "account", account);
- emit(user.username, "payment", payment);
+ p2 = p2.get({ plain: true });
+ p2.account = a2.get({ plain: true });
+ emit(recipient.username, "account", p2.account);
+ emit(recipient.username, "payment", p2);
- l.info("received internal", user.username, amount);
- notify(user, `Received ${amount} ${account.ticker} sats`);
+ l.info("received internal", recipient.username, amount);
+ notify(recipient, `Received ${amount} ${a2.ticker} sats`);
}
res.send(payment);
});
diff --git a/routes/users.js b/routes/users.js
index d1bdfc0c..5de71a54 100644
--- a/routes/users.js
+++ b/routes/users.js
@@ -259,7 +259,7 @@ app.post(
"/accounts",
auth,
ah(async (req, res) => {
- const { name, seed, pubkey, ticker, precision, path } = req.body;
+ const { name, seed, pubkey, ticker, precision, path, network } = req.body;
const { user } = req;
let account = await db.Account.create({
@@ -272,7 +272,8 @@ app.post(
precision,
pubkey,
seed,
- path
+ path,
+ network
});
emit(user.username, "account", account);
@@ -421,12 +422,12 @@ app.post(
pubkey,
path,
hide,
- index,
+ index
} = req.body;
try {
await db.Account.update(
- { name, ticker, precision, domain, seed, pubkey, path, hide },
+ { name, ticker, precision, domain, seed, pubkey, path, hide, index },
{
where: { id, user_id: user.id }
}
@@ -472,12 +473,12 @@ app.post(
}
});
user.payments = payments;
- user.account = account;
+ user.account = account.get({ plain: true });
- emit(user.username, "account", account.get({ plain: true }));
+ emit(user.username, "account", user.account);
emit(user.username, "user", user);
- res.end();
+ res.send(user);
} catch (e) {
l.error(e.message);
return res.status(500).send("There was a problem switching accounts");