Files
BlockchainUI/src/utils/Utils.js
2022-12-01 13:50:14 +03:00

408 lines
9.1 KiB
JavaScript

import resolveConfig from 'tailwindcss/resolveConfig';
import { cryptography, transactions } from '@liskhq/lisk-client';
import {
removeFeatureAssetSchema,
setFeatureAssetSchema,
unlockDelegateAssetSchema,
validateFeatureAssetSchema,
voteDelegateAssetSchema,
} from './Schemas';
import { statusMap } from '../shared/statusMap';
export const tailwindConfig = () => {
// Tailwind config
return resolveConfig('./src/tailwind.config.js');
};
export const hexToRGB = (h) => {
let r = 0;
let g = 0;
let b = 0;
if (h.length === 4) {
r = `0x${h[1]}${h[1]}`;
g = `0x${h[2]}${h[2]}`;
b = `0x${h[3]}${h[3]}`;
} else if (h.length === 7) {
r = `0x${h[1]}${h[2]}`;
g = `0x${h[3]}${h[4]}`;
b = `0x${h[5]}${h[6]}`;
}
return `${+r},${+g},${+b}`;
};
export const formatValue = (value) =>
Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD',
maximumSignificantDigits: 3,
notation: 'compact',
}).format(value);
export const formatThousands = (value) =>
Intl.NumberFormat('en-US', {
maximumSignificantDigits: 3,
notation: 'compact',
}).format(value);
export const formatAddressBig = (address) =>
`${address.slice(0, 4)} ${address.slice(4, 8)} ****** ${address.slice(
address.length - 8,
address.length - 4
)} ${address.slice(address.length - 4)}`;
export const encryptAccountData = (data = [], passPhrase = '', pubKey = '') => {
return data
.filter((item) => item.status !== statusMap.blockchained)
.map((item) => {
let value = cryptography.encryptMessageWithPassphrase(
item.seed + ':' + item.value,
passPhrase,
pubKey
);
return {
label: item.key,
value: value.encryptedMessage,
value_nonce: value.nonce,
seed: item.seed,
};
});
};
export const encryptSharedData = (data = [], passPhrase = '', pubKey = '') => {
return data.map((item) => {
let value = cryptography.encryptMessageWithPassphrase(
item.seed + ':' + item.value,
passPhrase,
Buffer.from(pubKey, 'hex')
);
return {
label: item.key,
value: value.encryptedMessage,
value_nonce: value.nonce,
};
});
};
export const hashAccountData = (data = [], oldData = [], hashMap = {}) => {
const accountMap = data.reduce(
(acc, item) => ({
...acc,
[item.label]: item.value,
}),
{}
);
const oldAccountMap = oldData.reduce(
(acc, item) => ({
...acc,
[item.label]: item.value,
}),
{}
);
const removed = oldData.reduce((acc, item) => {
if (
!accountMap[item.label] &&
!data.find((elem) => elem.label === item.label)
)
return [...acc, { label: item.label }];
return acc;
}, []);
const changed = data.reduce((acc, item) => {
if (!oldAccountMap[item.label]) return [...acc, item];
const oldValue = hashMap[item.key];
const newValue = hashValue(item.value, item.seed).toString('hex');
if (oldValue !== newValue && item.status === 'new') return [...acc, item];
return acc;
}, []);
return [
removed,
changed.map((item) => {
const value = hashValue(item.value, item.seed);
return {
label: item.key,
value,
};
}),
];
};
export const jsonReplacer = (key, value) => {
if (key === 'big') {
return value.toString();
}
return value;
};
export const hashValue = (value = '', seed = '') =>
cryptography.hash(
Buffer.concat([Buffer.from(seed, 'utf8'), cryptography.hash(value, 'utf8')])
);
export const generateTransaction = (
nonce = BigInt(0),
senderPublicKey = '',
networkIdentifier = '',
passPhrase = '',
fee = BigInt(500000)
) => {
return {
update: (features) =>
generateSetTransaction(
features,
nonce,
senderPublicKey,
networkIdentifier,
passPhrase,
fee
),
remove: (features) =>
generateRemoveTransaction(
features,
nonce,
senderPublicKey,
networkIdentifier,
passPhrase,
fee
),
validate: (features, recipientAddress) =>
generateValidateTransaction(
features,
nonce,
senderPublicKey,
networkIdentifier,
passPhrase,
fee,
recipientAddress
),
vote: (delegateAddress, amount) =>
generateVoteTransaction(
nonce,
senderPublicKey,
networkIdentifier,
passPhrase,
fee,
delegateAddress,
amount
),
unlock: (delegateAddress, amount, unvoteHeight) =>
generateUnlockTransaction(
nonce,
senderPublicKey,
networkIdentifier,
passPhrase,
fee,
delegateAddress,
amount,
unvoteHeight
),
};
};
export const generateSetTransaction = (
features,
nonce = BigInt(0),
senderPublicKey = '',
networkIdentifier = '',
passPhrase = '',
fee = BigInt(500000)
) => {
const tx = {
moduleID: 1001,
assetID: 1,
nonce,
senderPublicKey,
fee,
asset: {
features,
},
};
if (features.length === 0) return;
const signedTx = transactions.signTransaction(
setFeatureAssetSchema,
tx,
Buffer.from(networkIdentifier, 'hex'),
passPhrase
);
signedTx.senderPublicKey = signedTx.senderPublicKey.toString('hex');
signedTx.signatures[0] = signedTx.signatures[0].toString('hex');
signedTx.asset.features = signedTx.asset.features.map((feature) => ({
...feature,
value: feature.value.toString('hex'),
}));
delete signedTx.id;
return signedTx;
};
export const generateRemoveTransaction = (
features,
nonce = BigInt(0),
senderPublicKey = '',
networkIdentifier = '',
passPhrase = '',
fee = BigInt(500000)
) => {
const tx = {
moduleID: 1001,
assetID: 2,
nonce,
senderPublicKey,
fee,
asset: {
features,
},
};
const signedTx = transactions.signTransaction(
removeFeatureAssetSchema,
tx,
Buffer.from(networkIdentifier, 'hex'),
passPhrase
);
signedTx.senderPublicKey = signedTx.senderPublicKey.toString('hex');
signedTx.signatures[0] = signedTx.signatures[0].toString('hex');
delete signedTx.id;
return signedTx;
};
const generateValidateTransaction = (
features,
nonce = BigInt(0),
senderPublicKey = '',
networkIdentifier = '',
passPhrase = '',
fee = BigInt(500000),
recipientAddress = ''
) => {
const tx = {
moduleID: 1001,
assetID: 11,
nonce,
senderPublicKey: Buffer.from(senderPublicKey, 'hex'),
fee,
asset: {
features,
recipientAddress: Buffer.from(recipientAddress, 'hex'),
},
};
if (features.length === 0) return;
const signedTx = transactions.signTransaction(
validateFeatureAssetSchema,
tx,
Buffer.from(networkIdentifier, 'hex'),
passPhrase
);
signedTx.senderPublicKey = signedTx.senderPublicKey.toString('hex');
signedTx.asset.recipientAddress =
signedTx.asset.recipientAddress.toString('hex');
signedTx.signatures[0] = signedTx.signatures[0].toString('hex');
signedTx.asset.features = signedTx.asset.features.map((feature) => ({
...feature,
value: feature.value.toString('hex'),
}));
delete signedTx.id;
return signedTx;
};
const generateVoteTransaction = (
nonce = BigInt(0),
senderPublicKey = '',
networkIdentifier = '',
passPhrase = '',
fee = BigInt(500000),
delegateAddress = '',
amount = 0n
) => {
const tx = {
moduleID: 5,
assetID: 1,
nonce,
senderPublicKey: Buffer.from(senderPublicKey, 'hex'),
fee,
asset: {
votes: [
{
delegateAddress: Buffer.from(delegateAddress, 'hex'),
amount: amount * 100000000n,
},
],
},
};
const signedTx = transactions.signTransaction(
voteDelegateAssetSchema,
tx,
Buffer.from(networkIdentifier, 'hex'),
passPhrase
);
signedTx.senderPublicKey = signedTx.senderPublicKey.toString('hex');
signedTx.signatures[0] = signedTx.signatures[0].toString('hex');
signedTx.asset.votes = signedTx.asset.votes.map((vote) => ({
...vote,
delegateAddress: vote.delegateAddress.toString('hex'),
}));
delete signedTx.id;
return signedTx;
};
const generateUnlockTransaction = (
nonce = BigInt(0),
senderPublicKey = '',
networkIdentifier = '',
passPhrase = '',
fee = BigInt(500000),
delegateAddress = '',
amount = 0n,
unvoteHeight = 0
) => {
const tx = {
moduleID: 5,
assetID: 2,
nonce,
senderPublicKey: Buffer.from(senderPublicKey, 'hex'),
fee,
asset: {
unlockObjects: [
{
delegateAddress: Buffer.from(delegateAddress, 'hex'),
amount: amount * 100000000n,
unvoteHeight,
},
],
},
};
const signedTx = transactions.signTransaction(
unlockDelegateAssetSchema,
tx,
Buffer.from(networkIdentifier, 'hex'),
passPhrase
);
signedTx.senderPublicKey = signedTx.senderPublicKey.toString('hex');
signedTx.signatures[0] = signedTx.signatures[0].toString('hex');
signedTx.asset.unlockObjects = signedTx.asset.unlockObjects.map((vote) => ({
...vote,
delegateAddress: vote.delegateAddress.toString('hex'),
}));
delete signedTx.id;
return signedTx;
};