Skip to content

Commit

Permalink
refactor: improved query to return sorted utxos
Browse files Browse the repository at this point in the history
  • Loading branch information
AlanVerbner committed Jan 19, 2021
1 parent 8def207 commit fbe6459
Show file tree
Hide file tree
Showing 6 changed files with 32 additions and 36 deletions.
4 changes: 2 additions & 2 deletions cardano-rosetta-server/src/server/db/blockchain-repository.ts
Expand Up @@ -490,8 +490,8 @@ export const configure = (databaseInstance: Pool): BlockchainRepository => ({
value: utxo.value,
transactionHash: hexFormatter(utxo.txHash),
index: utxo.index,
maName: utxo.maName ? hexFormatter(utxo.maName) : utxo.maName,
maPolicy: utxo.maPolicy ? hexFormatter(utxo.maPolicy) : utxo.maPolicy,
name: utxo.name ? hexFormatter(utxo.name) : utxo.name,
policy: utxo.policy ? hexFormatter(utxo.policy) : utxo.policy,
quantity: utxo.quantity
}));
},
Expand Down
28 changes: 13 additions & 15 deletions cardano-rosetta-server/src/server/db/queries/blockchain-queries.ts
Expand Up @@ -228,13 +228,19 @@ export interface FindUtxo {
value: string;
txHash: Buffer;
index: number;
maPolicy: Buffer;
maName: Buffer;
policy: Buffer;
name: Buffer;
quantity: string;
}

