Git Product home page Git Product logo

multicoin-address-validator's Introduction

wallet-address-validator

Simple wallet address validator for validating Bitcoin and other altcoins addresses in Node.js and browser.

Build Status

Forked from ryanralph/altcoin-address.

File size is ~17 kB (minifed and gzipped).

Installation

NPM

npm install multicoin-address-validator

Browser

<script src="wallet-address-validator.min.js"></script>

API

validate (address [, currency = 'bitcoin'[, networkType = 'prod']])
Parameters
  • address - Wallet address to validate.
  • currency - Optional. Currency name or symbol, e.g. 'bitcoin' (default), 'litecoin' or 'LTC'
  • networkType - Optional. Use 'prod' (default) to enforce standard address, 'testnet' to enforce testnet address and 'both' to enforce nothing.

Returns true if the address (string) is a valid wallet address for the crypto currency specified, see below for supported currencies.

Supported crypto currencies

  • 0x/zrx '0x' or 'zrx'
  • Aave Coin/aave 'Aave Coin' or 'aave'
  • Algorand/algo 'Algorand' or 'algo'
  • Apecoin/ape 'Apecoin' or 'ape'
  • API3/api3 'API3' or 'api3'
  • Aragon/ant 'Aragon' or 'ant'
  • Arbitrum/arb 'Arbitrum' or 'arb'
  • Augur/rep 'Augur' or 'rep'
  • AugurV2/repv2 'AugurV2' or 'repv2'
  • AuroraCoin/aur 'AuroraCoin' or 'aur'
  • Avalanche/avax 'Avalanche' or 'avax'
  • Axie Infinity/axs 'Axie Infinity' or 'axs'
  • Bancor/bnt 'Bancor' or 'bnt'
  • Band Protocol/band 'Band Protocol' or 'band'
  • Bankex/bkx 'Bankex' or 'bkx'
  • Basic Attention Token/bat 'Basic Attention Token' or 'bat'
  • BeaverCoin/bvc 'BeaverCoin' or 'bvc'
  • Biconomy/bico 'Biconomy' or 'bico'
  • Binance/bnb 'Binance' or 'bnb'
  • BioCoin/bio 'BioCoin' or 'bio'
  • Bitcoin/btc 'Bitcoin' or 'btc'
  • Bitcoin SV/bsv 'Bitcoin SV' or 'bsv'
  • BitcoinCash/bch 'BitcoinCash' or 'bch'
  • BitcoinGold/btg 'BitcoinGold' or 'btg'
  • BitcoinPrivate/btcp 'BitcoinPrivate' or 'btcp'
  • BitcoinZ/btcz 'BitcoinZ' or 'btcz'
  • BlockTrade/btt 'BlockTrade' or 'btt'
  • Blur/blur 'Blur' or 'blur'
  • Bonk/bonk 'Bonk' or 'bonk'
  • BTU Protocol/btu 'BTU Protocol' or 'btu'
  • Callisto/clo 'Callisto' or 'clo'
  • Cardano/ada 'Cardano' or 'ada'
  • Celo/celo 'Celo' or 'celo'
  • Chainlink/link 'Chainlink' or 'link'
  • Chiliz/chz 'Chiliz' or 'chz'
  • Civic/cvc 'Civic' or 'cvc'
  • Compound/comp 'Compound' or 'comp'
  • Cred/lba 'Cred' or 'lba'
  • Crypto.com Coin/cro 'Crypto.com Coin' or 'cro'
  • Curve DAO/crv 'Curve DAO' or 'crv'
  • CUSD/cusd 'CUSD' or 'cusd'
  • Dash/dash 'Dash' or 'dash'
  • Decentraland/mana 'Decentraland' or 'mana'
  • Decred/dcr 'Decred' or 'dcr'
  • DigiByte/dgb 'DigiByte' or 'dgb'
  • District0x/dnt 'District0x' or 'dnt'
  • DogeCoin/doge 'DogeCoin' or 'doge'
  • Enjin Coin/enj 'Enjin Coin' or 'enj'
  • EOS/eos 'EOS' or 'eos'
  • Ethereum/eth 'Ethereum' or 'eth'
  • Ethereum Name Service/ens 'Ethereum Name Service' or 'ens'
  • EthereumClassic/etc 'EthereumClassic' or 'etc'
  • EthereumPow/ethw 'EthereumPow' or 'ethw'
  • EtherZero/etz 'EtherZero' or 'etz'
  • Expanse/exp 'Expanse' or 'exp'
  • Fetch.ai/fet 'Fetch.ai' or 'fet'
  • FirmaChain/fct 'FirmaChain' or 'fct'
  • Flare/flr 'Flare' or 'flr'
  • FreiCoin/frc 'FreiCoin' or 'frc'
  • GameCredits/game 'GameCredits' or 'game'
  • GarliCoin/grlc 'GarliCoin' or 'grlc'
  • Gnosis/gno 'Gnosis' or 'gno'
  • Golem/glm 'Golem' or 'glm'
  • Golem (GNT)/gnt 'Golem (GNT)' or 'gnt'
  • Hashflow/hft 'Hashflow' or 'hft'
  • HedgeTrade/hedg 'HedgeTrade' or 'hedg'
  • Hush/hush 'Hush' or 'hush'
  • HyperSpace/xsc 'HyperSpace' or 'xsc'
  • iExec RLC/rlc 'iExec RLC' or 'rlc'
  • Illuvium/ilv 'Illuvium' or 'ilv'
  • Immutable/imx 'Immutable' or 'imx'
  • Injective/inj 'Injective' or 'inj'
  • Komodo/kmd 'Komodo' or 'kmd'
  • LBRY Credits/lbc 'LBRY Credits' or 'lbc'
  • Lido DAO Token/ldo 'Lido DAO Token' or 'ldo'
  • LiteCoin/ltc 'LiteCoin' or 'ltc'
  • loki/loki 'loki' or 'loki'
  • Loom Network/loom 'Loom Network' or 'loom'
  • Magic/magic 'Magic' or 'magic'
  • Maker/mkr 'Maker' or 'mkr'
  • Marlin/pond 'Marlin' or 'pond'
  • Mask Network/mask 'Mask Network' or 'mask'
  • Matchpool/gup 'Matchpool' or 'gup'
  • Matic/matic 'Matic' or 'matic'
  • MegaCoin/mec 'MegaCoin' or 'mec'
  • Melon/mln 'Melon' or 'mln'
  • Metal/mtl 'Metal' or 'mtl'
  • Monero/xmr 'Monero' or 'xmr'
  • Multi-collateral DAI/dai 'Multi-collateral DAI' or 'dai'
  • NameCoin/nmc 'NameCoin' or 'nmc'
  • Nano/nano 'Nano' or 'nano'
  • Nem/xem 'Nem' or 'xem'
  • Neo/neo 'Neo' or 'neo'
  • NeoGas/gas 'NeoGas' or 'gas'
  • Numeraire/nmr 'Numeraire' or 'nmr'
  • Ocean Protocol/ocean 'Ocean Protocol' or 'ocean'
  • Odyssey/ocn 'Odyssey' or 'ocn'
  • OmiseGO/omg 'OmiseGO' or 'omg'
  • Onyx Protocol/xcn 'Onyx Protocol' or 'xcn'
  • Optimism/op 'Optimism' or 'op'
  • Origin Protocol/ogn 'Origin Protocol' or 'ogn'
  • Paxos/pax 'Paxos' or 'pax'
  • PayPal USD/pyusd 'PayPal USD' or 'pyusd'
  • PeerCoin/ppc 'PeerCoin' or 'ppc'
  • PIVX/pivx 'PIVX' or 'pivx'
  • Polkadot/dot 'Polkadot' or 'dot'
  • Polymath/poly 'Polymath' or 'poly'
  • PrimeCoin/xpm 'PrimeCoin' or 'xpm'
  • ProtoShares/pts 'ProtoShares' or 'pts'
  • Qtum/qtum 'Qtum' or 'qtum'
  • Quant/qnt 'Quant' or 'qnt'
  • Quantum Resistant Ledger/qrl 'Quantum Resistant Ledger' or 'qrl'
  • RaiBlocks/xrb 'RaiBlocks' or 'xrb'
  • Ripio Credit Network/rcn 'Ripio Credit Network' or 'rcn'
  • Ripple/xrp 'Ripple' or 'xrp'
  • Salt/salt 'Salt' or 'salt'
  • Serve/serv 'Serve' or 'serv'
  • Siacoin/sc 'Siacoin' or 'sc'
  • Skale/skl 'Skale' or 'skl'
  • SnowGem/sng 'SnowGem' or 'sng'
  • Solana/sol 'Solana' or 'sol'
  • SolarCoin/slr 'SolarCoin' or 'slr'
  • SOLVE/solve 'SOLVE' or 'solve'
  • Spendcoin/spnd 'Spendcoin' or 'spnd'
  • Status/snt 'Status' or 'snt'
  • Stellar/xlm 'Stellar' or 'xlm'
  • Storj/storj 'Storj' or 'storj'
  • Storm/storm 'Storm' or 'storm'
  • StormX/stmx 'StormX' or 'stmx'
  • SuperVerse/super 'SuperVerse' or 'super'
  • Swarm City/swt 'Swarm City' or 'swt'
  • Synthetix Network/snx 'Synthetix Network' or 'snx'
  • Tap/xtp 'Tap' or 'xtp'
  • Tellor/trb 'Tellor' or 'trb'
  • TEMCO/temco 'TEMCO' or 'temco'
  • TenX/pay 'TenX' or 'pay'
  • Tether/usdt 'Tether' or 'usdt'
  • Tezos/xtz 'Tezos' or 'xtz'
  • The Graph/grt 'The Graph' or 'grt'
  • The Sandbox/sand 'The Sandbox' or 'sand'
  • Tron/trx 'Tron' or 'trx'
  • TrueUSD/tusd 'TrueUSD' or 'tusd'
  • Unifi Protocol DAO/unfi 'Unifi Protocol DAO' or 'unfi'
  • Uniswap Coin/uni 'Uniswap Coin' or 'uni'
  • USD Coin/usdc 'USD Coin' or 'usdc'
  • VeChain/vet 'VeChain' or 'vet'
  • VertCoin/vtc 'VertCoin' or 'vtc'
  • Viberate/vib 'Viberate' or 'vib'
  • VoteCoin/vot 'VoteCoin' or 'vot'
  • Vulcan Forged PYR/pyr 'Vulcan Forged PYR' or 'pyr'
  • Waves/waves 'Waves' or 'waves'
  • Wings/wings 'Wings' or 'wings'
  • Yearn.finance/yfi 'Yearn.finance' or 'yfi'
  • ZCash/zec 'ZCash' or 'zec'
  • ZClassic/zcl 'ZClassic' or 'zcl'
  • ZenCash/zen 'ZenCash' or 'zen'

