Integrating Coin98 Wallet SDK

09/27/235 min read

Mantleby Mantle

Integrating Coin98 Wallet SDK

This guide is made for developers interested in integrating Coin98 Extension Wallet with Mantle Network.

If you are a user who wants to experience Coin98 Wallet, then please head over to for more details.

⚠️ Note: For existing info on Mantle's mainnet and testnet configurations, pls refer

Getting Started

Here's a quick example of a dApp connection requested via Coin98 Connect —

Quick Start NPM Package —


npm install --save @coin98-com/connect-sdk


dApps Website Connection Example

import { Client, Chain } from '@coin98-com/connect-sdk'

const client = new Client()

client.connect(Chain.fantom, {
  logo: "Provide Your App Logo URL",
  name: "Your App Name",
  url: "Provide Your App URL"

Lite Without Any Handler (Example With React Native)

import { Client, Chain } from '@coin98-com/connect-sdk'

const client = new Client()

client.connect(Chain.fantom, {
  logo: "Provide Your App Logo URL",
  name: "Your App Name",
  url: "Provide Your App URL"

Common API

// Common API
  method: "<Your Request Method Here>",
  params: [],
  redirect: "(Optional), Callback URL after handle request"
}): Promise<{ result, error }>

To detect Coin98 Extension with Mantle

To detect whether your browser is running Coin98 Extension, please use:

if(window.coin98 || window.ethereum || window.ethereum?.isCoin98){
    console.log('Coin98 Extension is installed!');

Notice: Coin98 Extension Testnet is under development and not available now. The Coin98 Extension on Ethereum JavaScript provider API is specified by EIP-1193. Support window.ethereum only and removal window.web3

To connect Coin98 Extension Wallet

To connect Coin98 Extension means to access the user's Mantle Network account(s).

// Connect & get accounts
window.ethereum.request({method: 'eth_accounts'});
// Alias for connection
window.ethereum.request({method: 'eth_requestAccounts'});​
//Check if dapp connected
//Check if the caller's current permissions
window.ethereum.request({method: 'wallet_getPermissions'});
//Check if request the given permissions 
window.ethereum.request({method: 'wallet_requestPermissions'});

To disconnect Coin98 Extension Wallet

To disconnect Coin98 Extension, please use:


To experience functions

Once your account is connected, let's start experiencing more functions.

Get Current Account

return Promise<Array[String]>

    • If wallet can not be found, return [] instead of throw Error
window.ethereum.request({ method: 'eth_accounts' }).then(accounts => {
  if (accounts[0]) {
    // Do something with accounts
  } else {
    // Wallet not found

Check wallet whether exists or not

return Promise<{data: Boolean}>

window.ethereum.request({ method: 'has_wallet', params: ['mantle'] })
// Example
window.ethereum.request({ method: 'has_wallet', params: ['mantle'] }).then(() => {
  // Wallet Exists
}).catch(e => { 
  // Wallet not found

Sign Transaction

return: Promise<Signature | RPC: 2.0>

// Example Sign Transactionconst
const signature = window.ethereum.request({
    method: 'eth_signTransaction',
    params: [
        "from": "string",
        "to": "string",
        "gas": "string",
        "gasPrice": "string",
        "value": "string",
        "data": "string",
        "nonce": "string"


return Promise<hash>

  method: 'eth_sendTransaction',
  params: [
      from: 'string',
      to: 'string',
      gas: 'string',
      gasPrice: 'string',
      value: 'string',
      data: 'string',
      nonce: 'string'


return Promise<string>

  method: 'eth_decrypt',
  params: [encryptedMessage, accounts[0]],
   .then((decryptedMessage) =>
    console.log('The decrypted message is:', decryptedMessage)
  .catch((error) => console.log(error.message));

Get Encryption Public Key

return Promise<string>— The public encryption key of the Ethereum account whose encryption key should be retrieved.

let encryptionPublicKey
  method: 'eth_getEncryptionPublicKey',
  params: [accounts[0]], // you must have access to the specified account
  .then((result) => {
    encryptionPublicKey = result;
  .catch((error) => {
    if (error.code === 4001) {
      // EIP-1193 userRejectedRequest error
      console.log("We can't encrypt anything without the key.");
    } else {


const ethUtil = require('ethereumjs-util');
const encryptedMessage = ethUtil.bufferToHex(
        publicKey: encryptionPublicKey,
        data: 'hello world!,
        version: 'x25519-xsalsa20-poly1305',

Add Ethereum Chain

result — if the request was successful, and an error otherwise.

interface AddEthereumChainParameter {
  chainId: string; // A 0x-prefixed hexadecimal string
  chainName: string;
  nativeCurrency: {
    name: string;
    symbol: string; // 2-6 characters long
    decimals: 18;
  rpcUrls: string[];
  blockExplorerUrls?: string[];
  iconUrls?: string[]; // Currently ignored.

Switch Ethereum Chain

result— if the request was successful, and an error otherwise.

        await window.await ethereum.request({
        method: 'wallet_switchEthereumChain',
            params: [{ chainId: '0xf00' }],
} catch (switchError) {
  // This error code indicates that the chain has not been added to Coin98.
  if (switchError.code === 4902) {
    try {
      await ethereum.request({
        method: 'wallet_addEthereumChain',
        params: [
            chainId: '0xf00',
            chainName: '...',
            rpcUrls: ['https://...'] /* ... */,
    } catch (addError) {
      // handle "add" error
  // handle other "switch" errors

Watch Asset

method: 'wallet_watchAsset',
    params: {
      type: 'ERC20',
      options: {
        address: '0xb60e8dd61c5d32be8058bb8eb970870f07233155',
        symbol: 'FOO',
        decimals: 18,
        image: '',
  .then((success) => {
    if (success) {
      console.log('FOO successfully added to wallet!');
    } else {
      throw new Error('Something went wrong.');

RPC Request

return Promise<Ethereum RPC> Currently only supports HTTP(s) methods.

window.ethereum.request({method: '<Your Method>', params: [args1,....]})

Experimental MultiChain Connection

You can connect and receive multiChain addresses at the same time by using the following methods

async function connect(){
                throw new Error('Coin98 Extension is required');
        const accounts = await window.coin98.connect([<chain 1>, <chain 2>, ...]);
                throw new Error('Connect Error | User cancel your request');
        // Do anything with accounts:[<address of chain 1>, <address of chain 2>]

When your connection is successful, the chain's properties will be available for your next request. For example:

// For example | connect ether & solana
async function connect(){
        const conn = await window.coin98.connect(['ether','solana']);
        // If user accept the request, those properties will available at window.coin98;
        //  window.solana || Checkout document of solana connection guide for more methods;
        //        window.ether || Checkout document of ether connection guide for more methods;

Chain's Name can be found at

const { CHAIN_NAME } = window.coin98


Support subscribe using JSON-RPC notifications. This allows clients to wait for events instead of polling for them. All results will be released at a data event.

// For Subscribe
        method: 'eth_subscribe',
        params: ['<type>','<options>']
// Its result will be subscription ID which can be used for unsubscribe
// For Unsubscribe
        method: 'eth_unsubscribe',
        params: ['<Subscription ID>']


// Subscribe for event
const subscriptionID = window.ethereum.request({
    method: 'eth_subscribe',
        params: ["logs", 
                address: "0x8320fe7702b96808f7bbc0d4a888ed1468216cfd", 
                topics: ["0xd78a0cb8bb633d06981248b816e7bd33c2a35a6089241d099fa519e361cab902"]}]
// You can listen for incoming notifications by
window.ethereum.on("data", data => {
        // Do the rest of your work with data

To Handle events

List of events

Currently Coin98 only supports some action events from wallet extension.

window.ethereum.on('event_name', callback);
window.ethereum.on('close', () => window.location.reload());
window.ethereum.on('accountsChanged', () => window.location.reload());


Amazing! You're now equipped with the latest info on integrating Coin98 Wallet SDK with Mantle Network!

🛑 Have doubts and need support? Join our Discord Server and ping the Dev Rel team for support or interact with other blockchain developers and fellow builders!

💪🏼 Not tired and want to keep building? Head over to and check out an amazing list of tutorials to keep building cool dApps on Mantle Network!

Ciao! 👋🏼