Skip to content

Latest commit

 

History

History
376 lines (251 loc) · 15.8 KB

README.md

File metadata and controls

376 lines (251 loc) · 15.8 KB

Quickstart

yarn add @depay/web3-wallets

or

npm install --save @depay/web3-wallets
import { getWallet } from '@depay/web3-wallets'

let wallet = getWallet()
wallet.name // MetaMask

Demo

https://depayfi.github.io/@depay/web3-wallets/dev.html

Support

This library supports the following blockchains:

This library supports the following wallets:

via WalletConnect:

Functionalities

Get wallet

Wallet: Returns an instance of the automatically detected Wallet or undefined (if no wallet could be automatically detected)

let wallet = getWallet();
// <Wallet name='MetaMask'>
let wallet = getWallet();
// undefined

Returns undefined if no wallet has been detected. Make sure you check that before you continue using the wallet:

let wallet getWallet();

if(wallet) {
  // continue with selected wallet
} else {
  // make something else
}

Get wallet name

name:string: Returns the name of the wallet.

let wallet = getWallet();
wallet.name // 'MetaMask'

Get wallet logo

logo:string: Returns the logo of the wallet as PNG base64-encoded.

let wallet = getWallet();
wallet.logo // 'data:image/png;base64,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'

Can return placeholder images if there is a wallet but type is unknown. Returns undefined if no wallet was found at all.

Get connected account

async account():string: Gets the currently connected and active account (without prompting a connect screen). Returns undefined if no account is connected.

let wallet = getWallet();
await wallet.account() // '0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B'

Get connected accounts

async accounts():string: Gets all conncetd accounts (without prompting a connect screen). Returns [] if no account is connected.

let wallet = getWallet();
await wallet.accounts() // ['0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B']

Connect an account

async connect():string: Connects accounts. Potentially opens wallet connect screen. Provides connected accounts in async return. If wallet fails to connect, also returns an empty array [].

let wallet = getWallet();
await wallet.connect() // ['0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B']

Receive supported blockchains

blockchains:Array: Array containing the names of supported blockchains

let wallet = getWallet();
wallet.name // MetaMask
wallet.blockchains // ['ethereum', 'bsc']

Check if wallet is connected to a specific blockchain

async connectedTo(blockchain):Boolean: Checks if wallet is connected to a specific blockchain.

let wallet = getWallet()
await wallet.connectedTo('ethereum') // true

If no param is given it well tell you to which blockchain the wallet is connected to:

let wallet = getWallet();
await wallet.connectedTo() // bsc

Receive wallet events

on(string, function):undefined: Register a callback function for given events.

let wallet = getWallet();
wallet.on('account', (newAccount)=>{
  doSomething(newAccount)
})

Events

on('account', (newAccount)=>{}): Triggers when user changes the connected/active wallet account.

on('accounts', (newAccounts)=>{}): Triggers when user changes any connected wallet account.

on('network', (newNetwork)=>{}): Triggers when user changes network of the connected wallet.

on('disconnect', ()=>{}): Triggers when user disconnects wallet.

Deregister wallet events

.on returns a callback function that needs to be passed to .off if you want to deregister the event listener:

let wallet = getWallet();
let callback = wallet.on('account', (newAccount)=>{
  doSomething(newAccount)
})

//...

wallet.off('account', callback) // removes listener

Switch blockchain/network

