did-safe-resolver

DID Resolver for the Safe method

Usage no npm install needed!

<script type="module">
  import didSafeResolver from 'https://cdn.skypack.dev/did-safe-resolver';
</script>

README

Gnosis Safe DID Resolver

Safe is a DID method that uses the Ceramic network to resolve DID documents for Gnosis Safe See CIP-101

Getting started

This implementation is still a prototype. Contributions are welcome!

Installation

$ npm install safe-did-resolver

Usage

import SafeResolver from 'safe-did-resolver'
import { Resolver } from 'did-resolver'
import Ceramic from '@ceramicnetwork/http-client'

const ceramic = new Ceramic() // connects to localhost:7007 by default

const config: NftResolverConfig = {
  ceramic,
  chains: {
    // Ethereum Mainnet
    'eip155:1': {
      blocks: 'https://api.thegraph.com/subgraphs/name/blocklytics/ethereum-blocks',
      skew: 15000,
      gnosisSafe: 'https://api.thegraph.com/subgraphs/name/gjeanmart/gnosis-safe-mainnet',
    },
    // Ethereum Ropsten
    'eip155:3': {
      blocks: 'https://api.thegraph.com/subgraphs/name/yyong1010/ethereumblocks',
      skew: 15000,
      gnosisSafe: 'https://api.thegraph.com/subgraphs/name/gjeanmart/gnosis-safe-ropsten',
    },
    // Ethereum Rinkeby
    'eip155:4': {
      blocks: 'https://api.thegraph.com/subgraphs/name/billjhlee/rinkeby-blocks',
      skew: 15000,
      gnosisSafe: 'https://api.thegraph.com/subgraphs/name/radicle-dev/gnosis-safe-rinkeby',
    },
  },
}

// getResolver will return an object with a key/value pair of { 'safe': resolver }
// where resolver is a function used by the generic did resolver.
const safeResolver = SafeResolver.getResolver(config)
const didResolver = Resolver(safeResolver)

const safeResult = await didSafeResolver.resolve(
  'did:safe:eip155:1:0x00044c87ddc54536ee05047c6f4f6f831aba988b'
)
console.log(safeResult)

The resolver supports the following networks by default:

  • Ethereum mainnet (eip155:1),
  • Ethereum Rinkeby (eip155:4),

Testing

$ npm test

DID Specs

The token DIDs are prefixed with did:safe:, followed by method specific identifier, which is simply a CAIP-10 Account ID.

DID: did:safe:{chainId}:{safeAddress}

CAIP-10: {chainId}:{safeAddress}

Conversions

DID->CAIP

const caip = did.substr(8).replace(/_/g, '/')

CAIP->DID

const did = `did:safe:${caip.replace(/\//g, '_')

There are helpers that help you with the conversion:

import { caipToDid, didToCaip, createSafeDidUrl } from 'safe-did-resolver'
import { AccountId } from 'caip'

// CAIP -> DID URL
const didUrl = createSafeDidUrl({
  chainId: 'eip155:1',
  address: '0x1234567891234567891234567891234596351156',
})
// If you use `caip` library in your app, consider using sister `caipToDid` function to
// convert `AccountId` to Safe DID URL.

// DID URL -> CAIP
const accountId = didToCaip(didUrl) // eip155:1/erc721:0x1234567891234567891234567891234596351156/1

License

Apache-2.0 OR MIT