npm package: @protonprotocol/proton-link
Description: Persistent, fast and secure signature provider for Proton chain built on top of [EOSIO Signing Requests (EEP-7)](https://github.com/greymass/eosio-signing-request). This was forked from the [Anchor Link](https://github.com/greymass/anchor-link) module, mu
Author: jafri
Latest version: 2.5.8

# Proton Link [!![Package Version](https://img.shields.io/npm/v/@protonprotocol/https://www.npmjs.com/package/@protonprotocol/proton-link.svg?style=flat-square](https://www.npmjs.com/package/@protonprotocol/proton-link) ![License](https://img.shields.io/npm/l/@protonprotocol/proton-link.svg?style=flat-square)

Persistent, fast and secure signature provider for Proton chain built on top of [EOSIO Signing Requests (EEP-7)](https://github.com/greymass/eosio-signing-request). This was forked from the [Anchor Link](https://github.com/greymass/anchor-link) module, much of the documentation from Anchor Link still applies.

Key features:
  - Persistent sessions
  - Cross device signing
  - End to end encryption
  - Open standard

Resources:
  - [API Documentation](https://greymass.github.io/anchor-link)
  - [Protocol specification](./protocol.md)
  - [Usage examples](./examples)

## Installation

The `proton-link` package is distributed as a module on [npm](https://www.npmjs.com/package/@protonprotocol/proton-link)

### Browser using a bundler (recommended)

Install Proton Link and a [transport](#transports):

```
yarn add proton-link proton-browser-transport
# or
npm install --save proton-link proton-browser-transport
```

Import them into your project:

```js
import ProtonLink from 'proton-link'
import ProtonLinkBrowserTransport from 'proton-browser-transport'
```

### Using node.js

Using node.js

```
yarn add @protonprotocol/proton-link @protonprotocol/proton-browser-transport
# or
npm install --save @protonprotocol/proton-link @protonprotocol/proton-browser-transport
```

Import them into your project:

```js
const ProtonLink = require('proton-link')
const ProtonLinkBrowserTransport = require('proton-browser-transport')
```

## Basic usage

First you need to instantiate your transport and the link.

```ts
const transport = new ProtonLinkBrowserTransport()
const link = new ProtonLink({transport})
```

For more customization, please see [Proton Browser Transport](https://github.com/ProtonProtocol/ProtonWeb/tree/develop/packages/proton-browser-transport)

Now you're ready to create signing requests for Proton main-net.

```ts
const action = {
    account: 'xtokens',
    name: 'transfer',
    authorization: [{
        actor: '............1', // ............1 will be resolved to the signing accounts permission
        permission: '............2' // ............2 will be resolved to the signing accounts authority
    }],
    data: {
        from: '............1',
        to: targetAccount,
        quantity: '0.01000000 XUSDT',
        memo: 'Taskly'
    }
}
link.transact({action}).then((result) => {
    console.log(`Transaction broadcast! Transaction id: ${ result.processed.id }`)
})
```

See the [Link.transact API docs](https://greymass.github.io/anchor-link/classes/link.html#transact) for all options and return values.

To create a persistent login session use [Link.login](https://greymass.github.io/anchor-link/classes/link.html#login), example:

```ts
link.login('mydapp').then(({session}) => {
    session.transact({action}).then((result) => {
        console.log(`Transaction broadcast! Transaction id: ${ result.processed.id }`)
    })
})
```

You can find more examples in the [examples directory](./examples) in the root of this repository.

## Transports

Transports in Anchor Link are responsible for getting signature requests to the users wallet when establishing a session or when using anchor link without logging in.

Available transports:

 Package | Description
---------| ---------------
 [proton-browser-transport](https://www.npmjs.com/package/@protonprotocol/proton-browser-transport) | Browser overlay that generates QR codes or triggers local URI handler if available

See the [`LinkTransport` documentation](https://greymass.github.io/anchor-link/interfaces/linktransport.html) for details on how to implement custom transports.

## Protocol

The Proton Link protocol uses EEP-7 identity requests to establish a channel to compatible wallets using an untrusted HTTP POST to WebSocket forwarder (see [buoy node.js](https://github.com/greymass/buoy-nodejs) and [buoy golang](https://github.com/greymass/buoy-golang)).

A session key and unique channel URL is generated by the client which is attached to the identity request and sent to the wallet (see [transports](#transports)). The wallet signs the identity proof and sends it back along with its own channel URL and session key. Subsequent signature requests can now be encrypted to a shared secret derived from the two keys and pushed directly to the wallet channel.

[📘 Protocol specification](./protocol.md)

## Developing

You need [Make](https://www.gnu.org/software/make/), [node.js](https://nodejs.org/en/) and [yarn](https://classic.yarnpkg.com/en/docs/install) installed.

Clone the repository and run `make` to checkout all dependencies and build the project. See the [Makefile](./Makefile) for other useful targets. Before submitting a pull request make sure to run `make lint`.

## Implementation Details

Proton Web SDK is a cross-device authentication and signing protocol built on top of ESR (EOSIO Signing Requests / EEP-7).

More information in the [Proton Web SDK](https://github.com/ProtonProtocol/ProtonWeb)

## License

[MIT](./LICENSE.md)

---

Made with ☕️&❤️ by [team Greymass](https://greymass.com) and [Proton](https://protonchain.com).