/
solana.ts
61 lines (54 loc) · 2.1 KB
/
solana.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import { AccountId } from 'caip'
import { AuthProvider } from './auth-provider.js'
import { asOldCaipString, getConsentMessage, LinkProof } from './util.js'
import * as uint8arrays from 'uint8arrays'
import * as sha256 from '@stablelib/sha256'
export const SOLANA_TESTNET_CHAIN_REF = '4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z' // Solana testnet
export const SOLANA_DEVNET_CHAIN_REF = 'EtWTRABZaYq6iMfeYKouRu166VU2xqa1' // Solana devnet
export const SOLANA_MAINNET_CHAIN_REF = '5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp' // Solana mainnet beta
export class SolanaAuthProvider implements AuthProvider {
readonly isAuthProvider = true
constructor(
private readonly provider: any,
private readonly address: string,
private readonly chainRef: string
) {
console.warn(
'WARN: SolanaAuthProvider is not fully supported. You may encounter issues using this.'
)
}
async accountId(): Promise<AccountId> {
return new AccountId({
address: this.address,
chainId: `solana:${this.chainRef}`,
})
}
async authenticate(message: string): Promise<string> {
if (!this.provider.signMessage) {
throw new Error(`Unsupported provider; provider must implement signMessage`)
}
const signatureBytes = await this.provider.signMessage(uint8arrays.fromString(message))
const digest = sha256.hash(signatureBytes)
return `0x${uint8arrays.toString(digest, 'base16')}`
}
async createLink(did: string): Promise<LinkProof> {
if (!this.provider.signMessage) {
throw new Error(`Unsupported provider; provider must implement signMessage`)
}
const { message, timestamp } = getConsentMessage(did, true)
const accountID = await this.accountId()
const signatureBytes = await this.provider.signMessage(uint8arrays.fromString(message))
const signature = uint8arrays.toString(signatureBytes, 'base64')
return {
version: 2,
type: 'solana',
message,
signature,
account: asOldCaipString(accountID),
timestamp,
}
}
withAddress(address: string): AuthProvider {
return new SolanaAuthProvider(this.provider, address, this.chainRef)
}
}