@ceramicnetwork/blockchain-utils-linking
Version:
Blockchain utils for linking blockchain accounts to DID
64 lines • 2.38 kB
JavaScript
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