Skip to content

Commit

Permalink
refactor!: rm TxAlonzo.implicitCoin
Browse files Browse the repository at this point in the history
Keeping Cardano.TxAlonzo close to underlying model is important.
`implicitCoin` is not directly available on the tx, so it shouldn't be
part of this model. Instead, it's just an SDK util.
  • Loading branch information
mkazlauskas committed Aug 8, 2022
1 parent 9b3e26c commit 7a1dc08
Show file tree
Hide file tree
Showing 18 changed files with 50 additions and 312 deletions.
30 changes: 4 additions & 26 deletions packages/blockfrost/src/blockfrostChainHistoryProvider.ts
@@ -1,12 +1,6 @@
import { BlockFrostAPI, Responses } from '@blockfrost/blockfrost-js';
import { BlockfrostToCore, BlockfrostTransactionContent } from './BlockfrostToCore';
import {
Cardano,
ChainHistoryProvider,
ProtocolParametersRequiredByWallet,
ProviderError,
ProviderFailure
} from '@cardano-sdk/core';
import { Cardano, ChainHistoryProvider, ProviderError, ProviderFailure } from '@cardano-sdk/core';
import { Logger } from 'ts-log';
import { blockfrostMetadataToTxMetadata, fetchByAddressSequentially, formatBlockfrostError, healthCheck } from './util';
import omit from 'lodash/omit';
Expand Down Expand Up @@ -169,10 +163,7 @@ export const blockfrostChainHistoryProvider = (blockfrost: BlockFrostAPI, logger
// eslint-disable-next-line unicorn/consistent-function-scoping
const parseValidityInterval = (num: string | null) => Number.parseInt(num || '') || undefined;

const fetchTransaction = async (
hash: Cardano.TransactionId,
protocolParameters: ProtocolParametersRequiredByWallet
): Promise<Cardano.TxAlonzo> => {
const fetchTransaction = async (hash: Cardano.TransactionId): Promise<Cardano.TxAlonzo> => {
const { inputs, outputs, collaterals } = BlockfrostToCore.transactionUtxos(
await blockfrost.txsUtxos(hash.toString())
);
Expand Down Expand Up @@ -205,7 +196,6 @@ export const blockfrostChainHistoryProvider = (blockfrost: BlockFrostAPI, logger
withdrawals
},
id: hash,
implicitCoin: Cardano.util.computeImplicitCoin(protocolParameters, { certificates, withdrawals }),
index: response.index,
txSize: response.size,
witness: {
Expand All @@ -215,16 +205,6 @@ export const blockfrostChainHistoryProvider = (blockfrost: BlockFrostAPI, logger
};
};

// TODO: move `currentWalletProtocolParameters` from WalletProvider to NetworkInfoProvider
// and add NetworkInfoProvider dependency to this provider
const currentWalletProtocolParameters = async (): Promise<ProtocolParametersRequiredByWallet> => {
const response = await blockfrost.axiosInstance({
url: `${blockfrost.apiUrl}/epochs/latest/parameters`
});

return BlockfrostToCore.currentWalletProtocolParameters(response.data);
};

const blocksByHashes: ChainHistoryProvider['blocksByHashes'] = async (hashes) => {
const responses = await Promise.all(hashes.map((hash) => blockfrost.blocks(hash.toString())));
return responses.map((response) => {
Expand Down Expand Up @@ -253,10 +233,8 @@ export const blockfrostChainHistoryProvider = (blockfrost: BlockFrostAPI, logger
});
};

const transactionsByHashes: ChainHistoryProvider['transactionsByHashes'] = async (hashes) => {
const protocolParameters = await currentWalletProtocolParameters();
return Promise.all(hashes.map((hash) => fetchTransaction(hash, protocolParameters)));
};
const transactionsByHashes: ChainHistoryProvider['transactionsByHashes'] = async (hashes) =>
Promise.all(hashes.map((hash) => fetchTransaction(hash)));

const transactionsByAddresses: ChainHistoryProvider['transactionsByAddresses'] = async ({
addresses,
Expand Down
12 changes: 1 addition & 11 deletions packages/blockfrost/test/blockfrostChainHistoryProvider.test.ts
Expand Up @@ -79,13 +79,7 @@ describe('blockfrostChainHistoryProvider', () => {
}
]
};
const protocolParametersResponse = {
data: {
key_deposit: '2000000',
pool_deposit: '500000000'
}
};
BlockFrostAPI.prototype.axiosInstance = jest.fn().mockResolvedValue(protocolParametersResponse) as any;

BlockFrostAPI.prototype.txsUtxos = jest.fn().mockResolvedValue(txsUtxosResponse);

it('without extra tx properties', async () => {
Expand Down Expand Up @@ -221,10 +215,6 @@ describe('blockfrostChainHistoryProvider', () => {
}
},
id: Cardano.TransactionId('4123d70f66414cc921f6ffc29a899aafc7137a99a0fd453d6b200863ef5702d6'),
implicitCoin: {
deposit: 0n,
input: 0n
},
index: 1,
txSize: 433
} as Cardano.TxAlonzo);
Expand Down
@@ -1,13 +1,12 @@
import * as Queries from './queries';
import { Cardano, ProtocolParametersRequiredByWallet, ProviderError, ProviderFailure } from '@cardano-sdk/core';
import { Cardano } from '@cardano-sdk/core';
import {
CertificateModel,
DelegationCertModel,
MirCertModel,
MultiAssetModel,
PoolRegisterCertModel,
PoolRetireCertModel,
ProtocolParamsModel,
RedeemerModel,
StakeCertModel,
TransactionDataMap,
Expand All @@ -25,7 +24,6 @@ import { Pool, QueryResult } from 'pg';
import { hexStringToBuffer } from '../../util';
import {
mapCertificate,
mapProtocolParams,
mapRedeemer,
mapTxIn,
mapTxOut,
Expand Down Expand Up @@ -158,13 +156,4 @@ export class ChainHistoryBuilder {
}
return certsMap;
}

public async queryProtocolParams(): Promise<ProtocolParametersRequiredByWallet> {
this.#logger.debug('About to find protocol parameters');
const results: QueryResult<ProtocolParamsModel> = await this.#db.query(Queries.findProtocolParameters);
if (results.rows.length === 0) {
throw new ProviderError(ProviderFailure.Unknown, null, "Couldn't fetch protocol parameters");
}
return mapProtocolParams(results.rows[0]);
}
}
Expand Up @@ -51,18 +51,16 @@ export class DbSyncChainHistoryProvider extends DbSyncProvider implements ChainH
this.#logger.debug('About to find transactions with hashes:', byteHashes);
const txResults: QueryResult<TxModel> = await this.db.query(Queries.findTransactionsByHashes, [byteHashes]);
if (txResults.rows.length === 0) return [];
const [inputs, outputs, mints, withdrawals, redeemers, metadata, collaterals, certificates, protocolParams] =
await Promise.all([
this.#builder.queryTransactionInputsByHashes(hashes),
this.#builder.queryTransactionOutputsByHashes(hashes),
this.#builder.queryTxMintByHashes(hashes),
this.#builder.queryWithdrawalsByHashes(hashes),
this.#builder.queryRedeemersByHashes(hashes),
this.#metadataService.queryTxMetadataByHashes(hashes),
this.#builder.queryTransactionInputsByHashes(hashes, true),
this.#builder.queryCertificatesByHashes(hashes),
this.#builder.queryProtocolParams()
]);
const [inputs, outputs, mints, withdrawals, redeemers, metadata, collaterals, certificates] = await Promise.all([
this.#builder.queryTransactionInputsByHashes(hashes),
this.#builder.queryTransactionOutputsByHashes(hashes),
this.#builder.queryTxMintByHashes(hashes),
this.#builder.queryWithdrawalsByHashes(hashes),
this.#builder.queryRedeemersByHashes(hashes),
this.#metadataService.queryTxMetadataByHashes(hashes),
this.#builder.queryTransactionInputsByHashes(hashes, true),
this.#builder.queryCertificatesByHashes(hashes)
]);
return txResults.rows.map((tx) => {
const txId = Cardano.TransactionId(tx.id.toString('hex'));
const txInputs = orderBy(
Expand All @@ -84,7 +82,6 @@ export class DbSyncChainHistoryProvider extends DbSyncProvider implements ChainH
metadata: metadata.get(txId),
mint: mints.get(txId),
outputs: txOutputs,
protocolParams,
redeemers: redeemers.get(txId),
withdrawals: withdrawals.get(txId)
});
Expand Down
@@ -1,11 +1,10 @@
import { Asset, Cardano, ProtocolParametersRequiredByWallet } from '@cardano-sdk/core';
import { Asset, Cardano } from '@cardano-sdk/core';
import { BigIntMath } from '@cardano-sdk/util';
import {
BlockModel,
BlockOutputModel,
CertificateModel,
MultiAssetModel,
ProtocolParamsModel,
RedeemerModel,
TipModel,
TxInOutModel,
Expand Down Expand Up @@ -137,26 +136,9 @@ export const mapCertificate = (
return null;
};

export const mapProtocolParams = (protocolParamsModel: ProtocolParamsModel): ProtocolParametersRequiredByWallet => ({
coinsPerUtxoByte: Number(protocolParamsModel.coin_per_utxo_size),
maxCollateralInputs: protocolParamsModel.max_collateral_inputs,
maxTxSize: protocolParamsModel.max_tx_size,
maxValueSize: Number(protocolParamsModel.max_val_size),
minFeeCoefficient: protocolParamsModel.min_fee_coefficient,
minFeeConstant: protocolParamsModel.min_fee_constant,
minPoolCost: Number(protocolParamsModel.min_pool_cost),
poolDeposit: Number(protocolParamsModel.pool_deposit),
protocolVersion: {
major: protocolParamsModel.protocol_major,
minor: protocolParamsModel.protocol_minor
},
stakeKeyDeposit: Number(protocolParamsModel.key_deposit)
});

interface TxAlonzoData {
inputs: Cardano.TxIn[];
outputs: Cardano.TxOut[];
protocolParams: ProtocolParametersRequiredByWallet;
mint?: Cardano.TokenMap;
withdrawals?: Cardano.Withdrawal[];
redeemers?: Cardano.Redeemer[];
Expand All @@ -167,7 +149,7 @@ interface TxAlonzoData {

export const mapTxAlonzo = (
txModel: TxModel,
{ inputs, outputs, mint, withdrawals, redeemers, metadata, collaterals, certificates, protocolParams }: TxAlonzoData
{ inputs, outputs, mint, withdrawals, redeemers, metadata, collaterals, certificates }: TxAlonzoData
): Cardano.TxAlonzo => ({
auxiliaryData:
metadata && metadata.size > 0
Expand Down Expand Up @@ -196,10 +178,6 @@ export const mapTxAlonzo = (
withdrawals
},
id: Cardano.TransactionId(txModel.id.toString('hex')),
implicitCoin: Cardano.util.computeImplicitCoin(protocolParams, {
certificates,
withdrawals
}),
index: txModel.index,
txSize: txModel.size,
witness: {
Expand Down
Expand Up @@ -60,23 +60,6 @@ export const findTip = `
ORDER BY block.block_no DESC NULLS LAST
LIMIT 1`;

export const findProtocolParameters = `
SELECT
coins_per_utxo_size,
max_collateral_inputs,
max_tx_size,
max_val_size,
min_fee_a AS min_fee_coefficient,
min_fee_b AS min_fee_constant,
min_pool_cost,
pool_deposit,
protocol_major,
protocol_minor,
key_deposit
FROM epoch_param
ORDER BY epoch_no DESC
LIMIT 1`;

export const findBlocksByHashes = `
SELECT
block.hash AS hash,
Expand Down
Expand Up @@ -116,17 +116,3 @@ export interface DelegationCertModel extends CertificateModel {
address: string;
pool_id: string;
}

export interface ProtocolParamsModel {
coin_per_utxo_size: string;
max_collateral_inputs: number;
max_tx_size: number;
max_val_size: string;
min_fee_coefficient: number;
min_fee_constant: number;
min_pool_cost: string;
pool_deposit: string;
protocol_major: number;
protocol_minor: number;
key_deposit: string;
}
Expand Up @@ -163,13 +163,6 @@ describe('ChainHistoryBuilder', () => {
});
});

describe('queryProtocolParams', () => {
test('query protocol parameters from last epoch', async () => {
const result = await builder.queryProtocolParams();
expect(result).toMatchSnapshot();
});
});

describe('queryCertificatesByHashes', () => {
test('query certificates by tx hashes', async () => {
const result = await builder.queryCertificatesByHashes([
Expand Down
Expand Up @@ -97,24 +97,6 @@ Map {
}
`;

exports[`ChainHistoryBuilder queryProtocolParams query protocol parameters from last epoch 1`] = `
Object {
"coinsPerUtxoByte": NaN,
"maxCollateralInputs": 3,
"maxTxSize": 16384,
"maxValueSize": 5000,
"minFeeCoefficient": 44,
"minFeeConstant": 155381,
"minPoolCost": 340000000,
"poolDeposit": 500000000,
"protocolVersion": Object {
"major": 6,
"minor": 0,
},
"stakeKeyDeposit": 2000000,
}
`;

exports[`ChainHistoryBuilder queryRedeemersByHashes query transaction redeemers by tx hashes 1`] = `
Map {
"5acd6efb1b66299f1c5a2c4221af4bcaa4ba9929e8e6aa0e3f48707fa1796fc3" => Array [
Expand Down

0 comments on commit 7a1dc08

Please sign in to comment.