Usage example

Node

var WAValidator = require('multicoin-address-validator');

var valid = WAValidator.validate('1KFzzGtDdnq5hrwxXGjwVnKzRbvf8WVxck', 'BTC');
if(valid)
	console.log('This is a valid address');
else
	console.log('Address INVALID');

// This will log 'This is a valid address' to the console.
var WAValidator = require('multicoin-address-validator');

var valid = WAValidator.validate('1KFzzGtDdnq5hrwxXGjwVnKzRbvf8WVxck', 'litecoin', 'testnet');
if(valid)
      console.log('This is a valid address');
else
      console.log('Address INVALID');

// As this is a invalid litecoin address 'Address INVALID' will be logged to console.
var WAValidator = require('multicoin-address-validator');

var currency = WAValidator.findCurrency('xrp');
if(currency)
      console.log('This currency exists');
else
      console.log('Currency INVALID');

// As this is a valid currency symbol 'This currency exists' will be logged to console.
var WAValidator = require('multicoin-address-validator');

var currency = WAValidator.findCurrency('random');
if(currency)
      console.log('This currency exists');
else
      console.log('Currency INVALID');

// As this is not a valid currency symbol 'Currency INVALID' will be logged to console.

Browser

<script src="wallet-address-validator.min.js"></script>
// WAValidator is exposed as a global (window.WAValidator)
var valid = WAValidator.validate('1KFzzGtDdnq5hrwxXGjwVnKzRbvf8WVxck', 'bitcoin');
if(valid)
    alert('This is a valid address');
