in progress

This commit is contained in:
Carlos R. Mercado 2022-09-08 11:12:49 -04:00
parent 46fdcc49ab
commit 0a087888cd
3 changed files with 995 additions and 0 deletions

215
MKR_delegate_targeting.Rmd Normal file
View File

@ -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

BIN
mkr_holders_screenshot.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

780
renv.lock
View File

@ -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": []
}
}
}