UNPKG

@ceramicnetwork/blockchain-utils-linking

Version:

Blockchain utils for linking blockchain accounts to DID

64 lines 2.38 kB
import { AccountId } from 'caip'; import { asOldCaipString, getConsentMessage } from './util.js'; import { hash } from '@stablelib/sha256'; import * as uint8arrays from 'uint8arrays'; export const TEZOS_NAMESPACE = 'tezos'; export const TEZOS_CHAIN_REF = 'NetXdQprcVkpaWU'; function encodeMessage(text) { const michelinePrefix = '05'; const stringPrefix = '01'; const len = ('0000000' + text.length.toString(16)).slice(-8); text = uint8arrays.toString(uint8arrays.fromString(text, 'utf-8'), 'hex'); return michelinePrefix + stringPrefix + len + text; } async function sign(provider, message) { message = encodeMessage(message); const { prefixSig: signature } = await provider.signer.sign(message); return signature; } async function getActiveAddress(provider) { return provider.signer.publicKeyHash(); } export class TezosAuthProvider { constructor(provider) { this.provider = provider; this.isAuthProvider = true; if (provider.signer === undefined) { throw new Error('a `Signer` is required to use the `TezosAuthProvider`'); } console.warn('WARN: TezosAuthProvider is not fully supported. You may encounter issues using this.'); } async authenticate(message) { const signature = await sign(this.provider, message); const digest = hash(uint8arrays.fromString(signature)); return `0x${uint8arrays.toString(digest, 'base16')}`; } async createLink(did) { const { message, timestamp } = getConsentMessage(did); const signature = await sign(this.provider, message); const address = await getActiveAddress(this.provider); const caipAccount = new AccountId({ address, chainId: `${TEZOS_NAMESPACE}:${TEZOS_CHAIN_REF}`, }); const proof = { version: 2, message, signature, account: asOldCaipString(caipAccount), timestamp, }; return proof; } async accountId() { const address = await getActiveAddress(this.provider); return new AccountId({ address, chainId: `${TEZOS_NAMESPACE}:${TEZOS_CHAIN_REF}`, }); } withAddress(_address) { throw new Error('TezosAuthProvider does not support withAddress'); } } //# sourceMappingURL=tezos.js.map