else
    alert('Address INVALID');

// This should show a pop up with text 'This is a valid address'.

multicoin-address-validator's People

Contributors

adaxi avatar ajoslin avatar cernael avatar christsim avatar defunctzombie avatar dominique-blockchain avatar dpominov avatar eddiewang avatar freewil avatar hellcatz avatar iddoberger avatar imoark avatar iobaixas avatar jack40tall avatar jcvalr avatar martin-key avatar maximumgame avatar mcuelenaere avatar nixoid avatar nodecode avatar ognus avatar pavelvoronov avatar r3volut1oner avatar ralphtheninja avatar rraina avatar ryanralph avatar sasiedu avatar sekoyo avatar taariqv avatar yashutanna 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

multicoin-address-validator's Issues

Tron testnet address validation is not working

I tried to validate the tron address on the testnet, but it doesn't seem to work.
TYxNX8vuWBao85KTBsywq2Lj3h4EsgEEhF seems to be valid for all networks.

https://tronscan.org/#/address/TYxNX8vuWBao85KTBsywq2Lj3h4EsgEEhF
https://shasta.tronscan.org/#/address/TYxNX8vuWBao85KTBsywq2Lj3h4EsgEEhF
https://nile.tronscan.org/#/address/TYxNX8vuWBao85KTBsywq2Lj3h4EsgEEhF

