408 lines
9.1 KiB
JavaScript
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;
|
|
};
|