Code Monkey home page Code Monkey logo

algosigner's People

Contributors

distractivekatie avatar fgamundi avatar purebrent avatar purestaketdb avatar tgmichel 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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

algosigner's Issues

Sign Stateful Smart Contract update transaction using algosigner

I am currently developing a web application using angular, Algosigner, and TEAL stateless smart contract. I started with a basic attempt to develop a smart contract that writes a string on the global state then updates it if an update request is sent from Algosigner. However, I got the following error message:
"errors : {"message":"TransactionPool.Remember: transaction 244HDWNY5BMNMRXAKM5KZX2KXOAALUDJ56JCA2AICS6CNXHKU2CA: check failed on ClearStateProgram: program version 10 greater than max supported version 4"}"

It is to be noted that the same transaction works fine with algosdk (version 1.9.1). However, I would like to sign it with Algosigner.

The adopted versions are:
Algosigner 1.5.1
Angular:12.0.3
nodejs: v14.16.0

Below are the codes of the teal approval and clear programs along with the Algosigner method and the transaction parameters details.
Approval program
image

Clear state program:
image

Transaction parameters details:
{
"type": "appl",
"from": "ROY4QWRX44K2EBJ7P7FB63TKTMXLBEPPL2BKPBHAVUBJCC4XH5H5DENFIE",
"fee": 1000,
"firstRound": 14632823,
"lastRound": 14633823,
"note": "note",
"genesisID": "testnet-v1.0",
"genesisHash": "SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI=",
"group": null,
"lease": null,
"reKeyTo": null,
"flatFee": null,
"name": null,
"tag": null,
"appIndex": 16037988,
"appOnComplete": 4,
"appAccounts": null,
"appApprovalProgram": "AiADAAQBJgMEbmFtZQZoYWxpbWEEc2FmYSIxGRJAAAgjMRkSQAAGACgpZyRDKCpnJEM=",
"appClearProgram": "CopyAiABASJD",
"appForeignApps": null,
"appForeignAssets": null,
"appGlobalInts": null,
"appGlobalByteSlices": null,
"appLocalInts": null,
"appLocalByteSlices": null
}

Algosigner update method:
`updateApplicationTxn = () => {

// @ts-ignore
AlgoSigner.algod({
  ledger: this.ledger,
  path: '/v2/transactions/params'
})
  .then((d) => {
    let txParams = d;
    // @ts-ignore 
    AlgoSigner.sign({
      type: 'appl',
      from: this.connectedAccount,
      fee: txParams['min-fee'],
      firstRound: txParams['last-round'],
      lastRound: txParams['last-round'] + 1000,
      genesisID: txParams['genesis-id'],
      genesisHash: txParams['genesis-hash'],
      appIndex: 16037988,
      note: 'note',
      appApprovalProgram: "AiADAAQBJgMEbmFtZQZoYWxpbWEEc2FmYSIxGRJAAAgjMRkSQAAGACgpZyRDKCpnJEM=",
      appClearProgram: "CopyAiABASJD",
      appOnComplete: 4
    })
      .then((signedTx) => {
        // @ts-ignore 
        AlgoSigner.send({
          ledger: this.ledger,
          tx: signedTx.blob
        })
          .then((d) => {
            this.signedTx = d;
            this.lastmessage = " Transaction sent : " + JSON.stringify(d);
            this.txId = d.txId;
          })
          .catch(
            err => {
              console.log(JSON.stringify(err))
              this.message = JSON.stringify(err)
            })
       })
      .catch(
        err => {
          console.log(JSON.stringify(err))
          this.message = JSON.stringify(err)
        })
  })
  .catch(
    err => {
      console.log(JSON.stringify(err))
      this.message = JSON.stringify(err)
    })

}`