But the code below doesn't work with testnet address validation.

var WAValidator = require('multicoin-address-validator');

var valid = WAValidator.validate('TYxNX8vuWBao85KTBsywq2Lj3h4EsgEEhF', 'tron', 'prod');
if(valid)
      console.log('This is a valid address');
else
      console.log('Address INVALID');

var valid = WAValidator.validate('TYxNX8vuWBao85KTBsywq2Lj3h4EsgEEhF', 'tron', 'testnet');
if(valid)
      console.log('This is a valid address');
else
      console.log('Address INVALID');
      
// This is a valid address
// Address INVALID

I didn't find any documents related to the differences between the testnet address and the mainnet address.
And both testnets do not recognize the address from the tests.

valid('27bLJCYjbH6MT8DBF9xcrK6yZnm43vx7MNQ', 'trx', 'testnet');

So, my suggestion is to change the address prefix for the testnet as it appears on the mainnet.
teke97@d31d1aa

Buffer is not defined

Uncaught ReferenceError: Buffer is not defined
at node_modules/multicoin-address-validator/src/crypto/blake256.js (blake256.js:32)
at __require (multicoin-address-validator.js?v=6adeb2e6:12)
at node_modules/multicoin-address-validator/src/crypto/utils.js (utils.js:3)
at __require (multicoin-address-validator.js?v=6adeb2e6:12)
at node_modules/multicoin-address-validator/src/ripple_validator.js (ripple_validator.js:1)
at __require (multicoin-address-validator.js?v=6adeb2e6:12)
at node_modules/multicoin-address-validator/src/currencies.js (currencies.js:1)
at __require (multicoin-address-validator.js?v=6adeb2e6:12)
at node_modules/multicoin-address-validator/src/wallet_address_validator.js (wallet_address_validator.js:1)
at __require (multicoin-address-validator.js?v=6adeb2e6:12)