async switchTo(blockchain): Changes wallet connection to a specific network (adds it to the wallet in case it's missing)

let wallet = getWallet()
await wallet.switchTo('bsc')

Transactions

sendTransaction

Sign and send a transaction through the connected wallet:

let wallet = getWallet()

let sentTransaction = await wallet.sendTransaction({
  blockchain: 'ethereum',
  to: '0xae60aC8e69414C2Dc362D0e6a03af643d1D85b92',
  api: [{"inputs":[{"internalType":"address","name":"_configuration","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"configuration","outputs":[{"internalType":"contract DePayRouterV1Configuration","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pluginAddress","type":"address"}],"name":"isApproved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"address[]","name":"plugins","type":"address[]"},{"internalType":"string[]","name":"data","type":"string[]"}],"name":"route","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}],
  method: 'route',
  params: {
    path: ["0xb056c38f6b7Dc4064367403E26424CD2c60655e1","0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2","0xa0bEd124a09ac2Bd941b10349d8d224fe3c955eb"],
    amounts: ["11275067000000000000000","100000000000000000000", "1632063302"],
    addresses: ["0x39794c3171d4D82eB9C6FBb764749Eb7ED92881d", "0x39794c3171d4D82eB9C6FBb764749Eb7ED92881d"],
    plugins: ["0xe04b08Dfc6CaA0F4Ec523a3Ae283Ece7efE00019", "0x99F3F4685a7178F26EB4F4Ca8B75a1724F1577B9"],
    data: []
  },
  value: "0",
  sent: function(transaction){},
  confirmed: function(transaction){},
  failed: function(transaction){}
})

or a simple value transfer:

let wallet = getWallet()

let sentTransaction = await wallet.sendTransaction({
  blockchain: 'ethereum',
  to: '0xae60aC8e69414C2Dc362D0e6a03af643d1D85b92',
  value: "1000000000000000",
  sent: function(transaction){},
  confirmed: function(transaction){},
  failed: function(transaction){}
})

Arguments for `sendTransaction`:

blockchain: String: Name of the blockchain e.g. 'ethereum'.

to String: Address of the contract to be transacted with.

api: Array: Api of the contract (e.g. abi for Ethereum).

method: String: Name of the contract method to be called.

params: Object or Array: Parameters passed to the method.

value: BigNumber: Value of the transaction (amount of the native blockchain currency sent along with the transaction).

sent: Function: Callback to be executed if transaction has been sent to the network.

confirmed: Function: Callback to be executed if transaction has been confirmed once by the network.

failed: Function: Callback to be executed if transaction failed to confirm on the network (aka reverted).

value

If value is passed as a number it's gonna be converted into a big number applying the individual blockhain's default decimals:

let transaction = new Transaction({
  ...,
  value: 1
})

transaction.value // '1000000000000000000'

If value is passed as a string or as a BigNumber, value is used just as provided:

let transaction = new Transaction({
  ...,
  value: '1000000000000000000'
})

transaction.value // '1000000000000000000'

wrong network

sendTransaction rejects with:

{ code: 'WRONG_NETWORK' }

in case wallet is connected to the wrong network and network cant be switched automatically.

Transaction

Returned instances of Transaction (e.g. via sendTransaction, or sent, confirmed or failed callback) have the following format:

blockchain: string: Blockchain the transaction belongs to.

id: string: Unique identifier of the transaction, also known as transaction hash, only populated if transaction has been submitted to the network.

url: string: A url to display the transaction status in a browser on a blockchain explorer.

from: string: Address the transaction is sent from.

nonce: Number: The number of the sent transactions (from the given address).

to: string: Address the transaction is interacting with.

api: array: Api of a contract the transaction is interacting with.

method: string: The method name of the contract the transaction is interacting with.

params: object or array: Params the transaction is passing to the contract method.

value: BigNumber: Amount/value of the native token the transaction is forwarding as part of the interaction.

confirmation: Promise: Returns a promise that resolves once the transaction confirms.

failure: Promise: Returns a promise that resolves once the transaction fails.

Estimations

Allows you to estimate transactions before they happen to determine if they are possible and how much they will cost:

let cost = await wallet.estimate({
  blockchain: 'ethereum',
  to: '0xae60aC8e69414C2Dc362D0e6a03af643d1D85b92',
  method: 'route',
  api: [{"inputs":[{"internalType":"address","name":"_configuration","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"configuration","outputs":[{"internalType":"contract DePayRouterV1Configuration","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pluginAddress","type":"address"}],"name":"isApproved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"address[]","name":"plugins","type":"address[]"},{"internalType":"string[]","name":"data","type":"string[]"}],"name":"route","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}],
  params: {
    path: ['0x1cBb83EbcD552D5EBf8131eF8c9CD9d9BAB342bC'],
    amounts: ['160000000000000000', '160000000000000000', '1626096776'],
    addresses: ['0x4e260bB2b25EC6F3A59B478fCDe5eD5B8D783B02'],
    plugins: ['0x99F3F4685a7178F26EB4F4Ca8B75a1724F1577B9'],
    data: []
  },
  value: 0
}) // 22111100000

Returns the cost of the estimate, otherwise rejects if transaction is not executable.

Rejects with

{ code: 'WRONG_NETWORK' }

in case wallet is connected to the wrong network.

Signatures

sign message

web3-wallets allows you to sign a personal message:

let wallet = getWallet()

let signature = await wallet.sign("This is a message to be signed")

Development

Get started

yarn install
yarn dev

Release

npm publish