Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

fsl-authorization

fslid1.4kISC1.1.1-beta.51TypeScript support: included

What id FSL ID

jssdk

readme

FSL-ACCOUNT-SDK

What is FSL ID

Getting started

  • npm | yarn | pnpm install
import { FSLAuthorization } from 'fsl-authorization';

const fslAuthorization = FSLAuthorization.init({
  responseType: 'code', // 'code' | 'token'
  appKey: 'Your APP KEY',
  redirectUri: 'Your Redirect URL', // https://xxx.xxx.com
  scope: 'basic', // 'basic' | 'wallet'
  state: 'xyz',
  usePopup: true,
  isApp: true,
});

fSLAuthorization.signInV2().then(({ code }) => {
  if (code) {
    // todo your code
  }
});

callEvmSign

import { FSLAuthorization } from 'fsl-authorization';

// your Three-party login initialization
// ...

fSLAuthorization
  .callEvmSign({
    chainId: 80002,
    msg: 'Your Sign Message',
    chain: 'Amony', // Specify the test chain name
  })
  .then((res) => {
    console.log('signedTx', res);
    const address = FSLAuthorization.evmVerifyMessage('Your Sign Message', res);
    // Check whether the resolved address is the same as the user address
  });

If you don't want to pass object instances

// Make sure the user has logged in to fslid, you can do this again
// or

const args = {
  chainId: 137,
  msg: 'Your Sign Message',
};

const url = `https://id.fsl.com/authorization/sign?arguments=${JSON.stringify({
  ...args,
  appKey: 'Your App key',
})}`;

window.open(
  url,
  'signWindow',
  `left=${window.screen.width / 2 - 200},top=${
    window.screen.height / 2 - 500
  },width=500,height=800,popup=1`,
);

// If you want to get the result of the call
const handleMessage = (e: any) => {
  if (e.data.type === 'fsl_auth') {
    console.log(e.data.data);
    window.removeEventListener('message', handleMessage);
  }
};
window.addEventListener('message', handleMessage, false);

Types

interface IEvmSign {
  msg: string;
  rpc?: string;
  chainId: number;
}

callEvmContract

import { FSLAuthorization } from 'fsl-authorization';
import { ethers } from 'ethers';

// your Three-party login initialization
// ...

fSLAuthorization
  .callEvmContract({
    contractAddress: '0xc2132D05D31c914a87C6611C10748AEb04B58e8F',
    methodName: 'transfer',
    params: ['0x...', ethers.BigNumber.from(Math.floor(10 * Math.pow(10, 6)))],
    abi: [
      {
        constant: false,
        inputs: [
          { name: '_to', type: 'address' },
          { name: '_value', type: 'uint256' },
        ],
        name: 'transfer',
        outputs: [{ name: '', type: 'bool' }],
        payable: false,
        stateMutability: 'nonpayable',
        type: 'function',
      },
    ],
    gasLimit: '100000',
    to: '0x...',
    chainId: 137,
  })
  .then((res) => {
    console.log('TransactionReceipt', res);
  });

If you don't want to pass object instances

// Make sure the user has logged in to fslid, you can do this
// or
import { ethers } from 'ethers';

const args = {
  contractAddress: '0xc2132D05D31c914a87C6611C10748AEb04B58e8F',
  methodName: 'transfer',
  params: ['0x...', ethers.BigNumber.from(Math.floor(10 * Math.pow(10, 6)))],
  abi: [
    {
      constant: false,
      inputs: [
        { name: '_to', type: 'address' },
        { name: '_value', type: 'uint256' },
      ],
      name: 'transfer',
      outputs: [{ name: '', type: 'bool' }],
      payable: false,
      stateMutability: 'nonpayable',
      type: 'function',
    },
  ],
  gasLimit: '100000',
  to: '0x...',
  chainId: 137,
};
const url = `https://id.fsl.com/authorization/sign?arguments=${JSON.stringify({
  ...args,
  appKey: 'Your App key',
})}`;

window.open(
  url,
  'callContractWindow',
  `left=${window.screen.width / 2 - 200},top=${
    window.screen.height / 2 - 500
  },width=500,height=800,popup=1`,
);

// If you want to get the result of the call
const handleMessage = (e: any) => {
  if (e.data.type === 'fsl_auth') {
    console.log(e.data.data);
    window.removeEventListener('message', handleMessage);
  }
};
window.addEventListener('message', handleMessage, false);

Types

interface IEvmContract {
  contractAddress: string;
  methodName: string;
  chainId: number;
  gasLimit: string;

  abi?: any; // If the abi is not recognized, you can pass it in manually
  value?: string;
  params?: any[];
  to?: string;
  rpc?: string;
  nonce?: number;

  maxPriorityFeePerGasValue?: ethers.BigNumber;
  maxFeePerGasValue?: ethers.BigNumber;
}

signTypedData

