From 8ad35b595653caa15acfdc30f36b28c9388edd28 Mon Sep 17 00:00:00 2001 From: Jack Forgash Date: Wed, 14 Dec 2022 18:02:10 -0700 Subject: [PATCH] streamline ingestion pipeline --- dbt_project.yml | 1 + macros/partition_batch_load.sql | 24 +++ models/bronze/bronze__streamline_blocks.sql | 12 +- models/bronze/bronze__streamline_shards.sql | 13 +- models/core/core__ez_nft_mints.yml | 16 -- models/descriptions/_load_timestamp.md | 5 + .../_partition_by_block_number.md | 5 + .../receipt_execution_outcomes.md | 5 + models/descriptions/shard_id.md | 5 + models/descriptions/shard_number.md | 5 + models/descriptions/state_changes.md | 5 + models/silver/silver__actions_events.yml | 5 - .../silver/silver__actions_events_addkey.yml | 5 - .../silver__actions_events_function_call.yml | 5 - models/silver/silver__blocks.yml | 5 - models/silver/silver__load_blocks.sql | 24 +++ models/silver/silver__load_shards.sql | 30 ++++ models/silver/silver__nft_mints.yml | 6 - models/silver/silver__receipts.yml | 5 - models/silver/silver__streamline_blocks.sql | 76 +++++++++ models/silver/silver__streamline_blocks.yml | 156 ++++++++++++++++++ models/silver/silver__streamline_shards.sql | 34 ++++ models/silver/silver__streamline_shards.yml | 68 ++++++++ .../silver__streamline_transactions.sql | 0 models/silver/silver__transactions.yml | 5 - models/silver/silver__transfers.yml | 5 - ...usn_supply.yaml => silver__usn_supply.yml} | 5 - models/sources.yml | 2 +- 28 files changed, 461 insertions(+), 71 deletions(-) create mode 100644 macros/partition_batch_load.sql create mode 100644 models/descriptions/_load_timestamp.md create mode 100644 models/descriptions/_partition_by_block_number.md create mode 100644 models/descriptions/receipt_execution_outcomes.md create mode 100644 models/descriptions/shard_id.md create mode 100644 models/descriptions/shard_number.md create mode 100644 models/descriptions/state_changes.md create mode 100644 models/silver/silver__load_blocks.sql create mode 100644 models/silver/silver__load_shards.sql create mode 100644 models/silver/silver__streamline_blocks.yml create mode 100644 models/silver/silver__streamline_shards.sql create mode 100644 models/silver/silver__streamline_shards.yml delete mode 100644 models/silver/silver__streamline_transactions.sql rename models/silver/{silver__usn_supply.yaml => silver__usn_supply.yml} (93%) diff --git a/dbt_project.yml b/dbt_project.yml index 7f4493d..2a55d03 100644 --- a/dbt_project.yml +++ b/dbt_project.yml @@ -46,6 +46,7 @@ tests: +severity: warn # default to warn for all tests core: +severity: error # but error if a core view is having issues + +store_failures: true # all tests vars: "dbt_date:time_zone": GMT diff --git a/macros/partition_batch_load.sql b/macros/partition_batch_load.sql new file mode 100644 index 0000000..413e407 --- /dev/null +++ b/macros/partition_batch_load.sql @@ -0,0 +1,24 @@ +{% macro partition_batch_load(batch_size) %} + +{% if is_incremental() %} +WHERE + _partition_by_block_number BETWEEN ( + SELECT + MAX(_partition_by_block_number) + FROM + {{ this }} + ) + AND ( + ( + SELECT + MAX(_partition_by_block_number) + FROM + {{ this }} + ) + {{ batch_size }} + ) +{%- else -%} +WHERE + _partition_by_block_number BETWEEN 9820000 + AND 10000000 +{% endif %} +{%- endmacro %} diff --git a/models/bronze/bronze__streamline_blocks.sql b/models/bronze/bronze__streamline_blocks.sql index 6921e38..0c48f26 100644 --- a/models/bronze/bronze__streamline_blocks.sql +++ b/models/bronze/bronze__streamline_blocks.sql @@ -3,10 +3,14 @@ ) }} SELECT - metadata$filename as filename, - data, - - + metadata$filename AS _filename, + SPLIT( + _filename, + '/' + ) [0] :: NUMBER AS block_id, + CURRENT_TIMESTAMP :: TIMESTAMP_NTZ as _load_timestamp, + VALUE, + _partition_by_block_number FROM {{ source( "streamline_dev", diff --git a/models/bronze/bronze__streamline_shards.sql b/models/bronze/bronze__streamline_shards.sql index 72cae75..31e2af3 100644 --- a/models/bronze/bronze__streamline_shards.sql +++ b/models/bronze/bronze__streamline_shards.sql @@ -3,10 +3,15 @@ ) }} SELECT - metadata$filename as filename, - data, - - + metadata$filename AS _filename, + SPLIT( + _filename, + '/' + ) [0] :: NUMBER AS block_id, + CURRENT_TIMESTAMP :: TIMESTAMP_NTZ AS _load_timestamp, + RIGHT(SPLIT(_filename, '.') [0], 1) :: NUMBER AS _shard_number, + VALUE, + _partition_by_block_number FROM {{ source( "streamline_dev", diff --git a/models/core/core__ez_nft_mints.yml b/models/core/core__ez_nft_mints.yml index b60e97d..17717bb 100644 --- a/models/core/core__ez_nft_mints.yml +++ b/models/core/core__ez_nft_mints.yml @@ -99,19 +99,3 @@ models: column_type_list: - STRING - VARCHAR - - - name: _INGESTED_AT - description: "{{ doc('_ingested_at') }}" - tests: - - not_null - - dbt_expectations.expect_column_values_to_be_in_type_list: - column_type_list: - - TIMESTAMP_NTZ - - - name: _INSERTED_TIMESTAMP - description: "{{ doc('_inserted_timestamp') }}" - tests: - - not_null - - dbt_expectations.expect_column_values_to_be_in_type_list: - column_type_list: - - TIMESTAMP_NTZ \ No newline at end of file diff --git a/models/descriptions/_load_timestamp.md b/models/descriptions/_load_timestamp.md new file mode 100644 index 0000000..c478f7f --- /dev/null +++ b/models/descriptions/_load_timestamp.md @@ -0,0 +1,5 @@ +{% docs _load_timestamp %} + +Timestamp from when the data was loaded into the database. + +{% enddocs %} \ No newline at end of file diff --git a/models/descriptions/_partition_by_block_number.md b/models/descriptions/_partition_by_block_number.md new file mode 100644 index 0000000..daf50e2 --- /dev/null +++ b/models/descriptions/_partition_by_block_number.md @@ -0,0 +1,5 @@ +{% docs _partition_by_block_number %} + +Block number grouping for ingestion partition + +{% enddocs %} \ No newline at end of file diff --git a/models/descriptions/receipt_execution_outcomes.md b/models/descriptions/receipt_execution_outcomes.md new file mode 100644 index 0000000..9b1e946 --- /dev/null +++ b/models/descriptions/receipt_execution_outcomes.md @@ -0,0 +1,5 @@ +{% docs receipt_execution_outcomes %} + +The outcome of the execution of a receipt. This is the result of the execution of the receipt on the shard. It contains the status of the execution, the logs, and the result of the execution. + +{% enddocs %} \ No newline at end of file diff --git a/models/descriptions/shard_id.md b/models/descriptions/shard_id.md new file mode 100644 index 0000000..69867a1 --- /dev/null +++ b/models/descriptions/shard_id.md @@ -0,0 +1,5 @@ +{% docs shard_id %} + +The id for this shard, which is block_id plus shard number + +{% enddocs %} \ No newline at end of file diff --git a/models/descriptions/shard_number.md b/models/descriptions/shard_number.md new file mode 100644 index 0000000..f0f1e0c --- /dev/null +++ b/models/descriptions/shard_number.md @@ -0,0 +1,5 @@ +{% docs shard_number %} + +The numeric identifier for this shard, indexed at 0. + +{% enddocs %} \ No newline at end of file diff --git a/models/descriptions/state_changes.md b/models/descriptions/state_changes.md new file mode 100644 index 0000000..d8e36f7 --- /dev/null +++ b/models/descriptions/state_changes.md @@ -0,0 +1,5 @@ +{% docs state_changes %} + +Account and access key updates to contracts as recorded in the block shard. + +{% enddocs %} \ No newline at end of file diff --git a/models/silver/silver__actions_events.yml b/models/silver/silver__actions_events.yml index 92ecdaa..dae7eb2 100644 --- a/models/silver/silver__actions_events.yml +++ b/models/silver/silver__actions_events.yml @@ -74,11 +74,6 @@ models: - name: _INGESTED_AT description: "{{ doc('_ingested_at')}}" - tests: - - not_null - - dbt_expectations.expect_column_values_to_be_in_type_list: - column_type_list: - - TIMESTAMP_NTZ - name: _INSERTED_TIMESTAMP description: "{{ doc('_inserted_timestamp')}}" diff --git a/models/silver/silver__actions_events_addkey.yml b/models/silver/silver__actions_events_addkey.yml index a85511d..0b2dd83 100644 --- a/models/silver/silver__actions_events_addkey.yml +++ b/models/silver/silver__actions_events_addkey.yml @@ -105,11 +105,6 @@ models: - name: _INGESTED_AT description: "{{ doc('_ingested_at')}}" - tests: - - not_null - - dbt_expectations.expect_column_values_to_be_in_type_list: - column_type_list: - - TIMESTAMP_NTZ - name: _INSERTED_TIMESTAMP description: "{{ doc('_inserted_timestamp')}}" diff --git a/models/silver/silver__actions_events_function_call.yml b/models/silver/silver__actions_events_function_call.yml index e078adb..741ab3d 100644 --- a/models/silver/silver__actions_events_function_call.yml +++ b/models/silver/silver__actions_events_function_call.yml @@ -91,11 +91,6 @@ models: - name: _INGESTED_AT description: "{{ doc('_ingested_at')}}" - tests: - - not_null - - dbt_expectations.expect_column_values_to_be_in_type_list: - column_type_list: - - TIMESTAMP_NTZ - name: _INSERTED_TIMESTAMP description: "{{ doc('_inserted_timestamp')}}" diff --git a/models/silver/silver__blocks.yml b/models/silver/silver__blocks.yml index dfffee7..310f3c3 100644 --- a/models/silver/silver__blocks.yml +++ b/models/silver/silver__blocks.yml @@ -304,11 +304,6 @@ models: - name: _INGESTED_AT description: "{{ doc('_ingested_at')}}" - tests: - - not_null - - dbt_expectations.expect_column_values_to_be_in_type_list: - column_type_list: - - TIMESTAMP_NTZ - name: _INSERTED_TIMESTAMP description: "{{ doc('_inserted_timestamp')}}" diff --git a/models/silver/silver__load_blocks.sql b/models/silver/silver__load_blocks.sql new file mode 100644 index 0000000..cf3ac72 --- /dev/null +++ b/models/silver/silver__load_blocks.sql @@ -0,0 +1,24 @@ +{{ config( + materialized = 'incremental', + incremental_strategy = 'merge', + cluster_by = ['_partition_by_block_number', '_load_timestamp::DATE'], + unique_key = 'block_id', + full_refresh = False +) }} + +WITH blocksjson AS ( + + SELECT + block_id, + VALUE, + _filename, + _load_timestamp, + _partition_by_block_number + FROM + {{ ref('bronze__streamline_blocks') }} + {{ partition_batch_load(500000) }} +) +SELECT + * +FROM + blocksjson diff --git a/models/silver/silver__load_shards.sql b/models/silver/silver__load_shards.sql new file mode 100644 index 0000000..39c11ea --- /dev/null +++ b/models/silver/silver__load_shards.sql @@ -0,0 +1,30 @@ +{{ config( + materialized = 'incremental', + incremental_strategy = 'merge', + cluster_by = ['_partition_by_block_number', '_load_timestamp::DATE'], + unique_key = 'shard_id', + full_refresh = False +) }} + +WITH shardsjson AS ( + + SELECT + block_id, + concat_ws( + '-', + block_id :: STRING, + _shard_number :: STRING + ) AS shard_id, + _shard_number, + VALUE, + _filename, + _load_timestamp, + _partition_by_block_number + FROM + {{ ref('bronze__streamline_shards') }} + {{ partition_batch_load(300000) }} +) +SELECT + * +FROM + shardsjson diff --git a/models/silver/silver__nft_mints.yml b/models/silver/silver__nft_mints.yml index 8979d8b..5824b51 100644 --- a/models/silver/silver__nft_mints.yml +++ b/models/silver/silver__nft_mints.yml @@ -113,9 +113,3 @@ models: - name: _INSERTED_TIMESTAMP description: "{{ doc('_inserted_timestamp') }}" - tests: - - not_null - - dbt_expectations.expect_column_values_to_be_in_type_list: - column_type_list: - - TIMESTAMP_NTZ - diff --git a/models/silver/silver__receipts.yml b/models/silver/silver__receipts.yml index 727e24b..a61f11e 100644 --- a/models/silver/silver__receipts.yml +++ b/models/silver/silver__receipts.yml @@ -131,11 +131,6 @@ models: - name: _INGESTED_AT description: "{{ doc('_ingested_at')}}" - tests: - - not_null - - dbt_expectations.expect_column_values_to_be_in_type_list: - column_type_list: - - TIMESTAMP_NTZ - name: _INSERTED_TIMESTAMP description: "{{ doc('_inserted_timestamp')}}" diff --git a/models/silver/silver__streamline_blocks.sql b/models/silver/silver__streamline_blocks.sql index e69de29..9153490 100644 --- a/models/silver/silver__streamline_blocks.sql +++ b/models/silver/silver__streamline_blocks.sql @@ -0,0 +1,76 @@ +{{ config( + materialized = 'incremental', + incremental_strategy = 'delete+insert', + cluster_by = ['_partition_by_block_number', 'block_timestamp::DATE'], + unique_key = 'block_id', + enabled = true +) }} + +WITH blocksjson AS ( + + SELECT + * + FROM + {{ ref('silver__load_blocks') }} + WHERE + {{ incremental_load_filter('_load_timestamp') }} + qualify ROW_NUMBER() over ( + PARTITION BY block_id + ORDER BY + _load_timestamp DESC + ) = 1 +), +blocks AS ( + SELECT + VALUE :header :height :: NUMBER AS block_id, + TO_TIMESTAMP_NTZ( + VALUE :header :timestamp :: STRING + ) AS block_timestamp, + VALUE :header :hash :: STRING AS block_hash, + VALUE :header :prev_hash :: STRING AS prev_hash, + VALUE :author :: STRING AS block_author, + VALUE :header :gas_price :: NUMBER AS gas_price, + VALUE :header :total_supply :: NUMBER AS total_supply, + VALUE :header :validator_proposals :: ARRAY AS validator_proposals, + VALUE :header :validator_reward :: NUMBER AS validator_reward, + VALUE :header :latest_protocol_version :: NUMBER AS latest_protocol_version, + VALUE :header :epoch_id :: STRING AS epoch_id, + VALUE :header :next_epoch_id :: STRING AS next_epoch_id, + NULL AS tx_count, + -- TODO tx_count not included in the data + [] AS events, + -- events does not exist, Figment created this + VALUE :chunks :: ARRAY AS chunks, + VALUE :header :: OBJECT AS header, + _partition_by_block_number, + _load_timestamp + FROM + blocksjson +), +FINAL AS ( + SELECT + block_id, + block_timestamp, + block_hash, + prev_hash, + block_author, + gas_price, + total_supply, + validator_proposals, + validator_reward, + latest_protocol_version, + epoch_id, + next_epoch_id, + tx_count, + events, + chunks, + header, + _partition_by_block_number, + _load_timestamp + FROM + blocks +) +SELECT + * +FROM + FINAL diff --git a/models/silver/silver__streamline_blocks.yml b/models/silver/silver__streamline_blocks.yml new file mode 100644 index 0000000..be5384c --- /dev/null +++ b/models/silver/silver__streamline_blocks.yml @@ -0,0 +1,156 @@ +version: 2 + +models: + - name: silver__streamline_blocks + description: |- + Parses the blocks JSON files for NEAR. + tests: + - dbt_utils.unique_combination_of_columns: + combination_of_columns: + - block_id + + columns: + - name: BLOCK_ID + description: "{{ doc('block_id')}}" + tests: + - not_null + - dbt_expectations.expect_column_values_to_be_in_type_list: + column_type_list: + - NUMBER + - INTEGER + + - name: BLOCK_TIMESTAMP + description: "{{ doc('block_timestamp')}}" + tests: + - not_null + - dbt_expectations.expect_row_values_to_have_recent_data: + datepart: day + interval: 1 + - dbt_expectations.expect_column_values_to_be_in_type_list: + column_type_list: + - TIMESTAMP_NTZ + + - name: BLOCK_HASH + description: "{{ doc('block_hash')}}" + tests: + - not_null + - dbt_expectations.expect_column_values_to_be_in_type_list: + column_type_list: + - STRING + - VARCHAR + + - name: TX_COUNT + description: "{{ doc('tx_count')}}" + + - name: BLOCK_AUTHOR + description: "{{ doc('block_author')}}" + tests: + - not_null + - dbt_expectations.expect_column_values_to_be_in_type_list: + column_type_list: + - STRING + - VARCHAR + + - name: CHUNKS + description: "{{ doc('chunks')}}" + tests: + - not_null + - dbt_expectations.expect_column_values_to_be_in_type_list: + column_type_list: + - ARRAY + - VARIANT + - OBJECT + + - name: EPOCH_ID + description: "{{ doc('epoch_id')}}" + tests: + - not_null + - dbt_expectations.expect_column_values_to_be_in_type_list: + column_type_list: + - STRING + - VARCHAR + + - name: EVENTS + description: "{{ doc('events')}}" + tests: + - dbt_expectations.expect_column_values_to_be_in_type_list: + column_type_list: + - ARRAY + + - name: GAS_PRICE + description: "{{ doc('gas_price')}}" + tests: + - not_null + - dbt_expectations.expect_column_values_to_be_in_type_list: + column_type_list: + - NUMBER + - FLOAT + + - name: LATEST_PROTOCOL_VERSION + description: "{{ doc('latest_protocol_version')}}" + tests: + - not_null + - dbt_expectations.expect_column_values_to_be_in_type_list: + column_type_list: + - NUMBER + - FLOAT + + - name: NEXT_EPOCH_ID + description: "{{ doc('next_epoch_id')}}" + tests: + - not_null + - dbt_expectations.expect_column_values_to_be_in_type_list: + column_type_list: + - STRING + - VARCHAR + + - name: PREV_HASH + description: "{{ doc('prev_hash')}}" + tests: + - not_null + - dbt_expectations.expect_column_values_to_be_in_type_list: + column_type_list: + - STRING + - VARCHAR + + - name: TOTAL_SUPPLY + description: "{{ doc('total_supply')}}" + tests: + - not_null + - dbt_expectations.expect_column_values_to_be_in_type_list: + column_type_list: + - NUMBER + - FLOAT + + - name: VALIDATOR_PROPOSALS + description: "{{ doc('validator_proposals')}}" + tests: + - not_null + - dbt_expectations.expect_column_values_to_be_in_type_list: + column_type_list: + - ARRAY + - VARIANT + - OBJECT + + - name: VALIDATOR_REWARD + description: "{{ doc('validator_reward')}}" + tests: + - not_null + - dbt_expectations.expect_column_values_to_be_in_type_list: + column_type_list: + - NUMBER + - FLOAT + + - name: _partition_by_block_number + description: "{{ doc('_partition_by_block_number')}}" + + - name: _load_timestamp + description: "{{ doc('_load_timestamp')}}" + tests: + - not_null + - dbt_expectations.expect_column_values_to_be_in_type_list: + column_type_list: + - TIMESTAMP_NTZ + - dbt_expectations.expect_row_values_to_have_recent_data: + datepart: day + interval: 1 diff --git a/models/silver/silver__streamline_shards.sql b/models/silver/silver__streamline_shards.sql new file mode 100644 index 0000000..ffce9c4 --- /dev/null +++ b/models/silver/silver__streamline_shards.sql @@ -0,0 +1,34 @@ +{{ config( + materialized = 'incremental', + incremental_strategy = 'delete+insert', + cluster_by = ['_partition_by_block_number'], + unique_key = ['shard_id'], + enabled = true +) }} + +WITH shardsjson AS ( + + SELECT + * + FROM + {{ ref('silver__load_shards') }} + WHERE + {{ incremental_load_filter('_load_timestamp') }} +), +shards AS ( + SELECT + block_id, + shard_id, + VALUE :chunk :: VARIANT AS chunk, + VALUE :receipt_execution_outcomes :: VARIANT AS receipt_execution_outcomes, + VALUE :shard_id :: NUMBER AS shard_number, + VALUE :state_changes :: VARIANT AS state_changes, + _partition_by_block_number, + _load_timestamp + FROM + shardsjson +) +SELECT + * +FROM + shards diff --git a/models/silver/silver__streamline_shards.yml b/models/silver/silver__streamline_shards.yml new file mode 100644 index 0000000..11dcebe --- /dev/null +++ b/models/silver/silver__streamline_shards.yml @@ -0,0 +1,68 @@ +version: 2 + +models: + - name: silver__streamline_shards + description: |- + Parses the shards JSON files for NEAR. + tests: + - dbt_utils.unique_combination_of_columns: + combination_of_columns: + - shard_id + + columns: + - name: BLOCK_ID + description: "{{ doc('block_id')}}" + tests: + - not_null + - dbt_expectations.expect_column_values_to_be_in_type_list: + column_type_list: + - NUMBER + - INTEGER + + - name: SHARD_ID + description: "{{ doc('shard_id')}}" + tests: + - not_null + + - name: CHUNK + description: "{{ doc('chunks')}}" + tests: + - dbt_expectations.expect_column_values_to_be_in_type_list: + column_type_list: + - VARIANT + - OBJECT + + - name: RECEIPT_EXECUTION_OUTCOMES + description: "{{ doc('receipt_execution_outcomes')}}" + + - name: SHARD_NUMBER + description: "{{ doc('shard_number')}}" + tests: + - not_null + - dbt_expectations.expect_column_values_to_be_in_type_list: + column_type_list: + - NUMBER + - INTEGER + + - name: STATE_CHANGES + description: "{{ doc('state_changes')}}" + tests: + - not_null + - dbt_expectations.expect_column_values_to_be_in_type_list: + column_type_list: + - ARRAY + - VARIANT + + - name: _PARTITION_BY_BLOCK_NUMBER + description: "{{ doc('_partition_by_block_number')}}" + + - name: _load_timestamp + description: "{{ doc('_load_timestamp')}}" + tests: + - not_null + - dbt_expectations.expect_column_values_to_be_in_type_list: + column_type_list: + - TIMESTAMP_NTZ + - dbt_expectations.expect_row_values_to_have_recent_data: + datepart: day + interval: 1 diff --git a/models/silver/silver__streamline_transactions.sql b/models/silver/silver__streamline_transactions.sql deleted file mode 100644 index e69de29..0000000 diff --git a/models/silver/silver__transactions.yml b/models/silver/silver__transactions.yml index 2363ec4..e8d15d5 100644 --- a/models/silver/silver__transactions.yml +++ b/models/silver/silver__transactions.yml @@ -125,11 +125,6 @@ models: - name: _INGESTED_AT description: "{{ doc('_ingested_at')}}" - tests: - - not_null - - dbt_expectations.expect_column_values_to_be_in_type_list: - column_type_list: - - TIMESTAMP_NTZ - name: _INSERTED_TIMESTAMP description: "{{ doc('_inserted_timestamp')}}" diff --git a/models/silver/silver__transfers.yml b/models/silver/silver__transfers.yml index 8910016..baadc9f 100644 --- a/models/silver/silver__transfers.yml +++ b/models/silver/silver__transfers.yml @@ -109,11 +109,6 @@ models: - name: _INGESTED_AT description: "{{ doc('_ingested_at')}}" - tests: - - not_null - - dbt_expectations.expect_column_values_to_be_in_type_list: - column_type_list: - - TIMESTAMP_NTZ - name: _INSERTED_TIMESTAMP description: "{{ doc('_inserted_timestamp')}}" diff --git a/models/silver/silver__usn_supply.yaml b/models/silver/silver__usn_supply.yml similarity index 93% rename from models/silver/silver__usn_supply.yaml rename to models/silver/silver__usn_supply.yml index 99ced8e..9495a70 100644 --- a/models/silver/silver__usn_supply.yaml +++ b/models/silver/silver__usn_supply.yml @@ -78,11 +78,6 @@ models: - name: _INGESTED_AT description: "{{ doc('_ingested_at')}}" - tests: - - not_null - - dbt_expectations.expect_column_values_to_be_in_type_list: - column_type_list: - - TIMESTAMP_NTZ - name: _INSERTED_TIMESTAMP description: "{{ doc('_inserted_timestamp')}}" diff --git a/models/sources.yml b/models/sources.yml index 7e894a3..5728388 100644 --- a/models/sources.yml +++ b/models/sources.yml @@ -68,4 +68,4 @@ sources: schema: near_dev tables: - name: blocks - - name: shards \ No newline at end of file + - name: shards