If it can help, please find below the algosdk method that worked just fine:
`
_publics.updateSSC = async (sender) =>{

let params = await client.getTransactionParams().do();
let approvalProgram=new Uint8Array(Buffer.from("AiADAAQBJgMEbmFtZQZoYWxpbWEEc2FmYSIxGRJAAAgjMRkSQAAGACgpZyRDKCpnJEM=", "base64"));
let index=16037988
let clearProgram= new Uint8Array(Buffer.from("AiABASJD", "base64"));
let txn = algosdk.makeApplicationUpdateTxn(sender, params, index, approvalProgram, clearProgram);
let myAccount = algosdk.mnemonicToSecretKey("my passphrase")
let signedTxn = txn.signTxn(myAccount.sk);
let txId = txn.txID().toString();
await client.sendRawTransaction(signedTxn).do();
return txn

}

`

I would be grateful if you can help resolve this issue. Please feel free to ask for any additional information.

v2 Sign - converting circular structures error

Reported by a user - will review internally and identify issue

  1. Transaction a is an app creation call with args passed and has a signers: [] and signed separately by logisic, hence no need to sign by user via algosigner but i still provide it for group validation and to avoid (part of unknown transaction group warning)
  2. Transaction b is a simple pay transaction that needs signing by user

Here is what i experience when i use the v2 algosigner methods.
If i encode the args array in app create transaction into a string - i get an error from algosigner that its a part of an unknown transaction group
If i don't encode it an leave as uint8array, i get the fancy new signer screen where i click sign for each transaction in a group, when i click sign for the last transaction in a group i get converting circular structures error.

Hence, this blocks me from upgrading to v2 algosigner and i have to continue sending individual transactions for signing via v1 methods

Cannot connect to sandbox nodes

I have been trying to connect to the private and test network (via sandbox) but I cannot get the extension to show balances for any accounts - instead balances go blank and the transactions don't show either.

Sometimes, the console for the extension throws Error handling response: TypeError: Cannot read property 'length' of undefined at chrome-extension://kmmolakhbgdlpkjkcjkebenjheonagdm/main.js:1560:465. Sometimes I think I had a CORs issue or something.

Steps to reproduce:

git clone https://github.com/algorand/sandbox.git
cd sandbox
./sandbox up

Then:

Sign in screen blank sometimes.

On an average of once every five times, the sign in page goes blank.
Below is the screenshot
Screenshot from 2020-09-25 22-26-49
Refreshing the page solves the problem.

Below is the error

main.js:1279 Uncaught (in promise) TypeError: Cannot read property 'length' of undefined
    at y.la [as constructor] (main.js:1279)
    at y.$ [as render] (main.js:1)
    at L (main.js:1)
    at main.js:1
    at Array.some (<anonymous>)
    at z (main.js:1)

Firefox extension

Algosigner chrome extension loads on Firefox as it is. I don't know if all the features work, but we can report here if any don't work. Since it's the same code base, can we get someone to test and submit it to Mozilla add-on store?

