This commit is contained in:
Kellen Blumberg 2023-02-07 12:14:58 -08:00
commit 15c01854ef
45 changed files with 3469 additions and 10510 deletions

1
.gitignore vendored
View File

@ -7,3 +7,4 @@
*.txt
secrets.json
*.dcf
.dcf

1
apps/flow/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
.DS_Store

1
apps/flow/flowscored/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
.DS_Store

View File

@ -0,0 +1 @@
optimistic_score_prototype.dcf

View File

@ -20,6 +20,11 @@ function(input, output, session) {
updateActionButton(session = session, inputId = "connect",
label = paste0("connected as ", substr(input$eth_address, 1, 7), "..."),
icon = character(0))
tmp <- data.table(address = input$eth_address,
time = Sys.time(),
score = userScore())
write.csv(tmp, file = paste0("/rstudio-data/optimistic-data/", input$eth_address, "_", Sys.time(), ".csv"), row.names = FALSE)
} else {
updateActionButton(session = session, inputId = "connect",
@ -119,6 +124,7 @@ function(input, output, session) {
})
userScore <- reactive({
if(nrow(thisAddyData()) > 0) {
thisAddyData()$total_score
@ -127,10 +133,13 @@ function(input, output, session) {
}
})
output$tx_handler <- renderUI({
TransactionHandler(
"tx_button",
chainId = 420,
chainId = 10,
label = "Attest Your Score On Chain",
contract_address = "0xD870A73a32d0b8C34CcF1E6098E9A26977CB605b",
contract_abi = abi,

View File

@ -3,22 +3,28 @@ fluidPage(
tags$link(rel = "stylesheet", type = "text/css", href = "shiny.css"),
tags$link(rel = "stylesheet", href = "https://fonts.googleapis.com/css?family=Roboto+Mono"),
tags$link(rel = "stylesheet", href = "https://fonts.googleapis.com/css?family=Open+Sans"),
tags$link(rel = "stylesheet", href = "https://fonts.googleapis.com/css?family=Rubik")
tags$link(rel = "stylesheet", href = "https://fonts.googleapis.com/css?family=Rubik"),
tags$script(src = "rudderstack.js")
),
# background: linear-gradient(90deg, rgba(255,196,202,0.19511554621848737) 0%, rgba(255,255,255,0) 100%); color: #919EAB;
fluidRow(class = "titlebar",
column(9, img(src = "app_logo.svg", height = "44px", style = "margin-left: 13px; margin-top: 13px; margin-bottom: 13px;")),
column(3, style = "text-align: right;", actionButton("connect", icon = icon("wallet"), label = " Connect Wallet")),
bsModal(id = "connectpop", title = "", trigger = "connect",
WalletHandler("eth_address", chainId = 420))
WalletHandler("eth_address", chainId = 10),
br(),
a("How to connect MetaMask to Optimism",
href = "https://help.optimism.io/hc/en-us/articles/6223777057179-How-do-I-use-Optimism-with-MetaMask-",
target = "_blank", style = "font-style: italic;"))
),
fluidRow(class = "wrapper",
fluidRow(class = "scoreholder",
fluidRow(class = "description", div("Score up to 5 points by doing things that contribute to the Optimism Network. Then click 'Attest Your Score On Chain' to use the ",
a("AttestationStation", href = "https://community.optimism.io/docs/governance/attestation-station/", target = "_blank"),
a("AttestationStation",
href = "https://community.optimism.io/docs/governance/attestation-station/",
onclick = "rudderstack.track('optimist-click-attestation-station')",
target = "_blank"),
" to get your score onchain.")),
br(),
fluidRow(class = "scorebox",
@ -61,15 +67,23 @@ fluidPage(
div(class = "LINKS", "FAQ:"),
div(class = "links",
a(href = "https://community.optimism.io/docs/governance/attestation-station/",
"What is Attestation Station?", target = "_blank")),
"What is Attestation Station?",
onclick = "rudderstack.track('optimist-click-attestation-station')",
target = "_blank")),
div(class = "links",
a(href = "https://github.com/FlipsideCrypto/user_metrics/tree/main/apps/optimism/optimistic_score_prototype",
"Can I have this code?", target = "_blank")),
"Can I have this code?",
onclick = "rudderstack.track('optimist-click-github')",
target = "_blank")),
div(class = "links",
a(href = "https://app.flipsidecrypto.com/dashboard/optimist-score-queries-data-Jp7kIN",
"Can I have this data?", target = "_blank")),
"Can I have this data?",
onclick = "rudderstack.track('optimist-click-velocity')",
target = "_blank")),
div(class = "links",
a(href = "https://flipsidecrypto.xyz/", "What is Flipside?", target = "_blank"))
a(href = "https://flipsidecrypto.xyz/", "What is Flipside?",
onclick = "rudderstack.track('optimist-click-flipsidexyz')",
target = "_blank"))
)

View File

@ -38,7 +38,7 @@ op.metrics.w[, delegation_score := ifelse(n_delegations > 0, 1, 0)]
op.metrics.w[, nft_score := ifelse(n_trades > 0, 1, 0)]
op.metrics.w[, dex_score := ifelse(n_swaps > 0, 1, 0)]
op.metrics.w[, total_score := airdrop_score + cex_score + delegation_score + nft_score + dex_score]
op.metrics.w[, total_score := airdrop_score + 1 + delegation_score + nft_score + dex_score]
op.metrics.w <- op.metrics.w[total_score > 0]

View File

