From fcf634df68063375d9a48ef3805db059ea40a2f4 Mon Sep 17 00:00:00 2001 From: g1nt0ki <99907941+g1nt0ki@users.noreply.github.com> Date: Mon, 13 Mar 2023 10:37:37 +0100 Subject: [PATCH] add uwu.cash --- projects/citycoins/index.js | 80 +++++---------------------------- projects/helper/chain/stacks.js | 50 +++++++++++++++++++++ projects/helper/sumTokens.js | 1 + projects/helper/tokenMapping.js | 2 +- projects/uwu-cash/index.js | 11 +++++ 5 files changed, 73 insertions(+), 71 deletions(-) create mode 100644 projects/helper/chain/stacks.js create mode 100644 projects/uwu-cash/index.js diff --git a/projects/citycoins/index.js b/projects/citycoins/index.js index 0a9d8a2cc..30c82bc51 100644 --- a/projects/citycoins/index.js +++ b/projects/citycoins/index.js @@ -1,8 +1,4 @@ -const { get } = require('../helper/http') -const BigNumber = require('bignumber.js') -const sdk = require('@defillama/sdk') - -const STACKS_API = 'https://stacks-node-api.mainnet.stacks.co/extended/v1/address' +const { sumTokensExport, nullAddress } = require('../helper/sumTokens') const NYC_CONTRACT = 'SP2H8PY27SEZ03MWRKS5XABZYQN17ETGQS3527SA5.newyorkcitycoin-core-v1' const NYC_CONTRACT_V2 = 'SPSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1F4DYQ11.newyorkcitycoin-core-v2' @@ -11,73 +7,17 @@ const MIAMI_CONTRACT_V2 = 'SP1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8Y634C7R.miamicoin-c const MIAMI_CITY_WALLET = 'SM2MARAVW6BEJCD13YV2RHGYHQWT7TDDNMNRB1MVT' const NYC_CITY_WALLET = 'SM18VBF2QYAAHN57Q28E2HSM15F6078JZYZ2FQBCX' -async function tvl() { - const balances = {} - - await Promise.all([ - addStacks(NYC_CONTRACT, balances), - addStacks(MIAMI_CONTRACT, balances), - addStacks(NYC_CONTRACT_V2, balances), - addStacks(MIAMI_CONTRACT_V2, balances), - ]) - return balances -} - -async function staking() { - const balances = {} - - await Promise.all([ - addTokens(NYC_CONTRACT, balances), - addTokens(MIAMI_CONTRACT, balances), - addTokens(NYC_CONTRACT_V2, balances), - addTokens(MIAMI_CONTRACT_V2, balances), - ]) - return balances -} - -async function getStacksBalances(address) { - const url = `${STACKS_API}/${address}/balances` - return get(url) -} - -async function addStacks(address, balances) { - const stx_balance = (await getStacksBalances(address)).stx.balance - sdk.util.sumSingleBalance(balances, 'blockstack', BigNumber(stx_balance).div(1e6).toFixed(0)) -} - -async function addTokens(address, balances) { - const { - fungible_tokens - } = await getStacksBalances(address) - - const decimals = [MIAMI_CONTRACT_V2, NYC_CONTRACT_V2].includes(address) ? 6 : 0 - - const tokenBalances = { - output: Object.keys(fungible_tokens) - .map(token => - ({ - input: { target: token }, - success: true, - output: BigNumber(fungible_tokens[token].balance / 10 ** decimals).toFixed(0) - })) - } - sdk.util.sumMultiBalanceOf(balances, tokenBalances, true, transformStacksToken) -} - -function transformStacksToken(token) { - token = token.split('::')[1] // take only the part after :: in the token string - - if (token === 'newyorkcitycoin') - return 'nycccoin' // I am guessing coingecko id for NYC city coin is 'nyccoin' hence this replacement - - return token -} - module.exports = { stacks: { - tvl, + tvl: sumTokensExport({ + owners: [NYC_CONTRACT, NYC_CONTRACT_V2, MIAMI_CONTRACT, MIAMI_CONTRACT_V2], + tokens: [nullAddress] + }), // treasury, Note: Treasury has been disabled upon team request since they view it as amount reserved for city governers and does not belong to team - staking, + staking: sumTokensExport({ + owners: [NYC_CONTRACT, NYC_CONTRACT_V2, MIAMI_CONTRACT, MIAMI_CONTRACT_V2], + blacklistedTokens: [nullAddress] + }), }, - methodology: 'Added STX tokens in addresses marked as city wallets as treasury. Added STX in contracts as TVL, and native tokens in it as staking' + methodology: 'Added STX in contracts as TVL, and native tokens in it as staking' }; \ No newline at end of file diff --git a/projects/helper/chain/stacks.js b/projects/helper/chain/stacks.js new file mode 100644 index 000000000..04989fd2c --- /dev/null +++ b/projects/helper/chain/stacks.js @@ -0,0 +1,50 @@ +const { get, } = require('../http') +const { nullAddress } = require('../tokenMapping') +const sdk = require('@defillama/sdk') +const chain = 'stacks' + +const STACKS_API = 'https://stacks-node-api.mainnet.stacks.co/extended/v1/address' + +async function getStacksBalances(address) { + const url = `${STACKS_API}/${address}/balances` + return get(url) +} + +async function addStacks(address, balances = {}) { + const stx_balance = (await getStacksBalances(address)).stx.balance + sdk.util.sumSingleBalance(balances, nullAddress, stx_balance, chain) + return balances +} + +async function addTokens(address, { balances = {}, tokens = [], blacklistedTokens = [] }) { + const { + fungible_tokens, stx, + } = await getStacksBalances(address) + + if ((!tokens.length || tokens.includes(nullAddress)) && (!blacklistedTokens.length || !blacklistedTokens.includes(nullAddress))) + sdk.util.sumSingleBalance(balances, nullAddress, stx.balance, chain) + + Object.keys(fungible_tokens) + .filter(token => { + if (tokens.length && !tokens.includes(token)) return false + if (blacklistedTokens.length && blacklistedTokens.includes(token)) return false + return true + }) + .forEach(token => sdk.util.sumSingleBalance(balances, token, fungible_tokens[token].balance, chain)) +} + +async function sumTokens({ owner, owners = [], tokens = [], balances = {}, blacklistedTokens = [], tokensAndOwners = [] }) { + if (tokensAndOwners.length) { + await Promise.all(tokensAndOwners.map(([token, owner]) => addTokens(owner, { tokens: [token], balances, blacklistedTokens, }))) + return balances + } + if (owner) owners = [owner] + + await Promise.all(owners.map(i => addTokens(i, { balances, tokens, blacklistedTokens, }))) + return balances +} + +module.exports = { + sumTokens, + addStacks, +} \ No newline at end of file diff --git a/projects/helper/sumTokens.js b/projects/helper/sumTokens.js index fa29ff8b0..2517a1d42 100644 --- a/projects/helper/sumTokens.js +++ b/projects/helper/sumTokens.js @@ -19,6 +19,7 @@ const helpers = { "litecoin":require("./chain/litecoin"), "polkadot":require("./chain/polkadot"), "hedera":require("./chain/hbar"), + "stacks":require("./chain/stacks"), } const geckoMapping = { diff --git a/projects/helper/tokenMapping.js b/projects/helper/tokenMapping.js index d5a18905e..bfb43b80f 100644 --- a/projects/helper/tokenMapping.js +++ b/projects/helper/tokenMapping.js @@ -14,7 +14,7 @@ const nullAddress = '0x0000000000000000000000000000000000000000' // orbit brige: https://bridge.orbitchain.io/open/v1/api/monitor/rawTokenList const ibcChains = ['ibc', 'terra', 'terra2', 'crescent', 'osmosis', 'kujira', 'stargaze', 'juno', 'injective', 'cosmos', 'comdex', 'stargaze', 'umee', 'orai', 'persistence', ] -const caseSensitiveChains = [...ibcChains, 'solana', 'tezos', 'ton', 'algorand', 'aptos', 'near', 'bitcoin', 'waves', 'tron', 'litecoin', 'polkadot', 'ripple', 'elrond', 'cardano',] +const caseSensitiveChains = [...ibcChains, 'solana', 'tezos', 'ton', 'algorand', 'aptos', 'near', 'bitcoin', 'waves', 'tron', 'litecoin', 'polkadot', 'ripple', 'elrond', 'cardano', 'stacks'] const tokens = { null: nullAddress, diff --git a/projects/uwu-cash/index.js b/projects/uwu-cash/index.js new file mode 100644 index 000000000..e62c53824 --- /dev/null +++ b/projects/uwu-cash/index.js @@ -0,0 +1,11 @@ +const { sumTokensExport, nullAddress } = require('../helper/sumTokens') + +// https://docs.uwu.cash/developers/deployed-contracts +module.exports = { + stacks: { + tvl: sumTokensExport({ + owners: ['SP2AKWJYC7BNY18W1XXKPGP0YVEK63QJG4793Z2D4.uwu-factory-v1'], + tokens: [nullAddress] + }), + } +}; \ No newline at end of file