alphawallet / alpha-wallet-android Goto Github PK
View Code? Open in Web Editor NEWAn advanced Ethereum mobile wallet
Home Page: https://www.alphawallet.com
License: MIT License
An advanced Ethereum mobile wallet
Home Page: https://www.alphawallet.com
License: MIT License
the picture shows on the phone‘s screen is distorted。
Get an error message on adding my custom but verified token on mainnet
The result of discussion: merge tickets into Assets, so that we have only 3 tabs:
ALL, CURRENCY, ASSETS
Tickets are in "Assets".
Victor Zhang can explain why, if you need an answer.
Dear James:
If in the end base64 format is changed (e.g. avoid using /) please paste a test link here so I can verify. Thanks.
Currently, there are "pick-up link", "UniversalLink", "Magic Link", "Link" and "MagicLink".
Please change all the "UniversalLink", "Magic Link", "Link" to "MagicLink".
And change the "pick-up link" to "MagicLink for picking up"
Hi Justin, there's a few things I spotted.
currently, if you share a MagicLink through Wechat, click in Wechat, it shows 404 Not Found.
Hi Justin - why are we bringing in our own font?
create mode 100755 app/src/main/res/font/font_black.ttf
create mode 100755 app/src/main/res/font/font_black_italic.ttf
create mode 100755 app/src/main/res/font/font_bold.ttf
create mode 100755 app/src/main/res/font/font_bold_italic.ttf
create mode 100755 app/src/main/res/font/font_extra_light.ttf
create mode 100755 app/src/main/res/font/font_extra_light_italic.ttf
create mode 100755 app/src/main/res/font/font_italic.ttf
create mode 100755 app/src/main/res/font/font_light.ttf
create mode 100755 app/src/main/res/font/font_light_italic.ttf
create mode 100755 app/src/main/res/font/font_regular.ttf
create mode 100755 app/src/main/res/font/font_semibold.ttf
create mode 100755 app/src/main/res/font/font_semibold_italic.ttf
I hoped that MadCake hasn't included roboto font in the first place, now the apk is again 2MB bigger.
If libgmp-dev is not installed, this would happen
Collecting fastecdsa
Downloading fastecdsa-1.6.1.tar.gz
Installing collected packages: fastecdsa
Running setup.py install for fastecdsa ... error
Complete output from command /usr/bin/python3 -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-8um44_ls/fastecdsa/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-l4xv91dv-record/install-record.txt --single-version-externally-managed --compile:
running install
running build
running build_py
creating build
creating build/lib.linux-x86_64-3.5
creating build/lib.linux-x86_64-3.5/fastecdsa
copying fastecdsa/__init__.py -> build/lib.linux-x86_64-3.5/fastecdsa
copying fastecdsa/keys.py -> build/lib.linux-x86_64-3.5/fastecdsa
copying fastecdsa/util.py -> build/lib.linux-x86_64-3.5/fastecdsa
copying fastecdsa/point.py -> build/lib.linux-x86_64-3.5/fastecdsa
copying fastecdsa/benchmark.py -> build/lib.linux-x86_64-3.5/fastecdsa
copying fastecdsa/curve.py -> build/lib.linux-x86_64-3.5/fastecdsa
copying fastecdsa/test.py -> build/lib.linux-x86_64-3.5/fastecdsa
copying fastecdsa/ecdsa.py -> build/lib.linux-x86_64-3.5/fastecdsa
running build_ext
building 'fastecdsa.curvemath' extension
creating build/temp.linux-x86_64-3.5
creating build/temp.linux-x86_64-3.5/src
x86_64-linux-gnu-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -Isrc/ -I/usr/include/python3.5m -c src/curveMath.c -o build/temp.linux-x86_64-3.5/src/curveMath.o -O2
In file included from src/curveMath.c:1:0:
src/curveMath.h:6:17: fatal error: gmp.h: No existe el archivo o el directorio
compilation terminated.
error: command 'x86_64-linux-gnu-gcc' failed with exit status 1
----------------------------------------
Command "/usr/bin/python3 -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-8um44_ls/fastecdsa/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-l4xv91dv-record/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /tmp/pip-build-8um44_ls/fastecdsa/
To reproduce on Android, having installed the app:
Normally (Comparison group):
== Experiment A ==
But, the bug:
== Experiment B ==
Click "Import Asset" link, which anchors at the same place.
Chrome opens the link without Android asking if the link should open in AlphaWallet.
If you share the links through any App(email, WhatsApp, SMS or any), the link will break into 2 parts and display the landing page.
If you copy the links as text and paste it into a browser, it will open up the landing page, click on the "Import Asset", nothing will happen.
Currently, when you click on ETH, it shows a totally different UI compare with clicking ticket token.
For the first release, we will use the same UI as ticket token for ETH.
The differences are:
PLEASE SWITCH GIT BRANCH FIRST:
Switch to this branch which I worked on making asset definition object serviceable as a utility class:
addAssetDefinition
Now after performing a sell or transfer function, it will only go back to the previous page instead of going back to the homepage
(Olsen needs to know the design of the Android version of QR code). One of the James' can explain it.
I create a market order, it appears correctly:
{
"price": "0.000000000000000003",
"start": "3",
"stop": "5",
"count": "3",
"expiry": "1519195776",
"message": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWo0WgLyaECakvG8LqLvkhtHQnaVzKznkABcAGAAZ)",
"signature": "CmeQwShyRITgat7LDSf1NtGoKP9hJp87xFEVcQAkjx1NemYNS8AgQyARV5ChxEGHNkiW+oZ0ym3zqCa+4tgY3QE="
},
I then see I got the price wrong. So, I update the price and re-submit. Now, I see that it didn't replace the previous order:
{
"price": "0.000000000000000003",
"start": "3",
"stop": "5",
"count": "3",
"expiry": "1519195776",
"message": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWo0WgLyaECakvG8LqLvkhtHQnaVzKznkABcAGAAZ)",
"signature": "CmeQwShyRITgat7LDSf1NtGoKP9hJp87xFEVcQAkjx1NemYNS8AgQyARV5ChxEGHNkiW+oZ0ym3zqCa+4tgY3QE="
},
{
"price": "2.47",
"start": "3",
"stop": "5",
"count": "3",
"expiry": "1519195943",
"message": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZtWbvXmlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWo0XJ7yaECakvG8LqLvkhtHQnaVzKznkABcAGAAZ)",
"signature": "/CxzwjmMYPj5FSiL0Zgwlst7cpvsCBSPXTEFEHGKtvR9xawGc0Sfipdt74Pqgb9ZPHb4lwky4yA2z7nDHQ/zhAE="
}
This is not expected behaviour.
Don't have a UI yet. but can you put it in Settings/Advanced?
3 languages, English, Chinese and Spanish
Using the similar UI/UX as Network
These marketing content in the app should be updated:
<string name="intro_title_third_page">Ultra reliable</string>
 Private keys never leave your device.
 Code is open sourced (GPL-3.0 license) and fully audited.
 - The fastest Ethereum wallet experience on mobile.
 + The most excellent Ethereum wallet experience on mobile.