@ -0,0 +1,267 @@
---
title: "Update Optimist Score Prototype Data"
author: "Angeal"
output: html_document
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```
## Run Updates
Hello I am running this at `r Sys.time()`
```{r update}
library(fasttime)
library(gridExtra)
library(ggplot2)
library(data.table)
library(reshape2)
library(dplyr)
library(dbplyr)
library(dplyr)
library(odbc)
library(RJSONIO)
library(magrittr)
library(RJSONIO)
library(xts)
library(quantmod)
library(fTrading)
library(curl)
library(stringr)
library(aws.s3)
library(RPostgres)
source("/home/data-science/data_science/util/util_functions.R")
airdrop.claims <- QuerySnowflake("
SELECT
event_inputs:recipient::string as user_address,
count(distinct(tx_hash)) AS n_claims,
sum(event_inputs:amount::numeric / pow(10,18)) as token_volume
from optimism.core.fact_event_logs
WHERE
block_timestamp > '2022-05-30'
AND
origin_function_signature = '0x2e7ba6ef' -- claim
AND
contract_address = lower('0xFeDFAF1A10335448b7FA0268F56D2B44DBD357de') -- distr contract
AND
user_address NOT IN (
SELECT address
FROM FLIPSIDE_PROD_DB.CROSSCHAIN.ADDRESS_LABELS
WHERE blockchain = 'optimism')
GROUP BY user_address
")
cex.activity <- QuerySnowflake("
WITH wdraws AS (SELECT
to_address AS user_address,
tt.contract_address AS token_contract,
symbol AS token_symbol,
count(tt.tx_hash) AS n_withdrawals,
sum(raw_amount) / pow(10, decimals) AS wdraw_token_volume,
sum(raw_amount) / pow(10, decimals) * price AS wdraw_usd_volume
FROM
optimism.core.fact_token_transfers tt
JOIN optimism.core.FACT_HOURLY_TOKEN_PRICES pp
ON date_trunc('hour', tt.block_timestamp) = pp.hour
AND tt.contract_address = pp.token_address
WHERE
from_address IN
(SELECT address
FROM FLIPSIDE_PROD_DB.CROSSCHAIN.ADDRESS_LABELS
WHERE blockchain = 'optimism' AND label_type = 'cex' AND label_subtype = 'hot_wallet')
AND
to_address NOT IN (
SELECT address
FROM FLIPSIDE_PROD_DB.CROSSCHAIN.ADDRESS_LABELS
WHERE blockchain != 'optimism')
GROUP BY user_address, token_contract, token_symbol, decimals, price),
deps AS (
SELECT
from_address AS user_address,
tt.contract_address AS token_contract,
symbol AS token_symbol,
count(tt.tx_hash) AS n_deposits,
sum(raw_amount) / pow(10, decimals) AS dep_token_volume,
sum(raw_amount) / pow(10, decimals) * price AS dep_usd_volume
FROM
optimism.core.fact_token_transfers tt
JOIN optimism.core.FACT_HOURLY_TOKEN_PRICES pp
ON date_trunc('hour', tt.block_timestamp) = pp.hour
AND tt.contract_address = pp.token_address
WHERE
to_address IN
(SELECT address
FROM FLIPSIDE_PROD_DB.CROSSCHAIN.ADDRESS_LABELS
WHERE blockchain = 'optimism' AND label_type = 'cex' AND label_subtype = 'deposit_wallet')
AND
from_address NOT IN (
SELECT address
FROM FLIPSIDE_PROD_DB.CROSSCHAIN.ADDRESS_LABELS
WHERE blockchain != 'optimism')
GROUP BY user_address, token_contract, token_symbol, decimals, price
)
SELECT
COALESCE(ds.user_address, ws.user_address) AS user_address,
'tbd' AS exchange_name,
COALESCE(ds.token_contract, ws.token_contract) AS token_contract,
SPLIT_PART(COALESCE(ds.token_contract, ws.token_contract), '.', 2) AS token_symbol,
COALESCE(n_deposits, 0) AS n_deposits,
COALESCE(n_withdrawals, 0) AS n_withdrawals,
COALESCE(dep_token_volume, 0) AS dep_token_volume,
COALESCE(dep_usd_volume, 0) AS dep_usd_volume,
COALESCE(wdraw_token_volume, 0) AS wdraw_token_volume,
COALESCE(wdraw_usd_volume, 0) AS wdraw_usd_volume
FROM deps ds
FULL OUTER JOIN wdraws ws ON ds.user_address = ws.user_address
AND ds.token_contract = ws.token_contract
")
chain.stakes <- QuerySnowflake("
WITH format_delegations AS (
select
*,
(raw_new_balance - raw_previous_balance) / pow(10, 18) AS net_delegation
FROM optimism.core.fact_delegations
WHERE
delegation_type != 'Re-Delegation'
)
SELECT
delegator AS user_address,
'0x4200000000000000000000000000000000000042' AS token_contract,
'OP' AS token_symbol,
count(distinct(tx_hash)) AS n_stakes,
0 AS n_unstakes,
sum(net_delegation) AS stake_token_volume,
0 AS stake_usd_volume,
0 AS unstake_token_volume,
0 AS unstake_usd_volume
FROM format_delegations
WHERE
delegator NOT IN (SELECT address FROM FLIPSIDE_PROD_DB.CROSSCHAIN.ADDRESS_LABELS where blockchain = 'optimism')
GROUP BY
delegator
")
nft.trades <- QuerySnowflake("
WITH sells AS (
SELECT
seller_address AS user_address,
platform_name AS marketplace,
nft_address AS nf_token_contract,
count(distinct(tokenid)) AS n_nfts_sold,
currency_symbol AS sell_symbol,
currency_address AS currency,
count(tx_hash) AS n_sells,
sum(price) AS token_sell_volume,
sum(price_usd) AS sell_usd_volume
FROM
optimism.core.ez_nft_sales ns
WHERE
user_address NOT IN (SELECT address FROM FLIPSIDE_PROD_DB.CROSSCHAIN.ADDRESS_LABELS where blockchain = 'optimism')
GROUP BY
seller_address, marketplace, nf_token_contract, sell_symbol, currency
),
buys AS (
SELECT
buyer_address AS user_address,
platform_name AS marketplace,
nft_address AS nf_token_contract,
count(distinct(tokenid)) AS n_nfts_bought,
currency_symbol AS buy_symbol,
currency_address AS currency,
count(tx_hash) AS n_buys,
sum(price) AS token_buy_volume,
sum(price_usd) AS buy_usd_volume
FROM
optimism.core.ez_nft_sales ns
WHERE
user_address NOT IN (SELECT address FROM FLIPSIDE_PROD_DB.CROSSCHAIN.ADDRESS_LABELS where blockchain = 'optimism')
GROUP BY
buyer_address, marketplace, nf_token_contract, buy_symbol, currency
)
SELECT
COALESCE(sells.user_address, buys.user_address) AS user_address,
COALESCE(sells.marketplace, buys.marketplace) AS marketplace,
COALESCE(sells.nf_token_contract, buys.nf_token_contract) AS nf_token_contract,
COALESCE(buys.n_nfts_bought, 0) AS n_nfts_bought,
COALESCE(sells.n_nfts_sold, 0) AS n_nfts_sold,
SPLIT_PART(COALESCE(sells.nf_token_contract, buys.nf_token_contract), '.', 2) AS nft_project,
COALESCE(sells.currency, buys.currency) AS token_contract,
COALESCE(sells.sell_symbol, buys.buy_symbol) AS token_symbol,
COALESCE(n_buys, 0) AS n_buys,
COALESCE(token_buy_volume, 0) AS buy_token_volume,
COALESCE(buy_usd_volume, 0) AS buy_usd_volume,
COALESCE(n_sells, 0) AS n_sells,
COALESCE(token_sell_volume, 0) AS sell_token_volume,
COALESCE(sell_usd_volume, 0) AS sell_usd_volume
FROM sells
FULL OUTER JOIN buys ON sells.user_address = buys.user_address
AND sells.marketplace = buys.marketplace
AND sells.nf_token_contract = buys.nf_token_contract
AND sells.currency = buys.currency
")
dex.swaps <- QuerySnowflake("
WITH swaps AS (
SELECT
tx_hash,
ORIGIN_FROM_ADDRESS AS user_address
FROM
OPTIMISM.CORE.FACT_EVENT_LOGS
WHERE
(lower(event_name) LIKE '%swap%'
OR
tx_hash IN (select tx_hash FROM OPTIMISM.VELODROME.EZ_SWAPS WHERE block_timestamp > current_date - 180) )
AND
ORIGIN_FROM_ADDRESS NOT IN (SELECT address FROM FLIPSIDE_PROD_DB.CROSSCHAIN.ADDRESS_LABELS where blockchain = 'optimism')
)
SELECT
user_address,
count(distinct(tx_hash)) AS n_swaps
FROM
swaps
GROUP BY
user_address
")
op.metrics.w <- MergeDataFrames(
list(airdrop.claims[, list(user_address, airdrop_tokens_claimed = token_volume)],
cex.activity[, list(net_cex_wdraw = sum(wdraw_usd_volume) - sum(dep_usd_volume)), by = user_address],
chain.stakes[, list(user_address, n_delegations = n_stakes)],
nft.trades[, list(n_trades = sum(n_buys + n_sells)), by = user_address],
dex.swaps),
by = "user_address", all = TRUE
)
ReplaceValues(op.metrics.w)
op.metrics.w[, airdrop_score := ifelse(airdrop_tokens_claimed > 0, 1, 0)]
op.metrics.w[, cex_score := ifelse(net_cex_wdraw >= 0, 1, 0)]
op.metrics.w[, delegation_score := ifelse(n_delegations > 0, 1, 0)]
op.metrics.w[, nft_score := ifelse(n_trades > 0, 1, 0)]
op.metrics.w[, dex_score := ifelse(n_swaps > 0, 1, 0)]
op.metrics.w[, total_score := airdrop_score + 1 + delegation_score + nft_score + dex_score]
op.metrics.w <- op.metrics.w[total_score > 0]
save(op.metrics.w, file = "/rstudio-data/optimist_score_prototype_data.RData")
print(file.info("/rstudio-data/optimist_score_prototype_data.RData"))
```
Done updating at `r Sys.time()`
The end. Byeeeee.

View File

@ -0,0 +1,3 @@
!function(){var e=window.rudderanalytics=window.rudderanalytics||[];e.methods=["load","page","track","identify","alias","group","ready","reset","getAnonymousId","setAnonymousId"],e.factory=function(t){return function(){var r=Array.prototype.slice.call(arguments);return r.unshift(t),e.push(r),e}};for(var t=0;t<e.methods.length;t++){var r=e.methods[t];e[r]=e.factory(r)}e.loadJS=function(e,t){var r=document.createElement("script");r.type="text/javascript",r.async=!0,r.src="https://cdn.rudderlabs.com/v1.1/rudder-analytics.min.js";var a=document.getElementsByTagName("script")[0];a.parentNode.insertBefore(r,a)},e.loadJS(),
e.load('29a6Pl6fLlx4iYiOdfxRt0IBad9','https://flipsidecrworumuyiulf.dataplane.rudderstack.com'),
e.page()}();

View File

@ -1,5 +1,5 @@
body {
background: white;
background: url('Background_03.png');
font-family: 'Open Sans', sans-serif;
font-size: 16px;
font-weight: 400;
@ -7,7 +7,11 @@ body {
}
a, a:hover, a:visited, a:active {
color: red;
color: #F60001;
}
a:hover {
color: #F6000195;
}
.container-fluid {
@ -34,10 +38,18 @@ a, a:hover, a:visited, a:active {
color: #F60001;
font-size: 1.02em;
padding: 8px;
background: linear-gradient(white, white) padding-box,
linear-gradient(to right, #F60001, #F60001) border-box;
border-radius: 4px;
border: 3px solid transparent;
border: 3px solid #F60001;
}
#connect:hover {
background-color: #F60001;
color: white;
}
#connect:visited {
background-color: transparent;
color: #F60001;
}
.walletpart {
@ -63,9 +75,9 @@ a, a:hover, a:visited, a:active {
line-height: 50px;
width: 20%;
background-color: white;
border: 2px red solid;
border: 2px #F60001 solid;
border-radius: 4px 0 0 4px;
color: red;
color: #F60001;
text-align: center;
font-family: Rubik;
font-weight: 600;
@ -77,9 +89,9 @@ a, a:hover, a:visited, a:active {
height: 50px;
line-height: 50px;
width: 80%;
background-color: red;
background-color: #F60001;
border-radius: 0 4px 4px 0;
border: 2px red solid;
border: 2px #F60001 solid;
color: white;
text-align: left;
padding-left: 10px;
@ -87,7 +99,7 @@ a, a:hover, a:visited, a:active {
.scoreholder {
border: 2px solid red;
border: 2px solid #F60001;
border-radius: 17px;
padding: 10px 30px 0 37px;
max-width: 630px;
@ -120,7 +132,7 @@ a, a:hover, a:visited, a:active {
}
.scorecircle {
background-color: red;
background-color: #F60001;
color: white;
font-family: Rubik;
font-size: 4em;
@ -138,9 +150,9 @@ a, a:hover, a:visited, a:active {
}
button {
border: 1px red solid;
border: 1px #F60001 solid;
padding: 5px;
color: red;
color: #F60001;
background-color: white;
margin: 10px;
border-radius: 4px;
@ -158,6 +170,8 @@ button {
border: 3px solid transparent;
}
.scorecolumns {
padding-left: 30px;
padding-right: 30px;
@ -179,7 +193,7 @@ button {
border: 1px solid #F60001;
}
.modal-title {
color: red;
color: #F60001;
font-weight: bold;
border: none;
}
@ -194,9 +208,19 @@ button {
.links {
color: red;
color: #F60001;
font-size: 0.95em;
text-align: center;
}
#tx_button > button:disabled {
background-color: #F6000197;
cursor: not-allowed;
}
#tx_button > button:hover:enabled {
background-color: #CF0018
}

1
apps/solana/solarscored/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
solarscored_data.RData

View File

@ -0,0 +1,69 @@
library(stringr)
setwd("~/user_metrics/apps/solana/solarscored")
# read in the svg text
svg.text <- readLines("wheelpart.svg")
# split into parts on the layer opening tag
split.at.1 <- "Layer_"
sgv.text.split <- strsplit(svg.text, split = split.at.1, fixed = TRUE)[[1]]
# grab the layer with the slices
# you have to know which one it is
# we're looking for layer 1
center.slices <- sgv.text.split[which(substr(sgv.text.split, 1, 1) == "1")]
center.slices <- '<g id="Layer_1"><path class="cls-7" d="M421.63,216.81c51.13,0,99.47,23.28,131.35,63.25l-47.29,37.71c-20.4-25.58-51.34-40.48-84.06-40.48v-60.48Z"/><path class="cls-9" d="M552.98,280.07c31.88,39.97,43.82,92.29,32.44,142.13l-58.96-13.46c7.28-31.9-.36-65.38-20.76-90.96l47.29-37.71Z"/><path class="cls-17" d="M585.42,422.19c-11.38,49.84-44.83,91.8-90.9,113.98l-26.24-54.49c29.48-14.2,50.89-41.05,58.17-72.95l58.96,13.46Z"/><path class="cls-5" d="M494.52,536.17c-46.06,22.18-99.72,22.18-145.78,0l26.24-54.49c29.48,14.2,63.82,14.2,93.3,0l26.24,54.49Z"/><path class="cls-11" d="M348.74,536.17c-46.06-22.18-79.52-64.13-90.9-113.98l58.96-13.46c7.28,31.9,28.69,58.75,58.17,72.95l-26.24,54.49Z"/><path class="cls-13" d="M257.84,422.19c-11.38-49.84,.56-102.16,32.44-142.13l47.29,37.71c-20.4,25.58-28.04,59.06-20.76,90.96l-58.96,13.46Z"/><path class="cls-15" d="M290.28,280.07c31.88-39.97,80.22-63.25,131.35-63.25v60.48c-32.72,0-63.66,14.9-84.06,40.48l-47.29-37.71Z"/><path class="cls-7" d="M421.63,156.33c69.53,0,135.28,31.66,178.63,86.03l-47.29,37.71c-31.88-39.97-80.22-63.25-131.35-63.25v-60.48Z"/><path class="cls-9" d="M600.27,242.36c43.35,54.36,59.59,125.51,44.12,193.3l-58.96-13.46c11.38-49.84-.56-102.16-32.44-142.13l47.29-37.71Z"/><path class="cls-17" d="M644.38,435.65c-15.47,67.79-60.97,124.84-123.62,155.01l-26.24-54.49c46.06-22.18,79.52-64.13,90.9-113.98l58.96,13.46Z"/><path class="cls-5" d="M520.77,590.66c-62.65,30.17-135.62,30.17-198.27,0l26.24-54.49c46.06,22.18,99.72,22.18,145.78,0l26.24,54.49Z"/><path class="cls-11" d="M322.5,590.66c-62.65-30.17-108.15-87.22-123.62-155.01l58.96-13.46c11.38,49.84,44.83,91.8,90.9,113.98l-26.24,54.49Z"/><path class="cls-13" d="M198.88,435.65c-15.47-67.79,.77-138.93,44.12-193.3l47.29,37.71c-31.88,39.97-43.82,92.29-32.44,142.13l-58.96,13.46Z"/><path class="cls-15" d="M243,242.36c43.35-54.36,109.1-86.03,178.63-86.03v60.48c-51.13,0-99.47,23.28-131.35,63.25l-47.29-37.71Z"/><path class="cls-7" d="M421.63,95.85c87.94,0,171.09,40.04,225.92,108.8l-47.29,37.71c-43.35-54.36-109.1-86.03-178.63-86.03v-60.48Z"/><path class="cls-9" d="M647.55,204.65c54.83,68.75,75.37,158.73,55.8,244.46l-58.96-13.46c15.47-67.79-.77-138.93-44.12-193.3l47.29-37.71Z"/><path class="cls-17" d="M703.35,449.11c-19.57,85.73-77.11,157.89-156.34,196.04l-26.24-54.49c62.65-30.17,108.15-87.22,123.62-155.01l58.96,13.46Z"/><path class="cls-5" d="M547.01,645.16c-79.23,38.15-171.52,38.15-250.75,0l26.24-54.49c62.65,30.17,135.62,30.17,198.27,0l26.24,54.49Z"/><path class="cls-11" d="M296.26,645.16c-79.23-38.15-136.77-110.31-156.34-196.04l58.96-13.46c15.47,67.79,60.97,124.84,123.62,155.01l-26.24,54.49Z"/><path class="cls-13" d="M139.92,449.11c-19.57-85.73,.97-175.71,55.8-244.46l47.29,37.71c-43.35,54.36-59.59,125.51-44.12,193.3l-58.96,13.46Z"/><path class="cls-15" d="M195.71,204.65c54.83-68.75,137.98-108.8,225.92-108.8v60.48c-69.53,0-135.28,31.66-178.63,86.03l-47.29-37.71Z"/></g>'
split.at.2 <- "path"
block.orders <- c("nfts", "governance", "variety", "staking", "longevity", "bridging", "activity")
wheel.colors <- c("#30CFCF", "#A682EE", "#23D1BA", "#9764E8", "#3EAFE0", "#8880E5", "#26D994")
editing <- str_split(center.slices, "path")[[1]]
intro.bit <- editing[1]
editing <- editing[2:22]
# insert class name to each slice shape
edited <- sapply(1:21, function(i) {
#class name:
cat.name <- block.orders[ifelse(i %% 7 == 0, 7, i %% 7)]
class.name <- paste0(cat.name, ceiling((i)/7))
str_replace( editing[i], "cls-(.*?) ", paste0(class.name, "\" "))
})
edited.slices <- paste(c(intro.bit, edited), collapse = split.at.2)
# add this to the top section with the css
new.header <- str_replace(string = sgv.text.split[1],
pattern = "<style>.",
replacement = paste0("<style>",
paste(".", paste0(rep(block.orders, each = 3), 1:3), "{fill:",
rep(wheel.colors, each = 3),
";opacity:%s;}", sep = "", collapse = ""),
".")
)
edited.svg <- paste(c(new.header,
sgv.text.split[which(substr(sgv.text.split, 1, 1) == "3")],
edited.slices,
sgv.text.split[which(substr(sgv.text.split, 1, 1) == "2")],
sgv.text.split[which(substr(sgv.text.split, 1, 1) == "5")]),
collapse = split.at.1)
writeLines(edited.svg, con = "wheel.svg")
# 1 slices
# 2 text
# 3 border
# 5 icon
substr(sgv.text.split, 1, 1)

View File

@ -1,144 +1,41 @@
# lunatics
setwd('/Users/kellen/git/user_metrics/apps/solana/solarscored')
library(shiny)
library(data.table)
library(stringr)
library(shinyWidgets)
library(reactable)
library(plotly)
library(shinyjs)
library(capture)
library(shinyBS)
library(dplyr)
library(solAttestR)
# library(terraConnectr)
library(shinycssloaders)
#install.packages("~/user_metrics/apps/solana/solAttestR_0.0.0.9000.tar.gz", repos = NULL, type="source")
#install.packages("~/user_metrics/apps/optimism/opAttestR_0.0.0.9000.tar.gz", repos = NULL, type="source")
wheel.colors <- c("#30CFCF", "#A682EE", "#23D1BA", "#9764E8", "#3EAFE0", "#8880E5", "#26D994")
svgdata <- readLines("wheel.svg")
#not used:
#library(stringr)
#library(showtext)
#library(htmltools)
rating.max <- 420
#load("data.RData")
file.location <- ifelse(Sys.info()[["user"]] == "rstudio-connect",
"/rstudio-data/solarscored_data.RData",
"solarscored_data.RData")
user <- Sys.info()[['user']]
isRstudio <- user == 'rstudio-connect'
baseDir <- ifelse(isRstudio, '/rstudio-data/solarscored_data.RData', './')
file.location <- paste0(baseDir, 'solarscored_data.RData')
load(file.location)
# print(exists("score.criteria"))
score_criteria <- read.csv('./score_criteria.csv') %>% as.data.table()
score_criteria <- read.csv(
paste0(baseDir, 'score_criteria.csv')
) %>% as.data.table()
bar.plot.colors <- c("#14F195", "#B2FBDC")
round_any <- function(x, accuracy, f=round){f(x/ accuracy) * accuracy}
# setnames(df2, c("user_address", "longevity", "activity", "governor", "bridgor", "staker", "explorer", "nfts",
# "longevity1", "longevity2", "longevity3", "activity1", "activity2", "activity3", "governance1", "governance2", "governance3",
# "bridging1", "bridging2", "bridging3", "staking1", "staking2", "staking3",
# "diversification1", "diversification2", "diversification3", "nfts1", "nfts2", "nfts3", "total_score"))
RemoveNAs <- function(table = dt,
na.to = 0) {
for (j in seq_len(ncol(table)))
set(table,which(is.na(table[[j]])),j,na.to)
}
base.style <- rep("20%", times = 21)
Rescale <- function(x, newrange, oldrange = NULL) {
if(is.null(oldrange)){
if (is.numeric(x) && is.numeric(newrange)) {
xna <- is.na(x)
if (all(xna))
return(x)
if (any(xna))
xrange <- range(x[!xna])
else xrange <- range(x)
if (xrange[1] == xrange[2])
return(x)
mfac <- (newrange[2] - newrange[1])/(xrange[2] - xrange[1])
return(newrange[1] + (x - xrange[1]) * mfac)
} else {
warning("Only numeric objects can be rescaled")
return(x)
}
} else if(!is.null(oldrange)){
if (is.numeric(x) && is.numeric(newrange)) {
xna <- is.na(x)
if (all(xna))
return(x)
mfac <- (newrange[2] - newrange[1])/(oldrange[2] - oldrange[1])
new.vals <- newrange[1] + (x - oldrange[1]) * mfac
if(length(new.vals[ new.vals > max(newrange)]))
new.vals[ new.vals > max(newrange)] <- max(newrange)
if(length(new.vals[ new.vals < min(newrange)]))
new.vals[ new.vals < min(newrange)] <- min(newrange)
return(new.vals)
} else {
warning("Only numeric objects can be rescaled")
return(x)
}
}
}
categories <- c("nfts", "governance", "variety", "staking", "longevity", "bridge", "activity")
MergeDataFrames <- function(list.of.data.frames,
by=NULL,
all=NULL){
if(is.null(by)) stop("You need to explicitly define your 'by' statement")
if(is.null(all)) {
all <- FALSE
message("MergeDataFrames: only complete rows will be returned. Use all=TRUE to return all rows.")
}
Reduce(
function(...)
merge(...,
by=by,
all=all),
list.of.data.frames)
}
empty.df <- data.table(total_score=0,longevity=0,longevity_value=0,activity=0,activity_value=0,governance=0,governance_value=0,bridge=0,bridge_value=0,staking=0,staking_value=0,variety=0,variety_value=0,nfts=0,nft_value=0)
# theme_univ3_small <- function(base_size = 12,
# bgcolor.dark = "white",
# bgcolor.light = "white",
# text.color = "white",
# title.color = "#white",
# lines.color = "#EDEDF3") {
# half_line <- base_size/2
# theme(text = element_text(family = 'roboto-mono',
# face = "plain",
# colour = text.color, size = base_size,
# lineheight = 0.9, hjust = 0.5,
# vjust = 0.5, angle = 0,
# margin = margin(), debug = FALSE),
#
# plot.background = element_rect(color = NA, fill = "black"),
# plot.title = element_text(size = rel(1.2),
# color = title.color,
# margin = margin(b = half_line/2)),
#
# strip.background = element_rect(fill = bgcolor.dark, colour = NA),
# strip.text = element_text(colour = text.color, size = rel(0.8)),
# strip.text.x = element_text(margin = margin(t = half_line/2,
# b = half_line/2)),
# strip.text.y = element_text(angle = -90,
# margin = margin(l = half_line/2,
# r = half_line/2)),
#
# axis.line = element_blank(),
# axis.ticks.x = element_blank(),
# axis.ticks.y = element_blank(),
#
# axis.text = element_text(color = text.color, size = base_size - 2),
#
# panel.background = element_rect(fill = "transparent", colour = NA),
# panel.border = element_blank(),
# panel.grid.major.x = element_blank(),
# panel.grid.major.y = element_blank(),
# panel.grid.minor.x = element_blank(),
# panel.grid.minor.y = element_blank(),
#
# legend.background = element_rect(colour = NA, fill = "transparent"),
# legend.key = element_rect(colour = NA, fill = "transparent"),
#
# axis.title.x=element_blank(),
# axis.text.x=element_blank(),
# axis.title.y=element_blank(),
# axis.text.y=element_blank())
# }

View File

@ -17,6 +17,3 @@ Staker,Stakooooor,staker_3,3,1000+ SOL currently staked onto Solana,
Explorer,Exploror,explorer_1,1,1+ unique programs interacted with,
Explorer,Explorooor,explorer_2,2,10+ unique programs interacted with,
Explorer,Explorooooor,explorer_3,3,25+ unique programs interacted with,
NFTs,NFT Enjoyooor,nfts_1,1,"1+ $SOL on NFTs (buys, sells, mints, last 180 days)",
NFTs,Sharp,nfts_2,2,"100+ $SOL on NFTs (buys, sells, mints, last 180 days)",
NFTs,NFT Whale,nfts_3,3,"1k+ $SOL on NFTs (buys, sells, mints, last 180 days)",
1 category score_name metric_name points score_description velocity_query
17 Explorer Exploror explorer_1 1 1+ unique programs interacted with
18 Explorer Explorooor explorer_2 2 10+ unique programs interacted with
19 Explorer Explorooooor explorer_3 3 25+ unique programs interacted with
NFTs NFT Enjoyooor nfts_1 1 1+ $SOL on NFTs (buys, sells, mints, last 180 days)
NFTs Sharp nfts_2 2 100+ $SOL on NFTs (buys, sells, mints, last 180 days)
NFTs NFT Whale nfts_3 3 1k+ $SOL on NFTs (buys, sells, mints, last 180 days)

View File

@ -1,863 +0,0 @@
CASE WHEN marketplace in ('yawww', 'solanart', 'hadeswap', 'solport', 'coral cube') THEN '0% Marketplace'
WHEN marketplace in ('opensea', 'magic eden v1', 'solana monkey business marketplace', 'magic eden v1') THEN 'Royalty Marketplace' END marketplace_type,
SELECT (post.value - pre.value) * POWER (10, -9) AS dff
, COALESCE(dff, 0) / s.sales_amount AS pct_m
, a.value:pubkey::string AS pubkey
, s.*
FROM solana.core.fact_nft_sales s
LEFT JOIN solana.core.fact_transactions t
ON t.tx_id = s.tx_id
LEFT JOIN TABLE(FLATTEN(account_keys)) a
ON a.value:pubkey::string = 'Fz7HjwoXiDZNRxXMfLAAJLbArqjCTVWrG4wekit2VpSd'
LEFT JOIN TABLE(FLATTEN(t.pre_balances)) pre
ON pre.index = a.index
LEFT JOIN TABLE(FLATTEN(t.post_balances)) post
ON post.index = a.index
WHERE s.block_timestamp >= '2022-11-01'
AND t.block_timestamp >= '2022-11-01'
AND s.marketplace = 'solanart'
AND s.succeeded
ORDER BY pct_m ASC
-- LIMIT 100
-- solanart
-- 39fEpihLATXPJCQuSiXLUSiCbGchGYjeL39eyXh3KbyT
SELECT CONCAT('https://solana.fm/tx/', s.tx_id) AS sfm_link
, l.label
, s.*
FROM solana.core.fact_nft_sales s
JOIN solana.core.dim_labels l
ON l.address = s.mint
WHERE s.block_timestamp >= '2022-05-01'
AND s.block_timestamp <= '2022-05-02'
AND s.marketplace = 'solanart'
AND s.succeeded
LIMIT 100
SELECT s.*
FROM solana.core.fact_nft_sales s
LEFT JOIN solana.core.fact_transfers t
ON t.tx_id = s.tx_id
WHERE s.block_timestamp >= '2022-07-01'
AND s.block_timestamp <= '2022-08-01'
AND t.tx_id IS NULL
AND s.marketplace = 'yawww'
LIMIT 100
-- solanart
WITH b0 AS (
SELECT s.tx_id
, s.sales_amount
, s.mint
, SUM(CASE WHEN tx_to = '39fEpihLATXPJCQuSiXLUSiCbGchGYjeL39eyXh3KbyT' THEN t.amount ELSE 0 END) AS m_amt
, SUM(CASE WHEN tx_to = '39fEpihLATXPJCQuSiXLUSiCbGchGYjeL39eyXh3KbyT' OR amount > sales_amount * 0.5 THEN 0 ELSE amount END) AS r_amt
FROM solana.core.fact_nft_sales s
JOIN solana.core.fact_transfers t
ON t.tx_id = s.tx_id
AND t.mint = 'So11111111111111111111111111111111111111112'
WHERE s.block_timestamp >= '2022-11-01'
AND s.block_timestamp <= '2022-11-05'
AND t.block_timestamp >= '2022-11-01'
AND t.block_timestamp <= '2022-11-05'
AND s.marketplace = 'solanart'
AND s.succeeded
GROUP BY 1, 2, 3
)
SELECT CONCAT('https://solana.fm/tx/', tx_id) AS sfm_link
, CONCAT('https://solscan.io/token/', mint) AS mint_link
, tx_id
, sales_amount
, m_amt
, r_amt
, ROUND(m_amt / sales_amount, 5) AS m_pct
, ROUND(r_amt / sales_amount, 5) AS r_pct
FROM b0
https://solana.fm/tx/5uoq1G9wBzuei7WS8MxN7XZwVoD3KuHTJzTZGphpvXmG42tTL5nXuJB43W7BanSLP7zRzc5R6TQNZmMNQ74L4vES
Updates
Dashboard on royalties and thread
Version 0.1 of SolarScored is out
Working on Business Intelligence Report
Problems Encountered
Priorities
Concerns
Excitements
SELECT *
FROM solana.core.fact_transfers
WHERE t.block_timestamp >= '2022-05-01'
AND t.block_timestamp <= '2022-05-05'
AND tx_id = '5uoq1G9wBzuei7WS8MxN7XZwVoD3KuHTJzTZGphpvXmG42tTL5nXuJB43W7BanSLP7zRzc5R6TQNZmMNQ74L4vES'
WITH prices AS (
SELECT date_trunc('week', recorded_hour)::date AS date
, AVG(close) AS price
FROM crosschain.core.fact_hourly_prices
WHERE id = 'solana'
AND close IS NOT NULL
GROUP BY 1
), amount AS (
SELECT date_trunc('week', block_timestamp)::date AS date
, SUM(amount) AS sol_volume
FROM solana.core.fact_transfers t
WHERE mint = 'So11111111111111111111111111111111111111111'
AND NOT tx_to IN (
'F8Vyqk3unwxkXukZFQeYyGmFfTG3CAX4v24iyrjEYBJV'
, '9BVcYqEQxyccuwznvxXqDkSJFavvTyheiTYk231T1A8S'
, '3uTzTX5GBSfbW7eM9R9k95H7Txe32Qw3Z25MtyD2dzwC'
, '5Xm6nU1Bi6UewCrhJQFk1CAV97ZJaRiFw4tFNhUbXy3u'
)
AND NOT tx_from IN (
'F8Vyqk3unwxkXukZFQeYyGmFfTG3CAX4v24iyrjEYBJV'
, '9BVcYqEQxyccuwznvxXqDkSJFavvTyheiTYk231T1A8S'
, '3uTzTX5GBSfbW7eM9R9k95H7Txe32Qw3Z25MtyD2dzwC'
, '5Xm6nU1Bi6UewCrhJQFk1CAV97ZJaRiFw4tFNhUbXy3u'
)
GROUP BY 1
)
SELECT a.date
, a.sol_volume
, (a.sol_volume * p.price) AS usd_volume
FROM amount a
JOIN prices p ON p.date = a.date
SELECT *
FROM solana.core.fact_swaps
WHERE block_timestamp >= '2022-11-08'
AND tx_id = '66DAgKyZ4qccKdtb4hdLkDpGbppGym4jPxTfqxS8DKLbBw5atrWN6QS2mLrrHPSrUmbUcsWKgYQs3wye2yowpr1i'
SELECT *
FROM solana.core.fact_transfers
WHERE block_timestamp >= CURRENT_DATE - 90
AND mint = 'So11111111111111111111111111111111111111111'
-- AND tx_to = 'F8Vyqk3unwxkXukZFQeYyGmFfTG3CAX4v24iyrjEYBJV'
ORDER BY amount DESC
LIMIT 100
WITH nft_sales AS (
SELECT block_timestamp::date AS date
, 'NFT Sale' AS tx_type
, SUM(sales_amount) AS sol_volume
FROM solana.core.fact_nft_sales s
WHERE block_timestamp >= '2022-01-01'
GROUP BY 1, 2
), swaps AS (
SELECT block_timestamp::date AS date
, 'Token Swap' AS tx_type
, SUM(CASE WHEN swap_from_mint = 'So11111111111111111111111111111111111111112' THEN swap_from_amount ELSE swap_to_amount END) AS sol_volume
FROM solana.core.fact_swaps
WHERE block_timestamp >= '2022-01-01'
GROUP BY 1, 2
), prices AS (
SELECT recorded_hour::date AS date
, AVG(close) AS price
FROM crosschain.core.fact_hourly_prices
WHERE id = 'solana'
GROUP BY 1
)
SELECT date_trunc('week', COALESCE(n.date, w.date)) AS week
, SUM( COALESCE(n.sol_volume, 0) ) AS nft_volume_sol
, SUM( COALESCE(s.sol_volume, 0) ) AS swap_volume_sol
, SUM( COALESCE(n.sol_volume, 0) + COALESCE(s.sol_volume, 0) ) AS tot_volume_sol
, SUM( price * COALESCE(n.sol_volume, 0) ) AS nft_volume_usd
, SUM( price * COALESCE(s.sol_volume, 0) ) AS swap_volume_usd
, SUM( price * (COALESCE(n.sol_volume, 0) + COALESCE(s.sol_volume, 0)) ) AS tot_volume_usd
FROM nft_sales n
FULL OUTER JOIN swaps s
ON s.date = n.date
LEFT JOIN prices p
ON p.date = COALESCE(n.date, s.date)
GROUP BY 1
SELECT s.*
, a.value:pubkey::string AS pubkey
, (post.value - pre.value) * POWER (10, -9) AS dff
FROM solana.core.fact_nft_sales s
JOIN solana.core.fact_transactions t
ON t.tx_id = s.tx_id
LEFT JOIN TABLE(FLATTEN(account_keys)) a
ON a.value:pubkey::string = 'Fz7HjwoXiDZNRxXMfLAAJLbArqjCTVWrG4wekit2VpSd'
LEFT JOIN TABLE(FLATTEN(t.pre_balances)) pre
ON pre.index = a.index
LEFT JOIN TABLE(FLATTEN(t.post_balances)) post
ON post.index = a.index
WHERE s.block_timestamp >= '2022-11-01'
AND t.block_timestamp >= '2022-11-01'
AND s.marketplace = 'yawww'
WITH buys AS (
SELECT purchaser AS user_address
, SUM(sales_amount) AS buy_volume
FROM solana.core.fact_nft_sales
WHERE block_timestamp >= CURRENT_DATE - 180
AND succeeded
GROUP BY 1
), sells AS (
SELECT seller AS user_address
, SUM(sales_amount) AS sell_volume
FROM solana.core.fact_nft_sales
WHERE block_timestamp >= CURRENT_DATE - 180
AND succeeded
GROUP BY 1
), mints AS (
SELECT purchaser AS user_address
, SUM(mint_price) AS mint_volume
FROM solana.core.fact_nft_sales
WHERE block_timestamp >= CURRENT_DATE - 180
AND succeeded
AND mint_currency = 'So11111111111111111111111111111111111111111'
AND mint_price <= 15
GROUP BY 1
)
SELECT COALESCE(b.user_address, s.user_address, m.user_address) AS user_address
, COALESCE(b.buy_volume, 0) + COALESCE(s.sell_volume, 0) + COALESCE(s.mint_volume, 0) AS volume
FROM buys b
FULL OUTER JOIN sells s
ON s.user_address = b.user_address
FULL OUTER JOIN mints m
ON m.user_address = COALESCE(b.user_address, s.user_address)
SELECT *
FROM solana.core.fact_nft_mints
WHERE block_timestamp >= CURRENT_DATE - 2
AND succeeded
LIMIT 11
SELECT CONCAT('https://solana.fm/tx/', e.tx_id) AS sfm_link
, ARRAY_SIZE(e.inner_instruction:instructions)
, e.tx_id
, e.block_id
, e.block_timestamp::date AS date
, e.inner_instruction:instructions[0]:parsed:info:mint::string AS mint
, s.sales_amount
, CASE WHEN e.inner_instruction:instructions[0]:parsed:info:lamports > 0 THEN 0 WHEN inner_instruction:instructions[3]:parsed:info:lamports > 0 THEN 3 ELSE 5 END AS ind
, COALESCE(e.inner_instruction:instructions[ind]:parsed:info:lamports * POWER(10, -9), 0) AS price_0
, COALESCE(e.inner_instruction:instructions[ind + 1]:parsed:info:lamports * POWER(10, -9), 0) AS yawww_fee
, COALESCE(e.inner_instruction:instructions[ind + 2]:parsed:info:lamports * POWER(10, -9), 0)
+ COALESCE(e.inner_instruction:instructions[ind + 3]:parsed:info:lamports * POWER(10, -9), 0)
+ COALESCE(e.inner_instruction:instructions[ind + 4]:parsed:info:lamports * POWER(10, -9), 0)
+ COALESCE(e.inner_instruction:instructions[ind + 5]:parsed:info:lamports * POWER(10, -9), 0)
+ COALESCE(e.inner_instruction:instructions[ind + 6]:parsed:info:lamports * POWER(10, -9), 0) AS collection_royalty
, price_0 + yawww_fee + collection_royalty AS price
, CASE WHEN price = 0 THEN 0 ELSE yawww_fee / price END AS pct_m
, CASE WHEN price = 0 THEN 0 ELSE collection_royalty / price END AS pct_r
, CASE
WHEN mint = '2ZkSXXKvdxCCkHYkhfL3xmGvioMQoERCMPVzxmRjVF2K' THEN 'Liberty Square'
WHEN mint = '3TmpAxD2Z4zPfFVR7uNQMFw4tj7sNSwc2MzSFyjoV2Np' THEN 'Heroes Of Astron'
WHEN mint = '9XX3iGGCVaqivVkgVk8ci6SF3zMRbKnxp1fQhJFXmsam' THEN 'The Resurrected'
WHEN mint = 'Afw1QQLzHAFEUWJCriRunLzz3PL4v1ZDQvs1izk29Wvi' THEN 'Heroes Of Astron'
ELSE INITCAP(l.label) END AS collection
, e.inner_instruction
, t.inner_instruction
, e.instruction
FROM solana.core.fact_events e
JOIN solana.core.fact_nft_sales s
ON s.tx_id = e.tx_id
JOIN solana.core.fact_transactions t
ON t.tx_id = e.tx_id
LEFT JOIN solana.core.dim_labels l
ON l.address = inner_instruction:instructions[0]:parsed:info:mint::string
WHERE e.block_timestamp >= '2022-06-04 13:49:14'
AND instruction:programId = '5SKmrbAxnHV2sgqyDXkGrLrokZYtWWVEEk5Soed7VLVN'
AND e.succeeded
AND mint IS NOT NULL
AND price < 1000
AND ROUND(pct_m, 5) = 0.0
-- AND pct_r > 0
ORDER BY pct_r DESC, e.block_timestamp DESC, e.tx_id
LIMIT 100
SELECT *
FROM solana.core.fact_transfers
WHERE block_timestamp >= '2022-12-06'
AND tx_id = '5trNueei7P3ukTaHBQSZBirhfbxgetF9D53DMvFHZRfNH8JwKdnjVjTV2zrG56idwvYbtquGieXSHRKSEzV4EZgz'
WITH prices AS (
SELECT date_trunc('week', recorded_hour)::date AS date
, AVG(close) AS price
FROM crosschain.core.fact_hourly_prices
WHERE id = 'solana'
GROUP BY 1
), amount (
SELECT date_trunc('week', block_timestamp) AS date
, SUM(amount) AS sol_amount
FROM solana.core.fact_transfers t
WHERE mint = 'So11111111111111111111111111111111111111112'
GROUP BY 1
)
SELECT p.date
, a.sol_volume
, (a.sol_amount * p.price) AS usd_volume
FROM amount a
LEFT JOIN prices p ON p.date = a.date
SELECT date
FROM solana.core.fact_transfers t
LIMIT 100
SELECT CONCAT('https://solana.fm/tx/', e.tx_id) AS sfm_link
, ARRAY_SIZE(inner_instruction:instructions)
, e.tx_id
, e.block_id
, e.block_timestamp::date AS date
, inner_instruction:instructions[0]:parsed:info:mint::string AS mint
, COALESCE(inner_instruction:instructions[ind]:parsed:info:lamports * POWER(10, -9), 0) AS price_0
, COALESCE(inner_instruction:instructions[ind + 1]:parsed:info:lamports * POWER(10, -9), 0) AS yawww_fee
, COALESCE(inner_instruction:instructions[ind + 2]:parsed:info:lamports * POWER(10, -9), 0)
+ COALESCE(inner_instruction:instructions[ind + 3]:parsed:info:lamports * POWER(10, -9), 0)
+ COALESCE(inner_instruction:instructions[ind + 4]:parsed:info:lamports * POWER(10, -9), 0)
+ COALESCE(inner_instruction:instructions[ind + 5]:parsed:info:lamports * POWER(10, -9), 0)
+ COALESCE(inner_instruction:instructions[ind + 6]:parsed:info:lamports * POWER(10, -9), 0) AS collection_royalty
, price_0 + yawww_fee + collection_royalty AS price
, CASE WHEN price = 0 THEN 0 ELSE yawww_fee / price END AS pct_m
, CASE WHEN price = 0 THEN 0 ELSE collection_royalty / price END AS pct_r
, CASE
WHEN mint = '2ZkSXXKvdxCCkHYkhfL3xmGvioMQoERCMPVzxmRjVF2K' THEN 'Liberty Square'
WHEN mint = '3TmpAxD2Z4zPfFVR7uNQMFw4tj7sNSwc2MzSFyjoV2Np' THEN 'Heroes Of Astron'
WHEN mint = '9XX3iGGCVaqivVkgVk8ci6SF3zMRbKnxp1fQhJFXmsam' THEN 'The Resurrected'
WHEN mint = 'Afw1QQLzHAFEUWJCriRunLzz3PL4v1ZDQvs1izk29Wvi' THEN 'Heroes Of Astron'
ELSE INITCAP(l.label) END AS collection
, inner_instruction
, instruction
FROM solana.core.fact_events e
JOIN solana.core.fact_nft_sales s
ON s.tx_id = e.tx_id
LEFT JOIN solana.core.dim_labels l ON l.address = inner_instruction:instructions[0]:parsed:info:mint::string
WHERE e.block_timestamp >= '2022-06-04 13:49:14'
AND instruction:programId = '5SKmrbAxnHV2sgqyDXkGrLrokZYtWWVEEk5Soed7VLVN'
AND e.succeeded
AND mint IS NOT NULL
AND price < 1000
AND ROUND(pct_m, 5) = 0.0
//AND pct_r > 0
ORDER BY pct_r DESC, e.block_timestamp DESC, e.tx_id
LIMIT 100
SELECT MAX(ARRAY_SIZE(inner_instruction:instructions))
FROM solana.core.fact_events e
LEFT JOIN solana.core.dim_labels l ON l.address = inner_instruction:instructions[0]:parsed:info:mint::string
WHERE e.block_timestamp >= '2022-07-04 13:49:14'
AND inner_instruction:instructions[0]:parsed:info:mint::string IS NOT NULL
AND instruction:programId = '5SKmrbAxnHV2sgqyDXkGrLrokZYtWWVEEk5Soed7VLVN'
SELECT date_trunc('month', e.block_timestamp)::date AS date
, SUM(COALESCE(inner_instruction:instructions[5]:parsed:info:lamports * POWER(10, -9), 0)) AS price_0
, SUM(COALESCE(inner_instruction:instructions[6]:parsed:info:lamports * POWER(10, -9), 0)) AS yawww_fee
, SUM(COALESCE(inner_instruction:instructions[7]:parsed:info:lamports * POWER(10, -9), 0) + COALESCE(inner_instruction:instructions[8]:parsed:info:lamports * POWER(10, -9), 0) + COALESCE(inner_instruction:instructions[9]:parsed:info:lamports * POWER(10, -9), 0) + COALESCE(inner_instruction:instructions[10]:parsed:info:lamports * POWER(10, -9), 0) + COALESCE(inner_instruction:instructions[11]:parsed:info:lamports * POWER(10, -9), 0)) AS collection_royalty
, price_0 + yawww_fee + collection_royalty AS price
, yawww_fee / price AS pct_m
, collection_royalty / price AS pct_r
FROM solana.core.fact_events e
WHERE e.block_timestamp >= '2022-07-04 13:49:14'
AND instruction:programId = '5SKmrbAxnHV2sgqyDXkGrLrokZYtWWVEEk5Soed7VLVN'
AND price < 1000
GROUP BY 1
WITH b0 AS (
SELECT date_trunc('month', e.block_timestamp)::date AS date
, COALESCE(inner_instruction:instructions[5]:parsed:info:lamports * POWER(10, -9), 0) AS price_0
, COALESCE(inner_instruction:instructions[6]:parsed:info:lamports * POWER(10, -9), 0) AS yawww_fee
, COALESCE(inner_instruction:instructions[7]:parsed:info:lamports * POWER(10, -9), 0) + COALESCE(inner_instruction:instructions[8]:parsed:info:lamports * POWER(10, -9), 0) + COALESCE(inner_instruction:instructions[9]:parsed:info:lamports * POWER(10, -9), 0) + COALESCE(inner_instruction:instructions[10]:parsed:info:lamports * POWER(10, -9), 0) + COALESCE(inner_instruction:instructions[11]:parsed:info:lamports * POWER(10, -9), 0) AS collection_royalty
, price_0 + yawww_fee + collection_royalty AS price
, ROUND(yawww_fee / price, 4) AS pct_m
, ROUND(collection_royalty / price, 4) AS pct_r
FROM solana.core.fact_events e
WHERE e.block_timestamp >= '2022-06-01'
AND instruction:programId = '5SKmrbAxnHV2sgqyDXkGrLrokZYtWWVEEk5Soed7VLVN'
)
SELECT date
, pct_m
, COUNT(1) AS n
FROM b0
GROUP BY 1, 2
SELECT date_trunc('month', block_timestamp)::date AS date
, COUNT(1) AS n
FROM solana.core.fact_nft_sales
WHERE marketplace = 'yawww'
GROUP BY 1
SELECT date_trunc('month', e.block_timestamp)::date AS date
, SUM(COALESCE(inner_instruction:instructions[5]:parsed:info:lamports * POWER(10, -9), 0)) AS price_0
, SUM(COALESCE(inner_instruction:instructions[6]:parsed:info:lamports * POWER(10, -9), 0)) AS yawww_fee
, SUM(COALESCE(inner_instruction:instructions[7]:parsed:info:lamports * POWER(10, -9), 0) + COALESCE(inner_instruction:instructions[8]:parsed:info:lamports * POWER(10, -9), 0) + COALESCE(inner_instruction:instructions[9]:parsed:info:lamports * POWER(10, -9), 0) + COALESCE(inner_instruction:instructions[10]:parsed:info:lamports * POWER(10, -9), 0) + COALESCE(inner_instruction:instructions[11]:parsed:info:lamports * POWER(10, -9), 0)) AS collection_royalty
, price_0 + yawww_fee + collection_royalty AS price
, yawww_fee / price AS pct_m
, collection_royalty / price AS pct_r
FROM solana.core.fact_events e
WHERE e.block_timestamp >= '2022-07-04 13:49:14'
AND instruction:programId = '5SKmrbAxnHV2sgqyDXkGrLrokZYtWWVEEk5Soed7VLVN'
AND price < 1000
GROUP BY 1
SELECT s.marketplace
-- , t.tx_to
, s.tx_id
, l.label
, CONCAT('https://solana.fm/tx/', s.tx_id) AS sfm_link
, ARRAY_SIZE(tr.instructions) AS as_in
, ARRAY_SIZE(tr.instructions[0]:instructions) AS as_in0
, *
FROM solana.core.fact_nft_sales s
-- JOIN solana.core.fact_transfers t
-- ON t.tx_id = s.tx_id
-- AND t.tx_to = '5z1vT6R1HcgvzDpto63rrhgVF4CjA4Sho6DbN58Pwzw3'
JOIN solana.core.dim_labels l
ON l.address = s.mint
AND l.label = 'grimzdao'
WHERE s.block_timestamp >= '2022-10-01'
-- AND t.block_timestamp >= '2022-10-01'
AND s.marketplace ILIKE '%yaw%'
hayleyngreenfield@gmail.com
Is there anything you think I could / should do in these areas to make sure he's productive (or future people are productive)
There was space for me to help grow Ben's skillset.
Should we do more BI stuff?
We're enjoying it (sustainable)
Right incentives (making money)
'
SELECT CONCAT('https://solana.fm/tx/', tx_id) AS sfm_link
, *
FROM solana.core.fact_nft_sales s
JOIN solana.core.dim_labels l
ON l.address = s.mint
WHERE s.block_timestamp >= CURRENT_DATE - 3
AND marketplace = 'hadeswap'
AND l.label = 'Okay Bears'
LIMIT 100
SELECT l.label
, s.tx_id
, *
FROM solana.core.fact_nft_sales s
JOIN solana.core.fact_transfers t
ON t.tx_id = s.tx_id
AND t.tx_to = '5z1vT6R1HcgvzDpto63rrhgVF4CjA4Sho6DbN58Pwzw3'
JOIN solana.core.dim_labels l
ON l.address = s.mint
WHERE s.block_timestamp >= CURRENT_DATE - 90
AND t.block_timestamp >= CURRENT_DATE - 90
AND s.tx_id IN (
'5JpNhDGvqTjs7efXr5H2DbZPyQjN7yXHpaUDr8d3ba4BnMXZj8p2hzekJKG872UfDLcS9WugExyBtRkFsNYQhhmY',
'3EgBVWgqjA5fGDGLgEC4fmbrg2LrPP37MqdHyj8yyaYTuBnsLCdetorwyssvCf9yLq74YJ2U4juZ3pp7Wb93SRjc',
'4qeihebwmvB8ot37DdXUYe3aavqyyNcRTqJM4VoPDLtX7PUJjf8UH2AAXbjjBFQ2QW1CXQCXivPucGwRCMzghNUn',
'5zFmimXF8wpMHhXusRiccgb7w7PEhCGkSjbTLQ2UKzAZ8Qd54eQY3dZa83w1X12DKoHmsdpSWtia1CrL4bufyYJz',
'45SczJ13kx96N8me7er3Xmgx5BA8VHA42yELckhjgDPsjcVkYDRGeHDSuQUNzjVstgc3ShwgjocDJvqC3JKFc1UR',
'2RchxUjZP6uEBQxAvKzQb6fnHviibzNcNQBAWZSPXpzN3TLwrsu9RK5TPvirHj4VpHn4kGR2H9YyNBnBjhtTYTXw',
'22YceKsL4Sbrh2aowUaa47GdoX9H7XnBg6cizy68YNUQx7yAbEFURedEVhgJ1R9tRBWz1vX4gSNqEBdoHyeApSoD',
'2f72km7dsV2kJx96WFdaHHTW6DmFHSJpRuC3WQxjqUoHFzoD6vE3g6wKkvFd6Jzy3F4SVGFqaaQgGqBBjA3Rkum5',
'22uQAfeM33BJyYwJyGjaNCHpb2Kj8mfa4wegMQ2WdtfzBcyYSq8wxYAvTis6yWs1c62JtxdaBNNSNu4YxsEAnxW1',
'wuBUpHfpVorY2ntDzhdensuKRcTLnL2KARCUtJQ21ZGQEHcWV5SX8nh8efn1iF5jpAuDizhNTEJDy3LErGfoR9d',
'53i7inULH7gurCjRHcQxtxuXchU6SmQgeBNnuD6DAFqiC2ohDPBN3K8vt4SQCq2U3NvhRgNz8mgbKKTHDmejVv2x',
'4rRfz7JcJrLfJ8vsKEpmbxMPVGUdYi11CATv87TANLMrs8hTVjkfsGdfnp8pmM1BvcZUFVozHWmA5vJw7pxxfGZp',
'3GU2qWxNKRNZFJWSHGGar8PTeE7osXKiCxTVP4sWpjFU7g5KhsCwccZtY2zjyHK44Y5WjLHzdCojRzfz59PH3gVc',
'xeAzSv3S87p9xHyZdScKtmvUZFTxtvYf5Lye7iw1LEPtEEv5X9JjBvHeRnUdYF5SCJRrExsu2jb6TaoPDbYUM95',
'3iZDdfE5zvykLdPKfrq18vdBE9vKW2hQsnLePphcgG87XchPLk6XubpwXhVnqB7ZJzfJ6Fs7iet2d7hm716ebUsZ',
'3HnshEg45APZ1QEAjBQoFDkgm4YWhhkua6xtkXyF1WPEBDo8E359zpovGGwXiUND4oXT4F3hDSZk58J9xP38G99D',
'3tqUBXMFEm8wUZcnc7xkMGBmiqoczJkJhYf7LHL6gwV3vFAL1h7EGFzNBu4XE7KWjURVAcQ99GjYsEvo2784XW8Y',
'5BaLbjaez8FUVf5rAydL3Y86RbE6pPDknLjiKyVjuCF9PWGPaWcLjeqjhA7uvnCXhTLNtVFxphyD8jn9JgcSWFbW',
'JzGZ7qqrB8zhcnVi3uSNYFkJV2xWFHSwmiR7qgsohepFkP8k8VfaAm2Yyv2UK6BNkSJm8BwHR9eENUEwdKiq8Mq',
'5DdQDFNS3CmVSUfG8hUNXZgb6A7v2NtCBZAAQmhZPNysiJxqXbJGTAR3gPGxbCVk2qiswnrQzpFoadSGKqpQurdE',
'5QKs6gZaFbeRTmEvJJ4PQNCvtryciUrYctjkh1GLb6HrmxpJWPeg3fRX2nnxZB6bSoYagiqWcbpFYmSFAGPgoURo',
'423BsEvD3yMjd16JiCayusXbYay2i8g4uajfQxHYU8urvm9RkaPzu5YWHaMFk2XXvRrUDcM3n4D2d21BeYqygToU',
'4D57auoxQizjQVUsZBijyGD5xDmqEYiv16aLDJDjLFWXWC3HgkFTyzMS9sCySswY4VhQK1BDDGVrbD2bzBFimYLf',
'5jdz3XBFZ6L2CiiyvufhRF1Vp7dGhXdagrU5gkb1rMko6JKkcX1nCWExP646iot6vTHuj43nK9p7VUpwRBb2Wa5i',
'45Fzc4fJCDqzJH2WLUV2U3YJf87At7Z3YgsyvevvKJ9cuwVXTVETaAr3hCk6ZKdC3hc4CWmYaC8ZUBzzWFQ3Q8kw',
'iLSXKH3eFoGSh2ANy69AFaLG1NPA4LKZcLtzjgpe31TGaJj7fRwz5eiEqA1b681ZbkivRq3VZwRxdK8z3RF7dvf',
'WTmKhrXnHtWqmSbMrDpjx2PBikTkGJD2GnXKZbQq3mgvUXt6hCbzTrNRbZdkZQRfgrMMLMVWK9vbub6o98d2dUQ',
'Bw3NrJ3hs9MKCmMX2vHnYLJj8MNQKbQnvwkYYNpV7SG7pE4hbUhf49es7SAsRyQejQiJztTQiEPAnoUYejPGNFh',
'2v7MQ3AGNpDtUn5q2nZhX8Gcm6UBt4nHSu5CZvnJ1hfr8NGYbiZz98wU9WDtadHRoMaDiHuiFbzknzWiswaQrgZK',
'2CrvgP1ynMAVPjeycp9K7nVe8AtX5g3wrtosskAaQLHVyXZh1RtVEDBS2PcA6vq71h89eAKhRYNsJpkyNxsgH886',
'3vdajZTb4jQp4XjmEP71uVvxeLdUJHCVgoGEGDReWnZqFRxnRxT3HDL9N6QQe14ereuwHPsgzfSaPChqhLwCfx1m',
'4raA9X2hD6RNshwk1qjktcF1gKZrzRKjS2Ggzhjt6hgF821pZGcobq2UWh5k8vbeVye8EXuX846unTpfKbc3wHXA',
'3RGEVDxdghyLKNk1aQfwVBzTEtWJJrg83r7E3PM4DWig22QARQGMDKTpfosA5VUWh9RNrbJ6kFrx5amvw31A6rZG',
'yPgUWTjBw8HWZ18Usn5RZEjeWPsd1TehFD3e4uq3KGwnUQptvPdFzgdsPkqc95VeLR9LnQFGtYie3baLkUBZA13',
'54m4w8yVpj324upaAJe3uwKT1kTFDW6DLEH7tKaAhmYYYdXqJmZSWiR2gUZQF5UnRC3M9nTcnEoM8SVz3guvfh9L',
'24gyG5wGfp9e8dmhefG2krDcT1VLAa5KzhGK8RCHoAQE8Vf7jsixdeswhyTXapD9BMX9Ga5bPpYVWrUs2QE2VdPr',
'4pyvRNCi5yWM8Jhp3Ff3GDYeiKCwC9FVSBYyr92NWerav3Cuk1RktBFUb3xeKxie6xmauyJgpK5jFXpGSnvjRJsB',
'4XUSUMwx7VUjdKAVCRuo6MLAdZZqxWxq9kJvZrv63EbjxyUkaSFAVnBUvkKBJV5XTrN7vdMQD7PyTdVHfeezvyby',
'5r5e6LntFgHC7QnFJrygmeZKfLDCvBBdwaee6zRAvVXx8bcPg8iUyxUJC7dvxorEtNK7xifCH4rovdZ9hP2jLFBR',
'3MhactaRa7XAuyYve7EjQk62MXNcfre25ENgWM9XPjNAdYj9JASPRCyNzhVMsxTdSBGQX97pnEYoLKEAb8xjwD6D',
'4nB6462kW7a1sSCJzUDRtMHFHaWYqk5SfnW61hbmUbxTAn4ce2L9vtzPbWLkmYrhXRqze7RHekZNSAUEdnRohgrQ',
'5jxxtZ87Y1GwuUYtFVHipgutTYUiLthp6REAMjPVaAfQyFaCRbFkXNXwQkVjZrFawcPaASpSqM8xQGiuPvYM7ptM',
'57eApXip2BsmFyyUh9py7ARbS6MBbgnqVNSHop9t3jVoFsukakHGoQKVPPZVpwWJEvbePTrThaE9r8kQQQZ31vPq',
'3kvQJsBu4hq1zkLfSY1j3UJhAqiwcf8MHRVmKAkiYxyULtvMTsQ4Wi6aU7Mixnp2UrpnyFkhu7JXUqi4L4Mthtp1',
'3m7kAif6cwT5X6qinwH1kKRuTDKxJRtjW2RydsW3WenHqcLiPsQ4jKpiEu2AnVgrXrUm4yhLiGZwjK8bPNuCuncz',
'4rE6C2JBEKpJkMybcuyik6v4Fps7JvZchBrVXzsvHnBLviYovJDYZ6TDb2LoYPRN66D4cZDLKMuD7XmnFrd9cY9f',
'58u6pXhzX8zpPoZ9ZrWWnnuc4KUg2q2oa9GtHh19wLTbWmVkzKtYpoRLi3ZU29gsFiQXBPPw72MGyxYwXKa4kWNf',
'541uGAip6K2WxDgxp5nNtDBbFcuBXb7FCaeSbY7t9MLttyeXtCFhzp4n52vQQuSrPqUXZZwfH1uMo826S3f6dcZo',
'sq9Tw5vbEaLPauv2Qc5PavSNTGpopqvsJrCgtAYLUtTCV6wRx2Mhz1ogcFWrYFYxYJbLj3DeQMFh51AzLYyq1BV',
'9HJaE5TrU2QCRmsNP6twrkCateUEesWFoNjTTyxM11FdxxkWHyaePH8UFVeuRvEcmZ94oUAvHzoNFHJegz4p2o9',
'3SYyc4JkrcCFvU6GjjJyDq7MWfcp1HVcd59d4gR4EsfdxuqeZcQ6KomhRPamRY2qRPozuAPR5uXQW22hpNHPHL8c',
'5tPE45YpVD7LHmYvB4WRcpCwFHvGZV7sKwzZFKkS3Gd23aKSD2GnWQuuDnnV8YXh9Xvg7XhxBzk9nVY7RLEmEaSP',
'tuMpRaXBWc92ygcqgfgjSZjwvxpgm247AWtFxwg6d3iRPmGHPjSpB8wojefiMHHA4TeyQtFizJcUczpoVsFgcNU',
'3Eg3g1JB18EsZn3iCHpZAm5QiTSjCn6BDdeZbCqiZ5AmMwohNdENrewySDeYNDyLMfGAvox6wuDno21ghgNJ4pR',
'4MYzNmhSxQhZ9vu1n4H9cFfyuqQHTqNNo3ExNkh6x5XQTR5EprzNRNKwsgHvzznRrMeGdv5yWSoZJGvM4dL2eZiB',
'2KEYGUHXEh5N3MhajtbkfDtf9pq26Wqi2QcJMS4gjWEpw5KEc2pPKUuDkj3ef4yfTNK7VJQfLhG16tuyEGA8vZ5G',
'fALSk5BGE3m3QpGwr9Fch2uqweRSLm6PrsJqoHKGnHmrCh28sdTNvSHVBW86NihT2joYkvjxrxH1gq9Qd1sFtEQ',
'3nqyc1fPzQ1CvHhj1t8rGFqjVV9vh5ehBUrJdrGrUg3t8xa1ifNR5pE2vf66oqQgzHDTRpNw45a95vt49WdbyQUF'
)
'Bring back thread competition (open it up the whole company)
Bring back NFT Deal Score
SELECT marketplace
, SUM(sales_amount) AS amt
FROM solana.core.fact_nft_sales s
WHERE block_timestamp >= '2022-08-01'
AND sales_amount < 1000
GROUP BY 1
ORDER BY 2 DESC
SELECT CONCAT('https://solana.fm/tx/', tx_id) AS sfm_link
, l.label
, s.*
FROM solana.core.fact_nft_sales s
JOIN solana.core.dim_labels l
ON l.address = s.mint
WHERE block_timestamp >= CURRENT_DATE - 7
AND marketplace = 'hadeswap'
LIMIT 100
WITH tx AS (
SELECT DISTINCT s.tx_id
, block_timestamp::date AS date
, COALESCE(m.token_name, 'Other') AS token_name
, s.mint
, sales_amount
, purchaser
FROM solana.core.fact_nft_sales s
JOIN solana.core.dim_nft_metadata m ON m.mint = s.mint
WHERE block_timestamp >= '2022-01-01'
AND block_timestamp <= '2022-01-02'
AND m.token_name = 'Okay Bears'
AND marketplace LIKE 'magic eden v1'
AND succeeded
AND sales_amount > 0
), base AS (
SELECT t.tx_id
, SUM(CASE WHEN tx_to = 'rFqFJ9g7TGBD8Ed7TPDnvGKZ5pWLPDyxLcvcH2eRCtt' AND t.mint = 'So11111111111111111111111111111111111111112' THEN amount ELSE 0 END) AS m_amt
, SUM(CASE WHEN tx_to <> 'rFqFJ9g7TGBD8Ed7TPDnvGKZ5pWLPDyxLcvcH2eRCtt' AND t.mint = 'So11111111111111111111111111111111111111112' AND amount < (sales_amount * 0.5) THEN amount ELSE 0 END) AS r_amt
FROM solana.core.fact_transfers t
JOIN tx ON tx.tx_id = t.tx_id
WHERE block_timestamp >= '2022-01-01'
GROUP BY 1
), b0 AS (
SELECT tx.tx_id
, date
, mint
, token_name
, sales_amount
-- , s_amt
, m_amt
, r_amt
, ROUND(sales_amount - COALESCE(r_amt, 0) - COALESCE(m_amt, 0),4) AS s_amt
-- , ROUND(sales_amount - COALESCE(s_amt, 0) - COALESCE(m_amt, 0),4) AS r_amt_calc
, s_amt / sales_amount AS s_pct
, m_amt / sales_amount AS m_pct
, r_amt / sales_amount AS r_pct
FROM tx
JOIN base b ON b.tx_id = tx.tx_id
)
, b1 AS (
SELECT token_name
, date_trunc('month', date) AS month
, SUM(sales_amount) AS sales_amount
, SUM(s_amt) AS s_amt
, SUM(m_amt) AS m_amt
, SUM(r_amt) AS r_amt
, MEDIAN(s_pct) AS s_pct
, MEDIAN(m_pct) AS m_pct
, MEDIAN(r_pct) AS r_pct
, 100 * AVG(CASE WHEN b0.r_amt = 0 THEN 1.0 ELSE 0.0 END) AS pct_no_royalty
FROM b0
GROUP BY 1, 2
)
SELECT *
, 100 * (r_amt / sales_amount) AS royalty_pct
FROM b1
SELECT CONCAT('https://solscan.io/tx/', tx_id) AS sol_link
, *
FROM solana.core.fact_nft_mints
WHERE mint_currency = 'So11111111111111111111111111111111111111111'
AND mint_price <= 15
ORDER BY mint_price DESC
LIMIT 100
--
WITH tx AS (
SELECT DISTINCT s.tx_id
, block_timestamp::date AS date
, COALESCE(m.token_name, 'Other') AS token_name
, s.mint
, sales_amount
, purchaser
FROM solana.core.fact_nft_sales s
JOIN solana.core.dim_nft_metadata m ON m.mint = s.mint
WHERE block_timestamp >= '2022-01-01'
-- AND m.token_name = 'Okay Bears'
AND marketplace = 'magic eden v2'
AND succeeded
AND sales_amount > 0
), mint AS (
SELECT date_trunc('month', block_timestamp)::date AS month
, SUM(mint_price) AS mint_volume
FROM solana.core.fact_nft_mints m
WHERE month >= '2022-01-01'
AND mint_currency = 'So11111111111111111111111111111111111111111'
AND mint_price <= 15
GROUP BY 1
)
, base AS (
SELECT t.tx_id
, SUM(CASE WHEN tx_to = 'rFqFJ9g7TGBD8Ed7TPDnvGKZ5pWLPDyxLcvcH2eRCtt' AND t.mint = 'So11111111111111111111111111111111111111112' THEN amount ELSE 0 END) AS m_amt
, SUM(CASE WHEN tx_to <> 'rFqFJ9g7TGBD8Ed7TPDnvGKZ5pWLPDyxLcvcH2eRCtt' AND t.mint = 'So11111111111111111111111111111111111111112' AND amount < (sales_amount * 0.5) THEN amount ELSE 0 END) AS r_amt
FROM solana.core.fact_transfers t
JOIN tx ON tx.tx_id = t.tx_id
WHERE block_timestamp >= '2022-01-01'
GROUP BY 1
), b0 AS (
SELECT tx.tx_id
, date
, mint
, token_name
, sales_amount
-- , s_amt
, m_amt
, r_amt
, ROUND(sales_amount - COALESCE(r_amt, 0) - COALESCE(m_amt, 0),4) AS s_amt
-- , ROUND(sales_amount - COALESCE(s_amt, 0) - COALESCE(m_amt, 0),4) AS r_amt_calc
, s_amt / sales_amount AS s_pct
, m_amt / sales_amount AS m_pct
, r_amt / sales_amount AS r_pct
FROM tx
JOIN base b ON b.tx_id = tx.tx_id
)
, b1 AS (
SELECT date_trunc('month', date) AS month
, SUM(sales_amount) AS sales_amount
, SUM(s_amt) AS s_amt
, SUM(m_amt) AS m_amt
, SUM(r_amt) AS r_amt
, MEDIAN(s_pct) AS s_pct
, MEDIAN(m_pct) AS m_pct
, MEDIAN(r_pct) AS r_pct
, 100 * AVG(CASE WHEN b0.r_amt = 0 THEN 1.0 ELSE 0.0 END) AS pct_no_royalty
FROM b0
GROUP BY 1
)
SELECT b1.*
, 100 * (r_amt / sales_amount) AS royalty_pct
, m.mint_volume
FROM b1
JOIN mint m ON m.month = b1.month
-- explorer
WITH signers AS (
SELECT tx_id
, signers[0]::string AS user_address
FROM solana.core.fact_transactions
WHERE block_timestamp >= CURRENT_DATE - 90
GROUP BY 1, 2
)
SELECT user_address
, COUNT(DISTINCT COALESCE(l.label, e.program_id)) AS n_unique_programs
FROM solana.core.fact_events e
JOIN signers s ON s.tx_id = e.tx_id
LEFT JOIN solana.core.dim_labels l
ON l.address = e.program_id
WHERE e.block_timestamp >= CURRENT_DATE - 90
GROUP BY 1
-- Staker - How much SOL have they staked?
WITH b0 AS (
SELECT *
, ROW_NUMBER() OVER (PARTITION BY stake_authority ORDER BY block_timestamp DESC) AS rn
FROM solana.core.ez_staking_lp_actions
)
SELECT stake_authority AS user_address
, post_tx_staked_balance * POWER(10, -9) AS staked_sol
FROM b0
WHERE rn = 1
-- Bridgor - How many times are they bridging assets onto Solana (from a bridge or CEX)?
WITH tx AS (
SELECT DISTINCT tx_id
FROM solana.core.fact_events e
JOIN solana.core.dim_labels l
ON l.address = e.program_id
AND l.label_subtype = 'bridge'
WHERE e.block_timestamp >= CURRENT_DATE - 2
)
SELECT CASE WHEN tx.tx_id IS NULL THEN label_type ELSE 'bridge' END AS clean_label
, COUNT(1) AS n
FROM solana.core.fact_transfers t
LEFT JOIN tx ON tx.tx_id = t.tx_id
LEFT JOIN solana.core.dim_labels l
ON l.address = t.tx_from
AND (l.label_type = 'cex' OR l.label_subtype = 'bridge' )
WHERE t.block_timestamp >= CURRENT_DATE - 2
AND (tx.tx_id IS NOT NULL OR l.label_type IS NOT NULL)
GROUP BY 1
ORDER BY 2 DESC
WITH tx AS (
SELECT DISTINCT tx_id
FROM solana.core.fact_events e
JOIN solana.core.dim_labels l
ON l.address = e.program_id
AND l.label_subtype = 'bridge'
WHERE e.block_timestamp >= CURRENT_DATE - 90
)
SELECT tx_to
, COUNT(1) AS n_bridge
, SUM(CASE WHEN mint = 'So11111111111111111111111111111111111111112' THEN amount ELSE 0 END) AS sol_bridge_amt
FROM solana.core.fact_transfers t
LEFT JOIN tx ON tx.tx_id = t.tx_id
LEFT JOIN solana.core.dim_labels l
ON l.address = t.tx_from
AND (l.label_type = 'cex' OR l.label_subtype = 'bridge' )
WHERE t.block_timestamp >= CURRENT_DATE - 90
AND (tx.tx_id IS NOT NULL OR l.label_type IS NOT NULL)
GROUP BY 1
ORDER BY 3 DESC
SELECT *
FROM solana.core.dim_labels
WHERE label_type = 'nft'
AND label_subtype = 'nf_token_contract'
LIMIT 100
SELECT *
FROM solana.core.fact_nft_sales s
JOIN solana.core.fact_transactions t
ON t.tx_id = s.tx_id
LEFT JOIN solana.core.dim_labels l
ON l.address = s.mint
WHERE s.block_timestamp >= CURRENT_DATE - 1
AND t.block_timestamp >= CURRENT_DATE - 1
AND l.label IS NULL
ORDER BY s.sales_amount DESC
LIMIT 100
SELECT *
FROM solana.core.fact_nft_sales s
JOIN solana.core.fact_transactions t
ON t.tx_id = s.tx_id
LEFT JOIN solana.core.dim_labels l
ON l.address = s.mint
WHERE s.block_timestamp >= CURRENT_DATE - 1
AND t.block_timestamp >= CURRENT_DATE - 1
AND l.label IS NULL
ORDER BY s.sales_amount DESC
LIMIT 100
SELECT *
FROM solana.core.fact_nft_sales s
WHERE s.block_timestamp >= '2022-11-30'
AND s.block_timestamp <= '2022-12-01'
ORDER BY s.sales_amount DESC
LIMIT 100
SELECT g.total_score
, s.result_url
, *
FROM bi_analytics.bronze.hevo_grades g
JOIN bi_analytics.bronze.hevo_submissions s ON s.id = g.submission_id
JOIN bi_analytics.bronze.hevo_claims c ON c.id = s.claim_id
JOIN bi_analytics.bronze.hevo_bounties b ON b.id = c.bounty_id
-- JOIN bi_analytics.bronze.hevo_campaigns ca ON ca.id = b.campaign_id
WHERE b.created_at >= '2022-10-01'
AND intended_payment_currency = 'RUNE'
ORDER BY b.created_at DESC, g.total_score DESC
SELECT s.*
FROM solana.core.fact_nft_sales s
LEFT JOIN solana.core.dim_labels l
ON l.address = s.mint
WHERE s.block_timestamp >= '2022-08-01'
AND l.address IS NULL
AND sales_amount < 1000
ORDER BY COALESCE(sales_amount, 0) DESC
LIMIT 100
SELECT ca.title
, ca.project_name
, ca.end_date::date AS date
, g.total_score
, *
FROM bi_analytics.bronze.hevo_grades g
JOIN bi_analytics.bronze.hevo_submissions s ON s.id = g.submission_id
JOIN bi_analytics.bronze.hevo_claims c ON c.id = s.claim_id
JOIN bi_analytics.bronze.hevo_bounties b ON b.id = c.bounty_id
-- JOIN bi_analytics.bronze.hevo_campaigns ca ON ca.id = b.campaign_id
WHERE ca.project_name ILIKE '%THOR%'
AND ca.end_date >= '2022-10-01'
ORDER BY ca.end_date, ca.title, g.total_score DESC
SELECT *
FROM bi_analytics.bronze.hevo_bounty_collections
LIMIT 100
SELECT project_name
, COUNT(1) AS n
FROM bi_analytics.bronze.hevo_campaigns ca
GROUP BY 1
ORDER BY 2 DESC
SELECT *
FROM bi_analytics.bronze.hevo_campaigns ca
WHERE project_name = 'THORChain'
ORDER BY ca.end_date, ca.title DESC

View File

@ -1,351 +1,175 @@
function(input, output, session) {
plotly.style <- list(
fig_bgcolor = 'rgb(255, 255, 255)',
plot_bgcolor = 'rgba(0, 0, 0, 0)',
paper_bgcolor = 'rgba(0, 0, 0, 0)',
font = list(
color = '#FFF', family = 'Roboto Mono')
)
output$useraddy <- renderUI({
textInput("addy", "SOURCE ADDRESS:",
placeholder = "paste in an address or click random")
})
output$inputaddy <- renderUI({
url.addy <- parseQueryString(session$clientData$url_search)
if(length(url.addy) > 0) {
default.addy <- names(url.addy)[1]
userRecord <- reactive({
if(!is.null(input$addy)) {
if(nchar(input$addy) > 0) {
df[user_address == input$addy]
} else {
default.addy <- NA
empty.df
}
if(is.na(default.addy)) {
textInput(
inputId = 'addy'
, label = NULL
, width = '100%'
, placeholder = 'a Solana address'
)
} else {
textInput(
inputId = 'addy'
, label = NULL
, width = '100%'
, value = default.addy
)
empty.df
}
})
# observeEvent(input$address, {
# if(!is.null(input$address)) {
# if(substr(input$address, 1, 5) == 'terra') {
# updateTextInput(session, 'addy', value = input$address)
# }
# }
# })
observeEvent(input$addy, {
if(!is.null(input$address)) {
if(input$addy == input$address) {
updateActionButton(session = session, inputId = 'connect', label = 'Disconnect')
svgColored <- reactive({
new.svg <- svgdata
if(!is.null(input$addy)) {
if(nchar(input$addy) > 0) {
new.style <- c()
for(i in 1:7) {
tmp <- userRecord()[[categories[i]]]
new.style <- c(new.style, c(rep(1, tmp), rep(0, (3-tmp))))
}
for(i in 1:21) {
new.svg <- str_replace(string = new.svg, pattern = "%s", replacement = ifelse(new.style[i] == 1, "100%", "20%"))
}
} else {
updateActionButton(session = session, inputId = 'connect', label = 'Connect Wallet')
for(i in 1:21) {
new.svg <- str_replace(string = new.svg, pattern = "%s", replacement = base.style[i])
}
}
})
inRangeScores <- reactive(
df[ total_score >= input$scorethreshold[1] & total_score <= input$scorethreshold[2]]
)
inRangeMetricScores <- reactive(
df[ total_score >= input$scorethreshold[1] & total_score <= input$scorethreshold[2]]
# metric.score.data[`Total Score` >= input$scorethreshold[1] & `Total Score` <= input$scorethreshold[2]]
)
output$title_sentence <- renderText({
paste0('Rankings for ',
# format(n.scores, big.mark = ','),
' Solana addresses scored across 21 metrics in 7 categories.')
})
is.blank <- function(x, false.triggers=FALSE){
if(is.function(x)) return(FALSE) # Some of the tests below trigger
# warnings when used on functions
return(
is.null(x) || # Actually this line is unnecessary since
length(x) == 0 || # length(NULL) = 0, but I like to be clear
all(is.na(x)) ||
all(x=="") ||
(false.triggers && all(!x))
)
}
observeEvent(input$wallet_address, {
print('observeEvent input$wallet_address')
print(input$wallet_address)
})
output$your_address <- renderText({
val <- 'Wallet not connected'
print('output$your_address input$wallet_address')
print(input$wallet_address)
if (!is.blank(input$wallet_address)) {
val <- paste0('Your address is ', input$wallet_address)
}
paste0(val)
})
output$scoreplot <- renderPlotly({
plot.data <- df %>% group_by(total_score) %>% summarize( N=n() ) %>% as.data.table()
plot.data <- plot.data[ total_score >= input$scorethreshold[1] & total_score <= input$scorethreshold[2]]
plot.data[, color_group := ifelse(total_score >= input$scorethreshold[1] & total_score <= input$scorethreshold[2], 'in', 'out')]
fig <- plot_ly(
data = plot.data[total_score > 0]
, x = ~total_score
, y = ~N
, color = ~color_group
, type = 'bar'
, colors = c('#5494F8', '#dddddd')
)
# fig <- fig %>% add_annotations(
# x=28,
# y=80000,
# xref = 'x',
# yref = 'y',
# text = paste0(format(nrow(df), big.mark=',', scientific=FALSE), ' <br>addresses selected'),
# xanchor = 'right',
# showarrow = F,
# font = list(size = 20, color = '#5494F8', family = 'Roboto Mono')
# )
fig <- fig %>% layout(
xaxis = list(
title = ''
, showgrid = FALSE
, fixedrange = TRUE
, color = '#C4CDD5'
)
, yaxis = list(
title = ''
, showticklabels = TRUE
, showgrid = TRUE
, fixedrange = TRUE
, gridwidth = 0.5
, color = '#C4CDD5'
, gridcolor = '#202933'
)
, showlegend = FALSE
, plot_bgcolor = plotly.style$plot_bgcolor
, paper_bgcolor = plotly.style$paper_bgcolor
) %>%
plotly::config(displayModeBar = FALSE) %>%
plotly::config(modeBarButtonsToRemove = c('zoomIn2d', 'zoomOut2d'))
fig
})
# lapply(unique(score_criteria$category), function(tmp.category) {
# cat.name.fix <- tolower(gsub(x = tmp.category, pattern = ' ', '_', fixed = TRUE))
# output[[cat.name.fix]] <- renderText({
# if(is.null(input$addy) | input$addy == '') {
# paste0('avg score: ', sprintf('%.1f', round(mean(inRangeScores()[[tmp.category]]), 1)))
# } else {
# paste0('score: ',
# scores[address == input$addy][[tmp.category]],
# ' (avg ',
# sprintf('%.1f', round(mean(inRangeScores()[[tmp.category]]), 1)),
# ')')
# }
# })
# })
lapply(score_criteria$metric_name, function(metric) {
output[[metric]] <- renderText({
paste0(format(sum(inRangeMetricScores()[[metric]] > 0), big.mark=',', scientific=FALSE), ' addresses')
})
})
# now change the colors of the score boxes:
observeEvent(input$addy, {
lapply(score_criteria$metric_name, function(tmp.metric) {
# change.class <- metric.score.data[address == input$addy][[tmp.metric]] > 0
change.class <- df[user_address == input$addy][[tmp.metric]] > 0
if(length(change.class) == 0) change.class <- FALSE
toggleClass(id = paste0(tmp.metric, '_div'),
class = 'bright',
condition = change.class)
toggleClass(id = paste0(tmp.metric, '_c'),
class = 'showey',
condition = change.class)
})
})
output$user_score <- renderText({
if(!length(input$addy)) {
paste0(0, '/42')
} else {
cur <- df[ (user_address == input$addy) ]
score <- ifelse(nrow(cur) > 0, cur$total_score[1], 0)
paste0(score, '/42')
for(i in 1:21) {
new.svg <- str_replace(string = new.svg, pattern = "%s", replacement = base.style[i])
}
}
new.svg
}
)
output$svgout <- renderUI({
HTML(svgColored())
})
observeEvent(input$randomaddy, {
updateTextInput(session, "addy", value = sample(df$user_address, 1))
}, suspended = F)
output$vs_mean <- renderText({paste0('vs. Mean Score of ', round(mean(inRangeScores()[['total_score']]), 1))})
getTableData <- reactive(inRangeScores()[order(-total_score)][1:500])
output$cat_scores_table <- renderReactable({
reactable(
getTableData()[, list(
address = paste0(substr(user_address, 1, 12), '...')
, score = total_score
, longevity = longevity
, activity = activity
, governor = governor
, bridgor = bridgor
, staker = staker
, explorer = explorer
)]
, onClick = 'select'
, selection = 'single'
, rowStyle = JS(
"function(rowInfo) {
if (rowInfo && rowInfo.selected) {
return { backgroundColor: '#172852' }
}
}"
), defaultColDef = colDef( headerStyle = list(background = '#10151A') )
, borderless = TRUE
, outlined = FALSE
, columns = list(
address = colDef(name = 'Address', minWidth = 165, align = 'left'),
score = colDef(name = 'Score', align = 'right'),
longevity = colDef(name = 'longevity', align = 'right'),
activity = colDef(name = 'activity.', align = 'right'),
governor = colDef(name = 'governor.', align = 'right'),
bridgor = colDef(name = 'bridgor', align = 'right'),
staker = colDef(name = 'staker', align = 'right'),
explorer = colDef(name = 'explorer', align = 'right')
)
output$outputslider <- renderUI({
sliderTextInput(
inputId = "scoreslider",
label = NULL,
choices = 1:21,
selected = c(5, 15),
grid = TRUE,
width = "100%"
)
})
#observing the row selected in the table
# to change the input address
tableSelected <- reactive(getReactableState('cat_scores_table', 'selected', session))
output$scorehist <- renderPlotly({
output$selected <- renderPrint({
print(getTableData()[tableSelected()]$address)
})
observeEvent(tableSelected(), {
new.addy <- getTableData()[tableSelected()]$address
if(length(new.addy) == 1) {
updateTextInput(session, 'addy', value = new.addy)
if(length(input$scoreslider) > 0) {
active.scores <- input$scoreslider[1]:input$scoreslider[2]
} else {
active.scores <- 5:15
}
to.plot <- rbind(
data.table(total_score = 1:5, N = 0),
df[, .N, by = total_score][order(total_score)],
data.table(total_score = 19:21, N = 0)
)
to.plot[, bar_color := ifelse(total_score %in% active.scores, bar.plot.colors[1], bar.plot.colors[2])]
plot_ly(to.plot,
x = ~total_score, y = ~N, type = 'bar',
marker = list(color = to.plot$bar_color)) %>%
layout(bargap = 0.2,
xaxis = list(title = "",
showticklabels = FALSE,
showgrid = FALSE,
fixedrange = TRUE),
yaxis = list(title = "",
showticklabels = FALSE,
showgrid = FALSE,
fixedrange = TRUE,
type = "log"),
showlegend = FALSE,
margin = list(l=6, r=6, b=0, t=0, autoexpand = FALSE),
plot_bgcolor = "transparent",
paper_bgcolor = "transparent") %>%
config(displayModeBar = FALSE,
showLink = FALSE)
})
output$bdnldscores <- renderUI({
tmp.label <- paste("Get Scores for ",
format(nrow(df[total_score >= input$scoreslider[1] & total_score <= input$scoreslider[2]]), big.mark = ","),
" Users")
downloadButton(outputId = 'download_scores_metrics',
label = tmp.label,
icon = NULL)
observeEvent(input$clearaddy, {
updateTextInput(session, 'addy', value = '')
})
output$download_scores_metrics <- downloadHandler(
filename = function() {
paste('scores_', input$scorethreshold[1], '_to_', input$scorethreshold[2], '_', Sys.Date(), '.csv', sep='')
paste('scores_', input$scoreslider[1], '_to_', input$scoreslider[2], '_', Sys.Date(), '.csv', sep='')
},
content = function(file) {
to.download <- merge(inRangeScores(), inRangeMetricScores(), by = c('address', 'Total Score'))
to.download <- df[total_score >= input$scoreslider[1] & total_score <= input$scoreslider[2]]
write.csv(to.download, file)
}
)
addTooltip(session, id = 'net_from_shuttle_cex',
title = paste0(
'Received more from Bridges or CEXs than sent (or 0 sent) in the last 90 days', '<hr>',
'Difficulty: Easier', '<br>',
'Points Value: 1', '<hr>',
'Data Metric Name: net_from_shuttle_cex'),
placement = 'bottom', trigger = 'hover',
options = NULL)
# table with links to queries:
output$metric_defs <- renderReactable({
reactable(score_criteria[, list(score_name, metric_name, points, score_description, velocity_query)],
defaultColDef = colDef(
#align = 'center',
headerStyle = list(background = '#10151A')
),
defaultPageSize = 15,
pagination = FALSE,
borderless = TRUE,
outlined = FALSE,
#maxWidth = 100,
columns = list(
score_name = colDef(name = 'Score Name', maxWidth = 150, align = 'left'),
metric_name = colDef(name = 'Metric Name', align = 'left'),
points = colDef(name = 'Points', maxWidth = 75, align = 'right'),
score_description = colDef(name = 'Score Description', align = 'left'),
velocity_query = colDef(name = 'Query', maxWidth = 75, align = 'left', cell = function(velocity_query) {
# Render as a link
url <- sprintf(paste0(velocity_query))
htmltools::tags$a(href = url, target = '_blank', 'link', onclick = "mixpanel.track('ae-click-velocity-link')")
}))
)
output$userscore <- renderText({
userRecord()$total_score
})
output$make_toggle_button <- renderUI({
actionButton(
inputId = 'toggle_button',
label = 'Show Table')
output$useractivity <- renderText({
round(userRecord()[["activity_value"]])
})
output$usernfts <- renderText({
round(userRecord()[["nft_value"]])
})
output$userlongevity <- renderText({
round(userRecord()[["longevity_value"]])
})
output$uservariety <- renderText({
round(userRecord()[["variety_value"]])
})
output$userstaking <- renderText({
round(userRecord()[["staking_value"]])
})
output$userbridge <- renderText({
round(userRecord()[["bridge_value"]])
})
output$usergovernance <- renderText({
round(userRecord()[["governance_value"]])
})
observeEvent(input$toggle_button, {
toggleElement(
id = 'metric_defs'
)
if(input$toggle_button[1] %% 2 == 0) {
# change to collapse
updateActionButton(inputId = 'toggle_button', label = 'Hide Table')
} else {
# change to expand
updateActionButton(inputId = 'toggle_button', label = 'Show Table')
}
})
output$download_all_data <- downloadHandler(
filename <- function() {
#'all_data.csv'
ifelse(Sys.info()[['user']] == 'rstudio-connect',
'/rstudio-data/lunatics_all_data.csv',
'all_data.csv')
},
content <- function(file) {
file.copy('all_data.csv', file)
},
contentType = 'csv'
)
}

View File

@ -1,355 +1,164 @@
# SolarScored leaderboard
# #useraddy .form-group {
# display: table-row;
# }
#
# #addy-label {
# padding-right: 30px;
# }
fluidPage(
title = 'SolarScored',
tags$head(
tags$link(rel = 'stylesheet', type = 'text/css', href = 'shiny.css'),
tags$link(rel = 'stylesheet', href = 'https://fonts.googleapis.com/css?family=Roboto+Mono'),
tags$link(rel = 'stylesheet', href = 'https://fonts.googleapis.com/css?family=Inter')
tags$link(rel = "stylesheet", type = "text/css", href = "shiny.css"),
tags$link(rel = "stylesheet", href = "https://fonts.googleapis.com/css?family=Orbitron"),
tags$link(rel = "stylesheet", href = "https://fonts.googleapis.com/css?family=Exo+2"),
tags$link(rel = "stylesheet", href = "https://fonts.googleapis.com/css?family=Roboto+Mono"),
tags$link(rel = "icon", href = "flipside.svg")
),
tags$style(
type='text/css',
'.shiny-output-error { visibility: hidden; size: 0.1em}',
'.shiny-output-error:before { visibility: hidden; size: 0.1em}'
),
# LINK to mixpanel
tags$head(tags$script(src = 'mixpanel.js')),
# SUPPRESS loading warnings/errors
withTags({
header(
class='top-banner',
section(
a(
class='fs-logo'
, href='https://www.flipsidecrypto.com'
, img(src = 'newlogo.svg')
, onclick = "mixpanel.track('lts-click-logo-icon')"
)
, section(
class='socials'
, a(class='twitter', target = '_blank', href='https://twitter.com/flipsidecrypto', 'Twitter', onclick = "mixpanel.track('lst-click-twitter-icon')")
, a(class='linkedin', target = '_blank', href='https://www.linkedin.com/company/flipside-crypto', 'LinkedIn', onclick = "mixpanel.track('lts-click-linkedin-icon')")
, a(class='discord', target = '_blank', href='https://flipsidecrypto.com/discord', 'Discord', onclick = "mixpanel.track('lts-click-discord-icon')")
, a(href='https://app.flipsidecrypto.com/auth/signup/velocity', target = '_blank', 'Sign Up', onclick = "mixpanel.track('lts-click-signup-icon')")
)
)
)
}),
useShinyjs(),
br(),
fluidRow(class = 'description', textOutput('your_address')),
solAttestR::SolWalletHandler("wallet_address"),
fluidRow(class = 'titles', 'SolarScored Rankings'),
fluidRow(class = 'description', 'Version 0.1 of Creating an LTV metric on Solana. Can be used to quantify user value and behavior for the Foundation or projects looking to airdrop or target users.'),
br(),
fluidRow(class = 'description', textOutput('title_sentence')),
br(),
fluidRow(
class = 'wrapper',
column(
5,
fluidRow(class = 'choose', 'Select a score range (0 to 42) to subset addresses'),
fluidRow(
div(
style = 'margin: auto; width: 90%;'
, sliderInput(inputId = 'scorethreshold', label = NULL, min = 1, max = 42, value = c(1, 42), width = '100%')
)
)
, fluidRow(
a(
downloadButton(
'download_scores_metrics'
, label = 'Download Scores & Metrics'
, icon = icon('arrow-down')
, onclick = "mixpanel.track('lts-download-scores')")
)
)
)
, column(
7
, plotlyOutput('scoreplot', height = '200px')
)
), # close wrapper
br(),
chooseSliderSkin("Round"),
fluidRow(
class = 'wrapper'
, fluidRow(
column(
7
, div(class = 'toppad', 'Enter an Address or pick one from the Leaderboard')
, uiOutput('inputaddy')
, column(
5
, div(class = 'userscore', 'Score'
, br()
, textOutput('user_score')
, textOutput('vs_mean'))
)
)
)
, br()
, 'Leaderboard Summary'
, fluidRow(
class = 'doesscroll'
, tags$table(
tags$tr(
tags$th(
'LONGEVITY'
, div(class = 'catscore', uiOutput('activity'))
)
, tags$th(
'ACTIVITY'
, div(class = 'catscore', uiOutput('governance'))
)
, tags$th(
'GOVERNANCE'
, div(class = 'catscore', uiOutput('degeneracy'))
)
, tags$th(
'BRIDGING'
, div(class = 'catscore', uiOutput('cash_out_vs_hodl'))
)
, tags$th(
'STAKING'
, div(class = 'catscore', uiOutput('airdrops'))
)
, tags$th(
'EXPLORING'
, div(class = 'catscore', uiOutput('explorer'))
)
, tags$th(
'NFTS'
, div(class = 'catscore', uiOutput('nfts'))
)
fluidRow(class = "titlerow",
column(9, class = "title", img(src = "solarscored-logo.svg", width = '480px')),
column(3,
div(id = "icons",
div(class = "aboutlinks",
a(id = 'fork',
href = "https://github.com/FlipsideCrypto/user_metrics/tree/main/apps/solana/solarscored",
img(src = "github.svg", width = "30px"),
target = "_blank")),
bsTooltip(id = "fork",
title = "Fork this App",
placement = "bottom", trigger = "hover"),
div(class = "aboutlinks",
a(id = "flippy",
href = "https://next.flipsidecrypto.xyz/",
img(src = "flipside.svg", width = "30px"),
target = "_blank")),
bsTooltip(id = "flippy",
title = "Get the Data",
placement = "bottom", trigger = "hover"),
div(class = "aboutlinks",
a(id = "solana", href = "https://solana.com",
img(src = "solana.svg", width = "30px"),
target = "_blank")),
bsTooltip(id = "solana",
title = "Solana",
placement = "bottom", trigger = "hover")
))),
fluidRow(class = "appbody",
fluidRow(class = "dashmid",
column(7,
div(class = "addybuttons",
uiOutput("useraddy"),
actionButton(inputId = "randomaddy", label = img(src = "random.svg", height = "26")),
),
tags$tr(
tags$td(
id = 'longevity_1_div'
, div(
class='outerDiv'
, div(class = 'leftDiv', 'Newbie')
, div(class = 'rightDiv', div(class='hidey', id = 'longevity_1_c', img(src = 'badge_1.svg', width = '20px', height = '20px')))
)
, br()
, div(class='small-text', textOutput('longevity_1'))
)
, tags$td(
id = 'activity_1_div'
, div(
class='outerDiv'
, div(
class = 'leftDiv'
, 'Occasional'
)
, div(class = 'rightDiv', div(class='hidey', id = 'activity_1_c', img(src = 'badge_1.svg', width = '20px', height = '20px')))
)
, br()
, div(class='small-text', textOutput('activity_1'))
)
, tags$td(
id = 'governor_1_div'
, div(
class='outerDiv'
, div(class = 'leftDiv', 'Gov Degen')
, div(class = 'rightDiv', div(class='hidey', id = 'governor_1_c', img(src = 'badge_1.svg', width = '20px', height = '20px')))
)
, br()
, div(class='small-text', textOutput('governor_1'))
div(id = "wheelpart",
uiOutput("svgout") %>%
withSpinner(hide.ui = FALSE, color = "#9945FF", size = 2)),
a(id = "pic",
capture::capture(
selector = "svg",
filename = "mysolarscore.png",
options = list(bgcolor = "#FFF"),
#scale = 2,
img(src = "camera.svg", height = "20"),
title = "Download the Circle")),
bsTooltip(id = "pic",
title = "Download the Wheel",
placement = "top", trigger = "hover"),
),
tags$td(id = 'bridgor_1_div',
div(class='outerDiv',
div(class = 'leftDiv', 'Bridgor'),
div(class = 'rightDiv', div(class='hidey', id = 'bridgor_1_c', img(src = 'badge_1.svg', width = '20px', height = '20px')))),
br(),
div(class='small-text', textOutput('bridgor_1'))),
tags$td(id = 'staker_1_div',
div(class='outerDiv',
div(class = 'leftDiv', 'Stakor'),
div(class = 'rightDiv', div(class='hidey', id = 'staker_1_c', img(src = 'badge_1.svg', width = '20px', height = '20px')))),
br(),
div(class='small-text', textOutput('staker_1'))),
tags$td(id = 'explorer_1_div',
div(class='outerDiv',
div(class = 'leftDiv', 'Exploror'),
div(class = 'rightDiv', div(class='hidey', id = 'explorer_1_c', img(src = 'badge_1.svg', width = '20px', height = '20px')))),
br(),
div(class='small-text', textOutput('explorer_1'))),
tags$td(id = 'nfts_1_div',
div(class='outerDiv',
div(class = 'leftDiv', 'I dabble'),
div(class = 'rightDiv', div(class='hidey', id = 'nfts_1_c', img(src = 'badge_1.svg', width = '20px', height = '20px')))),
br(),
div(class='small-text', textOutput('nfts_1')))
column(5,
div(id = "leftbox",
div(class = "boxtitle", "Address Metrics"),
div(id = "totalscore",
div(class = "score", textOutput("userscore")),
div(class = "yourscore", "SolarScore")),
bsTooltip(id = "totalscore",
title = "Your total score out of a possible 21 points, up to 3 for each of the 7 categories.",
placement = "top", trigger = "hover"),
fluidRow(class = "metricrow",
div(class = "metricholder", id = "boxuseractivity",
div(class = "metric", textOutput("useractivity")),
div(class = "metricname", "Activity"),
bsTooltip(id = "boxuseractivity",
title = "# transactions in the last 90 days.",
placement = "top", trigger = "hover")),
div(class = "metricholder", id = "boxusernfts",
div(class = "metric", textOutput("usernfts")),
div(class = "metricname", "NFTs"),
bsTooltip(id = "boxusernfts",
title = "90 day buy + mint volume (SOL)",
placement = "top", trigger = "hover")),
div(class = "metricholder", id = "boxusergovernance",
div(class = "metric", textOutput("usergovernance")),
div(class = "metricname", "Gov"),
bsTooltip(id = "boxusergovernance",
title = "# governance votes in the last 90 days",
placement = "top", trigger = "hover")),
div(class = "metricholder", id = "boxuservariety",
div(class = "metric", textOutput("uservariety")),
div(class = "metricname", "Variety"),
bsTooltip(id = "boxuservariety",
title = "# programs interacted with in the last 90 days",
placement = "top", trigger = "hover"))
),
tags$tr(
tags$td(
id = 'longevity_2_div'
, div(
class='outerDiv'
, div(class = 'leftDiv', 'Experienced')
, div(class = 'rightDiv', div(class='hidey', id = 'longevity_2_c', img(src = 'badge_2.svg', width = '20px', height = '20px')))
)
, br()
, div(class='small-text', textOutput('longevity_2'))
)
, tags$td(
id = 'activity_2_div'
, div(
class='outerDiv'
, div(
class = 'leftDiv'
, 'Active'
)
, div(class = 'rightDiv', div(class='hidey', id = 'activity_2_c', img(src = 'badge_2.svg', width = '20px', height = '20px')))
)
, br()
, div(class='small-text', textOutput('activity_2'))
)
, tags$td(
id = 'governor_2_div'
, div(
class='outerDiv'
, div(class = 'leftDiv', 'Solana Activist')
, div(class = 'rightDiv', div(class='hidey', id = 'governor_2_c', img(src = 'badge_2.svg', width = '20px', height = '20px')))
)
, br()
, div(class='small-text', textOutput('governor_2'))
fluidRow(class = "metricrow",
div(class = "metricholder2", id = "boxuserstaking",
div(class = "metric", textOutput("userstaking")),
div(class = "metricname", "Staking"),
bsTooltip(id = "boxuserstaking",
title = "SOL currently staked",
placement = "top", trigger = "hover")),
div(class = "metricholder2", id = "boxuserlongevity",
div(class = "metric", textOutput("userlongevity")),
div(class = "metricname", "Longevity"),
bsTooltip(id = "boxuserlongevity",
title = "# calendar months with a transaction in the last 90 days",
placement = "top", trigger = "hover")),
div(class = "metricholder2", id = "boxuserbridge",
div(class = "metric", textOutput("userbridge")),
div(class = "metricname", "Bridging"),
bsTooltip(id = "boxuserbridge",
title = "# times funds bridged onto Solana in the last 90 days",
placement = "top", trigger = "hover"))
),
tags$td(id = 'bridgor_2_div',
div(class='outerDiv',
div(class = 'leftDiv', 'Bridgooor'),
div(class = 'rightDiv', div(class='hidey', id = 'bridgor_2_c', img(src = 'badge_2.svg', width = '20px', height = '20px')))),
br(),
div(class='small-text', textOutput('bridgor_2'))),
tags$td(id = 'staker_2_div',
div(class='outerDiv',
div(class = 'leftDiv', 'Stakooor'),
div(class = 'rightDiv', div(class='hidey', id = 'staker_2_c', img(src = 'badge_2.svg', width = '20px', height = '20px')))),
br(),
div(class='small-text', textOutput('staker_2'))),
tags$td(id = 'explorer_2_div',
div(class='outerDiv',
div(class = 'leftDiv', 'Explorooor'),
div(class = 'rightDiv', div(class='hidey', id = 'explorer_2_c', img(src = 'badge_2.svg', width = '20px', height = '20px')))),
br(),
div(class='small-text', textOutput('explorer_2'))),
tags$td(id = 'nfts_2_div',
div(class='outerDiv',
div(class = 'leftDiv', 'NFT Enjoyooor'),
div(class = 'rightDiv', div(class='hidey', id = 'nfts_2_c', img(src = 'badge_2.svg', width = '20px', height = '20px')))),
br(),
div(class='small-text', textOutput('nfts_2')))
div(id = "hovernote", "Hover over Metric for Details"),
),
tags$tr(
tags$td(
id = 'longevity_3_div'
, div(
class='outerDiv'
, div(class = 'leftDiv', 'Grizzled Veteran')
, div(class = 'rightDiv', div(class='hidey', id = 'longevity_3_c', img(src = 'badge_3.svg', width = '20px', height = '20px')))
)
, br()
, div(class='small-text', textOutput('longevity_3'))
)
, tags$td(
id = 'activity_3_div'
, div(
class='outerDiv'
, div(
class = 'leftDiv'
, 'Unhinged'
)
, div(class = 'rightDiv', div(class='hidey', id = 'activity_3_c', img(src = 'badge_3.svg', width = '20px', height = '20px')))
)
, br()
, div(class='small-text', textOutput('activity_3'))
)
, tags$td(
id = 'governor_3_div'
, div(
class='outerDiv'
, div(class = 'leftDiv', 'Rock the Vote')
, div(class = 'rightDiv', div(class='hidey', id = 'governor_3_c', img(src = 'badge_3.svg', width = '20px', height = '20px')))
)
, br()
, div(class='small-text', textOutput('governor_3'))
),
tags$td(id = 'bridgor_3_div',
div(class='outerDiv',
div(class = 'leftDiv', 'Bridgooooor'),
div(class = 'rightDiv', div(class='hidey', id = 'bridgor_3_c', img(src = 'badge_3.svg', width = '20px', height = '20px')))),
br(),
div(class='small-text', textOutput('bridgor_3'))),
tags$td(id = 'staker_3_div',
div(class='outerDiv',
div(class = 'leftDiv', 'Stakooooor'),
div(class = 'rightDiv', div(class='hidey', id = 'staker_3_c', img(src = 'badge_3.svg', width = '20px', height = '20px')))),
br(),
div(class='small-text', textOutput('staker_3'))),
tags$td(id = 'explorer_3_div',
div(class='outerDiv',
div(class = 'leftDiv', 'Explorooooor'),
div(class = 'rightDiv', div(class='hidey', id = 'explorer_3_c', img(src = 'badge_3.svg', width = '20px', height = '20px')))),
br(),
div(class='small-text', textOutput('explorer_3'))),
tags$td(id = 'nfts_3_div',
div(class='outerDiv',
div(class = 'leftDiv', 'NFT Whale'),
div(class = 'rightDiv', div(class='hidey', id = 'nfts_3_c', img(src = 'badge_3.svg', width = '20px', height = '20px')))),
br(),
div(class='small-text', textOutput('nfts_3')))
),
) # close table
) # close table row
), # close wrapper
lapply(score_criteria$metric_name, function(i) {
score.info <- score_criteria[metric_name == i]
tmp.title <- paste0(
score.info$score_description, '<hr>',
'Difficulty: ', c('Easier', 'Harder', 'Degen Only')[score.info$points], '<br>',
'Points Value: ', score.info$points, '<hr>',
'Data Metric Name: ', score.info$metric_name)
shinyBS::bsTooltip(id = i,
title = tmp.title)
}),
br(),
fluidRow(class = 'wrapper',
div(class = 'boldwhite', 'Leaderboard for Selected Addresses'), br(),
div(class = 'subtitle', 'Click a row to explore an address. Click a column to sort by that Category.'),
reactableOutput('cat_scores_table'), br(),
fluidRow(class = 'downloadrow', a(downloadButton('download_all_data',
label = 'Download Raw Data by Address (~175MB)', icon = icon('arrow-down'),
onclick = "mixpanel.track('lts-download-all')")))),
br(),br(),
fluidRow(class = 'wrapper',
div(class = 'boldwhite', 'More About this App'),
br(),
div(class = 'disclaimer', "This app was created to showcase 21 behaviors that we associate with positive contribution to the Solana ecosystem.
These are certainly not the only ways that an address can contribute to the ecosystem, so we encourage you to DYOR. We've made all of
our data available, ether through the download links above, or if you want to go deeper, we have linked to every query used to create
this leadearboard in the table below. Note that there are ~6M addresses in the full data file as it includes addresses that scored 0 but still
had enough activity to show up in the calculation of at least one metric. The data refreshes once every two hours."),
br(),
div(class = 'disclaimer', 'We love geeking out on methodology and data, so if you have questions or ideas please visit us on our
discord. Thanks for stopping by SolarScored!'),
br(),
div(class = 'subtitle', 'Metric Details + Query Links'),
reactableOutput('metric_defs')
),
br(), br(), br(), br()
) # close fluid page
div(id = "botrightbox",
div(class = "boxtitle", "Download All Scores"),
div(id = "indent", "Select Addresses by Score:"),
div(id = "sliderbox",
plotlyOutput("scorehist", height = "100px"),
uiOutput("outputslider"),
uiOutput("bdnldscores")))
) #close left column box
) # close dashmid
#fluidRow(class = "dashbottom", "this is the bottom!")
), #close appbody
br(), br(), br()
) # close app

File diff suppressed because it is too large Load Diff

View File

@ -39,76 +39,74 @@ library(odbc)
user <- Sys.info()[['user']]
isRstudio <- user == 'rstudio-connect'
switch(
isRstudio
, source("/home/data-science/data_science/util/util_functions.R")
, source("~/data_science/util/util_functions.R")
if(isRstudio) {
source("/home/data-science/data_science/util/util_functions.R")
} else {
source("~/data_science/util/util_functions.R")
}
long.act.query <- "
WITH months AS (SELECT
signers[0]::string AS user_address,
count(tx_id) AS n_txn,
DATE_TRUNC('month', block_timestamp) AS month
FROM solana.core.fact_transactions
WHERE
block_timestamp > current_date - 90
AND
user_address NOT IN (SELECT address FROM solana.core.dim_labels)
GROUP BY user_address, month
)
query <- "
SELECT signers[0]::string AS user_address
, COUNT(DISTINCT DATE_TRUNC('month', block_timestamp)) AS value
FROM solana.core.fact_transactions
GROUP BY 1
SELECT
user_address, sum(n_txn) AS activity_value, count(month) AS longevity_value
FROM months
GROUP BY user_address
"
longevity <- QuerySnowflake(query)
colnames(longevity)[2] <- 'value'
func <- function(x) {
if (x < 2) {return(0)}
if (x < 6) {return(1)}
if (x < 12) {return(2)}
sol.long.act <- QuerySnowflake(long.act.query)
long.func <- function(x) {
if (x < 1) {return(0)}
if (x < 2) {return(1)}
if (x < 3) {return(2)}
return(3)
}
longevity[, level := sapply(value, func) ]
longevity[, metric := 'n_months_active' ]
longevity <- longevity[, list(metric, user_address, value, level) ]
print(longevity %>% group_by(level) %>% summarize(n=n()) %>% as.data.table())
query <- "
SELECT signers[0]::string AS user_address
, COUNT(1) AS value
FROM solana.core.fact_transactions
WHERE block_timestamp >= CURRENT_DATE - 90
GROUP BY 1
"
activity <- QuerySnowflake(query)
colnames(activity)[2] <- 'value'
func <- function(x) {
if (x < 10) {return(0)}
if (x < 100) {return(1)}
if (x < 1000) {return(2)}
activity.func <- function(x) {
if (x < 5) {return(0)}
if (x < 10) {return(1)}
if (x < 20) {return(2)}
return(3)
}
activity[, level := sapply(value, func) ]
activity[, metric := 'n_user_tx' ]
activity <- activity[, list(metric, user_address, value, level) ]
print(activity %>% group_by(level) %>% summarize(n=n()) %>% as.data.table())
query <- "
sol.long.act[, longevity := sapply(longevity_value, long.func) ]
sol.long.act[, activity := sapply(activity_value, activity.func) ]
# GOVERNANCE
gov.query <- "
SELECT voter AS user_address
, COUNT(1) AS value
, COUNT(DISTINCT program_name) AS n_user_votes_programs
, COUNT(1) AS governance_value
--, COUNT(DISTINCT program_name) AS governance_value
FROM solana.core.fact_proposal_votes
GROUP BY 1
WHERE
block_timestamp > current_date - 180
AND
user_address NOT IN (SELECT address FROM solana.core.dim_labels)
GROUP BY user_address
ORDER BY 2 DESC
"
governor <- QuerySnowflake(query)
colnames(governor)[1] <- 'user_address'
colnames(governor)[2] <- 'value'
func <- function(x) {
if (x < 1) {return(0)}
if (x < 10) {return(1)}
if (x < 100) {return(2)}
sol.gov <- QuerySnowflake(gov.query)
gov.func <- function(x) {
if (x < 2) {return(1)}
if (x < 3) {return(2)}
return(3)
}
governor[, level := sapply(value, func) ]
governor[, metric := 'n_user_votes' ]
governor <- governor[, list(metric, user_address, value, level) ]
print(governor %>% group_by(level) %>% summarize(n=n()) %>% as.data.table())
sol.gov[, governance := sapply(governance_value, gov.func) ]
# Bridgor - How many times are they bridging assets onto Solana (from a bridge or CEX)?
query <- "
bridge.query <- "
WITH tx AS (
SELECT DISTINCT tx_id
FROM solana.core.fact_events e
@ -117,9 +115,8 @@ query <- "
AND l.label_subtype = 'bridge'
WHERE e.block_timestamp >= CURRENT_DATE - 90
)
SELECT tx_to AS user_address
, COUNT(1) AS n_bridge
, SUM(CASE WHEN mint = 'So11111111111111111111111111111111111111112' THEN amount ELSE 0 END) AS value
SELECT tx_to AS user_address, COUNT(1) AS bridge_value
--, SUM(CASE WHEN mint = 'So11111111111111111111111111111111111111112' THEN amount ELSE 0 END) AS value
FROM solana.core.fact_transfers t
LEFT JOIN tx ON tx.tx_id = t.tx_id
LEFT JOIN solana.core.dim_labels l
@ -127,235 +124,140 @@ query <- "
AND (l.label_type = 'cex' OR l.label_subtype = 'bridge' )
WHERE t.block_timestamp >= CURRENT_DATE - 90
AND (tx.tx_id IS NOT NULL OR l.label_type IS NOT NULL)
GROUP BY 1
ORDER BY 3 DESC
"
bridgor <- QuerySnowflake(query)
colnames(bridgor)[1] <- 'user_address'
colnames(bridgor)[3] <- 'value'
func <- function(x) {
AND user_address NOT IN (SELECT address FROM solana.core.dim_labels)
GROUP BY user_address"
sol.bridge <- QuerySnowflake(bridge.query)
bridge.func <- function(x) {
if (x < 1) {return(0)}
if (x < 100) {return(1)}
if (x < 1000) {return(2)}
if (x < 2) {return(1)}
if (x < 3) {return(2)}
return(3)
}
bridgor[, level := sapply(value, func) ]
bridgor[, metric := 'bridged_sol' ]
bridgor <- bridgor[, list(metric, user_address, value, level) ]
print( bridgor %>% group_by(level) %>% summarize(n=n()) %>% as.data.table() )
sol.bridge[, bridge := sapply(bridge_value, bridge.func) ]
# Staker - How much SOL have they staked?
query <- "
staking.query <- "
WITH b0 AS (
SELECT *
, ROW_NUMBER() OVER (PARTITION BY stake_authority ORDER BY block_timestamp DESC) AS rn
FROM solana.core.ez_staking_lp_actions
)
SELECT stake_authority AS user_address
, COALESCE(post_tx_staked_balance, 0) * POWER(10, -9) AS value
, COALESCE(post_tx_staked_balance, 0) * POWER(10, -9) AS staking_value
FROM b0
WHERE rn = 1
AND
user_address NOT IN (SELECT address FROM solana.core.dim_labels)
"
staker <- QuerySnowflake(query)
colnames(staker)[2] <- 'value'
staker <- staker[ !is.na(value) ]
func <- function(x) {
sol.staking <- QuerySnowflake(staking.query)
staking.func <- function(x) {
if (x < 1) {return(0)}
if (x < 100) {return(1)}
if (x < 1000) {return(2)}
if (x < 5) {return(1)}
if (x < 15) {return(2)}
return(3)
}
staker[, level := sapply(value, func) ]
staker[, metric := 'staked_sol' ]
staker <- staker[, list(metric, user_address, value, level) ]
print( staker %>% group_by(level) %>% summarize(n=n()) %>% as.data.table() )
sol.staking[, staking := sapply(staking_value, staking.func) ]
# explorer
query <- "
WITH signers AS (
SELECT tx_id
, signers[0]::string AS user_address
FROM solana.core.fact_transactions
WHERE block_timestamp >= CURRENT_DATE - 90
GROUP BY 1, 2
)
SELECT user_address
, COUNT(DISTINCT COALESCE(l.label, e.program_id)) AS value
FROM solana.core.fact_events e
JOIN signers s ON s.tx_id = e.tx_id
LEFT JOIN solana.core.dim_labels l
ON l.address = e.program_id
WHERE e.block_timestamp >= CURRENT_DATE - 90
GROUP BY 1
# variety
variety.query <- "
select
signers[0]::string AS user_address,
count(distinct(program_id)) AS variety_value
from SOLANA.CORE.FACT_EVENTS
where block_timestamp > current_date - 90
AND user_address NOT IN (SELECT address FROM solana.core.dim_labels)
group by user_address
"
explorer <- QuerySnowflake(query)
colnames(explorer)[2] <- 'value'
func <- function(x) {
sol.variety <- QuerySnowflake(variety.query)
summary(sol.variety$n_programs)
var.func <- function(x) {
if (x < 1) {return(0)}
if (x < 10) {return(1)}
if (x < 25) {return(2)}
if (x < 5) {return(1)}
if (x < 10) {return(2)}
return(3)
}
explorer[, level := sapply(value, func) ]
explorer[, metric := 'n_unique_programs' ]
explorer <- explorer[, list(metric, user_address, value, level) ]
print( explorer %>% group_by(level) %>% summarize(n=n()) %>% as.data.table() )
sol.variety[, variety := sapply(variety_value, var.func) ]
# nfts
query <- "
mints.query <- "
WITH buys AS (
SELECT purchaser AS user_address
, SUM(sales_amount) AS buy_volume
FROM solana.core.fact_nft_sales
WHERE block_timestamp >= CURRENT_DATE - 180
AND succeeded
GROUP BY 1
), sells AS (
SELECT seller AS user_address
, SUM(sales_amount) AS sell_volume
FROM solana.core.fact_nft_sales
WHERE block_timestamp >= CURRENT_DATE - 180
AND succeeded
GROUP BY 1
WHERE block_timestamp >= CURRENT_DATE - 90
AND
succeeded = TRUE
AND
user_address NOT IN (SELECT address FROM solana.core.dim_labels)
GROUP BY user_address
), mints AS (
SELECT purchaser AS user_address
, SUM(mint_price) AS mint_volume
FROM solana.core.fact_nft_mints
WHERE block_timestamp >= CURRENT_DATE - 180
WHERE block_timestamp >= CURRENT_DATE - 90
AND succeeded
AND mint_currency = 'So11111111111111111111111111111111111111111'
AND mint_price <= 15
AND user_address NOT IN (SELECT address FROM solana.core.dim_labels)
GROUP BY 1
)
SELECT COALESCE(b.user_address, s.user_address, m.user_address) AS user_address
, COALESCE(b.buy_volume, 0) + COALESCE(s.sell_volume, 0) + COALESCE(m.mint_volume, 0) AS nft_volume
SELECT COALESCE(b.user_address, m.user_address) AS user_address
, COALESCE(b.buy_volume, 0) + COALESCE(m.mint_volume, 0) AS nft_value
FROM buys b
FULL OUTER JOIN sells s
ON s.user_address = b.user_address
--FULL OUTER JOIN sells s
-- ON s.user_address = b.user_address
FULL OUTER JOIN mints m
ON m.user_address = COALESCE(b.user_address, s.user_address)
ON m.user_address = b.user_address
"
mints <- QuerySnowflake(query)
colnames(mints)[2] <- 'value'
func <- function(x) {
sol.nfts <- QuerySnowflake(mints.query)
nfts.func <- function(x) {
if (x < 1) {return(0)}
if (x < 100) {return(1)}
if (x < 1000) {return(2)}
if (x < 5) {return(1)}
if (x < 10) {return(2)}
return(3)
}
mints[, level := sapply(value, func) ]
mints[, metric := 'nft_volume' ]
mints <- mints[, list(metric, user_address, value, level) ]
print( mints %>% group_by(level) %>% summarize(n=n()) %>% as.data.table() )
sol.nfts[, nfts := sapply(nft_value, nfts.func) ]
explorer[ user_address == '9VhsSZ6ni7dZtmKRHE81yAd3UQW1oKu9LNEWRGFMA5wj' ]
explorer[ user_address == 'AoNVE2rKCE2YNA44V7NQt8N73JdPM7b6acZ2vzSpyPyi' ]
head(explorer)
colnames(longevity)
colnames(activity)
colnames(governor)
colnames(bridgor)
colnames(staker)
colnames(explorer)
full.data <- MergeDataFrames(list(sol.long.act,
sol.variety,
sol.nfts,
sol.staking,
sol.gov,
sol.bridge),
by = "user_address", all = TRUE)
ReplaceValues(full.data)
full.data[, total_score := longevity + activity + governance + bridge + staking + variety + nfts ]
a <- longevity[level > 0, list(user_address, level)]
b <- activity[level > 0, list(user_address, level)]
c <- governor[level > 0, list(user_address, level)]
d <- bridgor[level > 0, list(user_address, level)]
e <- staker[level > 0, list(user_address, level)]
f <- explorer[level > 0, list(user_address, level)]
g <- mints[level > 0, list(user_address, level)]
colnames(a) <- c( 'user_address','longevity' )
colnames(b) <- c( 'user_address','activity' )
colnames(c) <- c( 'user_address','governor' )
colnames(d) <- c( 'user_address','bridgor' )
colnames(e) <- c( 'user_address','staker' )
colnames(f) <- c( 'user_address','explorer' )
colnames(g) <- c( 'user_address','nfts' )
#full.data[, .N, by = total_score][order(total_score)]
df_list <- list(a, b, c, d, e, f, g)
df <- Reduce(function(x, y) base::merge(x, y, all=TRUE), df_list) %>% as.data.table()
df[ is.na(df) ] <- 0
# get rid of some behavior that can't be human OR is too low to qualify
full.data <- full.data[total_score > 0]
# longevity
df[, longevity_1 := as.numeric(longevity >= 1) ]
df[, longevity_2 := as.numeric(longevity >= 2) ]
df[, longevity_3 := as.numeric(longevity >= 3) ]
# activity
df[, activity_1 := as.numeric(activity >= 1) ]
df[, activity_2 := as.numeric(activity >= 2) ]
df[, activity_3 := as.numeric(activity >= 3) ]
# governor
df[, governor_1 := as.numeric(governor >= 1) ]
df[, governor_2 := as.numeric(governor >= 2) ]
df[, governor_3 := as.numeric(governor >= 3) ]
# bridgor
df[, bridgor_1 := as.numeric(bridgor >= 1) ]
df[, bridgor_2 := as.numeric(bridgor >= 2) ]
df[, bridgor_3 := as.numeric(bridgor >= 3) ]
# staker
df[, staker_1 := as.numeric(staker >= 1) ]
df[, staker_2 := as.numeric(staker >= 2) ]
df[, staker_3 := as.numeric(staker >= 3) ]
# explorer
df[, explorer_1 := as.numeric(explorer >= 1) ]
df[, explorer_2 := as.numeric(explorer >= 2) ]
df[, explorer_3 := as.numeric(explorer >= 3) ]
# nfts
df[, nfts_1 := as.numeric(nfts >= 1) ]
df[, nfts_2 := as.numeric(nfts >= 2) ]
df[, nfts_3 := as.numeric(nfts >= 3) ]
# if you do avg more than 1 tx per hour over 90 days, you don't
# get a score bc you're not a person you're a computer
# save these addresses to remove them later
full.data <- full.data[activity_value < 24*90]
full.data <- full.data[bridge_value < 24*90]
df[, longevity := longevity_1 + (longevity_2 * 2) + (longevity_3 * 3) ]
df[, activity := activity_1 + (activity_2 * 2) + (activity_3 * 3) ]
df[, governor := governor_1 + (governor_2 * 2) + (governor_3 * 3) ]
df[, bridgor := bridgor_1 + (bridgor_2 * 2) + (bridgor_3 * 3) ]
df[, staker := staker_1 + (staker_2 * 2) + (staker_3 * 3) ]
df[, explorer := explorer_1 + (explorer_2 * 2) + (explorer_3 * 3) ]
df[, nfts := nfts_1 + (nfts_2 * 2) + (nfts_3 * 3) ]
df[, total_score := longevity + activity + governor + bridgor + staker + explorer + nfts ]
# sudo cp ~/score_criteria.csv /rstudio-data
# score_criteria <- read.csv('/Users/kellen/data_science/viz/solarscored/score_criteria.csv') %>% as.data.table()
score_criteria <- read.csv('/rstudio-data/score_criteria.csv') %>% as.data.table()
# head(df)
# df <- rbind(
# longevity
# , activity
# , governor
# , bridgor
# , staker
# , explorer
# )
# g <- df %>% group_by(user_address) %>% summarize(level=sum(level)) %>% as.data.table()
# g <- g[order(-level)]
# print( g %>% group_by(level) %>% summarize(n=n()) %>% as.data.table() )
# head(g)
# g[, metric := 'total_score' ]
# g$value <- g$level
# df <- rbind(df, g)
# df[ metric == 'total_score' ]
df <- full.data
file.location <- ifelse(
isRstudio
, '/rstudio-data/solarscored_data.RData'
, '/Users/kellen/data_science/viz/solarscored/solarscored_data.RData'
, '~/user_metrics/apps/solana/solarscored/solarscored_data.RData'
)
save(
df
, score_criteria
, file = file.location
)
save(df, file = file.location)
```

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 112 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 112 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 111 KiB

View File

@ -1 +0,0 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 122.92 121.4"><defs><style>.cls-1,.cls-2{fill:#648dc9;}.cls-2,.cls-3{fill-rule:evenodd;}.cls-3{fill:#fff;}</style></defs><path class="cls-1" d="M101.08,43c3.21-10.33,17.82-10.33,21,0h0a11,11,0,0,0,16.46,6h0c9.09-5.85,20.28,3.54,16.1,13.51h0a11,11,0,0,0,8.76,15.17h0c10.72,1.37,13.26,15.75,3.65,20.7h0a11,11,0,0,0-3,17.26h0c7.34,7.94,0,20.59-10.51,18.2h0a11,11,0,0,0-13.42,11.26h0c.52,10.8-13.21,15.8-19.76,7.19h0a11,11,0,0,0-17.52,0h0c-6.54,8.61-20.27,3.61-19.75-7.19h0a11,11,0,0,0-13.42-11.26h0c-10.54,2.39-17.85-10.26-10.51-18.2h0a11,11,0,0,0-3-17.26h0c-9.61-5-7.07-19.33,3.65-20.7h0a11,11,0,0,0,8.76-15.17h0c-4.18-10,7-19.36,16.1-13.51h0a11,11,0,0,0,16.46-6Z" transform="translate(-50.13 -35.27)"/><path class="cls-2" d="M111.59,51.13A46.38,46.38,0,1,0,158,97.51,46.09,46.09,0,0,0,111.59,51.13Z" transform="translate(-50.13 -35.27)"/><path class="cls-3" d="M105,117.38,87.08,99.49l6-5.3L105,106.12l26.5-25.84,6,5.3Z" transform="translate(-50.13 -35.27)"/></svg>

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 473 KiB

View File

@ -0,0 +1,114 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 27.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 1565.2 1494.2" style="enable-background:new 0 0 1565.2 1494.2;" xml:space="preserve">
<style type="text/css">
.st0{fill:url(#SVGID_1_);stroke:#FFFFFF;stroke-width:0.25;}
.st1{opacity:0.26;fill:url(#SVGID_00000138559630886264828450000018346780221833772930_);enable-background:new ;}
</style>
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="782.62" y1="642.006" x2="782.62" y2="1546.252" gradientTransform="matrix(1 0 0 -1 0 1546.252)">
<stop offset="0.34" style="stop-color:#EDFBF6"/>
<stop offset="0.65" style="stop-color:#F5FCFA"/>
<stop offset="0.86" style="stop-color:#FFFFFF"/>
</linearGradient>
<rect x="0.1" class="st0" width="1565" height="904.2"/>
<linearGradient id="SVGID_00000031177984062359259050000003454796823645966765_" gradientUnits="userSpaceOnUse" x1="782.61" y1="51.996" x2="782.61" y2="643.8459" gradientTransform="matrix(1 0 0 -1 0 1546.252)">
<stop offset="0.41" style="stop-color:#9945FF"/>
<stop offset="0.47" style="stop-color:#924DF9"/>
<stop offset="0.58" style="stop-color:#7F66EA"/>
<stop offset="0.72" style="stop-color:#608ED1"/>
<stop offset="0.88" style="stop-color:#36C4B0"/>
<stop offset="1" style="stop-color:#14F195"/>
</linearGradient>
<path style="opacity:0.26;fill:url(#SVGID_00000031177984062359259050000003454796823645966765_);enable-background:new ;" d="
M1564.6,1413.7c0-2.2,0-4.4,0-6.6l-79.3-66.9h79.1c0-1.6,0-3.2,0-4.8h-84.7l-148.8-125.6h133.2l100.2,66.2c0-2,0-3.9,0-5.9
l-91.2-60.2h91.2c0-1.6,0-3.2,0-4.8h-98.4l-114.1-75.3H1453l111.1,61.8c0-1.9,0-3.8,0-5.6l-100.9-56.2h96.8l4.2,2.1
c0-2.3,0-4.6,0-6.8h-2.8l-107-52.6h91.1l18.8,8.3c0-1.8,0-3.6,0-5.3l-6.8-3h6.8c0-1.6,0-3.2,0-4.8h-17.6l-78.3-34.7h79.1l16.9,6.6
c0-1.7,0-3.5,0-5.2l-3.5-1.4h3.5c0-1.6,0-3.2,0-4.8h-15.9l-64.9-25.1h80.9c0-1.7,0-3.4,0-5.1l-62.4-21.2h62.5c0-1.6,0-3.2,0-4.8
h-76.7l-49.4-16.8h72.8l53.2,14.2c0-1.7,0-3.3,0-5L1530,955h34.7c0-1.6,0-3.2,0-4.8h-52.6l-49.2-13.2h93.8l8,1.7
c0-2.2,0-4.3,0.1-6.5h-7.5l-51.7-10.8h59.2c0-1.6,0-3.2,0-4.8h-82.2l-45.9-9.6h128.2c0-1.6,0-3.2,0-4.8H0.1c0,1.6,0,3.2,0.1,4.8
h127.2l-45.9,9.6H0.3c0,1.6,0,3.2,0.1,4.8h58.1L6.8,932.3H0.5c0,2.1,0,4.1,0.1,6.2l6.9-1.4h93.8l-49.2,13.2H0.7c0,1.6,0,3.2,0,4.8
h33.5l-33.4,8.9c0,1.7,0,3.3,0,5l52-13.9h72.8l-49.4,16.8H0.9c0,1.6,0,3.2,0,4.8h61.3L1.1,997.3c0,1.9,0,3.7,0,5.6h79.6L15.8,1028
H1.2c0,1.6,0,3.2,0,4.8h2.1l-2.1,0.8c0,1.7,0,3.5,0,5.2l15.6-6H96l-78.3,34.7H1.4c0,1.6,0,3.2,0,4.8h5.4l-5.4,2.4c0,1.8,0,3.6,0,5.3
l17.4-7.7h91.1L3,1124.8H1.6c0,2,0,4.1,0,6.1l2.7-1.3h96.8l-99.4,55.3c0,1.9,0,3.8,0,5.6l109.5-60.9h101.5L98.5,1205H1.7
c0,1.6,0,3.2,0,4.8h89.6l-89.5,59.2c0,2,0,3.9,0,5.9l98.5-65.1h141.8L93.3,1335.4H1.7c0,1.6,0,3.2,0,4.8h85.9l-86.1,72.7
c0,2.2,0,4.4,0,6.6l93.9-79.3h151.1l-139.1,151.1l4.1,3.1l141.9-154.1H421l-92.5,151.4l4.6,2.3l93.9-153.7h176.2l-48.1,151.9
l5.1,1.3l48.6-153.2h174.8v152.6h5.3v-152.6h174l48.6,153.2l5.1-1.3l-48.1-151.9H1141l93.9,153.7l4.6-2.3l-92.5-151.4h168.1
l141.9,154.1l4.1-3.1l-139.1-151.1h155.4L1564.6,1413.7L1564.6,1413.7z M691.5,907.2h48.9l-3,9.6h-51.7L691.5,907.2L691.5,907.2z
M460.7,971.7L486,955H544l-19.8,16.8H460.7L460.7,971.7z M518.4,976.5l-25.5,21.5h-72.1l32.6-21.5H518.4z M451.7,971.7H395
l30.1-16.8h52L451.7,971.7L451.7,971.7z M384.9,971.7h-59.6l34-16.8H415L384.9,971.7z M376.3,976.5l-38.7,21.5h-65.8l43.8-21.5
H376.3L376.3,976.5z M386.4,976.5h58.1l-32.6,21.5h-64.2L386.4,976.5z M413.6,1002.8h73.7l-29.8,25.1h-81.9L413.6,1002.8
L413.6,1002.8z M459.6,1032.7h69.9l-31.9,34.7h-79.1L459.6,1032.7L459.6,1032.7z M465.3,1028l29.8-25.1h62l-23.1,25.1H465.3
L465.3,1028z M500.7,998.1l25.5-21.5h55l-19.8,21.5H500.7L500.7,998.1z M531.9,971.7l19.8-16.8h49.4l-15.4,16.8H531.9L531.9,971.7z
M557.4,950.2l15.6-13.2h44.6l-12.1,13.2H557.4L557.4,950.2z M549.6,950.2h-56.3l19.9-13.2h52L549.6,950.2L549.6,950.2z
M484.3,950.2h-50.6l23.6-13.2h46.9L484.3,950.2L484.3,950.2z M423.6,950.2H369l26.8-13.2h51.5L423.6,950.2z M358,950.2h-63.5
l29.7-13.2h60.5L358,950.2z M282.4,950.2H230l34-13.2h48.1L282.4,950.2z M283.7,955h64.6l-34,16.8h-68.4L283.7,955z M304.5,976.5
l-43.8,21.5h-74.3l48.6-21.5H304.5L304.5,976.5z M262.1,1002.8H329l-45.2,25.1H211L262.1,1002.8z M339.1,1002.8h65.5l-38,25.1H294
L339.1,1002.8L339.1,1002.8z M368.3,1032.7h83.5l-41.1,34.7h-94.9L368.3,1032.7L368.3,1032.7z M412.8,1072.2h80.3l-48.5,52.6h-94.2
L412.8,1072.2L412.8,1072.2z M500,1072.2h84.6l-32.2,52.6H451.6L500,1072.2L500,1072.2z M504.4,1067.4l31.9-34.7h72.3l-21.2,34.7
H504.4L504.4,1067.4z M540.8,1028l23.1-25.1H627l-15.3,25.1H540.8L540.8,1028z M568.3,998.1l19.8-21.5h54.9l-13.2,21.5H568.3z
M592.6,971.7L608,955h48.2L646,971.7H592.6z M612.4,950.2l12.1-13.2h42.7l-8,13.2H612.4z M628.9,932.3l9.9-10.8h37.9l-6.6,10.8
H628.9L628.9,932.3z M622,932.3h-43.4l12.8-10.8h40.5L622,932.3L622,932.3z M570.9,932.3h-50.4l16.3-10.8h46.9L570.9,932.3z
M511.5,932.3H466l19.4-10.8h42.5L511.5,932.3L511.5,932.3z M455.9,932.3h-50.3l21.9-10.8h47.8L455.9,932.3z M394.5,932.3H335
l24.3-10.8h57L394.5,932.3z M323,932.3h-46.6l27.8-10.8h43.1L323,932.3L323,932.3z M262.9,932.3h-55.2l31.7-10.8h51.3L262.9,932.3
L262.9,932.3z M192.7,932.3h-54.9l40.2-10.8h46.4L192.7,932.3z M193.6,937.1h56.9l-34,13.2h-61.8L193.6,937.1L193.6,937.1z
M217.7,955h53.9l-37.8,16.8h-59.4L217.7,955L217.7,955z M223,976.5l-48.6,21.5h-67.9l55.6-21.5H223L223,976.5z M175.6,1002.8H251
l-51.1,25.1h-81.1L175.6,1002.8L175.6,1002.8z M201.3,1032.7h74l-62.4,34.7h-82.1L201.3,1032.7z M285.4,1032.7h74l-52.5,34.7H223
L285.4,1032.7z M308.6,1072.2h96.5l-62.4,52.6H228.9L308.6,1072.2L308.6,1072.2z M344.8,1129.6h95.5l-69.4,75.3H255.5L344.8,1129.6
L344.8,1129.6z M447.2,1129.6h102.4l-46,75.3H377.8L447.2,1129.6z M555.6,1129.6h114.3L646,1205H509.6L555.6,1129.6L555.6,1129.6z
M558.5,1124.8l32.2-52.6h97.4l-16.7,52.6H558.5z M593.6,1067.4l21.2-34.7h85.8l-11,34.7H593.6L593.6,1067.4z M617.7,1028l15.3-25.1
h77l-8,25.1H617.7z M636,998.1l13.2-21.5h69.3l-6.8,21.5H636z M652,971.7l10.2-16.8h63l-5.3,16.8H652z M665.2,950.2l8-13.2h57.7
l-4.2,13.2H665.2z M676.2,932.3l6.6-10.8h53.1l-3.4,10.8H676.2L676.2,932.3z M685.4,907.2l-5.8,9.6h-36.4l8.8-9.6H685.4L685.4,907.2
z M645.1,907.2l-8.8,9.6h-39.3l11.3-9.6H645.1z M600.6,907.2l-11.3,9.6H544l14.5-9.6H600.6z M549.5,907.2l-14.5,9.6h-41.1l17.2-9.6
H549.5z M501,907.2l-17.2,9.6h-46.7l19.5-9.6H501z M445.5,907.2l-19.5,9.6h-56l21.6-9.6H445.5L445.5,907.2z M379.7,907.2l-21.6,9.6
h-41.5l24.7-9.6H379.7z M327.8,907.2l-24.7,9.6h-49.5l28.2-9.6H327.8z M266.7,907.2l-28.2,9.6h-42.6l23.8-6.4l-1.1-3.2H266.7
L266.7,907.2z M150.9,907.2h62l-35.8,9.6H105L150.9,907.2L150.9,907.2z M30.4,932.3l51.7-10.8h77.3l-40.2,10.8H30.4L30.4,932.3z
M70.7,950.2l49.2-13.2h58.7l-38.8,13.2H70.7L70.7,950.2z M140.7,955h63.5L161,971.7H91.3L140.7,955L140.7,955z M13.8,998.1
l63.5-21.5h71.4L93,998.1H13.8L13.8,998.1z M29.2,1028l64.9-25.1h69.5l-56.7,25.1H29.2L29.2,1028z M29.7,1067.4l78.3-34.7h82.1
l-70.5,34.7H29.7L29.7,1067.4z M109.7,1124.8H14l107-52.6h83.3L109.7,1124.8L109.7,1124.8z M119.8,1124.8l94.6-52.6h85.2l-79.7,52.6
H119.8L119.8,1124.8z M107.5,1205l114.1-75.3H337l-89.3,75.3H107.5L107.5,1205z M250.8,1335.3H101l148.8-125.6h116.6L250.8,1335.3
L250.8,1335.3z M423.9,1335.3H257.7l115.6-125.6h127.2L423.9,1335.3z M604.7,1335.3H430l76.7-125.6h137.9L604.7,1335.3z
M783.6,1335.3H610.3l39.8-125.6h133.5V1335.3z M783.6,1205h-132l23.9-75.3h108.1V1205z M783.6,1124.8H677l16.7-52.6h89.9
L783.6,1124.8L783.6,1124.8z M783.6,1067.4h-88.4l11-34.7h77.4V1067.4z M783.6,1028h-75.9l8-25.1h68L783.6,1028L783.6,1028z
M783.6,998.1h-66.4l6.8-21.5h59.6L783.6,998.1L783.6,998.1z M783.6,971.7h-58.1l5.3-16.8h52.8V971.7z M783.6,950.2h-51.3l4.2-13.2
h47.1V950.2z M783.6,932.3H738l3.4-10.8h42.2L783.6,932.3L783.6,932.3z M783.6,916.7h-40.7l3-9.6h37.6L783.6,916.7L783.6,916.7z
M1456.7,1205h-131.6l-89.3-75.3h106.8L1456.7,1205z M1150.6,1002.8l38,25.1h-73.3l-29.8-25.1H1150.6L1150.6,1002.8z M1079.9,998.1
l-25.5-21.5h56.4l32.6,21.5H1079.9z M1119.8,976.5h58.1l38.7,21.5h-64.2L1119.8,976.5z M1187.9,976.5h60.8l43.8,21.5h-65.8
L1187.9,976.5L1187.9,976.5z M1179.3,971.8l-30.1-16.8h55.7l34,16.8H1179.3z M1169.2,971.8h-56.7l-25.4-16.8h51.9L1169.2,971.8
L1169.2,971.8z M1103.5,971.8h-54.8l-19.8-16.8h49.3L1103.5,971.8z M1041,971.8h-58.1L967.4,955h53.7L1041,971.8z M1046.6,976.5
l25.5,21.5h-65.1l-19.8-21.5H1046.6z M1077.8,1002.8l29.8,25.1h-73l-23.1-25.1H1077.8L1077.8,1002.8z M1113.3,1032.7l41.1,34.7
h-83.4l-31.9-34.7H1113.3z M1121,1032.7h74.9l52.5,34.7h-86.3L1121,1032.7z M1159.6,1002.8h65.5l45.2,25.1h-72.6L1159.6,1002.8
L1159.6,1002.8z M1235.2,1002.8h66.9l51.1,25.1h-72.8L1235.2,1002.8z M1259.7,976.5h69.4l48.6,21.5h-74.3L1259.7,976.5L1259.7,976.5
z M1250,971.8l-34-16.8h64.6l37.8,16.8H1250L1250,971.8z M1252.1,937.1h48.1l34,13.2h-52.4L1252.1,937.1z M1269.7,950.2h-63.5
l-26.8-13.2h60.5L1269.7,950.2z M1195.2,950.2h-54.6l-23.7-13.2h51.5L1195.2,950.2L1195.2,950.2z M1130.5,950.2h-50.6l-19.9-13.2
h46.9L1130.5,950.2z M1070.9,950.2h-47.7l-15.6-13.2h43.4L1070.9,950.2z M1015.5,950.2H963l-12.1-13.2h49L1015.5,950.2z
M956.1,950.2h-47.2l-8-13.2H944L956.1,950.2z M960.5,955l15.4,16.8H922L911.8,955H960.5z M980.3,976.5l19.8,21.5h-62.1l-13.2-21.5
H980.3L980.3,976.5z M1004.6,1002.8l23.1,25.1h-71.3l-15.3-25.1H1004.6z M1032.1,1032.7l31.9,34.7h-83.6l-21.2-34.7H1032.1
L1032.1,1032.7z M1068.4,1072.2l48.5,52.6h-101.4l-32.2-52.6H1068.4L1068.4,1072.2z M1075.3,1072.2h84.7l62.4,52.6h-98.6
L1075.3,1072.2L1075.3,1072.2z M1167.8,1072.2h87.9l79.7,52.6h-105.2L1167.8,1072.2z M1204.9,1032.7h74l62.4,34.7h-83.8
L1204.9,1032.7z M1289,1032.7h74l70.5,34.7h-82.1L1289,1032.7z M1313.2,1002.8h75.4l56.7,25.1h-81.1L1313.2,1002.8z M1341.2,976.5
h60.9l55.6,21.5h-67.9L1341.2,976.5z M1330.4,971.8l-37.8-16.8h53.9l43.2,16.8H1330.4z M1313.6,937.1h56.9l38.8,13.2h-61.8
L1313.6,937.1z M1339.8,921.5h46.4l40.2,10.8h-54.9L1339.8,921.5z M1356.5,932.3h-55.2l-27.8-10.8h51.3L1356.5,932.3L1356.5,932.3z
M1287.8,932.3h-46.6l-24.3-10.8h43.1L1287.8,932.3L1287.8,932.3z M1229.2,932.3h-59.5l-21.9-10.8h57L1229.2,932.3z M1158.7,932.3
h-50.3l-19.3-10.8h47.8L1158.7,932.3L1158.7,932.3z M1098.2,932.3h-45.5l-16.3-10.8h42.5L1098.2,932.3L1098.2,932.3z M1043.7,932.3
H1002l-12.8-10.8h38.3L1043.7,932.3L1043.7,932.3z M994.2,932.3h-47.7l-9.9-10.8h44.9L994.2,932.3z M939.6,932.3h-41.7l-6.6-10.8
h38.3L939.6,932.3L939.6,932.3z M891.8,932.3h-52.7l-3.4-10.8h49.6L891.8,932.3L891.8,932.3z M894.8,937.1l8,13.2h-58l-4.2-13.2
H894.8z M905.7,955l10.2,16.8h-64.3l-5.3-16.8H905.7L905.7,955z M918.9,976.5l13.2,21.5h-72.1l-6.8-21.5H918.9z M934.9,1002.8
l15.3,25.1h-80.9l-8-25.1H934.9L934.9,1002.8z M953.2,1032.7l21.2,34.7h-92.5l-11-34.7H953.2z M977.3,1072.2l32.2,52.6H900.1
l-16.7-52.6H977.3L977.3,1072.2z M1012.4,1129.6l46,75.3H925.5l-23.9-75.3H1012.4L1012.4,1129.6z M1018.4,1129.6h102.9l69.4,75.3
h-126.2L1018.4,1129.6z M1128.2,1129.6h99.8l89.3,75.3h-119.7L1128.2,1129.6L1128.2,1129.6z M1344.3,1124.8l-79.7-52.6h85.2
l94.6,52.6H1344.3z M1550.2,1124.8h-95.7l-94.6-52.6h83.3L1550.2,1124.8z M1534.5,1067.4h-90l-70.5-34.7h82.1L1534.5,1067.4z
M1535,1028h-77.6l-56.7-25.1h69.4L1535,1028z M1550.4,998.1h-79.2l-55.6-21.5h71.4L1550.4,998.1z M1472.8,971.7h-69.6L1360,955
h63.5L1472.8,971.7z M1493.5,950.2h-69l-38.8-13.2h58.7L1493.5,950.2z M1533.8,932.3h-88.7l-40.2-10.8h77.3L1533.8,932.3
L1533.8,932.3z M1413.2,907.2l45.9,9.6H1387l-35.8-9.6H1413.2L1413.2,907.2z M1345.6,907.2l-1.1,3.2l23.8,6.4h-42.7l-28.2-9.6
H1345.6L1345.6,907.2z M1282.4,907.2l28.2,9.6h-49.5l-24.7-9.6H1282.4z M1222.9,907.2l24.7,9.6h-41.5l-21.6-9.6H1222.9L1222.9,907.2
z M1172.5,907.2l21.6,9.6h-55.9l-19.4-9.6H1172.5L1172.5,907.2z M1107.6,907.2l19.4,9.6h-46.7l-17.2-9.6H1107.6z M1053.1,907.2
l17.2,9.6h-41.1l-14.5-9.6H1053.1z M1005.7,907.2l14.5,9.6h-36.7l-11.3-9.6H1005.7z M964.4,907.2l11.3,9.6h-43.6l-8.8-9.6H964.4
L964.4,907.2z M916.4,907.2l8.8,9.6h-36.9l-5.8-9.6H916.4z M876.5,907.2l5.8,9.6h-48.2l-3-9.6H876.5z M788.9,907.2h36.8l3,9.6h-39.8
V907.2z M788.9,921.5h41.3l3.4,10.8h-44.7V921.5z M788.9,937.1h46.3l4.2,13.2h-50.4L788.9,937.1L788.9,937.1z M788.9,955h51.9
l5.3,16.8h-57.2V955z M788.9,976.5h58.8l6.8,21.5h-65.6L788.9,976.5L788.9,976.5z M788.9,1002.8H856l8,25.1h-75.1V1002.8z
M788.9,1032.7h76.6l11,34.7h-87.6V1032.7z M788.9,1072.2h89.1l16.7,52.6H788.9L788.9,1072.2L788.9,1072.2z M788.9,1129.6h107.3
L920,1205H788.9L788.9,1129.6L788.9,1129.6z M788.9,1335.3v-125.6h132.7l39.8,125.6H788.9L788.9,1335.3z M966.8,1335.3L927,1209.8
h134.3l76.7,125.6H966.8L966.8,1335.3z M1144.1,1335.3l-76.7-125.6h127.7l115.6,125.6H1144.1z M1317.6,1335.3L1202,1209.8h121
l148.8,125.6H1317.6L1317.6,1335.3z"/>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -1 +0,0 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 116.35 114.91"><defs><style>.cls-1{fill:#648dc9;}.cls-2{fill:#fff;}</style></defs><path class="cls-1" d="M344.76,397.3c3-9.77,16.87-9.77,19.9,0A10.42,10.42,0,0,0,380.25,403c8.6-5.53,19.19,3.36,15.24,12.79a10.42,10.42,0,0,0,8.29,14.37c10.15,1.29,12.55,14.91,3.46,19.59a10.41,10.41,0,0,0-2.88,16.33c6.94,7.52,0,19.49-9.95,17.24A10.42,10.42,0,0,0,381.7,494c.49,10.22-12.5,14.95-18.69,6.8a10.43,10.43,0,0,0-16.59,0c-6.19,8.15-19.19,3.42-18.7-6.8A10.41,10.41,0,0,0,315,483.29c-10,2.25-16.89-9.72-9.95-17.24a10.42,10.42,0,0,0-2.88-16.33c-9.09-4.68-6.69-18.3,3.46-19.59a10.42,10.42,0,0,0,8.29-14.37c-4-9.43,6.64-18.32,15.24-12.79A10.41,10.41,0,0,0,344.76,397.3Z" transform="translate(-296.54 -389.97)"/><path class="cls-2" d="M364.76,416v63H351.45V428.59h-.37l-14.41,9V425.82L352.25,416Z" transform="translate(-296.54 -389.97)"/></svg>

Before

Width:  |  Height:  |  Size: 914 B

View File

@ -1 +0,0 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 116.35 114.91"><defs><style>.cls-1{fill:#648dc9;}.cls-2{fill:#fff;}</style></defs><path class="cls-1" d="M786.64,196c3-9.77,16.86-9.77,19.9,0a10.42,10.42,0,0,0,15.58,5.68c8.6-5.54,19.2,3.35,15.24,12.79a10.42,10.42,0,0,0,8.29,14.36c10.15,1.29,12.55,14.91,3.46,19.59a10.43,10.43,0,0,0-2.88,16.34c6.94,7.51,0,19.49-10,17.23a10.41,10.41,0,0,0-12.7,10.66c.49,10.22-12.51,14.95-18.7,6.8a10.43,10.43,0,0,0-16.59,0c-6.19,8.15-19.18,3.42-18.69-6.8A10.42,10.42,0,0,0,756.89,282c-10,2.26-16.89-9.72-9.95-17.23a10.42,10.42,0,0,0-2.88-16.34c-9.09-4.68-6.69-18.3,3.46-19.59a10.42,10.42,0,0,0,8.29-14.36c-3.95-9.44,6.64-18.33,15.24-12.79A10.43,10.43,0,0,0,786.64,196Z" transform="translate(-738.41 -188.71)"/><path class="cls-2" d="M774.45,278.07v-9.59l22.41-20.75q2.86-2.76,4.81-5a18.62,18.62,0,0,0,3-4.35,10.58,10.58,0,0,0,1-4.62A9,9,0,0,0,804.4,229a8.49,8.49,0,0,0-3.45-3.1,10.86,10.86,0,0,0-5-1.09,10.42,10.42,0,0,0-5,1.17,8.06,8.06,0,0,0-3.32,3.35,10.81,10.81,0,0,0-1.17,5.19H773.84a20,20,0,0,1,2.8-10.73,18.54,18.54,0,0,1,7.84-7,25.9,25.9,0,0,1,11.62-2.49,27.22,27.22,0,0,1,11.78,2.38,18.85,18.85,0,0,1,7.83,6.59,17.09,17.09,0,0,1,2.79,9.65,18.71,18.71,0,0,1-1.39,7,29.55,29.55,0,0,1-5,7.7,112.64,112.64,0,0,1-10,10.13l-9.19,9v.43h26.43v10.88Z" transform="translate(-738.41 -188.71)"/></svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -1 +0,0 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 116.35 114.91"><defs><style>.cls-1{fill:#648dc9;}.cls-2{fill:#fff;}</style></defs><path class="cls-1" d="M822.07,585.58c3-9.77,16.86-9.77,19.9,0a10.41,10.41,0,0,0,15.58,5.67c8.61-5.53,19.2,3.36,15.24,12.79a10.42,10.42,0,0,0,8.3,14.37c10.14,1.29,12.55,14.91,3.45,19.59a10.42,10.42,0,0,0-2.88,16.33c6.94,7.52,0,19.49-9.95,17.24A10.41,10.41,0,0,0,859,682.23c.49,10.21-12.51,14.94-18.7,6.8a10.42,10.42,0,0,0-16.58,0c-6.2,8.14-19.19,3.41-18.7-6.8a10.42,10.42,0,0,0-12.71-10.66c-10,2.25-16.89-9.72-10-17.24A10.41,10.41,0,0,0,779.49,638c-9.09-4.68-6.69-18.3,3.46-19.59A10.42,10.42,0,0,0,791.24,604c-4-9.43,6.64-18.32,15.24-12.79A10.42,10.42,0,0,0,822.07,585.58Z" transform="translate(-773.84 -578.25)"/><path class="cls-2" d="M831.85,668.05a30,30,0,0,1-12.25-2.38,20.61,20.61,0,0,1-8.46-6.58,16.54,16.54,0,0,1-3.18-9.7h13.41a6.86,6.86,0,0,0,1.52,4,9,9,0,0,0,3.73,2.69,13.73,13.73,0,0,0,5.26,1,12.7,12.7,0,0,0,5.38-1.07,8.89,8.89,0,0,0,3.66-3,7.91,7.91,0,0,0-.08-8.87,9.24,9.24,0,0,0-4-3.06,15.58,15.58,0,0,0-6.16-1.11h-5.87v-9.77h5.87a12.77,12.77,0,0,0,5.33-1.05,8.55,8.55,0,0,0,3.62-2.9,7.44,7.44,0,0,0,1.29-4.35,7.52,7.52,0,0,0-4.26-7,10.38,10.38,0,0,0-4.69-1,12.32,12.32,0,0,0-5,1,8.72,8.72,0,0,0-3.59,2.75,7.11,7.11,0,0,0-1.45,4.18H809.22a16.42,16.42,0,0,1,3.11-9.59,20.18,20.18,0,0,1,8.13-6.5A27.37,27.37,0,0,1,832,603.37a25.87,25.87,0,0,1,11.41,2.37,18.91,18.91,0,0,1,7.61,6.38,15.49,15.49,0,0,1,2.68,9,12.3,12.3,0,0,1-3.27,8.82,15.05,15.05,0,0,1-8.59,4.49v.49q6.95.9,10.59,4.81a13.73,13.73,0,0,1,3.61,9.79,15.39,15.39,0,0,1-3.09,9.56,20.88,20.88,0,0,1-8.59,6.58A31,31,0,0,1,831.85,668.05Z" transform="translate(-773.84 -578.25)"/></svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg id="Layer_2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 78 66"><defs><style>.cls-1{fill:#fff;}</style></defs><path d="M39,61c-10.69,0-21.39,0-32.08,0-4.08,0-5.68-1.62-5.68-5.73,0-12.83,0-25.67,0-38.5,0-3.98,1.63-5.61,5.6-5.62,4.21,0,8.43,.07,12.64-.06,.83-.03,2.08-.6,2.39-1.26,1.88-4.02,4.95-5.04,9.2-4.81,6.15,.34,12.33,.19,18.49,.04,2.46-.06,4.23,.79,5.23,2.9,1.25,2.62,3.1,3.49,5.99,3.26,3.63-.28,7.29-.09,10.94-.06,3.22,.03,5.03,1.81,5.04,5.04,.02,13.21,.02,26.42,0,39.63,0,3.43-1.8,5.17-5.29,5.17-10.82,.01-21.64,0-32.46,0Zm.03-46.81c-10.75-.02-19.59,8.75-19.65,19.49-.06,10.84,8.76,19.73,19.58,19.75,10.75,.02,19.6-8.75,19.66-19.49,.06-10.84-8.76-19.73-19.59-19.75ZM14.09,24.75c2.34,0,3.75-1.14,3.74-3.02,0-1.88-1.42-3.01-3.76-3-2.34,0-3.75,1.14-3.74,3.02,0,1.88,1.42,3.01,3.76,3.01Z"/><path class="cls-1" d="M39.03,14.19c10.83,.02,19.65,8.91,19.59,19.75-.06,10.74-8.9,19.51-19.66,19.49-10.82-.02-19.65-8.92-19.58-19.75,.06-10.74,8.9-19.51,19.65-19.49Zm-.05,36.23c9.1,0,16.58-7.42,16.63-16.5,.04-9.2-7.42-16.71-16.6-16.72-9.11,0-16.58,7.41-16.63,16.5-.05,9.19,7.42,16.72,16.6,16.72Z"/><path class="cls-1" d="M14.09,24.75c-2.34,0-3.76-1.13-3.76-3.01,0-1.88,1.4-3.02,3.74-3.02,2.35,0,3.76,1.12,3.76,3,0,1.88-1.41,3.02-3.74,3.02Z"/><path d="M38.98,50.43c-9.18,0-16.64-7.53-16.6-16.72,.04-9.09,7.52-16.51,16.63-16.5,9.18,0,16.64,7.52,16.6,16.72-.04,9.09-7.52,16.51-16.63,16.5Zm0-3.03c7.45,0,13.57-6.08,13.6-13.52,.03-7.45-6.03-13.6-13.47-13.64-7.53-.05-13.7,6.08-13.69,13.61,.01,7.44,6.12,13.54,13.56,13.55Z"/><path class="cls-1" d="M38.98,47.39c-7.44,0-13.55-6.11-13.56-13.55-.01-7.52,6.16-13.66,13.69-13.61,7.43,.05,13.49,6.19,13.47,13.64-.03,7.44-6.15,13.52-13.6,13.52Zm10.59-13.56c0-5.8-4.71-10.56-10.5-10.6-5.81-.03-10.59,4.67-10.64,10.45-.05,5.89,4.72,10.7,10.59,10.69,5.8-.01,10.54-4.75,10.55-10.55Z"/><path d="M49.57,33.84c0,5.8-4.75,10.54-10.55,10.55-5.87,.01-10.65-4.8-10.59-10.69,.05-5.78,4.84-10.48,10.64-10.45,5.79,.03,10.51,4.79,10.5,10.6Z"/></svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -1,23 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 24.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:#7D86C1;}
</style>
<path class="st0" d="M10.2,11.2c-0.2,0-0.4,0-0.6,0.1c-0.2,0.1-0.3,0.3-0.4,0.5C9.1,12,9,12.2,9.1,12.4c0,0.2,0.1,0.4,0.3,0.6
c0.1,0.2,0.3,0.3,0.6,0.3c0.2,0,0.4,0,0.6,0c0.2-0.1,0.4-0.2,0.5-0.4c0.1-0.2,0.2-0.4,0.2-0.6c0-0.1,0-0.3-0.1-0.4
c0-0.1-0.1-0.2-0.2-0.3c-0.1-0.1-0.2-0.2-0.3-0.2C10.5,11.2,10.4,11.2,10.2,11.2z M13.8,11.2c-0.2,0-0.4,0-0.6,0.1
c-0.2,0.1-0.3,0.3-0.4,0.5c-0.1,0.2-0.1,0.4-0.1,0.6c0,0.2,0.1,0.4,0.3,0.6c0.1,0.2,0.3,0.3,0.6,0.3c0.2,0,0.4,0,0.6,0
c0.2-0.1,0.4-0.2,0.5-0.4c0.1-0.2,0.2-0.4,0.2-0.6c0-0.1,0-0.3-0.1-0.4c0-0.1-0.1-0.2-0.2-0.3c-0.1-0.1-0.2-0.2-0.3-0.2
C14.1,11.2,13.9,11.2,13.8,11.2z"/>
<path class="st0" d="M18.5,3H5.5C5.2,3,4.9,3.1,4.7,3.2C4.5,3.3,4.2,3.4,4.1,3.6C3.9,3.8,3.7,4,3.6,4.2C3.5,4.5,3.5,4.7,3.5,5v13.2
c0,0.3,0.1,0.5,0.2,0.8c0.1,0.2,0.2,0.5,0.4,0.7c0.2,0.2,0.4,0.3,0.6,0.4c0.2,0.1,0.5,0.2,0.8,0.2h11.1L16,18.4l1.2,1.2l1.2,1.1
l2.1,1.9V5c0-0.3-0.1-0.5-0.2-0.8s-0.2-0.5-0.4-0.7c-0.2-0.2-0.4-0.3-0.6-0.4C19.1,3.1,18.8,3,18.5,3z M14.8,15.7
c0,0-0.4-0.4-0.6-0.8c0.7-0.2,1.3-0.6,1.8-1.2c-0.4,0.2-0.7,0.4-1.1,0.6c-0.5,0.2-0.9,0.3-1.4,0.4c-0.8,0.2-1.7,0.2-2.5,0
c-0.5-0.1-1-0.2-1.4-0.4c-0.2-0.1-0.5-0.2-0.7-0.3c0,0-0.1,0-0.1,0c0,0,0,0,0,0c-0.2-0.1-0.3-0.2-0.3-0.2c0.4,0.6,1,1,1.7,1.2
c-0.3,0.4-0.7,0.8-0.7,0.8c-0.6,0-1.2-0.1-1.7-0.4c-0.5-0.3-1-0.6-1.3-1.1c0-2,0.5-3.9,1.4-5.7c0.8-0.6,1.7-1,2.7-1l0.1,0.1
C9.7,7.9,8.8,8.3,8,8.9c0,0,0.2-0.1,0.6-0.3c0.7-0.3,1.4-0.5,2.2-0.6c0.1,0,0.1,0,0.2,0c0.7-0.1,1.3-0.1,2,0c1,0.1,2,0.4,2.9,0.9
c-0.7-0.6-1.5-1-2.4-1.2l0.1-0.2c1,0,2,0.4,2.7,1c0.9,1.8,1.4,3.7,1.4,5.7c-0.3,0.5-0.8,0.9-1.3,1.1C15.9,15.6,15.3,15.7,14.8,15.7z
"/>
</svg>

Before

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -1,51 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 24.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 270.5 21" style="enable-background:new 0 0 270.5 21;" xml:space="preserve">
<style type="text/css">
.st0{fill-rule:evenodd;clip-rule:evenodd;fill:#FFFFFF;}
.st1{fill:#FFFFFF;}
</style>
<path class="st0" d="M19.1,9.8L18,8.7l-5.7,5.7V0h-1.5v14.4L5.1,8.7L4.1,9.8l7.5,7.5L19.1,9.8z M19.1,16.5v3h-15v-3H2.6v3
c0,0.8,0.7,1.5,1.5,1.5h15c0.8,0,1.5-0.7,1.5-1.5v-3H19.1z"/>
<path class="st1" d="M37.7,17c4,0,6.3-2.5,6.3-6.6c0-4.1-2.3-6.5-6.2-6.5h-4.4V17H37.7z M35.5,15.3V5.6h2.3c2.9,0,4.3,1.7,4.3,4.8
c0,3.1-1.5,4.8-4.5,4.8H35.5z M50.5,17.2c2.8,0,4.6-2,4.6-5.1c0-3.1-1.8-5.1-4.6-5.1c-2.8,0-4.6,2-4.6,5.1
C45.9,15.2,47.7,17.2,50.5,17.2z M50.5,15.6c-1.8,0-2.7-1.6-2.7-3.5c0-1.9,0.8-3.5,2.7-3.5c1.8,0,2.6,1.6,2.6,3.5
C53.1,14,52.3,15.6,50.5,15.6z M59,17h1.9l2-7.1h0.1l2,7.1H67l2.9-9.8h-2L66,14.4h-0.1L64,7.2h-2l-1.9,7.2H60l-1.9-7.2h-2L59,17z
M73.6,11.2c0-1.6,1-2.5,2.3-2.5c1.3,0,2.1,0.9,2.1,2.3v6h1.9v-6.2c0-2.4-1.3-3.7-3.3-3.7c-1.5,0-2.4,0.7-2.9,1.7h-0.1V7.2h-1.8V17
h1.9V11.2z M84.4,3.9h-1.9V17h1.9V3.9z M91.1,17.2c2.8,0,4.6-2,4.6-5.1c0-3.1-1.8-5.1-4.6-5.1c-2.8,0-4.6,2-4.6,5.1
C86.5,15.2,88.3,17.2,91.1,17.2z M91.1,15.6c-1.8,0-2.7-1.6-2.7-3.5c0-1.9,0.8-3.5,2.7-3.5c1.8,0,2.6,1.6,2.6,3.5
C93.7,14,92.9,15.6,91.1,15.6z M100.7,17.2c1.6,0,2.5-0.8,2.9-1.6h0.1V17h1.9v-6.5c0-2.9-2.2-3.4-3.8-3.4c-1.8,0-3.4,0.7-4.1,2.5
l1.8,0.4c0.3-0.7,1-1.4,2.3-1.4c1.2,0,1.9,0.6,1.9,1.8v0c0,0.7-0.7,0.7-2.5,0.9c-1.9,0.2-3.8,0.7-3.8,2.9
C97.3,16.2,98.8,17.2,100.7,17.2z M101.1,15.7c-1.1,0-1.9-0.5-1.9-1.4c0-1,0.9-1.4,2-1.5c0.6-0.1,2.1-0.2,2.4-0.5v1.3
C103.6,14.6,102.7,15.7,101.1,15.7z M111.7,17.2c1.8,0,2.5-1.1,2.8-1.7h0.2V17h1.9V3.9h-1.9v4.9h-0.1c-0.3-0.6-1-1.7-2.8-1.7
c-2.4,0-4.1,1.9-4.1,5.1C107.6,15.3,109.3,17.2,111.7,17.2z M112.1,15.6c-1.7,0-2.6-1.5-2.6-3.5c0-1.9,0.9-3.4,2.6-3.4
c1.7,0,2.6,1.4,2.6,3.4C114.7,14.2,113.8,15.6,112.1,15.6z M131.4,7.3h1.9c-0.1-2.1-1.9-3.6-4.6-3.6c-2.6,0-4.6,1.5-4.6,3.8
c0,1.8,1.3,2.9,3.4,3.5l1.5,0.4c1.4,0.4,2.5,0.8,2.5,2c0,1.3-1.2,2.1-2.9,2.1c-1.5,0-2.8-0.7-2.9-2.1h-2c0.1,2.4,2,3.8,4.9,3.8
c3.1,0,4.8-1.6,4.8-3.8c0-2.4-2.1-3.3-3.8-3.7l-1.3-0.3c-1-0.3-2.4-0.7-2.4-2c0-1.1,1-1.9,2.6-1.9C130.2,5.4,131.2,6.1,131.4,7.3z
M139.8,17.2c2.3,0,3.8-1.4,4-3.3H142c-0.2,1.1-1.1,1.7-2.2,1.7c-1.6,0-2.7-1.3-2.7-3.5c0-2.1,1.1-3.4,2.7-3.4c1.2,0,2,0.8,2.2,1.7
h1.9c-0.2-2-1.8-3.3-4.1-3.3c-2.8,0-4.6,2.1-4.6,5.1C135.2,15.1,137,17.2,139.8,17.2z M150,17.2c2.8,0,4.6-2,4.6-5.1
c0-3.1-1.8-5.1-4.6-5.1c-2.8,0-4.6,2-4.6,5.1C145.4,15.2,147.2,17.2,150,17.2z M150,15.6c-1.8,0-2.7-1.6-2.7-3.5
c0-1.9,0.8-3.5,2.7-3.5c1.8,0,2.6,1.6,2.6,3.5C152.7,14,151.8,15.6,150,15.6z M156.7,17h1.9v-6c0-1.3,1-2.2,2.3-2.2
c0.4,0,0.8,0.1,1,0.1V7.1c-0.2,0-0.6,0-0.8,0c-1.2,0-2.1,0.7-2.5,1.7h-0.1V7.2h-1.8V17z M167.5,17.2c2.1,0,3.7-1.1,4.1-2.7l-1.8-0.3
c-0.3,0.9-1.2,1.4-2.3,1.4c-1.6,0-2.7-1.1-2.8-3h7V12c0-3.5-2.1-4.9-4.3-4.9c-2.7,0-4.5,2.1-4.5,5.1
C162.8,15.2,164.6,17.2,167.5,17.2z M164.8,11.2c0.1-1.4,1.1-2.6,2.6-2.6c1.5,0,2.5,1.1,2.5,2.6H164.8z M181.2,9.6
c-0.4-1.5-1.6-2.5-3.7-2.5c-2.2,0-3.8,1.2-3.8,2.9c0,1.4,0.8,2.3,2.7,2.7l1.7,0.4c0.9,0.2,1.4,0.6,1.4,1.2c0,0.8-0.8,1.4-2.1,1.4
c-1.1,0-1.9-0.5-2.1-1.5l-1.8,0.3c0.3,1.7,1.8,2.7,4,2.7c2.4,0,4-1.3,4-3c0-1.4-0.9-2.2-2.7-2.7l-1.6-0.4c-1.1-0.3-1.5-0.6-1.5-1.3
c0-0.8,0.8-1.3,1.9-1.3c1.2,0,1.7,0.7,2,1.3L181.2,9.6z M192.1,17.2c1.2,0,2.5-0.4,3.4-1.2l0.9,1h2.2l-1.9-2.2
c0.6-0.7,1.1-1.9,1.1-3.7H196c0,0.9-0.2,1.7-0.5,2.3l-2.6-3.1l0.9-0.7c1.1-0.8,1.7-1.7,1.7-3c0-1.5-1.2-2.9-3.2-2.9
c-2,0-3.3,1.3-3.3,3.1c0,1.2,0.6,2.1,1.4,3.1c-1.5,1-2.5,2-2.5,3.6C187.8,15.6,189.4,17.2,192.1,17.2z M194.4,14.7
c-0.7,0.6-1.5,0.9-2.3,0.9c-1.4,0-2.3-1-2.3-2.1c0-0.4,0.3-1.2,1.4-2l0.3-0.3L194.4,14.7z M191.8,9c-0.6-0.7-1.1-1.4-1.1-2.1
c0-0.8,0.6-1.5,1.5-1.5c0.9,0,1.5,0.7,1.5,1.3c0,0.8-0.4,1.3-1.1,1.7L191.8,9z M204.9,3.9V17h1.9V7.5h0.1l3.9,9.5h1.6l3.9-9.5h0.1
V17h1.9V3.9h-2.4l-4.2,10.2h-0.2l-4.2-10.2H204.9z M225.1,17.2c2.1,0,3.7-1.1,4.1-2.7l-1.8-0.3c-0.3,0.9-1.2,1.4-2.3,1.4
c-1.6,0-2.7-1.1-2.8-3h7V12c0-3.5-2.1-4.9-4.3-4.9c-2.7,0-4.5,2.1-4.5,5.1C220.5,15.2,222.2,17.2,225.1,17.2z M222.4,11.2
c0.1-1.4,1.1-2.6,2.6-2.6c1.5,0,2.5,1.1,2.5,2.6H222.4z M236.1,7.2h-2V4.8h-1.9v2.4h-1.4v1.5h1.4v5.8c0,1.8,1.4,2.6,2.9,2.6
c0.6,0,1-0.1,1.2-0.2l-0.3-1.6c-0.1,0-0.4,0.1-0.7,0.1c-0.6,0-1.2-0.2-1.2-1.3V8.7h2V7.2z M238.2,17h1.9v-6c0-1.3,1-2.2,2.3-2.2
c0.4,0,0.8,0.1,1,0.1V7.1c-0.2,0-0.6,0-0.8,0c-1.2,0-2.1,0.7-2.5,1.7H240V7.2h-1.8V17z M245.1,17h1.9V7.2h-1.9V17z M246,5.7
c0.7,0,1.2-0.5,1.2-1.1s-0.5-1.1-1.2-1.1c-0.7,0-1.2,0.5-1.2,1.1S245.4,5.7,246,5.7z M253.7,17.2c2.3,0,3.8-1.4,4-3.3h-1.9
c-0.2,1.1-1.1,1.7-2.2,1.7c-1.6,0-2.7-1.3-2.7-3.5c0-2.1,1.1-3.4,2.7-3.4c1.2,0,2,0.8,2.2,1.7h1.9c-0.2-2-1.8-3.3-4.1-3.3
c-2.8,0-4.6,2.1-4.6,5.1C249.1,15.1,250.8,17.2,253.7,17.2z M267.1,9.6c-0.4-1.5-1.6-2.5-3.7-2.5c-2.2,0-3.8,1.2-3.8,2.9
c0,1.4,0.8,2.3,2.7,2.7l1.7,0.4c0.9,0.2,1.4,0.6,1.4,1.2c0,0.8-0.8,1.4-2.1,1.4c-1.1,0-1.9-0.5-2.1-1.5l-1.8,0.3
c0.3,1.7,1.8,2.7,4,2.7c2.4,0,4-1.3,4-3c0-1.4-0.9-2.2-2.7-2.7l-1.6-0.4c-1.1-0.3-1.5-0.6-1.5-1.3c0-0.8,0.8-1.3,1.9-1.3
c1.2,0,1.7,0.7,2,1.3L267.1,9.6z"/>
</svg>

Before

Width:  |  Height:  |  Size: 5.2 KiB

View File

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 24.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 23 21" style="enable-background:new 0 0 23 21;" xml:space="preserve">
<style type="text/css">
.st0{fill-rule:evenodd;clip-rule:evenodd;fill:#FFFFFF;}
</style>
<path class="st0" d="M19.1,9.8L18,8.7l-5.7,5.7V0h-1.5v14.4L5.1,8.7l-1,1.1l7.5,7.5L19.1,9.8z M19.1,16.5v3h-15v-3H2.6v3
c0,0.8,0.7,1.5,1.5,1.5h15c0.8,0,1.5-0.7,1.5-1.5v-3H19.1z"/>
</svg>

Before

Width:  |  Height:  |  Size: 621 B

View File

@ -1,4 +0,0 @@
<svg width="180" height="48" viewBox="0 0 180 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M35.5 23.25L34.4425 22.1925L28.75 27.8775V13.5H27.25V27.8775L21.5575 22.1925L20.5 23.25L28 30.75L35.5 23.25ZM35.5 30V33H20.5V30H19V33C19 33.8284 19.6716 34.5 20.5 34.5H35.5C36.3284 34.5 37 33.8284 37 33V30H35.5Z" fill="white"/>
<path d="M49.5271 30.5H57.8112V28.7997H51.5022V24.7919H57.3062V23.098H51.5022V19.1094H57.7345V17.4091H49.5271V30.5ZM68.6185 20.6818H66.5667L64.0866 28.2372H63.9843L61.4978 20.6818H59.4459L63.0127 30.5H65.0582L68.6185 20.6818ZM74.2947 30.6982C76.436 30.6982 77.9509 29.6435 78.3856 28.0455L76.5766 27.7195C76.2314 28.6463 75.4005 29.1193 74.3138 29.1193C72.6775 29.1193 71.578 28.0582 71.5269 26.1662H78.507V25.4886C78.507 21.9411 76.3849 20.554 74.1604 20.554C71.4246 20.554 69.6221 22.6378 69.6221 25.6548C69.6221 28.7038 71.3991 30.6982 74.2947 30.6982ZM71.5333 24.7344C71.61 23.3409 72.6199 22.1328 74.1732 22.1328C75.6562 22.1328 76.6278 23.2322 76.6341 24.7344H71.5333ZM82.5388 24.6705C82.5388 23.1044 83.4976 22.2095 84.8271 22.2095C86.1247 22.2095 86.911 23.0597 86.911 24.4851V30.5H88.8222V24.255C88.8222 21.826 87.4862 20.554 85.4791 20.554C84.0026 20.554 83.0374 21.2379 82.5835 22.2798H82.4621V20.6818H80.6276V30.5H82.5388V24.6705ZM95.9685 20.6818H93.955V18.3295H92.0438V20.6818H90.6056V22.2159H92.0438V28.0135C92.0374 29.7969 93.3989 30.6598 94.9074 30.6278C95.5146 30.6214 95.9237 30.5064 96.1475 30.4233L95.8023 28.8445C95.6744 28.87 95.4379 28.9276 95.1311 28.9276C94.5111 28.9276 93.955 28.723 93.955 27.6172V22.2159H95.9685V20.6818ZM103 30.5H104.975V24.7919H111.501V30.5H113.483V17.4091H111.501V23.098H104.975V17.4091H103V30.5ZM116.206 30.5H118.117V20.6818H116.206V30.5ZM117.171 19.1669C117.829 19.1669 118.379 18.6555 118.379 18.0291C118.379 17.4027 117.829 16.8849 117.171 16.8849C116.506 16.8849 115.963 17.4027 115.963 18.0291C115.963 18.6555 116.506 19.1669 117.171 19.1669ZM128.045 23.0788C127.649 21.5511 126.454 20.554 124.332 20.554C122.114 20.554 120.541 21.7237 120.541 23.4624C120.541 24.8558 121.385 25.7827 123.226 26.1918L124.888 26.5561C125.834 26.767 126.275 27.1889 126.275 27.8026C126.275 28.5632 125.463 29.1577 124.21 29.1577C123.066 29.1577 122.331 28.6655 122.101 27.7003L120.253 27.9815C120.573 29.7202 122.018 30.6982 124.223 30.6982C126.594 30.6982 128.237 29.4389 128.237 27.6619C128.237 26.2749 127.355 25.4183 125.552 25.0028L123.993 24.6449C122.913 24.3892 122.446 24.0249 122.452 23.3601C122.446 22.6058 123.264 22.0689 124.351 22.0689C125.54 22.0689 126.089 22.7273 126.313 23.3857L128.045 23.0788ZM134.922 20.6818H132.908V18.3295H130.997V20.6818H129.559V22.2159H130.997V28.0135C130.991 29.7969 132.352 30.6598 133.861 30.6278C134.468 30.6214 134.877 30.5064 135.101 30.4233L134.755 28.8445C134.628 28.87 134.391 28.9276 134.084 28.9276C133.464 28.9276 132.908 28.723 132.908 27.6172V22.2159H134.922V20.6818ZM141.066 30.6982C143.834 30.6982 145.643 28.6719 145.643 25.6357C145.643 22.5803 143.834 20.554 141.066 20.554C138.298 20.554 136.489 22.5803 136.489 25.6357C136.489 28.6719 138.298 30.6982 141.066 30.6982ZM141.072 29.0938C139.263 29.0938 138.42 27.5149 138.42 25.6293C138.42 23.75 139.263 22.152 141.072 22.152C142.869 22.152 143.712 23.75 143.712 25.6293C143.712 27.5149 142.869 29.0938 141.072 29.0938ZM147.776 30.5H149.687V24.5043C149.687 23.2195 150.678 22.2926 152.033 22.2926C152.429 22.2926 152.877 22.3629 153.03 22.4077V20.5795C152.839 20.554 152.461 20.5348 152.218 20.5348C151.068 20.5348 150.084 21.1868 149.726 22.2415H149.623V20.6818H147.776V30.5ZM156.191 34.1818C157.77 34.1818 158.767 33.3572 159.336 31.8104L163.395 20.701L161.33 20.6818L158.844 28.3011H158.742L156.255 20.6818H154.21L157.802 30.6278L157.565 31.2798C157.08 32.5838 156.396 32.6925 155.347 32.4048L154.887 33.9709C155.117 34.0732 155.616 34.1818 156.191 34.1818Z" fill="white"/>
</svg>

Before

Width:  |  Height:  |  Size: 3.8 KiB

View File

@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 97 103.03"><defs><style>.cls-1{fill-rule:evenodd;}</style></defs><path class="cls-1" d="M48.5,103.03c-3.9,0-7.7-1-11.2-2.9-7.8-4.4-18.2-10.3-26.1-14.8-6.9-3.9-11.2-11.2-11.2-19v-29.6c0-7.8,4.3-15.1,11.2-19,7.8-4.4,18.2-10.3,26.1-14.8,6.9-3.9,15.4-3.9,22.4,0,7.8,4.4,18.2,10.3,26.1,14.8,3.4,1.9,6.1,4.6,8,7.7l-34.2,19.7c-6.8,3.9-11,11.3-11.1,18.9v39Zm48.4-41.9v5.1c0,7.8-4.3,15.1-11.2,19-7.8,4.4-18.2,10.3-26.1,14.8-.7,.4-1.5,.8-2.2,1.1v-9.2c0-4.6,2.6-9,6.5-11.3,9.8-5.7,19.6-11.2,29.4-16.9,1.3-.7,2.5-1.6,3.6-2.6Zm-.1-27.2c.1,.9,.2,1.9,.2,2.8v5.3c0,5.8-3.2,11.2-8.2,14.1-9.8,5.7-19.6,11.2-29.4,16.9-.7,.4-1.3,.8-1.9,1.3v-10.3c0-4.6,2.6-9.1,6.6-11.4l32.7-18.7Z"/></svg>

After

Width:  |  Height:  |  Size: 772 B

View File

@ -0,0 +1 @@
<svg width="98" height="96" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M48.854 0C21.839 0 0 22 0 49.217c0 21.756 13.993 40.172 33.405 46.69 2.427.49 3.316-1.059 3.316-2.362 0-1.141-.08-5.052-.08-9.127-13.59 2.934-16.42-5.867-16.42-5.867-2.184-5.704-5.42-7.17-5.42-7.17-4.448-3.015.324-3.015.324-3.015 4.934.326 7.523 5.052 7.523 5.052 4.367 7.496 11.404 5.378 14.235 4.074.404-3.178 1.699-5.378 3.074-6.6-10.839-1.141-22.243-5.378-22.243-24.283 0-5.378 1.94-9.778 5.014-13.2-.485-1.222-2.184-6.275.486-13.038 0 0 4.125-1.304 13.426 5.052a46.97 46.97 0 0 1 12.214-1.63c4.125 0 8.33.571 12.213 1.63 9.302-6.356 13.427-5.052 13.427-5.052 2.67 6.763.97 11.816.485 13.038 3.155 3.422 5.015 7.822 5.015 13.2 0 18.905-11.404 23.06-22.324 24.283 1.78 1.548 3.316 4.481 3.316 9.126 0 6.6-.08 11.897-.08 13.526 0 1.304.89 2.853 3.316 2.364 19.412-6.52 33.405-24.935 33.405-46.691C97.707 22 75.788 0 48.854 0z" fill="#24292f"/></svg>

After

Width:  |  Height:  |  Size: 963 B

View File

@ -1,5 +0,0 @@
(function(f,b){if(!b.__SV){var e,g,i,h;window.mixpanel=b;b._i=[];b.init=function(e,f,c){function g(a,d){var b=d.split(".");2==b.length&&(a=a[b[0]],d=b[1]);a[d]=function(){a.push([d].concat(Array.prototype.slice.call(arguments,0)))}}var a=b;"undefined"!==typeof c?a=b[c]=[]:c="mixpanel";a.people=a.people||[];a.toString=function(a){var d="mixpanel";"mixpanel"!==c&&(d+="."+c);a||(d+=" (stub)");return d};a.people.toString=function(){return a.toString(1)+".people (stub)"};i="disable time_event track track_pageview track_links track_forms track_with_groups add_group set_group remove_group register register_once alias unregister identify name_tag set_config reset opt_in_tracking opt_out_tracking has_opted_in_tracking has_opted_out_tracking clear_opt_in_out_tracking start_batch_senders people.set people.set_once people.unset people.increment people.append people.union people.track_charge people.clear_charges people.delete_user people.remove".split(" ");
for(h=0;h<i.length;h++)g(a,i[h]);var j="set set_once union unset remove delete".split(" ");a.get_group=function(){function b(c){d[c]=function(){call2_args=arguments;call2=[c].concat(Array.prototype.slice.call(call2_args,0));a.push([e,call2])}}for(var d={},e=["get_group"].concat(Array.prototype.slice.call(arguments,0)),c=0;c<j.length;c++)b(j[c]);return d};b._i.push([e,f,c])};b.__SV=1.2;e=f.createElement("script");e.type="text/javascript";e.async=!0;e.src="undefined"!==typeof MIXPANEL_CUSTOM_LIB_URL?
MIXPANEL_CUSTOM_LIB_URL:"file:"===f.location.protocol&&"//cdn.mxpnl.com/libs/mixpanel-2-latest.min.js".match(/^\/\//)?"https://cdn.mxpnl.com/libs/mixpanel-2-latest.min.js":"//cdn.mxpnl.com/libs/mixpanel-2-latest.min.js";g=f.getElementsByTagName("script")[0];g.parentNode.insertBefore(e,g)}})(document,window.mixpanel||[]);
mixpanel.init("c48149996bde884c5132354e074fe9a8");
mixpanel.track('Sign up');

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 12 KiB

View File

@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg id="Layer_3" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 78 66"><defs><style>.cls-1{stroke:#000;stroke-width:2px;}</style></defs><path class="cls-1" d="M30.43,32.92c-1.03-1.13-2.04-2.24-3.05-3.34-3.71-4.06-7.43-8.1-11.13-12.17-.67-.74-1.4-1.09-2.4-1.08-3.19,.03-6.38,.01-9.57,0-.44,0-.89-.02-1.3-.13-.98-.27-1.59-1.19-1.5-2.16,.09-.98,.85-1.84,1.86-1.85,3.7-.03,7.41-.09,11.1,.07,2.17,.09,3.91,1.29,5.38,2.9,4.12,4.53,8.26,9.04,12.39,13.55,.32,.35,.65,.7,1.04,1.12,.45-.48,.86-.93,1.27-1.38,3.98-4.36,7.97-8.7,11.93-13.08,1.96-2.16,4.35-3.25,7.28-3.22,4.21,.04,8.43,.01,12.64,.01,.36,0,.71,0,1.39,0-.48-.39-.73-.62-1-.82-2.68-1.92-5.36-3.84-8.05-5.75-.8-.57-1.15-1.33-.93-2.29,.2-.87,.79-1.46,1.67-1.52,.54-.04,1.19,.11,1.63,.42,4.79,3.37,9.56,6.78,14.32,10.2,1.45,1.04,1.45,2.6,0,3.64-4.76,3.42-9.53,6.83-14.31,10.22-1.14,.81-2.41,.64-3.11-.35-.71-1.02-.45-2.21,.71-3.04,2.62-1.88,5.24-3.75,7.86-5.63,.31-.23,.61-.47,1.09-.84-.53-.03-.84-.07-1.15-.07-4.29,0-8.58,.04-12.86-.02-1.67-.02-2.91,.53-4.03,1.78-4.2,4.7-8.49,9.32-12.74,13.98-.24,.27-.48,.54-.77,.88,.86,.95,1.69,1.86,2.52,2.78,3.79,4.14,7.58,8.26,11.35,12.42,.82,.9,1.78,1.41,2.97,1.41,4.83,.01,9.67,0,14.75,0-.38-.32-.59-.53-.83-.7-2.71-1.95-5.42-3.88-8.13-5.83-1.04-.75-1.31-1.79-.78-2.78,.47-.88,1.47-1.3,2.43-.99,.27,.09,.53,.24,.77,.41,4.75,3.38,9.49,6.75,14.22,10.15,1.45,1.04,1.47,2.6,.03,3.64-4.79,3.45-9.59,6.87-14.4,10.28-1.07,.76-2.33,.56-3.02-.39-.72-1.01-.47-2.21,.69-3.04,2.62-1.88,5.24-3.75,7.86-5.63,.32-.23,.64-.47,1.16-.86-.56-.03-.9-.07-1.24-.07-4.18,0-8.36-.02-12.53,0-3,.02-5.48-1.02-7.5-3.26-4.11-4.54-8.25-9.04-12.38-13.56-.25-.27-.5-.53-.83-.87-.3,.32-.57,.6-.84,.88-4.11,4.49-8.25,8.95-12.31,13.48-2.05,2.29-4.51,3.39-7.56,3.33-2.82-.05-5.64,0-8.47-.01-1.55,0-2.55-.86-2.53-2.13,.02-1.25,.96-2.04,2.48-2.04,3.23,0,6.45-.02,9.68,0,1.07,0,1.87-.37,2.59-1.17,4.46-4.91,8.95-9.79,13.43-14.68,.22-.24,.42-.49,.7-.81Z"/></svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -1,510 +1,325 @@
/*https://www.figma.com/file/lrdoh9PNj60h2yiwmW6bS0/Calculator-Tools?node-id=615%3A1412*/
body {
background-color: #12161b;
background-attachment: fixed;
background-size: auto 100%;
background-position: center;
padding-left: 10%;
padding-right: 10%;
color: #C4CDD5;
font-family: 'Inter';
font-size: 18px;
font-weight: 400;
font-size: 16px;
background: url('background.svg') no-repeat center center fixed;
-webkit-background-size: cover;
-moz-background-size: cover;
-o-background-size: cover;
background-size: cover;
font-family: 'Exo 2';
}
a {
color: #8880E5;
}
hr {
margin: 0;
background: #10151A;
opacity: 0.5;
border: 1px solid #C4CDD5;
a:hover {
color: #23D1BA;
}
a[title]:hover::after {
content: attr(title);
position: absolute;
top: -100%;
left: 0;
color: orange;
}
.container-fluid {
max-width: 1100px;
margin: 0 auto;
border-radius: 16px;
height: 100%;
margin-top: 50px;
padding: 30px;
background-color: #161d24;
width: 80%;
max-width: 1200px;
margin: auto;
padding-top: 1%;
}
.titles {
font-size: 2em;
font-weight: 700;
color: #5494F8;
line-height: 50.4px;
padding-bottom: 15px;
padding-left: 4%;
}
.description {
color: #ffffff;
font-weight: 500;
padding-left: 4%;
text-align: left;
}
.madewith {
padding-top: 2%;
color: #C4CDD5;
font-size: 0.85em;
padding-left: 4%;
text-align: left;
}
.subtitle {
font-size: 0.85em;
text-align: left;
padding-bottom: 5%;
}
.madewith a {
color: #C4CDD5;
text-decoration: underline;
/* remove the default column padding for the app logo */
.title {
padding-left: 0;
}
.wrapper {
background: #141920;
border-radius: 16px;
border: 0.5px solid #454F5B;
padding: 2% 4% 2% 4%;
}
.wrapper2 {
background: #141920;
opacity: 0.4;
border-radius: 16px;
padding: 0;
}
#last_update {
font-family: Roboto Mono;
font-size: 0.8em;
font-style: italic;
}
.floatinput {
/* upper right icon links */
#icons {
display: flex;
padding-top: 10px;
padding-left: 30px;
}
.appbody {
margin-top: 10px;
}
/* centering the address input + buttons */
.addybuttons {
display: flex;
margin: auto;
align-items: baseline;
vertical-align: bottom;
justify-content: center;
}
.choose {
font-weight: 600;
color: #ffffff;
padding-bottom: 3%;
#useraddy label {
font-family: 'Orbitron';
font-size: 13.6px;
}
.irs-min, .irs-max {
visibility: hidden !important;
#useraddy {
min-width: 400px;
}
.irs-from, .irs-to {
#addy {
border: solid #E2E4F7 2px;
border-radius: 8px;
min-width: 400px;
}
.btn-default, .btn-default:focus {
border: solid #E2E4F7 2px;
border-radius: 8px;
margin-top: auto;
}
.btn-default:hover {
background-color: #E2E4F7;
border: solid #E2E4F7 2px;
}
.btn-capture {
background-color: transparent !important;
color: grey;
border: 0 !important;
opacity: 0.7;
}
.irs-bar {
background: linear-gradient(270deg, #014486 0%, #5494F8 100%) !important;
border-radius: 100px;
}
.irs--shiny .irs-line {
top: 25px;
height: 4px;
background-color: #454F5B;
border-radius: 100px;
}
.irs-handle {
background-color: #ffffff !important;
border: 1px solid #ffffff !important;
.btn-capture:hover {
background-color: transparent !important;
color: grey;
border: 0 !important;
opacity: 1;
}
#download_scores_metrics {
background: #5494F8;
width: 100%;
margin-top: 2%;
padding-top: 12px;
padding-bottom: 12px;
color: white;
vertical-align: middle;
font-size: 0.9em;
}
#download_all_data {
background: #5494F8;
padding-top: 10px;
padding-bottom: 10px;
color: white;
vertical-align: middle;
font-size: 0.9em;
}
.toppad {
padding-top: 3%;
padding-bottom: 15px;
font-weight: 600;
color: #ffffff;
}
.boldwhite {
font-weight: 600;
color: #ffffff;
}
.userscore {
background-color: #212B36;
border-radius: 4px;
padding: 10%;
color: #ffffff;
font-weight: 600;
font-size: 1.05em;
}
#user_score {
font-family: Roboto Mono;
font-size: 1.2em;
font-weight: 300;
padding-top: 3%;
}
#vs_mean {
font-weight: 300;
font-size: 0.9em;
}
.nomargin {
margin: 0;
}
.sidepiece {
width: 1% !important;
}
.col-sm-2 {
width: 19.6% !important;
}
.showey {
visibility: visible !important;
}
.outerDiv{
margin: 0px auto;
}
.leftDiv {
float: left;
text-align: left;
}
.rightDiv {
float: right;
text-align: right;
}
.doesscroll {
overflow-x: scroll;
min-width: 800px;
white-space: nowrap;
}
table {
table-layout: fixed;
width: 100%;
border-collapse:separate;
border-spacing: .5em;
white-space: nowrap;
overflow-x: scroll;
}
th {
background: #212B36;
color: #ffffff;
font-weight: 600;
font-size: .8em;
border-radius: 4px;
padding: 5px;
}
.catscore {
font-family: Roboto Mono;
font-weight: 400;
font-size: 0.85em;
}
.hidey {
visibility: hidden;
}
#n_governance_votes_c, #n_projects_staked_c, #n_airdrop_and_gov_stakes_c, #n_airdrops_claimed_c, #repeat_protocol_claims_c, #n_protocols_claimed_c, #n_dex_trades_c, #n_lp_deposits_c, #n_tokens_used_c, #n_transactions_c, #days_since_last_txn_c, #n_contracts_c, #net_from_shuttle_cex_c, #prop_luna_staked_c, #prop_drops_kept_c {
visibility: hidden;
}
#n_governance_votes, #n_projects_staked, #n_airdrop_and_gov_stakes, #n_airdrops_claimed, #repeat_protocollaims, #n_protocols_claimed, #n_dex_trades, #n_lp_deposits, #n_tokens_used, #n_transactions, #days_since_last_txn, #n_contracts, #net_from_shuttle_cex, #prop_luna_staked, #prop_drops_kept {
font-weight: 400;
}
td {
border: 1px solid #212B36;
border-radius: 4px;
font-weight: 600;
font-size: 0.78em;
padding: 5px;
vertical-align: middle;
}
.bright {
background: #172852;
border: 1px solid #172852;
border-radius: 4px;
color: #ffffff;
}
.about {
font-size: 0.98em;
}
.output {
font-weight: 300;
}
.plotly {
font-family: Roboto Mono !important;
font-style: normal;
font-weight: normal;
font-size: 14px;
line-height: 150%;
display: flex;
align-items: center;
text-align: center;
color: #919EAB !important;
.form-group {
margin-bottom: 0 !important;
}
.form-control {
background: #10151A;
border: 1px solid #97B8F5;
border-radius: 4px;
font-family: Roboto Mono !important;
color: #FFFFFF;
min-height: 42px;
}
.toppart {
background-color: #10151A;
border: 1px solid #97B8F5;
border-radius: 16px;
font-size: 18px;
padding: 4%;
outline:none;
border-color:#97B8F5;
box-shadow:0 0 10px #97B8F5;
}
.aligns {
text-align: right;
}
#event_history {
padding-top: 2%;
font-family: Roboto Mono !important;
font-size: 0.8em;
color: #FFFFFF;
white-space: nowrap;
}
input[type=radio].rt-select-input {
visibility: hidden;
}
.rt-select {
width: 0;
}
.rt-td-select {
width: 0;
}
.rt-page-button-current {
color: #FFF;
}
.rt-thead {
background-color: #10151A;
color: #FFFFFF;
}
.ReactTable {
background-color: #171e25;
color: #C4CDD5;
border: none;
font-size: 0.9em;
margin: -5px;
font-family: Roboto Mono;
}
.rt-th {
border: 0px solid #000000 !important;
padding-top: 15px;
padding-bottom: 15px;
font-weight: 400;
font-family: Inter;
}
.rt-tr {
padding-top: 5px;
padding-bottom: 5px;
}
.rt-pagination {
margin: 0;
background: #171e25;
opacity: 0.5;
border-bottom: 1px solid #C4CDD5;
border-top: 1px solid #C4CDD5;
}
.btn, .btn-default {
color: #FFF;
border: none;
}
.btn:hover {
background-color: #222b36;
}
.downloadrow {
text-align: center;
}
.disclaimer {
font-family: Inter;
font-size: 14px;
font-style: normal;
font-weight: 400;
line-height: 24px;
letter-spacing: 0em;
text-align: left;
display: float;
color: #919EAB;
}
#inputaddy > .form-group {
margin-bottom: 0;
}
#connect {
color: #5484F8;
background: #141920;
border: none;
padding: 0;
font-family: Roboto Mono;
#randomaddy {
margin-left: 10px;
margin-right: 10px;
}
#connect:hover {
color: #CACEF0 !important;
background-color: transparent !important;
#leftbox {
border: 2px #E2E4F7 solid;
border-radius: 8px;
padding: 3px;
background-color: #ffffff99;
margin-top: 28px;
padding-top: 15px;
padding-bottom: 10px;
}
#botrightbox {
border: 2px #E2E4F7 solid;
border-radius: 8px;
padding: 3px;
background-color: #ffffff99;
margin-top: 20px;
padding-top: 15px;
padding-bottom: 10px;
}
#terraddress > div > button {
color: #7F8CED;
background-color: #10151A;
border-radius: 4px;
border: none;
margin-top: 15px;
margin-bottom: 15px;
padding: 30px;
min-width: 100%;
svg {
max-height: 485px;
margin: auto;
display: block;
}
#connectpop > div > div > div.modal-header > button > span {
color: white !important;
font-size: 2em;
#wheelpart {
background-color: transparent;
position: relative;
margin-top: 16px;
}
.modal-content {
background-color: #171e25 !important;
color: #FFF !important;
#svgout {
position: absolute;
width: 100%;
height: 100%;
top: 0;
left: 0;
}
.modal-body {
#score {
text-align: center;
padding-left: 10%;
padding-right: 10%;
font-family: Orbitron;
font-size: 48px;
z-index: 9;
}
.modal-header {
#scorehist {
margin-bottom: -38px;
}
/* make the slider more reasonably - color wise
These are the ticks and text of the sliders
.irs-grid-pol, .irs-grid-text
*/
.irs {
font-family: Roboto Mono !important;
}
/* make the slider more reasonably - color wise */
.irs-line {
background-color: #E2E4F7 !important;
}
.irs-grid-pol.small {
visibility: hidden !important;
}
.irs-min, .irs-max, .irs-from, .irs-to {
font-size: .9em !important;
top: 6px !important;
}
.irs-max, .irs-min {
color: #686973 !important;
}
.irs-to, .irs-handle, .irs-from, .irs-max, .irs-min, .irs--sharp .irs-bar, .irs-single {
background-color: #26D994 !important;
}
.irs-handle:hover {
opacity: 75%;
background-color: #26D994 !important;
}
.irs--round .irs-bar {
background-color: #26D994;
}
.irs-handle>i:first-child {
border-top-color: #9945FF !important;
}
.irs-handle>i:first-child:hover, .irs-to:before, .irs-from:before, .irs-single:before {
border-top-color: transparent !important;
}
.irs-handle {
border: none !important;
}
.modal-footer {
visibility: hidden;
.irs-grid {
visibility: hidden !important;
font-size: 0;
height: 0;
width: 0;
}
.irs-grid-text {
visibility: hidden !important;
visibility: hidden !important;
font-size: 0;
height: 0;
width: 0;
}
.irs--round .irs-handle {
border: none !important;
top: 28px;
width: 20px;
height: 20px;
}
.top-banner {
background: #12161b;
height: 48px;
left: 0;
position: absolute;
top: 0;
.metric {
font-family: 'Exo 2';
text-align: center;
width: 100%;
font-size: 1.25em;
background: -webkit-linear-gradient(#9945FF, #14F195);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.top-banner > section {
align-items: center;
display: flex;
height: 100%;
justify-content: space-between;
margin: 0 auto;
max-width: 900px;
.metricname {
font-family: Orbitron;
color: #9945FF;
text-align: center;
width: 100%;
font-size: .8em;
padding-bottom: 10px;
}
.top-banner a {
background-color: transparent;
color: #FFF;
#bdnldscores, #dnldscores {
text-align: center;
margin: auto;
}
.top-banner a:hover, .top-banner a:active {
color: #FFF;
text-decoration: none;
.score {
font-family: 'Exo 2';
text-align: center;
width: 100%;
font-size: 1.7em;
background: -webkit-linear-gradient(#9945FF, #14F195);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.fs-logo {
padding-left: 5px;
.yourscore {
font-family: Orbitron;
color: #9945FF;
text-align: center;
width: 100%;
font-size: 1.1em;
padding-bottom: 10px;
}
.boxtitle {
text-align: center;
font-size: 1em;
font-family: Orbitron;
margin-bottom: 10px;
}
.aboutlinks {
padding-left: 20px;
padding-bottom: 15px;
}
.socials {
align-items: center;
.metricrow {
margin: 5px;
display: flex;
}
.socials a {
display: inline-block;
margin: 0 0.5em;
overflow: hidden;
text-indent: -9999px;
white-space: nowrap;
width: 24px;
.metricholder {
width: 25%;
}
.socials a:last-child {
margin-right: 0;
overflow: visible;
text-indent: 0;
width: auto;
.metricholder2 {
width: 33%;
}
.socials a:last-child::before {
content: "|";
margin: 0 0.5em;
#indent {
text-align: center;
padding-bottom: 4px;
font-size: .85em;
}
.twitter {
background: url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M8.94 18.7051C11.4989 18.7212 13.9577 17.7118 15.7672 15.9023C17.5767 14.0928 18.5861 11.634 18.57 9.0751V8.6326C19.2267 8.15147 19.7951 7.56023 20.25 6.8851C19.6316 7.15555 18.9773 7.33491 18.3075 7.4176C19.0177 6.99444 19.5506 6.32835 19.8075 5.5426C19.1456 5.93968 18.4199 6.21883 17.6625 6.3676C16.6139 5.25027 14.9461 4.97529 13.5943 5.69684C12.2425 6.41839 11.5428 7.95705 11.8875 9.4501C9.16635 9.31653 6.63036 8.03218 4.9125 5.9176C4.02372 7.46019 4.4828 9.42766 5.9625 10.4176C5.43646 10.3973 4.92259 10.2534 4.4625 9.9976V10.0351C4.45287 11.6359 5.56204 13.0263 7.125 13.3726C6.63573 13.5042 6.12322 13.5247 5.625 13.4326C6.07495 14.7902 7.33014 15.7181 8.76 15.7501C7.56691 16.7105 6.08407 17.2391 4.5525 17.2501C4.28396 17.2423 4.01606 17.2198 3.75 17.1826C5.30022 18.1703 7.1019 18.691 8.94 18.6826' fill='%23F4F6F8'/%3E%3C/svg%3E%0A") no-repeat center center;
#sliderbox {
margin-left: 14%;
margin-right: 14%;
}
.linkedin {
background: url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M19.6575 3.00002H4.3425C3.61669 2.99566 3.02038 3.57199 3 4.29752V19.65C3.01639 20.3773 3.61508 20.9559 4.3425 20.9475H19.6575C20.3849 20.9559 20.9836 20.3773 21 19.65V4.29752C20.9796 3.57199 20.3833 2.99566 19.6575 3.00002ZM8.3325 18.3075H5.6925V9.75002H8.3325V18.3075ZM7.0425 8.55752C6.19951 8.55777 5.51036 7.88527 5.49 7.04252C5.47516 6.6264 5.63396 6.22284 5.92839 5.92841C6.22282 5.63398 6.62638 5.47519 7.0425 5.49002C7.8561 5.54668 8.48716 6.2232 8.48716 7.03877C8.48716 7.85435 7.8561 8.53087 7.0425 8.58752V8.55752ZM18.36 18.255H15.75V14.07C15.75 13.0725 15.75 11.775 14.355 11.775C12.96 11.775 12.75 12.87 12.75 13.9725V18.21H10.08V9.75002H12.57V10.875H12.6225C13.1428 9.97149 14.1234 9.43343 15.165 9.48002C17.8575 9.48002 18.36 11.28 18.36 13.5675V18.255Z' fill='%23F4F6F8'/%3E%3C/svg%3E%0A") no-repeat center center;
#hovernote {
font-style: italic;
text-align: center;
font-size: .85em;
color: #56575E;
}
.discord {
background: url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M10.2354 11.1801C10.0175 11.1617 9.79902 11.2095 9.60868 11.3172C9.41833 11.425 9.26496 11.5877 9.16863 11.7841C9.07229 11.9804 9.0375 12.2013 9.06879 12.4178C9.10008 12.6343 9.19601 12.8363 9.34401 12.9973C9.492 13.1584 9.68518 13.271 9.89825 13.3205C10.1113 13.3699 10.3344 13.3539 10.5382 13.2744C10.742 13.195 10.917 13.0559 11.0405 12.8753C11.1639 12.6948 11.2299 12.4811 11.2299 12.2624C11.2358 12.126 11.2147 11.9898 11.1678 11.8616C11.121 11.7334 11.0493 11.6157 10.957 11.5151C10.8646 11.4146 10.7533 11.3333 10.6295 11.2758C10.5057 11.2184 10.3718 11.1858 10.2354 11.1801ZM13.7942 11.1801C13.5762 11.1617 13.3578 11.2095 13.1674 11.3172C12.9771 11.425 12.8237 11.5877 12.7274 11.7841C12.631 11.9804 12.5962 12.2013 12.6275 12.4178C12.6588 12.6343 12.7548 12.8363 12.9028 12.9973C13.0508 13.1584 13.2439 13.271 13.457 13.3205C13.6701 13.3699 13.8931 13.3539 14.0969 13.2744C14.3007 13.195 14.4758 13.0559 14.5992 12.8753C14.7226 12.6948 14.7887 12.4811 14.7887 12.2624C14.7945 12.126 14.7734 11.9898 14.7266 11.8616C14.6797 11.7334 14.6081 11.6157 14.5157 11.5151C14.4234 11.4146 14.3121 11.3333 14.1883 11.2758C14.0645 11.2184 13.9306 11.1858 13.7942 11.1801Z' fill='%23F4F6F8'/%3E%3Cpath d='M18.5325 3H5.46751C5.20438 3.00063 4.94396 3.05308 4.70111 3.15436C4.45826 3.25564 4.23774 3.40376 4.05213 3.59027C3.86653 3.77678 3.71948 3.99802 3.61939 4.24136C3.51929 4.4847 3.46811 4.74538 3.46876 5.0085V18.1905C3.46811 18.4536 3.51929 18.7143 3.61939 18.9576C3.71948 19.201 3.86653 19.4222 4.05213 19.6087C4.23774 19.7952 4.45826 19.9434 4.70111 20.0446C4.94396 20.1459 5.20438 20.1984 5.46751 20.199H16.524L16.0073 18.3953L17.2553 19.5555L18.435 20.6475L20.5313 22.5V5.0085C20.5319 4.74538 20.4807 4.4847 20.3806 4.24136C20.2805 3.99802 20.1335 3.77678 19.9479 3.59027C19.7623 3.40376 19.5418 3.25564 19.2989 3.15436C19.0561 3.05308 18.7956 3.00063 18.5325 3ZM14.769 15.7335C14.769 15.7335 14.418 15.3142 14.1255 14.9437C14.8322 14.7774 15.4573 14.3664 15.8903 13.7835C15.5394 14.017 15.1633 14.21 14.769 14.3588C14.3154 14.5524 13.8411 14.693 13.3553 14.778C12.5202 14.9317 11.6638 14.9284 10.83 14.7682C10.3405 14.6725 9.86073 14.5321 9.39676 14.349C9.15219 14.255 8.91437 14.1442 8.68501 14.0175C8.65576 13.998 8.62651 13.9882 8.59726 13.9688C8.58259 13.9614 8.56937 13.9515 8.55826 13.9395C8.38276 13.842 8.28526 13.7738 8.28526 13.7738C8.70251 14.3444 9.30604 14.7514 9.99151 14.9242C9.69901 15.2948 9.33826 15.7335 9.33826 15.7335C8.75909 15.7491 8.18497 15.6221 7.66642 15.3636C7.14787 15.1052 6.70078 14.7233 6.36451 14.2515C6.39616 12.2749 6.87623 10.3313 7.76851 8.56725C8.55372 7.95055 9.51103 7.59283 10.5083 7.5435L10.6058 7.6605C9.66755 7.89268 8.79203 8.32877 8.04151 8.93775C8.04151 8.93775 8.25601 8.82075 8.61676 8.655C9.3176 8.33509 10.0645 8.12779 10.83 8.04075C10.8846 8.02945 10.94 8.02293 10.9958 8.02125C11.6491 7.93613 12.3103 7.92958 12.9653 8.00175C13.9952 8.11938 14.9922 8.43735 15.9 8.93775C15.1875 8.3578 14.36 7.93574 13.4723 7.6995L13.6088 7.5435C14.606 7.59283 15.5633 7.95055 16.3485 8.56725C17.2408 10.3313 17.7209 12.2749 17.7525 14.2515C17.4135 14.7229 16.9645 15.1043 16.4446 15.3625C15.9246 15.6208 15.3494 15.7482 14.769 15.7335Z' fill='%23F4F6F8'/%3E%3C/svg%3E%0A") no-repeat center center;
}
.small-text {
font-size: 12px;
.load-container {
margin-top: 200px;
}

View File

@ -0,0 +1,13 @@
<svg width="101" height="88" viewBox="0 0 101 88" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M100.48 69.3817L83.8068 86.8015C83.4444 87.1799 83.0058 87.4816 82.5185 87.6878C82.0312 87.894 81.5055 88.0003 80.9743 88H1.93563C1.55849 88 1.18957 87.8926 0.874202 87.6912C0.558829 87.4897 0.31074 87.2029 0.160416 86.8659C0.0100923 86.529 -0.0359181 86.1566 0.0280382 85.7945C0.0919944 85.4324 0.263131 85.0964 0.520422 84.8278L17.2061 67.408C17.5676 67.0306 18.0047 66.7295 18.4904 66.5234C18.9762 66.3172 19.5002 66.2104 20.0301 66.2095H99.0644C99.4415 66.2095 99.8104 66.3169 100.126 66.5183C100.441 66.7198 100.689 67.0067 100.84 67.3436C100.99 67.6806 101.036 68.0529 100.972 68.415C100.908 68.7771 100.737 69.1131 100.48 69.3817ZM83.8068 34.3032C83.4444 33.9248 83.0058 33.6231 82.5185 33.4169C82.0312 33.2108 81.5055 33.1045 80.9743 33.1048H1.93563C1.55849 33.1048 1.18957 33.2121 0.874202 33.4136C0.558829 33.6151 0.31074 33.9019 0.160416 34.2388C0.0100923 34.5758 -0.0359181 34.9482 0.0280382 35.3103C0.0919944 35.6723 0.263131 36.0083 0.520422 36.277L17.2061 53.6968C17.5676 54.0742 18.0047 54.3752 18.4904 54.5814C18.9762 54.7875 19.5002 54.8944 20.0301 54.8952H99.0644C99.4415 54.8952 99.8104 54.7879 100.126 54.5864C100.441 54.3849 100.689 54.0981 100.84 53.7612C100.99 53.4242 101.036 53.0518 100.972 52.6897C100.908 52.3277 100.737 51.9917 100.48 51.723L83.8068 34.3032ZM1.93563 21.7905H80.9743C81.5055 21.7907 82.0312 21.6845 82.5185 21.4783C83.0058 21.2721 83.4444 20.9704 83.8068 20.592L100.48 3.17219C100.737 2.90357 100.908 2.56758 100.972 2.2055C101.036 1.84342 100.99 1.47103 100.84 1.13408C100.689 0.79713 100.441 0.510296 100.126 0.308823C99.8104 0.107349 99.4415 1.24074e-05 99.0644 0L20.0301 0C19.5002 0.000878397 18.9762 0.107699 18.4904 0.313848C18.0047 0.519998 17.5676 0.821087 17.2061 1.19848L0.524723 18.6183C0.267681 18.8866 0.0966198 19.2223 0.0325185 19.5839C-0.0315829 19.9456 0.0140624 20.3177 0.163856 20.6545C0.31365 20.9913 0.561081 21.2781 0.875804 21.4799C1.19053 21.6817 1.55886 21.7896 1.93563 21.7905Z" fill="url(#paint0_linear_174_4403)"/>
<defs>
<linearGradient id="paint0_linear_174_4403" x1="8.52558" y1="90.0973" x2="88.9933" y2="-3.01622" gradientUnits="userSpaceOnUse">
<stop offset="0.08" stop-color="#9945FF"/>
<stop offset="0.3" stop-color="#8752F3"/>
<stop offset="0.5" stop-color="#5497D5"/>
<stop offset="0.6" stop-color="#43B4CA"/>
<stop offset="0.72" stop-color="#28E0B9"/>
<stop offset="0.97" stop-color="#19FB9B"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@ -0,0 +1,101 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 27.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 1006.5 149.1" style="enable-background:new 0 0 1006.5 149.1;" xml:space="preserve">
<style type="text/css">
.st0{enable-background:new ;}
</style>
<g class="st0">
<path d="M20.8,84c-2.8,0-5.3-0.6-7.5-1.9c-2.3-1.2-4.1-2.9-5.5-4.9c-1.4-2.1-2.1-4.3-2.1-6.8v-5.4h14.3v4.8c0,0.3,0.1,0.6,0.4,0.8
c0.3,0.2,0.6,0.3,0.9,0.3h46.8c0.4,0,0.7-0.1,0.9-0.3c0.3-0.2,0.4-0.5,0.4-0.8V56.5c0-0.3-0.1-0.6-0.4-0.8
c-0.3-0.2-0.6-0.3-0.9-0.3H20.8c-2.8,0-5.3-0.6-7.5-1.9c-2.3-1.2-4.1-2.9-5.5-4.9c-1.4-2.1-2.1-4.3-2.1-6.9V27.3
c0-2.5,0.7-4.7,2.1-6.8c1.4-2.1,3.2-3.7,5.5-4.9c2.3-1.2,4.8-1.9,7.5-1.9h48c2.8,0,5.3,0.6,7.5,1.9c2.3,1.2,4.1,2.9,5.5,4.9
c1.4,2.1,2.1,4.3,2.1,6.8v5.4H69.5v-4.8c0-0.3-0.1-0.6-0.4-0.8c-0.3-0.2-0.6-0.3-0.9-0.3H21.4c-0.4,0-0.7,0.1-0.9,0.3
c-0.3,0.2-0.4,0.5-0.4,0.8v13.4c0,0.3,0.1,0.6,0.4,0.8c0.3,0.2,0.6,0.3,0.9,0.3h47.4c2.8,0,5.3,0.6,7.5,1.9
c2.3,1.2,4.1,2.9,5.5,4.9c1.4,2.1,2.1,4.3,2.1,6.9v14.5c0,2.5-0.7,4.7-2.1,6.8c-1.4,2.1-3.2,3.7-5.5,4.9c-2.3,1.2-4.8,1.9-7.5,1.9
H20.8z"/>
<path d="M113.9,84c-2.8,0-5.3-0.6-7.5-1.9c-2.3-1.2-4.1-2.9-5.5-4.9c-1.4-2.1-2.1-4.3-2.1-6.8V27.3c0-2.5,0.7-4.7,2.1-6.8
c1.4-2.1,3.2-3.7,5.5-4.9c2.3-1.2,4.8-1.9,7.5-1.9h48c2.8,0,5.3,0.6,7.5,1.9c2.3,1.2,4.1,2.9,5.5,4.9c1.4,2.1,2.1,4.3,2.1,6.8v43.2
c0,2.5-0.7,4.7-2.1,6.8c-1.4,2.1-3.2,3.7-5.5,4.9c-2.3,1.2-4.8,1.9-7.5,1.9H113.9z M114.4,71h46.7c0.4,0,0.7-0.1,1-0.3
c0.3-0.2,0.4-0.5,0.4-0.8v-42c0-0.3-0.1-0.6-0.4-0.8c-0.3-0.2-0.6-0.3-1-0.3h-46.7c-0.4,0-0.7,0.1-0.9,0.3
c-0.3,0.2-0.4,0.5-0.4,0.8v42c0,0.3,0.1,0.6,0.4,0.8C113.8,70.9,114.1,71,114.4,71z"/>
<path d="M192.3,84V13.6h14.3V71h63.8v13H192.3z"/>
<path d="M280.2,27.3c0-2.5,0.7-4.7,2.1-6.8c1.4-2.1,3.2-3.7,5.5-4.9c2.3-1.2,4.8-1.9,7.5-1.9h47.9c2.8,0,5.3,0.6,7.6,1.9
c2.3,1.2,4.2,2.9,5.5,4.9c1.4,2.1,2.1,4.3,2.1,6.8V84H344V60.4h-49.4V84h-14.3V27.3z M344,47.5V27.9c0-0.3-0.1-0.6-0.4-0.8
c-0.3-0.2-0.6-0.3-1-0.3h-46.7c-0.4,0-0.7,0.1-0.9,0.3c-0.3,0.2-0.4,0.5-0.4,0.8v19.6H344z"/>
<path d="M374.1,84V13.8h63c2.8,0,5.3,0.6,7.6,1.9c2.3,1.2,4.2,2.9,5.5,4.9c1.4,2.1,2.1,4.3,2.1,6.8v19c0,2.5-0.7,4.8-2.1,6.8
c-1.4,2.1-3.2,3.7-5.5,4.9c-2.3,1.2-4.9,1.8-7.6,1.8L388.4,60v24H374.1z M389.7,46.9h46.7c0.4,0,0.7-0.1,1-0.3
c0.3-0.2,0.4-0.5,0.4-0.8v-18c0-0.3-0.1-0.6-0.4-0.8c-0.3-0.2-0.6-0.3-1-0.3h-46.7c-0.4,0-0.7,0.1-0.9,0.3
c-0.3,0.2-0.4,0.5-0.4,0.8v18c0,0.3,0.1,0.6,0.4,0.8C389,46.8,389.3,46.9,389.7,46.9z M436.4,84l-23.6-25.3h18.8L452,80.4V84H436.4
z"/>
<path d="M481.7,84c-2.8,0-5.3-0.6-7.5-1.9c-2.3-1.2-4.1-2.9-5.5-4.9c-1.4-2.1-2.1-4.3-2.1-6.8v-5.4h14.3v4.8c0,0.3,0.1,0.6,0.4,0.8
c0.3,0.2,0.6,0.3,0.9,0.3H529c0.4,0,0.7-0.1,0.9-0.3c0.3-0.2,0.4-0.5,0.4-0.8V56.5c0-0.3-0.1-0.6-0.4-0.8c-0.3-0.2-0.6-0.3-0.9-0.3
h-47.3c-2.8,0-5.3-0.6-7.5-1.9c-2.3-1.2-4.1-2.9-5.5-4.9c-1.4-2.1-2.1-4.3-2.1-6.9V27.3c0-2.5,0.7-4.7,2.1-6.8
c1.4-2.1,3.2-3.7,5.5-4.9c2.3-1.2,4.8-1.9,7.5-1.9h48c2.8,0,5.3,0.6,7.5,1.9c2.3,1.2,4.1,2.9,5.5,4.9c1.4,2.1,2.1,4.3,2.1,6.8v5.4
h-14.4v-4.8c0-0.3-0.1-0.6-0.4-0.8c-0.3-0.2-0.6-0.3-0.9-0.3h-46.8c-0.4,0-0.7,0.1-0.9,0.3c-0.3,0.2-0.4,0.5-0.4,0.8v13.4
c0,0.3,0.1,0.6,0.4,0.8c0.3,0.2,0.6,0.3,0.9,0.3h47.4c2.8,0,5.3,0.6,7.5,1.9c2.3,1.2,4.1,2.9,5.5,4.9c1.4,2.1,2.1,4.3,2.1,6.9v14.5
c0,2.5-0.7,4.7-2.1,6.8c-1.4,2.1-3.2,3.7-5.5,4.9c-2.3,1.2-4.8,1.9-7.5,1.9H481.7z"/>
<path d="M574.9,84c-2.8,0-5.3-0.6-7.5-1.9c-2.3-1.2-4.1-2.9-5.5-4.9c-1.4-2.1-2.1-4.3-2.1-6.8V27.3c0-2.5,0.7-4.7,2.1-6.8
c1.4-2.1,3.2-3.7,5.5-4.9c2.3-1.2,4.8-1.9,7.5-1.9h62.9v13H578c-1.2,0-2.1,0.3-2.8,0.9c-0.7,0.6-1,1.4-1,2.5v37.5
c0,1,0.3,1.9,1,2.5c0.7,0.6,1.6,0.9,2.8,0.9h59.8v13H574.9z"/>
<path d="M667.2,84c-2.8,0-5.3-0.6-7.5-1.9c-2.3-1.2-4.1-2.9-5.5-4.9c-1.4-2.1-2.1-4.3-2.1-6.8V27.3c0-2.5,0.7-4.7,2.1-6.8
c1.4-2.1,3.2-3.7,5.5-4.9c2.3-1.2,4.8-1.9,7.5-1.9h48c2.8,0,5.3,0.6,7.5,1.9c2.3,1.2,4.1,2.9,5.5,4.9c1.4,2.1,2.1,4.3,2.1,6.8v43.2
c0,2.5-0.7,4.7-2.1,6.8c-1.4,2.1-3.2,3.7-5.5,4.9c-2.3,1.2-4.8,1.9-7.5,1.9H667.2z M667.8,71h46.7c0.4,0,0.7-0.1,1-0.3
c0.3-0.2,0.4-0.5,0.4-0.8v-42c0-0.3-0.1-0.6-0.4-0.8c-0.3-0.2-0.6-0.3-1-0.3h-46.7c-0.4,0-0.7,0.1-0.9,0.3
c-0.3,0.2-0.4,0.5-0.4,0.8v42c0,0.3,0.1,0.6,0.4,0.8C667.1,70.9,667.4,71,667.8,71z"/>
<path d="M745.5,84V13.8h63c2.8,0,5.3,0.6,7.6,1.9c2.3,1.2,4.2,2.9,5.5,4.9c1.4,2.1,2.1,4.3,2.1,6.8v19c0,2.5-0.7,4.8-2.1,6.8
c-1.4,2.1-3.2,3.7-5.5,4.9c-2.3,1.2-4.9,1.8-7.6,1.8L759.8,60v24H745.5z M761.1,46.9h46.7c0.4,0,0.7-0.1,1-0.3
c0.3-0.2,0.4-0.5,0.4-0.8v-18c0-0.3-0.1-0.6-0.4-0.8c-0.3-0.2-0.6-0.3-1-0.3h-46.7c-0.4,0-0.7,0.1-0.9,0.3
c-0.3,0.2-0.4,0.5-0.4,0.8v18c0,0.3,0.1,0.6,0.4,0.8C760.5,46.8,760.8,46.9,761.1,46.9z M807.8,84l-23.6-25.3H803l20.4,21.7V84
H807.8z"/>
<path d="M838.6,84V13.7h72v13H853v15.6h46.3v13.1H853V71h57.5v13H838.6z"/>
<path d="M925,84V13.7h63c2.8,0,5.3,0.6,7.6,1.9c2.3,1.2,4.2,2.9,5.5,4.9c1.4,2.1,2.1,4.3,2.1,6.8v43.2c0,2.5-0.7,4.7-2.1,6.8
c-1.4,2.1-3.2,3.7-5.5,4.9c-2.3,1.2-4.9,1.9-7.6,1.9H925z M940.5,71h46.8c0.4,0,0.7-0.1,1-0.3c0.3-0.2,0.4-0.5,0.4-0.8v-42
c0-0.3-0.1-0.6-0.4-0.8c-0.3-0.2-0.6-0.3-1-0.3h-46.8c-0.4,0-0.7,0.1-0.9,0.3c-0.3,0.2-0.4,0.5-0.4,0.8v42c0,0.3,0.1,0.6,0.4,0.8
C939.8,70.9,940.1,71,940.5,71z"/>
</g>
<g class="st0">
<path d="M752.5,111.3c2.6,0,4.7,0.2,6.2,0.6c1.5,0.4,2.7,1.1,3.3,2.1s1,2.4,1,4.3c0,1.9-0.4,3.4-1.2,4.4c-0.8,1-2.2,1.6-4,1.7v0.2
c2.3,0.2,3.9,0.9,4.8,2.1c0.9,1.2,1.4,2.9,1.4,5c0,1.8-0.4,3.3-1.1,4.3c-0.7,1-1.8,1.7-3.3,2.1c-1.5,0.4-3.4,0.6-5.8,0.6
c-1.9,0-3.6,0-5,0c-1.4,0-2.7,0-4-0.1c-1.2-0.1-2.4-0.1-3.7-0.2l0.6-4.1c0.7,0,2,0.1,4,0.1c2,0,4.3,0,6.9,0c1.2,0,2.2-0.1,2.9-0.3
c0.7-0.2,1.2-0.6,1.4-1.1c0.3-0.6,0.4-1.4,0.4-2.4c0-1.1-0.1-2-0.4-2.5c-0.3-0.6-0.8-1-1.5-1.2s-1.7-0.4-2.9-0.4h-10.8v-3.8h10.7
c1.1,0,1.9-0.1,2.5-0.3c0.6-0.2,1.1-0.5,1.3-1c0.3-0.5,0.4-1.2,0.4-2.2c0-1-0.1-1.7-0.4-2.2c-0.3-0.5-0.7-0.8-1.4-1
c-0.7-0.2-1.6-0.3-2.8-0.3c-1.6,0-3,0-4.3,0c-1.2,0-2.3,0-3.3,0c-1,0-1.9,0-2.7,0.1l-0.6-4.1c1.2-0.1,2.3-0.2,3.3-0.2
c1.1,0,2.3-0.1,3.5-0.1C749.4,111.3,750.8,111.3,752.5,111.3z M747.7,111.6v26.8h-6.5v-26.8H747.7z"/>
</g>
<g class="st0">
<path d="M792.7,111.6l-10.1,18.3h-6.2l-10.1-18.3h6.9l5,9.9c0.3,0.5,0.5,1.1,0.6,1.7c0.2,0.6,0.3,1.2,0.5,1.7h0.4
c0.2-0.5,0.3-1.1,0.5-1.7c0.2-0.6,0.4-1.2,0.6-1.7l5-9.9H792.7z M782.8,126.3v12.1h-6.6v-12.1H782.8z"/>
</g>
<g class="st0">
<path d="M812.6,111.5c1.5,0,3.1,0,4.7,0c1.6,0,3.2,0.1,4.7,0.1c1.5,0.1,3,0.2,4.3,0.3l-0.3,4.3h-10.8c-0.8,0-1.4,0.2-1.8,0.5
c-0.4,0.3-0.6,0.8-0.6,1.5v20.3h-6.6V117c0-1.7,0.6-3,1.8-4C809.1,112,810.7,111.5,812.6,111.5z M806.9,122.9h17.4v4.2h-17.4V122.9
z"/>
<path d="M838.1,111.6v20.1c0,0.6,0.2,1.1,0.6,1.5c0.4,0.3,1,0.5,1.7,0.5h10.4l0.3,4.5c-2,0.2-4.2,0.3-6.4,0.4
c-2.2,0-4.5,0.1-6.7,0.1c-2.2,0-3.8-0.5-4.9-1.6s-1.7-2.4-1.7-4v-21.4H838.1z"/>
<path d="M862.6,111.6v26.8H856v-26.8H862.6z"/>
<path d="M881.3,111.2c2.8,0,5,0.3,6.6,0.8c1.6,0.5,2.7,1.4,3.4,2.7c0.7,1.3,1,3,1,5.3c0,2.3-0.3,4.1-1,5.3
c-0.6,1.3-1.7,2.2-3.2,2.7c-1.5,0.5-3.5,0.8-6,0.8c-1.3,0-2.6-0.1-3.9-0.2c-1.3-0.1-2.4-0.2-3.5-0.4c-1.1-0.2-2-0.3-2.8-0.5
s-1.3-0.3-1.6-0.5l0.1-3c1.7,0,3.5,0,5.3,0c1.8,0,3.6,0,5.4,0c1.2,0,2.1-0.2,2.7-0.4c0.6-0.2,1.1-0.7,1.4-1.3
c0.3-0.6,0.4-1.5,0.4-2.6c0-1.1-0.1-2-0.4-2.6c-0.3-0.6-0.7-1.1-1.4-1.3s-1.5-0.4-2.7-0.4c-2.7,0-4.9,0-6.8,0
c-1.9,0-3.2,0.1-3.8,0.2l-0.6-4.3c1.2-0.1,2.3-0.2,3.4-0.3c1.1-0.1,2.2-0.1,3.5-0.1C878,111.2,879.5,111.2,881.3,111.2z
M876.5,111.6v26.8h-6.6v-26.8H876.5z"/>
<path d="M907.7,111.1c1.5,0,3.1,0.1,4.8,0.2s3.4,0.4,5.1,0.9l-0.4,3.9c-1.3,0-2.8-0.1-4.5-0.1s-3.4,0-5,0c-0.8,0-1.5,0-2.1,0.1
s-1,0.1-1.4,0.3c-0.3,0.2-0.6,0.4-0.7,0.8s-0.2,0.8-0.2,1.4c0,0.9,0.2,1.6,0.7,2c0.5,0.4,1.3,0.8,2.4,1.1l5.7,1.7
c2.4,0.7,4,1.7,5,3c0.9,1.2,1.4,2.9,1.4,4.9c0,1.5-0.2,2.8-0.6,3.8c-0.4,1-1,1.8-1.9,2.4c-0.9,0.6-2,1-3.4,1.2
c-1.4,0.2-3.1,0.4-5.2,0.4c-1,0-2.4-0.1-4.2-0.2s-3.9-0.4-6.2-0.9l0.4-4.2c1.7,0,3.2,0.1,4.4,0.1c1.3,0,2.3,0.1,3.2,0.1
c0.9,0,1.7,0,2.3,0c1.2,0,2.1-0.1,2.7-0.2s1.1-0.4,1.4-0.8c0.3-0.4,0.4-0.9,0.4-1.7c0-0.6-0.1-1.1-0.3-1.5
c-0.2-0.4-0.5-0.7-0.9-0.9s-1-0.4-1.7-0.6l-6.1-1.9c-2.3-0.8-3.9-1.7-4.8-3c-1-1.2-1.4-2.8-1.4-4.8c0-1.6,0.2-2.8,0.6-3.8
c0.4-1,1.1-1.7,1.9-2.3c0.9-0.5,2-0.9,3.4-1.1S905.7,111.1,907.7,111.1z"/>
<path d="M931,111.6v26.8h-6.6v-26.8H931z"/>
<path d="M950,111.2c2.4,0,4.4,0.2,6,0.7c1.6,0.5,2.9,1.2,3.9,2.2c1,1,1.7,2.4,2.2,4.2c0.5,1.8,0.7,4,0.7,6.7c0,2.7-0.2,4.9-0.7,6.7
c-0.5,1.8-1.2,3.2-2.2,4.2c-1,1-2.3,1.8-3.9,2.2s-3.6,0.7-6,0.7c-2.3,0-4.4,0-6.3-0.1c-1.9-0.1-3.7-0.2-5.4-0.3l2.8-4.4
c1.1,0.1,2.4,0.1,3.9,0.1c1.5,0,3.2,0.1,5,0.1c1.5,0,2.6-0.3,3.5-0.8s1.5-1.5,1.8-2.8c0.4-1.3,0.5-3.2,0.5-5.6
c0-2.4-0.2-4.3-0.5-5.6s-1-2.3-1.8-2.8c-0.8-0.5-2-0.8-3.5-0.8c-1.8,0-3.3,0-4.7,0c-1.4,0-2.7,0-4.1,0l-2.9-4.2
c1.7-0.1,3.5-0.2,5.4-0.3C945.6,111.3,947.7,111.2,950,111.2z M944.9,111.6v26.8h-6.6v-26.8H944.9z"/>
<path d="M975.2,111.5c1.6,0,3.2,0,4.9,0c1.6,0,3.3,0,4.8,0.1c1.6,0.1,3.1,0.1,4.5,0.3l-0.3,4.3h-11.5c-0.7,0-1.3,0.2-1.6,0.5
c-0.4,0.3-0.5,0.8-0.5,1.5v13.7c0,0.6,0.2,1.1,0.5,1.5c0.4,0.3,0.9,0.5,1.6,0.5H989l0.3,4.3c-1.4,0.1-2.9,0.2-4.5,0.3
c-1.6,0.1-3.2,0.1-4.8,0.1c-1.6,0-3.3,0-4.9,0c-1.9,0-3.4-0.5-4.6-1.5c-1.2-1-1.8-2.3-1.8-3.9v-16.3c0-1.6,0.6-2.9,1.8-3.9
S973.3,111.5,975.2,111.5z M969.6,122.4h17.8v4.2h-17.8V122.4z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.1 KiB

View File

@ -1,12 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 24.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill-rule:evenodd;clip-rule:evenodd;fill:#7D86C1;}
</style>
<path class="st0" d="M8.9,18.7c2.6,0,5-1,6.8-2.8s2.8-4.3,2.8-6.8V8.6c0.7-0.5,1.2-1.1,1.7-1.7c-0.6,0.3-1.3,0.4-1.9,0.5
C19,7,19.6,6.3,19.8,5.5c-0.7,0.4-1.4,0.7-2.1,0.8c-1-1.1-2.7-1.4-4.1-0.7S11.5,8,11.9,9.5C9.2,9.3,6.6,8,4.9,5.9
C4,7.5,4.5,9.4,6,10.4c-0.5,0-1-0.2-1.5-0.4v0c0,1.6,1.1,3,2.7,3.3c-0.5,0.1-1,0.2-1.5,0.1c0.4,1.4,1.7,2.3,3.1,2.3
c-1.2,1-2.7,1.5-4.2,1.5c-0.3,0-0.5,0-0.8-0.1C5.3,18.2,7.1,18.7,8.9,18.7"/>
</svg>

Before

Width:  |  Height:  |  Size: 860 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 817 KiB