add new crypto

can you add this crypto ?
HZMCOIN - HZM
KUSAMA - KSM
CURDE DAO TOKEN - CRV
THE SANBOX - SAND
1INCH - 1INCH
CHILIZ - CHZ

BSC Address not validating properly

image

When validating any BSC address, it always returns an error. I've tried with 0xf1E398A22953ED3a2FBcebd990500Dc84D5C97E1 which is a valid BSC address although the response an error.

Line 606 in src/currencies.js should be bsc not bnb

Buffer is not defined

When working with esbuild/vite we are not bundling node modules by default. This cause this library to crash with this error:

Uncaught ReferenceError: Buffer is not defined
    at node_modules/multicoin-address-validator/src/crypto/blake256.js (blake256.js:32)
    at __require (multicoin-address-validator.js?v=6adeb2e6:12)
    at node_modules/multicoin-address-validator/src/crypto/utils.js (utils.js:3)
    at __require (multicoin-address-validator.js?v=6adeb2e6:12)
    at node_modules/multicoin-address-validator/src/ripple_validator.js (ripple_validator.js:1)
    at __require (multicoin-address-validator.js?v=6adeb2e6:12)
    at node_modules/multicoin-address-validator/src/currencies.js (currencies.js:1)
    at __require (multicoin-address-validator.js?v=6adeb2e6:12)
    at node_modules/multicoin-address-validator/src/wallet_address_validator.js (wallet_address_validator.js:1)
    at __require (multicoin-address-validator.js?v=6adeb2e6:12)

Maybe the best thing to do is to import a Buffer library to be able to run on the browser without relaying on the bundlers (Like webpack)

Here's an easy way to see it in action: here
Thanks

EOS premium addresses

Hey
There are premium EOS addresses that are less than 12 characters long, which are failing in your validation
example of an address wizdumb.ftw

USDT not working correctly

When I try to validate USDT it fails. I tried doing the following
var valid = WAValidator.validate(1KFzzGtDdnq5hrwxXGjwVnKzRbvf8WVxck, 'USDT');
As you can see I validated BTC address as USDT and it was returning true instead of false.

[REGRESSION] 0.4.8 has a regression

This snippet used to return false.

WAValidator.validate('bc1ql08eyrk03qytqc5pdp5fnwpfh0x3y3k2skauvd', 'bch')

However, now breaks completely

Uncaught TypeError: Cannot read property 'prod' of undefined
    at Object.isValidAddress (../node_modules/multicoin-address-validator/src/crypto/segwit_addr.js:89:47)
    at Object.isValidAddress (.../node_modules/multicoin-address-validator/src/bitcoin_validator.js:84:78)
    at Object.isValidAddress (.../node_modules/multicoin-address-validator/src/bch_validator.js:46:80)
    at Object.validate (.../node_modules/multicoin-address-validator/src/wallet_address_validator.js:14:39)

cc: @christsim

KSM validation, and a bug.

Hey, it seems you can add Kusama address as polkadot when it shouldnt happen.
Also can there be Kusama address validation?

Thanks

DOT not validating correctly

I don't believe this was an issue before recently, however 'DOT' validation suddenly seems to return false when an address is actually correct.

I've added polkadot.js' official methodology for address validation as a stop-gap measure to solve validation only for DOT in the meantime, but this should be checked up on.

Here's a valid DOT address: 5GrpknVvGGrGH3EFuURXeMrWHvbpj3VfER1oX5jFtuGbfzCE

And the result from the package:
SHOT 17 00 16@2x

(otherwise, great package!)

USDT(Trc20) Validation

I tried like below

const valid = WAValidator.validate('TUTtVjNqCj3fndQ29YFKEdXvWwBwFihk1G', 'usdt', 'Tron')

console.log(valid) -> false

