diff --git a/MKR_delegate_targeting.Rmd b/MKR_delegate_targeting.Rmd new file mode 100644 index 0000000..6fd5d22 --- /dev/null +++ b/MKR_delegate_targeting.Rmd @@ -0,0 +1,215 @@ +--- +title: "Understanding MKR spread for Delegate Targeting" +author: "Carlos Mercado" +date: '2022-08-30' +output: + html_document: + code_folding: hide +editor_options: + chunk_output_type: console +--- + +# Intro + +Flipside's governance team works deeply with the MakerDAO team to create, discuss, and vote on proposals that +ultimately improve Maker's market position and revenue model. In order to increase our influence +at Maker, we seek delegation of MKR to our voting address. + +This markdown details use of the new Flipside `ethscore` package to identify potential +addresses to target to request/earn delegation of their MKR to our voting address. + +# Package Requirements + +ethscore uses shroomDK to access Flipside data for its analysis. The best way to install these +packages is via devtools install_github(). + +```{r, eval = FALSE, message = FALSE, warning= FALSE} +# This chunk does not eval +# library(devtools) # install if you haven't already +# devtools::install_github(repo = 'FlipsideCrypto/sdk', subdir = 'r/shroomDK') +# devtools::install_github(repo = 'FlipsideCrypto/ethscore') +``` + +# Addressable Market of MKR Delegation + +Not all holders of an ERC20 are externally owned accounts (EOAs). Some are contract addresses, +others are gnosis-safes. Among EOAs, there are central exchange managed EOAs for coordinating deposits and withdrawals +on and off chain which would be inappropriate targets for delegation. Also some EOAs are 'cold storage' in that they hold a balance but have never initiated a transaction. If an EOA has never done a transaction, it is unlikely its first +will be delegation of a token which requires approvals and other contract interactions that the user may find risky. + +Thus, for the purposes of growing our delegation, it is imperative we understand the addressable market +as: + + - EOAs that are active and likely human owned + - Gnosis safes, e.g., DAO multi-sigs. + - MKR in the delegate contract(s) + - Note: this is 'pvp' in that each MKR we are delegated from this contract is explicitly a MKR taken from another delegate. While we support competition, our first goal is to activate more MKR, not simply fight over a fixed pool. + +## Current balance of MKR held by those with 1+ MKR + +'Dust' is common in crypto. Users make swaps of non-integer sizes and end up with balances that use many of the +18 decimals permitted by ERC20s, e.g., having 0.0042069 MKR (~ $3 at time of writing). This naturally inflates +the 'holders' number we commonly see in tools like etherscan. + +![Etherscan screenshot of MKR Holders](mkr_holders_screenshot.png) + +Of the 87,000 Holders of MKR, only 6,375 (7%) have at least 1 whole MKR (~$700 at time of writing). +Given that MKR uses on-chain voting on the Ethereum Layer 1, it may be cost prohibitive in ETH gas +terms for smaller holders to delegate and vote on-chain. + +```{r, message = FALSE, warning= FALSE} +library(shroomDK) +library(ethscore) +library(dplyr) +library(reactable) +library(plotly) + + +mkr <- tolower("0x9f8f72aa9304c8b593d555f12ef6589cc3a579a2") +max_block <- 15440000 # August 30th 11AM UTC +api_key <- readLines("api_key.txt") # get a free key @ https://sdk.flipsidecrypto.xyz/shroomdk + +mkr_balances <- address_token_balance(token_address = mkr, min_tokens = 1, + block_max = max_block, api_key = api_key) + +message( + paste0('There are ', nrow(mkr_balances), ' holders of MKR with at least 1 MKR (as of block: ', max_block, ")") +) + +plot_ly(mkr_balances, x = ~ADDRESS_TYPE, y = ~log(NEW_VALUE), color = ~ADDRESS_TYPE, + boxpoints = "all", jitter = 0.3, + hoverinfo = 'text', + hovertext = ~paste0( + 'Log-MKR Balance: ', + round(log(NEW_VALUE), 2),'\n Raw MKR Balance: ', + scales::label_comma()(floor(NEW_VALUE)) + ), + type = 'box') %>% + layout(title = '\nDistribution of MKR among those with 1+ MKR', + xaxis = list(title = 'Address Type'), + yaxis = list(title = 'LOG(MKR Balance)') + ) + +``` + +Because holdings of most ERC20s is highly skewed (i.e., most addresses have very few MKR and a few have very large amounts) +a LOG scale is used to more cleanly see differences in the distribution of MKR across Address Types. + +The key insights to note: + + - Non-targets like contracts, cold storage EOAs, and central exchange EOAs have a wide variance in their MKR holdings. + - Target EOAs (Orange, hover over to see non-LOG values) have a median of 2 MKR each and a 75% percentile of ~95 MKR. + - The top holders of MKR are contracts and central exchange EOAs. + +In practical terms, of the 977,000 MKR total supply held by 87,000 holders (Etherscan above), there are only +5,150 EOAs active and with enough MKR (1+) to be delegate targets. These EOAs hold 356,015 MKR, only 36% of supply. + + +```{r} +mkr_smmry <- mkr_balances %>% group_by(ADDRESS_TYPE) %>% + summarise(num = n(), + total = scales::label_comma()(floor(sum(NEW_VALUE))), + avg = scales::label_comma()(floor(mean(NEW_VALUE))), + median = scales::label_comma()(floor(median(NEW_VALUE))), + max = scales::label_comma()(floor(max(NEW_VALUE))), + sd = scales::label_comma()(floor(sd(NEW_VALUE)))) + +reactable(mkr_smmry, +columns = list( + ADDRESS_TYPE = colDef(name = 'Address Type'), + num = colDef(name = 'Count', align = 'right'), + total = colDef(name = 'Total', align = 'right'), + avg = colDef(name = 'Average', align = 'right'), + median = colDef(name = 'Median', align = 'right'), + max = colDef(name = 'Max', align = 'right'), + sd = colDef(name = 'Standard Deviation', align = 'right') +)) + +``` + +The MKR governance contract: 0x0a3f6849f78076aefaDf113F5BED87720274dDC0 held 188,866 MKR as of +block 15440000. The Largest contract and overall address holder of maker. + +This means of the total 977,631 MKR: 544,881 (~56%) is practically available for delegation. + + +```{r} +message( + paste0( + 'MKR Governance Contract has ', + scales::label_comma()(floor(mkr_balances[ + mkr_balances$ADDRESS == tolower('0x0a3f6849f78076aefaDf113F5BED87720274dDC0'), "NEW_VALUE"] + )), + ' MKR' +) +) +``` + +Combining + +## Time-Weighted MKR Holders + +Instead of analyzing holders based on current balance on MKR, we can add weight for *having held* MKR +for a long time. For example, weighing a user whose held 10 MKR for 10,000 blocks as a better delegate +target than one who has held 100 MKR for only 100 blocks. + +Giving users 1 point per MKR for every 1,000 blocks where they held at least 0.1 MKR +in the range of Jan 1, 2021 (block #:11,566,000) to +Aug 30th 11am UTC (block # 15,440,000). + +```{r, message = FALSE, warning= FALSE} + +min_block <- 11566000 + +mkr_timeweighted <- address_time_weighted_token_balance(mkr, + min_tokens = 0.1, + block_min = min_block, + block_max = max_block, + amount_weighting = TRUE, + api_key = api_key + ) + +plot_ly(mkr_timeweighted, x = ~ADDRESS_TYPE, y = ~log(TIME_WEIGHTED_SCORE), + color = ~ADDRESS_TYPE, + boxpoints = "all", jitter = 0.3, + hoverinfo = 'text', + hovertext = ~paste0( + 'Log-MKR TW Score: ', + round(log(TIME_WEIGHTED_SCORE), 2), + '\n Raw MKR TW Score: ', + scales::label_comma()(floor(TIME_WEIGHTED_SCORE)) + ), + type = 'box') %>% + layout(title = '\nDistribution of MKR Time Weighted Scoring', + xaxis = list(title = 'Address Type'), + yaxis = list(title = 'LOG(MKR TW Score)') + ) + +# merging and imputing current balance 0 to compare tw score and balance +mkr_tw_bal <- merge(x = mkr_timeweighted[, c("ADDRESS","TIME_WEIGHTED_SCORE","ADDRESS_TYPE")], + y = mkr_balances[,c("ADDRESS","NEW_VALUE")], + all.x = TRUE, by = "ADDRESS") + +mkr_tw_bal$NEW_VALUE[is.na(mkr_tw_bal$NEW_VALUE)] <- 0 + +plot_ly(mkr_tw_bal, x = ~log(NEW_VALUE), y = ~log(TIME_WEIGHTED_SCORE), + color = ~ADDRESS_TYPE, type = 'scatter', + hoverinfo = 'text', + hovertext = ~paste0( + 'RAW-MKR Balance: ', + scales::label_comma()(floor(NEW_VALUE)), + '\n Raw MKR TW Score: ', + scales::label_comma()(floor(TIME_WEIGHTED_SCORE)) + ) +) %>% + layout(title = '\n Current MKR Balance vs Time-Weighted Score', + xaxis = list(title = 'LOG(Current MKR Balance)'), + yaxis = list(title = 'LOG(MKR TW Score)') + ) + + +``` + +## Recent Accumulators + +TODO diff --git a/mkr_holders_screenshot.png b/mkr_holders_screenshot.png new file mode 100644 index 0000000..781151a Binary files /dev/null and b/mkr_holders_screenshot.png differ diff --git a/renv.lock b/renv.lock index 312f3d1..8b53b58 100644 --- a/renv.lock +++ b/renv.lock @@ -9,6 +9,571 @@ ] }, "Packages": { + "MASS": { + "Package": "MASS", + "Version": "7.3-57", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "71476c1d88d1ebdf31580e5a257d5d31", + "Requirements": [] + }, + "Matrix": { + "Package": "Matrix", + "Version": "1.4-1", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "699c47c606293bdfbc9fd78a93c9c8fe", + "Requirements": [ + "lattice" + ] + }, + "R6": { + "Package": "R6", + "Version": "2.5.1", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "470851b6d5d0ac559e9d01bb352b4021", + "Requirements": [] + }, + "RColorBrewer": { + "Package": "RColorBrewer", + "Version": "1.1-3", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "45f0398006e83a5b10b72a90663d8d8c", + "Requirements": [] + }, + "Rcpp": { + "Package": "Rcpp", + "Version": "1.0.9", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "e9c08b94391e9f3f97355841229124f2", + "Requirements": [] + }, + "askpass": { + "Package": "askpass", + "Version": "1.1", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "e8a22846fff485f0be3770c2da758713", + "Requirements": [ + "sys" + ] + }, + "base64enc": { + "Package": "base64enc", + "Version": "0.1-3", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "543776ae6848fde2f48ff3816d0628bc", + "Requirements": [] + }, + "bslib": { + "Package": "bslib", + "Version": "0.4.0", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "be5ee090716ce1671be6cd5d7c34d091", + "Requirements": [ + "cachem", + "htmltools", + "jquerylib", + "jsonlite", + "memoise", + "rlang", + "sass" + ] + }, + "cachem": { + "Package": "cachem", + "Version": "1.0.6", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "648c5b3d71e6a37e3043617489a0a0e9", + "Requirements": [ + "fastmap", + "rlang" + ] + }, + "cli": { + "Package": "cli", + "Version": "3.3.0", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "23abf173c2b783dcc43379ab9bba00ee", + "Requirements": [ + "glue" + ] + }, + "colorspace": { + "Package": "colorspace", + "Version": "2.0-3", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "bb4341986bc8b914f0f0acf2e4a3f2f7", + "Requirements": [] + }, + "cpp11": { + "Package": "cpp11", + "Version": "0.4.2", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "fa53ce256cd280f468c080a58ea5ba8c", + "Requirements": [] + }, + "crosstalk": { + "Package": "crosstalk", + "Version": "1.2.0", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "6aa54f69598c32177e920eb3402e8293", + "Requirements": [ + "R6", + "htmltools", + "jsonlite", + "lazyeval" + ] + }, + "curl": { + "Package": "curl", + "Version": "4.3.2", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "022c42d49c28e95d69ca60446dbabf88", + "Requirements": [] + }, + "data.table": { + "Package": "data.table", + "Version": "1.14.2", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "36b67b5adf57b292923f5659f5f0c853", + "Requirements": [] + }, + "digest": { + "Package": "digest", + "Version": "0.6.29", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "cf6b206a045a684728c3267ef7596190", + "Requirements": [] + }, + "dplyr": { + "Package": "dplyr", + "Version": "1.0.9", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "f0bda1627a7f5d3f9a0b5add931596ac", + "Requirements": [ + "R6", + "generics", + "glue", + "lifecycle", + "magrittr", + "pillar", + "rlang", + "tibble", + "tidyselect", + "vctrs" + ] + }, + "ellipsis": { + "Package": "ellipsis", + "Version": "0.3.2", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "bb0eec2fe32e88d9e2836c2f73ea2077", + "Requirements": [ + "rlang" + ] + }, + "ethscore": { + "Package": "ethscore", + "Version": "0.1.0", + "Source": "GitHub", + "RemoteType": "github", + "RemoteHost": "api.github.com", + "RemoteRepo": "ethscore", + "RemoteUsername": "Flipsidecrypto", + "RemoteRef": "HEAD", + "RemoteSha": "5413b3c77ecb97392314fd6586d4e83fda1b6613", + "Hash": "ecb3c4ceff737d2b202fcd8baad012cb", + "Requirements": [] + }, + "evaluate": { + "Package": "evaluate", + "Version": "0.15", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "699a7a93d08c962d9f8950b2d7a227f1", + "Requirements": [] + }, + "fansi": { + "Package": "fansi", + "Version": "1.0.3", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "83a8afdbe71839506baa9f90eebad7ec", + "Requirements": [] + }, + "farver": { + "Package": "farver", + "Version": "2.1.1", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "8106d78941f34855c440ddb946b8f7a5", + "Requirements": [] + }, + "fastmap": { + "Package": "fastmap", + "Version": "1.1.0", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "77bd60a6157420d4ffa93b27cf6a58b8", + "Requirements": [] + }, + "fs": { + "Package": "fs", + "Version": "1.5.2", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "7c89603d81793f0d5486d91ab1fc6f1d", + "Requirements": [] + }, + "generics": { + "Package": "generics", + "Version": "0.1.3", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "15e9634c0fcd294799e9b2e929ed1b86", + "Requirements": [] + }, + "ggplot2": { + "Package": "ggplot2", + "Version": "3.3.6", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "0fb26d0674c82705c6b701d1a61e02ea", + "Requirements": [ + "MASS", + "digest", + "glue", + "gtable", + "isoband", + "mgcv", + "rlang", + "scales", + "tibble", + "withr" + ] + }, + "glue": { + "Package": "glue", + "Version": "1.6.2", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "4f2596dfb05dac67b9dc558e5c6fba2e", + "Requirements": [] + }, + "gtable": { + "Package": "gtable", + "Version": "0.3.0", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "ac5c6baf7822ce8732b343f14c072c4d", + "Requirements": [] + }, + "highr": { + "Package": "highr", + "Version": "0.9", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "8eb36c8125038e648e5d111c0d7b2ed4", + "Requirements": [ + "xfun" + ] + }, + "htmltools": { + "Package": "htmltools", + "Version": "0.5.3", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "6496090a9e00f8354b811d1a2d47b566", + "Requirements": [ + "base64enc", + "digest", + "fastmap", + "rlang" + ] + }, + "htmlwidgets": { + "Package": "htmlwidgets", + "Version": "1.5.4", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "76147821cd3fcd8c4b04e1ef0498e7fb", + "Requirements": [ + "htmltools", + "jsonlite", + "yaml" + ] + }, + "httr": { + "Package": "httr", + "Version": "1.4.3", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "88d1b310583777edf01ccd1216fb0b2b", + "Requirements": [ + "R6", + "curl", + "jsonlite", + "mime", + "openssl" + ] + }, + "isoband": { + "Package": "isoband", + "Version": "0.2.5", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "7ab57a6de7f48a8dc84910d1eca42883", + "Requirements": [] + }, + "jquerylib": { + "Package": "jquerylib", + "Version": "0.1.4", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "5aab57a3bd297eee1c1d862735972182", + "Requirements": [ + "htmltools" + ] + }, + "jsonlite": { + "Package": "jsonlite", + "Version": "1.8.0", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "d07e729b27b372429d42d24d503613a0", + "Requirements": [] + }, + "knitr": { + "Package": "knitr", + "Version": "1.39", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "029ab7c4badd3cf8af69016b2ba27493", + "Requirements": [ + "evaluate", + "highr", + "stringr", + "xfun", + "yaml" + ] + }, + "labeling": { + "Package": "labeling", + "Version": "0.4.2", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "3d5108641f47470611a32d0bdf357a72", + "Requirements": [] + }, + "later": { + "Package": "later", + "Version": "1.3.0", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "7e7b457d7766bc47f2a5f21cc2984f8e", + "Requirements": [ + "Rcpp", + "rlang" + ] + }, + "lattice": { + "Package": "lattice", + "Version": "0.20-45", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "b64cdbb2b340437c4ee047a1f4c4377b", + "Requirements": [] + }, + "lazyeval": { + "Package": "lazyeval", + "Version": "0.2.2", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "d908914ae53b04d4c0c0fd72ecc35370", + "Requirements": [] + }, + "lifecycle": { + "Package": "lifecycle", + "Version": "1.0.1", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "a6b6d352e3ed897373ab19d8395c98d0", + "Requirements": [ + "glue", + "rlang" + ] + }, + "magrittr": { + "Package": "magrittr", + "Version": "2.0.3", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "7ce2733a9826b3aeb1775d56fd305472", + "Requirements": [] + }, + "memoise": { + "Package": "memoise", + "Version": "2.0.1", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "e2817ccf4a065c5d9d7f2cfbe7c1d78c", + "Requirements": [ + "cachem", + "rlang" + ] + }, + "mgcv": { + "Package": "mgcv", + "Version": "1.8-40", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "c6b2fdb18cf68ab613bd564363e1ba0d", + "Requirements": [ + "Matrix", + "nlme" + ] + }, + "mime": { + "Package": "mime", + "Version": "0.12", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "18e9c28c1d3ca1560ce30658b22ce104", + "Requirements": [] + }, + "munsell": { + "Package": "munsell", + "Version": "0.5.0", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "6dfe8bf774944bd5595785e3229d8771", + "Requirements": [ + "colorspace" + ] + }, + "nlme": { + "Package": "nlme", + "Version": "3.1-157", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "dbca60742be0c9eddc5205e5c7ca1f44", + "Requirements": [ + "lattice" + ] + }, + "openssl": { + "Package": "openssl", + "Version": "2.0.2", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "6d3bef2e305f55c705c674653c7d7d3d", + "Requirements": [ + "askpass" + ] + }, + "pillar": { + "Package": "pillar", + "Version": "1.8.0", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "f95cf85794546c4ac2b9a6ca42e671ff", + "Requirements": [ + "cli", + "fansi", + "glue", + "lifecycle", + "rlang", + "utf8", + "vctrs" + ] + }, + "pkgconfig": { + "Package": "pkgconfig", + "Version": "2.0.3", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "01f28d4278f15c76cddbea05899c5d6f", + "Requirements": [] + }, + "plotly": { + "Package": "plotly", + "Version": "4.10.0", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "fbb11e44d057996ca5fe40d959cacfb0", + "Requirements": [ + "RColorBrewer", + "base64enc", + "crosstalk", + "data.table", + "digest", + "dplyr", + "ggplot2", + "htmltools", + "htmlwidgets", + "httr", + "jsonlite", + "lazyeval", + "magrittr", + "promises", + "purrr", + "rlang", + "scales", + "tibble", + "tidyr", + "vctrs", + "viridisLite" + ] + }, + "promises": { + "Package": "promises", + "Version": "1.2.0.1", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "4ab2c43adb4d4699cf3690acd378d75d", + "Requirements": [ + "R6", + "Rcpp", + "later", + "magrittr", + "rlang" + ] + }, + "purrr": { + "Package": "purrr", + "Version": "0.3.4", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "97def703420c8ab10d8f0e6c72101e02", + "Requirements": [ + "magrittr", + "rlang" + ] + }, + "rappdirs": { + "Package": "rappdirs", + "Version": "0.3.3", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "5e3c5dc0b071b21fa128676560dbe94d", + "Requirements": [] + }, "renv": { "Package": "renv", "Version": "0.15.5", @@ -16,6 +581,221 @@ "Repository": "CRAN", "Hash": "6a38294e7d12f5d8e656b08c5bd8ae34", "Requirements": [] + }, + "rlang": { + "Package": "rlang", + "Version": "1.0.4", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "6539dd8c651e67e3b55b5ffea106362b", + "Requirements": [] + }, + "rmarkdown": { + "Package": "rmarkdown", + "Version": "2.14", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "31b60a882fabfabf6785b8599ffeb8ba", + "Requirements": [ + "bslib", + "evaluate", + "htmltools", + "jquerylib", + "jsonlite", + "knitr", + "stringr", + "tinytex", + "xfun", + "yaml" + ] + }, + "sass": { + "Package": "sass", + "Version": "0.4.2", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "1b191143d7d3444d504277843f3a95fe", + "Requirements": [ + "R6", + "fs", + "htmltools", + "rappdirs", + "rlang" + ] + }, + "scales": { + "Package": "scales", + "Version": "1.2.0", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "6e8750cdd13477aa440d453da93d5cac", + "Requirements": [ + "R6", + "RColorBrewer", + "farver", + "labeling", + "lifecycle", + "munsell", + "rlang", + "viridisLite" + ] + }, + "shroomDK": { + "Package": "shroomDK", + "Version": "0.1.0", + "Source": "GitHub", + "RemoteType": "github", + "RemoteHost": "api.github.com", + "RemoteRepo": "sdk", + "RemoteUsername": "Flipsidecrypto", + "RemoteRef": "HEAD", + "RemoteSha": "7f06948b1e34d1248fbcef8db7263f45e0d36492", + "RemoteSubdir": "r/shroomDK", + "Hash": "f1ef16e492647dd7c251bd1c0cc9b093", + "Requirements": [ + "httr", + "jsonlite" + ] + }, + "stringi": { + "Package": "stringi", + "Version": "1.7.8", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "a68b980681bcbc84c7a67003fa796bfb", + "Requirements": [] + }, + "stringr": { + "Package": "stringr", + "Version": "1.4.0", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "0759e6b6c0957edb1311028a49a35e76", + "Requirements": [ + "glue", + "magrittr", + "stringi" + ] + }, + "sys": { + "Package": "sys", + "Version": "3.4", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "b227d13e29222b4574486cfcbde077fa", + "Requirements": [] + }, + "tibble": { + "Package": "tibble", + "Version": "3.1.8", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "56b6934ef0f8c68225949a8672fe1a8f", + "Requirements": [ + "fansi", + "lifecycle", + "magrittr", + "pillar", + "pkgconfig", + "rlang", + "vctrs" + ] + }, + "tidyr": { + "Package": "tidyr", + "Version": "1.2.0", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "d8b95b7fee945d7da6888cf7eb71a49c", + "Requirements": [ + "cpp11", + "dplyr", + "ellipsis", + "glue", + "lifecycle", + "magrittr", + "purrr", + "rlang", + "tibble", + "tidyselect", + "vctrs" + ] + }, + "tidyselect": { + "Package": "tidyselect", + "Version": "1.1.2", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "17f6da8cfd7002760a859915ce7eef8f", + "Requirements": [ + "ellipsis", + "glue", + "purrr", + "rlang", + "vctrs" + ] + }, + "tinytex": { + "Package": "tinytex", + "Version": "0.40", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "e7b654da5e77bc4e5435a966329cd25f", + "Requirements": [ + "xfun" + ] + }, + "utf8": { + "Package": "utf8", + "Version": "1.2.2", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "c9c462b759a5cc844ae25b5942654d13", + "Requirements": [] + }, + "vctrs": { + "Package": "vctrs", + "Version": "0.4.1", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "8b54f22e2a58c4f275479c92ce041a57", + "Requirements": [ + "cli", + "glue", + "rlang" + ] + }, + "viridisLite": { + "Package": "viridisLite", + "Version": "0.4.0", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "55e157e2aa88161bdb0754218470d204", + "Requirements": [] + }, + "withr": { + "Package": "withr", + "Version": "2.5.0", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "c0e49a9760983e81e55cdd9be92e7182", + "Requirements": [] + }, + "xfun": { + "Package": "xfun", + "Version": "0.31", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "a318c6f752b8dcfe9fb74d897418ab2b", + "Requirements": [] + }, + "yaml": { + "Package": "yaml", + "Version": "2.3.5", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "458bb38374d73bf83b1bb85e353da200", + "Requirements": [] } } }