# User Signing

This is a relatively advanced use case. If you use the signed typed data JSONRPC endpoint, Fortmatic will support this as well.

## Signing Methods

{% tabs %}
{% tab title="Web3 Pre-1.0 Personal Sign" %}
![](https://2455634949-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lj7HukBJLlR6jbx0-eP%2F-LssmGz2Wzitv8xlPIxL%2F-Lsso-8QtItJ9nG91gPO%2Fpersonal-sign%402x.png?alt=media\&token=8ece05c6-8067-4857-a944-ca07477061d3)

```javascript
// Initialize provider
import Fortmatic from 'fortmatic';
import Web3 from 'web3';

// Required to convert message to Hex
const ethUtil = require('ethereumjs-util');

const fm = new Fortmatic('YOUR_API_KEY');
window.web3 = new Web3(fm.getProvider());

web3.eth.getAccounts((error, accounts) => {
 
  if (error) throw error;
 
  const from = accounts[0];
  const msg = ethUtil.bufferToHex(new Buffer('YOUR_MESSAGE', 'utf8'));
  const params = [msg, from];
  const method = 'personal_sign';
 
  web3.currentProvider.sendAsync({
    id: 1,
    method,
    params,
    from,
  }, function(error, result) {
    if (error) throw error;
    console.log(result);
  });

});
```

{% endtab %}

{% tab title="Web3 1.0-Beta Personal Sign" %}
![](https://2455634949-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lj7HukBJLlR6jbx0-eP%2F-LssmGz2Wzitv8xlPIxL%2F-Lsso-8QtItJ9nG91gPO%2Fpersonal-sign%402x.png?alt=media\&token=8ece05c6-8067-4857-a944-ca07477061d3)

```javascript
// Initialize provider
import Fortmatic from 'fortmatic';
import Web3 from 'web3';

const fm = new Fortmatic('YOUR_API_KEY');
window.web3 = new Web3(fm.getProvider());

// Personal Sign
const text = 'YOUR_MESSAGE';

const accounts = await web3.eth.getAccounts();
const from = accounts[0];

const result = await web3.eth.personal.sign(text, from);
```

{% endtab %}

{% tab title="Sign Typed Data v1" %}
![](https://2455634949-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lj7HukBJLlR6jbx0-eP%2F-LssmGz2Wzitv8xlPIxL%2F-Lsso2s52aYtMyXnG-OJ%2Fsign-typed-data-v1%402x.png?alt=media\&token=22be85e6-24aa-4f8c-b67b-3e3359bd93df)

```javascript
// Initialize provider
import Fortmatic from 'fortmatic';
import Web3 from 'web3';

const fm = new Fortmatic('YOUR_API_KEY');
window.web3 = new Web3(fm.getProvider());

web3.eth.getAccounts(function(error, accounts) {
 
  if (error) throw error;
 
  const from = accounts[0];
  const msg = [
    {
      type: 'string',
      name: 'fullName',
      value: 'John Doe'
    },
    {
      type: 'uint32',
      name: 'userId',
      value: '1234'
    }
  ];
  const params = [msg, from];
  const method = 'eth_signTypedData';
 
  web3.currentProvider.sendAsync({
    id: 1,
    method,
    params,
    from,
  }, function(error, result) {
    if (error) throw error;
    console.log(result);
  });

});
```

{% hint style="warning" %}
On **Web3 1.0 Beta 55**? For all signing methods, replace this...

```
web3.currentProvider.sendAsync({
  id: 1,
  method,
  params,
  from,
}, function(error, result) {
  if (error) throw error;
  console.log(result);
});
```

...with this

```
web3.currentProvider.sendPayload({
  id: 1,
  method,
  params,
  from,
}).then(console.log);
```

{% endhint %}
{% endtab %}

{% tab title="Sign Typed Data v3" %}
This is based on [EIP 712](https://eips.ethereum.org/EIPS/eip-712).

![](https://2455634949-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lj7HukBJLlR6jbx0-eP%2F-LssmGz2Wzitv8xlPIxL%2F-Lsso5KkPVcJjGZ-_ANG%2Fsign-typed-data-v3%402x.png?alt=media\&token=d7e2a24a-e7b4-49ba-8ea9-e6386ca5c548)

```javascript
// Initialize provider
import Fortmatic from 'fortmatic';
import Web3 from 'web3';

const fm = new Fortmatic('YOUR_API_KEY');
window.web3 = new Web3(fm.getProvider());

web3.eth.getAccounts(function(error, accounts) {
 
  if (error) throw error;
 
  const from = accounts[0];
  const payload = {
    "types": {
      "EIP712Domain": [
        {
          "name":"name",
          "type":"string"
        },
        {
          "name":"version",
          "type":"string"
        },
        {
          "name":"verifyingContract",
          "type":"address"
        }
      ],
      "Greeting": [
        {
          "name":"contents",
          "type":"string"
        }
      ]
    },
    "primaryType":"Greeting",
    "domain":{
      "name":"Fortmatic",
      "version":"1",
      "verifyingContract":"0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC"
    },
    "message":{
      "contents":"Hello, from Fortmatic!"
    }
  }
        
  const params = [from, payload];
  const method = 'eth_signTypedData';
 
  web3.currentProvider.sendAsync({
    id: 1,
    method,
    params,
    from,
  }, function(error, result) {
    if (error) throw error;
    console.log(result);
  });
 
});
```

{% hint style="warning" %}
On **Web3 1.0 Beta 55**? For all signing methods, replace this...

```
web3.currentProvider.sendAsync({
  id: 1,
  method,
  params,
  from,
}, function(error, result) {
  if (error) throw error;
  console.log(result);
});
```

...with this

```
web3.currentProvider.sendPayload({
  id: 1,
  method,
  params,
  from,
}).then(console.log);
```

{% endhint %}
{% endtab %}
{% endtabs %}
