Git Product home page Git Product logo

metaplex-foundation / digital-asset-rpc-infrastructure Goto Github PK

View Code? Open in Web Editor NEW
59.0 13.0 30.0 2.69 MB

Reference implementation for Metaplex Digital Asset Standard API

Home Page: https://github.com/metaplex-foundation/digital-asset-standard-api

License: GNU Affero General Public License v3.0

Dockerfile 0.41% Rust 96.79% Smarty 0.45% PLpgSQL 1.14% Shell 1.18% Makefile 0.04%
blockchain metaplex nft rust solana

digital-asset-rpc-infrastructure's People

Contributors

alexandruag avatar austbot avatar danenbm avatar ethyi avatar fanatid avatar juanito87 avatar kespinola avatar linuskendall avatar nicolaspennie avatar pmantica11 avatar richardwu avatar stegabob avatar stranzhay avatar tahsintunan avatar tsmbl avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

digital-asset-rpc-infrastructure's Issues

Creators array is empty for regular NFTs

Creators array is not populated when querying assets. The array is empty in the GetAsset response and means that NFTs will be skipped when querying by creator via GetAssetsByCreator.

Note that this only happens for regular NFTs. Compressed NFTs have the right creators and the GetAssetsByCreator works as intended.

Example (redacted for readability):

{
    "jsonrpc": "2.0",
    "result": {
        "interface": "Custom",
        "id": "HBSC9ScYYhi35vNNA5txMxZd2GHfPmtbP4KUiGRN6igL",
        ..., 
        "royalty": {
            "royalty_model": "creators",
            "target": null,
            "percent": 0.042,
            "basis_points": 420,
            "primary_sale_happened": true,
            "locked": false
        },
        "creators": [],
        "ownership": {
            "frozen": false,
            "delegated": true,
            "delegate": "5fGXPvXT3ok1Zwz4fJrURLjBYMBCWwGEJSWZbXEoJzT9",
            "ownership_model": "single",
            "owner": "8cRrU1NzNpjL3k2BwjW3VixAcX6VFc29KHr4KZg8cs2Y"
        },
        "supply": null,
        "mutable": true
    },
    "id": "0"
}

GetAssetsByCreator is returning random assets for random pubkeys.

Inputting a random pubkey into getAssetsByCreator will return a random set of data. Data just so happens to be alphanumerically sorted, perhaps for the entire DB.

{
    "jsonrpc": "2.0",
    "id": "0",
    "method": "get_assets_by_creator",
    "params": {
        "page": 1,
        "creatorVerified": true,
        "creatorAddress": "1234abcd8htfC7YEXKNEfkpuogUUQDDTLgjGWxxv48a",
        "limit": 1000
    }
}

High volume minting leading to empty proofs

We're discovering that when minting 10,000 new NFTs to a tree at a rate of 10 per second, most the off chain proofs will be empty (highly reproducible).

Here's a script that demonstrates as such: https://gist.github.com/alex-fung/9f1963f34ab0ab9096653fd77965fc51
Note it takes about 20 minutes to fully run, but at the end when getting the proofs for each asset ~8000 of them are empty proofs. You will need to provide a keypair with enough SOL to create the 10,000 new NFTS (about 1.2 SOL), as well as an RPC endpoint and a ReadAPI endpoint

Proposal: gRPC based indexer

Currently the DAS API stack relies on having a geyser plugin indexer. One proposal would be to add/transition to a geyser grpc based indexer (https://github.com/rpcpool/yellowstone-grpc). This would allow:

  1. Multiple parallel indexers connected to different grpc endpoints (even different providers)
  2. Better failover
  3. Lower cost since Yellowstone gRPC can be delivered as a shared service.

For account updates and transaction updates this should be pretty straight forward, you can subscribe to confirmed or finalized commitment level via gRPC, convert to Plerkle format and push to redis.

You could also implement a block check mode which checks that you have indexed all transactions from a given block and if NOT, fetch that block via gRPC to fill in missing TXs.

There is experimental support in yellowstone-grpc for fetching program account state which would allow snapshots of the Tokenkeg account to be taken for indexing of traditional NFTs. Snapshots could also be handled through one time ingest through a tool like https://github.com/terorie/solana-snapshot-etl which could even run the plerkle plugin to update all accounts at once. With snapshot-etl the order would be:

  1. Start up the geyser grpc ingestion
  2. Run snapshot-etl to fill in all the missing assets while grpc subscriptions are running.

Recommend addition to the `getAssetProof` response

Problem

When building a transfer instruction for compressed NFTs, developers and sdks are required to get a valid proof via the getAssetProof method. But also the asset's data_hash and creator_hash from the getAsset method too.

The end result is that nearly every time a developer needs to build the transfer instruction, they have to make 2 RPC calls to get all the data that is needed to completely build the transfer instruction (or they have to already have some values cached elsewhere).

Solution

When fetching data via the getAssetProof method, I recommend adding the asset's current data_hash and creator_hash within the response. This would allow 1 less round trip to the ReadApi for not that much extra data in the original response.

Maybe even include the entire compression field data from the getAsset method? But this is a less good option.

Potential issue with redeem indexing of transactions

Potentially reviewing an issue related to one tree where redeeming isn't fully working.

Sample transactions that don't seem to be fully indexed:

[2023-07-27T13:15:42Z ERROR tree_status] leaf index 88: invalid seq 98 vs 99 (db vs blockchain, tx=3H55sTAAcuda56mqkZ6vmEDCc53hx5F2Kx6FWuQQQKeX1nA9KYCAaZAq4nzWu8HiTYW3S21bFJewdRmtVFqB3yax)
[2023-07-27T13:15:42Z ERROR tree_status] leaf index 104: invalid seq 121 vs 122 (db vs blockchain, tx=2iHwrtQHptZpj7kj3yY4tLto4fJkJuFrqUo2rmtpndWUnptBmKyVcSjw9LMDSCTt9vWYiCfJZb5QtCYBMa66fcoJ)
[2023-07-27T13:15:42Z ERROR tree_status] leaf index 58: not found in db, seq 62 tx=4FQRV38NSP6gDo8qDbTBfy8UDHUd6Lzu4GXbHtfvWbtCArkVcbGQwinZ7M61eCmPEF5L8xu4tLAXL7ozbh5scfRi
[2023-07-27T13:15:42Z ERROR tree_status] leaf index 96: not found in db, seq 110 tx=2xPZaNL1wx4iMfccJpSM6xq4ycTAnJeJ9xcbhEJS4YcXKoCLpAPHgAbCHtQLagsKDyqc1USg8d9vBqdFosrcVL44
[2023-07-27T13:15:42Z ERROR tree_status] leaf index 93: not found in db, seq 106 tx=4VKBVKW5NwXtmvsnRGbx4rzPSFPzEwzTFVJvVKBfY8KnqLhRNuLwV4xVMXp4Zvc9XnmwPfmHeu1BtLiv9fMt1adA
[2023-07-27T13:15:42Z ERROR tree_status] leaf index 101: not found in db, seq 118 tx=4eofTVBLi68uxNyRGHsYFcD1Cxu5iiNFUEmmDy7mG5thqtPeeFYih7jxdJQbat9ZADHgaRLixVZJAcZ1YuzBKJ5p
[2023-07-27T13:15:42Z ERROR tree_status] leaf index 98: not found in db, seq 113 tx=23FZQWVQENvcAppgc5zM43Q7aJBeFde6ks7P6ekq9BhPSAf6PBUdDMozAHQPe72Sxq95yFa1HkjPbnrcoPi9bPmG
[2023-07-27T13:15:42Z ERROR tree_status] leaf index 72: not found in db, seq 126 tx=2DWjFnoTtBmGgoCs6yoknZTZfGfTV4KzyerbtbtqBg4spXGzT8hbUPrdugyRSQMte6FQG4Zh3E4itPhKEyQAH4xu
[2023-07-27T13:15:42Z ERROR tree_status] leaf index 40: not found in db, seq 43 tx=4ocrDybW4NJTsH9LXe9cAb3Yd4EnFVBZPxSp3fhSnk1x8CjsTi1AmA4AgdTEMxAkfy5dnrrL6VnPbSMwG9d4t8ym
[2023-07-27T13:15:42Z ERROR tree_status] leaf index 131: not found in db, seq 151 tx=2yyiz18KgkWHjSQaUnyY8yG7VVnDNUwU9WmeCBvUHFcaQiMvDc8HN5F6cYByf6RmAyCfvvZKYytxJ4aCFKwmwPRE
[2023-07-27T13:15:42Z ERROR tree_status] leaf index 67: not found in db, seq 72 tx=27tfpspbszU5FR4nU4N1J9f2d4Z8pFdTMKELcQ68bZZnXdgZHzgEHBLoCg4CZATtvRz61MRbEzHUNAM9dUF6zqME
[2023-07-27T13:15:42Z ERROR tree_status] leaf index 76: not found in db, seq 84 tx=5J7yBj7Y3hw1Y8NGXV8o5wtnEsxGhZHE6bTMFRqGnYKe4ffomtS25U4hDKfer7YhtkSFANyRGK4Xz7C7oVSvujqr
[2023-07-27T13:15:42Z ERROR tree_status] leaf index 83: not found in db, seq 93 tx=2keeR2pJmEogdiodUQieKvDntxMz1eVHvHmuhjS1qxEbHsendFtQRMUonNFhcNwajdg9B1cGiZpCeu5VRWe5BYBt
[2023-07-27T13:15:42Z ERROR tree_status] leaf index 80: not found in db, seq 89 tx=X43kmSs7zN4jAHbbN2j2Hwu1PucWNUozjhCjVeJ1Ubkf5mTTYvVn8pjNrHP9tYetosnc3t8omLNx9EaWhY6wL4F
[2023-07-27T13:15:42Z ERROR tree_status] leaf index 37: not found in db, seq 39 tx=3skKbjD1gRQmn9nrNFZYEJ7iuvQUCLh4oFvHKjDz4PNAypctni4XKsYE52fNtHJMBniwV7cKV4RE9v7f6RrerwFm
[2023-07-27T13:15:42Z ERROR tree_status] leaf index 74: not found in db, seq 80 tx=4Knrbaso2LX4KtC7cabRSG63st9GRnM3roGagFvSaJwhQJczgHnj1oKEvp6YsBT82vb1vEECUvM8voByeM1BngZe
[2023-07-27T13:15:42Z ERROR tree_status] leaf index 102: not found in db, seq 119 tx=4bfdKQQpqTRcavbVXNfUvAowjmvnVSV3hYueRws3uwwY3qBWqrRs8HfEropuZDqJMpUVNStXWRcvC3qbWS52uFGv
[2023-07-27T13:15:42Z ERROR tree_status] leaf index 90: not found in db, seq 102 tx=3K3c249745kwksGHL1nLFcQLFJFKEruLepCPSNiHuPmQsmF9zU2XjCda8uA6tuq2XmA4Xi6wyRKxKWQ9YL9ktZfC
[2023-07-27T13:15:42Z ERROR tree_status] leaf index 77: not found in db, seq 85 tx=2icVoxU2tP2omnHzgpdPvfofrF58EKce89oCUG2azkqizJyAFTSMZimLbhi1TPdFyuFmeXTzFmG4SLFURjt5Dpbr
[2023-07-27T13:15:42Z INFO  txn_forwarder] Sent transaction to stream 4Knrbaso2LX4KtC7cabRSG63st9GRnM3roGagFvSaJwhQJczgHnj1oKEvp6YsBT82vb1vEECUvM8voByeM1BngZe
[2023-07-27T13:15:42Z INFO  txn_forwarder] Sent transaction to stream 4ocrDybW4NJTsH9LXe9cAb3Yd4EnFVBZPxSp3fhSnk1x8CjsTi1AmA4AgdTEMxAkfy5dnrrL6VnPbSMwG9d4t8ym
[2023-07-27T13:15:42Z INFO  txn_forwarder] Sent transaction to stream 2xPZaNL1wx4iMfccJpSM6xq4ycTAnJeJ9xcbhEJS4YcXKoCLpAPHgAbCHtQLagsKDyqc1USg8d9vBqdFosrcVL44
[2023-07-27T13:15:42Z INFO  txn_forwarder] Sent transaction to stream 2DWjFnoTtBmGgoCs6yoknZTZfGfTV4KzyerbtbtqBg4spXGzT8hbUPrdugyRSQMte6FQG4Zh3E4itPhKEyQAH4xu
[2023-07-27T13:15:42Z INFO  txn_forwarder] Sent transaction to stream 4VKBVKW5NwXtmvsnRGbx4rzPSFPzEwzTFVJvVKBfY8KnqLhRNuLwV4xVMXp4Zvc9XnmwPfmHeu1BtLiv9fMt1adA
[2023-07-27T13:15:42Z INFO  txn_forwarder] Sent transaction to stream 4eofTVBLi68uxNyRGHsYFcD1Cxu5iiNFUEmmDy7mG5thqtPeeFYih7jxdJQbat9ZADHgaRLixVZJAcZ1YuzBKJ5p
[2023-07-27T13:15:42Z INFO  txn_forwarder] Sent transaction to stream 2yyiz18KgkWHjSQaUnyY8yG7VVnDNUwU9WmeCBvUHFcaQiMvDc8HN5F6cYByf6RmAyCfvvZKYytxJ4aCFKwmwPRE
[2023-07-27T13:15:42Z INFO  txn_forwarder] Sent transaction to stream 23FZQWVQENvcAppgc5zM43Q7aJBeFde6ks7P6ekq9BhPSAf6PBUdDMozAHQPe72Sxq95yFa1HkjPbnrcoPi9bPmG
[2023-07-27T13:15:42Z INFO  txn_forwarder] Sent transaction to stream 3skKbjD1gRQmn9nrNFZYEJ7iuvQUCLh4oFvHKjDz4PNAypctni4XKsYE52fNtHJMBniwV7cKV4RE9v7f6RrerwFm
[2023-07-27T13:15:42Z INFO  txn_forwarder] Sent transaction to stream 4FQRV38NSP6gDo8qDbTBfy8UDHUd6Lzu4GXbHtfvWbtCArkVcbGQwinZ7M61eCmPEF5L8xu4tLAXL7ozbh5scfRi
[2023-07-27T13:15:42Z INFO  txn_forwarder] Sent transaction to stream 5J7yBj7Y3hw1Y8NGXV8o5wtnEsxGhZHE6bTMFRqGnYKe4ffomtS25U4hDKfer7YhtkSFANyRGK4Xz7C7oVSvujqr
[2023-07-27T13:15:42Z INFO  txn_forwarder] Sent transaction to stream 4bfdKQQpqTRcavbVXNfUvAowjmvnVSV3hYueRws3uwwY3qBWqrRs8HfEropuZDqJMpUVNStXWRcvC3qbWS52uFGv
[2023-07-27T13:15:42Z INFO  txn_forwarder] Sent transaction to stream 2keeR2pJmEogdiodUQieKvDntxMz1eVHvHmuhjS1qxEbHsendFtQRMUonNFhcNwajdg9B1cGiZpCeu5VRWe5BYBt
[2023-07-27T13:15:42Z INFO  txn_forwarder] Sent transaction to stream 3K3c249745kwksGHL1nLFcQLFJFKEruLepCPSNiHuPmQsmF9zU2XjCda8uA6tuq2XmA4Xi6wyRKxKWQ9YL9ktZfC
[2023-07-27T13:15:42Z INFO  txn_forwarder] Sent transaction to stream X43kmSs7zN4jAHbbN2j2Hwu1PucWNUozjhCjVeJ1Ubkf5mTTYvVn8pjNrHP9tYetosnc3t8omLNx9EaWhY6wL4F
[2023-07-27T13:15:42Z INFO  txn_forwarder] Sent transaction to stream 27tfpspbszU5FR4nU4N1J9f2d4Z8pFdTMKELcQ68bZZnXdgZHzgEHBLoCg4CZATtvRz61MRbEzHUNAM9dUF6zqME
[2023-07-27T13:15:42Z INFO  txn_forwarder] Sent transaction to stream 2icVoxU2tP2omnHzgpdPvfofrF58EKce89oCUG2azkqizJyAFTSMZimLbhi1TPdFyuFmeXTzFmG4SLFURjt5Dpbr

Outdated init.sql

I have encountered several errors regarding missing columns in the following tables: asset, asset_creators, and asset_grouping. These missing columns are causing issues in the application.

Here is a list of the missing columns in the asset table:

data_hash
creator_hash
owner_delegate_seq
was_decompressed
leaf_seq

Additionally, there are issues with the following columns in the other tables:

asset_creators.position
asset_grouping.verified

Thank you for your attention to this matter.

Ingestion congestion from inserting backfill_items

Issue

At Triton, we observed slow processing of transactions and excessive accesshare and exclusive locks on the backfill_items caused by the select scanning for already existing backfill_items.

https://github.com/metaplex-foundation/digital-asset-rpc-infrastructure/blob/main/nft_ingester/src/program_transformers/bubblegum/db.rs#L138

Screen Shot 2024-02-05 at 5 27 33 PM Rate of transaction processing goes from 10/s to 125/s after removing the code related to backfill_item insertion. This is running 1 ingester processes with 4 TXN workers. Screen Shot 2024-02-05 at 5 29 03 PM Locks on the postgres database before and after removing backfill_item insertion.

Fix

We have removed the code for inserting the backfill_items because the new tree backfiller we developed does not rely on backfill_items. It works with the new cl_audits_v2.

rpcpool#128

Offchain Indexers unreliably processing data

The offchain indexer is failing to reliably process offchain json uris.
This is making get_asset calls return NFTs without its offchain data populated, the most important being the 'files' field which usually holds the uri to the NFT's image.

Context

NFT metadata gets first indexed when the metadata account is processed via acc geyser. Note that this is different from the mint account.
The ingester initially populates the DB with the onchain metadata, a reference to the offchain uri, and puts a placeholder "processing" in the metadata field until the offchain indexer populates it.
The offchain indexer is a background task that is asynchronously invoked by the ingester. When a new task is submitted it is added to the "tasks" table, and each row contains data on the id that called it and its status.

The task makes a get request to the uri with a timeout of 3 seconds. If at any point the request returns a "reqwest::Error", the row in the tasks table will detail that a failure happened along with a short message identifying the error. Currently all reqwest::Error are converted to "Error downloading batch files" which is likely what most will receive.

  • Each NFT will create its own background task, regardless if many have the same json uri
  • The bgtask runner will purge tasks older than 1 hr
  • If the task is already present in the database, a new task job will not be submitted even if the metadata account is reprocessed.
    • Owning an FFF is a great way to test this since you can dynamically change the offchain data.
  • The timeout for offchain calls is 3 seconds.
  • There are a maximum of 3 attempts before the offchain indexer completely drops the data.
  • The bgtask runner will rerun tasks for all rows in asset_data that have their metadata as "processing"
  • (*on helius) there are more offchain failures than there are successes

Examples

3LBkptXr6N9y3S2eSRTxCega91qHd4Fd6hWyNmBdCzRu

Solutions

  • Priority background task runner with more flexibility. Addresses that see lots of activity will use this instead
  • Increase attempts, and increase timeout if possible.

Mixed up metadata for compressed NFTs

It looks like there's a bug where the metadata that gets indexed gets mixed up. Creating this issue as a placeholder for further dicsussion on this topic.

Example case: https://explorer.solana.com/address/9NcgMu8spvV2abTfUH9njsdHnG9e7dDPkMjzhWEXZTRJ?cluster=devnet

This has two NFTs associated. One where URI is set to https://dialect-file-storage.s3.us-west-2.amazonaws.com/sticker-packs/critters-test-pack/sticker-1-devnet-metadata.json and one where URI is set to https://dialect-file-storage.s3.us-west-2.amazonaws.com/sticker-packs/critters-test-pack/sticker-2-devnet-metadata.json.

However, in our indexed response on devnet we see the following:

curl --request POST   --url ...   --header 'Content-Type: application/json'   --data '{
        "jsonrpc": "2.0",
"method":"getAssetsByOwner",
        "id": "get-assets-op-1",
        "params": {
          "ownerAddress": "9NcgMu8spvV2abTfUH9njsdHnG9e7dDPkMjzhWEXZTRJ",
          "page": 1
        }
}'
{
   "jsonrpc" : "2.0",
   "id" : "get-assets-op-1",
   "result" : {
      "limit" : 1000,
      "items" : [
         {
            "authorities" : [
               {
                  "address" : "BXNgnWuSf4qV34WuTZMYmHcd2P4fHrQNpUUDdRAJow7j",
                  "scopes" : [
                     "full"
                  ]
               }
            ],
            "content" : {
               "files" : [],
               "metadata" : {
                  "name" : "Critters #1 DEVNET",
                  "description" : "Critter sticker 1",
                  "symbol" : "CTP"
               },
               "$schema" : "https://schema.metaplex.com/nft1.0.json",
               "links" : {
                  "external_url" : null
               },
               "json_uri" : "https://dialect-file-storage.s3.us-west-2.amazonaws.com/sticker-packs/critters-test-pack/sticker-1-devnet-metadata.json"
            },
            "interface" : "V1_NFT",
            "creators" : [
               {
                  "share" : 100,
                  "address" : "51HrvWtWjvrkw8F7y1Z3SMCLE9SAU9kfE8HNjn8XMBbu",
                  "verified" : true
               },
               {
                  "verified" : false,
                  "share" : 35,
                  "address" : "D2q37yaP8f87FyW3f6XJqiEVGaAh7zv62FVm6jCDpfAs"
               }
            ],
            "compression" : {
               "data_hash" : "Fa5V8vYjKuqpDfcSg1mWBky75oY8imBq6pRGa2vA18bL",
               "seq" : 386,
               "asset_hash" : "59eS8WBqXj2Ehrq8EP3SpAs2teQs6Scojo63zB8AHD3k",
               "eligible" : false,
               "leaf_id" : 374,
               "tree" : "APBGd5QtSg8PWxGK6pqzRpffBXknpHhMET1bzafLkysx",
               "creator_hash" : "73uaC8PrLQxamuZR2tvKxEdCsxeCNqPTS887kaeDEu9P",
               "compressed" : true
            },
            "mutable" : true,
            "supply" : {
               "print_current_supply" : 0,
               "edition_nonce" : 0,
               "print_max_supply" : 0
            },
            "grouping" : [
               {
                  "group_value" : "EpbHnATobvsAeS864EpX1TKzUyxEADvUAF17LFHJYYwK",
                  "group_key" : "collection"
               }
            ],
            "ownership" : {
               "frozen" : false,
               "delegate" : null,
               "delegated" : false,
               "owner" : "9NcgMu8spvV2abTfUH9njsdHnG9e7dDPkMjzhWEXZTRJ",
               "ownership_model" : "single"
            },
            "royalty" : {
               "basis_points" : 300,
               "royalty_model" : "creators",
               "target" : null,
               "locked" : false,
               "percent" : 0.03,
               "primary_sale_happened" : false
            },
            "id" : "8kM6QnXADYR8uEstjm8ghYMLd5ogh1PRuHjULt6Xj9Ci"
         },
         {
            "mutable" : true,
            "supply" : {
               "print_max_supply" : 0,
               "edition_nonce" : 0,
               "print_current_supply" : 0
            },
            "grouping" : [
               {
                  "group_value" : "EpbHnATobvsAeS864EpX1TKzUyxEADvUAF17LFHJYYwK",
                  "group_key" : "collection"
               }
            ],
            "id" : "ESKQ8bwp7iASVb7pUTLSQgzhuuRQChPRKeFDm6tsnJpj",
            "royalty" : {
               "primary_sale_happened" : false,
               "percent" : 0.03,
               "locked" : false,
               "target" : null,
               "royalty_model" : "creators",
               "basis_points" : 300
            },
            "ownership" : {
               "owner" : "9NcgMu8spvV2abTfUH9njsdHnG9e7dDPkMjzhWEXZTRJ",
               "ownership_model" : "single",
               "delegated" : false,
               "frozen" : false,
               "delegate" : null
            },
            "authorities" : [
               {
                  "scopes" : [
                     "full"
                  ],
                  "address" : "BXNgnWuSf4qV34WuTZMYmHcd2P4fHrQNpUUDdRAJow7j"
               }
            ],
            "interface" : "V1_NFT",
            "creators" : [
               {
                  "address" : "51HrvWtWjvrkw8F7y1Z3SMCLE9SAU9kfE8HNjn8XMBbu",
                  "share" : 18,
                  "verified" : true
               },
               {
                  "verified" : false,
                  "address" : "FnUaaRXXAdV1Y4RHD2k9BUwRXBtHuyTWrMK6HHtqKaEq",
                  "share" : 82
               }
            ],
            "compression" : {
               "leaf_id" : 375,
               "tree" : "APBGd5QtSg8PWxGK6pqzRpffBXknpHhMET1bzafLkysx",
               "creator_hash" : "3PkYeFyfrnU67Mk7CYi236p3bAdxD9rbfpkkBEqYtbQR",
               "compressed" : true,
               "data_hash" : "FqbcEYuWU5UMnyMZL191z8sQWWNJrj8wNop76JKYxcwr",
               "seq" : 387,
               "asset_hash" : "9K6tjL75wm7iSnfuhfsr7RBaVb7JDVbfYkULSwxsTCwf",
               "eligible" : false
            },
            "content" : {
               "$schema" : "https://schema.metaplex.com/nft1.0.json",
               "files" : [],
               "metadata" : {
                  "name" : "Critters #3 DEVNET",
                  "description" : "Critter sticker 3",
                  "symbol" : "CTP"
               },
               "json_uri" : "https://dialect-file-storage.s3.us-west-2.amazonaws.com/sticker-packs/critters-test-pack/sticker-3-devnet-metadata.json",
               "links" : {
                  "external_url" : null
               }
            }
         }
      ],
      "page" : 1,
      "total" : 2
   }
}