Adjust timeout params to ensure all 2016 orders can be written.
Currently the server times out the connection after about 1/2 to 3/4 of the orders are written - 1000 orders works but 2016 doesn't.
P.S. a bug on iPhone X, if the user didn't turn on passcode/FaceID, launch the app, close the phone, reopen the phone, the app will pause at the starting page(white with our logo in the middle) for a few seconds then close automatically.
Step 1:
Run the test case to make sure that this link would throw SalesOrderMallFormed.
Step 2:
Execute exactly the same link in Android:
adb shell am start -W -a android.intent.action.VIEW -d https://www.awallet.io/import?bad
https://projects.invisionapp.com/freehand/document/G2yPfpOez
The graphics assets of that freehand is in zeplin - I trust you get the zeplin invite link.
Currently, the order is Transactions, Marketplace, Wallet and Settings
Please follow the UI/UX design, change the order to:
Marketplace, Wallet, Transactions and Setting
e.g. ImportTokenActivity:
importTxt.setText("Ticket Valid to Import");
priceETH.setText("Free import");
Every occurrence of
TODO: Display appropriate error to user
should be fixed (search the source code for it)
Situations: creating an order of higher value than 4,300Eth, creating orders with indices higher than 32768.
I noticed this in the pull request but decided to approve it anyway and put the issues aside.
Test order:
price: 0.1Eth
expiry: 0x5AB5B400
contract: bc9a1026a4bc6f0ba8bbe486d1d09da5732b39e4
indices: { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
Signed by 0x007bee82bdd9e866b2bd114780a47f2261c684e3
I have committed the latest XML to the addAssetDefinition branch. Can you continue that branch to make android uses that info? The info is correct by J.S. latest email today with the reloadable contract.
After performing a transfer, it shows "Your ticket has been imported and will be available shortly"
It should be "Your ticket has been transferred and the balance will be updated shortly"
I've compiled the first Asset Definition file, but I need Sangalli to fill in the Venues and Cities.
EG. My Listings
24 Hours
APPRECIATION
USD VALUE
a bug on iOS, launch the app, leave the phone and app opening. until it switches off automatically, reopen the phone, the app will be "frozen" on the starting page(white with our logo in the middle) for a few seconds then close automatically.
Remember AWS username is james.
To get orders expiring from now+5 minutes to now+15 minutes
$ awk 'BEGIN {print systime();}';
1518913338
$ wget -qO - https://482kdh4npg.execute-api.ap-southeast-1.amazonaws.com/dev/contract/0x007bee82bdd9e866b2bd114780a47f2261c684e3
{
"orders": [
{
"message": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOG8m/BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWojJJwB77oK92ehmsr0RR4CkfyJhxoTjAAIAAwAE)",
"expiry": "1518913831",
"start": "32800312",
"count": "3",
"price": "10000000000000000",
"signature": "jrzcgpsnV7IPGE3nZQeHQk5vyZdy5c8rHk0R/iG7wpiK9NT730I//DN5Dg5fHs+s4ZFgOGQnk7cXLQROBs9NvgE="
} ]
}
To post order: (If you don't have python runtime library, surely you can devise a way to recreate the PUT request in any language, given that the content of example PUT is down below in hex.
$ ./signing_test.py
Public Key: 76338a55250e4f8f4f30d382027eabed84c1e88484c646faea2ff04c14929c49b13ff9ddd4759c7c60ae86cdc55f847f2322b1c3af30c51216a380ebd5297853
Verifying signatures :[True, True]
Putting request.........................
{'data': '000000000000000000000000000000000000000000000000002386f26fc10000000000000000000000000000000000000000000000000000000000005a881332007bee82bdd9e866b2bd114780a47f2261c684e300020003000404560dec9670667386a3e6239b5af444dbbd0fee87470cba0d857608a05a65c599002ab9c47c1a7935878368f715a22707e1d527b9a5fc40b12b3a9ac778c66401',
'headers': {'Content-Type': 'application/vnd.awallet-signed-orders-v0'},
'url': 'https://482kdh4npg.execute-api.ap-southeast-1.amazonaws.com/dev/public-key/76338a55250e4f8f4f30d382027eabed84c1e88484c646faea2ff04c14929c49b13ff9ddd4759c7c60ae86cdc55f847f2322b1c3af30c51216a380ebd5297853?start=32800312;count=3'}
Receiving response:
"2.0 orders received."
Test code:
#!/usr/bin/python3
import requests
from time import time
import ecdsa
import urllib
import sys
import base64
from random import randint
from pprint import pprint
from binascii import hexlify
from random import randint
from sha3 import sha3_256
sk = ecdsa.SigningKey.generate(curve=ecdsa.SECP256k1)
# Alice wants to sell her 2nd, 3rd and 4th ticket
price = 10000000000000000
price = price.to_bytes(32, byteorder='big')
expiry = int(time())
contract = 0x007bEe82BDd9e866b2bd114780a47f2261C684E3
contract = contract.to_bytes(20, byteorder='big')
lot = 0x000200030004
lot = lot.to_bytes(6, byteorder='big')
key = 0xc64031ec35f5fc700264f6bb2d6342f63e020673f79ed70dbbd56fb8d46351ed
sk = ecdsa.SigningKey.from_secret_exponent(key, curve=ecdsa.SECP256k1)
sk = ecdsa.SigningKey.generate(curve=ecdsa.SECP256k1)
pk = str(hexlify(sk.get_verifying_key().to_string()), "ascii")
print("Public Key: " + pk)
vk = ecdsa.VerifyingKey.from_string(bytearray.fromhex(pk), curve=ecdsa.SECP256k1)
c = randint(1,2) # c means count of orders / signatures
expiries = [(expiry + i*600).to_bytes(32, 'big') for i in range(0,c)]
messages = [b"".join([price, expiry, contract, lot]) for expiry in expiries]
signatures = [sk.sign(message, hashfunc=sha3_256) for message in messages]
# signature has to be padded with a v value per Ethereum requirement
data = messages[0] + b"".join([sig + b'\01' for sig in signatures])
## verify signature
print("Verifying signatures :%s" %
[vk.verify(sig,msg,hashfunc=sha3_256) for sig,msg in zip(signatures, messages)])
hostname = "482kdh4npg.execute-api.ap-southeast-1.amazonaws.com"
url = "https://{}/dev/public-key/{}?start=32800312;count=3".format(hostname, pk)
headers = {"Content-Type": "application/vnd.awallet-signed-orders-v0"}
print("Putting request.........................")
pprint({'url': url, 'data': str(hexlify(data), "ascii"), 'headers': headers})
r = requests.put(url, data=data, headers=headers)
print("Receiving response:")
if r.status_code == 200:
print(r.content.decode("utf-8"))
else:
print(r.status_code)
TODO for redeem submodule.
If a project wants to do ICO with airdrop, we can send a notification to the user asking whether or not they want to receive a new airdrop. This way our users are encouraged to use our wallet because it gives free money from time to time.
If you use assert, we don't need to understand the output in order to tell if it is working. Right now MarketOrderTest prints hundreds of lines of incremental numbers, is it success or failure?
By the way, Market Order does not mean "order in the market". it means an order without expiry and is instantly dealt.
App should display the 'backup your key' screen when the user finally has eth or ticket assets.
The screen should advise user on where to put the data, and that it's locked with a password.
viewModel.exportWallet
;(In fact, exportWallet may be replaced because we use Mnemonics)
Test script to the market queue server:
#!/usr/bin/python3
import requests
from time import time
import ecdsa
import urllib
import sys
import base64
from random import randint
sk = ecdsa.SigningKey.generate(curve=ecdsa.SECP256k1)
# Alice wants to sell her 2nd, 3rd and 4th ticket
lot = 0x000200030004
contract = 0x007bEe82BDd9e866b2bd114780a47f2261C684E3
price = 10000000000000000
expiry = int(time())
signature = b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
message = b"".join([i.to_bytes(32, byteorder='big')
for i in [contract, price, expiry]]) + lot.to_bytes(6, byteorder='big')
hostname = "i6pk618b7f.execute-api.ap-southeast-1.amazonaws.com"
uri = "https://{}/test/abc?start=630832800312;count=3".format(hostname)
headers = {"Content-Type": "application/vnd.awallet-signed-orders-v0"}
r = requests.put(uri, data=message + signature*randint(1,101), headers=headers)
if r.status_code == 200:
print(r.content)
The test script returns the number of signatures returned from the server.
Alternatively, if you don't have python, you can test by using the following binary file which is copied from the http request body of one test.
Because this binary file happen to have 2 signatures (the number of signature in the test is random), its format is:
struct {
byte32 contract-address-pad-with-leading-zeros;
byte32 price-in-wei;
byte32 expiry-in-unix-time;
int[3] lot; # lot 2, lot 3, lot 4;
byte65 signature1;
byte65 signature2;
}
If you PUT these data to the test Market Queue, you get a return value indicating the number of signatures.
$ wget -qO - --header=Content-Type:application/vnd.awallet-signed-orders-v0 --method=PUT --body-file=body_file.gif 'https://i6pk618b7f.execute-api.ap-southeast-1.amazonaws.com/test/abc?start=630832800312;count=3'
2
Not sure if this is James' side of a problem but he seems to be overloaded for now.
Reproduce:
Import null (null) asset
While the server produces:
io.stormbird.token.entity.BadContract
at io.stormbird.token.web.Ethereum.TransactionHandler.getBalanceArray(TransactionHandler.java:67)
at io.stormbird.token.web.AppSiteController.decodeLink(AppSiteController.java:76)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:209)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:877)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:783)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:974)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:866)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:851)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:109)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:496)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.