import { FSLAuthorization } from 'fsl-authorization';
import { ethers } from 'ethers';

// your Three-party login initialization
// ...

const domain = {
  name: 'ERC20Token',
  version: '1',
  chainId: 137,
  verifyingContract: '0x',
};

let spender = '0x';
let number = '100';

const types = {
  Storage: [
    { name: 'spender', type: 'address' },
    { name: 'number', type: 'uint256' },
  ],
};

const message = {
  spender,
  number,
};

fSLAuthorization
  .signTypedData({
    domain,
    types,
    message,
    chianId,
  })
  .then((res) => {
    console.log('signedTx', res);
    const address = FSLAuthorization.evmVerifyTypedData(
      domain,
      types,
      message,
      res,
    );
    // Check whether the resolved address is the same as the user address
  });

Types

interface IDomain {
  name: string;
  version: string;
  chainId: number;
  verifyingContract: string;
}

interface ITypes {
  [key: string]: Record<'name' | 'type', string>[];
}

interface IMessage {
  [key: string]: any;
}

callEvmContractByCallData

const args = {
  contractAddress: '0x',
  chainId: 137,
  gasLimit: 40000,
  callData:
    '0xa9059cbb00000000000000000000000091837ab8b09257975b3cb737d8d580aaba27b14b0000000000000000000000000000000000000000000000000000000005f5e100',
};
fSLAuthorization.callEvmContractByCallData(args).then((res) => {
  console.log('TransactionReceipt', res);
});

// If you don't want to pass object instances
const url = `https://id.fsl.com/authorization/call-data?arguments=${JSON.stringify(
  {
    ...args,
    appKey: 'Your App key',
  },
)}`;

window.open(url);

// If you want to get the result of the call
const handleMessage = (e: any) => {
  if (e.data.type === 'fsl_auth') {
    console.log(e.data.data);
    window.removeEventListener('message', handleMessage);
  }
};
window.addEventListener('message', handleMessage, false);

Types

interface IEvmCallDataParams {
  contractAddress: string;
  callData: string;
  chainId: number;
  gasLimit: string;
  rpc?: string;
  maxPriorityFeePerGasValue?: BigNumber;
  maxFeePerGasValue?: BigNumber;
}

signTransaction

import { FSLAuthorization } from 'fsl-authorization';
import { ethers } from 'ethers';

// your Three-party login initialization
// ...

fSLAuthorization
  .signTransaction({
    contractAddress: '0xc2132D05D31c914a87C6611C10748AEb04B58e8F',
    methodName: 'transfer',
    params: ['0x...', ethers.BigNumber.from(Math.floor(10 * Math.pow(10, 6)))],
    abi: [
      {
        constant: false,
        inputs: [
          { name: '_to', type: 'address' },
          { name: '_value', type: 'uint256' },
        ],
        name: 'transfer',
        outputs: [{ name: '', type: 'bool' }],
        payable: false,
        stateMutability: 'nonpayable',
        type: 'function',
      },
    ],
    gasLimit: '100000',
    to: '0x...',
    chainId: 137,
  })
  .then((signedTx) => {
    console.log('signedTx', signedTx);
  });

// If you don't want to pass object instances
const url = `https://id.fsl.com/authorization/call-data?arguments=${JSON.stringify(
  {
    ...args,
    onlySign: 'onlySign',
    appKey: 'Your App key',
  },
)}`;

window.open(url);

// If you want to get the result of the call
const handleMessage = (e: any) => {
  if (e.data.type === 'fsl_auth') {
    console.log(e.data.data);
    window.removeEventListener('message', handleMessage);
  }
};
window.addEventListener('message', handleMessage, false);

signSolMessage

fSLAuthorization.signSolMessage({ msg }).then((res) => {
  console.log('signMessage', res);
});

callSolInstructions && signSolInstructions

const transferInstruction = createTransferInstruction();
fSLAuthorization
  .callSolInstructions({
    instructions: [transferInstruction],
    keypairs: [],
  })
  .then((res) => {
    console.log('hash', res);
  });

fSLAuthorization
  .signSolInstructions({
    instructions: [transferInstruction],
    keypairs: [],
  })
  .then((res) => {
    console.log('signMessage', res);
  });

signSolTransaction

const transactions = [new Transaction()];
signSolTransaction({ transactions }).then((res) => {
  console.log('signArrayTransactions', res);
});

Join as Developers

  • Please prepare the necessary stuff and talk to an FSL guy for your interest. Here are some step guides

  • Register an FSL ID at https://id.fsl.com, and setup all necessary information. This will be your developer ID. Please make sure your 2FA and seed phrase backup is well and safely kept.

  • Tell us about your App/product in a sheet

    1. Name
    2. Icon images in 128128px and 512512px
    3. App/product description
    4. Official website
    5. Social network links
  • Go through the API references and provide your CALLBACK URL and host.

  • API API references