Missing sequences

Since there's no way to reindex missing sequence number if a new sequence number has been ingested for the same node_idx, this means we end up with missing sequence numbers in the DB any time a future transaction is indexed before a previous one has been indexed.

So far we haven't observed this creating practical issues but I am not sure if it shouldn't mean problem if say, a transfer instruction is processed before the corresponding mint instruction. In this case the ownership change should fail since it calles update_asset and this update_asset call won't work because the asset is not present in the DB?

Potential issue: If any ownership change transaction (like transfer) is seen on bubblegum txs before the mint

If the indexer sees a TX that modifies the owner and sequence number (e.g. transfer event) before it has seen the mint event, there is a potential for the mint event to never be able to be indexed or for the owner to be updated incorrectly in the asset table.

To address this we'll need to either sequence owner/delegate fields in the assets table or we'll need to have some other handling for this scenario.

[Bug] saving cl_audit records is not idempotent

Issue

The current implementation lacks an on_conflict clause during the insertion of cl_audit records. This omission leads to the possibility of inserting duplicate cl_audit records when a transaction is reprocessed, even if it has already been indexed. The relevant code snippet is as follows:

// Insert the audit item after the insert into cl_items have been completed
if let Some(audit_item) = audit_item {
cl_audits::Entity::insert(audit_item).exec(txn).await?;
}

This behavior is problematic as the ingester is expected to handle reprocessing of transactions seamlessly, without altering the current state of the active index snapshot or introducing redundant data. Duplicate entries can lead to skewed query results and contribute to index bloat, which is a concern given the substantial size of the index.

Proposed Fix

To address this issue, an on_conflict clause should be added to the insertion operation. This clause will ensure that the insertion does nothing if a uniqueness constraint (specifically on the combination of tree, node_id, and seq) is violated. Implementing this change requires the addition of the said constraint.

However, it is important to note that if teams have been using cl_audits for a significant period, there may already be a considerable number of duplicate cl_audit records. These records will need to be deduplicated before the proposed patch can be applied effectively.

Incorrect proof path is returned

DAS indexer returned the following getAssetProof for 2uvPaUZ5uur9cTDtzLSo4wTuFLsRM8eRQALSUmC4Cvm5:

{
    "jsonrpc": "2.0",
    "result": {
        "root": "5EgCBFUtEvTd9Tw8w6yG1CAViJScRnhHbTwNiZZ6F2jN",
        "proof": [
            "7tPTYJAEHK6ssovnvyHcxjBRpputJmjHwSK7v4ZBTiJw",
            "AbySgqaSifQr1Di5CX5X6vYer4CvY1uM4n5UvcJGAxj9",
            "941VCYzNzewQEwHVNTjHpqEJZpzyeNptvNSycY2CscF7",
            "AV5WS13VtTHExSadETZ5ngaftvmExhEFZwWrQ9uVNNen",
            "BPzYf3XWzwHWTmCUsyjzPH1XVthL4yTnVypTpJk9cVAg",
            "3DuaMcRxtRZwxUeirmdZBw1EBkwn8ppAk2btsJkEcopH",
            "GGpvLq3VjBMVmGY7K57Bsh1ADjmZVcGwTZeYaJTgW9i7",
            "JDh7eiWiUWtiWn623iybHqjQ6AQ6c2Czz8m6ZxwSCkta",
            "89BMdqj5ru7vVuSD4LsCCf5ArTuV1FdkHZ8RdV2io45J",
            "2u6tH5iugqzqYTwnnk4do2ja3Y9RCuwmMgQgK2cPz53j",
            "HpMJWAzQv9HFgHBqY1o8V1B27sCYPFHJdGivDA658jEL",
            "Bkc8FTquVtFXc8QyrwfTuDxs6aehuS7ZfMKh97KnwFGe",
            "4YCF1CSyTXm1Yi9W9JeYevawupkomdgy2dLxEBHL9euq",
            "E3oMtCuPEauftdZLX8EZ8YX7BbFzpBCVRYEiLxwPJLY2"
        ],
        "node_index": 19262,
        "leaf": "8W1qAr2uvPtA5oVPuwQQoEQ6YABgWkmYQEmRBkk76hJg",
        "tree_id": "FkiWasg2sef3t3iSHKxrtdfddtAcBTsPbX5sAF7NFTSi"
    },
    "id": "0"
}

The root is correct, but the third proof path entry should be 9rc8MxLkHTfv9L6Mw1CowKKnZqSe3bukGbXgZpNQTue4 instead of 941VCYzNzewQEwHVNTjHpqEJZpzyeNptvNSycY2CscF7. This caused the leaf replacements to fail for this tree, since the Merkle root computed from the proof path was incorrect.

[Proposal] getAssetSignatures method response schema

Hi guys! I'd like to discuss some insights regarding the getAssetSignatures methods within the DAS-API standard.
Currently, the method returns the following structure:

{
    "total": 2,
    "limit": 1000,
    "page": 1,
    "items": [
        [
            "5nLi8m72bU6PBcz4Xrk23P6KTGy9ufF92kZiQXjTv9ELgkUxrNaiCGhMF4vh6RAcisw9DEQWJt9ogM3G2uCuwwV7",
            "MintToCollectionV1"
        ],
        [
            "323Ag4J69gagBt3neUvajNauMydiXZTmXYSfdK5swWcK1iwCUypcXv45UFcy5PTt136G9gtQ45oyPJRs1f2zFZ3v",
            "Transfer"
        ]
    ]
}