Could you assist me how to validate usdt on BSC, TRX, SOL, POLYGON, ..?

Zcash support

None of the addresses work

Legacy
zcU1Cd6zYyZCd2VJF8yKgmzjxdiiU1rgTTjEwoN1CGUWCziPkUTXUjXmX7TMqdMNsTfuiGN1jQoVN4kGxUR4sAPN4XZ7pxb

Sapling
zs1z7rejlpsa98s2rrrfkwmaxu53e4ue0ulcrw0h4x5g8jl04tak0d3mm47vdtahatqrlkngh9sly

Transparent
t14oHp2v54vfmdgQ3v3SNuQga8JKHTNi2a1

jsSHA is not a constructor

dependencies:

"multicoin-address-validator": "^0.4.12"

code:

WAValidator.validate('3KdLuLzTofVNMKKDWhyw81HUf9ZS4SSCDk', 'BTC', 'prod')

error:

TypeError: jsSHA is not a constructor
    at Object.sha256 (utils.js?14b3:90)
    at Object.sha256Checksum (utils.js?14b3:98)
    at getChecksum (bitcoin_validator.js?37f7:29)
    at getAddressType (bitcoin_validator.js?37f7:55)
    at isValidP2PKHandP2SHAddress (bitcoin_validator.js?37f7:67)
    at Object.isValidAddress (bitcoin_validator.js?37f7:86)
    at Object.validate (wallet_address_validator.js?1b74:12)

ltc wont validate

Hi, i currently use your package!!

Is it possible to add compatibility for litecoin addresses with "ltc1" prefix?

When validating the address responds false.

wav.validate('ltc1q00045kp4d4t884428ua6j6tncx6g405y7epwju', 'ltc');
false

Thanks!

EOS account names regex update

eos_validator.js can be updated with the following regex, to now allow any string with 1-12 chars, and that can contain dots as well: /^[a-z0-9.]{1,12}$/

Missing SegWit address support for DOGE.

Hello!
Great npm package, using it in production. However, currently missing doge segwit validation support. Needs just one more line in src/currencies.js:
bech32Hrp: { prod: ['doge'], testnet: ['tdoge'] },

Contribution Access

I am trying to push to a branch in order to make a pull request that adds ApeCoin, Curve DAT, Fantom, and Axe Infinity. When I try to git push I get the following error

> git push -u origin feature/add-ape-crv-ftm-axs
ERROR: Permission to christsim/multicoin-address-validator.git denied to lukabuz.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

Is there a process to getting the permissions to create/push to a branch? There is no contributor guide so I figured I would create this issue to get some clarity/get the access.

a package using terser as dependency is not passing jit tests

As i was using this package and pushed our code to github, as jit test(Github automatic test) found that terser is in a version which can cause a Redos attack(as you can see in the image)

Can this be updated so we can use this package again? thanks!

image

Add support for Cardano Yoroi wallet

Hi, great little collection of address validators you've got here, very helpful and much appreciated!

I would like to suggest adding support for Yoroi browser extension wallet under the Cardano validator.

The validator for Daedalus rejects Yoroi as a valid wallet (and I noticed it also doesnt like exchange addresses).

Thanks!

Error Testnet Cashadr

Hi,

For your information, the api don't work on this address

let result = validator.validate("bchtest:qzt6flgcj0q3a9tz4078c6k0pfymsw4mkyklafezet", "BCH", "testnet")

Add polkadot address validation

Motivation:

Polkadot is currently ranked 8 market cap-wise. And It's a very promising project.

Address format:

The address format used in Substrate-based chains is SS58. SS58 is a modification of Base-58-check from Bitcoin with some minor modifications. Notably, the format contains an address type prefix that identifies an address as belonging to a specific network.

For example:

Polkadot addresses always start with the number 1.
Kusama addresses always start with a capital letter like C, D, F, G, H, J...
Generic Substrate addresses start with 5.
These prefixes are defined here

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.