@cheqd/sdk 1.5.0-develop.1 → 1.5.0-develop.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/src/utils.ts CHANGED
@@ -1,8 +1,3 @@
1
- import {
2
- MsgCreateDidDocPayload,
3
- MsgUpdateDidDocPayload,
4
- VerificationMethod
5
- } from "@cheqd/ts-proto/cheqd/did/v2"
6
1
  import {
7
2
  IKeyPair,
8
3
  IKeyValuePair,
@@ -13,7 +8,10 @@ import {
13
8
  TVerificationKey,
14
9
  TVerificationKeyPrefix,
15
10
  CheqdNetwork,
16
- IVerificationKeys
11
+ IVerificationKeys,
12
+ MsgCreateDidPayload,
13
+ VerificationMethodPayload,
14
+ MsgUpdateDidPayload
17
15
  } from "./types"
18
16
  import { fromString, toString } from 'uint8arrays'
19
17
  import { bases } from "multiformats/basics"
@@ -32,22 +30,31 @@ export type TImportableEd25519Key = {
32
30
  // multicodec ed25519-pub header as varint
33
31
  const MULTICODEC_ED25519_PUB_HEADER = new Uint8Array([0xed, 0x01]);
34
32
 
35
- export type IdentifierPayload = Partial<MsgCreateDidDocPayload> | Partial<MsgUpdateDidDocPayload>
33
+ export type IdentifierPayload = Partial<MsgCreateDidPayload> | Partial<MsgUpdateDidPayload>
36
34
 
37
35
  export function isEqualKeyValuePair(kv1: IKeyValuePair[], kv2: IKeyValuePair[]): boolean {
38
36
  return kv1.every((item, index) => item.key === kv2[index].key && item.value === kv2[index].value)
39
37
  }
40
38
 
41
- export function createSignInputsFromImportableEd25519Key(key: TImportableEd25519Key, verificationMethod: VerificationMethod[]): ISignInputs {
39
+ export function createSignInputsFromImportableEd25519Key(key: TImportableEd25519Key, verificationMethod: VerificationMethodPayload[]): ISignInputs {
42
40
  if (verificationMethod?.length === 0) throw new Error('No verification methods provided')
43
41
 
44
42
  const publicKey = fromString(key.publicKeyHex, 'hex')
45
43
 
46
44
  for(const method of verificationMethod) {
47
45
  switch (method?.type) {
48
- case VerificationMethods.Base58:
49
- const publicKeyMultibase = bases['base58btc'].encode(publicKey)
50
- if ((JSON.parse(method.verificationMaterial)).publicKeyMultibase === publicKeyMultibase) {
46
+ case VerificationMethods.Ed255192020:
47
+ const publicKeyMultibase = _encodeMbKey(MULTICODEC_ED25519_PUB_HEADER, publicKey)
48
+ if (method.publicKeyMultibase === publicKeyMultibase) {
49
+ return {
50
+ verificationMethodId: method.id,
51
+ privateKeyHex: key.privateKeyHex
52
+ }
53
+ }
54
+
55
+ case VerificationMethods.Ed255192018:
56
+ const publicKeyBase58 = bases['base58btc'].encode(publicKey).slice(1)
57
+ if (method.publicKeyBase58 === publicKeyBase58) {
51
58
  return {
52
59
  verificationMethodId: method.id,
53
60
  privateKeyHex: key.privateKeyHex
@@ -55,16 +62,18 @@ export function createSignInputsFromImportableEd25519Key(key: TImportableEd25519
55
62
  }
56
63
 
57
64
  case VerificationMethods.JWK:
58
- const publicKeyJWK = {
65
+ const publicKeyJWK: any = {
59
66
  crv: 'Ed25519',
60
67
  kty: 'OKP',
61
68
  x: toString( publicKey, 'base64url' )
62
69
  }
63
- if ((JSON.parse(method.verificationMaterial)).publicKeyJwk, publicKeyJWK) {
70
+ if (JSON.stringify(method.publicKeyJWK) === JSON.stringify(publicKeyJWK)) {
64
71
  return {
65
72
  verificationMethodId: method.id,
66
73
  privateKeyHex: key.privateKeyHex
67
74
  }
75
+ } else {
76
+ throw new Error(`JWK not matching ${method.publicKeyJWK}, ${publicKeyJWK}`)
68
77
  }
69
78
  }
70
79
  }
@@ -92,71 +101,75 @@ export function createKeyPairHex(seed?: string): IKeyPair {
92
101
  }
93
102
  }
94
103
 
95
- export function createVerificationKeys(keyPair: IKeyPair, algo: MethodSpecificIdAlgo, key: TVerificationKey<TVerificationKeyPrefix, number>, length: number = 32, network: CheqdNetwork = CheqdNetwork.Testnet): IVerificationKeys {
104
+ export function createVerificationKeys(publicKey: string, algo: MethodSpecificIdAlgo, key: TVerificationKey<TVerificationKeyPrefix, number>, network: CheqdNetwork = CheqdNetwork.Testnet): IVerificationKeys {
96
105
  let methodSpecificId: TMethodSpecificId
97
106
  let didUrl: IVerificationKeys['didUrl']
107
+
108
+ publicKey = publicKey.length == 43 ? publicKey : toString(fromString(publicKey, 'hex'), 'base64')
98
109
  switch (algo) {
99
110
  case MethodSpecificIdAlgo.Base58:
100
- methodSpecificId = bases['base58btc'].encode(base64ToBytes(keyPair.publicKey))
101
- didUrl = `did:cheqd:${network}:${(bases['base58btc'].encode((fromString(sha256(keyPair.publicKey))).slice(0,16))).slice(1)}`
111
+ methodSpecificId = bases['base58btc'].encode(base64ToBytes(publicKey))
112
+ didUrl = `did:cheqd:${network}:${(bases['base58btc'].encode((fromString(sha256(publicKey))).slice(0,16))).slice(1)}`
102
113
  return {
103
114
  methodSpecificId,
104
115
  didUrl,
105
116
  keyId: `${didUrl}#${key}`,
106
- publicKey: keyPair.publicKey,
117
+ publicKey,
107
118
  }
108
119
  case MethodSpecificIdAlgo.Uuid:
109
- methodSpecificId = bases['base58btc'].encode(base64ToBytes(keyPair.publicKey))
120
+ methodSpecificId = bases['base58btc'].encode(base64ToBytes(publicKey))
110
121
  didUrl = `did:cheqd:${network}:${v4()}`
111
122
  return {
112
123
  methodSpecificId,
113
124
  didUrl,
114
125
  keyId: `${didUrl}#${key}`,
115
- publicKey: keyPair.publicKey,
126
+ publicKey,
116
127
  }
117
128
  }
118
129
  }
119
130
 
120
- export function createDidVerificationMethod(verificationMethodTypes: VerificationMethods[], verificationKeys: IVerificationKeys[]): VerificationMethod[] {
131
+ export function createDidVerificationMethod(verificationMethodTypes: VerificationMethods[], verificationKeys: IVerificationKeys[]): VerificationMethodPayload[] {
121
132
  return verificationMethodTypes.map((type, _) => {
122
133
  switch (type) {
123
- case VerificationMethods.Base58:
134
+ case VerificationMethods.Ed255192020:
135
+ return {
136
+ id: verificationKeys[_].keyId,
137
+ type,
138
+ controller: verificationKeys[_].didUrl,
139
+ publicKeyMultibase: _encodeMbKey(MULTICODEC_ED25519_PUB_HEADER, base64ToBytes(verificationKeys[_].publicKey))
140
+ }
141
+
142
+ case VerificationMethods.Ed255192018:
124
143
  return {
125
144
  id: verificationKeys[_].keyId,
126
- type: type,
145
+ type,
127
146
  controller: verificationKeys[_].didUrl,
128
- verificationMaterial: JSON.stringify({
129
- publicKeyMultibase: verificationKeys[_].methodSpecificId,
130
- publicKeyJwk: []
131
- })
147
+ publicKeyBase58: verificationKeys[_].methodSpecificId.slice(1)
132
148
  }
133
149
 
134
150
  case VerificationMethods.JWK:
135
151
  return {
136
152
  id: verificationKeys[_].keyId,
137
- type: type,
153
+ type,
138
154
  controller: verificationKeys[_].didUrl,
139
- verificationMaterial: JSON.stringify({
140
- publicKeyJwk: {
141
- crv: 'Ed25519',
142
- kty: 'OKP',
143
- x: toString( fromString( verificationKeys[_].publicKey, 'base64pad' ), 'base64url' )
144
- },
145
- publicKeyMultibase: ''
146
- })
155
+ publicKeyJWK: {
156
+ crv: 'Ed25519',
157
+ kty: 'OKP',
158
+ x: toString( fromString( verificationKeys[_].publicKey, 'base64pad' ), 'base64url' )
159
+ }
147
160
  }
148
161
  }
149
162
  }) ?? []
150
163
  }
151
164
 
152
- export function createDidPayload(verificationMethods: VerificationMethod[], verificationKeys: IVerificationKeys[]): MsgCreateDidDocPayload {
165
+ export function createDidPayload(verificationMethods: VerificationMethodPayload[], verificationKeys: IVerificationKeys[]): MsgCreateDidPayload {
153
166
  if (!verificationMethods || verificationMethods.length === 0)
154
167
  throw new Error('No verification methods provided')
155
168
  if (!verificationKeys || verificationKeys.length === 0)
156
169
  throw new Error('No verification keys provided')
157
170
 
158
171
  const did = verificationKeys[0].didUrl
159
- return MsgCreateDidDocPayload.fromPartial(
172
+ return MsgCreateDidPayload.fromPartial(
160
173
  {
161
174
  id: did,
162
175
  controller: verificationKeys.map(key => key.didUrl),
@@ -167,56 +180,17 @@ export function createDidPayload(verificationMethods: VerificationMethod[], veri
167
180
  )
168
181
  }
169
182
 
170
- export function createDidPayloadWithSignInputs(seed?: string, keys?: IKeyPair[]) {
171
- if(seed && keys) throw new Error ('Only one of seed or keys should be passed as an argument')
172
-
173
- if(!keys) {
174
- keys = [seed ? createKeyPairBase64(seed) : createKeyPairBase64()]
175
- }
176
-
177
- const verificationMethodTypes = keys.map((key) => !key.algo || key.algo == MethodSpecificIdAlgo.Base58 ? VerificationMethods.Base58 : VerificationMethods.JWK)
178
- const verificationKeys = keys.map((key, i) => createVerificationKeys(key, key.algo || MethodSpecificIdAlgo.Base58, `key-${i}`))
179
- const verificationMethod = createDidVerificationMethod(verificationMethodTypes, verificationKeys)
180
-
181
- let payload : Partial<MsgCreateDidDocPayload> = {
182
- id: verificationKeys[0].didUrl,
183
- controller: verificationKeys.map(key => key.didUrl),
184
- verificationMethod: verificationMethod,
185
- authentication: verificationKeys.map(key => key.keyId),
186
- }
187
-
188
- const keyHexs = keys.map((key)=>convertKeyPairtoTImportableEd25519Key(key))
189
- const signInputs = keyHexs.map((key)=>createSignInputsFromImportableEd25519Key(key, verificationMethod))
190
-
191
- return { didPayload: MsgCreateDidDocPayload.fromPartial(payload), keys, signInputs }
192
- }
193
-
194
- export function convertKeyPairtoTImportableEd25519Key(keyPair: IKeyPair) : TImportableEd25519Key {
195
- return {
196
- type: 'Ed25519',
197
- privateKeyHex: toString(fromString(keyPair.privateKey, 'base64'), 'hex'),
198
- kid: 'kid',
199
- publicKeyHex: toString(fromString(keyPair.publicKey, 'base64'), 'hex')
200
- }
201
- }
202
-
203
- export function createSignInputsFromKeyPair(didDocument: IdentifierPayload, keys: IKeyPair[]) {
204
- const keyHexs = keys.map((key)=>convertKeyPairtoTImportableEd25519Key(key))
205
- const signInputs = keyHexs.map((key)=>createSignInputsFromImportableEd25519Key(key, didDocument.verificationMethod!))
206
- return signInputs
207
- }
208
-
209
183
  function sha256(message: string) {
210
184
  return createHash('sha256').update(message).digest('hex')
211
185
  }
212
186
 
213
187
  // encode a multibase base58-btc multicodec key
214
- // function _encodeMbKey(header: any, key: any) {
215
- // const mbKey = new Uint8Array(header.length + key.length);
188
+ function _encodeMbKey(header: any, key: Uint8Array) {
189
+ const mbKey = new Uint8Array(header.length + key.length);
216
190
 
217
- // mbKey.set(header);
218
- // mbKey.set(key, header.length);
191
+ mbKey.set(header);
192
+ mbKey.set(key, header.length);
219
193
 
220
- // return bases['base58btc'].encode(mbKey);
221
- // }
194
+ return bases['base58btc'].encode(mbKey);
195
+ }
222
196
 
@@ -6,7 +6,7 @@ import { v4 } from "uuid"
6
6
  import { DIDModule } from "../../src"
7
7
  import { createDefaultCheqdRegistry } from "../../src/registry"
8
8
  import { CheqdSigningStargateClient } from "../../src/signer"
9
- import { DidStdFee, ISignInputs, MethodSpecificIdAlgo, VerificationMethods } from "../../src/types"
9
+ import { DidStdFee, ISignInputs, MethodSpecificIdAlgo, MsgCreateDidPayload, MsgDeactivateDidPayload, VerificationMethods } from "../../src/types"
10
10
  import { createDidPayload, createDidVerificationMethod, createKeyPairBase64, createVerificationKeys, exampleCheqdNetwork, faucet } from "../testutils.test"
11
11
 
12
12
  const defaultAsyncTxTimeout = 30000
@@ -29,7 +29,7 @@ describe('DIDModule', () => {
29
29
  const didModule = new DIDModule(signer)
30
30
  const keyPair = createKeyPairBase64()
31
31
  const verificationKeys = createVerificationKeys(keyPair, MethodSpecificIdAlgo.Base58, 'key-1', 16)
32
- const verificationMethods = createDidVerificationMethod([VerificationMethods.Base58], [verificationKeys])
32
+ const verificationMethods = createDidVerificationMethod([VerificationMethods.JWK], [verificationKeys])
33
33
  const didPayload = createDidPayload(verificationMethods, [verificationKeys])
34
34
 
35
35
  const signInputs: ISignInputs[] = [
@@ -42,7 +42,7 @@ describe('DIDModule', () => {
42
42
  amount: [
43
43
  {
44
44
  denom: 'ncheq',
45
- amount: '5000000000'
45
+ amount: '5000000'
46
46
  }
47
47
  ],
48
48
  gas: '200000',
@@ -68,7 +68,7 @@ describe('DIDModule', () => {
68
68
  const didModule = new DIDModule(signer)
69
69
  const keyPair = createKeyPairBase64()
70
70
  const verificationKeys = createVerificationKeys(keyPair, MethodSpecificIdAlgo.Uuid, 'key-1', 16)
71
- const verificationMethods = createDidVerificationMethod([VerificationMethods.Base58], [verificationKeys])
71
+ const verificationMethods = createDidVerificationMethod([VerificationMethods.Ed255192020], [verificationKeys])
72
72
  const didPayload = createDidPayload(verificationMethods, [verificationKeys])
73
73
  didPayload.versionId = v4()
74
74
  const signInputs: ISignInputs[] = [
@@ -81,7 +81,7 @@ describe('DIDModule', () => {
81
81
  amount: [
82
82
  {
83
83
  denom: 'ncheq',
84
- amount: '5000000000'
84
+ amount: '5000000'
85
85
  }
86
86
  ],
87
87
  gas: '200000',
@@ -110,7 +110,7 @@ describe('DIDModule', () => {
110
110
 
111
111
  const keyPair = createKeyPairBase64()
112
112
  const verificationKeys = createVerificationKeys(keyPair, MethodSpecificIdAlgo.Base58, 'key-1', 16)
113
- const verificationMethods = createDidVerificationMethod([VerificationMethods.Base58], [verificationKeys])
113
+ const verificationMethods = createDidVerificationMethod([VerificationMethods.Ed255192020], [verificationKeys])
114
114
  const didPayload = createDidPayload(verificationMethods, [verificationKeys])
115
115
  const signInputs: ISignInputs[] = [
116
116
  {
@@ -122,7 +122,7 @@ describe('DIDModule', () => {
122
122
  amount: [
123
123
  {
124
124
  denom: 'ncheq',
125
- amount: '5000000000'
125
+ amount: '5000000'
126
126
  }
127
127
  ],
128
128
  gas: '200000',
@@ -141,7 +141,7 @@ describe('DIDModule', () => {
141
141
  expect(didTx.code).toBe(0)
142
142
 
143
143
  // Update the DID
144
- const updateDidPayload = MsgUpdateDidDocPayload.fromPartial({
144
+ const updateDidPayload = MsgCreateDidPayload.fromPartial({
145
145
  context: didPayload.context,
146
146
  id: didPayload.id,
147
147
  controller: didPayload.controller,
@@ -162,4 +162,62 @@ describe('DIDModule', () => {
162
162
  expect(updateDidTx.code).toBe(0)
163
163
  }, defaultAsyncTxTimeout)
164
164
  })
165
+
166
+ describe('deactivateDidTx', () => {
167
+ it('should deactivate a DID', async () => {
168
+ const wallet = await DirectSecp256k1HdWallet.fromMnemonic(faucet.mnemonic, {prefix: faucet.prefix})
169
+ const registry = createDefaultCheqdRegistry(DIDModule.registryTypes)
170
+ const signer = await CheqdSigningStargateClient.connectWithSigner(exampleCheqdNetwork.rpcUrl, wallet, { registry })
171
+ const didModule = new DIDModule(signer)
172
+
173
+ const keyPair = createKeyPairBase64()
174
+ const verificationKeys = createVerificationKeys(keyPair, MethodSpecificIdAlgo.Base58, 'key-1', 16)
175
+ const verificationMethods = createDidVerificationMethod([VerificationMethods.Ed255192020], [verificationKeys])
176
+ const didPayload = createDidPayload(verificationMethods, [verificationKeys])
177
+ const signInputs: ISignInputs[] = [
178
+ {
179
+ verificationMethodId: didPayload.verificationMethod[0].id,
180
+ privateKeyHex: toString(fromString(keyPair.privateKey, 'base64'), 'hex')
181
+ }
182
+ ]
183
+ const fee: DidStdFee = {
184
+ amount: [
185
+ {
186
+ denom: 'ncheq',
187
+ amount: '5000000'
188
+ }
189
+ ],
190
+ gas: '200000',
191
+ payer: (await wallet.getAccounts())[0].address
192
+ }
193
+ const didTx: DeliverTxResponse = await didModule.createDidTx(
194
+ signInputs,
195
+ didPayload,
196
+ (await wallet.getAccounts())[0].address,
197
+ fee
198
+ )
199
+
200
+ console.warn(`Using payload: ${JSON.stringify(didPayload)}`)
201
+ console.warn(`DID Tx: ${JSON.stringify(didTx)}`)
202
+
203
+ expect(didTx.code).toBe(0)
204
+
205
+ // Update the DID
206
+ const deactivateDidPayload: MsgDeactivateDidPayload = {
207
+ id: didPayload.id,
208
+ verificationMethod: didPayload.verificationMethod,
209
+ versionId: v4()
210
+ }
211
+
212
+ const deactivateDidTx: DeliverTxResponse = await didModule.deactivateDidTx(
213
+ signInputs,
214
+ deactivateDidPayload,
215
+ (await wallet.getAccounts())[0].address,
216
+ fee
217
+ )
218
+
219
+ console.warn(deactivateDidTx)
220
+ expect(deactivateDidTx.code).toBe(0)
221
+ }, defaultAsyncTxTimeout)
222
+ })
165
223
  })
@@ -34,7 +34,7 @@ describe('ResourceModule', () => {
34
34
 
35
35
  const keyPair = createKeyPairBase64()
36
36
  const verificationKeys = createVerificationKeys(keyPair, MethodSpecificIdAlgo.Base58, 'key-1', 16)
37
- const verificationMethods = createDidVerificationMethod([VerificationMethods.Base58], [verificationKeys])
37
+ const verificationMethods = createDidVerificationMethod([VerificationMethods.Ed255192020], [verificationKeys])
38
38
  const didPayload = createDidPayload(verificationMethods, [verificationKeys])
39
39
 
40
40
  const signInputs: ISignInputs[] = [
@@ -3,7 +3,7 @@ import { DirectSecp256k1HdWallet, Registry } from "@cosmjs/proto-signing"
3
3
  import { EdDSASigner } from "did-jwt"
4
4
  import { typeUrlMsgCreateDidDoc } from '../src/modules/did'
5
5
  import { CheqdSigningStargateClient } from "../src/signer"
6
- import { ISignInputs, MethodSpecificIdAlgo, VerificationMethods } from "../src/types"
6
+ import { ISignInputs, MethodSpecificIdAlgo, MsgCreateDidPayload, VerificationMethods } from "../src/types"
7
7
  import { fromString, toString } from 'uint8arrays'
8
8
  import { createDidPayload, createDidVerificationMethod, createKeyPairBase64, createVerificationKeys, exampleCheqdNetwork, faucet } from "./testutils.test"
9
9
  import { verify } from "@stablelib/ed25519"
@@ -53,8 +53,8 @@ describe('CheqdSigningStargateClient', () => {
53
53
  const signer = await CheqdSigningStargateClient.connectWithSigner(exampleCheqdNetwork.rpcUrl, wallet)
54
54
  const keyPair = createKeyPairBase64()
55
55
  const verificationKeys = createVerificationKeys(keyPair, MethodSpecificIdAlgo.Base58, 'key-1', 16)
56
- const verificationMethods = createDidVerificationMethod([VerificationMethods.Base58], [verificationKeys])
57
- const didPayload = createDidPayload(verificationMethods, [verificationKeys])
56
+ const verificationMethods = createDidVerificationMethod([VerificationMethods.Ed255192020], [verificationKeys])
57
+ const didPayload = MsgCreateDidPayload.transformPayload(createDidPayload(verificationMethods, [verificationKeys]))
58
58
  const didSigner = await signer.getDidSigner(didPayload.verificationMethod[0].id, didPayload.verificationMethod)
59
59
 
60
60
  expect(didSigner).toBe(EdDSASigner)
@@ -72,7 +72,7 @@ describe('CheqdSigningStargateClient', () => {
72
72
  const signer = await CheqdSigningStargateClient.connectWithSigner(exampleCheqdNetwork.rpcUrl, wallet)
73
73
  const keyPair = createKeyPairBase64()
74
74
  const verificationKeys = createVerificationKeys(keyPair, MethodSpecificIdAlgo.Base58, 'key-1', 16)
75
- const verificationMethods = createDidVerificationMethod([VerificationMethods.Base58], [verificationKeys])
75
+ const verificationMethods = createDidVerificationMethod([VerificationMethods.Ed255192020], [verificationKeys])
76
76
  const didPayload = createDidPayload(verificationMethods, [verificationKeys])
77
77
  await expect(signer.getDidSigner(nonExistingKeyId, didPayload.verificationMethod)).rejects.toThrow()
78
78
  })
@@ -84,12 +84,12 @@ describe('CheqdSigningStargateClient', () => {
84
84
  const signer = await CheqdSigningStargateClient.connectWithSigner(exampleCheqdNetwork.rpcUrl, wallet)
85
85
  const keyPair = createKeyPairBase64()
86
86
  const verificationKeys = createVerificationKeys(keyPair, MethodSpecificIdAlgo.Base58, 'key-1', 16)
87
- const verificationMethods = createDidVerificationMethod([VerificationMethods.Base58], [verificationKeys])
88
- const didPayload = createDidPayload(verificationMethods, [verificationKeys])
87
+ const verificationMethods = createDidVerificationMethod([VerificationMethods.Ed255192020], [verificationKeys])
88
+ const didPayload = MsgCreateDidPayload.transformPayload(createDidPayload(verificationMethods, [verificationKeys]))
89
89
 
90
90
  const didSigners = await signer.checkDidSigners(didPayload.verificationMethod)
91
91
 
92
- expect(didSigners[VerificationMethods.Base58]).toBe(EdDSASigner)
92
+ expect(didSigners[VerificationMethods.Ed255192020]).toBe(EdDSASigner)
93
93
  })
94
94
 
95
95
  it('should instantiate multiple signers for a did with multiple verification methods', async () => {
@@ -97,15 +97,18 @@ describe('CheqdSigningStargateClient', () => {
97
97
  const signer = await CheqdSigningStargateClient.connectWithSigner(exampleCheqdNetwork.rpcUrl, wallet)
98
98
  const keyPair1 = createKeyPairBase64()
99
99
  const keyPair2 = createKeyPairBase64()
100
+ const keyPair3 = createKeyPairBase64()
100
101
  const verificationKeys1 = createVerificationKeys(keyPair1, MethodSpecificIdAlgo.Base58, 'key-1', 16)
101
102
  const verificationKeys2 = createVerificationKeys(keyPair2, MethodSpecificIdAlgo.Base58, 'key-2', 16)
102
- const verificationMethods = createDidVerificationMethod([VerificationMethods.Base58, VerificationMethods.JWK], [verificationKeys1, verificationKeys2])
103
- const didPayload = createDidPayload(verificationMethods, [verificationKeys1, verificationKeys2])
103
+ const verificationKeys3 = createVerificationKeys(keyPair3, MethodSpecificIdAlgo.Base58, 'key-3', 16)
104
+ const verificationMethods = createDidVerificationMethod([VerificationMethods.Ed255192020, VerificationMethods.JWK, VerificationMethods.Ed255192018], [verificationKeys1, verificationKeys2, verificationKeys3])
105
+ const didPayload = MsgCreateDidPayload.transformPayload(createDidPayload(verificationMethods, [verificationKeys1, verificationKeys2, verificationKeys3]))
104
106
 
105
107
  const didSigners = await signer.checkDidSigners(didPayload.verificationMethod)
106
108
 
107
- expect(didSigners[VerificationMethods.Base58]).toBe(EdDSASigner)
109
+ expect(didSigners[VerificationMethods.Ed255192020]).toBe(EdDSASigner)
108
110
  expect(didSigners[VerificationMethods.JWK]).toBe(EdDSASigner)
111
+ expect(didSigners[VerificationMethods.Ed255192018]).toBe(EdDSASigner)
109
112
  })
110
113
 
111
114
  it('should throw for non-supported verification method', async () => {
@@ -113,7 +116,7 @@ describe('CheqdSigningStargateClient', () => {
113
116
  const signer = await CheqdSigningStargateClient.connectWithSigner(exampleCheqdNetwork.rpcUrl, wallet)
114
117
  const verificationMethod: Partial<VerificationMethod> = {
115
118
  id: nonExistingKeyId,
116
- type: nonExistingVerificationMethod,
119
+ verificationMethodType: nonExistingVerificationMethod,
117
120
  controller: nonExistingDid,
118
121
  verificationMaterial: JSON.stringify({publicKeyMultibase: nonExistingPublicKeyMultibase})
119
122
  }
@@ -128,8 +131,8 @@ describe('CheqdSigningStargateClient', () => {
128
131
  const signer = await CheqdSigningStargateClient.connectWithSigner(exampleCheqdNetwork.rpcUrl, wallet)
129
132
  const keyPair = createKeyPairBase64()
130
133
  const verificationKeys = createVerificationKeys(keyPair, MethodSpecificIdAlgo.Base58, 'key-1', 16)
131
- const verificationMethods = createDidVerificationMethod([VerificationMethods.Base58], [verificationKeys])
132
- const didPayload = createDidPayload(verificationMethods, [verificationKeys])
134
+ const verificationMethods = createDidVerificationMethod([VerificationMethods.Ed255192020], [verificationKeys])
135
+ const didPayload = MsgCreateDidPayload.transformPayload(MsgCreateDidPayload.fromPartial(createDidPayload(verificationMethods, [verificationKeys])))
133
136
  const signInputs: ISignInputs[] = [
134
137
  {
135
138
  verificationMethodId: didPayload.verificationMethod[0].id,
@@ -1,13 +1,11 @@
1
- import { MsgCreateDidDocPayload, VerificationMethod } from "@cheqd/ts-proto/cheqd/did/v2"
2
- import { CheqdNetwork, IKeyPair, IVerificationKeys, MethodSpecificIdAlgo, TMethodSpecificId, TVerificationKey, TVerificationKeyPrefix, VerificationMethods } from "../src/types"
1
+ import { CheqdNetwork, IKeyPair, IVerificationKeys, MethodSpecificIdAlgo, MsgCreateDidPayload, TMethodSpecificId, TVerificationKey, TVerificationKeyPrefix, VerificationMethodPayload, VerificationMethods } from "../src/types"
3
2
  import { bases } from 'multiformats/basics'
4
- import { base58ToBytes, base64ToBytes } from "did-jwt"
3
+ import { base64ToBytes } from "did-jwt"
5
4
  import { fromString, toString } from 'uint8arrays'
6
5
  import { generateKeyPair, KeyPair } from '@stablelib/ed25519'
7
6
  import { GasPrice } from "@cosmjs/stargate"
8
7
  import { v4 } from 'uuid'
9
8
  import { createHash } from 'crypto'
10
- import { convertKeyPairtoTImportableEd25519Key } from "../src/utils"
11
9
 
12
10
  export const faucet = {
13
11
  prefix: 'cheqd',
@@ -22,6 +20,9 @@ export const exampleCheqdNetwork = {
22
20
  gasPrice: GasPrice.fromString( `50${faucet.minimalDenom}` )
23
21
  }
24
22
 
23
+ // multicodec ed25519-pub header as varint
24
+ const MULTICODEC_ED25519_PUB_HEADER = new Uint8Array([0xed, 0x01]);
25
+
25
26
  /**
26
27
  *? General test utils. Look for src/utils.ts for stable utils exports.
27
28
  *? Used for testing purposes.
@@ -92,33 +93,35 @@ export function createVerificationKeys(keyPair: IKeyPair, algo: MethodSpecificId
92
93
  *? Used for testing purposes.
93
94
  ** NOTE: The following utils are stable but subject to change at any given moment.
94
95
  */
95
- export function createDidVerificationMethod(verificationMethodTypes: VerificationMethods[], verificationKeys: IVerificationKeys[]): VerificationMethod[] {
96
+ export function createDidVerificationMethod(verificationMethodTypes: VerificationMethods[], verificationKeys: IVerificationKeys[]): VerificationMethodPayload[] {
96
97
  return verificationMethodTypes.map((type, _) => {
97
98
  switch (type) {
98
- case VerificationMethods.Base58:
99
+ case VerificationMethods.Ed255192020:
99
100
  return {
100
101
  id: verificationKeys[_].keyId,
101
- type: type,
102
+ type,
102
103
  controller: verificationKeys[_].didUrl,
103
- verificationMaterial: JSON.stringify({
104
- publicKeyMultibase: verificationKeys[_].methodSpecificId,
105
- publicKeyJwk: []
106
- })
104
+ publicKeyMultibase: _encodeMbKey(MULTICODEC_ED25519_PUB_HEADER, base64ToBytes(verificationKeys[_].publicKey))
105
+ }
106
+
107
+ case VerificationMethods.Ed255192018:
108
+ return {
109
+ id: verificationKeys[_].keyId,
110
+ type,
111
+ controller: verificationKeys[_].didUrl,
112
+ publicKeyBase58: verificationKeys[_].methodSpecificId.slice(1)
107
113
  }
108
114
 
109
115
  case VerificationMethods.JWK:
110
116
  return {
111
117
  id: verificationKeys[_].keyId,
112
- type: type,
118
+ type,
113
119
  controller: verificationKeys[_].didUrl,
114
- verificationMaterial: JSON.stringify({
115
- publicKeyJwk: {
116
- crv: 'Ed25519',
117
- kty: 'OKP',
118
- x: toString( fromString( verificationKeys[_].publicKey, 'base64pad' ), 'base64url' )
119
- },
120
- publicKeyMultibase: ''
121
- })
120
+ publicKeyJWK: {
121
+ crv: 'Ed25519',
122
+ kty: 'OKP',
123
+ x: toString( fromString( verificationKeys[_].publicKey, 'base64pad' ), 'base64url' )
124
+ }
122
125
  }
123
126
  }
124
127
  }) ?? []
@@ -129,13 +132,13 @@ export function createDidVerificationMethod(verificationMethodTypes: Verificatio
129
132
  *? Used for testing purposes.
130
133
  ** NOTE: The following utils are stable but subject to change at any given moment.
131
134
  */
132
- export function createDidPayload(verificationMethods: VerificationMethod[], verificationKeys: IVerificationKeys[]): MsgCreateDidDocPayload {
135
+ export function createDidPayload(verificationMethods: VerificationMethodPayload[], verificationKeys: IVerificationKeys[]): MsgCreateDidPayload {
133
136
  if (!verificationMethods || verificationMethods.length === 0)
134
137
  throw new Error('No verification methods provided')
135
138
  if (!verificationKeys || verificationKeys.length === 0)
136
139
  throw new Error('No verification keys provided')
137
140
  const did = verificationKeys[0].didUrl
138
- return MsgCreateDidDocPayload.fromPartial(
141
+ return MsgCreateDidPayload.fromPartial(
139
142
  {
140
143
  id: did,
141
144
  controller: verificationKeys.map(key => key.didUrl),
@@ -149,3 +152,12 @@ export function createDidPayload(verificationMethods: VerificationMethod[], veri
149
152
  function sha256(message: string) {
150
153
  return createHash('sha256').update(message).digest('hex')
151
154
  }
155
+
156
+ function _encodeMbKey(header: any, key: Uint8Array) {
157
+ const mbKey = new Uint8Array(header.length + key.length);
158
+
159
+ mbKey.set(header);
160
+ mbKey.set(key, header.length);
161
+
162
+ return bases['base58btc'].encode(mbKey);
163
+ }
@@ -4,7 +4,7 @@ import { toString } from 'uint8arrays'
4
4
  import { IKeyPair, MethodSpecificIdAlgo, VerificationMethods } from '../src/types'
5
5
 
6
6
  describe('createSignInputsFromImportableEd25519Key', () => {
7
- it('should create a sign input from an importable ed25519 key', async () => {
7
+ it('should create a sign input from an importable ed25519 key 2020', async () => {
8
8
  const keyPair = createKeyPairRaw()
9
9
  const importableEd25519Key: TImportableEd25519Key = {
10
10
  publicKeyHex: toString(keyPair.publicKey, 'hex'),
@@ -18,7 +18,27 @@ describe('createSignInputsFromImportableEd25519Key', () => {
18
18
  }
19
19
 
20
20
  const verificationKeys = createVerificationKeys(keyPairBase64, MethodSpecificIdAlgo.Base58, 'key-1', 16)
21
- const verificationMethod = createDidVerificationMethod([VerificationMethods.Base58], [verificationKeys])
21
+ const verificationMethod = createDidVerificationMethod([VerificationMethods.Ed255192020], [verificationKeys])
22
+ const signInput = createSignInputsFromImportableEd25519Key(importableEd25519Key, verificationMethod)
23
+
24
+ expect(signInput).toEqual({ verificationMethodId: verificationKeys.keyId, privateKeyHex: importableEd25519Key.privateKeyHex })
25
+ })
26
+
27
+ it('should create a sign input from an importable ed25519 key 2018', async () => {
28
+ const keyPair = createKeyPairRaw()
29
+ const importableEd25519Key: TImportableEd25519Key = {
30
+ publicKeyHex: toString(keyPair.publicKey, 'hex'),
31
+ privateKeyHex: toString(keyPair.secretKey, 'hex'),
32
+ kid: toString(keyPair.publicKey, 'hex'),
33
+ type: 'Ed25519'
34
+ }
35
+ const keyPairBase64: IKeyPair = {
36
+ publicKey: toString(keyPair.publicKey, 'base64'),
37
+ privateKey: toString(keyPair.secretKey, 'base64'),
38
+ }
39
+
40
+ const verificationKeys = createVerificationKeys(keyPairBase64, MethodSpecificIdAlgo.Base58, 'key-1', 16)
41
+ const verificationMethod = createDidVerificationMethod([VerificationMethods.Ed255192018], [verificationKeys])
22
42
  const signInput = createSignInputsFromImportableEd25519Key(importableEd25519Key, verificationMethod)
23
43
 
24
44
  expect(signInput).toEqual({ verificationMethodId: verificationKeys.keyId, privateKeyHex: importableEd25519Key.privateKeyHex })