Skip to content

Commit

Permalink
Merge pull request #57 from hirosystems/beta
Browse files Browse the repository at this point in the history
merge beta into develop
  • Loading branch information
rafaelcr committed May 8, 2023
2 parents b07c850 + 23c7d79 commit e50931c
Show file tree
Hide file tree
Showing 27 changed files with 2,149 additions and 1,625 deletions.
5 changes: 5 additions & 0 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,11 @@
"console": "integratedTerminal",
"preLaunchTask": "npm: testenv:run",
"postDebugTask": "npm: testenv:stop",
"env": {
"PGHOST": "localhost",
"PGUSER": "postgres",
"PGPASSWORD": "postgres",
},
},
]
}
23 changes: 12 additions & 11 deletions .vscode/tasks.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,19 @@
"type": "shell",
"command": "npm run testenv:run -- -d",
"isBackground": true,
"problemMatcher": [
{
"pattern": [
{ "regexp": ".", "file": 1, "location": 2, "message": 3 }
],
"background": {
"activeOnStart": true,
"beginsPattern": ".",
"endsPattern": "."
}
"problemMatcher": {
"pattern": {
"regexp": ".",
"file": 1,
"location": 2,
"message": 3
},
"background": {
"activeOnStart": true,
"beginsPattern": ".",
"endsPattern": "."
}
]
}
},
{
"label": "npm: testenv:stop",
Expand Down
28 changes: 28 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,31 @@
## [0.1.0-beta.13](https://github.com/hirosystems/ordinals-api/compare/v0.1.0-beta.12...v0.1.0-beta.13) (2023-05-05)


### Bug Fixes

* use bignumber.js for sat percentiles ([8914e27](https://github.com/hirosystems/ordinals-api/commit/8914e27d4215470f9bea9a1f1e5339ffe38c31d0))

## [0.1.0-beta.12](https://github.com/hirosystems/ordinals-api/compare/v0.1.0-beta.11...v0.1.0-beta.12) (2023-05-05)


### Bug Fixes

* cache inscription counts for mime_type and sat_rarity ([#55](https://github.com/hirosystems/ordinals-api/issues/55)) ([f4fb4c7](https://github.com/hirosystems/ordinals-api/commit/f4fb4c75d8191b71c4d09443f698ec36491841dc))

## [0.1.0-beta.11](https://github.com/hirosystems/ordinals-api/compare/v0.1.0-beta.10...v0.1.0-beta.11) (2023-05-02)


### Bug Fixes

* expand int column sizes ([0e425ff](https://github.com/hirosystems/ordinals-api/commit/0e425ff42aa0f58c0203f4483acb1114f0e604e5))

## [0.1.0-beta.10](https://github.com/hirosystems/ordinals-api/compare/v0.1.0-beta.9...v0.1.0-beta.10) (2023-04-30)


### Bug Fixes

* use pre-calculated inscription count for unfiltered results ([#48](https://github.com/hirosystems/ordinals-api/issues/48)) ([3e7a4f4](https://github.com/hirosystems/ordinals-api/commit/3e7a4f41b0429a26cca1c1af544fff90ed8a3c33))

## [0.1.0-beta.9](https://github.com/hirosystems/ordinals-api/compare/v0.1.0-beta.8...v0.1.0-beta.9) (2023-04-24)


Expand Down
14 changes: 14 additions & 0 deletions migrations/1682654536767_chain-tip-inscription-count.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
/* eslint-disable @typescript-eslint/naming-convention */
import { MigrationBuilder, ColumnDefinitions } from 'node-pg-migrate';

export const shorthands: ColumnDefinitions | undefined = undefined;

export function up(pgm: MigrationBuilder): void {
pgm.addColumn('chain_tip', {
inscription_count: {
type: 'int',
notNull: true,
default: 0,
},
});
}
32 changes: 32 additions & 0 deletions migrations/1683042840697_expand-int-sizes.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
/* eslint-disable @typescript-eslint/naming-convention */
import { MigrationBuilder, ColumnDefinitions } from 'node-pg-migrate';

export const shorthands: ColumnDefinitions | undefined = undefined;

export function up(pgm: MigrationBuilder): void {
pgm.alterColumn('inscriptions', 'id', { type: 'bigint' });
pgm.alterColumn('inscriptions', 'number', { type: 'bigint' });
pgm.alterColumn('inscriptions', 'content_length', { type: 'bigint' });

pgm.alterColumn('locations', 'id', { type: 'bigint' });
pgm.alterColumn('locations', 'inscription_id', { type: 'bigint' });
pgm.alterColumn('locations', 'block_height', { type: 'bigint' });
pgm.alterColumn('locations', 'sat_coinbase_height', { type: 'bigint' });

pgm.alterColumn('json_contents', 'id', { type: 'bigint' });
pgm.alterColumn('json_contents', 'inscription_id', { type: 'bigint' });
}

export function down(pgm: MigrationBuilder): void {
pgm.alterColumn('inscriptions', 'id', { type: 'int' });
pgm.alterColumn('inscriptions', 'number', { type: 'int' });
pgm.alterColumn('inscriptions', 'content_length', { type: 'int' });

pgm.alterColumn('locations', 'id', { type: 'int' });
pgm.alterColumn('locations', 'inscription_id', { type: 'int' });
pgm.alterColumn('locations', 'block_height', { type: 'int' });
pgm.alterColumn('locations', 'sat_coinbase_height', { type: 'int' });

pgm.alterColumn('json_contents', 'id', { type: 'int' });
pgm.alterColumn('json_contents', 'inscription_id', { type: 'int' });
}
12 changes: 12 additions & 0 deletions migrations/1683047918926_mime-type-counts.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
/* eslint-disable @typescript-eslint/naming-convention */
import { MigrationBuilder, ColumnDefinitions } from 'node-pg-migrate';

export const shorthands: ColumnDefinitions | undefined = undefined;

export function up(pgm: MigrationBuilder): void {
pgm.createMaterializedView(
'mime_type_counts',
{ data: true },
`SELECT mime_type, COUNT(*) AS count FROM inscriptions GROUP BY mime_type`
);
}
18 changes: 18 additions & 0 deletions migrations/1683061444855_sat-rarity-counts.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
/* eslint-disable @typescript-eslint/naming-convention */
import { MigrationBuilder, ColumnDefinitions } from 'node-pg-migrate';

export const shorthands: ColumnDefinitions | undefined = undefined;

export function up(pgm: MigrationBuilder): void {
pgm.createMaterializedView(
'sat_rarity_counts',
{ data: true },
`
SELECT sat_rarity, COUNT(*) AS count
FROM inscriptions AS i
INNER JOIN locations AS loc ON loc.inscription_id = i.id
WHERE loc.current = TRUE
GROUP BY sat_rarity
`
);
}
12 changes: 12 additions & 0 deletions migrations/1683130423352_inscription-count.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
/* eslint-disable @typescript-eslint/naming-convention */
import { MigrationBuilder, ColumnDefinitions } from 'node-pg-migrate';

export const shorthands: ColumnDefinitions | undefined = undefined;

export function up(pgm: MigrationBuilder): void {
pgm.createMaterializedView(
'inscription_count',
{ data: true },
`SELECT COUNT(*) AS count FROM inscriptions`
);
}
38 changes: 38 additions & 0 deletions migrations/1683130430977_chain-tip-view.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
/* eslint-disable @typescript-eslint/naming-convention */
import { MigrationBuilder, ColumnDefinitions } from 'node-pg-migrate';

export const shorthands: ColumnDefinitions | undefined = undefined;

export function up(pgm: MigrationBuilder): void {
pgm.dropTable('chain_tip');
pgm.createMaterializedView(
'chain_tip',
{ data: true },
`SELECT GREATEST(MAX(block_height), 767430) AS block_height FROM locations`
);
}

export function down(pgm: MigrationBuilder): void {
pgm.dropMaterializedView('chain_tip');
pgm.createTable('chain_tip', {
id: {
type: 'bool',
primaryKey: true,
default: true,
},
block_height: {
type: 'int',
notNull: true,
default: 767430, // First inscription block height
},
inscription_count: {
type: 'int',
notNull: true,
default: 0,
},
});
// Ensure only a single row can exist
pgm.addConstraint('chain_tip', 'chain_tip_one_row', 'CHECK(id)');
// Create the single row
pgm.sql('INSERT INTO chain_tip VALUES(DEFAULT)');
}
28 changes: 21 additions & 7 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -51,13 +51,14 @@
"@fastify/type-provider-typebox": "^2.1.0",
"@sinclair/typebox": "^0.24.20",
"@types/node": "^18.13.0",
"bignumber.js": "^9.1.1",
"bitcoinjs-lib": "^6.1.0",
"env-schema": "^5.2.0",
"fastify": "^4.3.0",
"fastify-metrics": "^10.2.0",
"node-pg-migrate": "^6.2.2",
"pino": "^8.10.0",
"postgres": "^3.3.3",
"postgres": "^3.3.4",
"undici": "^5.8.0"
}
}
60 changes: 31 additions & 29 deletions src/api/routes/inscriptions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ import {
} from '../util/helpers';

function blockParam(param: string | undefined, name: string) {
const out: { [k: string]: string } = {};
const out: Record<string, string> = {};
if (BlockHashParamCType.Check(param)) {
out[`${name}_hash`] = param;
} else if (BlockHeightParamCType.Check(param)) {
Expand Down Expand Up @@ -108,29 +108,32 @@ const IndexRoutes: FastifyPluginCallback<Record<never, never>, Server, TypeBoxTy
async (request, reply) => {
const limit = request.query.limit ?? DEFAULT_API_LIMIT;
const offset = request.query.offset ?? 0;
const inscriptions = await fastify.db.getInscriptions({
...blockParam(request.query.genesis_block, 'genesis_block'),
...blockParam(request.query.from_genesis_block_height, 'from_genesis_block'),
...blockParam(request.query.to_genesis_block_height, 'to_genesis_block'),
...blockParam(request.query.from_sat_coinbase_height, 'from_sat_coinbase'),
...blockParam(request.query.to_sat_coinbase_height, 'to_sat_coinbase'),
from_genesis_timestamp: request.query.from_genesis_timestamp,
to_genesis_timestamp: request.query.to_genesis_timestamp,
from_sat_ordinal: bigIntParam(request.query.from_sat_ordinal),
to_sat_ordinal: bigIntParam(request.query.to_sat_ordinal),
from_number: request.query.from_number,
to_number: request.query.to_number,
genesis_id: request.query.id,
number: request.query.number,
output: request.query.output,
address: request.query.address,
mime_type: request.query.mime_type,
sat_rarity: request.query.rarity,
order_by: request.query.order_by ?? OrderBy.genesis_block_height,
order: request.query.order ?? Order.desc,
limit,
offset,
});
const inscriptions = await fastify.db.getInscriptions(
{ limit, offset },
{
...blockParam(request.query.genesis_block, 'genesis_block'),
...blockParam(request.query.from_genesis_block_height, 'from_genesis_block'),
...blockParam(request.query.to_genesis_block_height, 'to_genesis_block'),
...blockParam(request.query.from_sat_coinbase_height, 'from_sat_coinbase'),
...blockParam(request.query.to_sat_coinbase_height, 'to_sat_coinbase'),
from_genesis_timestamp: request.query.from_genesis_timestamp,
to_genesis_timestamp: request.query.to_genesis_timestamp,
from_sat_ordinal: bigIntParam(request.query.from_sat_ordinal),
to_sat_ordinal: bigIntParam(request.query.to_sat_ordinal),
from_number: request.query.from_number,
to_number: request.query.to_number,
genesis_id: request.query.id,
number: request.query.number,
output: request.query.output,
address: request.query.address,
mime_type: request.query.mime_type,
sat_rarity: request.query.rarity,
},
{
order_by: request.query.order_by ?? OrderBy.genesis_block_height,
order: request.query.order ?? Order.desc,
}
);
await reply.send({
limit,
offset,
Expand Down Expand Up @@ -166,11 +169,10 @@ const ShowRoutes: FastifyPluginCallback<Record<never, never>, Server, TypeBoxTyp
},
},
async (request, reply) => {
const inscription = await fastify.db.getInscriptions({
...inscriptionIdArrayParam(request.params.id),
limit: 1,
offset: 0,
});
const inscription = await fastify.db.getInscriptions(
{ limit: 1, offset: 0 },
{ ...inscriptionIdArrayParam(request.params.id) }
);
if (inscription.total > 0) {
await reply.send(parseDbInscription(inscription.results[0]));
} else {
Expand Down
9 changes: 4 additions & 5 deletions src/api/routes/sats.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,10 @@ export const SatRoutes: FastifyPluginCallback<Record<never, never>, Server, Type
},
async (request, reply) => {
const sat = new OrdinalSatoshi(request.params.ordinal);
const inscriptions = await fastify.db.getInscriptions({
sat_ordinal: BigInt(request.params.ordinal),
limit: 1,
offset: 0,
});
const inscriptions = await fastify.db.getInscriptions(
{ limit: 1, offset: 0 },
{ sat_ordinal: BigInt(request.params.ordinal) }
);
await reply.send({
coinbase_height: sat.blockHeight,
cycle: sat.cycle,
Expand Down
Loading

0 comments on commit e50931c

Please sign in to comment.