@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/.github/workflows/test.yml +7 -3
- package/CHANGELOG.md +14 -0
- package/build/index.d.ts +1 -1
- package/build/index.d.ts.map +1 -1
- package/build/index.js +1 -3
- package/build/index.js.map +1 -1
- package/build/modules/did.d.ts +5 -5
- package/build/modules/did.d.ts.map +1 -1
- package/build/modules/did.js +26 -5
- package/build/modules/did.js.map +1 -1
- package/build/modules/resource.d.ts +3 -2
- package/build/modules/resource.d.ts.map +1 -1
- package/build/modules/resource.js +8 -1
- package/build/modules/resource.js.map +1 -1
- package/build/signer.d.ts.map +1 -1
- package/build/signer.js +5 -5
- package/build/signer.js.map +1 -1
- package/build/types.d.ts +237 -3
- package/build/types.d.ts.map +1 -1
- package/build/types.js +127 -2
- package/build/types.js.map +1 -1
- package/build/utils.d.ts +6 -14
- package/build/utils.d.ts.map +1 -1
- package/build/utils.js +46 -69
- package/build/utils.js.map +1 -1
- package/package.json +2 -2
- package/src/index.ts +1 -3
- package/src/modules/did.ts +28 -12
- package/src/modules/resource.ts +9 -3
- package/src/signer.ts +6 -6
- package/src/types.ts +157 -4
- package/src/utils.ts +56 -82
- package/tests/modules/did.test.ts +66 -8
- package/tests/modules/resource.test.ts +1 -1
- package/tests/signer.test.ts +16 -13
- package/tests/testutils.test.ts +34 -22
- package/tests/utils.test.ts +22 -2
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<
|
|
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:
|
|
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.
|
|
49
|
-
const publicKeyMultibase =
|
|
50
|
-
if (
|
|
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 (
|
|
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(
|
|
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(
|
|
101
|
-
didUrl = `did:cheqd:${network}:${(bases['base58btc'].encode((fromString(sha256(
|
|
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
|
|
117
|
+
publicKey,
|
|
107
118
|
}
|
|
108
119
|
case MethodSpecificIdAlgo.Uuid:
|
|
109
|
-
methodSpecificId = bases['base58btc'].encode(base64ToBytes(
|
|
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
|
|
126
|
+
publicKey,
|
|
116
127
|
}
|
|
117
128
|
}
|
|
118
129
|
}
|
|
119
130
|
|
|
120
|
-
export function createDidVerificationMethod(verificationMethodTypes: VerificationMethods[], verificationKeys: IVerificationKeys[]):
|
|
131
|
+
export function createDidVerificationMethod(verificationMethodTypes: VerificationMethods[], verificationKeys: IVerificationKeys[]): VerificationMethodPayload[] {
|
|
121
132
|
return verificationMethodTypes.map((type, _) => {
|
|
122
133
|
switch (type) {
|
|
123
|
-
case VerificationMethods.
|
|
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
|
|
145
|
+
type,
|
|
127
146
|
controller: verificationKeys[_].didUrl,
|
|
128
|
-
|
|
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
|
|
153
|
+
type,
|
|
138
154
|
controller: verificationKeys[_].didUrl,
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
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:
|
|
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
|
|
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
|
-
|
|
215
|
-
|
|
188
|
+
function _encodeMbKey(header: any, key: Uint8Array) {
|
|
189
|
+
const mbKey = new Uint8Array(header.length + key.length);
|
|
216
190
|
|
|
217
|
-
|
|
218
|
-
|
|
191
|
+
mbKey.set(header);
|
|
192
|
+
mbKey.set(key, header.length);
|
|
219
193
|
|
|
220
|
-
|
|
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.
|
|
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: '
|
|
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.
|
|
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: '
|
|
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.
|
|
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: '
|
|
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 =
|
|
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.
|
|
37
|
+
const verificationMethods = createDidVerificationMethod([VerificationMethods.Ed255192020], [verificationKeys])
|
|
38
38
|
const didPayload = createDidPayload(verificationMethods, [verificationKeys])
|
|
39
39
|
|
|
40
40
|
const signInputs: ISignInputs[] = [
|
package/tests/signer.test.ts
CHANGED
|
@@ -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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
103
|
-
const
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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,
|
package/tests/testutils.test.ts
CHANGED
|
@@ -1,13 +1,11 @@
|
|
|
1
|
-
import {
|
|
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 {
|
|
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[]):
|
|
96
|
+
export function createDidVerificationMethod(verificationMethodTypes: VerificationMethods[], verificationKeys: IVerificationKeys[]): VerificationMethodPayload[] {
|
|
96
97
|
return verificationMethodTypes.map((type, _) => {
|
|
97
98
|
switch (type) {
|
|
98
|
-
case VerificationMethods.
|
|
99
|
+
case VerificationMethods.Ed255192020:
|
|
99
100
|
return {
|
|
100
101
|
id: verificationKeys[_].keyId,
|
|
101
|
-
type
|
|
102
|
+
type,
|
|
102
103
|
controller: verificationKeys[_].didUrl,
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
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
|
|
118
|
+
type,
|
|
113
119
|
controller: verificationKeys[_].didUrl,
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
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:
|
|
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
|
|
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
|
+
}
|
package/tests/utils.test.ts
CHANGED
|
@@ -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.
|
|
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 })
|