I would like to draw your attention particularly to the structure of the items field. It is an array of arrays, each containing two string elements. This format may introduce several challenges for future use, support, and extension of this API method, specifically:

  1. The lack of field names within arrays complicates understanding the elements' meanings without additional documentation or context, potentially leading to misinterpretation and misuse.
  2. Relying on index-based data access in deserialized structures heightens the risk of errors, as it is easy to reference an incorrect index, leading to inaccurate data retrieval or runtime errors.
  3. Implementing data-driven algorithms becomes more complex and less intuitive due to the necessity of managing array indices, increasing the likelihood of mistakes.
  4. Extending the internal array structure poses various difficulties. For instance, adding a slot number to the inner array, alongside the transaction signature and instruction name (akin to the implementation in the getSignaturesForAddress method of solana-rpc), introduces type inconsistencies. While Rust can utilize a tuple (String, String, u64), Golang would require a [][]interface{}, necessitating type conversion from interface to string or uint64 before each element's usage. Moreover, even in Rust, handling a tuple (String, String, u64) is less clear and convenient than working with a dedicated data structure.

To address these issues, we propose an alternative data structure for the items field in the getAssetSignatures method. The following JSON schema demonstrates our suggestion, where each element of the items array is a separate structure:

{
	"total": 4,
	"limit": 4,
	"page": 4,
	"items": [
		{
			"signature": "bwXqHvK2ytieSpbDxdxyk9M3C6RX1jSRndkW9ZNxaMQRhPJKJFmSYgg1Qwe8vBuUV3WsvButeq4ivVCnaVdShXe",
			"instruction": "TestInstruction",
			"slot": 180
		},
		{
			"signature": "61tZnQLFyedD9WJmdMAJ1jWCapo72paE2A7eY5mvaFbQmg85QSBiwg69Ze4a7Di8HBZbamcvnvLJaFjCoT5vnEQi",
			"instruction": "TestInstruction",
			"slot": 182
		},
		{
			"signature": "4MagGFKHJPsPTxWeyPEE6n8ftkHcDrFHLHnbq5Mg17iMe2SawrVVtqY5TBtyKhPTcP6oRvspmcNgMCJHGKshRbyt",
			"instruction": "TestInstruction",
			"slot": 184
		},
		{
			"signature": "3CiRao3MpyFeNxtsw8KE2LYirFfXKNFRmqNb3tiUNRA9hkPip63Hze9Am19imazR4rQVckLNzExHdoyFhyXjWiu3",
			"instruction": "TestInstruction",
			"slot": 186
		},
	]
}

This approach addresses all previously mentioned issues. I invite you to discuss the merits and potential drawbacks of this proposal. Thanks!

Unexpected frontend search

This query returns a single NFT:

'{
        "jsonrpc": "2.0",
        "method":"searchAssets",
        "id": "rpd-op-123",
        "params": { "ownerAddress": "C4P6dwQzd7k8qE39DfSU8s4ncjjx4Zb4iiJxaEDtNBwQ", "compressed": false, "sortBy": { "sortBy": "created", "sortDirection": "asc" }, "page": 0 }
}'

This query returns many NFTs with compressed: false:

'{
        "jsonrpc": "2.0",
        "method":"searchAssets",
        "id": "rpd-op-123",
        "params": { "conditionType": "any", "ownerAddress": "C4P6dwQzd7k8qE39DfSU8s4ncjjx4Zb4iiJxaEDtNBwQ", "compressed": false, "sortBy": { "sortBy": "created", "sortDirection": "asc" }, "page": 0 }
}'

Failed transaction ingested

It looks like the indexer has indexed transactions that are failed:

Here is a sample indexed set of proofs for asset id FxJZAzMNPFgxJsR3EP9hiQZ2n8HoNsQ37CWzT4bQCRB9

      "qTbaST2Fp31eoPCifePwxmQNuXjQu2N5EAzRYkkhmPw",
      "DjBG29DyURabYAT4dW5SZbq43pUhPqeCwHQKqeQCvh8W",
      "FHUCMbfkdd7zBwwm9cM6QZHB4wTHkvGHavWZBkN5nSpL",
      "6CuYAGQfGuNMryQmq8hg7ZexKmXFG3VtZPud39JdQRh3",
      "GbBhUX8WBkYR1mbnqvL6Ew12yrDAw4cnXw7WpAFFCNat",
      "D6A2oE3ri17zUTwS4pqutKLRpJWCFydVUVvoXjSKoXUB",
      "H2rEncDzBTGBUZwmwRmwD2Y11Da3eWNh7EacykevoT7G",
      "DuWqk1xeNcaT1vdgc5ptJKWWdpUnUiaWuHnBJTNnoPBG",
      "DQCLpSDy1eY87uCRwFMAfzsfiaUsrBKMGhpyg5gLMgVg",
      "EvxphsdRErrDMs9nhFfF4nzq8i1C2KSogA7uB96TPpPR",
      "HpMJWAzQv9HFgHBqY1o8V1B27sCYPFHJdGivDA658jEL",
      "HjnrJn5vBUUzpCxzjjM9ZnCPuXei2cXKJjX468B9yWD7",
      "4YCF1CSyTXm1Yi9W9JeYevawupkomdgy2dLxEBHL9euq",
      "E3oMtCuPEauftdZLX8EZ8YX7BbFzpBCVRYEiLxwPJLY2",
      "7DiCkBhs5HQLPEsKY6EjfNd3oBswnfRk9UAZcHqczL7m",
      "FhsNgK6GGU1cRPFbmPhrEZ95Zj8vorjK6GmhFuwmZsUm",
      "3e2oBSLfSDVdUdS7jRGFKa8nreJUA9sFPEELrHaQyd4J",
      "GCXyEHiFMtRFTNFT5LNHwxiXZfooBpUMGSkjyz7pfcS5",
      "752CmMF5k7acEFEmJA7oE3aobbWj7CAZVm3KpDR6HiRV",
      "D9GGr1ycBmgRbHJyJzmxMk5aoKZmjdezB4NpxopAcgpP"

The transactions corresponding to H2rEncDzBTGBUZwmwRmwD2Y11Da3eWNh7EacykevoT7G were all failed

https://explorer.solana.com/address/D6A2oE3ri17zUTwS4pqutKLRpJWCFydVUVvoXjSKoXUB

The correct proof looks like it should be 8RkcxezsPzaH4GmYaobXmimiUJKxUTbBu3C27S9jZa9s

Docker build fails at "Compiling digital_asset_types v0.0.1 (/rust/digital_asset_types)"

The error is:

error[E0277]: the trait bound `metaplex_anchor::MasterEdition: TokenMetadataAccount` is not satisfied

I ran ./download-programs in a docker image like this, as I'm on M1 and can't compile them natively:

FROM --platform=linux/amd64 rust:1.63-bullseye

RUN sh -c "$(curl -sSfL https://release.solana.com/v1.14.2/install)"
ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH"
RUN git clone --no-checkout  https://github.com/metaplex-foundation/digital-asset-rpc-infrastructure.git

WORKDIR /digital-asset-rpc-infrastructure/

RUN git checkout 68a92282b6c7f5b4b21324d7bd17b4b89435e401

RUN ./download-programs.sh

Then used docker cp to get them out, as can be seen here:

{digital-asset-rpc-infrastructure}$ls programs
ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL.so GRoLLzvxpxxu2PGNJMMeZPyMxjAUH9pKqxGXV9DGiceU.so metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s.so
BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY.so TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb.so

But I am left with this failing build:

