CAIP-10 Link client
A CAIP-10 Link is a stream that stores a proof that links a blockchain address to a Ceramic account (DID), using the CAIP-10 standard to represent blockchain addresses.
Installation
npm install @ceramicnetwork/stream-caip10-link
Additional requirements
- In order to load CAIP-10 Links, a Ceramic client instance must be available
- To add/remove links, the client must also have an authenticated DID
- An authentication provider is needed to sign the payload for the given CAIP-10 account, using the
blockchain-utils-linking
module that should be installed as needed:
npm install @ceramicnetwork/blockchain-utils-linking
Common usage
Load a link
In this example we load a Caip10Link for the account 0x054...7cb8
on the Ethereum mainnet blockchain (eip155:1
).
import { CeramicClient } from '@ceramicnetwork/http-client'
import { Caip10Link } from '@ceramicnetwork/stream-caip10-link'
const ceramic = new CeramicClient()
async function getLinkedDID() {
// Using the Ceramic client instance, we can load the link for a given CAIP-10 account
const link = await Caip10Link.fromAccount(
ceramic,
'0x0544dcf4fce959c6c4f3b7530190cb5e1bd67cb8@eip155:1',
)
// The `did` property of the loaded link will contain the DID string value if set
return link.did
}
Create a link
Here we can see the full flow of getting a user's Ethereum address, creating a link, and adding the users' DID account.
In this example we create a Caip10Link for the account 0x054...7cb8
on the Ethereum mainnet blockchain (eip155:1
) and then associate it with the DID did:3:k2t6...ydki
.
import { CeramicClient } from '@ceramicnetwork/http-client'
import { Caip10Link } from '@ceramicnetwork/stream-caip10-link'
import { EthereumAuthProvider } from '@ceramicnetwork/blockchain-utils-linking'
const ceramic = new CeramicClient()
async function linkCurrentAddress() {
// First, we need to create an EthereumAuthProvider with the account currently selected
// The following assumes there is an injected `window.ethereum` provider
const addresses = await window.ethereum.request({
method: 'eth_requestAccounts',
})
const authProvider = new EthereumAuthProvider(window.ethereum, addresses[0])
// Retrieve the CAIP-10 account from the EthereumAuthProvider instance
const accountId = await authProvider.accountId()
// Load the account link based on the account ID
const accountLink = await Caip10Link.fromAccount(
ceramic,
accountId.toString(),
)
// Finally, link the DID to the account using the EthereumAuthProvider instance
await accountLink.setDid(
'did:3:k2t6wyfsu4pg0t2n4j8ms3s33xsgqjhtto04mvq8w5a2v5xo48idyz38l7ydki',
authProvider,
)
}
Remove a link
Removing a link involves a similar flow to setting the DID, but using the clearDid
method instead of setDid
:
import { CeramicClient } from '@ceramicnetwork/http-client'
import { Caip10Link } from '@ceramicnetwork/stream-caip10-link'
import { EthereumAuthProvider } from '@ceramicnetwork/blockchain-utils-linking'
const ceramic = new CeramicClient()
async function unlinkCurrentAddress() {
// First, we need to create an EthereumAuthProvider with the account currently selected
// The following assumes there is an injected `window.ethereum` provider
const addresses = await window.ethereum.request({
method: 'eth_requestAccounts',
})
const authProvider = new EthereumAuthProvider(window.ethereum, addresses[0])
// Retrieve the CAIP-10 account from the EthereumAuthProvider instance
const accountId = await authProvider.accountId()
// Load the account link based on the account ID
const accountLink = await Caip10Link.fromAccount(
ceramic,
accountId.toString(),
)
// Finally, unlink the DID from the account using the EthereumAuthProvider instance
await accountLink.clearDid(authProvider)
}