Skip to main content

API

Initialization

To setup the client you need to configure it with your projectId which you can obtain from WalletConnect Cloud.

Furthermore you may need to configure the domain and isLimited parameters:

  • domain defaults to window.location.host and must be set to the domain setup in Cloud Setup. For example app.example.com. Do not add the scheme (https://).
  • allApps determines if your app has access to all of the user's subscriptions, or only the ones that the app is hosted on. By setting it to true, it enables setting domain to a value other than window.location.host. Setting allApps: true can be useful during development to allow your localhost-deployed app to access the subscriptions for the domain you setup. Note that most apps do not need to set this in production environments, as they only need access to their own subscriptions. When enabled, the user has to sign a SIWE message granting your app more permissions, and this requires additional consideration from the user.
const client = await Web3InboxClient.init({ projectId, domain, allApps })

References

  • projectId: Your WalletConnect project ID
  • domain (Optional): Your app's domain. Defaults to window.location.host.
  • allApps (Optional): Set to false to request access to all of the user's notification subscriptions for all apps, instead of only domain. Defaults to true.

Managing Account

Setting account for web3inbox

await client.setAccount('eip155:1:0x9AfEaC202C837df470b5A145e0EfD6a574B21029')

const account = client.getAccount() // eip155:1:0x9AfEaC202C837df470b5A145e0EfD6a574B21029

client.watchAccount(account => {
console.log({ account }) // eip155:1:0x9AfEaC202C837df470b5A145e0EfD6a574B21029
})

References

  • account: CAIP-10 account currently active in Web3Inbox
  • setAccount: Change actively managed account in Web3Inbox
  • watchAccount: Watcher ticks whenever the account updates

Registering an account

Note: EIP-1271 signatures coming from smart wallets are supported in version 1.1.0 and above.

import { signMessageAsync } from '@wagmi/core'

const { registerParams, signature } = await client.prepareRegistration({
account
})
const isRegistered = await client.getAccountIsRegistered(account)
const signature = await signMessageAsync({ message })
await register({ registerParams, signature })

References

  • prepareRegistration: Prepare registration params
  • register: Register using a signature and register params
  • getAccountIsRegistered: Returns if account is registered

Some suggested methods of signing the message:

Managing Subscription

Subscribe, Unsubscribe, Get Subscription, Check if Subscribed.

note

When using differentAccount, the passed account needs to be previously registered. This use case is for Dapps that have multiple active accounts or wallets with multiple active accounts. differentAccount can be used for all the below hooks and functions that accept account

// check if current account is subscribed to current dapp
const isSubscribed = client.isSubscribedToDapp()

// watch if current account is subscribed to current dapp
client.watchIsSubscribed(isSubbed => console.log({ isSubbed }))

// subscribe to current dapp with current account
await client.subscribeToDapp()

// subscribe to same dapp with different account
await client.subscribeToDapp(differentAccount)

// subscribe to different dapp with current account
await client.subscribeToDapp(undefined, differentDomain)

// subscribe to different dapp with different account
await client.subscribeToDapp(differentAccount, differentDomain)

// unsubscribe from current dapp with current account
await client.unsubscribeFromDapp()

// get current account's subscription to current dapp
const subscription = client.getSubscription()

// watch current account's subscription to current dapp
client.watchSubscription(subscription => console.log({ subscription }))

// get current account's subscriptions
const subscriptions = client.getSubscriptions()

// watch current account's subscriptions
client.watchSubscriptions(subscriptions => console.log({ subscriptions }))

References

  • account (Optional): CAIP-10 account
  • domain (Optional): dapp domain
  • subscription: Non-Reactive state, returning current subscription information, of type:
{
topic: string
account: string
relay: relayertypes.protocoloptions
metadata: Metadata
scope: ScopeMap
expiry: number
symkey: string
unreadCount: number
}
  • subscription: Non-Reactive state, returning array of current subscriptions

Managing Notifications

You can retrieve notifications using pagination. One approach is to provide the last notification's ID as the starting point:

const notificationsPage = client.getNotificationHistory({
limit: 3,
// The `id` of the last notification, for example:
startingAfter: 'some-notification-id'
})

const notificationsPerPage = 5
const isInfiniteScroll = true
const unreadFirst = true

let notifications = []

const onUpdate = ({notifications: fetchedNotifications}: GetNotificationsReturn) => {
notifications = fetchedNotifications
}

const {
nextPage,
markNotificationAsRead,
markAllNotificationsAsRead
} = client.pageNotifications(
notificationsPerPage,
isInfiniteScroll,
specifiedAccount // OR undefined,
specifiedDomain // OR undefined,
unreadFirst
)(onUpdate)


// marking a single notification as read
await notifications[0].markAsRead();

// mark specific notifications as read
await markNotificationsAsRead(notifications.slice(2).map(n => n.id));

// mark all notifications as read
await markAllNotificationsAsRead();

References

  • pageNotifications:
    • notificationsPerPage: Number representing how many notifications to get per fetch
    • isInfiniteScroll: Whether or not to keep already fetched notifications when getting next page
    • *params: (optional) Additional parameters
    • unreadFirst: (optional, default true, since 1.3.0) Whether or not unread messages should be sorted at the top, regardless of timestamp
  • onUpdate:: A callback that will be called whenever notifications get updated
  • nextPage:: A function to be called to fetch the next page of notifications
  • notifications: Array of notifications, of type
  • notification.markAsRead: Mark the notification as read
  • markNotificationsAsRead: Takes an array of notification IDs and marks them as read. Max 1000 IDs
  • markAllNotificationsAsRead: Mark all notifications as read.
{
title: string
sentAt: number
body: string
id: string
isRead: boolean // since 1.3.0
url: string | null
type: string
read: () => Promise<void> // since 1.3.0
}

Notification Types

// get scopes of current account's subscription to current dapp
const types = client.getNotificationTypes()

// watch scopes of specific account's subscription to specific dapp
client.watchNotificationTypes(scp => {
console.log(scp)
})

client.update(['enabledType-1', 'enabledType-2'])

References

  • update: (enabledScopeNames: string[]) -> void
  • types: Map of scopes (Notification types)
type ScopeMap = Record<
string,
{
name: string
description: string
enabled: boolean
}
>

Registering for Device Push Notifications

If you wish to receive live push notifications to your React Native or Web app, you must integrate with Firebase Messaging. More information about how to integrate with Firebase can be found here.

Your integration will obtain a token from Firebase and you will need to pass this token to the Web3Inbox SDK using the registerWithPushServer() function.

import { getToken } from 'firebase/messaging

// initialize Firebase's messaging object via Firebase's `getMessaging` function

const firebaseToken = getToken(firebaseMessaging, {
vapidKey: "YOUR_FIREBASE_VAPID_KEY"
})

// The Client ID that registered with this token, can be used for debugging purposes or logs
const clientId = client.registerWithPushServer(firebaseToken)

References

  • registerWithPushServer: (token: string, platform: 'fcm' | 'apns') => string

Either APNS or FCM can be used to recieve push notifications. Token here is the respective platform's token.

Listening For Events

This can be used to listen to, for example, messages received in realtime.

client.on('notify_message', ({ notification }) => {
console.log(notification.title)
})

References

  • message: Notification of type:
interface NotifyNotification {
title: string
sentAt: number
body: string
id: string
url: string | null
type: string
}