(I know previous ticket said there's only 3% Firefox users, but we have to keep in mind that it's because of corporations using chrome for everything. On personal computers i'm sure Firefox usage is much higher. Not to mention this takes very little effort)

For those who want to use Algosigner in Firefox right now, it is not supported (yet), hopefully this ticket addresses it. But it is possible if you load it through Menu -> Addons ... -> ⚙️ -> Debug Add-ons -> Load Temporary Addon -> Select manifest file from dist folder. Again, ⚠️ This is not officially supported, and if you lose everything doing this, no one is responsible but you. ⚠️

OS X Password field freezes/stutters on extended desktop

Using OS X (verified on Catalina 10.15.6, and Mojave 10.14.6) with an external monitor with the "mirrored display" off and the browser placed on the external monitor - in Chrome latest, the Password field of the create account is exceptionally slow or frozen.

The team is aware and looking for a resolution. In the meantime it is possible to work around by either using the 'mirrored display' setting, placing the browser on the laptop screen, or not using an external monitor.

Question on signing a multisig with Algosigner

Is it possible, given a multisig address M generated by addresses A,B,C and threshold = 2, to create a pay tx where 'from'=M and that I can sign with private key of A to generate the signed tx, and then hand over the signed tx to the other participant B to add his signature? I've found many examples on multisig but none with Algosigner as signer.

Unable to connect to Sandbox

I have setup sandbox and am able to interact with the APIs using curl and the go-sdk.

I have configured AlgoSigner's Sandbox network matching the configuration in the 1.4 announcement blog post.

I imported my test account mnemonics into AlgoSigner with the proper network (Sandbox) selected.

Once the accounts are imported and I select them the balances and the transactions never load. There is just a spinner below Transactions.

My guess is there may be an issue with my headers? The README was cryptic and the blog post was the only reference I have found pointing me towards the expected header

Network Headers: Object stucture that will be used as replacement headers for calls. The object structure has an "Algod" and "Indexer" sub structure which will contain the headers the target api needs in order to function.

Sign compiled program

I'd like the ability to sign a compiled teal program that will act as a delegate signature

Newcomers become confused when creating account

While creating account, I copy the Mnemonic and go to text editor to save the Mnemonic. When I return to the AlgoSigner extension, I am not shown the Mnemonic and address again.
I can still import account with the Mnemonic and see the address. But newcomers become confused and paranoid that they were unable to copy the address at the first attempt. Newcomers would like to copy both the address and Mnemonic without going to the main screen.

Attaching the related gif
ezgif-1-60e33f269acd

Request an extension support for firefox or safari

It would be great if there is an extension available for safari or firefox. Thus we can give a choice to the end user on which browser they can use to visit our dApp. Metamask is having a firefox and chrome extension. Limiting us to one browser may negatively effect adoption.

Capture2

Build fails with recursion errors

The build will currently fail with recursion errors similar to:

ERROR in ./node_modules/algosdk/src/client/v2/algod/sendRawTransaction.js Module not found: Error: Recursion in resolving

This is due to the Algosdk package not being pinned to the last known good version, 1.7.2, and the new 1.8.0 version containing a breaking change.

The next release will again pin the Algosdk version, in the meantime, if you are building from source, you may wish to do so yourself.

Add About section to Algosinger

Hi team!
Thank for your work to create amazing packages.

I think we should add About to Algosigner. This help user know current version and another useful information(link).

Thank for look my issue.

AlgoSigner new feature request

Algosigner becomes hidden very often. You can reopen it, but it is cumbersome.
It would be great to have a feature like in MetaMask, to have a setup feature to maximize the app, i.e. to put on a separate Tab in the browser.

Algosigner not injected again after refreshing page in React

I am building a project using Algosigner and React and I followed the code given in the article Integrate AlgoSigner to JavaScript Application on Algorand

Code snippet:

    useEffect(() => {
        if (typeof window.AlgoSigner !== "undefined") {
            // connects to the browser AlgoSigner instance
            window.AlgoSigner.connect()
                // finds the TestNet accounts currently in AlgoSigner
                .then(() =>
                    window.AlgoSigner.accounts({
                        ledger: "TestNet",
                    })
                )
                .then((accountData) => {
                    // the accountData object should contain the Algorand addresses from TestNet that AlgoSigner currently knows about
                    console.log(accountData);
                })
                .catch((e) => {
                    // handle errors and perform error cleanup here
                    console.error(e);
                });
        } else {
            console.log(window.AlgoSigner);
        }
    }, []);

On opening the application for the first time, everything works fine. The accounts addresses get logged on the console.
However, on refreshing the page, the useEffect runs again and window.Algosigner is undefined.

AlgoSigner is not added to `window` global in certain cases

I believe this may be a related closed issue:
#396

In some cases, it appears that AlgoSigner does not attach itself to the window global. It seems to happen after a page refresh. But it's intermittent and hard to debug.

Also, noticed that AlgoSigner does not inject itself to window if opening a blank tab, or on localhost. Is that behavior documented anywhere?

Just looking for more information so I can figure out how to reproduce/debug this issue. Thanks.

Missing Authentication Token

I would like to find the list of transactions of a address.
When I run the below code, I get "Missing Authentication Token" error message

await AlgoSigner.algod({
  ledger: 'MainNet',
  path: '/v2/accounts/GVZFXMO3QO5JMLQGQCYZG7SOWHZJ47BYUWXA6WDZOVJPFKX2M46X5C2YEU/transactions'
})

I am able to run the below code without any error

await AlgoSigner.algod({
  ledger: 'MainNet',
  path: '/v2/accounts/GVZFXMO3QO5JMLQGQCYZG7SOWHZJ47BYUWXA6WDZOVJPFKX2M46X5C2YEU'
})

Send a transaction from a re-keyed account

Hi,

I'm trying to sign a transaction from a re-keyed account. Here is the transaction I'm trying to sign where "GIADCL7O..." is the re-keyed account:

    window.AlgoSigner.sign({
        from: "GIADCL7OAX3IDFJKXI6ION5RJ55AQGAN33KAZQZNGCZOSKC2QQWP3UT7CU",
        to: context.meta.account,
        amount: 10000,
        note: "Footium:BLAH",
        type: "pay",
        fee: context.txParams['min-fee'],
        firstRound: context.txParams['last-round'],
        lastRound: context.txParams['last-round'] + 1000,
        genesisID: context.txParams['genesis-id'],
        genesisHash: context.txParams['genesis-hash']
    }).then(signedTx => {
        ...

However, it seems that I can't do this, as the error message is: message: "from is not a valid user account."

I have a feeling this isn't supported yet, or am I doing something wrong?

Many thanks,

Can't clear cached ASAs without deleting the wallet.

This scenario obviously shouldn't happen on mainnet, but when working in a sandbox network which is reset clearing all previous data, the ASAs shown within the accounts never clear/update and I don't seem to be able to force clear them without deleting the entire wallet and starting over. I have tried removing the individual accounts and importing them again, but that doesn't work either.

I've included a screenshot below, but it may look a little confusing. In summary, the two assets at the top labelled "First Asset #000x" were created via goal asset create and then viewed within AlgoSigner. I then reset the sandbox and created 4 new assets labelled "Second Asset #000x". However the first two have the same asset id of the previous two assets, so AlgoSigner doesn't seem to ever clear or update their name/unitname/decimal. I also show the JSON response of the current indexer, to show the real names of the first two assets.

Screenshot from 2021-03-28 15-03-59

I suppose what I'm looking for is an enhancement to allow clearing the local asset cache without deleting the entire wallet.

Support for BetaNet

First of all, really excited to see this being released so soon! It's definitely a big step up from copy/pasting goal commands.

Is support for BetaNet planned for the future? The extension currently seems to support MainNet and TestNet.

No Pop Up to Submit vote for Governance

Voting in period #3 voting session 1 - Clicking submit vote produces [RequestError.NotAuthorized] instead of a popup asking to submit votes in Algosigner. The account is signed in, has the transaction ID (with 0 algo commited) and is cleared for governance in current voting session.

Produces the following error:
requesterror

Is this library actively maintained?

With the recent hack of MyAlgo wallet, protocols are looking to support web wallets. It seems Algosigner may not be popular, but its audited and open sourced. The question is, is it actively maintained? Are security issues that comeup resolved by a dedicated team?

Define what is wrong with txnObject when calling AlgoSigner.sign() method.

Current implementation does not emit a clear error about what is wrong with txnObject. So for example if to address is not valid, AlgoSigner should emit an error clearly identifying that "To Address is not valid." . Instead it says "Some properties are not valid.". This is very hard to debug as user does not have a way to determine what's wrong with the object.

Unable to sign transaction w/ 2nd Ledger Nano S account

I have a Nano S with multiple Algo accounts. While I was able to add the 2nd account to AlgoSigner and opt into Tinyman and Yieldly, I am unable to run any swaps on Tinyman. The extension prompts to sign the transactions for the swap but it never sends the transaction to the Ledger and the site returns an error:

There was a problem signing the transaction(s).

The same error throws if I run it without the Ledger attached so it seems to act like it can't find the device (even though I am able to connect the wallet to the website and it sees both accounts)

1/28 Update:
As a followup I am now unable to sign any transactions with the Ledger Nano S, even a simple send between accounts. After clicking "Send Transaction To Device" it just sits and spins. I can remove/re-add the accounts to the extension so it is at least able to communicate with the Ledger and find accounts, but for some reason never sends over transactions for signing.

Environment details:
OS: Windows 10 (also the same issue with Ubuntu 20.04)
Ledger Firmware 2.1.0
Ledger Algo App 1.2.15

Wrong total displayed

Hello,

we noticed an error in the displayed total.

For example, we are signing this algosdk transaction:
p { amount: 6000000, fee: 1000 flatFee: false from: {publicKey: Uint8Array(32), checksum: Uint8Array(4)} genesisHash: Uint8Array(32) genesisID: "testnet-v1.0", group: undefined, lastRound: 16265985, name: "Transaction" note: Uint8Array(76) tag: Uint8Array(2) to: {publicKey: Uint8Array(32), checksum: Uint8Array(4)} type: "pay" }

However, while the raw transaction in AlgoSigner is correct, it displays an amount of 10006 Algos (see the pictures). Both amount and fee are passed as numbers to the transaction constructor.
Screenshot 2021-08-26 at 20 44 11
Screenshot 2021-08-26 at 20 44 31

Any idea on how to fix this?

Thanks!

Extension create account fades out after alt-tabbing

I'm trying to create a new account through the AlgoSigner Chrome extension and in both Chrome and Brave, whenever I alt-tab to be able to write the password down in a password manager, the extension pop-up fades out so I have to begin the process all over again.

Is there an alternative way for me to create an account that can be used by AlgoSigner? The browser's behaviour is blocking me from creating an account and I'm sure it would block potential users of our dApp from using AlgoSigner.

default account in wallet

Hi, currently algosigner.accounts returns an array of all accounts in wallet.
Is there an API to fetch a wallet's default(i.e currently active) account ? Or is it algosigner.accounts({..})[0] (first account from list of accounts)?

If not, we would like to make a feature request to set/support a default account in wallet.

AlgoSigner UI got frozen

After I installed it in Chrome, the UI got frozen several times. I was unable to go on.
After I started Metamask, the UI began to work.

Inject Algosigner also into Iframes

Hi,

We're Andpay - building the first pure PSP fully on the Algorand blockchain. Lately we've integrated support with Algosigner, however we found out that Algosigner isn't compatible with our embeddable components (iframe based).

We noticed that the JS file that's being added is only injected in the top-level document frame and not on all the underlying iframes within that page. Could the Algosigner extension be updated with:

"content_scripts": [ { ... "all_frames": true, ... } ],
As explained here: https://developer.chrome.com/docs/extensions/mv3/content_scripts/#frames

This should potentially make it possible to also run Algosigner support within iframes. Hope to see this implemented soon - as currently Algosigner won't be offered as Payment option within our embeddable components.

Validation failed for transaction due to invalid properties

Got error when try to sign the transaction, i am not found the error message in https://github.com/PureStake/algosigner/blob/develop/docs/dApp-integration.md#rejection-messages

Error:

{
    "message": "Validation failed for transaction due to invalid properties.",
    "code": 4300,
    "name": "InvalidFields",
    "data": "Validation failed for transaction #0 because of invalid properties [genesisID: The associated genesis id does not match a supported ledger.]. "
}

How to connect:

AlgoSigner
        .connect()
        .then((res: any) => {
        .........

How to sign:

 AlgoSigner
        .signTxn(txns)
        .then((res: any) => {
        .......

Sandbox status:

❯ ./sandbox status -v

algod - goal node status
Last committed block: 46234
Time since last block: 0.5s
Sync Time: 0.0s
Last consensus protocol: https://github.com/algorandfoundation/specs/tree/d5ac876d7ede07367dbaa26e149aa42589aac1f7
Next consensus protocol: https://github.com/algorandfoundation/specs/tree/d5ac876d7ede07367dbaa26e149aa42589aac1f7
Round for next consensus protocol: 46235
Next consensus protocol supported: true
Last Catchpoint: 
Genesis ID: sandnet-v1
Genesis hash: CVdnP9aMgTVL4hiCAfZEUAU6/DOM652Dsp5d3f9ys5I=

indexer - health
{
  "data": {
    "migration-required": false,
    "migration-status": "Migrations Complete"
  },
  "db-available": true,
  "is-migrating": false,
  "message": "46234",
  "round": 46234,
  "version": "(unknown version)"
}

AlgoSigner instance (chrome extension ):

{
    "consensus-version": "https://github.com/algorandfoundation/specs/tree/d5ac876d7ede07367dbaa26e149aa42589aac1f7",
    "fee": 0,
    "genesis-hash": "wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8=",
    "genesis-id": "mainnet-v1.0",
    "last-round": 21188805,
    "min-fee": 1000
}

is there anyone can help ? thanks

Uncaught error leads to blocking call

When making a call to sign a set of transactions if asset call 404s the signTxn call blocks forever. No error message or signing popup is present.

It seems to have been introduced in the latest release

Adding appOnComplete and appArgs to an application call crashes AlgoSigner during sign

The application call is

{
      type: 'appl',
      from: userAddress,
      appIndex: environment.appId,
      appOnComplete: 0, // 0 == NoOp
      appArgs: appArgs,
      fee: txParams.fee,
      firstRound: txParams['last-round'],
      lastRound: txParams['last-round'] + 1000,
      genesisID: txParams['genesis-id'],
      genesisHash: txParams['genesis-hash'],
}

And the encodedAppArgs are

const appArgs = [
     new Uint8Array(Buffer.from('da')),
];

image
image

Is it possible to sign single transactions belonging to a group?

Hello, I'm trying to sign a transaction belonging to a group of two transactions. The first transaction has already been signed server-side, and I'm trying to sign the second one client-side using AlgoSigner, but I'm receiving this error: "The transaction group is incomplete or presented in a different order than when it was created.".

By looking at the code (

test('Reject on Group ID for Single Transactions', async () => {
) I suppose is not possible to sign single transactions belonging to a group.

Am I right?

Firefox Release?

Is there any word on releasing this to firefox (or firefox forks) any time soon? Don't know if there are ways to upload this as developer version through the firefox add-on feature

Incomplete Docs for AlgoSigner.sign() Method

AlgoSigner.sign method expects type key which is being checked in actions.ts and not specified in docs.
here is the screenshot of the code block. Without this key in txnObject AlgoSigner.sign() always throws an error.
image

docs should be

let txn = {
   type: "Pay|Acfg|Afrz|Axfer|Keyreg"
   from: accounts[0].address,
   to: 'PBZHOKKNBUCCDJB7KB2KLHUMWCGAMBXZKGBFGGBHYNNXFIBOYI7ONYBWK4',
   fee: txParams['min-fee'],
   amount: amount,
   firstRound: txParams['last-round'],
   lastRound: txParams['last-round'] + 1000,
   genesisID: txParams['genesis-id'],
   genesisHash: txParams['genesis-hash'],
   note: 'NOTE is a string',
};

AlgoSigner.sign(txn);

Add a way to sign a message without a transaction

Hi,

We are creating a d-app using AlgoSigner. We want to ask the user to sign a message with their address to check that it is really theirs. This will be used to authenticate users by their algo address only.

For now, we are using AlgoSigner.sign with a transaction of 0 algos with a random note. However, it is displaying a transaction to sign to users, with fees. Thus, users might be afraid that they need to pay something. Would it be possible to add a new UI to sign a short message without displaying anything about transactions, prices or fees?

Thanks.

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.