Coder Social home page Coder Social logo

yield-server's Introduction

DefiLlama APY Server

How to list a new protocol

  1. Make sure you are listed on defillama's TVL page (see https://github.com/DefiLlama/DefiLlama-Adapters)
  2. Fork this repository
  3. Create a new folder within src/adaptors/ with your protocol name (use your project slug from https://api.llama.fi/protocols)
  4. Write an adaptor for your protocol (tutorial below)
  5. cd src/adaptors and run npm i
  6. Test your adaptor by running npm run test --adapter=YOUR_ADAPTER
  7. Submit a PR

Data sources

The data must be fetched from on-chain calls or from subgraphs. Centralised api calls are only accepted if there is no other way of obtaining that data (eg off-chain gauge weights).

APY Methodology

Our goal is to display minimum attainable yield values for all listed projects:

  • Omit any pre-mined rewards
  • Use unboosted (lower bound) apy values
  • If rewards are slashed when exiting a pool early, then set the apy value to that lower bound.
  • Omit any yield which requires an additional token aside from the LP token (eg veCRV to boost reward yields)
  • Omit any locked rewards
  • Fee based APY values should be calculated over a 24h window

Adaptors

An adaptor is just a javascript (or typescript) file that exports an async function that returns an array of objects that represent pools of a protocol. The pools follow the following schema (all values are just examples):

interface Pool {
  pool: string;
  chain: string;
  project: string;
  symbol: string;
  tvlUsd: number; // for lending protocols: tvlUsd = totalSupplyUsd - totalBorrowUsd
  apyBase?: number;
  apyReward?: number;
  rewardTokens?: Array<string>;
  underlyingTokens?: Array<string>;
  poolMeta?: string;
  url?: string;
  // optional lending protocol specific fields:
  apyBaseBorrow?: number;
  apyRewardBorrow?: number;
  totalSupplyUsd?: number;
  totalBorrowUsd?: number;
  ltv?: number; // btw [0, 1]
}
{
    pool: "0x3ed3b47dd13ec9a98b44e6204a523e766b225811-ethereum", // unique identifier for the pool in the form of: `${ReceivedTokenAddress}-${chain}`.toLowerCase()
    chain: "Ethereum", // chain where the pool is (needs to match the `name` field in here https://api.llama.fi/chains)
    project: 'aave', // protocol (using the slug again)
    symbol: "USDT", // symbol of the tokens in pool, can be a single symbol if pool is single-sided or multiple symbols (eg: USDT-ETH) if it's an LP
    tvlUsd: 1000.1, // number representing current USD TVL in pool
    apyBase: 0.5, // APY from pool fees/supplying in %
    apyReward: 0.7, // APY from pool LM rewards in %
    rewardTokens: ['0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9'], // Array of reward token addresses (you can omit this field if a pool doesn't have rewards)
    underlyingTokens: ['0xdAC17F958D2ee523a2206206994597C13D831ec7'], // Array of underlying token addresses from a pool, eg here USDT address on ethereum
    poolMeta: "V3 market", // A string value which can stand for any specific details of a pool position, market, fee tier, lock duration, specific strategy etc
  };
A note on how to set apy related fields:

- if a pool's apy only consists of a base component, provide `apyBase` and omit `apyReward` (or set to null) [and vice versa]
- if a pool's apy consists of both, provide both fields
- if you are unsure/your data source doesn't contain a detailed breakdown, then provide an `apy` field indicating the total apy and omit the `apyBase` and `apyReward` fields (or set to null)

FAQ

Why are some pools missing on DefiLlama which appear on my adapter?

DefiLlama only displays pools with >10k TVL, so pools with less TVL than that will appear on the adapter but not on defillama

I'm getting errors when running npm install

Just remove the packages pg-promise, pg and pg-native from package.json and then install again, make sure to avoid commiting these changes tho!

Why is X pool missing from https://defillama.com/yields/stablecoins ?

That page has stricter filters than other pages, only pools with >1M TVL and on audited protocols are included there.

Adapter module structure

module.exports = {
  timetravel: false,
  apy: apy, // Main function, returns pools
  url: 'https://example.com/pools', // Link to page with pools (Only required if you do not provide url's for each pool)
};

An example of the most basic adaptor is the following for Anchor on terra:

const utils = require('../utils');

const poolsFunction = async () => {
  const apyData = await utils.getData(
    'https://api.anchorprotocol.com/api/v1/market/ust'
  );
  const dataTvl = await utils.getData(
    'https://api.anchorprotocol.com/api/v1/deposit'
  );

  const ustPool = {
    pool: 'terra1hzh9vpxhsk8253se0vv5jj6etdvxu3nv8z07zu',
    chain: utils.formatChain('terra'),
    project: 'anchor',
    symbol: utils.formatSymbol('UST'),
    tvlUsd: Number(dataTvl.total_ust_deposits) / 1e6,
    apy: apyData.deposit_apy * 100,
  };

  return [ustPool]; // Anchor only has a single pool with APY
};

module.exports = {
  timetravel: false,
  apy: poolsFunction,
  url: 'https://app.anchorprotocol.com/#/earn',
};

You can find examples for a bunch of other protocols in the src/adaptors/ folder, and if you have any questions feel free to ask them on our discord.

yield-server's People

Contributors

0xaces avatar 0xandrewclark avatar 0xmdreamy avatar 0xngmi avatar abtheo avatar brightiron avatar dtmkeng avatar getunrekt avatar hirorylabo avatar hubertnastaly avatar iamvukasin avatar itofarina avatar joaoavf avatar julien-devatom avatar karmanmax avatar kfukue avatar killbond007 avatar michaelotis avatar naturelab avatar noe-l-dev avatar philipjames44 avatar pierremarsotlyon1 avatar pxrl avatar sandbochs avatar sbbutler avatar slasher125 avatar vrtnd avatar wardenjakx avatar waynebruce0x avatar zkswapfinance avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

yield-server's Issues

Not listed in leveraged lending

Hello! Nitron is listed in under yields but not in "leveraged lending" sections and I couldnt find any docs on where or how should can we do that, please advice

thanks!

[morpho-blue] Some vaults and new markets do not display

Hello Team, Tom from Morpho Labs.

Context:

This adaptor: https://github.com/DefiLlama/yield-server/blob/master/src/adaptors/morpho-blue/index.js

Is supposedly taking into account all MetaMorpho Vaults, and all Markets.

We are not seing some pools of at least 2 Vaults in here: https://defillama.com/yields?project=morpho-blue

And prob others.

We are aware of this condition criteria:

DefiLlama only displays pools with >10k TVL, so pools with less TVL than that will appear on the adapter but not on defillama
When running the test on the adaptor, I have this:

Question

  • Is there another reason why those vaults are not displayed?
  • Is there anything we can do on our end to get them there?

Happy to help in here, thanks a lot team

tests display:

Nb of pools: 152

Sample pools: [
  {
    pool: 'morpho-blue-0x73e65dbd630f90604062f6e02fab9138e713edd9',
    chain: 'ethereum',
    project: 'morpho-blue',
    symbol: 'SPDAI',
    apyBase: 13.115126,
    apyReward: 0,
    rewardTokens: [],
    tvlUsd: 299854221,
    underlyingTokens: [ '0x6b175474e89094c44da98b954eedeac495271d0f' ],
    apyBaseBorrow: 0,
    apyRewardBorrow: 0,
    totalSupplyUsd: 299854221,
    totalBorrowUsd: 0,
    ltv: 0
  },
  {
    pool: 'morpho-blue-0xc581c5f70bd1afa283eed57d1418c6432cbff1d862f94eaf58fdd4e46afbb67f',
    chain: 'ethereum',
    project: 'morpho-blue',
    symbol: 'USDE-DAI',
    apyBase: 15.38992147088925,
    apyReward: 0,
    rewardTokens: [],
    tvlUsd: 224775764.10399985,
    underlyingTokens: [ '0x6b175474e89094c44da98b954eedeac495271d0f' ],
    apyBaseBorrow: 18.570767660380234,
    apyRewardBorrow: 0,
    totalSupplyUsd: 345387122.0514208,
    totalBorrowUsd: 120611357.94742095,
    ltv: 0.86,
    poolMeta: '86%'
  },
  {
    pool: 'morpho-blue-0x8e6aeb10c401de3279ac79b4b2ea15fc94b7d9cfc098d6c2a1ff7b2b26d9d02c',
    chain: 'ethereum',
    project: 'morpho-blue',
    symbol: 'USDE-DAI',
    apyBase: 10.720411852972706,
    apyReward: 0,
    rewardTokens: [],
    tvlUsd: 107242397.5336054,
    underlyingTokens: [ '0x6b175474e89094c44da98b954eedeac495271d0f' ],
    apyBaseBorrow: 17.230694025232488,
    apyRewardBorrow: 0,
    totalSupplyUsd: 165549939.61572105,
    totalBorrowUsd: 58307542.08211566,
    ltv: 0.915,
    poolMeta: '91.5%'
  },
  {
    pool: 'morpho-blue-0xb323495f7e4148be5643a4ea4a8221eef163e4bccfdedc2a6f4696baacbc86cc',
    chain: 'ethereum',
    project: 'morpho-blue',
    symbol: 'WSTETH-USDC',
    apyBase: 5.997465492721724,
    apyReward: 1.2103965731699222,
    rewardTokens: [
      '0x9994E35Db50125E0DF82e4c2dde62496CE330999',
      '0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0'
    ],
    tvlUsd: 69741374.42428294,
    underlyingTokens: [ '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48' ],
    apyBaseBorrow: 7.112494182866616,
    apyRewardBorrow: 0,
    totalSupplyUsd: 106565783.71909136,
    totalBorrowUsd: 36824409.294808425,
    ltv: 0.86,
    poolMeta: '86%'
  },
  {
    pool: 'morpho-blue-0xbeef01735c132ada46aa9aa4c54623caa92a64cb',
    chain: 'ethereum',
    project: 'morpho-blue',
    symbol: 'STEAKUSDC',
    apyBase: 36464775369228.18,
    apyReward: 0.892189,
    rewardTokens: [
      '0x9994E35Db50125E0DF82e4c2dde62496CE330999',
      '0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0'
    ],
    tvlUsd: 41231048.42700045,
    underlyingTokens: [ '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48' ],
    apyBaseBorrow: 0,
    apyRewardBorrow: 0,
    totalSupplyUsd: 41231048.42700045,
    totalBorrowUsd: 0,
    ltv: 0
  },
  {
    pool: 'morpho-blue-0x1247f1c237eceae0602eab1470a5061a6dd8f734ba88c7cdc5d6109fb0026b28',
    chain: 'ethereum',
    project: 'morpho-blue',
    symbol: 'SUSDE-DAI',
    apyBase: 10.237530090401973,
    apyReward: 0,
    rewardTokens: [],
    tvlUsd: 39220674.80382609,
    underlyingTokens: [ '0x6b175474e89094c44da98b954eedeac495271d0f' ],
    apyBaseBorrow: 11.978395242510894,
    apyRewardBorrow: 0,
    totalSupplyUsd: 62740744.17833756,
    totalBorrowUsd: 23520069.374511465,
    ltv: 0.915,
    poolMeta: '91.5%'
  },
  {
    pool: 'morpho-blue-0xfd8493f09eb6203615221378d89f53fcd92ff4f7d62cca87eece9a2fff59e86f',
    chain: 'ethereum',
    project: 'morpho-blue',
    symbol: 'USDE-DAI',
    apyBase: 14.306764303632121,
    apyReward: 0,
    rewardTokens: [],
    tvlUsd: 32948440.561886907,
    underlyingTokens: [ '0x6b175474e89094c44da98b954eedeac495271d0f' ],
    apyBaseBorrow: 16.23081198940757,
    apyRewardBorrow: 0,
    totalSupplyUsd: 48925256.97091499,
    totalBorrowUsd: 15976816.409028081,
    ltv: 0.77,
    poolMeta: '77%'
  },
  {
    pool: 'morpho-blue-0xc54d7acf14de29e0e5527cabd7a576506870346a78a11a6762e2cca66322ec41',
    chain: 'ethereum',
    project: 'morpho-blue',
    symbol: 'WSTETH-WETH',
    apyBase: 3.959598853655505,
    apyReward: 1.1941189242339676,
    rewardTokens: [
      '0x9994E35Db50125E0DF82e4c2dde62496CE330999',
      '0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0'
    ],
    tvlUsd: 32868251.02302458,
    underlyingTokens: [ '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2' ],
    apyBaseBorrow: 4.094937065131629,
    apyRewardBorrow: 0,
    totalSupplyUsd: 66952364.75937516,
    totalBorrowUsd: 34084113.73635058,
    ltv: 0.945,
    poolMeta: '94.5%'
  },
  {
    pool: 'morpho-blue-0x38989bba00bdf8181f4082995b3deae96163ac5d',
    chain: 'ethereum',
    project: 'morpho-blue',
    symbol: 'BBETH',
    apyBase: 3.572479,
    apyReward: 0.935993,
    rewardTokens: [
      '0x9994E35Db50125E0DF82e4c2dde62496CE330999',
      '0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0'
    ],
    tvlUsd: 30783684.476340823,
    underlyingTokens: [ '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2' ],
    apyBaseBorrow: 0,
    apyRewardBorrow: 0,
    totalSupplyUsd: 30783684.476340823,
    totalBorrowUsd: 0,
    ltv: 0
  },
  {
    pool: 'morpho-blue-0x3a85e619751152991742810df6ec69ce473daef99e28a64ab2340d7b7ccfee49',
    chain: 'ethereum',
    project: 'morpho-blue',
    symbol: 'WBTC-USDC',
    apyBase: 6.991249519856288,
    apyReward: 0,
    rewardTokens: [ '0x9994E35Db50125E0DF82e4c2dde62496CE330999' ],
    tvlUsd: 27230425.832534675,
    underlyingTokens: [ '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48' ],
    apyBaseBorrow: 7.797797107806333,
    apyRewardBorrow: 0,
    totalSupplyUsd: 41135225.990995035,
    totalBorrowUsd: 13904800.15846036,
    ltv: 0.86,
    poolMeta: '86%'
  }
]

This adapter contains some pools with <10k TVL, these pools won't be shown in DefiLlama

Subgraph endpoint update required

Hey team,

We've noticed that you're referencing a subgraph deployed on The Graph's hosted service in this repository. Just a heads-up: after June 12th, hosted service subgraph endpoints will no longer be available as the offering is being deprecated.

If you are the subgraph owner or maintainer, it's time to upgrade your subgraph to the network. This ensures everything keeps running smoothly and you get access to all the latest features and improvements. Here is a quick guide with all the upgrade steps.

If you're not the subgraph owner or maintainer, check Graph Explorer to see if the subgraph development team has already upgraded to the network. If you don’t find an upgraded subgraph, a friendly nudge to the subgraph development team would be greatly appreciated—it's a quick process that benefits everyone. Here's the upgrade guide with all the necessary steps for the subgraph development team.

Once the subgraph is upgraded to the network, you can create an API key and updated query URL in Subgraph Studio then update this repository to query from the new endpoint, https://api.studio.thegraph.com/query/<ID>/<SUBGRAPH_NAME>/<VERSION>

Need more support or have more questions? Feel free to reach out to [email protected]. We're here to help!

Cheers,

Paka

Borrow aggregator: FiRM protocol - negative liquidity

Hello
I noticed the liquidity is negative for some of the markets regarding the Inverse Finance - FiRM protocol.

It seems the calculation that is shown for the "available" column is the liquidity minus amount borrowed instead of just the liquidity.

How do you measure APY?

An annual percentage yield can be defined as follows:

  • You start with assets valued at x0 at time t0.
  • At time t1, the assets are valued at x1.
  • The growth factor over the period Δt = t1t0 is given by t1/t0.
  • The annual yield y over the period [t0, t1] is then given by y(t0, t1) = (x1 / x0)1 year / Δt – 1.

Note that it depends on the chosen period. If we want to get the “current” APY, we can set t1 equal to the current time, but what should we choose for t0?

If this were a continuous process, one could take the limit as t0t1 to get an instantaneous APY. But blockchains tend to be discrete; it doesn’t make sense to talk about Δt’s shorter than the duration of a block, and often values change less frequently (e.g. once per day, or once per epoch). If the valuation has a discontinuity, you can get out any APY you like by looking at a time interval that contains the jump, choosing the size of the interval appropriately. So below a certain time interval, APY becomes meaningless. (You could say, include at least two discontinuities in the interval, but even then, if you look at the “instantaneous” APY, it can swing so wildly that it’s essentially meaningless, similar to how a histogram becomes meaningless if you choose the bin size too small.) This begs the question, over what time interval do you measure APYs?

So just an “APY” value is ambiguous, you always have to specify what time period it’s computed over. Comparing APYs of unspecified periods, is an apples-to-oranges comparison. What period does DefiLlama use?

A related issue is that due to the discrete blocks or epochs, an APY is not always clearly defined at smaller timescales. For example, for Lido for Solana, the price of one token expressed in some other token started out at 1 at launch, and goes up over time, changing once per epoch. If we take t0 = launch time, and t1 = now, then there is a well-defined time interval to measure APY over, but if you graph that value over time, it looks like a sawtooth, with a high APY at the start of the epoch, which decreases during the epoch. The issue here is that the price is constant for the duration of an epoch, while Δt increases continuously. One way to resolve this paradox is to say that APY is only defined per epoch (and epochs are discrete), not for any arbitrary moment in time, and that it doesn’t make sense to graph the data at a finer resolution than the epoch. How does DefiLlama deal with this?

Lambda env over 4kb

All deployments steps are failing because of Lambda limitation of 4kb in env variables

different apyBase in different location

Hi, I'm using yield charts data for our app. but the last data of API is not stable and is different in different locations.
for example try to open this link in other location (countries)

https://yields.llama.fi/chart/7aab7b0f-01c1-4467-bc0d-77826d870f19

image_2023-08-28_18-09-40
image_2023-08-28_18-11-02

look at these images. they have been taken in a same time in different countries but you can see the last item is not same.
we use the last base apy to calculate best leverage for a position. and this behavior break our calculation.

Issue with Call Helper Returning Zero Values

I am encountering an issue with fetching results from our market stats contract. While the contract provides accurate values, using the call helper function results in zero values being returned from the API.

We are getting this error during the Hashstack market token implementation for the APRs and APYs

PR: #1351

image

ReHold APYs Issue

On 24th May ReHold is blacklisted from yields by this commit: 32f38e1

We're fully legit project with support from tier 1 projects such as Polygon, Chainstack, etc.

Also, we've been audited by PeckShield: https://github.com/peckshield/publications/blob/master/audit_reports/PeckShield-Audit-Report-ReHold-v1.0.pdf

All of our APYs are real, it can be easily checked via https://app.rehold.io, we don't have any restrictions for any users or staking period (duals can be easily extended with manual replay or gas-free auto-replay).

Currently, we're supporting 5 blockchains (BNB Chain, Arbitrum, Polygon, Avalanche, and Optimism) with 37+ tokens, and APR up to 220%. All of these values are taken from the smart contracts (which have been audited as I mentioned before).

Here's an example of how to check the yield (and calculate it to APY via smart contract on BNB Chain)

  1. Navigate to https://bscscan.com/address/0x3185b7c3a4e646fb23c6c04d979e61da7871b5c1#readContract
  2. Get random tariff from the list, just for example [251,0xAD29AbB318791D579433D831ed122aFeAf29dcfe,0x55d398326f99059fF775485246999027B3197955,24,602740,true]
  3. 0xAD29AbB318791D579433D831ed122aFeAf29dcfe is FTM BEP20 and 0x55d398326f99059fF775485246999027B3197955 is USDT BEP20
  4. 24 is the staking period in hours and 602740 is a yield for the current staking period (multiplied by 1e8), so that's the math: 602740 / 1e8 * 365 = 2.2 = 220% for FTM/USDT on BNB Chain
image

Hope it answers all of your questions about our real APYs and I will wait for any updates or possible concerns, will be happy to answer!

Thank you!

Proposal of new API field: metadata

Hey I am currently experimenting with consuming https://yields.llama.fi/pools for APY data. I have/had some working version if it live on https://dev.defibasket.org/create. Unfortunately using UUIDs instead of poolIds was a breaking change for me :(

I think UUIDs make a lot of sense to standardize poolIds, but I am currently in need to make a link between the assets we have on our database to the assets I consume from the API, and I am currently unable to do so based only on UUIDs.

The easiest solution that comes to mind is to keep the old id in there somehow as metadata or something like that.

Another suggestion is to create an object to contain such non-standardized data for protocol specific parameters: {address: ...., poolId: ....}

metadata can be set to the old poolId as default, but can be slowly and individually upgraded to a new and better organized format.

I am pretty available to work on this, and open to other solutions as well.

Thanks for the great work!!

Database url

Is it possible to know what's the database url? Without it, it's impossible to read any data and verify the correctness.

simplePools endpoint down?

Appears to be. In beforeTests.js:

global.uniquePoolIdentifiersDB = new Set( ( await axios.get( 'https://1rwmj4tky9.execute-api.eu-central-1.amazonaws.com/simplePools' ) ).data.data .filter((p) => p.project !== global.apy[0].project) .map((p) => p.pool) );

attempting to run this: npm run test --adapter=0vix

Returns this:

Error: Jest: Got error running globalSetup - reason: [AxiosError: Request failed with status code 404] at runGlobalHook (yield-server/node_modules/@jest/core/build/runGlobalHook.js:134:15) at processTicksAndRejections (node:internal/process/task_queues:96:5) at async runJest (yield-server/node_modules/@jest/core/build/runJest.js:372:5) at async _run10000 (yield-server/node_modules/@jest/core/build/cli/index.js:339:7) at async runCLI (yield-server/node_modules/@jest/core/build/cli/index.js:190:3) at async Object.run (yield-server/node_modules/jest-cli/build/cli/index.js:155:37)

manually inputting the URL in browser returns 404 in console: https://1rwmj4tky9.execute-api.eu-central-1.amazonaws.com/simplePools.

REQUEST: add borrow metadata to the /poolsEnriched endpoint

A request to add the additional borrow metadata present in the /getPoolsBorrow to the /poolsEnriched endpoint.
This would make it possible for people to query borrowApy by poolID. The only way to get apyBaseBorrow and apyRewardBorrow is by calling /chartLendBorrow/:pool and getting the last element. It would be nice to get the latest borrow apr data via the enriched endpoint, alongside the existing supply apr data.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.