diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 1fb299094..4ced2cd37 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -46,4 +46,4 @@ jobs:
 
       # clippy
       - name: Check clippy
-        run: cargo clippy --all-targets --tests
+        run: cargo clippy --all-targets --tests -- -Dwarnings
diff --git a/Cargo.lock b/Cargo.lock
index dad018aca..2b52079e1 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -18,8 +18,8 @@ version = "0.7.12"
 dependencies = [
  "anyhow",
  "bs58 0.4.0",
- "clap 4.4.18",
- "env_logger 0.10.2",
+ "clap 4.4.8",
+ "env_logger 0.10.0",
  "figment",
  "flatbuffers",
  "futures",
@@ -93,26 +93,25 @@ dependencies = [
 
 [[package]]
 name = "ahash"
-version = "0.7.7"
+version = "0.7.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd"
+checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47"
 dependencies = [
- "getrandom 0.2.12",
+ "getrandom 0.2.10",
  "once_cell",
  "version_check",
 ]
 
 [[package]]
 name = "ahash"
-version = "0.8.7"
+version = "0.8.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01"
+checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f"
 dependencies = [
  "cfg-if",
- "getrandom 0.2.12",
+ "getrandom 0.2.10",
  "once_cell",
  "version_check",
- "zerocopy",
 ]
 
 [[package]]
@@ -159,8 +158,8 @@ checksum = "faa5be5b72abea167f87c868379ba3c2be356bfca9e6f474fd055fa0f7eeb4f2"
 dependencies = [
  "anchor-syn",
  "anyhow",
- "proc-macro2 1.0.78",
- "quote 1.0.35",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
  "regex",
  "syn 1.0.109",
 ]
@@ -174,8 +173,8 @@ dependencies = [
  "anchor-syn",
  "anyhow",
  "bs58 0.5.0",
- "proc-macro2 1.0.78",
- "quote 1.0.35",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
  "rustversion",
  "syn 1.0.109",
 ]
@@ -187,7 +186,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "59948e7f9ef8144c2aefb3f32a40c5fce2798baeec765ba038389e82301017ef"
 dependencies = [
  "anchor-syn",
- "proc-macro2 1.0.78",
+ "proc-macro2 1.0.69",
  "syn 1.0.109",
 ]
 
@@ -198,8 +197,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "fc753c9d1c7981cb8948cf7e162fb0f64558999c0413058e2d43df1df5448086"
 dependencies = [
  "anchor-syn",
- "proc-macro2 1.0.78",
- "quote 1.0.35",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
  "syn 1.0.109",
 ]
 
@@ -211,8 +210,8 @@ checksum = "f38b4e172ba1b52078f53fdc9f11e3dc0668ad27997838a0aad2d148afac8c97"
 dependencies = [
  "anchor-syn",
  "anyhow",
- "proc-macro2 1.0.78",
- "quote 1.0.35",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
  "syn 1.0.109",
 ]
 
@@ -224,8 +223,8 @@ checksum = "4eebd21543606ab61e2d83d9da37d24d3886a49f390f9c43a1964735e8c0f0d5"
 dependencies = [
  "anchor-syn",
  "anyhow",
- "proc-macro2 1.0.78",
- "quote 1.0.35",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
  "syn 1.0.109",
 ]
 
@@ -256,8 +255,8 @@ checksum = "ec4720d899b3686396cced9508f23dab420f1308344456ec78ef76f98fda42af"
 dependencies = [
  "anchor-syn",
  "anyhow",
- "proc-macro2 1.0.78",
- "quote 1.0.35",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
  "syn 1.0.109",
 ]
 
@@ -267,8 +266,8 @@ version = "0.28.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "f495e85480bd96ddeb77b71d499247c7d4e8b501e75ecb234e9ef7ae7bd6552a"
 dependencies = [
- "proc-macro2 1.0.78",
- "quote 1.0.35",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
  "syn 1.0.109",
 ]
 
@@ -291,7 +290,7 @@ dependencies = [
  "bincode",
  "borsh 0.10.3",
  "bytemuck",
- "getrandom 0.2.12",
+ "getrandom 0.2.10",
  "solana-program",
  "thiserror",
 ]
@@ -305,8 +304,8 @@ dependencies = [
  "anyhow",
  "bs58 0.5.0",
  "heck 0.3.3",
- "proc-macro2 1.0.78",
- "quote 1.0.35",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
  "serde",
  "serde_json",
  "sha2 0.10.8",
@@ -340,9 +339,9 @@ dependencies = [
 
 [[package]]
 name = "anstream"
-version = "0.6.11"
+version = "0.6.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6e2e1ebcb11de5c03c67de28a7df593d32191b44939c482e97702baaaa6ab6a5"
+checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44"
 dependencies = [
  "anstyle",
  "anstyle-parse",
@@ -354,43 +353,43 @@ dependencies = [
 
 [[package]]
 name = "anstyle"
-version = "1.0.6"
+version = "1.0.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc"
+checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87"
 
 [[package]]
 name = "anstyle-parse"
-version = "0.2.3"
+version = "0.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c"
+checksum = "317b9a89c1868f5ea6ff1d9539a69f45dffc21ce321ac1fd1160dfa48c8e2140"
 dependencies = [
  "utf8parse",
 ]
 
 [[package]]
 name = "anstyle-query"
-version = "1.0.2"
+version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648"
+checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b"
 dependencies = [
- "windows-sys 0.52.0",
+ "windows-sys 0.48.0",
 ]
 
 [[package]]
 name = "anstyle-wincon"
-version = "3.0.2"
+version = "3.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7"
+checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628"
 dependencies = [
  "anstyle",
- "windows-sys 0.52.0",
+ "windows-sys 0.48.0",
 ]
 
 [[package]]
 name = "anyhow"
-version = "1.0.79"
+version = "1.0.75"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca"
+checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6"
 
 [[package]]
 name = "arc-swap"
@@ -452,7 +451,7 @@ version = "0.4.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348"
 dependencies = [
- "quote 1.0.35",
+ "quote 1.0.33",
  "syn 1.0.109",
 ]
 
@@ -464,8 +463,8 @@ checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565"
 dependencies = [
  "num-bigint 0.4.4",
  "num-traits",
- "proc-macro2 1.0.78",
- "quote 1.0.35",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
  "syn 1.0.109",
 ]
 
@@ -500,8 +499,8 @@ version = "0.4.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea"
 dependencies = [
- "proc-macro2 1.0.78",
- "quote 1.0.35",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
  "syn 1.0.109",
 ]
 
@@ -552,7 +551,7 @@ dependencies = [
  "num-traits",
  "rusticata-macros",
  "thiserror",
- "time 0.3.34",
+ "time 0.3.29",
 ]
 
 [[package]]
@@ -561,8 +560,8 @@ version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c"
 dependencies = [
- "proc-macro2 1.0.78",
- "quote 1.0.35",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
  "syn 1.0.109",
  "synstructure",
 ]
@@ -573,8 +572,8 @@ version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed"
 dependencies = [
- "proc-macro2 1.0.78",
- "quote 1.0.35",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
  "syn 1.0.109",
 ]
 
@@ -590,7 +589,7 @@ version = "1.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "a3203e79f4dd9bdda415ed03cf14dae5a2bf775c683a00f94e9cd1faf0f596e5"
 dependencies = [
- "quote 1.0.35",
+ "quote 1.0.33",
  "syn 1.0.109",
 ]
 
@@ -607,12 +606,12 @@ dependencies = [
 
 [[package]]
 name = "async-channel"
-version = "2.1.1"
+version = "2.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ca33f4bc4ed1babef42cad36cc1f51fa88be00420404e5b1e80ab1b18f7678c"
+checksum = "d37875bd9915b7d67c2f117ea2c30a0989874d0b2cb694fe25403c85763c0c9e"
 dependencies = [
  "concurrent-queue",
- "event-listener 4.0.3",
+ "event-listener 3.1.0",
  "event-listener-strategy",
  "futures-core",
  "pin-project-lite",
@@ -620,9 +619,9 @@ dependencies = [
 
 [[package]]
 name = "async-compression"
-version = "0.4.6"
+version = "0.4.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a116f46a969224200a0a97f29cfd4c50e7534e4b4826bd23ea2c3c533039c82c"
+checksum = "bb42b2197bf15ccb092b62c74515dbd8b86d0effd934795f6687c93b6e679a2c"
 dependencies = [
  "brotli",
  "flate2",
@@ -634,30 +633,30 @@ dependencies = [
 
 [[package]]
 name = "async-executor"
-version = "1.8.0"
+version = "1.7.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "17ae5ebefcc48e7452b4987947920dac9450be1110cadf34d1b8c116bdbaf97c"
+checksum = "fc5ea910c42e5ab19012bab31f53cb4d63d54c3a27730f9a833a88efcf4bb52d"
 dependencies = [
- "async-lock 3.3.0",
+ "async-lock 3.1.1",
  "async-task",
  "concurrent-queue",
  "fastrand 2.0.1",
- "futures-lite 2.2.0",
+ "futures-lite 2.0.1",
  "slab",
 ]
 
 [[package]]
 name = "async-global-executor"
-version = "2.4.1"
+version = "2.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c"
+checksum = "f1b6f5d7df27bd294849f8eec66ecfc63d11814df7a4f5d74168a2394467b776"
 dependencies = [
- "async-channel 2.1.1",
+ "async-channel 1.9.0",
  "async-executor",
- "async-io 2.3.1",
- "async-lock 3.3.0",
+ "async-io",
+ "async-lock 2.8.0",
  "blocking",
- "futures-lite 2.2.0",
+ "futures-lite 1.13.0",
  "once_cell",
  "tokio",
 ]
@@ -675,32 +674,13 @@ dependencies = [
  "futures-lite 1.13.0",
  "log",
  "parking",
- "polling 2.8.0",
+ "polling",
  "rustix 0.37.27",
  "slab",
- "socket2 0.4.10",
+ "socket2 0.4.9",
  "waker-fn",
 ]
 
-[[package]]
-name = "async-io"
-version = "2.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f97ab0c5b00a7cdbe5a371b9a782ee7be1316095885c8a4ea1daf490eb0ef65"
-dependencies = [
- "async-lock 3.3.0",
- "cfg-if",
- "concurrent-queue",
- "futures-io",
- "futures-lite 2.2.0",
- "parking",
- "polling 3.4.0",
- "rustix 0.38.31",
- "slab",
- "tracing",
- "windows-sys 0.52.0",
-]
-
 [[package]]
 name = "async-lock"
 version = "2.8.0"
@@ -712,11 +692,11 @@ dependencies = [
 
 [[package]]
 name = "async-lock"
-version = "3.3.0"
+version = "3.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d034b430882f8381900d3fe6f0aaa3ad94f2cb4ac519b429692a1bc2dda4ae7b"
+checksum = "655b9c7fe787d3b25cc0f804a1a8401790f0c5bc395beb5a64dc77d8de079105"
 dependencies = [
- "event-listener 4.0.3",
+ "event-listener 3.1.0",
  "event-listener-strategy",
  "pin-project-lite",
 ]
@@ -739,7 +719,7 @@ dependencies = [
  "async-attributes",
  "async-channel 1.9.0",
  "async-global-executor",
- "async-io 1.13.0",
+ "async-io",
  "async-lock 2.8.0",
  "crossbeam-utils",
  "futures-channel",
@@ -774,26 +754,26 @@ version = "0.3.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193"
 dependencies = [
- "proc-macro2 1.0.78",
- "quote 1.0.35",
- "syn 2.0.48",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
+ "syn 2.0.38",
 ]
 
 [[package]]
 name = "async-task"
-version = "4.7.0"
+version = "4.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fbb36e985947064623dbd357f727af08ffd077f93d696782f3c56365fa2e2799"
+checksum = "b4eb2cdb97421e01129ccb49169d8279ed21e829929144f4a22a6e54ac549ca1"
 
 [[package]]
 name = "async-trait"
-version = "0.1.77"
+version = "0.1.73"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9"
+checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0"
 dependencies = [
- "proc-macro2 1.0.78",
- "quote 1.0.35",
- "syn 2.0.48",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
+ "syn 2.0.38",
 ]
 
 [[package]]
@@ -878,8 +858,8 @@ checksum = "33b8de67cc41132507eeece2584804efcb15f85ba516e34c944b7667f480397a"
 dependencies = [
  "heck 0.3.3",
  "proc-macro-error",
- "proc-macro2 1.0.78",
- "quote 1.0.35",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
  "syn 1.0.109",
 ]
 
@@ -897,9 +877,9 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8"
 
 [[package]]
 name = "base64"
-version = "0.21.7"
+version = "0.21.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567"
+checksum = "9ba43ea6f343b788c8764558649e08df62f86c6ef251fdaeb1ffd010a9ae50a2"
 
 [[package]]
 name = "base64ct"
@@ -921,7 +901,7 @@ name = "bgtask_creator"
 version = "0.7.12"
 dependencies = [
  "anyhow",
- "clap 4.4.18",
+ "clap 4.4.8",
  "digital_asset_types",
  "futures",
  "lazy_static",
@@ -953,9 +933,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
 
 [[package]]
 name = "bitflags"
-version = "2.4.2"
+version = "2.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf"
+checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635"
 
 [[package]]
 name = "bitmaps"
@@ -1046,12 +1026,12 @@ version = "1.5.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "6a37913e8dc4ddcc604f0c6d3bf2887c995153af3611de9e23c352b44c1b9118"
 dependencies = [
- "async-channel 2.1.1",
- "async-lock 3.3.0",
+ "async-channel 2.1.0",
+ "async-lock 3.1.1",
  "async-task",
  "fastrand 2.0.1",
  "futures-io",
- "futures-lite 2.2.0",
+ "futures-lite 2.0.1",
  "piper",
  "tracing",
 ]
@@ -1076,16 +1056,6 @@ dependencies = [
  "hashbrown 0.13.2",
 ]
 
-[[package]]
-name = "borsh"
-version = "1.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f58b559fd6448c6e2fd0adb5720cd98a2506594cafa4737ff98c396f3e82f667"
-dependencies = [
- "borsh-derive 1.3.1",
- "cfg_aliases",
-]
-
 [[package]]
 name = "borsh-derive"
 version = "0.9.3"
@@ -1095,7 +1065,7 @@ dependencies = [
  "borsh-derive-internal 0.9.3",
  "borsh-schema-derive-internal 0.9.3",
  "proc-macro-crate 0.1.5",
- "proc-macro2 1.0.78",
+ "proc-macro2 1.0.69",
  "syn 1.0.109",
 ]
 
@@ -1108,32 +1078,18 @@ dependencies = [
  "borsh-derive-internal 0.10.3",
  "borsh-schema-derive-internal 0.10.3",
  "proc-macro-crate 0.1.5",
- "proc-macro2 1.0.78",
+ "proc-macro2 1.0.69",
  "syn 1.0.109",
 ]
 
-[[package]]
-name = "borsh-derive"
-version = "1.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7aadb5b6ccbd078890f6d7003694e33816e6b784358f18e15e7e6d9f065a57cd"
-dependencies = [
- "once_cell",
- "proc-macro-crate 3.1.0",
- "proc-macro2 1.0.78",
- "quote 1.0.35",
- "syn 2.0.48",
- "syn_derive",
-]
-
 [[package]]
 name = "borsh-derive-internal"
 version = "0.9.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "5449c28a7b352f2d1e592a8a28bf139bc71afb0764a14f3c02500935d8c44065"
 dependencies = [
- "proc-macro2 1.0.78",
- "quote 1.0.35",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
  "syn 1.0.109",
 ]
 
@@ -1143,8 +1099,8 @@ version = "0.10.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "afb438156919598d2c7bad7e1c0adf3d26ed3840dbc010db1a882a65583ca2fb"
 dependencies = [
- "proc-macro2 1.0.78",
- "quote 1.0.35",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
  "syn 1.0.109",
 ]
 
@@ -1154,8 +1110,8 @@ version = "0.9.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "cdbd5696d8bfa21d53d9fe39a714a18538bad11492a42d066dbbc395fb1951c0"
 dependencies = [
- "proc-macro2 1.0.78",
- "quote 1.0.35",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
  "syn 1.0.109",
 ]
 
@@ -1165,8 +1121,8 @@ version = "0.10.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "634205cc43f74a1b9046ef87c4540ebda95696ec0f315024860cad7c5b0f5ccd"
 dependencies = [
- "proc-macro2 1.0.78",
- "quote 1.0.35",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
  "syn 1.0.109",
 ]
 
@@ -1183,9 +1139,9 @@ dependencies = [
 
 [[package]]
 name = "brotli-decompressor"
-version = "2.5.1"
+version = "2.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4e2e4afe60d7dd600fdd3de8d0f08c2b7ec039712e3b6137ff98b7004e82de4f"
+checksum = "da74e2b81409b1b743f8f0c62cc6254afefb8b8e50bbfe3735550f7aeefa3448"
 dependencies = [
  "alloc-no-stdlib",
  "alloc-stdlib",
@@ -1208,9 +1164,9 @@ dependencies = [
 
 [[package]]
 name = "bstr"
-version = "1.9.0"
+version = "1.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c48f0051a4b4c5e0b6d365cd04af53aeaa209e3cc15ec2cdb69e73cc87fbd0dc"
+checksum = "542f33a8835a0884b006a0c3df3dadd99c0c3f296ed26c2fdc8028e01ad6230c"
 dependencies = [
  "memchr",
  "serde",
@@ -1234,9 +1190,9 @@ dependencies = [
 
 [[package]]
 name = "bytecheck"
-version = "0.6.12"
+version = "0.6.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2"
+checksum = "8b6372023ac861f6e6dc89c8344a8f398fb42aaba2b5dbc649ca0c0e9dbcb627"
 dependencies = [
  "bytecheck_derive",
  "ptr_meta",
@@ -1245,20 +1201,20 @@ dependencies = [
 
 [[package]]
 name = "bytecheck_derive"
-version = "0.6.12"
+version = "0.6.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659"
+checksum = "a7ec4c6f261935ad534c0c22dbef2201b45918860eb1c574b972bd213a76af61"
 dependencies = [
- "proc-macro2 1.0.78",
- "quote 1.0.35",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
  "syn 1.0.109",
 ]
 
 [[package]]
 name = "bytemuck"
-version = "1.14.1"
+version = "1.14.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed2490600f404f2b94c167e31d3ed1d5f3c225a0f3b80230053b3e0b7b962bd9"
+checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6"
 dependencies = [
  "bytemuck_derive",
 ]
@@ -1269,9 +1225,9 @@ version = "1.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "965ab7eb5f8f97d2a083c799f3a1b994fc397b2fe2da5d1da1626ce15a39f2b1"
 dependencies = [
- "proc-macro2 1.0.78",
- "quote 1.0.35",
- "syn 2.0.48",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
+ "syn 2.0.38",
 ]
 
 [[package]]
@@ -1330,17 +1286,11 @@ version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
 
-[[package]]
-name = "cfg_aliases"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e"
-
 [[package]]
 name = "chrono"
-version = "0.4.33"
+version = "0.4.31"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9f13690e35a5e4ace198e7beea2895d29f3a9cc55015fcebe6336bd2010af9eb"
+checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38"
 dependencies = [
  "android-tzdata",
  "iana-time-zone",
@@ -1348,7 +1298,7 @@ dependencies = [
  "num-traits",
  "serde",
  "wasm-bindgen",
- "windows-targets 0.52.0",
+ "windows-targets 0.48.5",
 ]
 
 [[package]]
@@ -1394,9 +1344,9 @@ dependencies = [
 
 [[package]]
 name = "clap"
-version = "4.4.18"
+version = "4.4.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e578d6ec4194633722ccf9544794b71b1385c3c027efe0c55db226fc880865c"
+checksum = "2275f18819641850fa26c89acc84d465c1bf91ce57bc2748b28c420473352f64"
 dependencies = [
  "clap_builder",
  "clap_derive 4.4.7",
@@ -1404,9 +1354,9 @@ dependencies = [
 
 [[package]]
 name = "clap_builder"
-version = "4.4.18"
+version = "4.4.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4df4df40ec50c46000231c914968278b1eb05098cf8f1b3a518a95030e71d1c7"
+checksum = "07cdf1b148b25c1e1f7a42225e30a0d99a615cd4637eae7365548dd4529b95bc"
 dependencies = [
  "anstream",
  "anstyle",
@@ -1422,8 +1372,8 @@ checksum = "ae6371b8bdc8b7d3959e9cf7b22d4435ef3e79e138688421ec654acf8c81b008"
 dependencies = [
  "heck 0.4.1",
  "proc-macro-error",
- "proc-macro2 1.0.78",
- "quote 1.0.35",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
  "syn 1.0.109",
 ]
 
@@ -1434,9 +1384,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442"
 dependencies = [
  "heck 0.4.1",
- "proc-macro2 1.0.78",
- "quote 1.0.35",
- "syn 2.0.48",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
+ "syn 2.0.38",
 ]
 
 [[package]]
@@ -1489,24 +1439,24 @@ dependencies = [
 
 [[package]]
 name = "concurrent-queue"
-version = "2.4.0"
+version = "2.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363"
+checksum = "f057a694a54f12365049b0958a1685bb52d567f5593b355fbf685838e873d400"
 dependencies = [
  "crossbeam-utils",
 ]
 
 [[package]]
 name = "console"
-version = "0.15.8"
+version = "0.15.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb"
+checksum = "c926e00cc70edefdc64d3a5ff31cc65bb97a3460097762bd23afb4d8145fccf8"
 dependencies = [
  "encode_unicode",
  "lazy_static",
  "libc",
  "unicode-width",
- "windows-sys 0.52.0",
+ "windows-sys 0.45.0",
 ]
 
 [[package]]
@@ -1543,9 +1493,9 @@ checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2"
 
 [[package]]
 name = "core-foundation"
-version = "0.9.4"
+version = "0.9.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f"
+checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146"
 dependencies = [
  "core-foundation-sys",
  "libc",
@@ -1553,15 +1503,15 @@ dependencies = [
 
 [[package]]
 name = "core-foundation-sys"
-version = "0.8.6"
+version = "0.8.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f"
+checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa"
 
 [[package]]
 name = "cpufeatures"
-version = "0.2.12"
+version = "0.2.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504"
+checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1"
 dependencies = [
  "libc",
 ]
@@ -1577,9 +1527,9 @@ dependencies = [
 
 [[package]]
 name = "crc-catalog"
-version = "2.4.0"
+version = "2.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5"
+checksum = "9cace84e55f07e7301bae1c519df89cdad8cc3cd868413d3fdbdeca9ff3db484"
 
 [[package]]
 name = "crc32fast"
@@ -1592,46 +1542,56 @@ dependencies = [
 
 [[package]]
 name = "crossbeam-channel"
-version = "0.5.11"
+version = "0.5.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "176dc175b78f56c0f321911d9c8eb2b77a78a4860b9c19db83835fea1a46649b"
+checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200"
 dependencies = [
+ "cfg-if",
  "crossbeam-utils",
 ]
 
 [[package]]
 name = "crossbeam-deque"
-version = "0.8.5"
+version = "0.8.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d"
+checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef"
 dependencies = [
+ "cfg-if",
  "crossbeam-epoch",
  "crossbeam-utils",
 ]
 
 [[package]]
 name = "crossbeam-epoch"
-version = "0.9.18"
+version = "0.9.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
+checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7"
 dependencies = [
+ "autocfg",
+ "cfg-if",
  "crossbeam-utils",
+ "memoffset 0.9.0",
+ "scopeguard",
 ]
 
 [[package]]
 name = "crossbeam-queue"
-version = "0.3.11"
+version = "0.3.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35"
+checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add"
 dependencies = [
+ "cfg-if",
  "crossbeam-utils",
 ]
 
 [[package]]
 name = "crossbeam-utils"
-version = "0.8.19"
+version = "0.8.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345"
+checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294"
+dependencies = [
+ "cfg-if",
+]
 
 [[package]]
 name = "crunchy"
@@ -1684,9 +1644,9 @@ dependencies = [
 
 [[package]]
 name = "darling"
-version = "0.20.5"
+version = "0.20.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fc5d6b04b3fd0ba9926f945895de7d806260a2d7431ba82e7edaecb043c4c6b8"
+checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e"
 dependencies = [
  "darling_core",
  "darling_macro",
@@ -1694,27 +1654,27 @@ dependencies = [
 
 [[package]]
 name = "darling_core"
-version = "0.20.5"
+version = "0.20.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "04e48a959bcd5c761246f5d090ebc2fbf7b9cd527a492b07a67510c108f1e7e3"
+checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621"
 dependencies = [
  "fnv",
  "ident_case",
- "proc-macro2 1.0.78",
- "quote 1.0.35",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
  "strsim 0.10.0",
- "syn 2.0.48",
+ "syn 2.0.38",
 ]
 
 [[package]]
 name = "darling_macro"
-version = "0.20.5"
+version = "0.20.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1d1545d67a2149e1d93b7e5c7752dce5a7426eb5d1357ddcfd89336b94444f77"
+checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5"
 dependencies = [
  "darling_core",
- "quote 1.0.35",
- "syn 2.0.48",
+ "quote 1.0.33",
+ "syn 2.0.38",
 ]
 
 [[package]]
@@ -1724,7 +1684,7 @@ dependencies = [
  "anyhow",
  "cadence",
  "cadence-macros",
- "clap 4.4.18",
+ "clap 4.4.8",
  "sqlx",
 ]
 
@@ -1733,49 +1693,31 @@ name = "das-ops"
 version = "0.7.2"
 dependencies = [
  "anchor-client",
- "anchor-lang",
  "anyhow",
  "backon",
- "base64 0.21.7",
  "borsh 0.10.3",
- "bs58 0.4.0",
  "cadence",
  "cadence-macros",
- "chrono",
- "clap 4.4.18",
+ "clap 4.4.8",
  "das-core",
  "digital_asset_types",
- "env_logger 0.10.2",
+ "env_logger 0.10.0",
  "figment",
  "flatbuffers",
  "futures",
- "futures-util",
  "indicatif",
- "lazy_static",
  "log",
  "mpl-bubblegum",
  "plerkle_messenger",
  "plerkle_serialization",
- "redis",
- "regex",
- "reqwest",
- "rust-crypto",
  "sea-orm",
- "sea-query 0.28.5",
- "serde",
- "serde_json",
  "solana-account-decoder",
  "solana-client",
  "solana-sdk",
  "solana-transaction-status",
  "spl-account-compression",
- "spl-concurrent-merkle-tree",
- "sqlx",
  "thiserror",
  "tokio",
- "tokio-postgres",
- "url",
- "uuid",
 ]
 
 [[package]]
@@ -1789,7 +1731,7 @@ dependencies = [
  "cadence",
  "cadence-macros",
  "digital_asset_types",
- "env_logger 0.10.2",
+ "env_logger 0.10.0",
  "figment",
  "hyper",
  "jsonrpsee",
@@ -1809,7 +1751,6 @@ dependencies = [
  "sqlx",
  "thiserror",
  "tokio",
- "tokio-postgres",
  "tower",
  "tower-http",
  "tracing",
@@ -1822,17 +1763,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856"
 dependencies = [
  "cfg-if",
- "hashbrown 0.14.3",
+ "hashbrown 0.14.1",
  "lock_api",
  "once_cell",
- "parking_lot_core 0.9.9",
+ "parking_lot_core 0.9.8",
 ]
 
 [[package]]
 name = "data-encoding"
-version = "2.5.0"
+version = "2.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5"
+checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308"
 
 [[package]]
 name = "der"
@@ -1859,11 +1800,10 @@ dependencies = [
 
 [[package]]
 name = "deranged"
-version = "0.3.11"
+version = "0.3.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4"
+checksum = "f2696e8a945f658fd14dc3b87242e6b80cd0f36ff04ea560fa39082368847946"
 dependencies = [
- "powerfmt",
  "serde",
 ]
 
@@ -1879,16 +1819,16 @@ version = "2.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b"
 dependencies = [
- "proc-macro2 1.0.78",
- "quote 1.0.35",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
  "syn 1.0.109",
 ]
 
 [[package]]
 name = "deunicode"
-version = "1.4.2"
+version = "1.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3ae2a35373c5c74340b79ae6780b498b2b183915ec5dacf263aac5a099bf485a"
+checksum = "6a1abaf4d861455be59f64fd2b55606cb151fce304ede7165f410243ce96bde6"
 
 [[package]]
 name = "dialoguer"
@@ -1977,9 +1917,9 @@ version = "0.2.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d"
 dependencies = [
- "proc-macro2 1.0.78",
- "quote 1.0.35",
- "syn 2.0.48",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
+ "syn 2.0.38",
 ]
 
 [[package]]
@@ -2013,9 +1953,9 @@ checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b"
 
 [[package]]
 name = "dyn-clone"
-version = "1.0.16"
+version = "1.0.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "545b22097d44f8a9581187cdf93de7a71e4722bf51200cfaba810865b49a495d"
+checksum = "23d2f3407d9a573d666de4b5bdf10569d73ca9478087346697dcbae6244bfbcd"
 
 [[package]]
 name = "eager"
@@ -2084,22 +2024,22 @@ dependencies = [
 
 [[package]]
 name = "enum-iterator"
-version = "1.5.0"
+version = "1.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9fd242f399be1da0a5354aa462d57b4ab2b4ee0683cc552f7c007d2d12d36e94"
+checksum = "7add3873b5dd076766ee79c8e406ad1a472c385476b9e38849f8eec24f1be689"
 dependencies = [
  "enum-iterator-derive",
 ]
 
 [[package]]
 name = "enum-iterator-derive"
-version = "1.3.0"
+version = "1.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "03cdc46ec28bd728e67540c528013c6a10eb69a02eb31078a1bda695438cbfb8"
+checksum = "eecf8589574ce9b895052fa12d69af7a233f99e6107f5cb8dd1044f2a17bfdcb"
 dependencies = [
- "proc-macro2 1.0.78",
- "quote 1.0.35",
- "syn 2.0.48",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
+ "syn 2.0.38",
 ]
 
 [[package]]
@@ -2117,9 +2057,9 @@ dependencies = [
 
 [[package]]
 name = "env_logger"
-version = "0.10.2"
+version = "0.10.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580"
+checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0"
 dependencies = [
  "humantime",
  "is-terminal",
@@ -2136,12 +2076,12 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
 
 [[package]]
 name = "errno"
-version = "0.3.8"
+version = "0.3.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245"
+checksum = "ac3e13f66a2f95e32a39eaa81f6b95d42878ca0e1db0c7543723dfe12557e860"
 dependencies = [
  "libc",
- "windows-sys 0.52.0",
+ "windows-sys 0.48.0",
 ]
 
 [[package]]
@@ -2152,9 +2092,9 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0"
 
 [[package]]
 name = "event-listener"
-version = "4.0.3"
+version = "3.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e"
+checksum = "d93877bcde0eb80ca09131a08d23f0a5c18a620b01db137dba666d18cd9b30c2"
 dependencies = [
  "concurrent-queue",
  "parking",
@@ -2163,30 +2103,24 @@ dependencies = [
 
 [[package]]
 name = "event-listener-strategy"
-version = "0.4.0"
+version = "0.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3"
+checksum = "d96b852f1345da36d551b9473fa1e2b1eb5c5195585c6c018118bc92a8d91160"
 dependencies = [
- "event-listener 4.0.3",
+ "event-listener 3.1.0",
  "pin-project-lite",
 ]
 
 [[package]]
 name = "fake"
-version = "2.9.2"
+version = "2.9.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1c25829bde82205da46e1823b2259db6273379f626fc211f126f65654a2669be"
+checksum = "26221445034074d46b276e13eb97a265ebdb8ed8da705c4dddd3dd20b66b45d2"
 dependencies = [
  "deunicode",
  "rand 0.8.5",
 ]
 
-[[package]]
-name = "fallible-iterator"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7"
-
 [[package]]
 name = "fastrand"
 version = "1.9.0"
@@ -2215,7 +2149,7 @@ dependencies = [
  "anyhow",
  "async-trait",
  "borsh 0.10.3",
- "clap 4.4.18",
+ "clap 4.4.8",
  "mpl-bubblegum",
  "solana-account-decoder",
  "solana-client",
@@ -2226,15 +2160,15 @@ dependencies = [
 
 [[package]]
 name = "figment"
-version = "0.10.14"
+version = "0.10.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2b6e5bc7bd59d60d0d45a6ccab6cf0f4ce28698fb4e81e750ddf229c9b824026"
+checksum = "a014ac935975a70ad13a3bff2463b1c1b083b35ae4cb6309cfc59476aa7a181f"
 dependencies = [
  "atomic 0.6.0",
  "pear",
  "serde",
  "serde_yaml",
- "toml 0.8.10",
+ "toml 0.8.8",
  "uncased",
  "version_check",
 ]
@@ -2257,9 +2191,9 @@ dependencies = [
 
 [[package]]
 name = "flate2"
-version = "1.0.28"
+version = "1.0.27"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e"
+checksum = "c6c98ee8095e9d1dcbf2fcc6d95acccb90d1c81db1e44725c6a984b1dbdfb010"
 dependencies = [
  "crc32fast",
  "miniz_oxide",
@@ -2288,9 +2222,9 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
 
 [[package]]
 name = "form_urlencoded"
-version = "1.2.1"
+version = "1.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456"
+checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652"
 dependencies = [
  "percent-encoding",
 ]
@@ -2324,9 +2258,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c"
 
 [[package]]
 name = "futures"
-version = "0.3.30"
+version = "0.3.28"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0"
+checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40"
 dependencies = [
  "futures-channel",
  "futures-core",
@@ -2339,9 +2273,9 @@ dependencies = [
 
 [[package]]
 name = "futures-channel"
-version = "0.3.30"
+version = "0.3.28"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78"
+checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2"
 dependencies = [
  "futures-core",
  "futures-sink",
@@ -2349,15 +2283,15 @@ dependencies = [
 
 [[package]]
 name = "futures-core"
-version = "0.3.30"
+version = "0.3.28"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d"
+checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c"
 
 [[package]]
 name = "futures-executor"
-version = "0.3.30"
+version = "0.3.28"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d"
+checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0"
 dependencies = [
  "futures-core",
  "futures-task",
@@ -2377,9 +2311,9 @@ dependencies = [
 
 [[package]]
 name = "futures-io"
-version = "0.3.30"
+version = "0.3.28"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1"
+checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964"
 
 [[package]]
 name = "futures-lite"
@@ -2398,45 +2332,46 @@ dependencies = [
 
 [[package]]
 name = "futures-lite"
-version = "2.2.0"
+version = "2.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "445ba825b27408685aaecefd65178908c36c6e96aaf6d8599419d46e624192ba"
+checksum = "d3831c2651acb5177cbd83943f3d9c8912c5ad03c76afcc0e9511ba568ec5ebb"
 dependencies = [
  "fastrand 2.0.1",
  "futures-core",
  "futures-io",
+ "memchr",
  "parking",
  "pin-project-lite",
 ]
 
 [[package]]
 name = "futures-macro"
-version = "0.3.30"
+version = "0.3.28"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac"
+checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72"
 dependencies = [
- "proc-macro2 1.0.78",
- "quote 1.0.35",
- "syn 2.0.48",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
+ "syn 2.0.38",
 ]
 
 [[package]]
 name = "futures-sink"
-version = "0.3.30"
+version = "0.3.28"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5"
+checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e"
 
 [[package]]
 name = "futures-task"
-version = "0.3.30"
+version = "0.3.28"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004"
+checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65"
 
 [[package]]
 name = "futures-util"
-version = "0.3.30"
+version = "0.3.28"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48"
+checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533"
 dependencies = [
  "futures-channel",
  "futures-core",
@@ -2492,9 +2427,9 @@ dependencies = [
 
 [[package]]
 name = "getrandom"
-version = "0.2.12"
+version = "0.2.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5"
+checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427"
 dependencies = [
  "cfg-if",
  "js-sys",
@@ -2505,21 +2440,21 @@ dependencies = [
 
 [[package]]
 name = "gimli"
-version = "0.28.1"
+version = "0.28.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253"
+checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0"
 
 [[package]]
 name = "globset"
-version = "0.4.14"
+version = "0.4.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1"
+checksum = "759c97c1e17c55525b57192c06a267cda0ac5210b222d6b82189a2338fa1c13d"
 dependencies = [
  "aho-corasick",
  "bstr",
+ "fnv",
  "log",
- "regex-automata 0.4.5",
- "regex-syntax 0.8.2",
+ "regex",
 ]
 
 [[package]]
@@ -2547,9 +2482,9 @@ dependencies = [
 
 [[package]]
 name = "h2"
-version = "0.3.24"
+version = "0.3.21"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9"
+checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833"
 dependencies = [
  "bytes",
  "fnv",
@@ -2557,7 +2492,7 @@ dependencies = [
  "futures-sink",
  "futures-util",
  "http",
- "indexmap 2.2.2",
+ "indexmap 1.9.3",
  "slab",
  "tokio",
  "tokio-util",
@@ -2579,7 +2514,7 @@ version = "0.11.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e"
 dependencies = [
- "ahash 0.7.7",
+ "ahash 0.7.6",
 ]
 
 [[package]]
@@ -2588,7 +2523,7 @@ version = "0.12.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
 dependencies = [
- "ahash 0.7.7",
+ "ahash 0.7.6",
 ]
 
 [[package]]
@@ -2597,16 +2532,16 @@ version = "0.13.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e"
 dependencies = [
- "ahash 0.8.7",
+ "ahash 0.8.3",
 ]
 
 [[package]]
 name = "hashbrown"
-version = "0.14.3"
+version = "0.14.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604"
+checksum = "7dfda62a12f55daeae5015f81b0baea145391cb4520f86c248fc615d72640d12"
 dependencies = [
- "ahash 0.8.7",
+ "ahash 0.8.3",
  "allocator-api2",
 ]
 
@@ -2616,7 +2551,7 @@ version = "0.8.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7"
 dependencies = [
- "hashbrown 0.14.3",
+ "hashbrown 0.14.1",
 ]
 
 [[package]]
@@ -2648,9 +2583,9 @@ dependencies = [
 
 [[package]]
 name = "hermit-abi"
-version = "0.3.5"
+version = "0.3.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d0c62115964e08cb8039170eb33c1d0e2388a256930279edca206fff675f82c3"
+checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7"
 
 [[package]]
 name = "hex"
@@ -2666,9 +2601,9 @@ checksum = "12cb882ccb290b8646e554b157ab0b71e64e8d5bef775cd66b6531e52d302669"
 
 [[package]]
 name = "hkdf"
-version = "0.12.4"
+version = "0.12.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7"
+checksum = "791a029f6b9fc27657f6f188ec6e5e43f6911f6f878e0dc5501396e09809d437"
 dependencies = [
  "hmac 0.12.1",
 ]
@@ -2705,9 +2640,9 @@ dependencies = [
 
 [[package]]
 name = "http"
-version = "0.2.11"
+version = "0.2.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb"
+checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482"
 dependencies = [
  "bytes",
  "fnv",
@@ -2716,9 +2651,9 @@ dependencies = [
 
 [[package]]
 name = "http-body"
-version = "0.4.6"
+version = "0.4.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2"
+checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1"
 dependencies = [
  "bytes",
  "http",
@@ -2751,9 +2686,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
 
 [[package]]
 name = "hyper"
-version = "0.14.28"
+version = "0.14.27"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80"
+checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468"
 dependencies = [
  "bytes",
  "futures-channel",
@@ -2766,7 +2701,7 @@ dependencies = [
  "httpdate",
  "itoa",
  "pin-project-lite",
- "socket2 0.5.5",
+ "socket2 0.4.9",
  "tokio",
  "tower-service",
  "tracing",
@@ -2775,14 +2710,14 @@ dependencies = [
 
 [[package]]
 name = "hyper-rustls"
-version = "0.24.2"
+version = "0.24.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590"
+checksum = "8d78e1e73ec14cf7375674f74d7dde185c8206fd9dea6fb6295e8a98098aaa97"
 dependencies = [
  "futures-util",
  "http",
  "hyper",
- "rustls 0.21.10",
+ "rustls 0.21.7",
  "tokio",
  "tokio-rustls 0.24.1",
 ]
@@ -2802,16 +2737,16 @@ dependencies = [
 
 [[package]]
 name = "iana-time-zone"
-version = "0.1.60"
+version = "0.1.57"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141"
+checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613"
 dependencies = [
  "android_system_properties",
  "core-foundation-sys",
  "iana-time-zone-haiku",
  "js-sys",
  "wasm-bindgen",
- "windows-core",
+ "windows",
 ]
 
 [[package]]
@@ -2831,9 +2766,9 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
 
 [[package]]
 name = "idna"
-version = "0.5.0"
+version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6"
+checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c"
 dependencies = [
  "unicode-bidi",
  "unicode-normalization",
@@ -2868,12 +2803,12 @@ dependencies = [
 
 [[package]]
 name = "indexmap"
-version = "2.2.2"
+version = "2.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "824b2ae422412366ba479e8111fd301f7b5faece8149317bb81925979a53f520"
+checksum = "8adf3ddd720272c6ea8bf59463c04e0f93d0bbf7c5439b691bca2987e0270897"
 dependencies = [
  "equivalent",
- "hashbrown 0.14.3",
+ "hashbrown 0.14.1",
  "serde",
 ]
 
@@ -2886,7 +2821,7 @@ dependencies = [
  "console",
  "instant",
  "number_prefix",
- "portable-atomic 1.6.0",
+ "portable-atomic 1.4.3",
  "unicode-width",
 ]
 
@@ -2927,11 +2862,9 @@ dependencies = [
  "borsh 0.10.3",
  "das_api",
  "digital_asset_types",
- "env_logger 0.10.2",
- "figment",
  "flatbuffers",
  "function_name",
- "futures-util",
+ "futures",
  "insta",
  "itertools 0.10.5",
  "log",
@@ -2939,8 +2872,8 @@ dependencies = [
  "mpl-token-metadata",
  "nft_ingester",
  "once_cell",
- "plerkle_messenger",
  "plerkle_serialization",
+ "program_transformers",
  "sea-orm",
  "serde",
  "serde_json",
@@ -2961,26 +2894,26 @@ version = "1.0.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2"
 dependencies = [
- "hermit-abi 0.3.5",
+ "hermit-abi 0.3.3",
  "libc",
  "windows-sys 0.48.0",
 ]
 
 [[package]]
 name = "ipnet"
-version = "2.9.0"
+version = "2.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3"
+checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6"
 
 [[package]]
 name = "is-terminal"
-version = "0.4.10"
+version = "0.4.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0bad00257d07be169d870ab665980b06cdb366d792ad690bf2e76876dc503455"
+checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b"
 dependencies = [
- "hermit-abi 0.3.5",
- "rustix 0.38.31",
- "windows-sys 0.52.0",
+ "hermit-abi 0.3.3",
+ "rustix 0.38.18",
+ "windows-sys 0.48.0",
 ]
 
 [[package]]
@@ -2994,33 +2927,33 @@ dependencies = [
 
 [[package]]
 name = "itertools"
-version = "0.12.1"
+version = "0.11.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569"
+checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57"
 dependencies = [
  "either",
 ]
 
 [[package]]
 name = "itoa"
-version = "1.0.10"
+version = "1.0.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c"
+checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38"
 
 [[package]]
 name = "jobserver"
-version = "0.1.27"
+version = "0.1.26"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d"
+checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2"
 dependencies = [
  "libc",
 ]
 
 [[package]]
 name = "js-sys"
-version = "0.3.68"
+version = "0.3.64"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "406cda4b368d531c842222cf9d2600a9a4acce8d29423695379c6868a143a9ee"
+checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a"
 dependencies = [
  "wasm-bindgen",
 ]
@@ -3098,8 +3031,8 @@ checksum = "44e8ab85614a08792b9bff6c8feee23be78c98d0182d4c622c05256ab553892a"
 dependencies = [
  "heck 0.4.1",
  "proc-macro-crate 1.3.1",
- "proc-macro2 1.0.78",
- "quote 1.0.35",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
  "syn 1.0.109",
 ]
 
@@ -3141,18 +3074,18 @@ dependencies = [
 
 [[package]]
 name = "kaigan"
-version = "0.2.4"
+version = "0.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e623cca1f0e2a0919032c1bdabbf81dd9aa34658d5066aca7bb90d608317ab91"
+checksum = "4a26f49495f94a283312e7ef45a243540ef20c9356bb01c8d84a61ac8ba5339b"
 dependencies = [
  "borsh 0.10.3",
 ]
 
 [[package]]
 name = "keccak"
-version = "0.1.5"
+version = "0.1.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654"
+checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940"
 dependencies = [
  "cpufeatures",
 ]
@@ -3174,20 +3107,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
 
 [[package]]
 name = "libc"
-version = "0.2.153"
+version = "0.2.149"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd"
-
-[[package]]
-name = "libredox"
-version = "0.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8"
-dependencies = [
- "bitflags 2.4.2",
- "libc",
- "redox_syscall 0.4.1",
-]
+checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b"
 
 [[package]]
 name = "libsecp256k1"
@@ -3251,9 +3173,9 @@ checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519"
 
 [[package]]
 name = "linux-raw-sys"
-version = "0.4.13"
+version = "0.4.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c"
+checksum = "da2479e8c062e40bf0066ffa0bc823de0a9368974af99c9f6df941d2c231e03f"
 
 [[package]]
 name = "load_generation"
@@ -3272,9 +3194,9 @@ dependencies = [
 
 [[package]]
 name = "lock_api"
-version = "0.4.11"
+version = "0.4.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45"
+checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16"
 dependencies = [
  "autocfg",
  "scopeguard",
@@ -3310,9 +3232,9 @@ dependencies = [
 
 [[package]]
 name = "memchr"
-version = "2.7.1"
+version = "2.6.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149"
+checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167"
 
 [[package]]
 name = "memmap2"
@@ -3371,7 +3293,7 @@ version = "0.20.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "7b9b8653cec6897f73b519a43fba5ee3d50f62fe9af80b428accdcc093b4a849"
 dependencies = [
- "ahash 0.7.7",
+ "ahash 0.7.6",
  "metrics-macros",
  "portable-atomic 0.3.20",
 ]
@@ -3382,8 +3304,8 @@ version = "0.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "731f8ecebd9f3a4aa847dfe75455e4757a45da40a7793d2f0b1f9b6ed18b23f3"
 dependencies = [
- "proc-macro2 1.0.78",
- "quote 1.0.35",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
  "syn 1.0.109",
 ]
 
@@ -3421,18 +3343,18 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
 
 [[package]]
 name = "miniz_oxide"
-version = "0.7.2"
+version = "0.7.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7"
+checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7"
 dependencies = [
  "adler",
 ]
 
 [[package]]
 name = "mio"
-version = "0.8.10"
+version = "0.8.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09"
+checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2"
 dependencies = [
  "libc",
  "wasi 0.11.0+wasi-snapshot-preview1",
@@ -3490,57 +3412,40 @@ dependencies = [
 name = "nft_ingester"
 version = "0.7.2"
 dependencies = [
- "anchor-lang",
  "async-trait",
- "base64 0.21.7",
  "blockbuster",
  "borsh 0.10.3",
  "bs58 0.4.0",
  "cadence",
  "cadence-macros",
  "chrono",
- "clap 4.4.18",
+ "clap 4.4.8",
  "digital_asset_types",
- "env_logger 0.10.2",
  "figment",
  "flatbuffers",
  "futures",
- "futures-util",
- "hex",
- "lazy_static",
  "log",
  "mpl-bubblegum",
- "num-integer",
- "num-traits",
  "plerkle_messenger",
  "plerkle_serialization",
+ "program_transformers",
  "rand 0.8.5",
- "redis",
- "regex",
  "reqwest",
  "rust-crypto",
  "sea-orm",
- "sea-query 0.28.5",
  "serde",
  "serde_json",
  "solana-account-decoder",
  "solana-client",
- "solana-geyser-plugin-interface",
  "solana-sdk",
- "solana-sdk-macro",
  "solana-transaction-status",
  "spl-account-compression",
- "spl-concurrent-merkle-tree",
- "spl-token",
  "sqlx",
  "stretto",
  "thiserror",
  "tokio",
- "tokio-postgres",
- "tokio-stream",
  "tracing-subscriber",
  "url",
- "uuid",
 ]
 
 [[package]]
@@ -3622,32 +3527,26 @@ dependencies = [
  "num-traits",
 ]
 
-[[package]]
-name = "num-conv"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9"
-
 [[package]]
 name = "num-derive"
 version = "0.3.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d"
 dependencies = [
- "proc-macro2 1.0.78",
- "quote 1.0.35",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
  "syn 1.0.109",
 ]
 
 [[package]]
 name = "num-derive"
-version = "0.4.2"
+version = "0.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202"
+checksum = "cfb77679af88f8b125209d354a202862602672222e7f2313fdd6dc349bad4712"
 dependencies = [
- "proc-macro2 1.0.78",
- "quote 1.0.35",
- "syn 2.0.48",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
+ "syn 2.0.38",
 ]
 
 [[package]]
@@ -3698,7 +3597,7 @@ version = "1.16.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43"
 dependencies = [
- "hermit-abi 0.3.5",
+ "hermit-abi 0.3.3",
  "libc",
 ]
 
@@ -3713,11 +3612,11 @@ dependencies = [
 
 [[package]]
 name = "num_enum"
-version = "0.7.2"
+version = "0.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845"
+checksum = "70bf6736f74634d299d00086f02986875b3c2d924781a6a2cb6c201e73da0ceb"
 dependencies = [
- "num_enum_derive 0.7.2",
+ "num_enum_derive 0.7.0",
 ]
 
 [[package]]
@@ -3727,21 +3626,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6"
 dependencies = [
  "proc-macro-crate 1.3.1",
- "proc-macro2 1.0.78",
- "quote 1.0.35",
- "syn 2.0.48",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
+ "syn 2.0.38",
 ]
 
 [[package]]
 name = "num_enum_derive"
-version = "0.7.2"
+version = "0.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b"
+checksum = "56ea360eafe1022f7cc56cd7b869ed57330fb2453d0c7831d99b74c65d2f5597"
 dependencies = [
- "proc-macro-crate 3.1.0",
- "proc-macro2 1.0.78",
- "quote 1.0.35",
- "syn 2.0.48",
+ "proc-macro-crate 1.3.1",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
+ "syn 2.0.38",
 ]
 
 [[package]]
@@ -3752,9 +3651,9 @@ checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3"
 
 [[package]]
 name = "object"
-version = "0.32.2"
+version = "0.32.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441"
+checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0"
 dependencies = [
  "memchr",
 ]
@@ -3787,8 +3686,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ae3de03a56750973a83c76a40fb4b81969d42fad152cd0e787e25c79dcf54e3f"
 dependencies = [
  "open-rpc-schema",
- "proc-macro2 1.0.78",
- "quote 1.0.35",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
  "syn 1.0.109",
 ]
 
@@ -3806,11 +3705,11 @@ dependencies = [
 
 [[package]]
 name = "openssl"
-version = "0.10.63"
+version = "0.10.57"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "15c9d69dd87a29568d4d017cfe8ec518706046a05184e5aea92d0af890b803c8"
+checksum = "bac25ee399abb46215765b1cb35bc0212377e58a061560d8b29b024fd0430e7c"
 dependencies = [
- "bitflags 2.4.2",
+ "bitflags 2.4.0",
  "cfg-if",
  "foreign-types",
  "libc",
@@ -3825,9 +3724,9 @@ version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
 dependencies = [
- "proc-macro2 1.0.78",
- "quote 1.0.35",
- "syn 2.0.48",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
+ "syn 2.0.38",
 ]
 
 [[package]]
@@ -3838,9 +3737,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
 
 [[package]]
 name = "openssl-sys"
-version = "0.9.99"
+version = "0.9.93"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "22e1bf214306098e4832460f797824c05d25aacdf896f64a985fb0fd992454ae"
+checksum = "db4d56a4c0478783083cfafcc42493dd4a981d41669da64b4572a2a089b51b1d"
 dependencies = [
  "cc",
  "libc",
@@ -3872,8 +3771,8 @@ checksum = "5f7d21ccd03305a674437ee1248f3ab5d4b1db095cf1caf49f1713ddf61956b7"
 dependencies = [
  "Inflector",
  "proc-macro-error",
- "proc-macro2 1.0.78",
- "quote 1.0.35",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
  "syn 1.0.109",
 ]
 
@@ -3907,7 +3806,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
 dependencies = [
  "lock_api",
- "parking_lot_core 0.9.9",
+ "parking_lot_core 0.9.8",
 ]
 
 [[package]]
@@ -3926,13 +3825,13 @@ dependencies = [
 
 [[package]]
 name = "parking_lot_core"
-version = "0.9.9"
+version = "0.9.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e"
+checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447"
 dependencies = [
  "cfg-if",
  "libc",
- "redox_syscall 0.4.1",
+ "redox_syscall 0.3.5",
  "smallvec",
  "windows-targets 0.48.5",
 ]
@@ -3963,9 +3862,9 @@ dependencies = [
 
 [[package]]
 name = "pear"
-version = "0.2.8"
+version = "0.2.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4ccca0f6c17acc81df8e242ed473ec144cbf5c98037e69aa6d144780aad103c8"
+checksum = "61a386cd715229d399604b50d1361683fe687066f42d56f54be995bc6868f71c"
 dependencies = [
  "inlinable_string",
  "pear_codegen",
@@ -3974,14 +3873,14 @@ dependencies = [
 
 [[package]]
 name = "pear_codegen"
-version = "0.2.8"
+version = "0.2.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2e22670e8eb757cff11d6c199ca7b987f352f0346e0be4dd23869ec72cb53c77"
+checksum = "da9f0f13dac8069c139e8300a6510e3f4143ecf5259c60b116a9b271b4ca0d54"
 dependencies = [
- "proc-macro2 1.0.78",
+ "proc-macro2 1.0.69",
  "proc-macro2-diagnostics",
- "quote 1.0.35",
- "syn 2.0.48",
+ "quote 1.0.33",
+ "syn 2.0.38",
 ]
 
 [[package]]
@@ -3995,9 +3894,9 @@ dependencies = [
 
 [[package]]
 name = "percent-encoding"
-version = "2.3.1"
+version = "2.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
+checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94"
 
 [[package]]
 name = "percentage"
@@ -4008,24 +3907,6 @@ dependencies = [
  "num",
 ]
 
-[[package]]
-name = "phf"
-version = "0.11.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc"
-dependencies = [
- "phf_shared",
-]
-
-[[package]]
-name = "phf_shared"
-version = "0.11.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b"
-dependencies = [
- "siphasher",
-]
-
 [[package]]
 name = "pin-project"
 version = "1.1.4"
@@ -4041,9 +3922,9 @@ version = "1.1.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "266c042b60c9c76b8d53061e52b2e0d1116abc57cefc8c5cd671619a56ac3690"
 dependencies = [
- "proc-macro2 1.0.78",
- "quote 1.0.35",
- "syn 2.0.48",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
+ "syn 2.0.38",
 ]
 
 [[package]]
@@ -4082,9 +3963,9 @@ dependencies = [
 
 [[package]]
 name = "pkg-config"
-version = "0.3.29"
+version = "0.3.27"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2900ede94e305130c13ddd391e0ab7cbaeb783945ae07a279c268cb05109c6cb"
+checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964"
 
 [[package]]
 name = "plain"
@@ -4142,20 +4023,6 @@ dependencies = [
  "windows-sys 0.48.0",
 ]
 
-[[package]]
-name = "polling"
-version = "3.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "30054e72317ab98eddd8561db0f6524df3367636884b7b21b703e4b280a84a14"
-dependencies = [
- "cfg-if",
- "concurrent-queue",
- "pin-project-lite",
- "rustix 0.38.31",
- "tracing",
- "windows-sys 0.52.0",
-]
-
 [[package]]
 name = "polyval"
 version = "0.5.3"
@@ -4174,49 +4041,14 @@ version = "0.3.20"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e30165d31df606f5726b090ec7592c308a0eaf61721ff64c9a3018e344a8753e"
 dependencies = [
- "portable-atomic 1.6.0",
+ "portable-atomic 1.4.3",
 ]
 
 [[package]]
 name = "portable-atomic"
-version = "1.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0"
-
-[[package]]
-name = "postgres-protocol"
-version = "0.6.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49b6c5ef183cd3ab4ba005f1ca64c21e8bd97ce4699cfea9e8d9a2c4958ca520"
-dependencies = [
- "base64 0.21.7",
- "byteorder",
- "bytes",
- "fallible-iterator",
- "hmac 0.12.1",
- "md-5",
- "memchr",
- "rand 0.8.5",
- "sha2 0.10.8",
- "stringprep",
-]
-
-[[package]]
-name = "postgres-types"
-version = "0.2.6"
+version = "1.4.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8d2234cdee9408b523530a9b6d2d6b373d1db34f6a8e51dc03ded1828d7fb67c"
-dependencies = [
- "bytes",
- "fallible-iterator",
- "postgres-protocol",
-]
-
-[[package]]
-name = "powerfmt"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
+checksum = "31114a898e107c51bb1609ffaf55a0e011cf6a4d7f1170d0015a165082c0338b"
 
 [[package]]
 name = "ppv-lite86"
@@ -4243,15 +4075,6 @@ dependencies = [
  "toml_edit 0.19.15",
 ]
 
-[[package]]
-name = "proc-macro-crate"
-version = "3.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284"
-dependencies = [
- "toml_edit 0.21.1",
-]
-
 [[package]]
 name = "proc-macro-error"
 version = "1.0.4"
@@ -4259,8 +4082,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
 dependencies = [
  "proc-macro-error-attr",
- "proc-macro2 1.0.78",
- "quote 1.0.35",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
  "syn 1.0.109",
  "version_check",
 ]
@@ -4271,8 +4094,8 @@ version = "1.0.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
 dependencies = [
- "proc-macro2 1.0.78",
- "quote 1.0.35",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
  "version_check",
 ]
 
@@ -4287,9 +4110,9 @@ dependencies = [
 
 [[package]]
 name = "proc-macro2"
-version = "1.0.78"
+version = "1.0.69"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae"
+checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da"
 dependencies = [
  "unicode-ident",
 ]
@@ -4300,13 +4123,37 @@ version = "0.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8"
 dependencies = [
- "proc-macro2 1.0.78",
- "quote 1.0.35",
- "syn 2.0.48",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
+ "syn 2.0.38",
  "version_check",
  "yansi",
 ]
 
+[[package]]
+name = "program_transformers"
+version = "0.7.2"
+dependencies = [
+ "blockbuster",
+ "bs58 0.4.0",
+ "cadence",
+ "cadence-macros",
+ "digital_asset_types",
+ "futures",
+ "mpl-bubblegum",
+ "num-traits",
+ "plerkle_serialization",
+ "sea-orm",
+ "serde_json",
+ "solana-sdk",
+ "spl-account-compression",
+ "spl-token",
+ "sqlx",
+ "thiserror",
+ "tokio",
+ "tracing",
+]
+
 [[package]]
 name = "prometheus"
 version = "0.13.3"
@@ -4353,8 +4200,8 @@ version = "0.1.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac"
 dependencies = [
- "proc-macro2 1.0.78",
- "quote 1.0.35",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
  "syn 1.0.109",
 ]
 
@@ -4412,7 +4259,7 @@ checksum = "641538578b21f5e5c8ea733b736895576d0fe329bb883b937db6f4d163dbaaf4"
 dependencies = [
  "libc",
  "quinn-proto",
- "socket2 0.4.10",
+ "socket2 0.4.9",
  "tracing",
  "windows-sys 0.42.0",
 ]
@@ -4428,11 +4275,11 @@ dependencies = [
 
 [[package]]
 name = "quote"
-version = "1.0.35"
+version = "1.0.33"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef"
+checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
 dependencies = [
- "proc-macro2 1.0.78",
+ "proc-macro2 1.0.69",
 ]
 
 [[package]]
@@ -4538,7 +4385,7 @@ version = "0.6.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
 dependencies = [
- "getrandom 0.2.12",
+ "getrandom 0.2.10",
 ]
 
 [[package]]
@@ -4561,9 +4408,9 @@ dependencies = [
 
 [[package]]
 name = "rayon"
-version = "1.8.1"
+version = "1.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fa7237101a77a10773db45d62004a272517633fbcc3df19d96455ede1122e051"
+checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1"
 dependencies = [
  "either",
  "rayon-core",
@@ -4571,9 +4418,9 @@ dependencies = [
 
 [[package]]
 name = "rayon-core"
-version = "1.12.1"
+version = "1.12.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2"
+checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed"
 dependencies = [
  "crossbeam-deque",
  "crossbeam-utils",
@@ -4587,7 +4434,7 @@ checksum = "ffbe84efe2f38dea12e9bfc1f65377fdf03e53a18cb3b995faedf7934c7e785b"
 dependencies = [
  "pem",
  "ring 0.16.20",
- "time 0.3.34",
+ "time 0.3.29",
  "yasna",
 ]
 
@@ -4635,34 +4482,34 @@ dependencies = [
 
 [[package]]
 name = "redox_syscall"
-version = "0.4.1"
+version = "0.3.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa"
+checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"
 dependencies = [
  "bitflags 1.3.2",
 ]
 
 [[package]]
 name = "redox_users"
-version = "0.4.4"
+version = "0.4.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4"
+checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b"
 dependencies = [
- "getrandom 0.2.12",
- "libredox",
+ "getrandom 0.2.10",
+ "redox_syscall 0.2.16",
  "thiserror",
 ]
 
 [[package]]
 name = "regex"
-version = "1.10.3"
+version = "1.9.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15"
+checksum = "ebee201405406dbf528b8b672104ae6d6d63e6d118cb10e4d51abbc7b58044ff"
 dependencies = [
  "aho-corasick",
  "memchr",
- "regex-automata 0.4.5",
- "regex-syntax 0.8.2",
+ "regex-automata 0.3.9",
+ "regex-syntax 0.7.5",
 ]
 
 [[package]]
@@ -4676,13 +4523,13 @@ dependencies = [
 
 [[package]]
 name = "regex-automata"
-version = "0.4.5"
+version = "0.3.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd"
+checksum = "59b23e92ee4318893fa3fe3e6fb365258efbfe6ac6ab30f090cdcbb7aa37efa9"
 dependencies = [
  "aho-corasick",
  "memchr",
- "regex-syntax 0.8.2",
+ "regex-syntax 0.7.5",
 ]
 
 [[package]]
@@ -4693,27 +4540,27 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
 
 [[package]]
 name = "regex-syntax"
-version = "0.8.2"
+version = "0.7.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f"
+checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da"
 
 [[package]]
 name = "rend"
-version = "0.4.2"
+version = "0.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c"
+checksum = "a2571463863a6bd50c32f94402933f03457a3fbaf697a707c5be741e459f08fd"
 dependencies = [
  "bytecheck",
 ]
 
 [[package]]
 name = "reqwest"
-version = "0.11.24"
+version = "0.11.22"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c6920094eb85afde5e4a138be3f2de8bbdf28000f0029e72c45025a56b042251"
+checksum = "046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b"
 dependencies = [
  "async-compression",
- "base64 0.21.7",
+ "base64 0.21.4",
  "bytes",
  "encoding_rs",
  "futures-core",
@@ -4732,12 +4579,11 @@ dependencies = [
  "once_cell",
  "percent-encoding",
  "pin-project-lite",
- "rustls 0.21.10",
+ "rustls 0.21.7",
  "rustls-pemfile",
  "serde",
  "serde_json",
  "serde_urlencoded",
- "sync_wrapper",
  "system-configuration",
  "tokio",
  "tokio-native-tls",
@@ -4748,7 +4594,7 @@ dependencies = [
  "wasm-bindgen",
  "wasm-bindgen-futures",
  "web-sys",
- "webpki-roots 0.25.4",
+ "webpki-roots 0.25.2",
  "winreg",
 ]
 
@@ -4769,12 +4615,12 @@ dependencies = [
 
 [[package]]
 name = "ring"
-version = "0.17.7"
+version = "0.17.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74"
+checksum = "911b295d2d302948838c8ac142da1ee09fa7863163b44e6715bc9357905878b8"
 dependencies = [
  "cc",
- "getrandom 0.2.12",
+ "getrandom 0.2.10",
  "libc",
  "spin 0.9.8",
  "untrusted 0.9.0",
@@ -4783,13 +4629,12 @@ dependencies = [
 
 [[package]]
 name = "rkyv"
-version = "0.7.44"
+version = "0.7.42"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5cba464629b3394fc4dbc6f940ff8f5b4ff5c7aef40f29166fd4ad12acbc99c0"
+checksum = "0200c8230b013893c0b2d6213d6ec64ed2b9be2e0e016682b7224ff82cff5c58"
 dependencies = [
  "bitvec",
  "bytecheck",
- "bytes",
  "hashbrown 0.12.3",
  "ptr_meta",
  "rend",
@@ -4801,12 +4646,12 @@ dependencies = [
 
 [[package]]
 name = "rkyv_derive"
-version = "0.7.44"
+version = "0.7.42"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a7dddfff8de25e6f62b9d64e6e432bf1c6736c57d20323e15ee10435fbda7c65"
+checksum = "b2e06b915b5c230a17d7a736d1e2e63ee753c256a8614ef3f5147b13a4f5541d"
 dependencies = [
- "proc-macro2 1.0.78",
- "quote 1.0.35",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
  "syn 1.0.109",
 ]
 
@@ -4846,12 +4691,12 @@ dependencies = [
 
 [[package]]
 name = "rust_decimal"
-version = "1.34.2"
+version = "1.32.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "755392e1a2f77afd95580d3f0d0e94ac83eeeb7167552c9b5bca549e61a94d83"
+checksum = "a4c4216490d5a413bc6d10fa4742bd7d4955941d062c0ef873141d6b0e7b30fd"
 dependencies = [
  "arrayvec",
- "borsh 1.3.1",
+ "borsh 0.10.3",
  "bytes",
  "num-traits",
  "rand 0.8.5",
@@ -4874,9 +4719,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
 
 [[package]]
 name = "rustc-serialize"
-version = "0.3.25"
+version = "0.3.24"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fe834bc780604f4674073badbad26d7219cadfb4a2275802db12cbae17498401"
+checksum = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda"
 
 [[package]]
 name = "rustc_version"
@@ -4912,15 +4757,15 @@ dependencies = [
 
 [[package]]
 name = "rustix"
-version = "0.38.31"
+version = "0.38.18"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949"
+checksum = "5a74ee2d7c2581cd139b42447d7d9389b889bdaad3a73f1ebb16f2a3237bb19c"
 dependencies = [
- "bitflags 2.4.2",
+ "bitflags 2.4.0",
  "errno",
  "libc",
- "linux-raw-sys 0.4.13",
- "windows-sys 0.52.0",
+ "linux-raw-sys 0.4.10",
+ "windows-sys 0.48.0",
 ]
 
 [[package]]
@@ -4937,12 +4782,12 @@ dependencies = [
 
 [[package]]
 name = "rustls"
-version = "0.21.10"
+version = "0.21.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba"
+checksum = "cd8d6c9f025a446bc4d18ad9632e69aec8f287aa84499ee335599fabd20c3fd8"
 dependencies = [
  "log",
- "ring 0.17.7",
+ "ring 0.16.20",
  "rustls-webpki",
  "sct",
 ]
@@ -4961,21 +4806,21 @@ dependencies = [
 
 [[package]]
 name = "rustls-pemfile"
-version = "1.0.4"
+version = "1.0.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c"
+checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2"
 dependencies = [
- "base64 0.21.7",
+ "base64 0.21.4",
 ]
 
 [[package]]
 name = "rustls-webpki"
-version = "0.101.7"
+version = "0.101.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765"
+checksum = "3c7d5dece342910d9ba34d259310cae3e0154b873b35408b787b59bce53d34fe"
 dependencies = [
- "ring 0.17.7",
- "untrusted 0.9.0",
+ "ring 0.16.20",
+ "untrusted 0.7.1",
 ]
 
 [[package]]
@@ -4986,24 +4831,24 @@ checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4"
 
 [[package]]
 name = "ryu"
-version = "1.0.16"
+version = "1.0.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c"
+checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741"
 
 [[package]]
 name = "schannel"
-version = "0.1.23"
+version = "0.1.22"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534"
+checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88"
 dependencies = [
- "windows-sys 0.52.0",
+ "windows-sys 0.48.0",
 ]
 
 [[package]]
 name = "schemars"
-version = "0.8.16"
+version = "0.8.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "45a28f4c49489add4ce10783f7911893516f15afe45d015608d41faca6bc4d29"
+checksum = "1f7b0ce13155372a76ee2e1c5ffba1fe61ede73fbea5630d61eee6fac4929c0c"
 dependencies = [
  "dyn-clone",
  "schemars_derive",
@@ -5013,12 +4858,12 @@ dependencies = [
 
 [[package]]
 name = "schemars_derive"
-version = "0.8.16"
+version = "0.8.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c767fd6fa65d9ccf9cf026122c1b555f2ef9a4f0cea69da4d7dbc3e258d30967"
+checksum = "e85e2a16b12bdb763244c69ab79363d71db2b4b918a2def53f80b02e0574b13c"
 dependencies = [
- "proc-macro2 1.0.78",
- "quote 1.0.35",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
  "serde_derive_internals",
  "syn 1.0.109",
 ]
@@ -5044,19 +4889,19 @@ version = "0.11.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "1db149f81d46d2deba7cd3c50772474707729550221e69588478ebf9ada425ae"
 dependencies = [
- "proc-macro2 1.0.78",
- "quote 1.0.35",
- "syn 2.0.48",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
+ "syn 2.0.38",
 ]
 
 [[package]]
 name = "sct"
-version = "0.7.1"
+version = "0.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414"
+checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4"
 dependencies = [
- "ring 0.17.7",
- "untrusted 0.9.0",
+ "ring 0.16.20",
+ "untrusted 0.7.1",
 ]
 
 [[package]]
@@ -5081,7 +4926,7 @@ dependencies = [
  "serde_json",
  "sqlx",
  "thiserror",
- "time 0.3.34",
+ "time 0.3.29",
  "tracing",
  "url",
  "uuid",
@@ -5111,8 +4956,8 @@ checksum = "7216195de9c6b2474fd0efab486173dccd0eff21f28cc54aa4c0205d52fb3af0"
 dependencies = [
  "bae",
  "heck 0.3.3",
- "proc-macro2 1.0.78",
- "quote 1.0.35",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
  "syn 1.0.109",
 ]
 
@@ -5142,7 +4987,7 @@ dependencies = [
  "rust_decimal",
  "sea-query-derive 0.2.0",
  "serde_json",
- "time 0.3.34",
+ "time 0.3.29",
  "uuid",
 ]
 
@@ -5166,7 +5011,7 @@ dependencies = [
  "sea-query 0.27.2",
  "serde_json",
  "sqlx",
- "time 0.3.34",
+ "time 0.3.29",
  "uuid",
 ]
 
@@ -5177,8 +5022,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "34cdc022b4f606353fe5dc85b09713a04e433323b70163e81513b141c6ae6eb5"
 dependencies = [
  "heck 0.3.3",
- "proc-macro2 1.0.78",
- "quote 1.0.35",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
  "syn 1.0.109",
  "thiserror",
 ]
@@ -5190,8 +5035,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "63f62030c60f3a691f5fe251713b4e220b306e50a71e1d6f9cce1f24bb781978"
 dependencies = [
  "heck 0.4.1",
- "proc-macro2 1.0.78",
- "quote 1.0.35",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
  "syn 1.0.109",
  "thiserror",
 ]
@@ -5214,8 +5059,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "56821b7076f5096b8f726e2791ad255a99c82498e08ec477a65a96c461ff1927"
 dependencies = [
  "heck 0.3.3",
- "proc-macro2 1.0.78",
- "quote 1.0.35",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
  "syn 1.0.109",
 ]
 
@@ -5235,8 +5080,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "69b4397b825df6ccf1e98bcdabef3bbcfc47ff5853983467850eeab878384f21"
 dependencies = [
  "heck 0.3.3",
- "proc-macro2 1.0.78",
- "quote 1.0.35",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
  "rustversion",
  "syn 1.0.109",
 ]
@@ -5272,37 +5117,37 @@ dependencies = [
 
 [[package]]
 name = "semver"
-version = "1.0.21"
+version = "1.0.19"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0"
+checksum = "ad977052201c6de01a8ef2aa3378c4bd23217a056337d1d6da40468d267a4fb0"
 
 [[package]]
 name = "serde"
-version = "1.0.196"
+version = "1.0.188"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32"
+checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e"
 dependencies = [
  "serde_derive",
 ]
 
 [[package]]
 name = "serde_bytes"
-version = "0.11.14"
+version = "0.11.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b8497c313fd43ab992087548117643f6fcd935cbf36f176ffda0aacf9591734"
+checksum = "ab33ec92f677585af6d88c65593ae2375adde54efdbf16d597f2cbc7a6d368ff"
 dependencies = [
  "serde",
 ]
 
 [[package]]
 name = "serde_derive"
-version = "1.0.196"
+version = "1.0.188"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67"
+checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2"
 dependencies = [
- "proc-macro2 1.0.78",
- "quote 1.0.35",
- "syn 2.0.48",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
+ "syn 2.0.38",
 ]
 
 [[package]]
@@ -5311,18 +5156,18 @@ version = "0.26.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c"
 dependencies = [
- "proc-macro2 1.0.78",
- "quote 1.0.35",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
  "syn 1.0.109",
 ]
 
 [[package]]
 name = "serde_json"
-version = "1.0.113"
+version = "1.0.107"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "69801b70b1c3dac963ecb03a364ba0ceda9cf60c71cfe475e99864759c8b8a79"
+checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65"
 dependencies = [
- "indexmap 2.2.2",
+ "indexmap 2.0.2",
  "itoa",
  "ryu",
  "serde",
@@ -5330,9 +5175,9 @@ dependencies = [
 
 [[package]]
 name = "serde_spanned"
-version = "0.6.5"
+version = "0.6.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1"
+checksum = "12022b835073e5b11e90a14f86838ceb1c8fb0325b72416845c487ac0fa95e80"
 dependencies = [
  "serde",
 ]
@@ -5365,15 +5210,15 @@ version = "3.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "1b0ed1662c5a68664f45b76d18deb0e234aff37207086803165c961eb695e981"
 dependencies = [
- "base64 0.21.7",
+ "base64 0.21.4",
  "chrono",
  "hex",
  "indexmap 1.9.3",
- "indexmap 2.2.2",
+ "indexmap 2.0.2",
  "serde",
  "serde_json",
  "serde_with_macros 3.6.0",
- "time 0.3.34",
+ "time 0.3.29",
 ]
 
 [[package]]
@@ -5383,9 +5228,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "881b6f881b17d13214e5d494c939ebab463d01264ce1811e9d4ac3a882e7695f"
 dependencies = [
  "darling",
- "proc-macro2 1.0.78",
- "quote 1.0.35",
- "syn 2.0.48",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
+ "syn 2.0.38",
 ]
 
 [[package]]
@@ -5395,18 +5240,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "568577ff0ef47b879f736cd66740e022f3672788cdf002a05a4e609ea5a6fb15"
 dependencies = [
  "darling",
- "proc-macro2 1.0.78",
- "quote 1.0.35",
- "syn 2.0.48",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
+ "syn 2.0.38",
 ]
 
 [[package]]
 name = "serde_yaml"
-version = "0.9.31"
+version = "0.9.25"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "adf8a49373e98a4c5f0ceb5d05aa7c648d75f63774981ed95b7c7443bbd50c6e"
+checksum = "1a49e178e4452f45cb61d0cd8cebc1b0fafd3e41929e996cef79aa3aca91f574"
 dependencies = [
- "indexmap 2.2.2",
+ "indexmap 2.0.2",
  "itoa",
  "ryu",
  "serde",
@@ -5433,9 +5278,9 @@ version = "2.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "91d129178576168c589c9ec973feedf7d3126c01ac2bf08795109aa35b69fb8f"
 dependencies = [
- "proc-macro2 1.0.78",
- "quote 1.0.35",
- "syn 2.0.48",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
+ "syn 2.0.38",
 ]
 
 [[package]]
@@ -5567,12 +5412,6 @@ version = "2.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "32fea41aca09ee824cc9724996433064c89f7777e60762749a4170a14abbfa21"
 
-[[package]]
-name = "siphasher"
-version = "0.3.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d"
-
 [[package]]
 name = "sized-chunks"
 version = "0.6.5"
@@ -5594,15 +5433,15 @@ dependencies = [
 
 [[package]]
 name = "smallvec"
-version = "1.13.1"
+version = "1.11.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7"
+checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a"
 
 [[package]]
 name = "socket2"
-version = "0.4.10"
+version = "0.4.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d"
+checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662"
 dependencies = [
  "libc",
  "winapi",
@@ -5610,9 +5449,9 @@ dependencies = [
 
 [[package]]
 name = "socket2"
-version = "0.5.5"
+version = "0.5.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9"
+checksum = "4031e820eb552adee9295814c0ced9e5cf38ddf1e8b7d566d6de8e2538ea989e"
 dependencies = [
  "libc",
  "windows-sys 0.48.0",
@@ -5636,12 +5475,12 @@ dependencies = [
 
 [[package]]
 name = "solana-account-decoder"
-version = "1.16.25"
+version = "1.16.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b5763ba7519b166b152ca2c6f8defa22cd07d3aea42a3a86b74519857fc3d464"
+checksum = "f52aec62a85932e26d1085864b0f7b99b31934aec8dd132429bfef6d7fb1d3a6"
 dependencies = [
  "Inflector",
- "base64 0.21.7",
+ "base64 0.21.4",
  "bincode",
  "bs58 0.4.0",
  "bv",
@@ -5661,9 +5500,9 @@ dependencies = [
 
 [[package]]
 name = "solana-address-lookup-table-program"
-version = "1.16.25"
+version = "1.16.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "18a216474b9d25153d629aa7f4fb2246bc875ebe90e1155380e0436c209e62d5"
+checksum = "ee0bd25f4ba0a15fc16c57b41b1e1b14f5271b83214fda158fdedb58758d394e"
 dependencies = [
  "bincode",
  "bytemuck",
@@ -5682,9 +5521,9 @@ dependencies = [
 
 [[package]]
 name = "solana-clap-utils"
-version = "1.16.25"
+version = "1.16.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2bef7e2234cf1179b8ceadfae922d38d79f82932a762ff62b0051e0b3205984f"
+checksum = "e963043668c640183d48472b281ebb9f713e0c36df0271961d23e6a394e09070"
 dependencies = [
  "chrono",
  "clap 2.34.0",
@@ -5700,9 +5539,9 @@ dependencies = [
 
 [[package]]
 name = "solana-client"
-version = "1.16.25"
+version = "1.16.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2644f5a0c91f8c44db175d35d52bf772799597dbedf6a5d9f138d61e2b52b826"
+checksum = "52ccf7bb34fb81c74582a9011babaa2e0220da56c71186e77f45a6f352017fdb"
 dependencies = [
  "async-trait",
  "bincode",
@@ -5733,9 +5572,9 @@ dependencies = [
 
 [[package]]
 name = "solana-config-program"
-version = "1.16.25"
+version = "1.16.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3bb9b6d2c575e1eecd85380cb6442525a0d2639afa627552264eaa7050f47fb3"
+checksum = "7fd0fc1efb91a1661aeb1ff6a691156c3b1bffdaed0aa096589499dd83f9e50b"
 dependencies = [
  "bincode",
  "chrono",
@@ -5747,9 +5586,9 @@ dependencies = [
 
 [[package]]
 name = "solana-connection-cache"
-version = "1.16.25"
+version = "1.16.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dcd27f413c3702ee20bbf1152e928f9adff0a37fef0f36b956d4eb34aae2be71"
+checksum = "8759e9cb9b1e92a94c31812169ecb5e65b5e215fb70fb68691e03655de5b7b6c"
 dependencies = [
  "async-trait",
  "bincode",
@@ -5768,11 +5607,11 @@ dependencies = [
 
 [[package]]
 name = "solana-frozen-abi"
-version = "1.16.25"
+version = "1.16.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a7077f6495ccc313dff49c3e3f3ed03e49058258bae7fee77ac29ba0a474ba82"
+checksum = "02eb4f0ed3eade20f4abdcc0031167344237cd6e16808bd0f33945f9db7861fe"
 dependencies = [
- "ahash 0.8.7",
+ "ahash 0.8.3",
  "blake3",
  "block-buffer 0.10.4",
  "bs58 0.4.0",
@@ -5801,33 +5640,21 @@ dependencies = [
 
 [[package]]
 name = "solana-frozen-abi-macro"
-version = "1.16.25"
+version = "1.16.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f516f992211a2ab70de5c367190575c97e02d156f9f1d8b76886d673f30e88a2"
+checksum = "f28514761a285944cbad5b3d7930546369b80a713ba37d84bcf6ed2753611765"
 dependencies = [
- "proc-macro2 1.0.78",
- "quote 1.0.35",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
  "rustc_version",
- "syn 2.0.48",
-]
-
-[[package]]
-name = "solana-geyser-plugin-interface"
-version = "1.16.25"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57308818e006abd20d06b49a658f2affc8efee446a7f5ea96c02418af96b3476"
-dependencies = [
- "log",
- "solana-sdk",
- "solana-transaction-status",
- "thiserror",
+ "syn 2.0.38",
 ]
 
 [[package]]
 name = "solana-logger"
-version = "1.16.25"
+version = "1.16.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7b64def674bfaa4a3f8be7ba19c03c9caec4ec028ba62b9a427ec1bf608a2486"
+checksum = "2c310c6749435ce1ea25a9ae3edfb2fd2c2aed2aa4d4f7e0487a8077a0b1ee30"
 dependencies = [
  "env_logger 0.9.3",
  "lazy_static",
@@ -5836,9 +5663,9 @@ dependencies = [
 
 [[package]]
 name = "solana-measure"
-version = "1.16.25"
+version = "1.16.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "932db6604bcf8ba3bba68e80564d7eaa0dd7b9667407e15c3557caa83203aee7"
+checksum = "0d171357580e62aa4ca19c780e25f4e74de064e2780cb8b9f6b6901d986fcd23"
 dependencies = [
  "log",
  "solana-sdk",
@@ -5846,9 +5673,9 @@ dependencies = [
 
 [[package]]
 name = "solana-metrics"
-version = "1.16.25"
+version = "1.16.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5d81931f224798c0e52062b0683a07eebe1c1904954c8765773c9802a28fbd0c"
+checksum = "013cbb3c82588278d2be18d3317ece5286cb54a3a06d5d38fc31e2a76a6d5e2d"
 dependencies = [
  "crossbeam-channel",
  "gethostname",
@@ -5860,9 +5687,9 @@ dependencies = [
 
 [[package]]
 name = "solana-net-utils"
-version = "1.16.25"
+version = "1.16.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7ea3420fa9da3789548f31b3c68e6a090bfd1320c735289851b711546d38e3b0"
+checksum = "c50d7cac0694b1fe07499de25404a0c7d6836457e359aba3b08c3983c3dc5eb6"
 dependencies = [
  "bincode",
  "clap 3.2.25",
@@ -5872,7 +5699,7 @@ dependencies = [
  "rand 0.7.3",
  "serde",
  "serde_derive",
- "socket2 0.4.10",
+ "socket2 0.4.9",
  "solana-logger",
  "solana-sdk",
  "solana-version",
@@ -5882,11 +5709,11 @@ dependencies = [
 
 [[package]]
 name = "solana-perf"
-version = "1.16.25"
+version = "1.16.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5859de708bd12fb189f3c161cda03fdd341ffcf6be4fe787c7d730a30d589ac6"
+checksum = "395d559e5be2c439551298e9fa95561807f24921fd9a1e08bb82a3dc05c02dea"
 dependencies = [
- "ahash 0.8.7",
+ "ahash 0.8.3",
  "bincode",
  "bv",
  "caps",
@@ -5909,16 +5736,16 @@ dependencies = [
 
 [[package]]
 name = "solana-program"
-version = "1.16.25"
+version = "1.16.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3e92350aa5b42564681655331e7e0b9d5c99a442de317ceeb4741efbbe9a6c05"
+checksum = "cff2aa5434a77413e9d43e971ceb47bdb003f2e8bbc0365a25b684aca2605c25"
 dependencies = [
  "ark-bn254",
  "ark-ec",
  "ark-ff",
  "ark-serialize",
  "array-bytes",
- "base64 0.21.7",
+ "base64 0.21.4",
  "bincode",
  "bitflags 1.3.2",
  "blake3",
@@ -5931,7 +5758,7 @@ dependencies = [
  "console_error_panic_hook",
  "console_log",
  "curve25519-dalek",
- "getrandom 0.2.12",
+ "getrandom 0.2.10",
  "itertools 0.10.5",
  "js-sys",
  "lazy_static",
@@ -5964,11 +5791,11 @@ dependencies = [
 
 [[package]]
 name = "solana-program-runtime"
-version = "1.16.25"
+version = "1.16.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3da0e9dd63326ded2055b42e54aa37baa6aeb8adaea658a0059c234af6d05c02"
+checksum = "9d1832fefc2187142dac169812518ec20da68b09abad86e4a78f8ae1787e4f56"
 dependencies = [
- "base64 0.21.7",
+ "base64 0.21.4",
  "bincode",
  "eager",
  "enum-iterator",
@@ -5992,9 +5819,9 @@ dependencies = [
 
 [[package]]
 name = "solana-pubsub-client"
-version = "1.16.25"
+version = "1.16.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b9d1ad6fa8f0e154b91e67969fdf5478e74b75a87d5e3dce14ab83f4cb2f60f1"
+checksum = "89388addbc3192407d948634f82c95c4dbe1efbe578582abfd136720e059556e"
 dependencies = [
  "crossbeam-channel",
  "futures-util",
@@ -6017,9 +5844,9 @@ dependencies = [
 
 [[package]]
 name = "solana-quic-client"
-version = "1.16.25"
+version = "1.16.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "de9426ee9c0f98522242d6656db18175a022959af0b8ed3f170729e29933cf08"
+checksum = "b7897b876a6df2d97b3a5ddfd764155c0591e3497e863fd7fdf32b54de4e2644"
 dependencies = [
  "async-mutex",
  "async-trait",
@@ -6045,9 +5872,9 @@ dependencies = [
 
 [[package]]
 name = "solana-rayon-threadlimit"
-version = "1.16.25"
+version = "1.16.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3e6c7a43e34d7db0ad158690b331df15b92f6996e3b9b03629591a54fc3e97f"
+checksum = "6ba17a930f9974a17a9a6c6e82e7f89b40127e9cc0f9c17cfc29fc5b149d2c38"
 dependencies = [
  "lazy_static",
  "num_cpus",
@@ -6055,9 +5882,9 @@ dependencies = [
 
 [[package]]
 name = "solana-remote-wallet"
-version = "1.16.25"
+version = "1.16.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed87a28ede1536be71352e13965b1fe7a2cf205e3e4fae2eef8a3407219ba1cd"
+checksum = "80fb35e3fa78ef1d08a6a1d852e2c357e6ae388cb307d24fad359f57c34429f0"
 dependencies = [
  "console",
  "dialoguer",
@@ -6074,12 +5901,12 @@ dependencies = [
 
 [[package]]
 name = "solana-rpc-client"
-version = "1.16.25"
+version = "1.16.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f273acbce4493bc1de8174b94cfaee112b72263ae1684a6e13890f5004be53fb"
+checksum = "c512944689d747a87f76936c89bb59f5be6c9a3189631857f49746cfa47d5bd1"
 dependencies = [
  "async-trait",
- "base64 0.21.7",
+ "base64 0.21.4",
  "bincode",
  "bs58 0.4.0",
  "indicatif",
@@ -6100,11 +5927,11 @@ dependencies = [
 
 [[package]]
 name = "solana-rpc-client-api"
-version = "1.16.25"
+version = "1.16.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4462198830687b83870985db945c5d49c720d83abf516c8206fefba12cca689d"
+checksum = "6e918b75f8ac4c358a6b512bf8b7dafc8166ddcb52ded5164c6235e0693ccb09"
 dependencies = [
- "base64 0.21.7",
+ "base64 0.21.4",
  "bs58 0.4.0",
  "jsonrpc-core",
  "reqwest",
@@ -6122,9 +5949,9 @@ dependencies = [
 
 [[package]]
 name = "solana-rpc-client-nonce-utils"
-version = "1.16.25"
+version = "1.16.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "91b3abad7b1ffd4b29d33b7525ebbc2ec8d0ca5928e4d8f28e364928d68a8dd9"
+checksum = "c6e360ea2f3a756bdf6256c1f6ef13f8b01b5d2a7855b4f16cafb4a4017f0557"
 dependencies = [
  "clap 2.34.0",
  "solana-clap-utils",
@@ -6135,12 +5962,12 @@ dependencies = [
 
 [[package]]
 name = "solana-sdk"
-version = "1.16.25"
+version = "1.16.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2087e15c92d4d6b3f085dc12fbe9614141c811f90a54cc418240ac30b608133f"
+checksum = "8b1002048941cedbd7dd6a96fdaa3dc5238b998aaa70b81946b1e3ec108cc2be"
 dependencies = [
  "assert_matches",
- "base64 0.21.7",
+ "base64 0.21.4",
  "bincode",
  "bitflags 1.3.2",
  "borsh 0.10.3",
@@ -6188,22 +6015,22 @@ dependencies = [
 
 [[package]]
 name = "solana-sdk-macro"
-version = "1.16.25"
+version = "1.16.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2e0e0e7ee984b0f9179a1d4f4e9e67ce675de2324b5a98b61d2bdb61be3c19bb"
+checksum = "4b41b63b2da4a37ce323aba108db21f4c7bfa638dd1bf58fdc870f83bdce48ba"
 dependencies = [
  "bs58 0.4.0",
- "proc-macro2 1.0.78",
- "quote 1.0.35",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
  "rustversion",
- "syn 2.0.48",
+ "syn 2.0.38",
 ]
 
 [[package]]
 name = "solana-streamer"
-version = "1.16.25"
+version = "1.16.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a868a782cab696677cd12deacda1862dbeeba903a4a8d8404a4d6bf45e8a556c"
+checksum = "f00e575f2bd5ae2776870fbd1d7379d4ad392c015e2a4e2a328953b821a9d36d"
 dependencies = [
  "async-channel 1.9.0",
  "bytes",
@@ -6234,9 +6061,9 @@ dependencies = [
 
 [[package]]
 name = "solana-thin-client"
-version = "1.16.25"
+version = "1.16.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "222f5539a4b01a5374c919e78aca5d4472fa5af6e551bf9f4ddd97ca59374f6d"
+checksum = "df328e2624cce68c9949a53eac317a264eceb997131cb9bd22175698a5f5dc74"
 dependencies = [
  "bincode",
  "log",
@@ -6249,9 +6076,9 @@ dependencies = [
 
 [[package]]
 name = "solana-tpu-client"
-version = "1.16.25"
+version = "1.16.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8c0f954b48dda0a907dbdb54387459c8eb7e9c702f278bf70a2caf3ebc417c88"
+checksum = "6a8ce6fe221c0e1fd8aa3078b8fcb0cc3f4c27942f1256b57a60608d81ae5348"
 dependencies = [
  "async-trait",
  "bincode",
@@ -6274,12 +6101,12 @@ dependencies = [
 
 [[package]]
 name = "solana-transaction-status"
-version = "1.16.25"
+version = "1.16.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7992d9605a65967b5e40e6ef8e285a953888e4789f0f5e3fb7339bf018cbb677"
+checksum = "db0b811793e78a908119cc02edca3ff8b54d5660104ebd06cc0e2e7e2f66900b"
 dependencies = [
  "Inflector",
- "base64 0.21.7",
+ "base64 0.21.4",
  "bincode",
  "borsh 0.10.3",
  "bs58 0.4.0",
@@ -6300,9 +6127,9 @@ dependencies = [
 
 [[package]]
 name = "solana-udp-client"
-version = "1.16.25"
+version = "1.16.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4329dfe364cb276c7137b459e3737a27d6ae180f60d0aa2274d8be86cac3472c"
+checksum = "897ff303a15ba956e80573dee4cf96d94d41a69adc5362898b98851e347505ad"
 dependencies = [
  "async-trait",
  "solana-connection-cache",
@@ -6315,9 +6142,9 @@ dependencies = [
 
 [[package]]
 name = "solana-version"
-version = "1.16.25"
+version = "1.16.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1931390daf0938c072c167611a263a8b95c13476d7fff7c8eb12789a981685b3"
+checksum = "9513754d3b2203a0e1045a211c5d68e72e4ed135e477344c21d096897fd2bf70"
 dependencies = [
  "log",
  "rustc_version",
@@ -6331,9 +6158,9 @@ dependencies = [
 
 [[package]]
 name = "solana-vote-program"
-version = "1.16.25"
+version = "1.16.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "25669860e2c5e821a8caa5372589289fbb6ac3084096133fdd1c6af6546536a2"
+checksum = "3b6bfc5302ce0383eb129aa3a916705a20d22c4ad448144ef684b7b028d4053f"
 dependencies = [
  "bincode",
  "log",
@@ -6353,12 +6180,12 @@ dependencies = [
 
 [[package]]
 name = "solana-zk-token-sdk"
-version = "1.16.25"
+version = "1.16.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1457c85ab70a518438b9ac2b0c56037b9f6693060dfb617bbb93c7116e4f0c22"
+checksum = "5d1fe77918563768a65fd5d6cd2fa06cf0aeb11e529a1ef8c230b0fe018600e3"
 dependencies = [
  "aes-gcm-siv",
- "base64 0.21.7",
+ "base64 0.21.4",
  "bincode",
  "bytemuck",
  "byteorder",
@@ -6441,7 +6268,7 @@ checksum = "385e31c29981488f2820b2022d8e731aae3b02e6e18e2fd854e4c9a94dc44fc3"
 dependencies = [
  "assert_matches",
  "borsh 0.10.3",
- "num-derive 0.4.2",
+ "num-derive 0.4.1",
  "num-traits",
  "solana-program",
  "spl-token",
@@ -6473,25 +6300,25 @@ dependencies = [
 
 [[package]]
 name = "spl-discriminator-derive"
-version = "0.1.2"
+version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "07fd7858fc4ff8fb0e34090e41d7eb06a823e1057945c26d480bfc21d2338a93"
+checksum = "fadbefec4f3c678215ca72bd71862697bb06b41fd77c0088902dd3203354387b"
 dependencies = [
- "quote 1.0.35",
+ "quote 1.0.33",
  "spl-discriminator-syn",
- "syn 2.0.48",
+ "syn 2.0.38",
 ]
 
 [[package]]
 name = "spl-discriminator-syn"
-version = "0.1.2"
+version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "18fea7be851bd98d10721782ea958097c03a0c2a07d8d4997041d0ece6319a63"
+checksum = "0e5f2044ca42c8938d54d1255ce599c79a1ffd86b677dfab695caa20f9ffc3f2"
 dependencies = [
- "proc-macro2 1.0.78",
- "quote 1.0.35",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
  "sha2 0.10.8",
- "syn 2.0.48",
+ "syn 2.0.38",
  "thiserror",
 ]
 
@@ -6532,7 +6359,7 @@ version = "0.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "249e0318493b6bcf27ae9902600566c689b7dfba9f1bdff5893e92253374e78c"
 dependencies = [
- "num-derive 0.4.2",
+ "num-derive 0.4.1",
  "num-traits",
  "solana-program",
  "spl-program-error-derive",
@@ -6541,14 +6368,14 @@ dependencies = [
 
 [[package]]
 name = "spl-program-error-derive"
-version = "0.3.2"
+version = "0.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1845dfe71fd68f70382232742e758557afe973ae19e6c06807b2c30f5d5cb474"
+checksum = "ab5269c8e868da17b6552ef35a51355a017bd8e0eae269c201fef830d35fa52c"
 dependencies = [
- "proc-macro2 1.0.78",
- "quote 1.0.35",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
  "sha2 0.10.8",
- "syn 2.0.48",
+ "syn 2.0.38",
 ]
 
 [[package]]
@@ -6588,9 +6415,9 @@ checksum = "e4abf34a65ba420584a0c35f3903f8d727d1f13ababbdc3f714c6b065a686e86"
 dependencies = [
  "arrayref",
  "bytemuck",
- "num-derive 0.4.2",
+ "num-derive 0.4.1",
  "num-traits",
- "num_enum 0.7.2",
+ "num_enum 0.7.0",
  "solana-program",
  "solana-zk-token-sdk",
  "spl-memo",
@@ -6647,11 +6474,11 @@ dependencies = [
 
 [[package]]
 name = "sqlformat"
-version = "0.2.3"
+version = "0.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ce81b7bd7c4493975347ef60d8c7e8b742d4694f4c49f93e0a12ea263938176c"
+checksum = "6b7b278788e7be4d0d29c0f39497a0eef3fba6bbc8e70d8bf7fde46edeaa9e85"
 dependencies = [
- "itertools 0.12.1",
+ "itertools 0.11.0",
  "nom",
  "unicode_categories",
 ]
@@ -6672,7 +6499,7 @@ version = "0.6.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "fa8241483a83a3f33aa5fff7e7d9def398ff9990b2752b6c6112b83c6d246029"
 dependencies = [
- "ahash 0.7.7",
+ "ahash 0.7.6",
  "atoi",
  "base64 0.13.1",
  "bitflags 1.3.2",
@@ -6716,7 +6543,7 @@ dependencies = [
  "sqlx-rt",
  "stringprep",
  "thiserror",
- "time 0.3.34",
+ "time 0.3.29",
  "tokio-stream",
  "url",
  "uuid",
@@ -6735,8 +6562,8 @@ dependencies = [
  "heck 0.4.1",
  "hex",
  "once_cell",
- "proc-macro2 1.0.78",
- "quote 1.0.35",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
  "serde",
  "serde_json",
  "sha2 0.10.8",
@@ -6770,7 +6597,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b6bcb902b974bc20b50c3ad3148022a366a46c9a676b587684ff46c237a3329e"
 dependencies = [
  "async-channel 1.9.0",
- "async-io 1.13.0",
+ "async-io",
  "atomic 0.5.3",
  "crossbeam-channel",
  "futures",
@@ -6828,48 +6655,30 @@ version = "1.0.109"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
 dependencies = [
- "proc-macro2 1.0.78",
- "quote 1.0.35",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
  "unicode-ident",
 ]
 
 [[package]]
 name = "syn"
-version = "2.0.48"
+version = "2.0.38"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f"
+checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b"
 dependencies = [
- "proc-macro2 1.0.78",
- "quote 1.0.35",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
  "unicode-ident",
 ]
 
-[[package]]
-name = "syn_derive"
-version = "0.1.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b"
-dependencies = [
- "proc-macro-error",
- "proc-macro2 1.0.78",
- "quote 1.0.35",
- "syn 2.0.48",
-]
-
-[[package]]
-name = "sync_wrapper"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160"
-
 [[package]]
 name = "synstructure"
 version = "0.12.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f"
 dependencies = [
- "proc-macro2 1.0.78",
- "quote 1.0.35",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
  "syn 1.0.109",
  "unicode-xid 0.2.4",
 ]
@@ -6903,21 +6712,22 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369"
 
 [[package]]
 name = "tempfile"
-version = "3.10.0"
+version = "3.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a365e8cd18e44762ef95d87f284f4b5cd04107fec2ff3052bd6a3e6069669e67"
+checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef"
 dependencies = [
  "cfg-if",
  "fastrand 2.0.1",
- "rustix 0.38.31",
- "windows-sys 0.52.0",
+ "redox_syscall 0.3.5",
+ "rustix 0.38.18",
+ "windows-sys 0.48.0",
 ]
 
 [[package]]
 name = "termcolor"
-version = "1.4.1"
+version = "1.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755"
+checksum = "6093bad37da69aab9d123a8091e4be0aa4a03e4d601ec641c327398315f62b64"
 dependencies = [
  "winapi-util",
 ]
@@ -6939,22 +6749,22 @@ checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d"
 
 [[package]]
 name = "thiserror"
-version = "1.0.56"
+version = "1.0.49"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad"
+checksum = "1177e8c6d7ede7afde3585fd2513e611227efd6481bd78d2e82ba1ce16557ed4"
 dependencies = [
  "thiserror-impl",
 ]
 
 [[package]]
 name = "thiserror-impl"
-version = "1.0.56"
+version = "1.0.49"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471"
+checksum = "10712f02019e9288794769fba95cd6847df9874d49d871d062172f9dd41bc4cc"
 dependencies = [
- "proc-macro2 1.0.78",
- "quote 1.0.35",
- "syn 2.0.48",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
+ "syn 2.0.38",
 ]
 
 [[package]]
@@ -6980,14 +6790,12 @@ dependencies = [
 
 [[package]]
 name = "time"
-version = "0.3.34"
+version = "0.3.29"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749"
+checksum = "426f806f4089c493dcac0d24c29c01e2c38baf8e30f1b716ee37e83d200b18fe"
 dependencies = [
  "deranged",
  "itoa",
- "num-conv",
- "powerfmt",
  "serde",
  "time-core",
  "time-macros",
@@ -7001,11 +6809,10 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3"
 
 [[package]]
 name = "time-macros"
-version = "0.2.17"
+version = "0.2.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774"
+checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20"
 dependencies = [
- "num-conv",
  "time-core",
 ]
 
@@ -7045,9 +6852,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
 
 [[package]]
 name = "tokio"
-version = "1.36.0"
+version = "1.33.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931"
+checksum = "4f38200e3ef7995e5ef13baec2f432a6da0aa9ac495b2c0e8f3b7eec2c92d653"
 dependencies = [
  "backtrace",
  "bytes",
@@ -7057,7 +6864,7 @@ dependencies = [
  "parking_lot 0.12.1",
  "pin-project-lite",
  "signal-hook-registry",
- "socket2 0.5.5",
+ "socket2 0.5.4",
  "tokio-macros",
  "tracing",
  "windows-sys 0.48.0",
@@ -7065,13 +6872,13 @@ dependencies = [
 
 [[package]]
 name = "tokio-macros"
-version = "2.2.0"
+version = "2.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b"
+checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e"
 dependencies = [
- "proc-macro2 1.0.78",
- "quote 1.0.35",
- "syn 2.0.48",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
+ "syn 2.0.38",
 ]
 
 [[package]]
@@ -7084,32 +6891,6 @@ dependencies = [
  "tokio",
 ]
 
-[[package]]
-name = "tokio-postgres"
-version = "0.7.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d340244b32d920260ae7448cb72b6e238bddc3d4f7603394e7dd46ed8e48f5b8"
-dependencies = [
- "async-trait",
- "byteorder",
- "bytes",
- "fallible-iterator",
- "futures-channel",
- "futures-util",
- "log",
- "parking_lot 0.12.1",
- "percent-encoding",
- "phf",
- "pin-project-lite",
- "postgres-protocol",
- "postgres-types",
- "rand 0.8.5",
- "socket2 0.5.5",
- "tokio",
- "tokio-util",
- "whoami",
-]
-
 [[package]]
 name = "tokio-rustls"
 version = "0.23.4"
@@ -7127,7 +6908,7 @@ version = "0.24.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081"
 dependencies = [
- "rustls 0.21.10",
+ "rustls 0.21.7",
  "tokio",
 ]
 
@@ -7160,9 +6941,9 @@ dependencies = [
 
 [[package]]
 name = "tokio-util"
-version = "0.7.10"
+version = "0.7.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15"
+checksum = "1d68074620f57a0b21594d9735eb2e98ab38b17f80d3fcb189fca266771ca60d"
 dependencies = [
  "bytes",
  "futures-core",
@@ -7184,14 +6965,14 @@ dependencies = [
 
 [[package]]
 name = "toml"
-version = "0.8.10"
+version = "0.8.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a9aad4a3066010876e8dcf5a8a06e70a558751117a145c6ce2b82c2e2054290"
+checksum = "a1a195ec8c9da26928f773888e0742ca3ca1040c6cd859c919c9f59c1954ab35"
 dependencies = [
  "serde",
  "serde_spanned",
  "toml_datetime",
- "toml_edit 0.22.4",
+ "toml_edit 0.21.0",
 ]
 
 [[package]]
@@ -7209,29 +6990,18 @@ version = "0.19.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421"
 dependencies = [
- "indexmap 2.2.2",
+ "indexmap 2.0.2",
  "toml_datetime",
  "winnow",
 ]
 
 [[package]]
 name = "toml_edit"
-version = "0.21.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1"
-dependencies = [
- "indexmap 2.2.2",
- "toml_datetime",
- "winnow",
-]
-
-[[package]]
-name = "toml_edit"
-version = "0.22.4"
+version = "0.21.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c9ffdf896f8daaabf9b66ba8e77ea1ed5ed0f72821b398aba62352e95062951"
+checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03"
 dependencies = [
- "indexmap 2.2.2",
+ "indexmap 2.0.2",
  "serde",
  "serde_spanned",
  "toml_datetime",
@@ -7281,10 +7051,11 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52"
 
 [[package]]
 name = "tracing"
-version = "0.1.40"
+version = "0.1.37"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef"
+checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8"
 dependencies = [
+ "cfg-if",
  "log",
  "pin-project-lite",
  "tracing-attributes",
@@ -7293,20 +7064,20 @@ dependencies = [
 
 [[package]]
 name = "tracing-attributes"
-version = "0.1.27"
+version = "0.1.26"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
+checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab"
 dependencies = [
- "proc-macro2 1.0.78",
- "quote 1.0.35",
- "syn 2.0.48",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
+ "syn 2.0.38",
 ]
 
 [[package]]
 name = "tracing-core"
-version = "0.1.32"
+version = "0.1.31"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54"
+checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a"
 dependencies = [
  "once_cell",
  "valuable",
@@ -7361,9 +7132,9 @@ dependencies = [
  "anchor-client",
  "anyhow",
  "bs58 0.4.0",
- "clap 4.4.18",
+ "clap 4.4.8",
  "digital_asset_types",
- "env_logger 0.10.2",
+ "env_logger 0.10.0",
  "flatbuffers",
  "futures",
  "hex",
@@ -7385,9 +7156,9 @@ dependencies = [
 
 [[package]]
 name = "triomphe"
-version = "0.1.11"
+version = "0.1.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "859eb650cfee7434994602c3a68b25d77ad9e68c8a6cd491616ef86661382eb3"
+checksum = "0eee8098afad3fb0c54a9007aab6804558410503ad676d4633f9c2559a00ac0f"
 dependencies = [
  "serde",
  "stable_deref_trait",
@@ -7395,9 +7166,9 @@ dependencies = [
 
 [[package]]
 name = "try-lock"
-version = "0.2.5"
+version = "0.2.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
+checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed"
 
 [[package]]
 name = "tungstenite"
@@ -7426,8 +7197,8 @@ name = "txn_forwarder"
 version = "0.7.12"
 dependencies = [
  "anyhow",
- "clap 4.4.18",
- "env_logger 0.10.2",
+ "clap 4.4.8",
+ "env_logger 0.10.0",
  "figment",
  "flatbuffers",
  "futures",
@@ -7454,9 +7225,9 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
 
 [[package]]
 name = "uncased"
-version = "0.9.10"
+version = "0.9.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e1b88fcfe09e89d3866a5c11019378088af2d24c3fbd4f0543f96b479ec90697"
+checksum = "9b9bc53168a4be7402ab86c3aad243a84dd7381d09be0eddc81280c1da95ca68"
 dependencies = [
  "version_check",
 ]
@@ -7472,9 +7243,9 @@ dependencies = [
 
 [[package]]
 name = "unicode-bidi"
-version = "0.3.15"
+version = "0.3.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75"
+checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460"
 
 [[package]]
 name = "unicode-ident"
@@ -7542,9 +7313,9 @@ dependencies = [
 
 [[package]]
 name = "unsafe-libyaml"
-version = "0.2.10"
+version = "0.2.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ab4c90930b95a82d00dc9e9ac071b4991924390d46cbd0dfe566148667605e4b"
+checksum = "f28467d3e1d3c6586d8f25fa243f544f5800fec42d97032474e17222c2b75cfa"
 
 [[package]]
 name = "untrusted"
@@ -7570,9 +7341,9 @@ dependencies = [
 
 [[package]]
 name = "url"
-version = "2.5.0"
+version = "2.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633"
+checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5"
 dependencies = [
  "form_urlencoded",
  "idna",
@@ -7593,11 +7364,11 @@ checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a"
 
 [[package]]
 name = "uuid"
-version = "1.7.0"
+version = "1.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f00cc9702ca12d3c81455259621e676d0f7251cec66a21e98fe2e9a37db93b2a"
+checksum = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d"
 dependencies = [
- "getrandom 0.2.12",
+ "getrandom 0.2.10",
  "serde",
 ]
 
@@ -7609,9 +7380,9 @@ checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
 
 [[package]]
 name = "value-bag"
-version = "1.7.0"
+version = "1.4.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "126e423afe2dd9ac52142e7e9d5ce4135d7e13776c529d27fd6bc49f19e3280b"
+checksum = "4a72e1902dde2bd6441347de2b70b7f5d59bf157c6c62f0c44572607a1d55bbe"
 
 [[package]]
 name = "vcpkg"
@@ -7678,9 +7449,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
 
 [[package]]
 name = "wasm-bindgen"
-version = "0.2.91"
+version = "0.2.87"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c1e124130aee3fb58c5bdd6b639a0509486b0338acaaae0c84a5124b0f588b7f"
+checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342"
 dependencies = [
  "cfg-if",
  "wasm-bindgen-macro",
@@ -7688,24 +7459,24 @@ dependencies = [
 
 [[package]]
 name = "wasm-bindgen-backend"
-version = "0.2.91"
+version = "0.2.87"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c9e7e1900c352b609c8488ad12639a311045f40a35491fb69ba8c12f758af70b"
+checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd"
 dependencies = [
  "bumpalo",
  "log",
  "once_cell",
- "proc-macro2 1.0.78",
- "quote 1.0.35",
- "syn 2.0.48",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
+ "syn 2.0.38",
  "wasm-bindgen-shared",
 ]
 
 [[package]]
 name = "wasm-bindgen-futures"
-version = "0.4.41"
+version = "0.4.37"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "877b9c3f61ceea0e56331985743b13f3d25c406a7098d45180fb5f09bc19ed97"
+checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03"
 dependencies = [
  "cfg-if",
  "js-sys",
@@ -7715,38 +7486,38 @@ dependencies = [
 
 [[package]]
 name = "wasm-bindgen-macro"
-version = "0.2.91"
+version = "0.2.87"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b30af9e2d358182b5c7449424f017eba305ed32a7010509ede96cdc4696c46ed"
+checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d"
 dependencies = [
- "quote 1.0.35",
+ "quote 1.0.33",
  "wasm-bindgen-macro-support",
 ]
 
 [[package]]
 name = "wasm-bindgen-macro-support"
-version = "0.2.91"
+version = "0.2.87"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66"
+checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b"
 dependencies = [
- "proc-macro2 1.0.78",
- "quote 1.0.35",
- "syn 2.0.48",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
+ "syn 2.0.38",
  "wasm-bindgen-backend",
  "wasm-bindgen-shared",
 ]
 
 [[package]]
 name = "wasm-bindgen-shared"
-version = "0.2.91"
+version = "0.2.87"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4f186bd2dcf04330886ce82d6f33dd75a7bfcf69ecf5763b89fcde53b6ac9838"
+checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1"
 
 [[package]]
 name = "web-sys"
-version = "0.3.68"
+version = "0.3.64"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "96565907687f7aceb35bc5fc03770a8a0471d82e479f25832f54a0e3f4b28446"
+checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b"
 dependencies = [
  "js-sys",
  "wasm-bindgen",
@@ -7758,7 +7529,7 @@ version = "0.22.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ed63aea5ce73d0ff405984102c42de94fc55a6b75765d621c65262469b3c9b53"
 dependencies = [
- "ring 0.17.7",
+ "ring 0.17.2",
  "untrusted 0.9.0",
 ]
 
@@ -7773,9 +7544,9 @@ dependencies = [
 
 [[package]]
 name = "webpki-roots"
-version = "0.25.4"
+version = "0.25.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1"
+checksum = "14247bb57be4f377dfb94c72830b8ce8fc6beac03cf4bf7b9732eadd414123fc"
 
 [[package]]
 name = "wg"
@@ -7830,12 +7601,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
 
 [[package]]
-name = "windows-core"
-version = "0.52.0"
+name = "windows"
+version = "0.48.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
+checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f"
 dependencies = [
- "windows-targets 0.52.0",
+ "windows-targets 0.48.5",
 ]
 
 [[package]]
@@ -7853,6 +7624,15 @@ dependencies = [
  "windows_x86_64_msvc 0.42.2",
 ]
 
+[[package]]
+name = "windows-sys"
+version = "0.45.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"
+dependencies = [
+ "windows-targets 0.42.2",
+]
+
 [[package]]
 name = "windows-sys"
 version = "0.48.0"
@@ -7863,12 +7643,18 @@ dependencies = [
 ]
 
 [[package]]
-name = "windows-sys"
-version = "0.52.0"
+name = "windows-targets"
+version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
+checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071"
 dependencies = [
- "windows-targets 0.52.0",
+ "windows_aarch64_gnullvm 0.42.2",
+ "windows_aarch64_msvc 0.42.2",
+ "windows_i686_gnu 0.42.2",
+ "windows_i686_msvc 0.42.2",
+ "windows_x86_64_gnu 0.42.2",
+ "windows_x86_64_gnullvm 0.42.2",
+ "windows_x86_64_msvc 0.42.2",
 ]
 
 [[package]]
@@ -7886,21 +7672,6 @@ dependencies = [
  "windows_x86_64_msvc 0.48.5",
 ]
 
-[[package]]
-name = "windows-targets"
-version = "0.52.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd"
-dependencies = [
- "windows_aarch64_gnullvm 0.52.0",
- "windows_aarch64_msvc 0.52.0",
- "windows_i686_gnu 0.52.0",
- "windows_i686_msvc 0.52.0",
- "windows_x86_64_gnu 0.52.0",
- "windows_x86_64_gnullvm 0.52.0",
- "windows_x86_64_msvc 0.52.0",
-]
-
 [[package]]
 name = "windows_aarch64_gnullvm"
 version = "0.42.2"
@@ -7913,12 +7684,6 @@ version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
 
-[[package]]
-name = "windows_aarch64_gnullvm"
-version = "0.52.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea"
-
 [[package]]
 name = "windows_aarch64_msvc"
 version = "0.42.2"
@@ -7931,12 +7696,6 @@ version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
 
-[[package]]
-name = "windows_aarch64_msvc"
-version = "0.52.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef"
-
 [[package]]
 name = "windows_i686_gnu"
 version = "0.42.2"
@@ -7949,12 +7708,6 @@ version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
 
-[[package]]
-name = "windows_i686_gnu"
-version = "0.52.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313"
-
 [[package]]
 name = "windows_i686_msvc"
 version = "0.42.2"
@@ -7967,12 +7720,6 @@ version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
 
-[[package]]
-name = "windows_i686_msvc"
-version = "0.52.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a"
-
 [[package]]
 name = "windows_x86_64_gnu"
 version = "0.42.2"
@@ -7985,12 +7732,6 @@ version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
 
-[[package]]
-name = "windows_x86_64_gnu"
-version = "0.52.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd"
-
 [[package]]
 name = "windows_x86_64_gnullvm"
 version = "0.42.2"
@@ -8003,12 +7744,6 @@ version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
 
-[[package]]
-name = "windows_x86_64_gnullvm"
-version = "0.52.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e"
-
 [[package]]
 name = "windows_x86_64_msvc"
 version = "0.42.2"
@@ -8021,17 +7756,11 @@ version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
 
-[[package]]
-name = "windows_x86_64_msvc"
-version = "0.52.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04"
-
 [[package]]
 name = "winnow"
-version = "0.5.39"
+version = "0.5.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5389a154b01683d28c77f8f68f49dea75f0a4da32557a58f68ee51ebba472d29"
+checksum = "037711d82167854aff2018dfd193aa0fef5370f456732f0d5a0c59b0f1b4b907"
 dependencies = [
  "memchr",
 ]
@@ -8070,14 +7799,14 @@ dependencies = [
  "oid-registry",
  "rusticata-macros",
  "thiserror",
- "time 0.3.34",
+ "time 0.3.29",
 ]
 
 [[package]]
 name = "xxhash-rust"
-version = "0.8.8"
+version = "0.8.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "53be06678ed9e83edb1745eb72efc0bbcd7b5c3c35711a860906aed827a13d61"
+checksum = "9828b178da53440fa9c766a3d2f73f7cf5d0ac1fe3980c1e5018d899fd19e07b"
 
 [[package]]
 name = "yaml-rust"
@@ -8100,27 +7829,7 @@ version = "0.5.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd"
 dependencies = [
- "time 0.3.34",
-]
-
-[[package]]
-name = "zerocopy"
-version = "0.7.32"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be"
-dependencies = [
- "zerocopy-derive",
-]
-
-[[package]]
-name = "zerocopy-derive"
-version = "0.7.32"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6"
-dependencies = [
- "proc-macro2 1.0.78",
- "quote 1.0.35",
- "syn 2.0.48",
+ "time 0.3.29",
 ]
 
 [[package]]
@@ -8138,9 +7847,9 @@ version = "1.4.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69"
 dependencies = [
- "proc-macro2 1.0.78",
- "quote 1.0.35",
- "syn 2.0.48",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
+ "syn 2.0.38",
 ]
 
 [[package]]
@@ -8164,10 +7873,11 @@ dependencies = [
 
 [[package]]
 name = "zstd-sys"
-version = "2.0.9+zstd.1.5.5"
+version = "2.0.8+zstd.1.5.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656"
+checksum = "5556e6ee25d32df2586c098bbfa278803692a20d0ab9565e049480d52707ec8c"
 dependencies = [
  "cc",
+ "libc",
  "pkg-config",
 ]
diff --git a/Cargo.toml b/Cargo.toml
index af24d6965..dc9e15726 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -3,17 +3,18 @@ members = [
   "core",
   "das_api",
   "digital_asset_types",
+  "integration_tests",
   "metaplex-rpc-proxy",
   "migration",
   "nft_ingester",
   "ops",
+  "program_transformers",
   "tools/acc_forwarder",
   "tools/bgtask_creator",
   "tools/fetch_trees",
   "tools/load_generation",
   "tools/tree-status",
   "tools/txn_forwarder",
-  "integration_tests",
 ]
 resolver = "2"
 
@@ -29,7 +30,7 @@ anchor-lang = "0.28.0"
 anyhow = "1.0.75"
 async-std = "1.0.0"
 async-trait = "0.1.60"
-base64 = "0.21.0"
+backon = "0.4.1"
 blockbuster = "1.0.1"
 borsh = "~0.10.3"
 borsh-derive = "~0.10.3"
@@ -49,11 +50,11 @@ figment = "0.10.8"
 flatbuffers = "23.1.21"
 function_name = "0.3.0"
 futures = "0.3.28"
-futures-util = "0.3.27"
 hex = "0.4.3"
 hyper = "0.14.23"
 indexmap = "1.9.3"
-insta = { version = "1.34.0", features = ["json"] }
+indicatif = "0.17.5"
+insta = "1.34.0"
 itertools = "0.10.1"
 jsonpath_lib = "0.3.0"
 jsonrpsee = "0.16.2"
@@ -67,29 +68,22 @@ mpl-bubblegum = "1.2.0"
 mpl-token-metadata = "4.1.1"
 nft_ingester = { path = "nft_ingester" }
 num-derive = "0.3.3"
-num-integer = { version = "0.1.44", default_features = false }
 num-traits = "0.2.15"
 once_cell = "1.19.0"
 open-rpc-derive = "0.0.4"
 open-rpc-schema = "0.0.4"
 plerkle_messenger = "1.6.0"
 plerkle_serialization = "1.6.0"
+program_transformers = { path = "program_transformers" }
 prometheus = "0.13.3"
 proxy-wasm = "0.2.0"
 rand = "0.8.5"
-redis = "0.22.3"
 regex = "1.6.0"
 reqwest = "0.11.13"
 rust-crypto = "0.2.36"
 schemars = "0.8.6"
 schemars_derive = "0.8.6"
-sea-orm = { version = "0.10.6", features = [
-  "macros",
-  "runtime-tokio-rustls",
-  "sqlx-postgres",
-  "with-chrono",
-  "mock",
-] }
+sea-orm = "0.10.6"
 sea-orm-migration = "0.10.6"
 sea-query = "0.28.1"
 serde = "1.0.137"
@@ -97,28 +91,18 @@ serde_json = "1.0.81"
 serial_test = "2.0.0"
 solana-account-decoder = "~1.16.16"
 solana-client = "~1.16.16"
-solana-geyser-plugin-interface = "~1.16.16"
 solana-program = "~1.16.16"
 solana-sdk = "~1.16.16"
-solana-sdk-macro = "~1.16.16"
 solana-transaction-status = "~1.16.16"
 spl-account-compression = "0.2.0"
 spl-associated-token-account = ">= 1.1.3, < 3.0"
 spl-concurrent-merkle-tree = "0.2.0"
 spl-noop = "0.2.0"
-spl-token = { version = ">= 3.5.0, < 5.0", features = ["no-entrypoint"] }
-sqlx = { version = "0.6.2", features = [
-  "macros",
-  "runtime-tokio-rustls",
-  "postgres",
-  "uuid",
-  "offline",
-  "json",
-] }
+spl-token = ">= 3.5.0, < 5.0"
+sqlx = "0.6.2"
 stretto = "0.7.2"
 thiserror = "1.0.31"
-tokio = { version = "1.30.0", features = ["macros", "rt-multi-thread"] }
-tokio-postgres = "0.7.7"
+tokio = "1.30.0"
 tokio-stream = "0.1.14"
 tower = "0.4.13"
 tower-http = "0.3.5"
@@ -126,7 +110,6 @@ tracing = "0.1.35"
 tracing-subscriber = "0.3.16"
 txn_forwarder = { path = "tools/txn_forwarder" }
 url = "2.3.1"
-uuid = "1.0.0"
 wasi = "0.7.0"
 wasm-bindgen = "0.2.83"
 
diff --git a/core/Cargo.toml b/core/Cargo.toml
index f9b6d1daf..d230f883a 100644
--- a/core/Cargo.toml
+++ b/core/Cargo.toml
@@ -5,14 +5,12 @@ edition.workspace = true
 repository.workspace = true
 publish.workspace = true
 
-# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
-
 [dependencies]
-clap = { workspace = true }
 anyhow = { workspace = true }
-sqlx = { workspace = true }
 cadence = { workspace = true }
 cadence-macros = { workspace = true }
+clap = { workspace = true, features = ["derive", "cargo", "env"] }
+sqlx = { workspace = true, features = ["runtime-tokio-rustls", "postgres"] }
 
 [lints]
 workspace = true
diff --git a/das_api/Cargo.toml b/das_api/Cargo.toml
index b54152424..566ac1cd8 100644
--- a/das_api/Cargo.toml
+++ b/das_api/Cargo.toml
@@ -33,7 +33,6 @@ solana-sdk = { workspace = true }
 sqlx = { workspace = true, features = ["macros", "runtime-tokio-rustls", "postgres", "uuid", "offline", "json"] }
 thiserror = { workspace = true }
 tokio = { workspace = true, features = ["signal"] }
-tokio-postgres = { workspace = true }
 tower = { workspace = true }
 tower-http = { workspace = true, features = ["cors"] }
 tracing = { workspace = true }
diff --git a/digital_asset_types/Cargo.toml b/digital_asset_types/Cargo.toml
index f7cab08ee..449f6e78d 100644
--- a/digital_asset_types/Cargo.toml
+++ b/digital_asset_types/Cargo.toml
@@ -20,14 +20,14 @@ num-derive = { workspace = true }
 num-traits = { workspace = true }
 schemars = { workspace = true }
 schemars_derive = { workspace = true }
-sea-orm = { optional = true, features = ["macros", "runtime-tokio-rustls", "sqlx-postgres", "with-chrono", "mock"], workspace = true }
+sea-orm = { workspace = true, features = ["macros", "runtime-tokio-rustls", "sqlx-postgres", "with-chrono", "mock"], optional = true }
 sea-query = { workspace = true, features = ["postgres-array"] }
 serde = { workspace = true, optional = true }
 serde_json = { workspace = true, features = ["preserve_order"], optional = true }
 solana-sdk = { workspace = true }
 spl-concurrent-merkle-tree = { workspace = true }
 thiserror = { workspace = true }
-tokio = { workspace = true }
+tokio = { workspace = true, features = ["macros"] }
 url = { workspace = true }
 
 [features]
diff --git a/integration_tests/Cargo.toml b/integration_tests/Cargo.toml
index aab6896dd..10c817a3e 100644
--- a/integration_tests/Cargo.toml
+++ b/integration_tests/Cargo.toml
@@ -5,33 +5,31 @@ publish = false
 version = "0.1.0"
 
 [dev-dependencies]
-anyhow = {workspace = true}
-borsh = {workspace = true}
-das_api = {workspace = true}
-digital_asset_types = {workspace = true}
-env_logger = {workspace = true}
-figment = {workspace = true}
-flatbuffers = {workspace = true}
-function_name = {workspace = true}
-futures-util = {workspace = true}
-insta = {workspace = true}
-itertools = {workspace = true}
-log = {workspace = true}
-migration = {workspace = true}
-mpl-token-metadata = {workspace = true}
-nft_ingester = {workspace = true}
-once_cell = {workspace = true}
-plerkle_messenger = {workspace = true, features = ["redis"]}
-plerkle_serialization = {workspace = true}
-sea-orm = {workspace = true}
-serde = {workspace = true}
-serde_json = {workspace = true}
-serial_test = {workspace = true}
-solana-account-decoder = {workspace = true}
-solana-client = {workspace = true}
-solana-sdk = {workspace = true}
-solana-transaction-status = {workspace = true}
-spl-token = {workspace = true}
-sqlx = {workspace = true}
-tokio = {workspace = true}
-tokio-stream = {workspace = true}
+anyhow = { workspace = true }
+borsh = { workspace = true }
+das_api = { workspace = true }
+digital_asset_types = { workspace = true }
+flatbuffers = { workspace = true }
+function_name = { workspace = true }
+futures = { workspace = true }
+insta = { workspace = true, features = ["json"] }
+itertools = { workspace = true }
+log = { workspace = true }
+migration = { workspace = true }
+mpl-token-metadata = { workspace = true }
+nft_ingester = { workspace = true }
+once_cell = { workspace = true }
+plerkle_serialization = { workspace = true }
+program_transformers = { workspace = true }
+sea-orm = { workspace = true }
+serde = { workspace = true }
+serde_json = { workspace = true }
+serial_test = { workspace = true }
+solana-account-decoder = { workspace = true }
+solana-client = { workspace = true }
+solana-sdk = { workspace = true }
+solana-transaction-status = { workspace = true }
+spl-token = { workspace = true, features = ["no-entrypoint"] }
+sqlx = { workspace = true }
+tokio = { workspace = true }
+tokio-stream = { workspace = true }
diff --git a/integration_tests/tests/integration_tests/common.rs b/integration_tests/tests/integration_tests/common.rs
index 3ba1b9862..b9d9da335 100644
--- a/integration_tests/tests/integration_tests/common.rs
+++ b/integration_tests/tests/integration_tests/common.rs
@@ -12,14 +12,13 @@ use migration::sea_orm::{
 use migration::{Migrator, MigratorTrait};
 use mpl_token_metadata::accounts::Metadata;
 
-use nft_ingester::config::{self, rand_string};
-use nft_ingester::program_transformers::ProgramTransformer;
-use nft_ingester::tasks::TaskManager;
+use nft_ingester::config;
 use once_cell::sync::Lazy;
 use plerkle_serialization::root_as_account_info;
 use plerkle_serialization::root_as_transaction_info;
 use plerkle_serialization::serializer::serialize_account;
 use plerkle_serialization::solana_geyser_plugin_interface_shims::ReplicaAccountInfoV2;
+use program_transformers::ProgramTransformer;
 
 use solana_client::nonblocking::rpc_client::RpcClient;
 use solana_sdk::pubkey::Pubkey;
@@ -29,8 +28,9 @@ use sqlx::PgPool;
 use std::sync::Arc;
 use tokio::sync::Mutex;
 
-use futures_util::StreamExt as FuturesStreamExt;
-use futures_util::TryStreamExt;
+use futures::future::{ready, FutureExt};
+use futures::StreamExt as FuturesStreamExt;
+use futures::TryStreamExt;
 use tokio_stream::{self as stream};
 
 use log::{error, info};
@@ -160,11 +160,7 @@ pub async fn apply_migrations_and_delete_data(db: Arc<DatabaseConnection>) {
 }
 
 async fn load_ingest_program_transformer(pool: sqlx::Pool<sqlx::Postgres>) -> ProgramTransformer {
-    // HACK: We don't really use this background task handler but we need it to create the sender
-    let mut background_task_manager = TaskManager::new(rand_string(), pool.clone(), vec![]);
-    background_task_manager.start_listener(true);
-    let bg_task_sender = background_task_manager.get_sender().unwrap();
-    ProgramTransformer::new(pool, bg_task_sender, false)
+    ProgramTransformer::new(pool, Box::new(|_info| ready(Ok(())).boxed()), false)
 }
 
 pub async fn get_transaction(
diff --git a/migration/src/m20221026_155220_add_bg_tasks.rs b/migration/src/m20221026_155220_add_bg_tasks.rs
index a0aa1ed59..8586a6013 100644
--- a/migration/src/m20221026_155220_add_bg_tasks.rs
+++ b/migration/src/m20221026_155220_add_bg_tasks.rs
@@ -31,10 +31,7 @@ impl MigrationTrait for Migration {
                     .col(ColumnDef::new(Tasks::Data).json_binary().not_null())
                     .col(
                         ColumnDef::new(Tasks::Status)
-                            .enumeration(
-                                Tasks::TaskStatus,
-                                all::<TaskStatus>().map(|e| e).collect::<Vec<_>>(),
-                            )
+                            .enumeration(Tasks::TaskStatus, all::<TaskStatus>().collect::<Vec<_>>())
                             .not_null(),
                     )
                     .col(ColumnDef::new(Tasks::CreatedAt).date_time().not_null())
diff --git a/migration/src/m20240104_203133_add_cl_audits_v2.rs b/migration/src/m20240104_203133_add_cl_audits_v2.rs
index 0fef946e1..85e5d7665 100644
--- a/migration/src/m20240104_203133_add_cl_audits_v2.rs
+++ b/migration/src/m20240104_203133_add_cl_audits_v2.rs
@@ -16,7 +16,7 @@ impl MigrationTrait for Migration {
             .create_type(
                 Type::create()
                     .as_enum(ClAuditsV2::Instruction)
-                    .values(all::<BubblegumInstruction>().map(|e| e).collect::<Vec<_>>())
+                    .values(all::<BubblegumInstruction>().collect::<Vec<_>>())
                     .to_owned(),
             )
             .await?;
@@ -46,7 +46,7 @@ impl MigrationTrait for Migration {
                         ColumnDef::new(ClAuditsV2::Instruction)
                             .enumeration(
                                 ClAuditsV2::Instruction,
-                                all::<BubblegumInstruction>().map(|e| e).collect::<Vec<_>>(),
+                                all::<BubblegumInstruction>().collect::<Vec<_>>(),
                             )
                             .not_null(),
                     )
diff --git a/nft_ingester/.dockerignore b/nft_ingester/.dockerignore
deleted file mode 100644
index 1de565933..000000000
--- a/nft_ingester/.dockerignore
+++ /dev/null
@@ -1 +0,0 @@
-target
\ No newline at end of file
diff --git a/nft_ingester/Cargo.toml b/nft_ingester/Cargo.toml
index 05b98b563..7e824cd24 100644
--- a/nft_ingester/Cargo.toml
+++ b/nft_ingester/Cargo.toml
@@ -6,9 +6,7 @@ repository = { workspace = true }
 publish = { workspace = true }
 
 [dependencies]
-anchor-lang = { workspace = true }
 async-trait = { workspace = true }
-base64 = { workspace = true }
 blockbuster = { workspace = true }
 borsh = { workspace = true }
 bs58 = { workspace = true }
@@ -17,46 +15,31 @@ cadence-macros = { workspace = true }
 chrono = { workspace = true }
 clap = { workspace = true, features = ["derive", "cargo"] }
 digital_asset_types = { workspace = true, features = ["json_types", "sql_types"] }
-env_logger = { workspace = true }
 figment = { workspace = true, features = ["env", "toml", "yaml"] }
 flatbuffers = { workspace = true }
 futures = { workspace = true }
-futures-util = { workspace = true }
-hex = { workspace = true }
-lazy_static = { workspace = true }
 log = { workspace = true }
 mpl-bubblegum = { workspace = true }
-num-integer = { workspace = true }
-num-traits = { workspace = true }
 plerkle_messenger = { workspace = true, features = ["redis"] }
 plerkle_serialization = { workspace = true }
+program_transformers = { workspace = true }
 rand = { workspace = true }
-redis = { workspace = true, features = ["aio", "tokio-comp", "streams", "tokio-native-tls-comp"] }
-regex = { workspace = true }
 reqwest = { workspace = true }
 rust-crypto = { workspace = true }
 sea-orm = { workspace = true, features = ["macros", "runtime-tokio-rustls", "sqlx-postgres", "with-chrono", "mock"] }
-sea-query = { workspace = true, features = ["postgres-array"] }
 serde = { workspace = true }
 serde_json = { workspace = true }
 solana-account-decoder = { workspace = true }
 solana-client = { workspace = true }
-solana-geyser-plugin-interface = { workspace = true }
 solana-sdk = { workspace = true }
-solana-sdk-macro = { workspace = true }
 solana-transaction-status = { workspace = true }
 spl-account-compression = { workspace = true, features = ["no-entrypoint"] }
-spl-concurrent-merkle-tree = { workspace = true }
-spl-token = { workspace = true, features = ["no-entrypoint"] }
 sqlx = { workspace = true, features = ["macros", "runtime-tokio-rustls", "postgres", "uuid", "offline", "json"] }
 stretto = { workspace = true, features = ["async"] }
 thiserror = { workspace = true }
 tokio = { workspace = true, features = ["tracing"] }
-tokio-postgres = { workspace = true }
-tokio-stream = { workspace = true }
 tracing-subscriber = { workspace = true, features = ["json", "env-filter", "ansi"] }
 url = { workspace = true }
-uuid = { workspace = true }
 
 [lints]
 workspace = true
diff --git a/nft_ingester/src/account_updates.rs b/nft_ingester/src/account_updates.rs
index 68b6c83a0..354aaf9c6 100644
--- a/nft_ingester/src/account_updates.rs
+++ b/nft_ingester/src/account_updates.rs
@@ -1,18 +1,22 @@
-use std::sync::Arc;
-
-use crate::{
-    metric, metrics::capture_result, program_transformers::ProgramTransformer, tasks::TaskData,
-};
-use cadence_macros::{is_global_default_set, statsd_count, statsd_time};
-use chrono::Utc;
-use log::{debug, error};
-use plerkle_messenger::{ConsumptionType, Messenger, MessengerConfig, RecvData};
-use plerkle_serialization::root_as_account_info;
-use sqlx::{Pool, Postgres};
-use tokio::{
-    sync::mpsc::UnboundedSender,
-    task::{JoinHandle, JoinSet},
-    time::Instant,
+use {
+    crate::{
+        metric,
+        metrics::capture_result,
+        tasks::{create_download_metadata_notifier, TaskData},
+    },
+    cadence_macros::{is_global_default_set, statsd_count, statsd_time},
+    chrono::Utc,
+    log::{debug, error},
+    plerkle_messenger::{ConsumptionType, Messenger, MessengerConfig, RecvData},
+    plerkle_serialization::root_as_account_info,
+    program_transformers::ProgramTransformer,
+    sqlx::{Pool, Postgres},
+    std::sync::Arc,
+    tokio::{
+        sync::mpsc::UnboundedSender,
+        task::{JoinHandle, JoinSet},
+        time::Instant,
+    },
 };
 
 pub fn account_worker<T: Messenger>(
@@ -26,7 +30,11 @@ pub fn account_worker<T: Messenger>(
     tokio::spawn(async move {
         let source = T::new(config).await;
         if let Ok(mut msg) = source {
-            let manager = Arc::new(ProgramTransformer::new(pool, bg_task_sender, false));
+            let manager = Arc::new(ProgramTransformer::new(
+                pool,
+                create_download_metadata_notifier(bg_task_sender),
+                false,
+            ));
             loop {
                 let e = msg.recv(stream_key, consumption_type.clone()).await;
                 let mut tasks = JoinSet::new();
diff --git a/nft_ingester/src/lib.rs b/nft_ingester/src/lib.rs
index 48e29aa70..9aee9c6ba 100644
--- a/nft_ingester/src/lib.rs
+++ b/nft_ingester/src/lib.rs
@@ -5,7 +5,6 @@ pub mod config;
 pub mod database;
 pub mod error;
 pub mod metrics;
-pub mod program_transformers;
 pub mod stream;
 pub mod tasks;
 pub mod transaction_notifications;
diff --git a/nft_ingester/src/main.rs b/nft_ingester/src/main.rs
index e69c4f9ee..aeaf8b0fe 100644
--- a/nft_ingester/src/main.rs
+++ b/nft_ingester/src/main.rs
@@ -5,7 +5,6 @@ pub mod config;
 mod database;
 pub mod error;
 pub mod metrics;
-mod program_transformers;
 mod stream;
 pub mod tasks;
 mod transaction_notifications;
diff --git a/nft_ingester/src/metrics.rs b/nft_ingester/src/metrics.rs
index 2e4ebb0d8..207c6318f 100644
--- a/nft_ingester/src/metrics.rs
+++ b/nft_ingester/src/metrics.rs
@@ -1,11 +1,12 @@
-use std::net::UdpSocket;
-
-use cadence::{BufferedUdpMetricSink, QueuingMetricSink, StatsdClient};
-use cadence_macros::{is_global_default_set, set_global_default, statsd_count, statsd_time};
-use log::{error, warn};
-use tokio::time::Instant;
-
-use crate::{config::IngesterConfig, error::IngesterError};
+use {
+    crate::config::IngesterConfig,
+    cadence::{BufferedUdpMetricSink, QueuingMetricSink, StatsdClient},
+    cadence_macros::{is_global_default_set, set_global_default, statsd_count, statsd_time},
+    log::{error, warn},
+    program_transformers::error::ProgramTransformerError,
+    std::net::UdpSocket,
+    tokio::time::Instant,
+};
 
 #[macro_export]
 macro_rules! metric {
@@ -42,7 +43,7 @@ pub fn capture_result(
     stream: &str,
     label: (&str, &str),
     tries: usize,
-    res: Result<(), IngesterError>,
+    res: Result<(), ProgramTransformerError>,
     proc: Instant,
     txn_sig: Option<&str>,
     account: Option<String>,
@@ -63,13 +64,13 @@ pub fn capture_result(
             }
             true
         }
-        Err(IngesterError::NotImplemented) => {
+        Err(ProgramTransformerError::NotImplemented) => {
             metric! {
                 statsd_count!("ingester.not_implemented", 1, label.0 => label.1, "stream" => stream, "error" => "ni");
             }
             true
         }
-        Err(IngesterError::DeserializationError(e)) => {
+        Err(ProgramTransformerError::DeserializationError(e)) => {
             metric! {
                 statsd_count!("ingester.ingest_error", 1, label.0 => label.1, "stream" => stream, "error" => "de");
             }
@@ -83,7 +84,7 @@ pub fn capture_result(
             // Non-retryable error.
             true
         }
-        Err(IngesterError::ParsingError(e)) => {
+        Err(ProgramTransformerError::ParsingError(e)) => {
             metric! {
                 statsd_count!("ingester.ingest_error", 1, label.0 => label.1, "stream" => stream, "error" => "parse");
             }
@@ -97,7 +98,7 @@ pub fn capture_result(
             // Non-retryable error.
             true
         }
-        Err(IngesterError::DatabaseError(e)) => {
+        Err(ProgramTransformerError::DatabaseError(e)) => {
             metric! {
                 statsd_count!("ingester.database_error", 1, label.0 => label.1, "stream" => stream, "error" => "db");
             }
@@ -108,7 +109,7 @@ pub fn capture_result(
             }
             false
         }
-        Err(IngesterError::AssetIndexError(e)) => {
+        Err(ProgramTransformerError::AssetIndexError(e)) => {
             metric! {
                 statsd_count!("ingester.index_error", 1, label.0 => label.1, "stream" => stream, "error" => "index");
             }
diff --git a/nft_ingester/src/tasks/common/mod.rs b/nft_ingester/src/tasks/common/mod.rs
index c10fd9ee3..17ec935a0 100644
--- a/nft_ingester/src/tasks/common/mod.rs
+++ b/nft_ingester/src/tasks/common/mod.rs
@@ -1,16 +1,46 @@
-use super::{BgTask, FromTaskData, IngesterError, IntoTaskData, TaskData};
-use async_trait::async_trait;
-use chrono::NaiveDateTime;
-use digital_asset_types::dao::asset_data;
-use log::debug;
-use reqwest::{Client, ClientBuilder};
-use sea_orm::*;
-use serde::{Deserialize, Serialize};
-use std::{
-    fmt::{Display, Formatter},
-    time::Duration,
+use {
+    super::{BgTask, FromTaskData, IngesterError, IntoTaskData, TaskData},
+    async_trait::async_trait,
+    chrono::{NaiveDateTime, Utc},
+    digital_asset_types::dao::asset_data,
+    futures::future::BoxFuture,
+    log::debug,
+    program_transformers::{DownloadMetadataInfo, DownloadMetadataNotifier},
+    reqwest::{Client, ClientBuilder},
+    sea_orm::*,
+    serde::{Deserialize, Serialize},
+    std::{
+        fmt::{Display, Formatter},
+        time::Duration,
+    },
+    tokio::sync::mpsc::UnboundedSender,
+    url::Url,
 };
-use url::Url;
+
+pub fn create_download_metadata_notifier(
+    bg_task_sender: UnboundedSender<TaskData>,
+) -> DownloadMetadataNotifier {
+    Box::new(
+        move |info: DownloadMetadataInfo| -> BoxFuture<
+            'static,
+            Result<(), Box<dyn std::error::Error + Send + Sync>>,
+        > {
+            let (asset_data_id, uri) = info.into_inner();
+            let task = DownloadMetadata {
+                asset_data_id,
+                uri,
+                created_at: Some(Utc::now().naive_utc()),
+            };
+            let task = task
+                .into_task_data()
+                .and_then(|task| {
+                    bg_task_sender.send(task).map_err(Into::into)
+                })
+                .map_err(Into::into);
+            Box::pin(async move { task })
+        },
+    )
+}
 
 const TASK_NAME: &str = "DownloadMetadata";
 
diff --git a/nft_ingester/src/transaction_notifications.rs b/nft_ingester/src/transaction_notifications.rs
index 02aa5d971..e3932eaf6 100644
--- a/nft_ingester/src/transaction_notifications.rs
+++ b/nft_ingester/src/transaction_notifications.rs
@@ -1,19 +1,22 @@
-use std::sync::Arc;
-
-use crate::{
-    metric, metrics::capture_result, program_transformers::ProgramTransformer, tasks::TaskData,
-};
-use cadence_macros::{is_global_default_set, statsd_count, statsd_time};
-use chrono::Utc;
-use log::{debug, error};
-use plerkle_messenger::{ConsumptionType, Messenger, MessengerConfig, RecvData};
-use plerkle_serialization::root_as_transaction_info;
-
-use sqlx::{Pool, Postgres};
-use tokio::{
-    sync::mpsc::UnboundedSender,
-    task::{JoinHandle, JoinSet},
-    time::Instant,
+use {
+    crate::{
+        metric,
+        metrics::capture_result,
+        tasks::{create_download_metadata_notifier, TaskData},
+    },
+    cadence_macros::{is_global_default_set, statsd_count, statsd_time},
+    chrono::Utc,
+    log::{debug, error},
+    plerkle_messenger::{ConsumptionType, Messenger, MessengerConfig, RecvData},
+    plerkle_serialization::root_as_transaction_info,
+    program_transformers::ProgramTransformer,
+    sqlx::{Pool, Postgres},
+    std::sync::Arc,
+    tokio::{
+        sync::mpsc::UnboundedSender,
+        task::{JoinHandle, JoinSet},
+        time::Instant,
+    },
 };
 
 pub fn transaction_worker<T: Messenger>(
@@ -28,7 +31,11 @@ pub fn transaction_worker<T: Messenger>(
     tokio::spawn(async move {
         let source = T::new(config).await;
         if let Ok(mut msg) = source {
-            let manager = Arc::new(ProgramTransformer::new(pool, bg_task_sender, cl_audits));
+            let manager = Arc::new(ProgramTransformer::new(
+                pool,
+                create_download_metadata_notifier(bg_task_sender),
+                cl_audits,
+            ));
             loop {
                 let e = msg.recv(stream_key, consumption_type.clone()).await;
                 let mut tasks = JoinSet::new();
diff --git a/ops/Cargo.toml b/ops/Cargo.toml
index 022bf2e92..e6cb7a870 100644
--- a/ops/Cargo.toml
+++ b/ops/Cargo.toml
@@ -9,48 +9,29 @@ publish.workspace = true
 name = "das-ops"
 
 [dependencies]
-
+anchor-client = { workspace = true }
+anyhow = { workspace = true }
+backon = { workspace = true }
+borsh = { workspace = true }
+cadence = { workspace = true }
+cadence-macros = { workspace = true }
 clap = { workspace = true, features = ["derive", "cargo", "env"] }
 das-core = { workspace = true }
-backon = "0.4.1"
-log = { workspace = true }
+digital_asset_types = { workspace = true }
 env_logger = { workspace = true }
-anyhow = { workspace = true }
-redis = { workspace = true }
+figment = { workspace = true }
+flatbuffers = { workspace = true }
 futures = { workspace = true }
-futures-util = { workspace = true }
-base64 = { workspace = true }
-indicatif = "0.17.5"
-thiserror = { workspace = true }
-serde_json = { workspace = true }
-cadence = { workspace = true }
-cadence-macros = { workspace = true }
-anchor-client = { workspace = true }
-tokio = { workspace = true }
-sqlx = { workspace = true }
-sea-orm = { workspace = true }
-sea-query = { workspace = true }
-chrono = { workspace = true }
-tokio-postgres = { workspace = true }
-serde = { workspace = true }
-bs58 = { workspace = true }
-reqwest = { workspace = true }
+indicatif = { workspace = true }
+log = { workspace = true }
+mpl-bubblegum = { workspace = true }
 plerkle_messenger = { workspace = true }
 plerkle_serialization = { workspace = true }
-flatbuffers = { workspace = true }
-lazy_static = { workspace = true }
-regex = { workspace = true }
-digital_asset_types = { workspace = true }
-mpl-bubblegum = { workspace = true }
-spl-account-compression = { workspace = true }
-spl-concurrent-merkle-tree = { workspace = true }
-uuid = { workspace = true }
-figment = { workspace = true }
-solana-sdk = { workspace = true }
+sea-orm = { workspace = true }
+solana-account-decoder = { workspace = true }
 solana-client = { workspace = true }
+solana-sdk = { workspace = true }
 solana-transaction-status = { workspace = true }
-solana-account-decoder = { workspace = true }
-rust-crypto = { workspace = true }
-url = { workspace = true }
-anchor-lang = { workspace = true }
-borsh = { workspace = true }
+spl-account-compression = { workspace = true }
+thiserror = { workspace = true }
+tokio = { workspace = true }
diff --git a/program_transformers/Cargo.toml b/program_transformers/Cargo.toml
new file mode 100644
index 000000000..76cb6c0d7
--- /dev/null
+++ b/program_transformers/Cargo.toml
@@ -0,0 +1,29 @@
+[package]
+name = "program_transformers"
+version = { workspace = true }
+edition = { workspace = true }
+repository = { workspace = true }
+publish = { workspace = true }
+
+[dependencies]
+blockbuster = { workspace = true }
+bs58 = { workspace = true }
+cadence = { workspace = true }
+cadence-macros = { workspace = true }
+digital_asset_types = { workspace = true, features = ["json_types", "sql_types"] }
+futures = { workspace = true }
+mpl-bubblegum = { workspace = true }
+num-traits = { workspace = true }
+plerkle_serialization = { workspace = true }
+sea-orm = { workspace = true }
+serde_json = { workspace = true }
+solana-sdk = { workspace = true }
+spl-account-compression = { workspace = true, features = ["no-entrypoint"] }
+spl-token = { workspace = true, features = ["no-entrypoint"] }
+sqlx = { workspace = true }
+thiserror = { workspace = true }
+tokio = { workspace = true, features = ["time"] }
+tracing = { workspace = true }
+
+[lints]
+workspace = true
diff --git a/nft_ingester/src/program_transformers/asset_upserts.rs b/program_transformers/src/asset_upserts.rs
similarity index 94%
rename from nft_ingester/src/program_transformers/asset_upserts.rs
rename to program_transformers/src/asset_upserts.rs
index 8bf172ec0..2d1d17e7c 100644
--- a/nft_ingester/src/program_transformers/asset_upserts.rs
+++ b/program_transformers/src/asset_upserts.rs
@@ -1,12 +1,14 @@
-use digital_asset_types::dao::{
-    asset,
-    sea_orm_active_enums::{
-        OwnerType, RoyaltyTargetType, SpecificationAssetClass, SpecificationVersions,
+use {
+    digital_asset_types::dao::{
+        asset,
+        sea_orm_active_enums::{
+            OwnerType, RoyaltyTargetType, SpecificationAssetClass, SpecificationVersions,
+        },
+    },
+    sea_orm::{
+        sea_query::OnConflict, ConnectionTrait, DbBackend, DbErr, EntityTrait, QueryTrait, Set,
+        TransactionTrait,
     },
-};
-use sea_orm::{
-    sea_query::OnConflict, ConnectionTrait, DbBackend, DbErr, EntityTrait, QueryTrait, Set,
-    TransactionTrait,
 };
 
 pub struct AssetTokenAccountColumns {
diff --git a/nft_ingester/src/program_transformers/bubblegum/burn.rs b/program_transformers/src/bubblegum/burn.rs
similarity index 71%
rename from nft_ingester/src/program_transformers/bubblegum/burn.rs
rename to program_transformers/src/bubblegum/burn.rs
index 11d4e0500..d0d45cca4 100644
--- a/nft_ingester/src/program_transformers/bubblegum/burn.rs
+++ b/program_transformers/src/bubblegum/burn.rs
@@ -1,16 +1,21 @@
-use crate::{
-    error::IngesterError,
-    program_transformers::bubblegum::{
-        save_changelog_event, u32_to_u8_array, upsert_asset_with_seq,
+use {
+    crate::{
+        bubblegum::{
+            db::{save_changelog_event, upsert_asset_with_seq},
+            u32_to_u8_array,
+        },
+        error::{ProgramTransformerError, ProgramTransformerResult},
     },
-};
-use anchor_lang::prelude::Pubkey;
-use blockbuster::{instruction::InstructionBundle, programs::bubblegum::BubblegumInstruction};
-use digital_asset_types::dao::asset;
-use log::debug;
-use sea_orm::{
-    entity::*, query::*, sea_query::OnConflict, ConnectionTrait, DbBackend, EntityTrait,
-    TransactionTrait,
+    blockbuster::{instruction::InstructionBundle, programs::bubblegum::BubblegumInstruction},
+    digital_asset_types::dao::asset,
+    sea_orm::{
+        entity::{ActiveValue, EntityTrait},
+        query::QueryTrait,
+        sea_query::query::OnConflict,
+        ConnectionTrait, DbBackend, TransactionTrait,
+    },
+    solana_sdk::pubkey::Pubkey,
+    tracing::debug,
 };
 
 pub async fn burn<'c, T>(
@@ -19,7 +24,7 @@ pub async fn burn<'c, T>(
     txn: &'c T,
     instruction: &str,
     cl_audits: bool,
-) -> Result<(), IngesterError>
+) -> ProgramTransformerResult<()>
 where
     T: ConnectionTrait + TransactionTrait,
 {
@@ -39,8 +44,8 @@ where
         let id_bytes = asset_id.to_bytes();
 
         let asset_model = asset::ActiveModel {
-            id: Set(id_bytes.to_vec()),
-            burnt: Set(true),
+            id: ActiveValue::Set(id_bytes.to_vec()),
+            burnt: ActiveValue::Set(true),
             ..Default::default()
         };
 
@@ -66,7 +71,7 @@ where
 
         return Ok(());
     }
-    Err(IngesterError::ParsingError(
+    Err(ProgramTransformerError::ParsingError(
         "Ix not parsed correctly".to_string(),
     ))
 }
diff --git a/nft_ingester/src/program_transformers/bubblegum/cancel_redeem.rs b/program_transformers/src/bubblegum/cancel_redeem.rs
similarity index 82%
rename from nft_ingester/src/program_transformers/bubblegum/cancel_redeem.rs
rename to program_transformers/src/bubblegum/cancel_redeem.rs
index 8491163b2..450bde198 100644
--- a/nft_ingester/src/program_transformers/bubblegum/cancel_redeem.rs
+++ b/program_transformers/src/bubblegum/cancel_redeem.rs
@@ -1,15 +1,17 @@
-use crate::{
-    error::IngesterError,
-    program_transformers::bubblegum::{
-        save_changelog_event, upsert_asset_with_leaf_info,
-        upsert_asset_with_owner_and_delegate_info, upsert_asset_with_seq,
+use {
+    crate::{
+        bubblegum::db::{
+            save_changelog_event, upsert_asset_with_leaf_info,
+            upsert_asset_with_owner_and_delegate_info, upsert_asset_with_seq,
+        },
+        error::{ProgramTransformerError, ProgramTransformerResult},
     },
+    blockbuster::{
+        instruction::InstructionBundle,
+        programs::bubblegum::{BubblegumInstruction, LeafSchema},
+    },
+    sea_orm::{ConnectionTrait, TransactionTrait},
 };
-use blockbuster::{
-    instruction::InstructionBundle,
-    programs::bubblegum::{BubblegumInstruction, LeafSchema},
-};
-use sea_orm::{ConnectionTrait, TransactionTrait};
 
 pub async fn cancel_redeem<'c, T>(
     parsing_result: &BubblegumInstruction,
@@ -17,7 +19,7 @@ pub async fn cancel_redeem<'c, T>(
     txn: &'c T,
     instruction: &str,
     cl_audits: bool,
-) -> Result<(), IngesterError>
+) -> ProgramTransformerResult<()>
 where
     T: ConnectionTrait + TransactionTrait,
 {
@@ -77,7 +79,7 @@ where
             }
         }
     }
-    Err(IngesterError::ParsingError(
+    Err(ProgramTransformerError::ParsingError(
         "Ix not parsed correctly".to_string(),
     ))
 }
diff --git a/nft_ingester/src/program_transformers/bubblegum/collection_verification.rs b/program_transformers/src/bubblegum/collection_verification.rs
similarity index 77%
rename from nft_ingester/src/program_transformers/bubblegum/collection_verification.rs
rename to program_transformers/src/bubblegum/collection_verification.rs
index c35be49c2..39284ffe3 100644
--- a/nft_ingester/src/program_transformers/bubblegum/collection_verification.rs
+++ b/program_transformers/src/bubblegum/collection_verification.rs
@@ -1,21 +1,27 @@
-use crate::program_transformers::bubblegum::{upsert_asset_with_seq, upsert_collection_info};
-use blockbuster::{
-    instruction::InstructionBundle,
-    programs::bubblegum::{BubblegumInstruction, LeafSchema, Payload},
+use {
+    crate::{
+        bubblegum::db::{
+            save_changelog_event, upsert_asset_with_leaf_info, upsert_asset_with_seq,
+            upsert_collection_info,
+        },
+        error::{ProgramTransformerError, ProgramTransformerResult},
+    },
+    blockbuster::{
+        instruction::InstructionBundle,
+        programs::bubblegum::{BubblegumInstruction, LeafSchema, Payload},
+    },
+    mpl_bubblegum::types::Collection,
+    sea_orm::{ConnectionTrait, TransactionTrait},
+    tracing::debug,
 };
-use log::debug;
-use mpl_bubblegum::types::Collection;
-use sea_orm::query::*;
 
-use super::{save_changelog_event, upsert_asset_with_leaf_info};
-use crate::error::IngesterError;
 pub async fn process<'c, T>(
     parsing_result: &BubblegumInstruction,
     bundle: &InstructionBundle<'c>,
     txn: &'c T,
     instruction: &str,
     cl_audits: bool,
-) -> Result<(), IngesterError>
+) -> ProgramTransformerResult<()>
 where
     T: ConnectionTrait + TransactionTrait,
 {
@@ -29,7 +35,7 @@ where
                 collection, verify, ..
             } => (collection, verify),
             _ => {
-                return Err(IngesterError::ParsingError(
+                return Err(ProgramTransformerError::ParsingError(
                     "Ix not parsed correctly".to_string(),
                 ));
             }
@@ -83,7 +89,7 @@ where
 
         return Ok(());
     };
-    Err(IngesterError::ParsingError(
+    Err(ProgramTransformerError::ParsingError(
         "Ix not parsed correctly".to_string(),
     ))
 }
diff --git a/nft_ingester/src/program_transformers/bubblegum/creator_verification.rs b/program_transformers/src/bubblegum/creator_verification.rs
similarity index 84%
rename from nft_ingester/src/program_transformers/bubblegum/creator_verification.rs
rename to program_transformers/src/bubblegum/creator_verification.rs
index 2a254a2b8..22646ec60 100644
--- a/nft_ingester/src/program_transformers/bubblegum/creator_verification.rs
+++ b/program_transformers/src/bubblegum/creator_verification.rs
@@ -1,17 +1,19 @@
-use crate::{
-    error::IngesterError,
-    program_transformers::bubblegum::{
-        save_changelog_event, upsert_asset_creators, upsert_asset_with_leaf_info,
-        upsert_asset_with_owner_and_delegate_info, upsert_asset_with_seq,
+use {
+    crate::{
+        bubblegum::db::{
+            save_changelog_event, upsert_asset_creators, upsert_asset_with_leaf_info,
+            upsert_asset_with_owner_and_delegate_info, upsert_asset_with_seq,
+        },
+        error::{ProgramTransformerError, ProgramTransformerResult},
     },
+    blockbuster::{
+        instruction::InstructionBundle,
+        programs::bubblegum::{BubblegumInstruction, LeafSchema, Payload},
+    },
+    mpl_bubblegum::types::Creator,
+    sea_orm::{ConnectionTrait, TransactionTrait},
+    tracing::debug,
 };
-use blockbuster::{
-    instruction::InstructionBundle,
-    programs::bubblegum::{BubblegumInstruction, LeafSchema, Payload},
-};
-use log::debug;
-use mpl_bubblegum::types::Creator;
-use sea_orm::{ConnectionTrait, TransactionTrait};
 
 pub async fn process<'c, T>(
     parsing_result: &BubblegumInstruction,
@@ -19,7 +21,7 @@ pub async fn process<'c, T>(
     txn: &'c T,
     instruction: &str,
     cl_audits: bool,
-) -> Result<(), IngesterError>
+) -> ProgramTransformerResult<()>
 where
     T: ConnectionTrait + TransactionTrait,
 {
@@ -49,7 +51,7 @@ where
                 (updated_creators, creator, verify)
             }
             _ => {
-                return Err(IngesterError::ParsingError(
+                return Err(ProgramTransformerError::ParsingError(
                     "Ix not parsed correctly".to_string(),
                 ));
             }
@@ -125,7 +127,7 @@ where
 
         return Ok(());
     }
-    Err(IngesterError::ParsingError(
+    Err(ProgramTransformerError::ParsingError(
         "Ix not parsed correctly".to_string(),
     ))
 }
diff --git a/nft_ingester/src/program_transformers/bubblegum/db.rs b/program_transformers/src/bubblegum/db.rs
similarity index 71%
rename from nft_ingester/src/program_transformers/bubblegum/db.rs
rename to program_transformers/src/bubblegum/db.rs
index 1d3efadc5..08fb82f5f 100644
--- a/nft_ingester/src/program_transformers/bubblegum/db.rs
+++ b/program_transformers/src/bubblegum/db.rs
@@ -1,18 +1,23 @@
-use crate::error::IngesterError;
-use digital_asset_types::dao::{
-    asset, asset_authority, asset_creators, asset_data, asset_grouping, backfill_items,
-    cl_audits_v2, cl_items,
-    sea_orm_active_enums::{
-        ChainMutability, Instruction, Mutability, OwnerType, RoyaltyTargetType,
-        SpecificationAssetClass, SpecificationVersions,
+use {
+    crate::error::{ProgramTransformerError, ProgramTransformerResult},
+    digital_asset_types::dao::{
+        asset, asset_authority, asset_creators, asset_data, asset_grouping, backfill_items,
+        cl_audits_v2, cl_items,
+        sea_orm_active_enums::{
+            ChainMutability, Instruction, Mutability, OwnerType, RoyaltyTargetType,
+            SpecificationAssetClass, SpecificationVersions,
+        },
     },
+    mpl_bubblegum::types::{Collection, Creator},
+    sea_orm::{
+        entity::{ActiveValue, ColumnTrait, EntityTrait},
+        query::{JsonValue, QueryFilter, QuerySelect, QueryTrait},
+        sea_query::query::OnConflict,
+        ConnectionTrait, DbBackend, TransactionTrait,
+    },
+    spl_account_compression::events::ChangeLogEventV1,
+    tracing::{debug, error, info},
 };
-use log::{debug, error, info};
-use mpl_bubblegum::types::{Collection, Creator};
-use sea_orm::{
-    query::*, sea_query::OnConflict, ActiveValue::Set, ColumnTrait, DbBackend, EntityTrait,
-};
-use spl_account_compression::events::ChangeLogEventV1;
 
 pub async fn save_changelog_event<'c, T>(
     change_log_event: &ChangeLogEventV1,
@@ -21,7 +26,7 @@ pub async fn save_changelog_event<'c, T>(
     txn: &T,
     instruction: &str,
     cl_audits: bool,
-) -> Result<u64, IngesterError>
+) -> ProgramTransformerResult<u64>
 where
     T: ConnectionTrait + TransactionTrait,
 {
@@ -40,7 +45,7 @@ pub async fn insert_change_log<'c, T>(
     txn: &T,
     instruction: &str,
     cl_audits: bool,
-) -> Result<(), IngesterError>
+) -> ProgramTransformerResult<()>
 where
     T: ConnectionTrait + TransactionTrait,
 {
@@ -65,12 +70,12 @@ where
         };
 
         let item = cl_items::ActiveModel {
-            tree: Set(tree_id.to_vec()),
-            level: Set(i),
-            node_idx: Set(node_idx),
-            hash: Set(p.node.as_ref().to_vec()),
-            seq: Set(change_log_event.seq as i64),
-            leaf_idx: Set(leaf_idx),
+            tree: ActiveValue::Set(tree_id.to_vec()),
+            level: ActiveValue::Set(i),
+            node_idx: ActiveValue::Set(node_idx),
+            hash: ActiveValue::Set(p.node.as_ref().to_vec()),
+            seq: ActiveValue::Set(change_log_event.seq as i64),
+            leaf_idx: ActiveValue::Set(leaf_idx),
             ..Default::default()
         };
 
@@ -90,24 +95,24 @@ where
         query.sql = format!("{} WHERE excluded.seq > cl_items.seq", query.sql);
         txn.execute(query)
             .await
-            .map_err(|db_err| IngesterError::StorageWriteError(db_err.to_string()))?;
+            .map_err(|db_err| ProgramTransformerError::StorageWriteError(db_err.to_string()))?;
     }
 
     // Insert the audit item after the insert into cl_items have been completed
     if cl_audits {
         let tx_id_bytes = bs58::decode(txn_id)
             .into_vec()
-            .map_err(|_e| IngesterError::ChangeLogEventMalformed)?;
+            .map_err(|_e| ProgramTransformerError::ChangeLogEventMalformed)?;
         let ix = Instruction::from(instruction);
         if ix == Instruction::Unknown {
             error!("Unknown instruction: {}", instruction);
         }
         let audit_item_v2 = cl_audits_v2::ActiveModel {
-            tree: Set(tree_id.to_vec()),
-            leaf_idx: Set(change_log_event.index as i64),
-            seq: Set(change_log_event.seq as i64),
-            tx: Set(tx_id_bytes),
-            instruction: Set(ix),
+            tree: ActiveValue::Set(tree_id.to_vec()),
+            leaf_idx: ActiveValue::Set(change_log_event.index as i64),
+            seq: ActiveValue::Set(change_log_event.seq as i64),
+            tx: ActiveValue::Set(tx_id_bytes),
+            instruction: ActiveValue::Set(ix),
             ..Default::default()
         };
         let query = cl_audits_v2::Entity::insert(audit_item_v2)
@@ -148,12 +153,12 @@ where
 
         info!("Adding to backfill_items table at level {}", i - 1);
         let item = backfill_items::ActiveModel {
-            tree: Set(tree_id.to_vec()),
-            seq: Set(change_log_event.seq as i64),
-            slot: Set(slot as i64),
-            force_chk: Set(force_chk),
-            backfilled: Set(false),
-            failed: Set(false),
+            tree: ActiveValue::Set(tree_id.to_vec()),
+            seq: ActiveValue::Set(change_log_event.seq as i64),
+            slot: ActiveValue::Set(slot as i64),
+            force_chk: ActiveValue::Set(force_chk),
+            backfilled: ActiveValue::Set(false),
+            failed: ActiveValue::Set(false),
             ..Default::default()
         };
 
@@ -173,20 +178,20 @@ pub async fn upsert_asset_with_leaf_info<T>(
     data_hash: [u8; 32],
     creator_hash: [u8; 32],
     seq: i64,
-) -> Result<(), IngesterError>
+) -> ProgramTransformerResult<()>
 where
     T: ConnectionTrait + TransactionTrait,
 {
     let data_hash = bs58::encode(data_hash).into_string().trim().to_string();
     let creator_hash = bs58::encode(creator_hash).into_string().trim().to_string();
     let model = asset::ActiveModel {
-        id: Set(id),
-        nonce: Set(Some(nonce)),
-        tree_id: Set(Some(tree_id)),
-        leaf: Set(Some(leaf)),
-        data_hash: Set(Some(data_hash)),
-        creator_hash: Set(Some(creator_hash)),
-        leaf_seq: Set(Some(seq)),
+        id: ActiveValue::Set(id),
+        nonce: ActiveValue::Set(Some(nonce)),
+        tree_id: ActiveValue::Set(Some(tree_id)),
+        leaf: ActiveValue::Set(Some(leaf)),
+        data_hash: ActiveValue::Set(Some(data_hash)),
+        creator_hash: ActiveValue::Set(Some(creator_hash)),
+        leaf_seq: ActiveValue::Set(Some(seq)),
         ..Default::default()
     };
 
@@ -214,7 +219,7 @@ where
 
     txn.execute(query)
         .await
-        .map_err(|db_err| IngesterError::StorageWriteError(db_err.to_string()))?;
+        .map_err(|db_err| ProgramTransformerError::StorageWriteError(db_err.to_string()))?;
 
     Ok(())
 }
@@ -225,15 +230,15 @@ pub async fn upsert_asset_with_owner_and_delegate_info<T>(
     owner: Vec<u8>,
     delegate: Option<Vec<u8>>,
     seq: i64,
-) -> Result<(), IngesterError>
+) -> ProgramTransformerResult<()>
 where
     T: ConnectionTrait + TransactionTrait,
 {
     let model = asset::ActiveModel {
-        id: Set(id),
-        owner: Set(Some(owner)),
-        delegate: Set(delegate),
-        owner_delegate_seq: Set(Some(seq)),
+        id: ActiveValue::Set(id),
+        owner: ActiveValue::Set(Some(owner)),
+        delegate: ActiveValue::Set(delegate),
+        owner_delegate_seq: ActiveValue::Set(Some(seq)),
         ..Default::default()
     };
 
@@ -258,7 +263,7 @@ where
 
     txn.execute(query)
         .await
-        .map_err(|db_err| IngesterError::StorageWriteError(db_err.to_string()))?;
+        .map_err(|db_err| ProgramTransformerError::StorageWriteError(db_err.to_string()))?;
 
     Ok(())
 }
@@ -270,16 +275,16 @@ pub async fn upsert_asset_with_compression_info<T>(
     compressible: bool,
     supply: i64,
     supply_mint: Option<Vec<u8>>,
-) -> Result<(), IngesterError>
+) -> ProgramTransformerResult<()>
 where
     T: ConnectionTrait + TransactionTrait,
 {
     let model = asset::ActiveModel {
-        id: Set(id),
-        compressed: Set(compressed),
-        compressible: Set(compressible),
-        supply: Set(supply),
-        supply_mint: Set(supply_mint),
+        id: ActiveValue::Set(id),
+        compressed: ActiveValue::Set(compressed),
+        compressible: ActiveValue::Set(compressible),
+        supply: ActiveValue::Set(supply),
+        supply_mint: ActiveValue::Set(supply_mint),
         ..Default::default()
     };
 
@@ -303,13 +308,17 @@ where
     Ok(())
 }
 
-pub async fn upsert_asset_with_seq<T>(txn: &T, id: Vec<u8>, seq: i64) -> Result<(), IngesterError>
+pub async fn upsert_asset_with_seq<T>(
+    txn: &T,
+    id: Vec<u8>,
+    seq: i64,
+) -> ProgramTransformerResult<()>
 where
     T: ConnectionTrait + TransactionTrait,
 {
     let model = asset::ActiveModel {
-        id: Set(id),
-        seq: Set(Some(seq)),
+        id: ActiveValue::Set(id),
+        seq: ActiveValue::Set(Some(seq)),
         ..Default::default()
     };
 
@@ -330,7 +339,7 @@ where
 
     txn.execute(query)
         .await
-        .map_err(|db_err| IngesterError::StorageWriteError(db_err.to_string()))?;
+        .map_err(|db_err| ProgramTransformerError::StorageWriteError(db_err.to_string()))?;
 
     Ok(())
 }
@@ -341,7 +350,7 @@ pub async fn upsert_collection_info<T>(
     collection: Option<Collection>,
     slot_updated: i64,
     seq: i64,
-) -> Result<(), IngesterError>
+) -> ProgramTransformerResult<()>
 where
     T: ConnectionTrait + TransactionTrait,
 {
@@ -351,12 +360,12 @@ where
     };
 
     let model = asset_grouping::ActiveModel {
-        asset_id: Set(asset_id),
-        group_key: Set("collection".to_string()),
-        group_value: Set(group_value),
-        verified: Set(verified),
-        slot_updated: Set(Some(slot_updated)),
-        group_info_seq: Set(Some(seq)),
+        asset_id: ActiveValue::Set(asset_id),
+        group_key: ActiveValue::Set("collection".to_string()),
+        group_value: ActiveValue::Set(group_value),
+        verified: ActiveValue::Set(verified),
+        slot_updated: ActiveValue::Set(Some(slot_updated)),
+        group_info_seq: ActiveValue::Set(Some(seq)),
         ..Default::default()
     };
 
@@ -384,7 +393,7 @@ where
 
     txn.execute(query)
         .await
-        .map_err(|db_err| IngesterError::StorageWriteError(db_err.to_string()))?;
+        .map_err(|db_err| ProgramTransformerError::StorageWriteError(db_err.to_string()))?;
 
     Ok(())
 }
@@ -403,22 +412,22 @@ pub async fn upsert_asset_data<T>(
     raw_name: Vec<u8>,
     raw_symbol: Vec<u8>,
     seq: i64,
-) -> Result<(), IngesterError>
+) -> ProgramTransformerResult<()>
 where
     T: ConnectionTrait + TransactionTrait,
 {
     let model = asset_data::ActiveModel {
-        id: Set(id.clone()),
-        chain_data_mutability: Set(chain_data_mutability),
-        chain_data: Set(chain_data),
-        metadata_url: Set(metadata_url),
-        metadata_mutability: Set(metadata_mutability),
-        metadata: Set(metadata),
-        slot_updated: Set(slot_updated),
-        reindex: Set(reindex),
-        raw_name: Set(Some(raw_name)),
-        raw_symbol: Set(Some(raw_symbol)),
-        base_info_seq: Set(Some(seq)),
+        id: ActiveValue::Set(id.clone()),
+        chain_data_mutability: ActiveValue::Set(chain_data_mutability),
+        chain_data: ActiveValue::Set(chain_data),
+        metadata_url: ActiveValue::Set(metadata_url),
+        metadata_mutability: ActiveValue::Set(metadata_mutability),
+        metadata: ActiveValue::Set(metadata),
+        slot_updated: ActiveValue::Set(slot_updated),
+        reindex: ActiveValue::Set(reindex),
+        raw_name: ActiveValue::Set(Some(raw_name)),
+        raw_symbol: ActiveValue::Set(Some(raw_symbol)),
+        base_info_seq: ActiveValue::Set(Some(seq)),
     };
 
     let mut query = asset_data::Entity::insert(model)
@@ -450,7 +459,7 @@ where
     );
     txn.execute(query)
         .await
-        .map_err(|db_err| IngesterError::StorageWriteError(db_err.to_string()))?;
+        .map_err(|db_err| ProgramTransformerError::StorageWriteError(db_err.to_string()))?;
 
     Ok(())
 }
@@ -468,23 +477,23 @@ pub async fn upsert_asset_base_info<T>(
     royalty_amount: i32,
     slot_updated: i64,
     seq: i64,
-) -> Result<(), IngesterError>
+) -> ProgramTransformerResult<()>
 where
     T: ConnectionTrait + TransactionTrait,
 {
     // Set base info for asset.
     let asset_model = asset::ActiveModel {
-        id: Set(id.clone()),
-        owner_type: Set(owner_type),
-        frozen: Set(frozen),
-        specification_version: Set(Some(specification_version)),
-        specification_asset_class: Set(Some(specification_asset_class)),
-        royalty_target_type: Set(royalty_target_type),
-        royalty_target: Set(royalty_target),
-        royalty_amount: Set(royalty_amount),
-        asset_data: Set(Some(id.clone())),
-        slot_updated_cnft_transaction: Set(Some(slot_updated)),
-        base_info_seq: Set(Some(seq)),
+        id: ActiveValue::Set(id.clone()),
+        owner_type: ActiveValue::Set(owner_type),
+        frozen: ActiveValue::Set(frozen),
+        specification_version: ActiveValue::Set(Some(specification_version)),
+        specification_asset_class: ActiveValue::Set(Some(specification_asset_class)),
+        royalty_target_type: ActiveValue::Set(royalty_target_type),
+        royalty_target: ActiveValue::Set(royalty_target),
+        royalty_amount: ActiveValue::Set(royalty_amount),
+        asset_data: ActiveValue::Set(Some(id.clone())),
+        slot_updated_cnft_transaction: ActiveValue::Set(Some(slot_updated)),
+        base_info_seq: ActiveValue::Set(Some(seq)),
         ..Default::default()
     };
 
@@ -514,7 +523,7 @@ where
 
     txn.execute(query)
         .await
-        .map_err(|db_err| IngesterError::AssetIndexError(db_err.to_string()))?;
+        .map_err(|db_err| ProgramTransformerError::AssetIndexError(db_err.to_string()))?;
 
     Ok(())
 }
@@ -526,7 +535,7 @@ pub async fn upsert_asset_creators<T>(
     creators: &Vec<Creator>,
     slot_updated: i64,
     seq: i64,
-) -> Result<(), IngesterError>
+) -> ProgramTransformerResult<()>
 where
     T: ConnectionTrait + TransactionTrait,
 {
@@ -534,13 +543,13 @@ where
         // If creators are empty, insert an empty creator with the current sequence.
         // This prevents accidental errors during out-of-order updates.
         vec![asset_creators::ActiveModel {
-            asset_id: Set(id.clone()),
-            position: Set(0),
-            creator: Set(vec![]),
-            share: Set(100),
-            verified: Set(false),
-            slot_updated: Set(Some(slot_updated)),
-            seq: Set(Some(seq)),
+            asset_id: ActiveValue::Set(id.clone()),
+            position: ActiveValue::Set(0),
+            creator: ActiveValue::Set(vec![]),
+            share: ActiveValue::Set(100),
+            verified: ActiveValue::Set(false),
+            slot_updated: ActiveValue::Set(Some(slot_updated)),
+            seq: ActiveValue::Set(Some(seq)),
             ..Default::default()
         }]
     } else {
@@ -548,13 +557,13 @@ where
             .iter()
             .enumerate()
             .map(|(i, c)| asset_creators::ActiveModel {
-                asset_id: Set(id.clone()),
-                position: Set(i as i16),
-                creator: Set(c.address.to_bytes().to_vec()),
-                share: Set(c.share as i32),
-                verified: Set(c.verified),
-                slot_updated: Set(Some(slot_updated)),
-                seq: Set(Some(seq)),
+                asset_id: ActiveValue::Set(id.clone()),
+                position: ActiveValue::Set(i as i16),
+                creator: ActiveValue::Set(c.address.to_bytes().to_vec()),
+                share: ActiveValue::Set(c.share as i32),
+                verified: ActiveValue::Set(c.verified),
+                slot_updated: ActiveValue::Set(Some(slot_updated)),
+                seq: ActiveValue::Set(Some(seq)),
                 ..Default::default()
             })
             .collect()
@@ -594,15 +603,15 @@ pub async fn upsert_asset_authority<T>(
     authority: Vec<u8>,
     slot_updated: i64,
     seq: i64,
-) -> Result<(), IngesterError>
+) -> ProgramTransformerResult<()>
 where
     T: ConnectionTrait + TransactionTrait,
 {
     let model = asset_authority::ActiveModel {
-        asset_id: Set(asset_id),
-        authority: Set(authority),
-        seq: Set(seq),
-        slot_updated: Set(slot_updated),
+        asset_id: ActiveValue::Set(asset_id),
+        authority: ActiveValue::Set(authority),
+        seq: ActiveValue::Set(seq),
+        slot_updated: ActiveValue::Set(slot_updated),
         ..Default::default()
     };
 
@@ -619,7 +628,7 @@ where
 
     txn.execute(query)
         .await
-        .map_err(|db_err| IngesterError::AssetIndexError(db_err.to_string()))?;
+        .map_err(|db_err| ProgramTransformerError::AssetIndexError(db_err.to_string()))?;
 
     Ok(())
 }
diff --git a/nft_ingester/src/program_transformers/bubblegum/delegate.rs b/program_transformers/src/bubblegum/delegate.rs
similarity index 81%
rename from nft_ingester/src/program_transformers/bubblegum/delegate.rs
rename to program_transformers/src/bubblegum/delegate.rs
index 8df0de3d8..b491ab5b4 100644
--- a/nft_ingester/src/program_transformers/bubblegum/delegate.rs
+++ b/program_transformers/src/bubblegum/delegate.rs
@@ -1,15 +1,17 @@
-use crate::{
-    error::IngesterError,
-    program_transformers::bubblegum::{
-        save_changelog_event, upsert_asset_with_leaf_info,
-        upsert_asset_with_owner_and_delegate_info, upsert_asset_with_seq,
+use {
+    crate::{
+        bubblegum::db::{
+            save_changelog_event, upsert_asset_with_leaf_info,
+            upsert_asset_with_owner_and_delegate_info, upsert_asset_with_seq,
+        },
+        error::{ProgramTransformerError, ProgramTransformerResult},
     },
+    blockbuster::{
+        instruction::InstructionBundle,
+        programs::bubblegum::{BubblegumInstruction, LeafSchema},
+    },
+    sea_orm::{ConnectionTrait, TransactionTrait},
 };
-use blockbuster::{
-    instruction::InstructionBundle,
-    programs::bubblegum::{BubblegumInstruction, LeafSchema},
-};
-use sea_orm::{ConnectionTrait, TransactionTrait};
 
 pub async fn delegate<'c, T>(
     parsing_result: &BubblegumInstruction,
@@ -17,7 +19,7 @@ pub async fn delegate<'c, T>(
     txn: &'c T,
     instruction: &str,
     cl_audits: bool,
-) -> Result<(), IngesterError>
+) -> ProgramTransformerResult<()>
 where
     T: ConnectionTrait + TransactionTrait,
 {
@@ -76,7 +78,7 @@ where
             }
         }
     }
-    Err(IngesterError::ParsingError(
+    Err(ProgramTransformerError::ParsingError(
         "Ix not parsed correctly".to_string(),
     ))
 }
diff --git a/nft_ingester/src/program_transformers/bubblegum/mint_v1.rs b/program_transformers/src/bubblegum/mint_v1.rs
similarity index 81%
rename from nft_ingester/src/program_transformers/bubblegum/mint_v1.rs
rename to program_transformers/src/bubblegum/mint_v1.rs
index 5ea330cd8..a293eef8c 100644
--- a/nft_ingester/src/program_transformers/bubblegum/mint_v1.rs
+++ b/program_transformers/src/bubblegum/mint_v1.rs
@@ -1,28 +1,32 @@
-use crate::{
-    error::IngesterError,
-    program_transformers::bubblegum::{
-        bgum_use_method_to_token_metadata_use_method, save_changelog_event, upsert_asset_authority,
-        upsert_asset_base_info, upsert_asset_creators, upsert_asset_data,
-        upsert_asset_with_compression_info, upsert_asset_with_leaf_info,
-        upsert_asset_with_owner_and_delegate_info, upsert_asset_with_seq, upsert_collection_info,
+use {
+    crate::{
+        bubblegum::{
+            bgum_use_method_to_token_metadata_use_method,
+            db::{
+                save_changelog_event, upsert_asset_authority, upsert_asset_base_info,
+                upsert_asset_creators, upsert_asset_data, upsert_asset_with_compression_info,
+                upsert_asset_with_leaf_info, upsert_asset_with_owner_and_delegate_info,
+                upsert_asset_with_seq, upsert_collection_info,
+            },
+        },
+        error::{ProgramTransformerError, ProgramTransformerResult},
+        DownloadMetadataInfo,
     },
-    tasks::{DownloadMetadata, IntoTaskData, TaskData},
-};
-use blockbuster::{
-    instruction::InstructionBundle,
-    programs::bubblegum::{BubblegumInstruction, LeafSchema, Payload},
-    token_metadata::types::{TokenStandard, Uses},
-};
-use chrono::Utc;
-use digital_asset_types::{
-    dao::sea_orm_active_enums::{
-        ChainMutability, Mutability, OwnerType, RoyaltyTargetType, SpecificationAssetClass,
-        SpecificationVersions,
+    blockbuster::{
+        instruction::InstructionBundle,
+        programs::bubblegum::{BubblegumInstruction, LeafSchema, Payload},
+        token_metadata::types::{TokenStandard, Uses},
     },
-    json::ChainDataV1,
+    digital_asset_types::{
+        dao::sea_orm_active_enums::{
+            ChainMutability, Mutability, OwnerType, RoyaltyTargetType, SpecificationAssetClass,
+            SpecificationVersions,
+        },
+        json::ChainDataV1,
+    },
+    sea_orm::{query::JsonValue, ConnectionTrait, TransactionTrait},
+    tracing::warn,
 };
-use log::warn;
-use sea_orm::{query::*, ConnectionTrait, JsonValue};
 
 pub async fn mint_v1<'c, T>(
     parsing_result: &BubblegumInstruction,
@@ -30,7 +34,7 @@ pub async fn mint_v1<'c, T>(
     txn: &'c T,
     instruction: &str,
     cl_audits: bool,
-) -> Result<Option<TaskData>, IngesterError>
+) -> ProgramTransformerResult<Option<DownloadMetadataInfo>>
 where
     T: ConnectionTrait + TransactionTrait,
 {
@@ -78,7 +82,7 @@ where
                 };
                 chain_data.sanitize();
                 let chain_data_json = serde_json::to_value(chain_data)
-                    .map_err(|e| IngesterError::DeserializationError(e.to_string()))?;
+                    .map_err(|e| ProgramTransformerError::DeserializationError(e.to_string()))?;
                 let chain_mutability = match metadata.is_mutable {
                     true => ChainMutability::Mutable,
                     false => ChainMutability::Immutable,
@@ -205,19 +209,12 @@ where
                     return Ok(None);
                 }
 
-                let mut task = DownloadMetadata {
-                    asset_data_id: id_bytes.to_vec(),
-                    uri,
-                    created_at: Some(Utc::now().naive_utc()),
-                };
-                task.sanitize();
-                let t = task.into_task_data()?;
-                Ok(Some(t))
+                Ok(Some(DownloadMetadataInfo::new(id_bytes.to_vec(), uri)))
             }
-            _ => Err(IngesterError::NotImplemented),
+            _ => Err(ProgramTransformerError::NotImplemented),
         };
     }
-    Err(IngesterError::ParsingError(
+    Err(ProgramTransformerError::ParsingError(
         "Ix not parsed correctly".to_string(),
     ))
 }
diff --git a/nft_ingester/src/program_transformers/bubblegum/mod.rs b/program_transformers/src/bubblegum/mod.rs
similarity index 78%
rename from nft_ingester/src/program_transformers/bubblegum/mod.rs
rename to program_transformers/src/bubblegum/mod.rs
index 8e1522072..07659011f 100644
--- a/nft_ingester/src/program_transformers/bubblegum/mod.rs
+++ b/program_transformers/src/bubblegum/mod.rs
@@ -1,12 +1,18 @@
-use blockbuster::{
-    self,
-    instruction::InstructionBundle,
-    programs::bubblegum::{BubblegumInstruction, InstructionName, UseMethod as BubblegumUseMethod},
-    token_metadata::types::UseMethod as TokenMetadataUseMethod,
+use {
+    crate::{
+        error::{ProgramTransformerError, ProgramTransformerResult},
+        DownloadMetadataNotifier,
+    },
+    blockbuster::{
+        instruction::InstructionBundle,
+        programs::bubblegum::{
+            BubblegumInstruction, InstructionName, UseMethod as BubblegumUseMethod,
+        },
+        token_metadata::types::UseMethod as TokenMetadataUseMethod,
+    },
+    sea_orm::{ConnectionTrait, TransactionTrait},
+    tracing::{debug, info},
 };
-use log::{debug, info};
-use sea_orm::{ConnectionTrait, TransactionTrait};
-use tokio::sync::mpsc::UnboundedSender;
 
 mod burn;
 mod cancel_redeem;
@@ -19,17 +25,13 @@ mod redeem;
 mod transfer;
 mod update_metadata;
 
-pub use db::*;
-
-use crate::{error::IngesterError, tasks::TaskData};
-
 pub async fn handle_bubblegum_instruction<'c, T>(
     parsing_result: &'c BubblegumInstruction,
     bundle: &'c InstructionBundle<'c>,
     txn: &T,
-    task_manager: &UnboundedSender<TaskData>,
+    download_metadata_notifier: &DownloadMetadataNotifier,
     cl_audits: bool,
-) -> Result<(), IngesterError>
+) -> ProgramTransformerResult<()>
 where
     T: ConnectionTrait + TransactionTrait,
 {
@@ -70,10 +72,12 @@ where
             delegate::delegate(parsing_result, bundle, txn, ix_str, cl_audits).await?;
         }
         InstructionName::MintV1 | InstructionName::MintToCollectionV1 => {
-            let task = mint_v1::mint_v1(parsing_result, bundle, txn, ix_str, cl_audits).await?;
-
-            if let Some(t) = task {
-                task_manager.send(t)?;
+            if let Some(info) =
+                mint_v1::mint_v1(parsing_result, bundle, txn, ix_str, cl_audits).await?
+            {
+                download_metadata_notifier(info)
+                    .await
+                    .map_err(ProgramTransformerError::DownloadMetadataNotify)?;
             }
         }
         InstructionName::Redeem => {
@@ -96,12 +100,13 @@ where
         }
         InstructionName::SetDecompressibleState => (), // Nothing to index.
         InstructionName::UpdateMetadata => {
-            let task =
+            if let Some(info) =
                 update_metadata::update_metadata(parsing_result, bundle, txn, ix_str, cl_audits)
-                    .await?;
-
-            if let Some(t) = task {
-                task_manager.send(t)?;
+                    .await?
+            {
+                download_metadata_notifier(info)
+                    .await
+                    .map_err(ProgramTransformerError::DownloadMetadataNotify)?;
             }
         }
         _ => debug!("Bubblegum: Not Implemented Instruction"),
diff --git a/nft_ingester/src/program_transformers/bubblegum/redeem.rs b/program_transformers/src/bubblegum/redeem.rs
similarity index 76%
rename from nft_ingester/src/program_transformers/bubblegum/redeem.rs
rename to program_transformers/src/bubblegum/redeem.rs
index 8d1944412..e6a6080a3 100644
--- a/nft_ingester/src/program_transformers/bubblegum/redeem.rs
+++ b/program_transformers/src/bubblegum/redeem.rs
@@ -1,14 +1,16 @@
-use anchor_lang::prelude::Pubkey;
-use log::debug;
-
-use crate::{
-    error::IngesterError,
-    program_transformers::bubblegum::{
-        save_changelog_event, u32_to_u8_array, upsert_asset_with_leaf_info, upsert_asset_with_seq,
+use {
+    crate::{
+        bubblegum::{
+            db::{save_changelog_event, upsert_asset_with_leaf_info, upsert_asset_with_seq},
+            u32_to_u8_array,
+        },
+        error::{ProgramTransformerError, ProgramTransformerResult},
     },
+    blockbuster::{instruction::InstructionBundle, programs::bubblegum::BubblegumInstruction},
+    sea_orm::{ConnectionTrait, TransactionTrait},
+    solana_sdk::pubkey::Pubkey,
+    tracing::debug,
 };
-use blockbuster::{instruction::InstructionBundle, programs::bubblegum::BubblegumInstruction};
-use sea_orm::{ConnectionTrait, TransactionTrait};
 
 pub async fn redeem<'c, T>(
     parsing_result: &BubblegumInstruction,
@@ -16,7 +18,7 @@ pub async fn redeem<'c, T>(
     txn: &'c T,
     instruction: &str,
     cl_audits: bool,
-) -> Result<(), IngesterError>
+) -> ProgramTransformerResult<()>
 where
     T: ConnectionTrait + TransactionTrait,
 {
@@ -61,7 +63,7 @@ where
 
         return Ok(());
     }
-    Err(IngesterError::ParsingError(
+    Err(ProgramTransformerError::ParsingError(
         "Ix not parsed correctly".to_string(),
     ))
 }
diff --git a/nft_ingester/src/program_transformers/bubblegum/transfer.rs b/program_transformers/src/bubblegum/transfer.rs
similarity index 81%
rename from nft_ingester/src/program_transformers/bubblegum/transfer.rs
rename to program_transformers/src/bubblegum/transfer.rs
index 42351df2b..9aa6a3311 100644
--- a/nft_ingester/src/program_transformers/bubblegum/transfer.rs
+++ b/program_transformers/src/bubblegum/transfer.rs
@@ -1,16 +1,17 @@
-use super::save_changelog_event;
-use crate::{
-    error::IngesterError,
-    program_transformers::bubblegum::{
-        upsert_asset_with_leaf_info, upsert_asset_with_owner_and_delegate_info,
-        upsert_asset_with_seq,
+use {
+    crate::{
+        bubblegum::db::{
+            save_changelog_event, upsert_asset_with_leaf_info,
+            upsert_asset_with_owner_and_delegate_info, upsert_asset_with_seq,
+        },
+        error::{ProgramTransformerError, ProgramTransformerResult},
     },
+    blockbuster::{
+        instruction::InstructionBundle,
+        programs::bubblegum::{BubblegumInstruction, LeafSchema},
+    },
+    sea_orm::{ConnectionTrait, TransactionTrait},
 };
-use blockbuster::{
-    instruction::InstructionBundle,
-    programs::bubblegum::{BubblegumInstruction, LeafSchema},
-};
-use sea_orm::{ConnectionTrait, TransactionTrait};
 
 pub async fn transfer<'c, T>(
     parsing_result: &BubblegumInstruction,
@@ -18,7 +19,7 @@ pub async fn transfer<'c, T>(
     txn: &'c T,
     instruction: &str,
     cl_audits: bool,
-) -> Result<(), IngesterError>
+) -> ProgramTransformerResult<()>
 where
     T: ConnectionTrait + TransactionTrait,
 {
@@ -78,7 +79,7 @@ where
             }
         }
     }
-    Err(IngesterError::ParsingError(
+    Err(ProgramTransformerError::ParsingError(
         "Ix not parsed correctly".to_string(),
     ))
 }
diff --git a/nft_ingester/src/program_transformers/bubblegum/update_metadata.rs b/program_transformers/src/bubblegum/update_metadata.rs
similarity index 81%
rename from nft_ingester/src/program_transformers/bubblegum/update_metadata.rs
rename to program_transformers/src/bubblegum/update_metadata.rs
index 586a0a18d..19d9ca615 100644
--- a/nft_ingester/src/program_transformers/bubblegum/update_metadata.rs
+++ b/program_transformers/src/bubblegum/update_metadata.rs
@@ -1,27 +1,30 @@
-use crate::{
-    error::IngesterError,
-    program_transformers::bubblegum::{
-        bgum_use_method_to_token_metadata_use_method, save_changelog_event, upsert_asset_base_info,
-        upsert_asset_creators, upsert_asset_data, upsert_asset_with_leaf_info,
-        upsert_asset_with_seq,
+use {
+    crate::{
+        bubblegum::{
+            bgum_use_method_to_token_metadata_use_method,
+            db::{
+                save_changelog_event, upsert_asset_base_info, upsert_asset_creators,
+                upsert_asset_data, upsert_asset_with_leaf_info, upsert_asset_with_seq,
+            },
+        },
+        error::{ProgramTransformerError, ProgramTransformerResult},
+        DownloadMetadataInfo,
     },
-    tasks::{DownloadMetadata, IntoTaskData, TaskData},
-};
-use blockbuster::{
-    instruction::InstructionBundle,
-    programs::bubblegum::{BubblegumInstruction, LeafSchema, Payload},
-    token_metadata::types::{TokenStandard, Uses},
-};
-use chrono::Utc;
-use digital_asset_types::{
-    dao::sea_orm_active_enums::{
-        ChainMutability, Mutability, OwnerType, RoyaltyTargetType, SpecificationAssetClass,
-        SpecificationVersions,
+    blockbuster::{
+        instruction::InstructionBundle,
+        programs::bubblegum::{BubblegumInstruction, LeafSchema, Payload},
+        token_metadata::types::{TokenStandard, Uses},
     },
-    json::ChainDataV1,
+    digital_asset_types::{
+        dao::sea_orm_active_enums::{
+            ChainMutability, Mutability, OwnerType, RoyaltyTargetType, SpecificationAssetClass,
+            SpecificationVersions,
+        },
+        json::ChainDataV1,
+    },
+    sea_orm::{query::*, ConnectionTrait, JsonValue},
+    tracing::warn,
 };
-use log::warn;
-use sea_orm::{query::*, ConnectionTrait, JsonValue};
 
 pub async fn update_metadata<'c, T>(
     parsing_result: &BubblegumInstruction,
@@ -29,7 +32,7 @@ pub async fn update_metadata<'c, T>(
     txn: &'c T,
     instruction: &str,
     cl_audits: bool,
-) -> Result<Option<TaskData>, IngesterError>
+) -> ProgramTransformerResult<Option<DownloadMetadataInfo>>
 where
     T: ConnectionTrait + TransactionTrait,
 {
@@ -94,7 +97,7 @@ where
                 };
                 chain_data.sanitize();
                 let chain_data_json = serde_json::to_value(chain_data)
-                    .map_err(|e| IngesterError::DeserializationError(e.to_string()))?;
+                    .map_err(|e| ProgramTransformerError::DeserializationError(e.to_string()))?;
 
                 let is_mutable = if let Some(is_mutable) = update_args.is_mutable {
                     is_mutable
@@ -187,19 +190,12 @@ where
                     return Ok(None);
                 }
 
-                let mut task = DownloadMetadata {
-                    asset_data_id: id_bytes.to_vec(),
-                    uri,
-                    created_at: Some(Utc::now().naive_utc()),
-                };
-                task.sanitize();
-                let t = task.into_task_data()?;
-                Ok(Some(t))
+                Ok(Some(DownloadMetadataInfo::new(id_bytes.to_vec(), uri)))
             }
-            _ => Err(IngesterError::NotImplemented),
+            _ => Err(ProgramTransformerError::NotImplemented),
         };
     }
-    Err(IngesterError::ParsingError(
+    Err(ProgramTransformerError::ParsingError(
         "Ix not parsed correctly".to_string(),
     ))
 }
diff --git a/program_transformers/src/error.rs b/program_transformers/src/error.rs
new file mode 100644
index 000000000..d0c29f383
--- /dev/null
+++ b/program_transformers/src/error.rs
@@ -0,0 +1,37 @@
+use {blockbuster::error::BlockbusterError, sea_orm::DbErr};
+
+pub type ProgramTransformerResult<T> = Result<T, ProgramTransformerError>;
+
+#[derive(Debug, thiserror::Error)]
+pub enum ProgramTransformerError {
+    #[error("ChangeLog Event Malformed")]
+    ChangeLogEventMalformed,
+    #[error("Storage Write Error: {0}")]
+    StorageWriteError(String),
+    #[error("NotImplemented")]
+    NotImplemented,
+    #[error("Deserialization Error: {0}")]
+    DeserializationError(String),
+    #[error("Data serializaton error: {0}")]
+    SerializatonError(String),
+    #[error("Blockbuster Parsing error: {0}")]
+    ParsingError(String),
+    #[error("Database Error: {0}")]
+    DatabaseError(String),
+    #[error("AssetIndex Error {0}")]
+    AssetIndexError(String),
+    #[error("Failed to notify about download metadata: {0}")]
+    DownloadMetadataNotify(Box<dyn std::error::Error + Send + Sync>),
+}
+
+impl From<BlockbusterError> for ProgramTransformerError {
+    fn from(err: BlockbusterError) -> Self {
+        ProgramTransformerError::ParsingError(err.to_string())
+    }
+}
+
+impl From<DbErr> for ProgramTransformerError {
+    fn from(e: DbErr) -> Self {
+        ProgramTransformerError::StorageWriteError(e.to_string())
+    }
+}
diff --git a/nft_ingester/src/program_transformers/mod.rs b/program_transformers/src/lib.rs
similarity index 65%
rename from nft_ingester/src/program_transformers/mod.rs
rename to program_transformers/src/lib.rs
index 7d68c358d..f11e2a0da 100644
--- a/nft_ingester/src/program_transformers/mod.rs
+++ b/program_transformers/src/lib.rs
@@ -1,56 +1,90 @@
-use crate::{error::IngesterError, tasks::TaskData};
-use blockbuster::{
-    instruction::{order_instructions, InstructionBundle, IxPair},
-    program_handler::ProgramParser,
-    programs::{
-        bubblegum::BubblegumParser, token_account::TokenAccountParser,
-        token_metadata::TokenMetadataParser, ProgramParseResult,
+use {
+    crate::{
+        bubblegum::handle_bubblegum_instruction,
+        error::{ProgramTransformerError, ProgramTransformerResult},
+        token::handle_token_program_account,
+        token_metadata::handle_token_metadata_account,
     },
-};
-use log::{debug, error, info};
-use plerkle_serialization::{AccountInfo, Pubkey as FBPubkey, TransactionInfo};
-use sea_orm::{DatabaseConnection, SqlxPostgresConnector};
-use solana_sdk::pubkey::Pubkey;
-use sqlx::PgPool;
-use std::collections::{HashMap, HashSet, VecDeque};
-use tokio::sync::mpsc::UnboundedSender;
-
-use crate::program_transformers::{
-    bubblegum::handle_bubblegum_instruction, token::handle_token_program_account,
-    token_metadata::handle_token_metadata_account,
+    blockbuster::{
+        instruction::{order_instructions, InstructionBundle, IxPair},
+        program_handler::ProgramParser,
+        programs::{
+            bubblegum::BubblegumParser, token_account::TokenAccountParser,
+            token_metadata::TokenMetadataParser, ProgramParseResult,
+        },
+    },
+    futures::future::BoxFuture,
+    plerkle_serialization::{AccountInfo, Pubkey as FBPubkey, TransactionInfo},
+    sea_orm::{DatabaseConnection, SqlxPostgresConnector},
+    solana_sdk::pubkey::Pubkey,
+    sqlx::PgPool,
+    std::collections::{HashMap, HashSet, VecDeque},
+    tracing::{debug, error, info},
 };
 
 mod asset_upserts;
 mod bubblegum;
+pub mod error;
 mod token;
 mod token_metadata;
 
+#[derive(Debug, Clone, PartialEq, Eq)]
+pub struct DownloadMetadataInfo {
+    asset_data_id: Vec<u8>,
+    uri: String,
+}
+
+impl DownloadMetadataInfo {
+    pub fn new(asset_data_id: Vec<u8>, uri: String) -> Self {
+        Self {
+            asset_data_id,
+            uri: uri.trim().replace('\0', ""),
+        }
+    }
+
+    pub fn into_inner(self) -> (Vec<u8>, String) {
+        (self.asset_data_id, self.uri)
+    }
+}
+
+pub type DownloadMetadataNotifier = Box<
+    dyn Fn(
+            DownloadMetadataInfo,
+        ) -> BoxFuture<'static, Result<(), Box<dyn std::error::Error + Send + Sync>>>
+        + Sync
+        + Send,
+>;
+
 pub struct ProgramTransformer {
     storage: DatabaseConnection,
-    task_sender: UnboundedSender<TaskData>,
-    matchers: HashMap<Pubkey, Box<dyn ProgramParser>>,
+    download_metadata_notifier: DownloadMetadataNotifier,
+    parsers: HashMap<Pubkey, Box<dyn ProgramParser>>,
     key_set: HashSet<Pubkey>,
     cl_audits: bool,
 }
 
 impl ProgramTransformer {
-    pub fn new(pool: PgPool, task_sender: UnboundedSender<TaskData>, cl_audits: bool) -> Self {
-        let mut matchers: HashMap<Pubkey, Box<dyn ProgramParser>> = HashMap::with_capacity(1);
+    pub fn new(
+        pool: PgPool,
+        download_metadata_notifier: DownloadMetadataNotifier,
+        cl_audits: bool,
+    ) -> Self {
+        let mut parsers: HashMap<Pubkey, Box<dyn ProgramParser>> = HashMap::with_capacity(3);
         let bgum = BubblegumParser {};
         let token_metadata = TokenMetadataParser {};
         let token = TokenAccountParser {};
-        matchers.insert(bgum.key(), Box::new(bgum));
-        matchers.insert(token_metadata.key(), Box::new(token_metadata));
-        matchers.insert(token.key(), Box::new(token));
-        let hs = matchers.iter().fold(HashSet::new(), |mut acc, (k, _)| {
+        parsers.insert(bgum.key(), Box::new(bgum));
+        parsers.insert(token_metadata.key(), Box::new(token_metadata));
+        parsers.insert(token.key(), Box::new(token));
+        let hs = parsers.iter().fold(HashSet::new(), |mut acc, (k, _)| {
             acc.insert(*k);
             acc
         });
         let pool: PgPool = pool;
         ProgramTransformer {
             storage: SqlxPostgresConnector::from_sqlx_postgres_pool(pool),
-            task_sender,
-            matchers,
+            download_metadata_notifier,
+            parsers,
             key_set: hs,
             cl_audits,
         }
@@ -67,9 +101,9 @@ impl ProgramTransformer {
     #[allow(clippy::borrowed_box)]
     pub fn match_program(&self, key: &FBPubkey) -> Option<&Box<dyn ProgramParser>> {
         match Pubkey::try_from(key.0.as_slice()) {
-            Ok(pubkey) => self.matchers.get(&pubkey),
+            Ok(pubkey) => self.parsers.get(&pubkey),
             Err(_error) => {
-                log::warn!("failed to parse key: {key:?}");
+                error!("failed to parse key: {key:?}");
                 None
             }
         }
@@ -78,7 +112,7 @@ impl ProgramTransformer {
     pub async fn handle_transaction<'a>(
         &self,
         tx: &'a TransactionInfo<'a>,
-    ) -> Result<(), IngesterError> {
+    ) -> ProgramTransformerResult<()> {
         let sig: Option<&str> = tx.signature();
         info!("Handling Transaction: {:?}", sig);
         let instructions = self.break_transaction(tx);
@@ -102,7 +136,7 @@ impl ProgramTransformer {
             let ix_account_len = ix_accounts.len();
             let max = ix_accounts.iter().max().copied().unwrap_or(0) as usize;
             if keys.len() < max {
-                return Err(IngesterError::DeserializationError(
+                return Err(ProgramTransformerError::DeserializationError(
                     "Missing Accounts in Serialized Ixn/Txn".to_string(),
                 ));
             }
@@ -134,7 +168,7 @@ impl ProgramTransformer {
                             parsing_result,
                             &ix,
                             &self.storage,
-                            &self.task_sender,
+                            &self.download_metadata_notifier,
                             self.cl_audits,
                         )
                         .await
@@ -155,7 +189,7 @@ impl ProgramTransformer {
 
         if not_impl == ixlen {
             debug!("Not imple");
-            return Err(IngesterError::NotImplemented);
+            return Err(ProgramTransformerError::NotImplemented);
         }
         Ok(())
     }
@@ -163,7 +197,7 @@ impl ProgramTransformer {
     pub async fn handle_account_update<'b>(
         &self,
         acct: AccountInfo<'b>,
-    ) -> Result<(), IngesterError> {
+    ) -> ProgramTransformerResult<()> {
         let owner = acct.owner().unwrap();
         if let Some(program) = self.match_program(owner) {
             let result = program.handle_account(&acct)?;
@@ -174,7 +208,7 @@ impl ProgramTransformer {
                         &acct,
                         parsing_result,
                         &self.storage,
-                        &self.task_sender,
+                        &self.download_metadata_notifier,
                     )
                     .await
                 }
@@ -183,11 +217,11 @@ impl ProgramTransformer {
                         &acct,
                         parsing_result,
                         &self.storage,
-                        &self.task_sender,
+                        &self.download_metadata_notifier,
                     )
                     .await
                 }
-                _ => Err(IngesterError::NotImplemented),
+                _ => Err(ProgramTransformerError::NotImplemented),
             }?;
         }
         Ok(())
diff --git a/nft_ingester/src/program_transformers/token/mod.rs b/program_transformers/src/token/mod.rs
similarity index 72%
rename from nft_ingester/src/program_transformers/token/mod.rs
rename to program_transformers/src/token/mod.rs
index a8b9fd964..8b0590cce 100644
--- a/nft_ingester/src/program_transformers/token/mod.rs
+++ b/program_transformers/src/token/mod.rs
@@ -1,26 +1,31 @@
-use crate::{error::IngesterError, tasks::TaskData};
-use blockbuster::programs::token_account::TokenProgramAccount;
-use digital_asset_types::dao::{asset, sea_orm_active_enums::OwnerType, token_accounts, tokens};
-use plerkle_serialization::AccountInfo;
-use sea_orm::{
-    entity::*, query::*, sea_query::OnConflict, ActiveValue::Set, ConnectionTrait,
-    DatabaseConnection, DbBackend, EntityTrait,
-};
-use solana_sdk::program_option::COption;
-use spl_token::state::AccountState;
-use tokio::sync::mpsc::UnboundedSender;
-
-use super::asset_upserts::{
-    upsert_assets_mint_account_columns, upsert_assets_token_account_columns,
-    AssetMintAccountColumns, AssetTokenAccountColumns,
+use {
+    crate::{
+        asset_upserts::{
+            upsert_assets_mint_account_columns, upsert_assets_token_account_columns,
+            AssetMintAccountColumns, AssetTokenAccountColumns,
+        },
+        error::{ProgramTransformerError, ProgramTransformerResult},
+        DownloadMetadataNotifier,
+    },
+    blockbuster::programs::token_account::TokenProgramAccount,
+    digital_asset_types::dao::{asset, sea_orm_active_enums::OwnerType, token_accounts, tokens},
+    plerkle_serialization::AccountInfo,
+    sea_orm::{
+        entity::{ActiveValue, ColumnTrait},
+        query::{QueryFilter, QueryTrait},
+        sea_query::query::OnConflict,
+        ConnectionTrait, DatabaseConnection, DbBackend, EntityTrait, TransactionTrait,
+    },
+    solana_sdk::program_option::COption,
+    spl_token::state::AccountState,
 };
 
 pub async fn handle_token_program_account<'a, 'b, 'c>(
     account_update: &'a AccountInfo<'a>,
     parsing_result: &'b TokenProgramAccount,
     db: &'c DatabaseConnection,
-    _task_manager: &UnboundedSender<TaskData>,
-) -> Result<(), IngesterError> {
+    _download_metadata_notifier: &DownloadMetadataNotifier,
+) -> ProgramTransformerResult<()> {
     let key = *account_update.pubkey().unwrap();
     let key_bytes = key.0.to_vec();
     let spl_token_program = account_update.owner().unwrap().0.to_vec();
@@ -34,16 +39,16 @@ pub async fn handle_token_program_account<'a, 'b, 'c>(
             let frozen = matches!(ta.state, AccountState::Frozen);
             let owner = ta.owner.to_bytes().to_vec();
             let model = token_accounts::ActiveModel {
-                pubkey: Set(key_bytes),
-                mint: Set(mint.clone()),
-                delegate: Set(delegate.clone()),
-                owner: Set(owner.clone()),
-                frozen: Set(frozen),
-                delegated_amount: Set(ta.delegated_amount as i64),
-                token_program: Set(spl_token_program),
-                slot_updated: Set(account_update.slot() as i64),
-                amount: Set(ta.amount as i64),
-                close_authority: Set(None),
+                pubkey: ActiveValue::Set(key_bytes),
+                mint: ActiveValue::Set(mint.clone()),
+                delegate: ActiveValue::Set(delegate.clone()),
+                owner: ActiveValue::Set(owner.clone()),
+                frozen: ActiveValue::Set(frozen),
+                delegated_amount: ActiveValue::Set(ta.delegated_amount as i64),
+                token_program: ActiveValue::Set(spl_token_program),
+                slot_updated: ActiveValue::Set(account_update.slot() as i64),
+                amount: ActiveValue::Set(ta.amount as i64),
+                close_authority: ActiveValue::Set(None),
             };
 
             let mut query = token_accounts::Entity::insert(model)
@@ -104,15 +109,15 @@ pub async fn handle_token_program_account<'a, 'b, 'c>(
                 COption::None => None,
             };
             let model = tokens::ActiveModel {
-                mint: Set(key_bytes.clone()),
-                token_program: Set(spl_token_program),
-                slot_updated: Set(account_update.slot() as i64),
-                supply: Set(m.supply as i64),
-                decimals: Set(m.decimals as i32),
-                close_authority: Set(None),
-                extension_data: Set(None),
-                mint_authority: Set(mint_auth),
-                freeze_authority: Set(freeze_auth),
+                mint: ActiveValue::Set(key_bytes.clone()),
+                token_program: ActiveValue::Set(spl_token_program),
+                slot_updated: ActiveValue::Set(account_update.slot() as i64),
+                supply: ActiveValue::Set(m.supply as i64),
+                decimals: ActiveValue::Set(m.decimals as i32),
+                close_authority: ActiveValue::Set(None),
+                extension_data: ActiveValue::Set(None),
+                mint_authority: ActiveValue::Set(mint_auth),
+                freeze_authority: ActiveValue::Set(freeze_auth),
             };
 
             let mut query = tokens::Entity::insert(model)
@@ -162,7 +167,7 @@ pub async fn handle_token_program_account<'a, 'b, 'c>(
 
             Ok(())
         }
-        _ => Err(IngesterError::NotImplemented),
+        _ => Err(ProgramTransformerError::NotImplemented),
     }?;
     Ok(())
 }
diff --git a/nft_ingester/src/program_transformers/token_metadata/master_edition.rs b/program_transformers/src/token_metadata/master_edition.rs
similarity index 65%
rename from nft_ingester/src/program_transformers/token_metadata/master_edition.rs
rename to program_transformers/src/token_metadata/master_edition.rs
index 063703993..e62d89932 100644
--- a/nft_ingester/src/program_transformers/token_metadata/master_edition.rs
+++ b/program_transformers/src/token_metadata/master_edition.rs
@@ -1,16 +1,20 @@
-use crate::error::IngesterError;
-use blockbuster::token_metadata::{
-    accounts::{DeprecatedMasterEditionV1, MasterEdition},
-    types::Key,
-};
-use digital_asset_types::dao::{
-    asset, asset_v1_account_attachments, extensions,
-    sea_orm_active_enums::{SpecificationAssetClass, V1AccountAttachments},
-};
-use plerkle_serialization::Pubkey as FBPubkey;
-use sea_orm::{
-    entity::*, query::*, sea_query::OnConflict, ActiveValue::Set, ConnectionTrait,
-    DatabaseTransaction, DbBackend, EntityTrait,
+use {
+    crate::error::{ProgramTransformerError, ProgramTransformerResult},
+    blockbuster::token_metadata::{
+        accounts::{DeprecatedMasterEditionV1, MasterEdition},
+        types::Key,
+    },
+    digital_asset_types::dao::{
+        asset, asset_v1_account_attachments, extensions,
+        sea_orm_active_enums::{SpecificationAssetClass, V1AccountAttachments},
+    },
+    plerkle_serialization::Pubkey as FBPubkey,
+    sea_orm::{
+        entity::{ActiveModelTrait, ActiveValue, EntityTrait, RelationTrait},
+        query::{JoinType, QuerySelect, QueryTrait},
+        sea_query::query::OnConflict,
+        ConnectionTrait, DatabaseTransaction, DbBackend,
+    },
 };
 
 pub async fn save_v2_master_edition(
@@ -18,7 +22,7 @@ pub async fn save_v2_master_edition(
     slot: u64,
     me_data: &MasterEdition,
     txn: &DatabaseTransaction,
-) -> Result<(), IngesterError> {
+) -> ProgramTransformerResult<()> {
     save_master_edition(
         V1AccountAttachments::MasterEditionV2,
         id,
@@ -34,7 +38,7 @@ pub async fn save_v1_master_edition(
     slot: u64,
     me_data: &DeprecatedMasterEditionV1,
     txn: &DatabaseTransaction,
-) -> Result<(), IngesterError> {
+) -> ProgramTransformerResult<()> {
     // This discards the deprecated `MasterEditionV1` fields
     // but sets the `Key`` as `MasterEditionV1`.
     let bridge = MasterEdition {
@@ -57,7 +61,7 @@ pub async fn save_master_edition(
     slot: u64,
     me_data: &MasterEdition,
     txn: &DatabaseTransaction,
-) -> Result<(), IngesterError> {
+) -> ProgramTransformerResult<()> {
     let id_bytes = id.0.to_vec();
     let master_edition: Option<(asset_v1_account_attachments::Model, Option<asset::Model>)> =
         asset_v1_account_attachments::Entity::find_by_id(id.0.to_vec())
@@ -69,20 +73,20 @@ pub async fn save_master_edition(
             .one(txn)
             .await?;
     let ser = serde_json::to_value(me_data)
-        .map_err(|e| IngesterError::SerializatonError(e.to_string()))?;
+        .map_err(|e| ProgramTransformerError::SerializatonError(e.to_string()))?;
 
     let model = asset_v1_account_attachments::ActiveModel {
-        id: Set(id_bytes),
-        attachment_type: Set(version),
-        data: Set(Some(ser)),
-        slot_updated: Set(slot as i64),
+        id: ActiveValue::Set(id_bytes),
+        attachment_type: ActiveValue::Set(version),
+        data: ActiveValue::Set(Some(ser)),
+        slot_updated: ActiveValue::Set(slot as i64),
         ..Default::default()
     };
 
     if let Some((_me, Some(asset))) = master_edition {
         let mut updatable: asset::ActiveModel = asset.into();
-        updatable.supply = Set(1);
-        updatable.specification_asset_class = Set(Some(SpecificationAssetClass::Nft));
+        updatable.supply = ActiveValue::Set(1);
+        updatable.specification_asset_class = ActiveValue::Set(Some(SpecificationAssetClass::Nft));
         updatable.update(txn).await?;
     }
 
diff --git a/nft_ingester/src/program_transformers/token_metadata/mod.rs b/program_transformers/src/token_metadata/mod.rs
similarity index 58%
rename from nft_ingester/src/program_transformers/token_metadata/mod.rs
rename to program_transformers/src/token_metadata/mod.rs
index b6b548900..beb2f3a97 100644
--- a/nft_ingester/src/program_transformers/token_metadata/mod.rs
+++ b/program_transformers/src/token_metadata/mod.rs
@@ -1,25 +1,26 @@
-mod master_edition;
-mod v1_asset;
-
-use crate::{
-    error::IngesterError,
-    program_transformers::token_metadata::{
-        master_edition::{save_v1_master_edition, save_v2_master_edition},
-        v1_asset::{burn_v1_asset, save_v1_asset},
+use {
+    crate::{
+        error::{ProgramTransformerError, ProgramTransformerResult},
+        token_metadata::{
+            master_edition::{save_v1_master_edition, save_v2_master_edition},
+            v1_asset::{burn_v1_asset, save_v1_asset},
+        },
+        DownloadMetadataNotifier,
     },
-    tasks::TaskData,
+    blockbuster::programs::token_metadata::{TokenMetadataAccountData, TokenMetadataAccountState},
+    plerkle_serialization::AccountInfo,
+    sea_orm::{DatabaseConnection, TransactionTrait},
 };
-use blockbuster::programs::token_metadata::{TokenMetadataAccountData, TokenMetadataAccountState};
-use plerkle_serialization::AccountInfo;
-use sea_orm::{DatabaseConnection, TransactionTrait};
-use tokio::sync::mpsc::UnboundedSender;
+
+mod master_edition;
+mod v1_asset;
 
 pub async fn handle_token_metadata_account<'a, 'b, 'c>(
     account_update: &'a AccountInfo<'a>,
     parsing_result: &'b TokenMetadataAccountState,
     db: &'c DatabaseConnection,
-    task_manager: &UnboundedSender<TaskData>,
-) -> Result<(), IngesterError> {
+    download_metadata_notifier: &DownloadMetadataNotifier,
+) -> ProgramTransformerResult<()> {
     let key = *account_update.pubkey().unwrap();
     match &parsing_result.data {
         TokenMetadataAccountData::EmptyAccount => {
@@ -33,9 +34,10 @@ pub async fn handle_token_metadata_account<'a, 'b, 'c>(
             Ok(())
         }
         TokenMetadataAccountData::MetadataV1(m) => {
-            let task = save_v1_asset(db, m, account_update.slot()).await?;
-            if let Some(task) = task {
-                task_manager.send(task)?;
+            if let Some(info) = save_v1_asset(db, m, account_update.slot()).await? {
+                download_metadata_notifier(info)
+                    .await
+                    .map_err(ProgramTransformerError::DownloadMetadataNotify)?;
             }
             Ok(())
         }
@@ -48,7 +50,7 @@ pub async fn handle_token_metadata_account<'a, 'b, 'c>(
         // TokenMetadataAccountData::EditionMarker(_) => {}
         // TokenMetadataAccountData::UseAuthorityRecord(_) => {}
         // TokenMetadataAccountData::CollectionAuthorityRecord(_) => {}
-        _ => Err(IngesterError::NotImplemented),
+        _ => Err(ProgramTransformerError::NotImplemented),
     }?;
     Ok(())
 }
diff --git a/nft_ingester/src/program_transformers/token_metadata/v1_asset.rs b/program_transformers/src/token_metadata/v1_asset.rs
similarity index 72%
rename from nft_ingester/src/program_transformers/token_metadata/v1_asset.rs
rename to program_transformers/src/token_metadata/v1_asset.rs
index 2ed3cbec8..fefaa0aad 100644
--- a/nft_ingester/src/program_transformers/token_metadata/v1_asset.rs
+++ b/program_transformers/src/token_metadata/v1_asset.rs
@@ -1,50 +1,51 @@
-use crate::program_transformers::asset_upserts::{
-    upsert_assets_metadata_account_columns, upsert_assets_mint_account_columns,
-    upsert_assets_token_account_columns, AssetMetadataAccountColumns, AssetMintAccountColumns,
-    AssetTokenAccountColumns,
-};
-use crate::tasks::{DownloadMetadata, IntoTaskData};
-use crate::{error::IngesterError, metric, tasks::TaskData};
-use blockbuster::token_metadata::{
-    accounts::{MasterEdition, Metadata},
-    types::TokenStandard,
-};
-use cadence_macros::{is_global_default_set, statsd_count};
-use chrono::Utc;
-use digital_asset_types::dao::{asset_authority, asset_data, asset_grouping, token_accounts};
-use digital_asset_types::{
-    dao::{
-        asset, asset_creators, asset_v1_account_attachments,
-        sea_orm_active_enums::{
-            ChainMutability, Mutability, OwnerType, SpecificationAssetClass, SpecificationVersions,
-            V1AccountAttachments,
+use {
+    crate::{
+        asset_upserts::{
+            upsert_assets_metadata_account_columns, upsert_assets_mint_account_columns,
+            upsert_assets_token_account_columns, AssetMetadataAccountColumns,
+            AssetMintAccountColumns, AssetTokenAccountColumns,
         },
-        tokens,
+        error::{ProgramTransformerError, ProgramTransformerResult},
+        DownloadMetadataInfo,
     },
-    json::ChainDataV1,
-};
-use lazy_static::lazy_static;
-use log::warn;
-use plerkle_serialization::Pubkey as FBPubkey;
-use sea_orm::{
-    entity::*, query::*, sea_query::OnConflict, ActiveValue::Set, ConnectionTrait, DbBackend,
-    DbErr, EntityTrait, JsonValue,
+    blockbuster::token_metadata::{
+        accounts::{MasterEdition, Metadata},
+        types::TokenStandard,
+    },
+    digital_asset_types::{
+        dao::{
+            asset, asset_authority, asset_creators, asset_data, asset_grouping,
+            asset_v1_account_attachments,
+            sea_orm_active_enums::{
+                ChainMutability, Mutability, OwnerType, SpecificationAssetClass,
+                SpecificationVersions, V1AccountAttachments,
+            },
+            token_accounts, tokens,
+        },
+        json::ChainDataV1,
+    },
+    plerkle_serialization::Pubkey as FBPubkey,
+    sea_orm::{
+        entity::{ActiveValue, ColumnTrait, EntityTrait},
+        query::{JsonValue, Order, QueryFilter, QueryOrder, QueryTrait, Select},
+        sea_query::query::OnConflict,
+        ConnectionTrait, DbBackend, DbErr, TransactionTrait,
+    },
+    solana_sdk::{pubkey, pubkey::Pubkey},
+    tokio::time::{sleep, Duration},
+    tracing::warn,
 };
-use solana_sdk::pubkey::Pubkey;
-use std::str::FromStr;
-use std::time::Duration;
-use tokio::time::sleep;
 
 pub async fn burn_v1_asset<T: ConnectionTrait + TransactionTrait>(
     conn: &T,
     id: FBPubkey,
     slot: u64,
-) -> Result<(), IngesterError> {
+) -> ProgramTransformerResult<()> {
     let (id, slot_i) = (id.0, slot as i64);
     let model = asset::ActiveModel {
-        id: Set(id.to_vec()),
-        slot_updated: Set(Some(slot_i)),
-        burnt: Set(true),
+        id: ActiveValue::Set(id.to_vec()),
+        slot_updated: ActiveValue::Set(Some(slot_i)),
+        burnt: ActiveValue::Set(true),
         ..Default::default()
     };
     let mut query = asset::Entity::insert(model)
@@ -63,17 +64,12 @@ pub async fn burn_v1_asset<T: ConnectionTrait + TransactionTrait>(
 }
 
 const RETRY_INTERVALS: &[u64] = &[0, 5, 10];
-const WSOL_ADDRESS: &str = "So11111111111111111111111111111111111111112";
-
-lazy_static! {
-    static ref WSOL_PUBKEY: Pubkey =
-        Pubkey::from_str(WSOL_ADDRESS).expect("Invalid public key format");
-}
+static WSOL_PUBKEY: Pubkey = pubkey!("So11111111111111111111111111111111111111112");
 
 pub async fn index_and_fetch_mint_data<T: ConnectionTrait + TransactionTrait>(
     conn: &T,
     mint_pubkey_vec: Vec<u8>,
-) -> Result<Option<tokens::Model>, IngesterError> {
+) -> ProgramTransformerResult<Option<tokens::Model>> {
     // Gets the token and token account for the mint to populate the asset.
     // This is required when the token and token account are indexed, but not the metadata account.
     // If the metadata account is indexed, then the token and ta ingester will update the asset with the correct data.
@@ -96,7 +92,7 @@ pub async fn index_and_fetch_mint_data<T: ConnectionTrait + TransactionTrait>(
             conn,
         )
         .await
-        .map_err(|db_err| IngesterError::AssetIndexError(db_err.to_string()))?;
+        .map_err(|db_err| ProgramTransformerError::AssetIndexError(db_err.to_string()))?;
         Ok(Some(token))
     } else {
         warn!(
@@ -111,7 +107,7 @@ pub async fn index_and_fetch_mint_data<T: ConnectionTrait + TransactionTrait>(
 async fn index_token_account_data<T: ConnectionTrait + TransactionTrait>(
     conn: &T,
     mint_pubkey_vec: Vec<u8>,
-) -> Result<(), IngesterError> {
+) -> ProgramTransformerResult<()> {
     let token_account: Option<token_accounts::Model> = find_model_with_retry(
         conn,
         "owners",
@@ -122,7 +118,7 @@ async fn index_token_account_data<T: ConnectionTrait + TransactionTrait>(
         RETRY_INTERVALS,
     )
     .await
-    .map_err(|e: DbErr| IngesterError::DatabaseError(e.to_string()))?;
+    .map_err(|e: DbErr| ProgramTransformerError::DatabaseError(e.to_string()))?;
 
     if let Some(token_account) = token_account {
         upsert_assets_token_account_columns(
@@ -136,7 +132,7 @@ async fn index_token_account_data<T: ConnectionTrait + TransactionTrait>(
             conn,
         )
         .await
-        .map_err(|db_err| IngesterError::AssetIndexError(db_err.to_string()))?;
+        .map_err(|db_err| ProgramTransformerError::AssetIndexError(db_err.to_string()))?;
     } else {
         warn!(
             target: "Account not found",
@@ -152,7 +148,7 @@ pub async fn save_v1_asset<T: ConnectionTrait + TransactionTrait>(
     conn: &T,
     metadata: &Metadata,
     slot: u64,
-) -> Result<Option<TaskData>, IngesterError> {
+) -> ProgramTransformerResult<Option<DownloadMetadataInfo>> {
     let metadata = metadata.clone();
     let mint_pubkey = metadata.mint;
     let mint_pubkey_array = mint_pubkey.to_bytes();
@@ -186,7 +182,7 @@ pub async fn save_v1_asset<T: ConnectionTrait + TransactionTrait>(
 
     // Wrapped Solana is a special token that has supply 0 (infinite).
     // It's a fungible token with a metadata account, but without any token standard, meaning the code above will misabel it as an NFT.
-    if mint_pubkey == *WSOL_PUBKEY {
+    if mint_pubkey == WSOL_PUBKEY {
         ownership_type = OwnerType::Token;
         class = SpecificationAssetClass::FungibleToken;
     }
@@ -222,23 +218,23 @@ pub async fn save_v1_asset<T: ConnectionTrait + TransactionTrait>(
     };
     chain_data.sanitize();
     let chain_data_json = serde_json::to_value(chain_data)
-        .map_err(|e| IngesterError::DeserializationError(e.to_string()))?;
+        .map_err(|e| ProgramTransformerError::DeserializationError(e.to_string()))?;
     let chain_mutability = match metadata.is_mutable {
         true => ChainMutability::Mutable,
         false => ChainMutability::Immutable,
     };
     let asset_data_model = asset_data::ActiveModel {
-        chain_data_mutability: Set(chain_mutability),
-        chain_data: Set(chain_data_json),
-        metadata_url: Set(uri.clone()),
-        metadata: Set(JsonValue::String("processing".to_string())),
-        metadata_mutability: Set(Mutability::Mutable),
-        slot_updated: Set(slot_i),
-        reindex: Set(Some(true)),
-        id: Set(mint_pubkey_vec.clone()),
-        raw_name: Set(Some(name.to_vec())),
-        raw_symbol: Set(Some(symbol.to_vec())),
-        base_info_seq: Set(Some(0)),
+        chain_data_mutability: ActiveValue::Set(chain_mutability),
+        chain_data: ActiveValue::Set(chain_data_json),
+        metadata_url: ActiveValue::Set(uri.clone()),
+        metadata: ActiveValue::Set(JsonValue::String("processing".to_string())),
+        metadata_mutability: ActiveValue::Set(Mutability::Mutable),
+        slot_updated: ActiveValue::Set(slot_i),
+        reindex: ActiveValue::Set(Some(true)),
+        id: ActiveValue::Set(mint_pubkey_vec.clone()),
+        raw_name: ActiveValue::Set(Some(name.to_vec())),
+        raw_symbol: ActiveValue::Set(Some(symbol.to_vec())),
+        base_info_seq: ActiveValue::Set(Some(0)),
     };
     let txn = conn.begin().await?;
     let mut query = asset_data::Entity::insert(asset_data_model)
@@ -264,7 +260,7 @@ pub async fn save_v1_asset<T: ConnectionTrait + TransactionTrait>(
     );
     txn.execute(query)
         .await
-        .map_err(|db_err| IngesterError::AssetIndexError(db_err.to_string()))?;
+        .map_err(|db_err| ProgramTransformerError::AssetIndexError(db_err.to_string()))?;
 
     upsert_assets_metadata_account_columns(
         AssetMetadataAccountColumns {
@@ -280,9 +276,9 @@ pub async fn save_v1_asset<T: ConnectionTrait + TransactionTrait>(
     .await?;
 
     let attachment = asset_v1_account_attachments::ActiveModel {
-        id: Set(edition_attachment_address.to_bytes().to_vec()),
-        slot_updated: Set(slot_i),
-        attachment_type: Set(V1AccountAttachments::MasterEditionV2),
+        id: ActiveValue::Set(edition_attachment_address.to_bytes().to_vec()),
+        slot_updated: ActiveValue::Set(slot_i),
+        attachment_type: ActiveValue::Set(V1AccountAttachments::MasterEditionV2),
         ..Default::default()
     };
     let query = asset_v1_account_attachments::Entity::insert(attachment)
@@ -294,13 +290,13 @@ pub async fn save_v1_asset<T: ConnectionTrait + TransactionTrait>(
         .build(DbBackend::Postgres);
     txn.execute(query)
         .await
-        .map_err(|db_err| IngesterError::AssetIndexError(db_err.to_string()))?;
+        .map_err(|db_err| ProgramTransformerError::AssetIndexError(db_err.to_string()))?;
 
     let model = asset_authority::ActiveModel {
-        asset_id: Set(mint_pubkey_vec.clone()),
-        authority: Set(authority),
-        seq: Set(0),
-        slot_updated: Set(slot_i),
+        asset_id: ActiveValue::Set(mint_pubkey_vec.clone()),
+        authority: ActiveValue::Set(authority),
+        seq: ActiveValue::Set(0),
+        slot_updated: ActiveValue::Set(slot_i),
         ..Default::default()
     };
     let mut query = asset_authority::Entity::insert(model)
@@ -320,16 +316,16 @@ pub async fn save_v1_asset<T: ConnectionTrait + TransactionTrait>(
     );
     txn.execute(query)
         .await
-        .map_err(|db_err| IngesterError::AssetIndexError(db_err.to_string()))?;
+        .map_err(|db_err| ProgramTransformerError::AssetIndexError(db_err.to_string()))?;
 
     if let Some(c) = &metadata.collection {
         let model = asset_grouping::ActiveModel {
-            asset_id: Set(mint_pubkey_vec.clone()),
-            group_key: Set("collection".to_string()),
-            group_value: Set(Some(c.key.to_string())),
-            verified: Set(c.verified),
-            group_info_seq: Set(Some(0)),
-            slot_updated: Set(Some(slot_i)),
+            asset_id: ActiveValue::Set(mint_pubkey_vec.clone()),
+            group_key: ActiveValue::Set("collection".to_string()),
+            group_value: ActiveValue::Set(Some(c.key.to_string())),
+            verified: ActiveValue::Set(c.verified),
+            group_info_seq: ActiveValue::Set(Some(0)),
+            slot_updated: ActiveValue::Set(Some(slot_i)),
             ..Default::default()
         };
         let mut query = asset_grouping::Entity::insert(model)
@@ -353,7 +349,7 @@ pub async fn save_v1_asset<T: ConnectionTrait + TransactionTrait>(
         );
         txn.execute(query)
             .await
-            .map_err(|db_err| IngesterError::AssetIndexError(db_err.to_string()))?;
+            .map_err(|db_err| ProgramTransformerError::AssetIndexError(db_err.to_string()))?;
     }
 
     let creators = metadata
@@ -362,13 +358,13 @@ pub async fn save_v1_asset<T: ConnectionTrait + TransactionTrait>(
         .iter()
         .enumerate()
         .map(|(i, creator)| asset_creators::ActiveModel {
-            asset_id: Set(mint_pubkey_vec.clone()),
-            position: Set(i as i16),
-            creator: Set(creator.address.to_bytes().to_vec()),
-            share: Set(creator.share as i32),
-            verified: Set(creator.verified),
-            slot_updated: Set(Some(slot_i)),
-            seq: Set(Some(0)),
+            asset_id: ActiveValue::Set(mint_pubkey_vec.clone()),
+            position: ActiveValue::Set(i as i16),
+            creator: ActiveValue::Set(creator.address.to_bytes().to_vec()),
+            share: ActiveValue::Set(creator.share as i32),
+            verified: ActiveValue::Set(creator.verified),
+            slot_updated: ActiveValue::Set(Some(slot_i)),
+            seq: ActiveValue::Set(Some(0)),
             ..Default::default()
         })
         .collect::<Vec<_>>();
@@ -396,7 +392,7 @@ pub async fn save_v1_asset<T: ConnectionTrait + TransactionTrait>(
             );
         txn.execute(query)
             .await
-            .map_err(|db_err| IngesterError::AssetIndexError(db_err.to_string()))?;
+            .map_err(|db_err| ProgramTransformerError::AssetIndexError(db_err.to_string()))?;
     }
     txn.commit().await?;
 
@@ -408,14 +404,7 @@ pub async fn save_v1_asset<T: ConnectionTrait + TransactionTrait>(
         return Ok(None);
     }
 
-    let mut task = DownloadMetadata {
-        asset_data_id: mint_pubkey_vec.clone(),
-        uri,
-        created_at: Some(Utc::now().naive_utc()),
-    };
-    task.sanitize();
-    let t = task.into_task_data()?;
-    Ok(Some(t))
+    Ok(Some(DownloadMetadataInfo::new(mint_pubkey_vec, uri)))
 }
 
 async fn find_model_with_retry<T: ConnectionTrait + TransactionTrait, K: EntityTrait>(
@@ -428,7 +417,7 @@ async fn find_model_with_retry<T: ConnectionTrait + TransactionTrait, K: EntityT
     let metric_name = format!("{}_found", model_name);
 
     for interval in retry_intervals {
-        let interval_duration = Duration::from_millis(interval.to_owned());
+        let interval_duration = Duration::from_millis(*interval);
         sleep(interval_duration).await;
 
         let model = select.clone().one(conn).await?;
@@ -446,7 +435,7 @@ async fn find_model_with_retry<T: ConnectionTrait + TransactionTrait, K: EntityT
 fn record_metric(metric_name: &str, success: bool, retries: u32) {
     let retry_count = &retries.to_string();
     let success = if success { "true" } else { "false" };
-    metric! {
-        statsd_count!(metric_name, 1, "success" => success, "retry_count" => retry_count);
+    if cadence_macros::is_global_default_set() {
+        cadence_macros::statsd_count!(metric_name, 1, "success" => success, "retry_count" => retry_count);
     }
 }