const findUtxoFieldsByAddressAndBlock = (selectFields: string): string => `
${selectFields}
const findUtxoByAddressAndBlock = `
SELECT
tx_out.value as value,
tx_out_tx.hash as "txHash",
tx_out.index as index,
ma_tx_out.name as "name",
ma_tx_out.policy as "policy",
ma_tx_out.quantity
FROM tx_out
LEFT JOIN tx_in ON
tx_out.tx_id = tx_in.tx_out_id AND
Expand All @@ -249,19 +255,11 @@ ${selectFields}
ma_tx_out.tx_out_id = tx_out.id
WHERE
tx_out.address = $1 AND
tx_in_tx.id IS NULL
tx_in_tx.id IS NULL
ORDER BY
tx_out_tx.hash, tx_out.index, ma_tx_out.policy, ma_tx_out.name
`;

const selectUtxoDetail = `SELECT
tx_out.value as value,
tx_out_tx.hash as "txHash",
tx_out.index as index,
ma_tx_out.name as "maName",
ma_tx_out.policy as "maPolicy",
ma_tx_out.quantity`;

const findUtxoByAddressAndBlock = findUtxoFieldsByAddressAndBlock(selectUtxoDetail);

const findBalanceByAddressAndBlock = `SELECT (SELECT COALESCE(SUM(r.amount),0)
FROM reward r
JOIN stake_address ON
Expand Down
4 changes: 2 additions & 2 deletions cardano-rosetta-server/src/server/models.ts
Expand Up @@ -44,8 +44,8 @@ export interface Utxo {
value: string;
transactionHash: string;
index: number;
maName: string;
maPolicy: string;
name: string;
policy: string;
quantity: string;
}

Expand Down
16 changes: 7 additions & 9 deletions cardano-rosetta-server/src/server/utils/data-mapper.ts
Expand Up @@ -30,10 +30,10 @@ export const mapAmount = (lovelace: string): Components.Schemas.Amount => ({
export const mapMaAmount = (maUtxo: Utxo): Components.Schemas.Amount => ({
value: maUtxo.quantity,
currency: {
symbol: maUtxo.maName,
symbol: maUtxo.name,
decimals: MULTI_ASSET_DECIMALS,
metadata: {
policy: maUtxo.maPolicy
policy: maUtxo.policy
}
}
});
Expand Down Expand Up @@ -266,7 +266,7 @@ const parseUtxoDetails = (utxoDetails: Utxo[]): Components.Schemas.Coin[] => {
amount: mapAmount(utxoDetail.value),
coin_identifier: coinId
});
if (utxoDetail.maName && utxoDetail.maPolicy) {
if (utxoDetail.name && utxoDetail.policy) {
coinList.push({
amount: mapMaAmount(utxoDetail),
coin_identifier: coinId
Expand All @@ -280,8 +280,8 @@ const calculateTotalMaAmount = (multiAssetsUtxo: Utxo[], maUtxo: Utxo): string =
multiAssetsUtxo
.reduce(
(accum, current) =>
current.maPolicy === maUtxo.maPolicy &&
current.maName === maUtxo.maName &&
current.policy === maUtxo.policy &&
current.name === maUtxo.name &&
current.transactionHash !== maUtxo.transactionHash
? accum + BigInt(current.quantity)
: accum,
Expand All @@ -296,9 +296,7 @@ const calculateTotalMaAmount = (multiAssetsUtxo: Utxo[], maUtxo: Utxo): string =
const convertToMultiAssetBalances = (multiAssetsUtxo: Utxo[]): Components.Schemas.Amount[] => {
const multiAssetsAmounts: Utxo[] = [];
multiAssetsUtxo.forEach(maUtxo => {
if (
!multiAssetsAmounts.some(maAmount => maAmount.maPolicy === maUtxo.maPolicy && maAmount.maName === maUtxo.maName)
) {
if (!multiAssetsAmounts.some(maAmount => maAmount.policy === maUtxo.policy && maAmount.name === maUtxo.name)) {
const totalMaAmount = calculateTotalMaAmount(multiAssetsUtxo, maUtxo);

multiAssetsAmounts.push({
Expand Down Expand Up @@ -332,7 +330,7 @@ export const mapToAccountBalanceResponse = (
return acum + BigInt(current.value);
}, BigInt(0))
.toString();
const multiAssetUtxo = blockBalanceData.utxos.filter(utxo => utxo.maPolicy && utxo.maName);
const multiAssetUtxo = blockBalanceData.utxos.filter(utxo => utxo.policy && utxo.name);
const multiAssetsBalance = convertToMultiAssetBalances(multiAssetUtxo);
return {
block_identifier: {
Expand Down
12 changes: 6 additions & 6 deletions cardano-rosetta-server/src/server/utils/data-mapper.ts.orig
Expand Up @@ -47,10 +47,10 @@ const mapTokenBundleToMetadata = (
export const mapMaAmount = (maUtxo: Utxo): Components.Schemas.Amount => ({
value: maUtxo.quantity.toString(),
currency: {
symbol: maUtxo.maName,
symbol: maUtxo.name,
decimals: 0,
metadata: {
policy: maUtxo.maPolicy
policy: maUtxo.policy
}
}
});
Expand Down Expand Up @@ -263,7 +263,7 @@ const parseUtxoDetails = (utxoDetails: Utxo[]): Components.Schemas.Coin[] => {
amount: mapAmount(utxoDetail.value),
coin_identifier: { identifier: `${utxoDetail.transactionHash}:${utxoDetail.index}` }
});
if (utxoDetail.maName && utxoDetail.maPolicy) {
if (utxoDetail.name && utxoDetail.policy) {
coinList.push({
amount: mapMaAmount(utxoDetail),
coin_identifier: { identifier: `${utxoDetail.transactionHash}:${utxoDetail.index}` }
Expand All @@ -284,8 +284,8 @@ const convertToMultiAssetBalances = (multiAssetsUtxo: Utxo[]): Components.Schema
...maUtxo,
quantity: multiAssetsUtxo.reduce(
(accum, current) =>
current.maPolicy === maUtxo.maPolicy &&
current.maName === maUtxo.maName &&
current.policy === maUtxo.policy &&
current.name === maUtxo.name &&
current.transactionHash !== maUtxo.transactionHash
? accum + current.quantity
: accum,
Expand Down Expand Up @@ -314,7 +314,7 @@ export const mapToAccountBalanceResponse = (
return acum + amountToSum;
}, BigInt(0))
.toString();
const multiAssetUtxo = (blockBalanceData as BlockUtxos).utxos.filter(utxo => utxo.maPolicy && utxo.maName);
const multiAssetUtxo = (blockBalanceData as BlockUtxos).utxos.filter(utxo => utxo.policy && utxo.name);
const multiAssetsBalance = convertToMultiAssetBalances(multiAssetUtxo);
return {
block_identifier: {
Expand Down
4 changes: 2 additions & 2 deletions cardano-rosetta-server/test/unit/utils/data-mapper.test.ts
Expand Up @@ -27,8 +27,8 @@ describe('Data Mapper', () => {
transactionHash: 'c09c523b0a94837dacf08e30f8cc6d5915786b883f822981ea2012551f8699ce',
index: 1,
quantity: '',
maName: '',
maPolicy: ''
name: '',
policy: ''
}
]
};
Expand Down

0 comments on commit fbe6459

Please sign in to comment.