//--------------------------------------------------------------------- // // QR Code Generator for JavaScript // // Copyright (c) 2009 Kazuhiko Arase // // URL: http://www.d-project.com/ // // Licensed under the MIT license: // http://www.opensource.org/licenses/mit-license.php // // The word 'QR Code' is registered trademark of // DENSO WAVE INCORPORATED // http://www.denso-wave.com/qrcode/faqpatent-e.html // //--------------------------------------------------------------------- //---------------微信小程序基于base64生成二维码插件修改------------------- /* * @Modified: Pudon * @demoURL: https://github.com/Pudon/weapp-qrcode * @Date: 2018-09-11 14:00:05 * @Last Modified by: Pudon * @Last Modified time: 2018-09-12 16:33:19 */ //--------------------------------------------------------------------- /** * qrcode * @param typeNumber 1 to 40 * @param errorCorrectLevel 'L','M','Q','H' */ var qrcode = function (typeNumber, errorCorrectLevel) { var PAD0 = 0xec; var PAD1 = 0x11; var _typeNumber = typeNumber; var _errorCorrectLevel = QRErrorCorrectLevel[errorCorrectLevel]; var _modules = null; var _moduleCount = 0; var _dataCache = null; var _dataList = new Array(); var _this = {}; var makeImpl = function (test, maskPattern) { _moduleCount = _typeNumber * 4 + 17; _modules = (function (moduleCount) { var modules = new Array(moduleCount); for (var row = 0; row < moduleCount; row += 1) { modules[row] = new Array(moduleCount); for (var col = 0; col < moduleCount; col += 1) { modules[row][col] = null; } } return modules; })(_moduleCount); setupPositionProbePattern(0, 0); setupPositionProbePattern(_moduleCount - 7, 0); setupPositionProbePattern(0, _moduleCount - 7); setupPositionAdjustPattern(); setupTimingPattern(); setupTypeInfo(test, maskPattern); if (_typeNumber >= 7) { setupTypeNumber(test); } if (_dataCache == null) { _dataCache = createData(_typeNumber, _errorCorrectLevel, _dataList); } mapData(_dataCache, maskPattern); }; var setupPositionProbePattern = function (row, col) { for (var r = -1; r <= 7; r += 1) { if (row + r <= -1 || _moduleCount <= row + r) continue; for (var c = -1; c <= 7; c += 1) { if (col + c <= -1 || _moduleCount <= col + c) continue; if ( (0 <= r && r <= 6 && (c == 0 || c == 6)) || (0 <= c && c <= 6 && (r == 0 || r == 6)) || (2 <= r && r <= 4 && 2 <= c && c <= 4) ) { _modules[row + r][col + c] = true; } else { _modules[row + r][col + c] = false; } } } }; var getBestMaskPattern = function () { var minLostPoint = 0; var pattern = 0; for (var i = 0; i < 8; i += 1) { makeImpl(true, i); var lostPoint = QRUtil.getLostPoint(_this); if (i == 0 || minLostPoint > lostPoint) { minLostPoint = lostPoint; pattern = i; } } return pattern; }; var setupTimingPattern = function () { for (var r = 8; r < _moduleCount - 8; r += 1) { if (_modules[r][6] != null) { continue; } _modules[r][6] = r % 2 == 0; } for (var c = 8; c < _moduleCount - 8; c += 1) { if (_modules[6][c] != null) { continue; } _modules[6][c] = c % 2 == 0; } }; var setupPositionAdjustPattern = function () { var pos = QRUtil.getPatternPosition(_typeNumber); for (var i = 0; i < pos.length; i += 1) { for (var j = 0; j < pos.length; j += 1) { var row = pos[i]; var col = pos[j]; if (_modules[row][col] != null) { continue; } for (var r = -2; r <= 2; r += 1) { for (var c = -2; c <= 2; c += 1) { if (r == -2 || r == 2 || c == -2 || c == 2 || (r == 0 && c == 0)) { _modules[row + r][col + c] = true; } else { _modules[row + r][col + c] = false; } } } } } }; var setupTypeNumber = function (test) { var bits = QRUtil.getBCHTypeNumber(_typeNumber); for (var i = 0; i < 18; i += 1) { var mod = !test && ((bits >> i) & 1) == 1; _modules[Math.floor(i / 3)][(i % 3) + _moduleCount - 8 - 3] = mod; } for (var i = 0; i < 18; i += 1) { var mod = !test && ((bits >> i) & 1) == 1; _modules[(i % 3) + _moduleCount - 8 - 3][Math.floor(i / 3)] = mod; } }; var setupTypeInfo = function (test, maskPattern) { var data = (_errorCorrectLevel << 3) | maskPattern; var bits = QRUtil.getBCHTypeInfo(data); // vertical for (var i = 0; i < 15; i += 1) { var mod = !test && ((bits >> i) & 1) == 1; if (i < 6) { _modules[i][8] = mod; } else if (i < 8) { _modules[i + 1][8] = mod; } else { _modules[_moduleCount - 15 + i][8] = mod; } } // horizontal for (var i = 0; i < 15; i += 1) { var mod = !test && ((bits >> i) & 1) == 1; if (i < 8) { _modules[8][_moduleCount - i - 1] = mod; } else if (i < 9) { _modules[8][15 - i - 1 + 1] = mod; } else { _modules[8][15 - i - 1] = mod; } } // fixed module _modules[_moduleCount - 8][8] = !test; }; var mapData = function (data, maskPattern) { var inc = -1; var row = _moduleCount - 1; var bitIndex = 7; var byteIndex = 0; var maskFunc = QRUtil.getMaskFunction(maskPattern); for (var col = _moduleCount - 1; col > 0; col -= 2) { if (col == 6) col -= 1; while (true) { for (var c = 0; c < 2; c += 1) { if (_modules[row][col - c] == null) { var dark = false; if (byteIndex < data.length) { dark = ((data[byteIndex] >>> bitIndex) & 1) == 1; } var mask = maskFunc(row, col - c); if (mask) { dark = !dark; } _modules[row][col - c] = dark; bitIndex -= 1; if (bitIndex == -1) { byteIndex += 1; bitIndex = 7; } } } row += inc; if (row < 0 || _moduleCount <= row) { row -= inc; inc = -inc; break; } } } }; var createBytes = function (buffer, rsBlocks) { var offset = 0; var maxDcCount = 0; var maxEcCount = 0; var dcdata = new Array(rsBlocks.length); var ecdata = new Array(rsBlocks.length); for (var r = 0; r < rsBlocks.length; r += 1) { var dcCount = rsBlocks[r].dataCount; var ecCount = rsBlocks[r].totalCount - dcCount; maxDcCount = Math.max(maxDcCount, dcCount); maxEcCount = Math.max(maxEcCount, ecCount); dcdata[r] = new Array(dcCount); for (var i = 0; i < dcdata[r].length; i += 1) { dcdata[r][i] = 0xff & buffer.getBuffer()[i + offset]; } offset += dcCount; var rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount); var rawPoly = qrPolynomial(dcdata[r], rsPoly.getLength() - 1); var modPoly = rawPoly.mod(rsPoly); ecdata[r] = new Array(rsPoly.getLength() - 1); for (var i = 0; i < ecdata[r].length; i += 1) { var modIndex = i + modPoly.getLength() - ecdata[r].length; ecdata[r][i] = modIndex >= 0 ? modPoly.getAt(modIndex) : 0; } } var totalCodeCount = 0; for (var i = 0; i < rsBlocks.length; i += 1) { totalCodeCount += rsBlocks[i].totalCount; } var data = new Array(totalCodeCount); var index = 0; for (var i = 0; i < maxDcCount; i += 1) { for (var r = 0; r < rsBlocks.length; r += 1) { if (i < dcdata[r].length) { data[index] = dcdata[r][i]; index += 1; } } } for (var i = 0; i < maxEcCount; i += 1) { for (var r = 0; r < rsBlocks.length; r += 1) { if (i < ecdata[r].length) { data[index] = ecdata[r][i]; index += 1; } } } return data; }; var createData = function (typeNumber, errorCorrectLevel, dataList) { var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, errorCorrectLevel); var buffer = qrBitBuffer(); for (var i = 0; i < dataList.length; i += 1) { var data = dataList[i]; buffer.put(data.getMode(), 4); buffer.put( data.getLength(), QRUtil.getLengthInBits(data.getMode(), typeNumber), ); data.write(buffer); } // calc num max data. var totalDataCount = 0; for (var i = 0; i < rsBlocks.length; i += 1) { totalDataCount += rsBlocks[i].dataCount; } if (buffer.getLengthInBits() > totalDataCount * 8) { throw new Error( "code length overflow. (" + buffer.getLengthInBits() + ">" + totalDataCount * 8 + ")", ); } // end code if (buffer.getLengthInBits() + 4 <= totalDataCount * 8) { buffer.put(0, 4); } // padding while (buffer.getLengthInBits() % 8 != 0) { buffer.putBit(false); } // padding while (true) { if (buffer.getLengthInBits() >= totalDataCount * 8) { break; } buffer.put(PAD0, 8); if (buffer.getLengthInBits() >= totalDataCount * 8) { break; } buffer.put(PAD1, 8); } return createBytes(buffer, rsBlocks); }; _this.addData = function (data) { var newData = qr8BitByte(data); _dataList.push(newData); _dataCache = null; }; _this.isDark = function (row, col) { if (row < 0 || _moduleCount <= row || col < 0 || _moduleCount <= col) { throw new Error(row + "," + col); } return _modules[row][col]; }; _this.getModuleCount = function () { return _moduleCount; }; _this.make = function () { makeImpl(false, getBestMaskPattern()); }; _this.createTableTag = function (cellSize, margin) { cellSize = cellSize || 2; margin = typeof margin == "undefined" ? cellSize * 4 : margin; var qrHtml = ""; qrHtml += '
| '; } qrHtml += " |
export const up = function(knex) {
return knex.schema.createTable('exchanges', function(t) {
t.increments('id').unsigned().primary();
t.int('transfer_id').notNull();
t.foreign('transfer_id').references('transfers.id');
t.double('exchange_rate').notNull()
t.double('exchange_fee').notNull().defaultTo(0)
t.timestamps();
})
};
export const down = function(knex) {
return knex.schema.dropTable('exchanges');
};
// Changes:
//
// Should these be tracked as transactions ?
// SAT -> SAT
// tracking various exchange variations (outside of external networks ?)
//
// Is user / account / amount info redundant ?
// + transaction_type: deposit / withdrawal / transfer / exchange ?
//
// add transfers table ? (for internal transfers only ?)
// add redemptions table ? (for bitcoin transfers only ?)
// add exchanges table ? (for conversion from one currency to another)
//
// network -> scope: internal / bitcoin / liquid / lightning ?
// add bitcoin_transaction ? (with redemption attributes)
// add liquid_transaction ? ()
// add lightning_transaction ? (with LN_invoice_hash)
// add internal_transaction ? ()
//
// context for path, memo, rate, preimage, address, received, fee, tip, confirmed, redeemcode ?
import { DataTypes } from '@sequelize/core';
const attributes = {
id: {
type: DataTypes.INTEGER(11),
allowNull: false,
defaultValue: null,
primaryKey: true,
autoIncrement: true,
comment: null,
field: "id"
},
account_id: {
type: DataTypes.INTEGER(11),
allowNull: true,
defaultValue: null,
primaryKey: false,
autoIncrement: false,
comment: null,
field: "account_id"
},
user_id: {
type: DataTypes.INTEGER(11),
allowNull: true,
defaultValue: null,
primaryKey: false,
autoIncrement: false,
comment: null,
field: "user_id"
},
path: {
type: DataTypes.STRING(255),
allowNull: true,
defaultValue: null,
primaryKey: false,
autoIncrement: false,
comment: null,
field: "path"
},
memo: {
type: DataTypes.TEXT,
allowNull: true,
defaultValue: null,
primaryKey: false,
autoIncrement: false,
comment: null,
field: "memo"
},
hash: {
type: DataTypes.TEXT,
allowNull: true,
defaultValue: null,
primaryKey: false,
autoIncrement: false,
comment: null,
field: "hash"
},
createdAt: {
type: DataTypes.DATE,
allowNull: false,
defaultValue: null,
primaryKey: false,
autoIncrement: false,
comment: null,
field: "createdAt"
},
updatedAt: {
type: DataTypes.DATE,
allowNull: false,
defaultValue: null,
primaryKey: false,
autoIncrement: false,
comment: null,
field: "updatedAt"
},
rate: {
type: DataTypes.DOUBLE,
allowNull: true,
defaultValue: null,
primaryKey: false,
autoIncrement: false,
comment: null,
field: "rate"
},
preimage: {
type: DataTypes.STRING(255),
allowNull: true,
defaultValue: null,
primaryKey: false,
autoIncrement: false,
comment: null,
field: "preimage"
},
network: {
type: DataTypes.STRING(255),
allowNull: true,
defaultValue: null,
primaryKey: false,
autoIncrement: false,
comment: null,
field: "network"
},
currency: {
type: DataTypes.STRING(255),
allowNull: true,
defaultValue: null,
primaryKey: false,
autoIncrement: false,
comment: null,
field: "currency"
},
address: {
type: DataTypes.STRING(255),
allowNull: true,
defaultValue: null,
primaryKey: false,
autoIncrement: false,
comment: null,
field: "address"
},
received: {
type: DataTypes.INTEGER(1),
allowNull: true,
defaultValue: null,
primaryKey: false,
autoIncrement: false,
comment: null,
field: "received"
},
amount: {
type: DataTypes.DOUBLE,
allowNull: true,
defaultValue: null,
primaryKey: false,
autoIncrement: false,
comment: null,
field: "amount"
},
fee: {
type: DataTypes.DOUBLE,
allowNull: false,
defaultValue: 0,
primaryKey: false,
autoIncrement: false,
comment: null,
field: "fee"
},
tip: {
type: DataTypes.DOUBLE,
allowNull: false,
defaultValue: 0,
primaryKey: false,
autoIncrement: false,
comment: null,
field: "tip"
},
redeemed: {
type: DataTypes.BOOLEAN,
allowNull: false,
defaultValue: false,
primaryKey: false,
autoIncrement: false,
comment: null,
field: "redeemed"
},
redeemcode: {
type: DataTypes.STRING(255),
allowNull: true,
defaultValue: null,
primaryKey: false,
autoIncrement: false,
comment: null,
field: "redeemcode"
},
confirmed: {
type: DataTypes.INTEGER(1),
allowNull: false,
defaultValue: null,
primaryKey: false,
autoIncrement: false,
comment: null,
field: "confirmed"
}
};
const options = {
tableName: "payments",
comment: "",
indexes: []
};
db["Payment"] = db.define("payments_model", attributes, options);