{digital-asset-rpc-infrastructure}$docker-compose build --no-cache                     
[+] Building 557.3s (38/43)                                                                                                                                                                                                           
 => [digital-asset-rpc-infrastructure-ingester internal] load build definition from Ingest.Dockerfile                                                                                                                            0.0s
 => => transferring dockerfile: 1.18kB                                                                                                                                                                                           0.0s
 => [digital-asset-rpc-infrastructure-api internal] load build definition from Api.Dockerfile                                                                                                                                    0.0s
 => => transferring dockerfile: 1.12kB                                                                                                                                                                                           0.0s
 => [digital-asset-rpc-infrastructure-ingester internal] load .dockerignore                                                                                                                                                      0.0s
 => => transferring context: 34B                                                                                                                                                                                                 0.0s
 => [digital-asset-rpc-infrastructure-api internal] load .dockerignore                                                                                                                                                           0.0s
 => => transferring context: 34B                                                                                                                                                                                                 0.0s
 => [digital-asset-rpc-infrastructure-api internal] load metadata for docker.io/library/rust:1.63-slim-bullseye                                                                                                                  1.2s
 => [digital-asset-rpc-infrastructure-ingester internal] load metadata for docker.io/library/rust:1.63-bullseye                                                                                                                  1.2s
 => CACHED [digital-asset-rpc-infrastructure-ingester chef 1/2] FROM docker.io/library/rust:1.63-bullseye@sha256:54f17dc625ed83d3fc7dee68d5eac4e1977de40e72d909bcdb50cc55a462779d                                                0.0s
 => [digital-asset-rpc-infrastructure-api internal] load build context                                                                                                                                                           0.0s
 => => transferring context: 22.83kB                                                                                                                                                                                             0.0s
 => CACHED [digital-asset-rpc-infrastructure-ingester stage-3 1/6] FROM docker.io/library/rust:1.63-slim-bullseye@sha256:2bfce600f8e11779fcff44f7a9e38b43d0d0f16eedd18776c294005f67862ae0                                        0.0s
 => [digital-asset-rpc-infrastructure-ingester chef 2/2] RUN cargo install cargo-chef                                                                                                                                           68.2s
 => [digital-asset-rpc-infrastructure-ingester internal] load build context                                                                                                                                                      0.0s
 => => transferring context: 75.98kB                                                                                                                                                                                             0.0s
 => [digital-asset-rpc-infrastructure-ingester stage-3 2/6] RUN apt update     && apt install -y curl ca-certificates tzdata     && rm -rf /var/lib/apt/lists/*                                                                  5.5s
 => [digital-asset-rpc-infrastructure-ingester stage-3 3/6] RUN groupadd appuser     && useradd -g appuser appuser     && mkdir -p /usr/src/app                                                                                  0.5s
 => [digital-asset-rpc-infrastructure-ingester planner 1/3] COPY nft_ingester /rust/nft_ingester/                                                                                                                                0.1s
 => [digital-asset-rpc-infrastructure-ingester builder 1/9] RUN apt-get update -y &&     apt-get install -y build-essential make git                                                                                             3.6s
 => [digital-asset-rpc-infrastructure-api planner 1/3] COPY das_api /rust/das_api/                                                                                                                                               0.0s
 => [digital-asset-rpc-infrastructure-api planner 2/3] WORKDIR /rust/das_api                                                                                                                                                     0.0s
 => [digital-asset-rpc-infrastructure-ingester planner 2/3] WORKDIR /rust/nft_ingester                                                                                                                                           0.0s
 => [digital-asset-rpc-infrastructure-api planner 3/3] RUN cargo chef prepare --recipe-path recipe.json                                                                                                                          0.3s
 => [digital-asset-rpc-infrastructure-ingester planner 3/3] RUN cargo chef prepare --recipe-path recipe.json                                                                                                                     0.3s
 => [digital-asset-rpc-infrastructure-api builder 2/9] COPY digital_asset_types /rust/digital_asset_types                                                                                                                        0.0s
 => [digital-asset-rpc-infrastructure-api builder 3/9] RUN mkdir -p /rust/das_api                                                                                                                                                0.2s
 => CACHED [digital-asset-rpc-infrastructure-ingester builder 2/9] COPY digital_asset_types /rust/digital_asset_types                                                                                                            0.0s
 => [digital-asset-rpc-infrastructure-ingester builder 3/9] RUN mkdir -p /rust/nft_ingester                                                                                                                                      0.2s
 => [digital-asset-rpc-infrastructure-api builder 4/9] WORKDIR /rust/das_api                                                                                                                                                     0.0s
 => [digital-asset-rpc-infrastructure-ingester builder 4/9] WORKDIR /rust/nft_ingester                                                                                                                                           0.0s
 => [digital-asset-rpc-infrastructure-api builder 5/9] COPY --from=planner /rust/das_api/recipe.json recipe.json                                                                                                                 0.0s
 => [digital-asset-rpc-infrastructure-ingester builder 5/9] COPY --from=planner /rust/nft_ingester/recipe.json recipe.json                                                                                                       0.0s
 => [digital-asset-rpc-infrastructure-api builder 6/9] COPY das_api/Cargo.toml .                                                                                                                                                 0.0s
 => [digital-asset-rpc-infrastructure-ingester builder 6/9] COPY nft_ingester/Cargo.toml .                                                                                                                                       0.0s
 => [digital-asset-rpc-infrastructure-api builder 7/9] RUN cargo chef cook --release --recipe-path recipe.json                                                                                                                 364.6s
 => ERROR [digital-asset-rpc-infrastructure-ingester builder 7/9] RUN cargo chef cook --release --recipe-path recipe.json                                                                                                      483.8s
 => [digital-asset-rpc-infrastructure-api builder 8/9] COPY das_api .                                                                                                                                                            0.1s
 => [digital-asset-rpc-infrastructure-api builder 9/9] RUN cargo build --release                                                                                                                                                47.3s
 => [digital-asset-rpc-infrastructure-api stage-3 4/6] COPY --from=builder /rust/das_api/target/release/das_api /usr/src/app                                                                                                     0.2s
 => [digital-asset-rpc-infrastructure-api stage-3 5/6] RUN chown -R appuser:appuser /usr/src/app                                                                                                                                 0.9s
 => [digital-asset-rpc-infrastructure-api stage-3 6/6] WORKDIR /usr/src/app                                                                                                                                                      0.0s
 => [digital-asset-rpc-infrastructure-api] exporting to image                                                                                                                                                                    0.2s
 => => exporting layers                                                                                                                                                                                                          0.1s
 => => writing image sha256:ed370c3faa69f44affc6187830e5cb7a02833d3ea48da4c114908a41a4043d01                                                                                                                                     0.0s
 => => naming to docker.io/library/digital-asset-rpc-infrastructure-api                                                                                                                                                          0.0s
------
 > [digital-asset-rpc-infrastructure-ingester builder 7/9] RUN cargo chef cook --release --recipe-path recipe.json:
#0 0.458     Updating crates.io index
#0 0.698     Updating git repository `https://github.com/solana-labs/solana-program-library`
#0 8.190  Downloading crates ...
#0 8.664   Downloaded ahash v0.7.6
#0 8.677   Downloaded anchor-derive-accounts v0.25.0
#0 8.682   Downloaded borsh-schema-derive-internal v0.9.3
#0 8.691   Downloaded cadence-macros v0.29.0
#0 8.756   Downloaded base64 v0.13.0
#0 8.801   Downloaded cc v1.0.73
#0 8.886   Downloaded combine v4.6.6
#0 8.894   Downloaded async-trait v0.1.57
#0 8.898   Downloaded flate2 v1.0.24
#0 8.905   Downloaded dlopen v0.1.8
#0 8.913   Downloaded borsh-derive v0.9.3
#0 8.914   Downloaded blockbuster v0.0.2
#0 8.917   Downloaded memmap2 v0.5.7
#0 8.919   Downloaded aes-gcm-siv v0.10.3
#0 8.921   Downloaded memoffset v0.6.5
#0 8.923   Downloaded libsecp256k1-gen-genmult v0.2.1
#0 8.928   Downloaded anchor-attribute-program v0.25.0
#0 8.929   Downloaded anchor-attribute-account v0.25.0
#0 8.939   Downloaded asn1-rs-derive v0.4.0
#0 8.951   Downloaded lz4 v1.24.0
#0 8.967   Downloaded jsonrpc-core v18.0.0
#0 8.973   Downloaded anchor-syn v0.25.0
#0 8.980   Downloaded atoi v1.0.0
#0 8.994   Downloaded bv v0.11.1
#0 8.999   Downloaded foreign-types v0.3.2
#0 9.001   Downloaded async-compression v0.3.14
#0 9.015   Downloaded asn1-rs-impl v0.1.0
#0 9.018   Downloaded filetime v0.2.17
#0 9.040   Downloaded fallible-iterator v0.2.0
#0 9.043   Downloaded heck v0.3.3
#0 9.047   Downloaded bytes v1.2.1
#0 9.051   Downloaded flatbuffers v2.1.2
#0 9.054   Downloaded bs58 v0.3.1
#0 9.064   Downloaded jobserver v0.1.24
#0 9.076   Downloaded ipnet v2.5.0
#0 9.101   Downloaded borsh v0.9.3
#0 9.104   Downloaded anchor-attribute-constant v0.25.0
#0 9.105   Downloaded async-stream-impl v0.3.3
#0 9.106   Downloaded aead v0.4.3
#0 9.107   Downloaded aliasable v0.1.3
#0 9.109   Downloaded Inflector v0.11.4
#0 9.117   Downloaded futures v0.3.24
#0 9.124   Downloaded mime v0.3.16
#0 9.126   Downloaded cpufeatures v0.2.5
#0 9.127   Downloaded alloc-stdlib v0.2.2
#0 9.129   Downloaded num-integer v0.1.45
#0 9.131   Downloaded arrayref v0.3.6
#0 9.133   Downloaded alloc-no-stdlib v2.0.4
#0 9.141   Downloaded merlin v3.0.0
#0 9.142   Downloaded bitmaps v2.1.0
#0 9.144   Downloaded async-mutex v1.4.0
#0 9.145   Downloaded sea-strum_macros v0.23.0
#0 9.148   Downloaded modular-bitfield-impl v0.11.2
#0 9.151   Downloaded ouroboros v0.15.5
#0 9.152   Downloaded bae v0.1.7
#0 9.163   Downloaded cipher v0.4.3
#0 9.170   Downloaded modular-bitfield v0.11.2
#0 9.189   Downloaded quinn v0.8.5
#0 9.194   Downloaded rpassword v6.0.1
#0 9.206   Downloaded base64ct v1.5.2
#0 9.245   Downloaded quinn-proto v0.8.4
#0 9.252   Downloaded solana-account-decoder v1.10.33
#0 9.254   Downloaded shank v0.0.9
#0 9.257   Downloaded solana-bucket-map v1.10.33
#0 9.259   Downloaded solana-cli-config v1.10.33
#0 9.260   Downloaded solana-clap-utils v1.10.33
#0 9.262   Downloaded solana-address-lookup-table-program v1.10.33
#0 9.265   Downloaded solana-config-program v1.10.33
#0 9.267   Downloaded solana-measure v1.10.33
#0 9.268   Downloaded solana-frozen-abi-macro v1.10.33
#0 9.270   Downloaded solana-logger v1.10.33
#0 9.271   Downloaded solana-compute-budget-program v1.10.33
#0 9.273   Downloaded solana-faucet v1.10.33
#0 9.287   Downloaded blake3 v1.3.1
#0 9.296   Downloaded solana-rayon-threadlimit v1.10.33
#0 9.297   Downloaded solana-metrics v1.10.33
#0 9.302   Downloaded solana-program-runtime v1.10.33
#0 9.307   Downloaded solana-remote-wallet v1.10.33
#0 9.308   Downloaded solana-sdk-macro v1.10.33
#0 9.329   Downloaded base64 v0.12.3
#0 9.335   Downloaded solana-version v1.10.33
#0 9.342   Downloaded bincode v1.3.3
#0 9.346   Downloaded solana-perf v1.10.33
#0 9.349   Downloaded solana-stake-program v1.10.33
#0 9.351   Downloaded fxhash v0.2.1
#0 9.352   Downloaded inout v0.1.3
#0 9.353   Downloaded generic-array v0.14.6
#0 9.356   Downloaded hyper-tls v0.5.0
#0 9.362   Downloaded hmac v0.12.1
#0 9.371   Downloaded getrandom v0.1.16
#0 9.374   Downloaded keccak v0.1.2
#0 9.375   Downloaded hyper-rustls v0.23.0
#0 9.386   Downloaded libloading v0.7.3
#0 9.413   Downloaded md-5 v0.10.4
#0 9.414   Downloaded itertools v0.10.5
#0 9.422   Downloaded hmac v0.8.1
#0 9.425   Downloaded openssl-probe v0.1.5
#0 9.427   Downloaded percent-encoding v2.2.0
#0 9.436   Downloaded clap v2.34.0
#0 9.443   Downloaded asn1-rs v0.5.1
#0 9.453   Downloaded pin-project-lite v0.2.9
#0 9.460   Downloaded crunchy v0.2.2
#0 9.461   Downloaded crossbeam-deque v0.8.2
#0 9.498   Downloaded derivation-path v0.2.0
#0 9.499   Downloaded crossbeam-epoch v0.9.10
#0 9.513   Downloaded openssl-sys v0.9.75
#0 9.525   Downloaded minimal-lexical v0.2.1
#0 9.550   Downloaded der-parser v8.1.0
#0 9.555   Downloaded anchor-attribute-access-control v0.25.0
#0 9.566   Downloaded solana-streamer v1.10.33
#0 9.574   Downloaded percentage v0.1.0
#0 9.576   Downloaded solana-frozen-abi v1.10.33
#0 9.578   Downloaded quinn-udp v0.1.3
#0 9.580   Downloaded solana-net-utils v1.10.33
#0 9.581   Downloaded ouroboros v0.14.2
#0 9.584   Downloaded solana-transaction-status v1.10.33
#0 9.589   Downloaded adler v1.0.2
#0 9.596   Downloaded solana-sdk v1.10.33
#0 9.605   Downloaded signal-hook-registry v1.4.0
#0 9.606   Downloaded phf_shared v0.11.1
#0 9.608   Downloaded phf v0.11.1
#0 9.610   Downloaded sha1 v0.6.1
#0 9.611   Downloaded serde_bytes v0.11.7
#0 9.613   Downloaded sea-query-derive v0.2.0
#0 9.616   Downloaded sha2 v0.10.6
#0 9.619   Downloaded sea-strum v0.23.0
#0 9.620   Downloaded sea-query-driver v0.2.2
#0 9.621   Downloaded quote v0.6.13
#0 9.623   Downloaded num-complex v0.2.4
#0 9.624   Downloaded num-derive v0.3.3
#0 9.626   Downloaded anchor-attribute-interface v0.25.0
#0 9.626   Downloaded anchor-attribute-event v0.25.0
#0 9.628   Downloaded anchor-attribute-error v0.25.0
#0 9.629   Downloaded mime_guess v2.0.4
#0 9.631   Downloaded opaque-debug v0.3.0
#0 9.640   Downloaded shank_macro_impl v0.0.9
#0 9.644   Downloaded shank_macro v0.0.9
#0 9.645   Downloaded semver v1.0.14
#0 9.649   Downloaded miniz_oxide v0.5.4
#0 9.655   Downloaded slab v0.4.7
#0 9.659   Downloaded jsonpath_lib v0.3.0
#0 9.675   Downloaded mio v0.7.14
#0 9.689   Downloaded reqwest v0.11.12
#0 9.700   Downloaded lz4-sys v1.9.4
#0 9.735   Downloaded rust_decimal v1.26.1
#0 9.743   Downloaded anchor-spl v0.25.0
#0 9.746   Downloaded crc v3.0.0
#0 9.749   Downloaded constant_time_eq v0.1.5
#0 9.753   Downloaded dirs-sys v0.3.7
#0 9.755   Downloaded crossbeam-queue v0.3.6
#0 9.757   Downloaded crc-catalog v2.1.0
#0 9.761   Downloaded ctr v0.8.0
#0 9.768   Downloaded dirs v4.0.0
#0 9.770   Downloaded const-oid v0.7.1
#0 9.772   Downloaded digest v0.10.5
#0 9.775   Downloaded siphasher v0.3.10
#0 9.778   Downloaded digest v0.9.0
#0 9.780   Downloaded borsh-derive-internal v0.9.3
#0 9.782   Downloaded anchor-lang v0.25.0
#0 9.791   Downloaded signature v1.6.3
#0 9.793   Downloaded dialoguer v0.10.2
#0 9.798   Downloaded openssl v0.10.41
#0 9.809   Downloaded displaydoc v0.2.3
#0 9.817   Downloaded data-encoding v2.3.2
#0 9.824   Downloaded sea-query v0.26.3
#0 9.836   Downloaded smallvec v1.9.0
#0 9.841   Downloaded der v0.5.1
#0 9.873   Downloaded solana-client v1.10.33
#0 9.880   Downloaded solana-program v1.10.33
#0 9.888   Downloaded sized-chunks v0.6.5
#0 9.909   Downloaded socket2 v0.4.7
#0 9.942   Downloaded crossbeam-channel v0.5.6
#0 9.947   Downloaded native-tls v0.2.10
#0 9.950   Downloaded terminal_size v0.1.17
#0 9.952   Downloaded dirs-sys-next v0.1.2
#0 9.954   Downloaded block-buffer v0.10.3
#0 9.955   Downloaded async-stream v0.3.3
#0 9.957   Downloaded assert_matches v1.5.0
#0 9.958   Downloaded crypto-common v0.1.6
#0 9.968   Downloaded block-padding v0.2.1
#0 9.970   Downloaded array-init v2.0.1
#0 9.972   Downloaded tinyvec v1.6.0
#0 9.975   Downloaded bs58 v0.4.0
#0 9.986   Downloaded ansi_term v0.12.1
#0 9.989   Downloaded anchor-attribute-state v0.25.0
#0 9.991   Downloaded dashmap v4.0.2
#0 9.994   Downloaded tracing-attributes v0.1.22
#0 10.00   Downloaded num-bigint v0.2.6
#0 10.01   Downloaded unicode_categories v0.1.1
#0 10.01   Downloaded wasm-bindgen-macro v0.2.83
#0 10.02   Downloaded proc-macro-crate v0.1.5
#0 10.02   Downloaded num v0.2.1
#0 10.02   Downloaded getrandom v0.2.7
#0 10.02   Downloaded spl-memo v3.0.1
#0 10.02   Downloaded rusticata-macros v4.1.0
#0 10.03   Downloaded rand_core v0.6.4
#0 10.03   Downloaded plerkle_messenger v0.0.7
#0 10.03   Downloaded dotenvy v0.15.5
#0 10.03   Downloaded console v0.15.1
#0 10.04   Downloaded unicase v2.6.0
#0 10.04   Downloaded crc32fast v1.3.2
#0 10.07   Downloaded sha3 v0.9.1
#0 10.15   Downloaded parking_lot v0.12.1
#0 10.15   Downloaded thiserror-impl v1.0.35
#0 10.15   Downloaded num-iter v0.1.43
#0 10.17   Downloaded tracing v0.1.36
#0 10.17   Downloaded sha1 v0.10.5
#0 10.17   Downloaded webpki v0.22.0
#0 10.18   Downloaded unicode-xid v0.1.0
#0 10.18   Downloaded zeroize v1.3.0
#0 10.18   Downloaded hex v0.4.3
#0 10.18   Downloaded oid-registry v0.6.0
#0 10.19   Downloaded crypto-mac v0.8.0
#0 10.19   Downloaded futures-channel v0.3.24
#0 10.19   Downloaded plerkle_serialization v0.1.8
#0 10.19   Downloaded cipher v0.3.0
#0 10.19   Downloaded solana-vote-program v1.10.33
#0 10.20   Downloaded spin v0.5.2
#0 10.20   Downloaded solana-zk-token-proof-program v1.10.33
#0 10.21   Downloaded dirs-next v2.0.0
#0 10.21   Downloaded spl-concurrent-merkle-tree v0.1.0
#0 10.21   Downloaded pear v0.2.3
#0 10.21   Downloaded block-buffer v0.9.0
#0 10.24   Downloaded strum v0.24.1
#0 10.24   Downloaded sqlx-macros v0.6.2
#0 10.27   Downloaded aes v0.7.5
#0 10.28   Downloaded textwrap v0.11.0
#0 10.28   Downloaded arrayvec v0.7.2
#0 10.30   Downloaded syn v0.15.44
#0 10.31   Downloaded tokio-postgres v0.7.7
#0 10.32   Downloaded bumpalo v3.11.0
#0 10.32   Downloaded wasm-bindgen-shared v0.2.83
#0 10.32   Downloaded ouroboros_macro v0.14.2
#0 10.33   Downloaded lock_api v0.4.9
#0 10.33   Downloaded tungstenite v0.17.3
#0 10.34   Downloaded bzip2 v0.4.3
#0 10.35   Downloaded rand v0.8.5
#0 10.37   Downloaded unicode-normalization v0.1.22
#0 10.37   Downloaded httparse v1.8.0
#0 10.38   Downloaded brotli-decompressor v2.3.2
#0 10.39   Downloaded unicode-segmentation v1.10.0
#0 10.39   Downloaded spl-associated-token-account v1.0.5
#0 10.40   Downloaded index_list v0.2.7
#0 10.41   Downloaded pkg-config v0.3.25
#0 10.46   Downloaded plerkle_serialization v0.0.7
#0 10.46   Downloaded ed25519-dalek v1.0.1
#0 10.48   Downloaded nom v7.1.1
#0 10.48   Downloaded static_assertions v1.1.0
#0 10.48   Downloaded postgres-types v0.2.4
#0 10.49   Downloaded tokio-tungstenite v0.17.2
#0 10.50   Downloaded uuid v1.1.2
#0 10.53   Downloaded universal-hash v0.4.1
#0 10.53   Downloaded solana-runtime v1.10.33
#0 10.58   Downloaded x509-parser v0.14.0
#0 10.59   Downloaded webpki-roots v0.22.4
#0 10.59   Downloaded either v1.8.0
#0 10.59   Downloaded pkcs8 v0.8.0
#0 10.60   Downloaded sct v0.7.0
#0 10.60   Downloaded gethostname v0.2.3
#0 10.60   Downloaded ed25519-dalek-bip32 v0.2.0
#0 10.60   Downloaded bytemuck_derive v1.2.1
#0 10.61   Downloaded num_threads v0.1.6
#0 10.61   Downloaded hyper v0.14.20
#0 10.62   Downloaded serde_urlencoded v0.7.1
#0 10.62   Downloaded stringprep v0.1.2
#0 10.63   Downloaded rustls-native-certs v0.6.2
#0 10.63   Downloaded tower-service v0.3.2
#0 10.63   Downloaded ppv-lite86 v0.2.16
#0 10.64   Downloaded typenum v1.15.0
#0 10.64   Downloaded tracing-core v0.1.29
#0 10.65   Downloaded yansi v0.5.1
#0 10.65   Downloaded num_cpus v1.13.1
#0 10.66   Downloaded num-traits v0.2.15
#0 10.67   Downloaded yaml-rust v0.4.5
#0 10.68   Downloaded pin-utils v0.1.0
#0 10.68   Downloaded rustversion v1.0.9
#0 10.68   Downloaded spl-token v3.3.0
#0 10.69   Downloaded wasm-bindgen-macro-support v0.2.83
#0 10.69   Downloaded serde_yaml v0.8.26
#0 10.72   Downloaded subtle v2.4.1
#0 10.74   Downloaded tokio-test v0.4.2
#0 10.74   Downloaded tiny-bip39 v0.8.2
#0 10.74   Downloaded zstd v0.11.2+zstd.1.5.2
#0 10.77   Downloaded unicode-bidi v0.3.8
#0 10.78   Downloaded caps v0.5.4
#0 10.79   Downloaded ed25519 v1.5.2
#0 10.79   Downloaded wasm-bindgen v0.2.83
#0 10.81   Downloaded ouroboros_macro v0.15.5
#0 10.81   Downloaded mpl-bubblegum v0.1.1
#0 10.81   Downloaded linked-hash-map v0.5.6
#0 10.82   Downloaded strum_macros v0.24.3
#0 10.82   Downloaded libsecp256k1-core v0.2.2
#0 10.83   Downloaded sha3 v0.10.5
#0 10.84   Downloaded xattr v0.2.3
#0 10.84   Downloaded tokio-macros v1.8.0
#0 10.84   Downloaded parking_lot v0.11.2
#0 10.85   Downloaded zeroize_derive v1.3.2
#0 10.85   Downloaded untrusted v0.7.1
#0 10.85   Downloaded unicode-xid v0.2.4
#0 10.85   Downloaded proc-macro-crate v1.2.1
#0 10.85   Downloaded sqlx-core v0.6.2
#0 10.88   Downloaded zstd-safe v5.0.2+zstd.1.5.2
#0 10.88   Downloaded spl-account-compression v0.1.0
#0 10.88   Downloaded yasna v0.5.0
#0 10.88   Downloaded sqlformat v0.2.0
#0 10.89   Downloaded paste v1.0.9
#0 10.89   Downloaded num-rational v0.2.4
#0 10.89   Downloaded chrono v0.4.22
#0 10.90   Downloaded hmac-drbg v0.3.0
#0 10.90   Downloaded rustc-hash v1.1.0
#0 10.90   Downloaded num-bigint v0.4.3
#0 10.91   Downloaded spl-noop v0.1.0
#0 10.91   Downloaded futures-io v0.3.24
#0 10.91   Downloaded sha1_smol v1.0.0
#0 10.91   Downloaded futures-executor v0.3.24
#0 10.91   Downloaded pbkdf2 v0.10.1
#0 10.92   Downloaded env_logger v0.9.1
#0 10.92   Downloaded hkdf v0.12.3
#0 10.92   Downloaded bytemuck v1.12.1
#0 10.93   Downloaded form_urlencoded v1.1.0
#0 10.93   Downloaded foreign-types-shared v0.1.1
#0 10.93   Downloaded cadence v0.29.0
#0 10.93   Downloaded httpdate v1.0.2
#0 10.93   Downloaded hashlink v0.8.1
#0 10.94   Downloaded rustls-pemfile v1.0.1
#0 10.94   Downloaded rand_core v0.5.1
#0 10.95   Downloaded http-body v0.4.5
#0 10.95   Downloaded enum_dispatch v0.3.8
#0 10.96   Downloaded proc-macro2-diagnostics v0.9.1
#0 10.97   Downloaded want v0.3.0
#0 10.97   Downloaded rcgen v0.9.3
#0 10.98   Downloaded vec_map v0.8.2
#0 10.98   Downloaded tokio-native-tls v0.3.0
#0 10.98   Downloaded num_enum v0.5.7
#0 11.01   Downloaded rand v0.7.3
#0 11.02   Downloaded sqlx v0.6.2
#0 11.04   Downloaded curve25519-dalek v3.2.1
#0 11.06   Downloaded fastrand v1.8.0
#0 11.06   Downloaded strsim v0.8.0
#0 11.07   Downloaded thiserror v1.0.35
#0 11.07   Downloaded sha-1 v0.10.0
#0 11.08   Downloaded rand_chacha v0.3.1
#0 11.08   Downloaded lru v0.7.8
#0 11.08   Downloaded polyval v0.5.3
#0 11.08   Downloaded number_prefix v0.4.0
#0 11.09   Downloaded tar v0.4.38
#0 11.09   Downloaded mpl-token-metadata v1.4.0
#0 11.10   Downloaded tokio-stream v0.1.10
#0 11.11   Downloaded uriparse v0.6.4
#0 11.11   Downloaded utf-8 v0.7.6
#0 11.12   Downloaded url v2.3.1
#0 11.13   Downloaded inlinable_string v0.1.15
#0 11.13   Downloaded mpl-token-vault v0.1.0
#0 11.13   Downloaded futures-task v0.3.24
#0 11.13   Downloaded tokio-rustls v0.23.4
#0 11.14   Downloaded proc-macro2 v0.4.30
#0 11.14   Downloaded postgres-protocol v0.6.4
#0 11.15   Downloaded symlink v0.1.0
#0 11.15   Downloaded pbkdf2 v0.4.0
#0 11.15   Downloaded dir-diff v0.3.2
#0 11.16   Downloaded futures-util v0.3.24
#0 11.18   Downloaded futures-core v0.3.24
#0 11.18   Downloaded indicatif v0.16.2
#0 11.19   Downloaded histogram v0.6.9
#0 11.19   Downloaded event-listener v2.5.3
#0 11.20   Downloaded stable_deref_trait v1.2.0
#0 11.22   Downloaded libsecp256k1 v0.6.0
#0 11.22   Downloaded sea-orm v0.9.2
#0 11.23   Downloaded pear_codegen v0.2.3
#0 11.24   Downloaded figment v0.10.7
#0 11.29   Downloaded redis v0.21.6
#0 11.31   Downloaded parking_lot_core v0.9.3
#0 11.33   Downloaded zstd-sys v2.0.1+zstd.1.5.2
#0 11.37   Downloaded nix v0.23.1
#0 11.39   Downloaded time-macros v0.2.4
#0 11.39   Downloaded try-lock v0.2.3
#0 11.39   Downloaded spki v0.5.4
#0 11.40   Downloaded instant v0.1.12
#0 11.40   Downloaded rustc_version v0.4.0
#0 11.40   Downloaded remove_dir_all v0.5.3
#0 11.41   Downloaded futures-sink v0.3.24
#0 11.41   Downloaded time v0.3.14
#0 11.45   Downloaded rustls v0.20.6
#0 11.47   Downloaded enum-iterator v0.7.0
#0 11.48   Downloaded byteorder v1.4.3
#0 11.50   Downloaded rayon v1.5.3
#0 11.52   Downloaded rayon-core v1.9.3
#0 11.53   Downloaded feature-probe v0.1.1
#0 11.53   Downloaded rand_xoshiro v0.6.0
#0 11.54   Downloaded dlopen_derive v0.1.4
#0 11.56   Downloaded h2 v0.3.14
#0 11.58   Downloaded tempfile v3.3.0
#0 11.58   Downloaded sqlx-rt v0.6.2
#0 11.64   Downloaded uncased v0.9.7
#0 11.64   Downloaded parking_lot_core v0.8.5
#0 11.65   Downloaded sha2 v0.9.9
#0 11.66   Downloaded wasm-bindgen-backend v0.2.83
#0 11.68   Downloaded tokio-util v0.7.2
#0 11.69   Downloaded scopeguard v1.1.0
#0 11.70   Downloaded hashbrown v0.11.2
#0 11.72   Downloaded spl-token-2022 v0.2.0
#0 11.73   Downloaded synstructure v0.12.6
#0 11.73   Downloaded unicode-width v0.1.10
#0 11.74   Downloaded pem v1.1.0
#0 11.74   Downloaded enum-iterator-derive v0.7.0
#0 11.74   Downloaded rustls-pemfile v0.2.1
#0 11.74   Downloaded openssl-macros v0.1.0
#0 11.75   Downloaded tinyvec_macros v0.1.0
#0 11.75   Downloaded sea-orm-macros v0.9.2
#0 11.75   Downloaded futures-macro v0.3.24
#0 11.76   Downloaded solana-zk-token-sdk v1.10.33
#0 11.77   Downloaded time v0.1.44
#0 11.77   Downloaded futures-intrusive v0.4.0
#0 11.78   Downloaded num_enum_derive v0.5.7
#0 11.78   Downloaded libsecp256k1-gen-ecmult v0.2.1
#0 11.81   Downloaded http v0.2.8
#0 11.88   Downloaded whoami v1.2.3
#0 12.13   Downloaded rand_chacha v0.2.2
#0 12.13   Downloaded iana-time-zone v0.1.48
#0 12.17   Downloaded qstring v0.7.2
#0 12.17   Downloaded im v15.1.0
#0 12.38   Downloaded bzip2-sys v0.1.11+1.0.8
#0 12.40   Downloaded idna v0.3.0
#0 12.41   Downloaded ring v0.16.20
#0 12.53   Downloaded tokio v1.14.1
#0 12.77   Downloaded brotli v3.3.4
#0 12.88   Downloaded solana-zk-token-sdk v0.8.1
#0 12.96   Downloaded encoding_rs v0.8.31
#0 13.18    Compiling proc-macro2 v1.0.43
#0 13.19    Compiling unicode-ident v1.0.4
#0 13.19    Compiling quote v1.0.21
#0 13.19    Compiling syn v1.0.100
#0 13.41    Compiling version_check v0.9.4
#0 13.72    Compiling libc v0.2.133
#0 13.85    Compiling autocfg v1.1.0
#0 13.86    Compiling cfg-if v1.0.0
#0 13.96    Compiling serde_derive v1.0.144
#0 14.01    Compiling serde v1.0.144
#0 14.51    Compiling typenum v1.15.0
#0 14.51    Compiling once_cell v1.15.0
#0 14.54    Compiling memchr v2.5.0
#0 15.02    Compiling thiserror v1.0.35
#0 15.04    Compiling log v0.4.17
#0 15.07    Compiling scopeguard v1.1.0
#0 15.17    Compiling subtle v2.4.1
#0 15.42    Compiling semver v1.0.14
#0 15.49    Compiling ppv-lite86 v0.2.16
#0 15.60    Compiling base64 v0.13.0
#0 16.02    Compiling crossbeam-utils v0.8.11
#0 16.29    Compiling byteorder v1.4.3
#0 16.31    Compiling unicode-xid v0.2.4
#0 16.46    Compiling bitflags v1.3.2
#0 16.49    Compiling itoa v1.0.3
#0 16.58    Compiling crunchy v0.2.2
#0 16.63    Compiling getrandom v0.1.16
#0 16.71    Compiling opaque-debug v0.3.0
#0 16.75    Compiling rustversion v1.0.9
#0 16.82    Compiling lazy_static v1.4.0
#0 16.94    Compiling futures-core v0.3.24
#0 17.07    Compiling rayon-core v1.9.3
#0 17.10    Compiling block-padding v0.2.1
#0 17.37    Compiling arrayvec v0.7.2
#0 17.45    Compiling smallvec v1.9.0
#0 17.51    Compiling parking_lot_core v0.8.5
#0 17.51    Compiling wasm-bindgen-shared v0.2.83
#0 17.76    Compiling feature-probe v0.1.1
#0 17.80    Compiling bumpalo v3.11.0
#0 17.89    Compiling keccak v0.1.2
#0 18.07    Compiling pin-project-lite v0.2.9
#0 18.16    Compiling wasm-bindgen v0.2.83
#0 18.21    Compiling bs58 v0.4.0
#0 18.23    Compiling bytes v1.2.1
#0 18.52    Compiling arrayref v0.3.6
#0 18.56    Compiling base64 v0.12.3
#0 18.60    Compiling constant_time_eq v0.1.5
#0 18.78    Compiling percent-encoding v2.2.0
#0 19.18    Compiling ryu v1.0.11
#0 19.47    Compiling fnv v1.0.7
#0 19.48    Compiling serde_json v1.0.85
#0 19.62    Compiling tinyvec_macros v0.1.0
#0 19.63    Compiling futures-sink v0.3.24
#0 19.75    Compiling futures-channel v0.3.24
#0 19.79    Compiling regex-syntax v0.6.27
#0 19.88    Compiling futures-task v0.3.24
#0 20.13    Compiling iana-time-zone v0.1.48
#0 20.34    Compiling futures-util v0.3.24
#0 20.38    Compiling unicode-segmentation v1.10.0
#0 20.80    Compiling pin-utils v0.1.0
#0 20.97    Compiling futures-io v0.3.24
#0 21.46    Compiling signature v1.6.3
#0 21.67    Compiling spin v0.5.2
#0 21.84    Compiling untrusted v0.7.1
#0 21.95    Compiling termcolor v1.1.3
#0 22.08    Compiling humantime v2.1.0
#0 22.29    Compiling anyhow v1.0.65
#0 23.24    Compiling derivation-path v0.2.0
#0 23.37    Compiling assert_matches v1.5.0
#0 23.53    Compiling unicode-bidi v0.3.8
#0 23.92    Compiling rustls v0.20.6
#0 24.43    Compiling pkg-config v0.3.25
#0 25.65    Compiling openssl-probe v0.1.5
#0 25.82    Compiling httparse v1.8.0
#0 26.46    Compiling yansi v0.5.1
#0 26.49    Compiling foreign-types-shared v0.1.1
#0 26.66    Compiling openssl v0.10.41
#0 26.75    Compiling native-tls v0.2.10
#0 26.82    Compiling alloc-no-stdlib v2.0.4
#0 26.96    Compiling crc32fast v1.3.2
#0 27.18    Compiling time-macros v0.2.4
#0 27.22    Compiling try-lock v0.2.3
#0 27.57    Compiling httpdate v1.0.2
#0 27.58    Compiling adler v1.0.2
#0 27.99    Compiling tower-service v0.3.2
#0 28.14    Compiling encoding_rs v0.8.31
#0 28.51    Compiling bs58 v0.3.1
#0 28.55    Compiling mime v0.3.16
#0 28.97    Compiling num_threads v0.1.6
#0 29.66    Compiling minimal-lexical v0.2.1
#0 29.70    Compiling ipnet v2.5.0
#0 30.35    Compiling proc-macro2 v0.4.30
#0 30.43    Compiling unicode-xid v0.1.0
#0 30.68    Compiling rust_decimal v1.26.1
#0 31.09    Compiling unicode-width v0.1.10
#0 31.27    Compiling fastrand v1.8.0
#0 31.34    Compiling syn v0.15.44
#0 32.04    Compiling remove_dir_all v0.5.3
#0 32.14    Compiling crossbeam-queue v0.3.6
#0 32.17    Compiling parking_lot_core v0.9.3
#0 32.71    Compiling async-trait v0.1.57
#0 33.15    Compiling Inflector v0.11.4
#0 34.11    Compiling zstd-safe v5.0.2+zstd.1.5.2
#0 34.19    Compiling event-listener v2.5.3
#0 34.88    Compiling solana-perf v1.10.33
#0 35.82    Compiling aliasable v0.1.3
#0 36.25    Compiling ansi_term v0.12.1
#0 36.72    Compiling unicode_categories v0.1.1
#0 37.42    Compiling vec_map v0.8.2
#0 37.97    Compiling crc-catalog v2.1.0
#0 38.10    Compiling paste v1.0.9
#0 38.35    Compiling strsim v0.8.0
#0 40.35    Compiling whoami v1.2.3
#0 40.37    Compiling same-file v1.0.6
#0 40.72    Compiling rustc-hash v1.1.0
#0 40.80    Compiling const-oid v0.7.1
#0 40.80    Compiling linked-hash-map v0.5.6
#0 40.92    Compiling hex v0.4.3
#0 41.34    Compiling oid-registry v0.6.0
#0 41.48    Compiling static_assertions v1.1.0
#0 41.58    Compiling uuid v1.1.2
#0 41.73    Compiling base64ct v1.5.2
#0 42.41    Compiling stable_deref_trait v1.2.0
#0 42.57    Compiling inlinable_string v0.1.15
#0 42.63    Compiling data-encoding v2.3.2
#0 42.74    Compiling mpl-bubblegum v0.1.1
#0 42.76    Compiling sha1_smol v1.0.0
#0 43.30    Compiling fallible-iterator v0.2.0
#0 43.43    Compiling index_list v0.2.7
#0 43.58    Compiling siphasher v0.3.10
#0 43.78    Compiling symlink v0.1.0
#0 43.98    Compiling utf-8 v0.7.6
#0 44.05    Compiling number_prefix v0.4.0
#0 44.39    Compiling histogram v0.6.9
#0 44.68    Compiling instant v0.1.12
#0 44.70    Compiling libloading v0.7.3
#0 44.84    Compiling generic-array v0.14.6
#0 45.27    Compiling ahash v0.7.6
#0 45.40    Compiling im v15.1.0
#0 45.46    Compiling proc-macro2-diagnostics v0.9.1
#0 45.75    Compiling proc-macro-error-attr v1.0.4
#0 45.90    Compiling proc-macro-error v1.0.4
#0 45.94    Compiling unicase v2.6.0
#0 46.14    Compiling uncased v0.9.7
#0 46.34    Compiling figment v0.10.7
#0 46.51    Compiling num-traits v0.2.15
#0 46.59    Compiling memoffset v0.6.5
#0 46.83    Compiling crossbeam-epoch v0.9.10
#0 46.97    Compiling num-integer v0.1.45
#0 46.97    Compiling lock_api v0.4.9
#0 47.37    Compiling rayon v1.5.3
#0 47.44    Compiling indexmap v1.9.1
#0 47.54    Compiling tokio v1.14.1
#0 47.76    Compiling slab v0.4.7
#0 47.87    Compiling num-bigint v0.4.3
#0 48.31    Compiling num-bigint v0.2.6
#0 48.80    Compiling num-iter v0.1.43
#0 48.91    Compiling num-complex v0.2.4
#0 49.15    Compiling num-rational v0.2.4
#0 49.38    Compiling tracing-core v0.1.29
#0 49.84    Compiling rustls-pemfile v1.0.1
#0 49.88    Compiling rustls-pemfile v0.2.1
#0 49.91    Compiling pem v1.1.0
#0 51.27    Compiling fxhash v0.2.1
#0 51.50    Compiling bv v0.11.1
#0 51.53    Compiling qstring v0.7.2
#0 51.53    Compiling form_urlencoded v1.1.0
#0 51.76    Compiling uriparse v0.6.4
#0 51.92    Compiling http v0.2.8
#0 52.36    Compiling tinyvec v1.6.0
#0 53.32    Compiling heck v0.3.3
#0 53.60    Compiling heck v0.4.0
#0 53.92    Compiling ed25519 v1.5.2
#0 54.58    Compiling foreign-types v0.3.2
#0 54.59    Compiling alloc-stdlib v0.2.2
#0 54.78    Compiling miniz_oxide v0.5.4
#0 55.02    Compiling textwrap v0.11.0
#0 58.43    Compiling async-mutex v1.4.0
#0 58.54    Compiling crc v3.0.0
#0 58.90    Compiling walkdir v2.3.2
#0 59.35    Compiling der v0.5.1
#0 59.65    Compiling yaml-rust v0.4.5
#0 62.43    Compiling sha1 v0.6.1
#0 62.66    Compiling phf_shared v0.11.1
#0 70.04    Compiling rustls-native-certs v0.6.2
#0 72.70    Compiling http-body v0.4.5
#0 73.26    Compiling unicode-normalization v0.1.22
#0 74.24    Compiling brotli-decompressor v2.3.2
#0 77.05    Compiling dir-diff v0.3.2
#0 77.46    Compiling spki v0.5.4
#0 77.70    Compiling phf v0.11.1
#0 80.50    Compiling getrandom v0.2.7
#0 81.59    Compiling num_cpus v1.13.1
#0 83.18    Compiling cpufeatures v0.2.5
#0 83.90    Compiling memmap2 v0.5.7
#0 84.58    Compiling signal-hook-registry v1.4.0
#0 84.77    Compiling time v0.1.44
#0 86.97    Compiling atty v0.2.14
#0 87.16    Compiling socket2 v0.4.7
#0 87.56    Compiling time v0.3.14
#0 88.70    Compiling gethostname v0.2.3
#0 89.09    Compiling tempfile v3.3.0
#0 89.14    Compiling terminal_size v0.1.17
#0 89.36    Compiling dirs-sys v0.3.7
#0 90.58    Compiling dirs-sys-next v0.1.2
#0 91.20    Compiling xattr v0.2.3
#0 91.24    Compiling filetime v0.2.17
#0 92.76    Compiling aho-corasick v0.7.19
#0 93.07    Compiling nom v7.1.1
#0 93.60    Compiling jobserver v0.1.24
#0 97.68    Compiling mio v0.7.14
#0 97.99    Compiling want v0.3.0
#0 98.37    Compiling bitmaps v2.1.0
#0 99.35    Compiling rustc_version v0.4.0
#0 100.6    Compiling crossbeam-channel v0.5.6
#0 101.6    Compiling idna v0.3.0
#0 101.8    Compiling stringprep v0.1.2
#0 101.8    Compiling flate2 v1.0.24
#0 102.7    Compiling quote v0.6.13
#0 103.2    Compiling brotli v3.3.4
#0 107.9    Compiling mime_guess v2.0.4
#0 111.4    Compiling nix v0.23.1
#0 112.1    Compiling rand_core v0.6.4
#0 112.9    Compiling solana-rayon-threadlimit v1.10.33
#0 117.0    Compiling atoi v1.0.0
#0 117.6    Compiling rand_core v0.5.1
#0 118.0    Compiling clap v2.34.0
#0 118.5    Compiling console v0.15.1
#0 123.6    Compiling dirs v4.0.0
#0 124.1    Compiling yasna v0.5.0
#0 124.5    Compiling dirs-next v2.0.0
#0 125.0    Compiling tar v0.4.38
#0 127.2    Compiling parking_lot v0.11.2
#0 129.1    Compiling parking_lot v0.12.1
#0 130.9    Compiling regex v1.6.0
#0 131.6    Compiling cc v1.0.73
#0 133.7    Compiling rusticata-macros v4.1.0
#0 134.5    Compiling sized-chunks v0.6.5
#0 135.1    Compiling solana-frozen-abi-macro v1.10.33
#0 135.8    Compiling solana-frozen-abi v1.10.33
#0 136.4    Compiling solana-program v1.10.33
#0 136.8    Compiling solana-sdk v1.10.33
#0 137.3    Compiling solana-program-runtime v1.10.33
#0 137.9    Compiling solana-vote-program v1.10.33
#0 138.6    Compiling solana-stake-program v1.10.33
#0 139.0    Compiling solana-address-lookup-table-program v1.10.33
#0 139.1    Compiling solana-version v1.10.33
#0 139.4    Compiling solana-runtime v1.10.33
#0 139.9    Compiling cadence v0.29.0
#0 147.7    Compiling digest v0.9.0
#0 148.1    Compiling block-buffer v0.9.0
#0 148.4    Compiling block-buffer v0.10.3
#0 148.6    Compiling crypto-common v0.1.6
#0 148.9    Compiling url v2.3.1
#0 156.5    Compiling crossbeam-deque v0.8.2
#0 156.8    Compiling hashbrown v0.12.3
#0 157.4    Compiling hashbrown v0.11.2
#0 157.9    Compiling rand_xoshiro v0.6.0
#0 158.2    Compiling rand_chacha v0.3.1
#0 160.6    Compiling synstructure v0.12.6
#0 161.4    Compiling wasm-bindgen-backend v0.2.83
#0 162.4    Compiling borsh-schema-derive-internal v0.9.3
#0 162.9    Compiling borsh-derive-internal v0.9.3
#0 164.1    Compiling rand_chacha v0.2.2
#0 164.5    Compiling dotenvy v0.15.5
#0 166.2    Compiling thiserror-impl v1.0.35
#0 167.0    Compiling bytemuck_derive v1.2.1
#0 167.1    Compiling num-derive v0.3.3
#0 169.7    Compiling solana-sdk-macro v1.10.33
#0 169.7    Compiling tokio-macros v1.8.0
#0 170.1    Compiling futures-macro v0.3.24
#0 172.8    Compiling tracing-attributes v0.1.22
#0 173.2    Compiling openssl-macros v0.1.0
#0 173.3    Compiling enum-iterator-derive v0.7.0
#0 174.9    Compiling asn1-rs-impl v0.1.0
#0 175.3    Compiling displaydoc v0.2.3
#0 176.6    Compiling modular-bitfield-impl v0.11.2
#0 176.9    Compiling async-stream-impl v0.3.3
#0 177.0    Compiling strum_macros v0.24.3
#0 177.5    Compiling sea-strum_macros v0.23.0
#0 179.3    Compiling sea-query-driver v0.2.2
#0 180.3    Compiling enum_dispatch v0.3.8
#0 181.2    Compiling futures-intrusive v0.4.0
#0 182.2    Compiling chrono v0.4.22
#0 182.9    Compiling env_logger v0.9.1
#0 185.5    Compiling indicatif v0.16.2
#0 187.7    Compiling ring v0.16.20
#0 188.0    Compiling blake3 v1.3.1
#0 188.8    Compiling openssl-sys v0.9.75
#0 189.0    Compiling zstd-sys v2.0.1+zstd.1.5.2
#0 189.1    Compiling bzip2-sys v0.1.11+1.0.8
#0 189.9    Compiling lz4-sys v1.9.4
#0 191.0    Compiling cadence-macros v0.29.0
#0 191.1    Compiling libsecp256k1-core v0.2.2
#0 191.2    Compiling sha2 v0.9.9
#0 191.5    Compiling digest v0.10.5
#0 191.8    Compiling tokio-stream v0.1.10
#0 193.4    Compiling hashlink v0.8.1
#0 193.7    Compiling lru v0.7.8
#0 193.9    Compiling dlopen_derive v0.1.4
#0 194.0    Compiling rand v0.8.5
#0 195.4    Compiling zeroize_derive v1.3.2
#0 197.1    Compiling asn1-rs-derive v0.4.0
#0 197.7    Compiling wasm-bindgen-macro-support v0.2.83
#0 197.9    Compiling pear_codegen v0.2.3
#0 198.4    Compiling rand v0.7.3
#0 199.9    Compiling ouroboros_macro v0.14.2
#0 200.1    Compiling ouroboros_macro v0.15.5
#0 200.8    Compiling bae v0.1.7
#0 203.4    Compiling bytemuck v1.12.1
#0 214.4    Compiling enum-iterator v0.7.0
#0 214.6    Compiling tracing v0.1.36
#0 214.7    Compiling async-stream v0.3.3
#0 214.8    Compiling modular-bitfield v0.11.2
#0 214.9    Compiling strum v0.24.1
#0 215.2    Compiling sea-strum v0.23.0
#0 215.4    Compiling solana-logger v1.10.33
#0 220.9    Compiling hmac v0.12.1
#0 221.2    Compiling sha2 v0.10.6
#0 221.7    Compiling md-5 v0.10.4
#0 222.0    Compiling sha1 v0.10.5
#0 222.3    Compiling libsecp256k1-gen-ecmult v0.2.1
#0 222.5    Compiling libsecp256k1-gen-genmult v0.2.1
#0 222.6    Compiling dlopen v0.1.8
#0 222.9    Compiling num v0.2.1
#0 223.1    Compiling zeroize v1.3.0
#0 223.4    Compiling wasm-bindgen-macro v0.2.83
#0 223.4    Compiling pear v0.2.3
#0 226.1    Compiling sea-orm-macros v0.9.2
#0 226.3    Compiling caps v0.5.4
#0 227.1    Compiling asn1-rs v0.5.1
#0 229.2    Compiling flatbuffers v2.1.2
#0 230.7    Compiling sea-query-derive v0.2.0
#0 231.1    Compiling ouroboros v0.15.5
#0 231.4    Compiling ouroboros v0.14.2
#0 231.6    Compiling futures-executor v0.3.24
#0 232.6    Compiling toml v0.5.9
#0 235.9    Compiling either v1.8.0
#0 236.1    Compiling shank_macro_impl v0.0.9
#0 238.0    Compiling serde_bytes v0.11.7
#0 238.6    Compiling bincode v1.3.3
#0 240.6    Compiling serde_urlencoded v0.7.1
#0 245.7    Compiling serde_yaml v0.8.26
#0 245.9    Compiling async-compression v0.3.14
#0 247.6    Compiling tokio-util v0.7.2
#0 251.3    Compiling hkdf v0.12.3
#0 251.7    Compiling libsecp256k1 v0.6.0
#0 252.4    Compiling percentage v0.1.0
#0 252.5    Compiling merlin v3.0.0
#0 252.7    Compiling dialoguer v0.10.2
#0 253.9    Compiling pkcs8 v0.8.0
#0 261.7    Compiling der-parser v8.1.0
#0 263.5    Compiling plerkle_serialization v0.1.8
#0 265.4    Compiling plerkle_serialization v0.0.7
#0 265.9    Compiling futures v0.3.24
#0 266.1    Compiling proc-macro-crate v0.1.5
#0 266.2    Compiling proc-macro-crate v1.2.1
#0 266.8    Compiling anchor-syn v0.25.0
#0 267.1    Compiling itertools v0.10.5
#0 269.4    Compiling crypto-mac v0.8.0
#0 269.6    Compiling cipher v0.3.0
#0 270.0    Compiling universal-hash v0.4.1
#0 270.2    Compiling aead v0.4.3
#0 270.4    Compiling inout v0.1.3
#0 274.1    Compiling shank_macro v0.0.9
#0 274.4    Compiling rpassword v6.0.1
#0 275.6    Compiling sea-query v0.26.3
#0 276.1    Compiling jsonpath_lib v0.3.0
#0 276.5    Compiling tokio-test v0.4.2
#0 276.9    Compiling h2 v0.3.14
#0 280.6    Compiling combine v4.6.6
#0 294.0    Compiling webpki v0.22.0
#0 295.0    Compiling sct v0.7.0
#0 303.5    Compiling rcgen v0.9.3
#0 311.0    Compiling x509-parser v0.14.0
#0 313.3    Compiling jsonrpc-core v18.0.0
#0 313.5    Compiling borsh-derive v0.9.3
#0 316.1    Compiling num_enum_derive v0.5.7
#0 319.6    Compiling curve25519-dalek v3.2.1
#0 326.5    Compiling sha3 v0.9.1
#0 326.7    Compiling hmac v0.8.1
#0 327.0    Compiling pbkdf2 v0.4.0
#0 327.2    Compiling ctr v0.8.0
#0 327.8    Compiling aes v0.7.5
#0 328.1    Compiling sqlformat v0.2.0
#0 329.4    Compiling polyval v0.5.3
#0 330.0    Compiling cipher v0.4.3
#0 335.0    Compiling dashmap v4.0.2
#0 335.3    Compiling shank v0.0.9
#0 335.5    Compiling anchor-attribute-state v0.25.0
#0 335.8    Compiling anchor-attribute-error v0.25.0
#0 337.3    Compiling anchor-attribute-program v0.25.0
#0 338.6    Compiling anchor-attribute-interface v0.25.0
#0 340.1    Compiling anchor-attribute-access-control v0.25.0
#0 340.2    Compiling anchor-attribute-constant v0.25.0
#0 340.8    Compiling anchor-attribute-account v0.25.0
#0 341.1    Compiling anchor-derive-accounts v0.25.0
#0 341.3    Compiling anchor-attribute-event v0.25.0
#0 341.9    Compiling hyper v0.14.20
#0 344.0    Compiling webpki-roots v0.22.4
#0 344.3    Compiling redis v0.21.6
#0 351.6    Compiling borsh v0.9.3
#0 355.6    Compiling num_enum v0.5.7
#0 358.9    Compiling sha3 v0.10.5
#0 360.1    Compiling pbkdf2 v0.10.1
#0 360.5    Compiling sha-1 v0.10.0
#0 360.9    Compiling ed25519-dalek v1.0.1
#0 361.3    Compiling hmac-drbg v0.3.0
#0 361.5    Compiling tiny-bip39 v0.8.2
#0 362.0    Compiling aes-gcm-siv v0.10.3
#0 362.3    Compiling tokio-rustls v0.23.4
#0 362.7    Compiling quinn-proto v0.8.4
#0 365.6    Compiling plerkle_messenger v0.0.7
#0 365.9    Compiling tokio-native-tls v0.3.0
#0 366.7    Compiling postgres-protocol v0.6.4
#0 370.7    Compiling tungstenite v0.17.3
#0 371.1    Compiling ed25519-dalek-bip32 v0.2.0
#0 375.8    Compiling hyper-rustls v0.23.0
#0 376.5    Compiling sqlx-rt v0.6.2
#0 382.7    Compiling hyper-tls v0.5.0
#0 383.2    Compiling quinn-udp v0.1.3
#0 383.9    Compiling postgres-types v0.2.4
#0 385.6    Compiling tokio-tungstenite v0.17.2
#0 385.7    Compiling sqlx-core v0.6.2
#0 386.4    Compiling reqwest v0.11.12
#0 409.2    Compiling quinn v0.8.5
#0 410.5    Compiling tokio-postgres v0.7.7
#0 420.0    Compiling sqlx-macros v0.6.2
#0 427.4    Compiling sqlx v0.6.2
#0 428.0    Compiling sea-orm v0.9.2
#0 436.7    Compiling spl-token v3.3.0
#0 438.7    Compiling spl-memo v3.0.1
#0 439.2    Compiling anchor-lang v0.25.0
#0 442.1    Compiling spl-noop v0.1.0
#0 442.5    Compiling spl-concurrent-merkle-tree v0.1.0
#0 443.1    Compiling spl-concurrent-merkle-tree v0.1.0 (https://github.com/solana-labs/solana-program-library#e988b163)
#0 443.6    Compiling spl-associated-token-account v1.0.5
#0 443.9    Compiling mpl-token-vault v0.1.0
#0 444.9    Compiling spl-account-compression v0.1.0
#0 445.3    Compiling anchor-spl v0.25.0
#0 446.4    Compiling solana-measure v1.10.33
#0 446.6    Compiling solana-metrics v1.10.33
#0 447.3    Compiling solana-zk-token-sdk v0.8.1
#0 451.1    Compiling solana-zk-token-sdk v1.10.33
#0 455.9    Compiling solana-remote-wallet v1.10.33
#0 458.0    Compiling mpl-token-metadata v1.4.0
#0 461.7    Compiling solana-bucket-map v1.10.33
#0 463.3    Compiling solana-net-utils v1.10.33
#0 464.0    Compiling spl-token-2022 v0.2.0
#0 464.9    Compiling solana-config-program v1.10.33
#0 469.1    Compiling solana-compute-budget-program v1.10.33
#0 469.3    Compiling solana-zk-token-proof-program v1.10.33
#0 469.7    Compiling digital_asset_types v0.0.1 (/rust/digital_asset_types)
#0 470.3 error[E0277]: the trait bound `metaplex_anchor::MasterEdition: TokenMetadataAccount` is not satisfied
#0 470.3    --> /usr/local/cargo/registry/src/github.com-1ecc6299db9ec823/mpl-bubblegum-0.1.1/src/state/metaplex_anchor.rs:16:9
#0 470.3     |
#0 470.3 16  |         try_from_slice_checked(
#0 470.3     |         ^^^^^^^^^^^^^^^^^^^^^^ the trait `TokenMetadataAccount` is not implemented for `metaplex_anchor::MasterEdition`
#0 470.3     |
#0 470.3     = help: the following other types implement trait `TokenMetadataAccount`:
#0 470.3               Edition
#0 470.3               mpl_token_metadata::state::CollectionAuthorityRecord
#0 470.3               mpl_token_metadata::state::EditionMarker
#0 470.3               mpl_token_metadata::state::MasterEditionV1
#0 470.3               mpl_token_metadata::state::MasterEditionV2
#0 470.3               mpl_token_metadata::state::Metadata
#0 470.3               mpl_token_metadata::state::ReservationListV1
#0 470.3               mpl_token_metadata::state::ReservationListV2
#0 470.3               mpl_token_metadata::state::UseAuthorityRecord
#0 470.3 note: required by a bound in `try_from_slice_checked`
#0 470.3    --> /usr/local/cargo/registry/src/github.com-1ecc6299db9ec823/mpl-token-metadata-1.4.0/src/utils.rs:884:34
#0 470.3     |
#0 470.3 884 | pub fn try_from_slice_checked<T: TokenMetadataAccount>(
#0 470.3     |                                  ^^^^^^^^^^^^^^^^^^^^ required by this bound in `try_from_slice_checked`
#0 470.3 
#0 470.3 error[E0277]: the trait bound `TokenMetadata: TokenMetadataAccount` is not satisfied
#0 470.3    --> /usr/local/cargo/registry/src/github.com-1ecc6299db9ec823/mpl-bubblegum-0.1.1/src/state/metaplex_anchor.rs:46:9
#0 470.3     |
#0 470.3 46  |         try_from_slice_checked(
#0 470.3     |         ^^^^^^^^^^^^^^^^^^^^^^ the trait `TokenMetadataAccount` is not implemented for `TokenMetadata`
#0 470.3     |
#0 470.3     = help: the following other types implement trait `TokenMetadataAccount`:
#0 470.3               Edition
#0 470.3               mpl_token_metadata::state::CollectionAuthorityRecord
#0 470.3               mpl_token_metadata::state::EditionMarker
#0 470.3               mpl_token_metadata::state::MasterEditionV1
#0 470.3               mpl_token_metadata::state::MasterEditionV2
#0 470.3               mpl_token_metadata::state::Metadata
#0 470.3               mpl_token_metadata::state::ReservationListV1
#0 470.3               mpl_token_metadata::state::ReservationListV2
#0 470.3               mpl_token_metadata::state::UseAuthorityRecord
#0 470.3 note: required by a bound in `try_from_slice_checked`
#0 470.3    --> /usr/local/cargo/registry/src/github.com-1ecc6299db9ec823/mpl-token-metadata-1.4.0/src/utils.rs:884:34
#0 470.3     |
#0 470.3 884 | pub fn try_from_slice_checked<T: TokenMetadataAccount>(
#0 470.3     |                                  ^^^^^^^^^^^^^^^^^^^^ required by this bound in `try_from_slice_checked`
#0 470.3 
#0 470.6 For more information about this error, try `rustc --explain E0277`.
#0 470.6 error: could not compile `mpl-bubblegum` due to 2 previous errors
#0 470.6 warning: build failed, waiting for other jobs to finish...
#0 470.8 warning: unused import: `Links`
#0 470.8  --> /rust/digital_asset_types/src/dapi/asset.rs:4:90
#0 470.8   |
#0 470.8 4 |     Asset as RpcAsset, Authority, Compression, Content, Creator, File, Group, Interface, Links,
#0 470.8   |                                                                                          ^^^^^
#0 470.8   |
#0 470.8   = note: `#[warn(unused_imports)]` on by default
#0 470.8 
#0 470.8 warning: unnecessary parentheses around pattern
#0 470.8   --> /rust/digital_asset_types/src/dapi/listed_assets_by_owner.rs:83:63
#0 470.8    |
#0 470.8 83 |     let build_listings_list = filter_assets?.into_iter().map(|(asset)| async move {
#0 470.8    |                                                               ^     ^
#0 470.8    |
#0 470.8    = note: `#[warn(unused_parens)]` on by default
#0 470.8 help: remove these parentheses
#0 470.8    |
#0 470.8 83 -     let build_listings_list = filter_assets?.into_iter().map(|(asset)| async move {
#0 470.8 83 +     let build_listings_list = filter_assets?.into_iter().map(|asset| async move {
#0 470.8    |
#0 470.8 
#0 470.8 warning: unnecessary parentheses around pattern
#0 470.8   --> /rust/digital_asset_types/src/dapi/offers_by_owner.rs:71:63
#0 470.8    |
#0 470.8 71 |     let build_listings_list = filter_assets?.into_iter().map(|(asset)| async move {
#0 470.8    |                                                               ^     ^
#0 470.8    |
#0 470.8 help: remove these parentheses
#0 470.8    |
#0 470.8 71 -     let build_listings_list = filter_assets?.into_iter().map(|(asset)| async move {
#0 470.8 71 +     let build_listings_list = filter_assets?.into_iter().map(|asset| async move {
#0 470.8    |
#0 470.8 
#0 470.8 warning: unused imports: `ChainMutability`, `Mutability`
#0 470.8  --> /rust/digital_asset_types/src/rpc/asset.rs:2:40
#0 470.8   |
#0 470.8 2 | use crate::dao::sea_orm_active_enums::{ChainMutability, Mutability, OwnerType, RoyaltyTargetType};
#0 470.8   |                                        ^^^^^^^^^^^^^^^  ^^^^^^^^^^
#0 470.8 
#0 470.8 warning: unused import: `std::str::FromStr`
#0 470.8  --> /rust/digital_asset_types/src/rpc/asset.rs:3:5
#0 470.8   |
#0 470.8 3 | use std::str::FromStr;
#0 470.8   |     ^^^^^^^^^^^^^^^^^
#0 470.8 
#0 471.2 warning: unreachable expression
#0 471.2   --> /rust/digital_asset_types/src/dapi/listed_assets_by_owner.rs:86:23
#0 471.2    |
#0 471.2 85 |             listing_id: todo!(),
#0 471.2    |                         ------- any code following this expression is unreachable
#0 471.2 86 |             asset_id: todo!(),
#0 471.2    |                       ^^^^^^^ unreachable expression
#0 471.2    |
#0 471.2    = note: `#[warn(unreachable_code)]` on by default
#0 471.2    = note: this warning originates in the macro `todo` (in Nightly builds, run with -Z macro-backtrace for more info)
#0 471.2 
#0 471.2 warning: unreachable expression
#0 471.2   --> /rust/digital_asset_types/src/dapi/offers_by_owner.rs:74:21
#0 471.2    |
#0 471.2 73 |             from: todo!(),
#0 471.2    |                   ------- any code following this expression is unreachable
#0 471.2 74 |             amount: todo!(),
#0 471.2    |                     ^^^^^^^ unreachable expression
#0 471.2    |
#0 471.2    = note: this warning originates in the macro `todo` (in Nightly builds, run with -Z macro-backtrace for more info)
#0 471.2 
#0 471.6 warning: unused variable: `metadata`
#0 471.6   --> /rust/digital_asset_types/src/dapi/asset.rs:74:9
#0 471.6    |
#0 471.6 74 |     let metadata = safe_select(selector, "description");
#0 471.6    |         ^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_metadata`
#0 471.6    |
#0 471.6    = note: `#[warn(unused_variables)]` on by default
#0 471.6 
#0 471.6 warning: unused variable: `asset`
#0 471.6    --> /rust/digital_asset_types/src/dapi/asset.rs:122:20
#0 471.6     |
#0 471.6 122 | pub fn get_content(asset: &asset::Model, data: &asset_data::Model) -> Result<Content, DbErr> {
#0 471.6     |                    ^^^^^ help: if this is intentional, prefix it with an underscore: `_asset`
#0 471.6 
#0 471.6 warning: unused variable: `asset`
#0 471.6   --> /rust/digital_asset_types/src/dapi/listed_assets_by_owner.rs:83:64
#0 471.6    |
#0 471.6 83 |     let build_listings_list = filter_assets?.into_iter().map(|(asset)| async move {
#0 471.6    |                                                                ^^^^^ help: if this is intentional, prefix it with an underscore: `_asset`
#0 471.6 
#0 471.6 warning: unused variable: `sort_by`
#0 471.6   --> /rust/digital_asset_types/src/dapi/listed_assets_by_owner.rs:12:5
#0 471.6    |
#0 471.6 12 |     sort_by: ListingSorting,
#0 471.6    |     ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_sort_by`
#0 471.6 
#0 471.6 warning: unused variable: `asset`
#0 471.6   --> /rust/digital_asset_types/src/dapi/offers_by_owner.rs:71:64
#0 471.6    |
#0 471.6 71 |     let build_listings_list = filter_assets?.into_iter().map(|(asset)| async move {
#0 471.6    |                                                                ^^^^^ help: if this is intentional, prefix it with an underscore: `_asset`
#0 471.6 
#0 471.6 warning: unused variable: `sort_by`
#0 471.6   --> /rust/digital_asset_types/src/dapi/offers_by_owner.rs:12:5
#0 471.6    |
#0 471.6 12 |     sort_by: OfferSorting,
#0 471.6    |     ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_sort_by`
#0 471.6 
#0 475.9 warning: `digital_asset_types` (lib) generated 13 warnings
#0 482.7 thread 'main' panicked at 'Exited with status code: 101', /usr/local/cargo/registry/src/github.com-1ecc6299db9ec823/cargo-chef-0.1.41/src/recipe.rs:161:27
#0 482.7 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
------
failed to solve: executor failed running [/bin/sh -c cargo chef cook --release --recipe-path recipe.json]: exit code: 101

[Feature] Tree Sequence Based Backfilling

Issues

  1. Inefficiency in Bootstrapping: The current backfiller struggles to bootstrap a fresh DAS installation effectively. During transaction processing, an overwhelming influx of backfill_items congests the table. This situation leads to a backlog, as the backfiller cannot catch up with the initial tree discoveries at the start of the run.

    SELECT COUNT(backfilled), backfilled FROM backfill_items GROUP BY backfilled;
      count  | backfilled
    ---------+------------
     2430983 | f
          45 | t
    
  2. Ineffective Subsequent Backfill Attempts: After the initial setup, the backfiller's approach to identify transaction gaps is to sequentially scan blocks. This method often involves blocks with no relevant transactions for the targeted tree, resulting in inefficient processing and an inability to reach a completion state.

  3. Lack of Process Continuity: Currently, the backfiller lacks the capability to resume from its last state. If interrupted, it loses all progress and must restart from the beginning, further hindering the backfill completion.

Goals

  • Enable backfill tasks to resume from their last state, eliminating redundant work.
  • Optimize RPC queries to ensure data relevance and minimize discard.
  • Maximize task efficiency through concurrent or parallel execution.

Proposal

To address the inefficiencies and improve the continuity of the backfill process, we propose the following enhancements:

  1. Enhanced State Tracking for Trees: Develop a detailed recording system that captures every sequence change of a tree within the tree_sequences table. This table will serve as a ledger, logging each modification to the trees along with its associated metadata, such as the sequence number (seq), the public key of the tree (tree), the index of the leaf that triggered the change (leaf_idx), the transaction signature (signature), and the specific instruction identifier (instruction).

  2. Optimized RPC Queries: Utilize the getSignaturesForAddress RPC call with the before and until parameters to precisely target the transaction gaps for each tree. This will ensure that only relevant data is fetched, reducing unnecessary processing.

  3. Concurrent Processing: Introduce concurrent or parallel processing of backfill tasks to expedite the completion of the backfill process.

  4. Database Schema Update: Introduce a new table, tree_sequences, to track the sequence of changes for each tree. The schema for the tree_sequences table will be as follows:

CREATE TABLE tree_sequences (
    -- Composite primary key consisting of the sequence number and tree public key
    seq BIGINT NOT NULL,
    tree BYTEA NOT NULL,
    -- Index of the leaf causing the tree change
    leaf_idx BIGINT,
    -- Signature of the transaction associated with the instruction
    signature BYTEA NOT NULL,
    -- Identifier for the instruction
    instruction VARCHAR,
    PRIMARY KEY (seq, tree)
);
  1. Gap Identification and Filling: Perform a database query to identify sequence gaps for each tree. Utilize the getSignaturesForAddress RPC call, setting the until and before parameters to the known tree_sequences bounding the gap. A tree is considered up-to-date when the active sequence number on-chain matches the count of tree_sequences.

By implementing these enhancements, we aim to achieve a more efficient, focused, and resilient backfill process.

References

A sequence diagram outlining the current backfill implementation for those that are looking to ramp up on the topic.

sequenceDiagram
    participant Filler as Backfiller Filler Task
    participant Finder as Backfiller Finder Task
    participant DB as Database
    participant RPC as RPC Service
    participant Messenger as Messaging Service

    note over Filler: Periodically checks for trees to backfill
    Filler->>DB: Request trees to backfill
    DB-->>Filler: Return trees
    loop For each tree
        Filler->>DB: Check backfill strategy (from seq 1 or plug gaps)
        DB-->>Filler: Strategy info
        alt If backfill_from_seq_1 is true
            note right of Filler: backfill_from_seq_1 flag is set based on the tree's backfill requirements, determined earlier in the workflow
            Filler->>RPC: Call backfill_tree_from_seq_1 (RPC queries for full backfill)
            RPC-->>Filler: Block data for full backfill
            Filler->>DB: Update backfill items from sequence 1
        else If backfill_from_seq_1 is false
            Filler->>RPC: Call fetch_and_plug_gaps (RPC queries for specific gaps)
            RPC-->>Filler: Block data for specific gaps
            loop For each gap
                Filler->>+DB: Plug gap with data
                loop For each block in gap
                    Filler->>RPC: Fetch block transactions
                    RPC-->>Filler: Transactions data
                    loop For each transaction
                        Filler->>Filler: Check if transaction involves backfill tree
                        alt If transaction involves backfill tree
                            Filler->>Messenger: Submit encoded transaction to TXNFILL stream
                        end
                    end
                end
                DB-->>-Filler: Gap plugged
            end
        end
        Filler->>Messenger: Submit transactions to backfill
    end
    alt On success
        Filler->>DB: Clean up backfilled tree
    else On error
        Filler->>DB: Mark tree as failed (after retries)
    end

    note over Finder: Periodically looks for missing trees
    Finder->>RPC: fetch_trees_by_gpa (Get trees by GPA)
    RPC-->>Finder: Trees data
    Finder->>DB: Request locked/failed trees for filtering
    DB-->>Finder: Locked/Failed trees data
    Finder->>DB: Request missing trees based on filtered data
    DB-->>Finder: Return missing trees
    loop For each missing tree
        Finder->>DB: Set tree to backfill from 0
    end
    note over Filler, Finder: Handle errors and retries appropriately

Closed Token Accounts are not being indexed and removed from the token_accounts db

When a token account is closed, the event is passed through the NFT_ingester, and nothing is done with it.
nft_ingester/src/program_transformers/token/mod.rs

Ideally what it should do is delete the pertaining pubkey from the database in token_accounts, but its a little tricky because the given pubkey could be a mint or a tokenAccount since both types are owned by tokenKeg.

Either way, a mint key and a token account key cannot clash so a possible solution could be to delete from both databases. If the key is not present in either database, it'll be a noop.

Validator slot falling behind when enabled `nft_ingester`.

I've tried with solana v1.16.15 and v1.16.16, the validator gains slot slowly when the ingester is not active. But as soon as I turn the ingester on, validator starts falling behind on slots by a lot every minute. I run ingester, postgres, redis in the same server so I guess that can be the reason but shouldn't it still work properly with all of these on the same server?

Device Configuration

CPU AMD EPYC 7443P @ 4.04GHz (24 cores)
RAM - 512 GB
Disk - 2 X 4 TB NVMe
NICs - 10 Gbit/s + 1 Gbit/s
OS - Ubuntu 20.04

Replace `cl_audits` table with `tree_transactions`

Context

A cl_audit system was introduced in this PR #94 which keeps complete revision history of change logs for a tree where the cl_items tracks the current change history for the tree. The cl_audit records also record the corresponding transaction signature and instruction identifier.

The cl_audit records in upstream is a configurable feature that only adds the records but Helius has used these records to provide a getSignaturesForAsset method which returns a list of transaction signatures related to a leaf. https://github.com/rpcpool/digital-asset-rpc-infrastructure/blob/triton-build/digital_asset_types/src/dapi/signatures_for_asset.rs#L21

Issues

  • The cl_audits significantly increase the storage requirements for the indexer because its a complete revision history of change log items.
  • There is a bug causing duplicate cl_audit records #152

Proposal

Replace the writing of cl_audit with tree_sequence records. The tree_sequence tracks every sequence for a tree seen by the indexer with additional meta information like the transaction signature and instruction identifier (as currently recorded on cl_audits). Instead of writing n change log records per transaction with each sequence change write 1 record for the sequence change only.

CREATE TABLE tree_sequences (
    -- Composite primary key consisting of the sequence number and tree public key
    seq BIGINT NOT NULL,
    tree BYTEA NOT NULL,
    -- Index of the leaf causing the tree change
    leaf_idx BIGINT,
    -- Signature of the transaction associated with the instruction
    signature BYTEA NOT NULL,
    -- Identifier for the instruction
    instruction VARCHAR,
    PRIMARY KEY (seq, tree)
);

Uses

  • Maintain feature parity with the existing getSignaturesForAsset RPC method by providing transaction signatures for tree leaves.
  • Enhance tree backfilling and reporting capabilities by utilizing sequence information
    #150

Account stream length lower bounded at ~250 entries

Across our two envs we know have a baseline minimum of entries in the account stream. It keeps defaulting to having 218 and 243 entries in the account stream. These are two independent environments.

Adding this as a placeholder issue while we continue to investigate on our end.

Screenshot 2023-03-24 at 10 09 49

Reading from snapshot during the startup

Hey, guys. I'm encountering an issue while trying to read from the snapshot during startup. I'm attempting to backfill regular NFTs from the snapshot, but I couldn't find a way to do it.

Here are the relevant configurations:

"snapshot_url": "https://api.mainnet-beta.solana.com/snapshot.tar.bz2",
"snapshot_storage_path": "/solana/ledger",
"plugin_path": "/solana/target/release/plugin.so"

I've set these flags and compiled the geyser with the snapshot, but unfortunately, it didn't work. Would you please help me about that ?

Regular NFTs not showing up in DAS API

Regular NFTs are not showing up in the DAS API. Helius Labs is actively investigating

Current Findings:

  • NFT onchain and offchain data is indexed properly in primary and replica DB
  • NFTs that couldn't be queried by the API yesterday seem to appear today.

Example of a previous failure (now successful)

  • D1APVxjAiDwzFsPfhLbVyAC2xPyTaeAcCdGd2HYWfLjg

Examples of failures (as of writing)
-CnpYvDnvvWZtWbYMxP38wGPh1jY3rqvbKMS8R5ActZAG

Bug: Pagination limit error is a bit too vague

Currently, if you set limit to > 1000 (hardcoded for now), you will get back a RPC error message saying Pagination Error. Only one pagination parameter supported per query.. For a better user experience, this error message should be specific for the pagination limit.

Token accounts supply not set to 0 on ownership change

We have observed live that for SIngleOwner trad-NFTs (non compressed) the token account in the token_accounts table doesn't get the supply set to 0 for the previous token accounts on ownership change. This leaves multiple token accounts pointing at the same asset with supply > 0.

Decompression indexing authority

Looks like upon decompression the authority remains as the treeAuthority. I suppose this will be re-indexed via the regular NFT indexing though

Assets incorrectly has supply=0 meaning that assets available in DB cannot be found via API

We have found a number of assets that cannot be loaded via the API even though they exist in the DB.

Screenshot 2023-03-23 at 12 56 34

Two different DBs, both synced it seems and both having the asset EGtMB7dfSQPSmJq9ZKjLzpfd52DqzHRdhEDCJ5fFq62i however querying via das_api frontend:

$ bash get-asset.sh EGtMB7dfSQPSmJq9ZKjLzpfd52DqzHRdhEDCJ5fFq62i localhost:9090
+ curl localhost:9090 --data '
{
    "jsonrpc": "2.0",
    "method": "getAsset",
    "params": [
        "EGtMB7dfSQPSmJq9ZKjLzpfd52DqzHRdhEDCJ5fFq62i"
    ],
    "id": 0
}' -H 'Content-Type: application/json'

{"jsonrpc":"2.0","error":{"code":-32000,"message":"Database Error RecordNotFound Error: Asset Not Found"},"id":0}

Api: page 0 and 1 return the same items

Subtle bug, but requesting either page 0 or page 1 will give the exact same response in getAssetsByGroup and possibly other methods. page is a u32

All the code samples use page 0, so they're affected

`attributes` not showing up in `content.metadata`

{
    "jsonrpc": "2.0",
    "method": "get_assets_by_owner",
    "id": "rpd-op-124",
    "params": [
        "4u8n5oSQCvPSMMSAxnrC1jTJd44HuADKJchTspcNwEoS",
        "created",
        50,
        1,
        "",
        ""
    ]
}

the token with mint address DP9twYqeAaYfc9pPzyjrDj33qmHbphPJmkTT999Knp6Q should have attributes: [{trait_type: 'background', value: 'green'}] but the return value of content.metadata is:

"metadata": [
    {
        "$$schema": "description",
        "name": "NFT with own verified creator"
    },
    {
        "symbol": "",
        "$$schema": "symbol"
    }
]

proof

[Proposal] Project Structure and DAS Operations

Goal

Adopt a project structure that is well organized and has clear points of extension for new features so as reduce the time to onboard new developers as well as release features.

Reduce the operational complexity of running DAS by reduce the number of deployable binaries that need to be managed in order to run ingestion, api, and ops tools.

Proposal

  • Expose all functionality for das via a single cli and thus binary using the below folder structure.
core/ # contains shared modules used in ops, api, and ingest libraries
  src/
    types/ # move das_asset_types to this module
ops/ # subcommands for performing operational commands 
api/ # subcommand for starting api server
ingest/ # subcommand for running ingestion processes
cmd/ # single das binary that provides cli interface for running any das subcommand
  src/
    main.rs

An example main file for the cmd crate which exposes every other available command supported by das.

use anyhow::Result;
use das_api::{subcommand as api_subcommand, ApiCommand};
use das_ops::{subcommand as ops_subcommand, OpsCommand};
use das_ingest::{subcommand as ingest_subcommand, IngestCommand};
use das_sdk::{subcommand as sdk_subcommand, SdkCommand};
use clap::{Parser, Subcommand};

#[derive(Debug, Parser)]
#[clap(author, version)]
struct Args {
    #[command(subcommand)]
    command: Command,
}

#[derive(Debug, Subcommand)]
enum Command {
   Api(ApiCommand),
   Ops(OpsCommand),
   Ingest(IngestCommand),
   # potential new command for a read sdk
  Sdk(SdkCommand)
}


#[tokio::main]
async fn main() -> Result<()> {
    let args = Args::parse();

    env_logger::init();

    match args.command {
        Command::Api(subcommand) => api_subcommand(subcommand).await?,
        Command::Ops(subcommand) => ops_subcommand(subcommand).await?,
        Command::Ingest(subcommand) => ingest_subcommand(subcommand).await?,
        Command::Sdk(subcommand) => sdk_subcommand(subcommand).await?,
    }

    Ok(())
}

Some example commands exposed by the das binary.

das api serve # start read api server
das ops bubblegum backfill # backfill bubblegum transactions
das ops bubblegum report # compare index with chain and emit metric report
das ops push account {account} # push an account to the queue to be reindexed
das ops push transaction {signature} # push a transaction to the queue by its signature
das ingest accounts start --stream=ACCFILL # ingest accounts from the ACCFILL stream
das ingest transactions start --stream=TXN # ingest transactions from the TXN stream
das ingest metadata_json start # start workers for fetching and saving metadata json
das sdk get asset {} --das-api-endpoint= # print the response of getAsset using specified endpoint
  • Switch to clap for managing configuration arguments for all commands. Clap does not natively support file based config but could extend it though my recommendation is use clap as is meaning argument and environment based configuration.

Outcomes

  • Single binary to house all das functionality means das operators only need to manage a single container or build for performing all available tasks. Single binary simplifies the build process while allowing new subscommands or actions to be added by developers.
  • Clap makes exploring the available functionality of das intuitive and automatically document through help commands.

Store transaction status in plerkle serialised format

The plerkle serialisation format should contain transaction status so that we can check if the transaction is failed or not before we index it in nft_indexder. This way we can ensure that we avoid indexing issues.

Return metadata in raw format

Another proposal by @lorisleiva was to include the metadata with no processing/clean up under the compression section, to make it easier for users to get the exact metadata needed for instructions such as verify_creator that take MetadataArgs as an argument.

Then maybe the normal API could return a trimmed string, and under compression.metadata it could be the raw untrimmed version which should help with hashing? Just a thought, I know it doesn't resolve the talk about \0

Originally posted by @danenbm in #93 (comment)

[RFC] Solana Transaction Structures

Background

In Solana, the structure of transaction object ReplicaTransactionInfoVersions is optimized for minimal size. This optimization requires clients to deserialize the hierarchy of instruction executions by referencing indices and counters, such as index references to a shared list of account keys.

Issue

The current layout of instructions fails to accurately reflect invocations from nested (or inner) instructions due to its omission of the stack_height attribute that is now available. This oversight leads to DAS incorrectly categorizing instructions.

Suggested Improvement

We propose that, prior to the application of program transformers, Solana instructions be denormalized. This process should restructure the instructions to more precisely depict the parent-child relationships among them. The following Rust structs provide a conceptual framework for the suggested changes:

pub struct Instruction {
    pub program_id: Pubkey,
    pub data: Vec<u8>,
    pub instructions: Vec<Instruction>,
    pub accounts: Vec<Pubkey>,
}

pub struct Transaction {
    pub slot: Slot,
    pub block_time: Option<UnixTimestamp>,
    pub instructions: Vec<Instruction>,
    pub signatures: Vec<Signature>
}

For further discussion, please refer to the following pull request comment: GitHub Discussion.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.