@cheqd/sdk 1.5.0-develop.1 → 1.5.0-develop.2
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 +7 -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 +47 -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 +58 -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,77 @@ 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 = isBase64(publicKey) ? 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
|
-
|
|
131
|
+
const isBase64 = (value: string) => /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})$/.test(value);
|
|
132
|
+
|
|
133
|
+
export function createDidVerificationMethod(verificationMethodTypes: VerificationMethods[], verificationKeys: IVerificationKeys[]): VerificationMethodPayload[] {
|
|
121
134
|
return verificationMethodTypes.map((type, _) => {
|
|
122
135
|
switch (type) {
|
|
123
|
-
case VerificationMethods.
|
|
136
|
+
case VerificationMethods.Ed255192020:
|
|
124
137
|
return {
|
|
125
138
|
id: verificationKeys[_].keyId,
|
|
126
|
-
type
|
|
139
|
+
type,
|
|
127
140
|
controller: verificationKeys[_].didUrl,
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
141
|
+
publicKeyMultibase: _encodeMbKey(MULTICODEC_ED25519_PUB_HEADER, base64ToBytes(verificationKeys[_].publicKey))
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
case VerificationMethods.Ed255192018:
|
|
145
|
+
return {
|
|
146
|
+
id: verificationKeys[_].keyId,
|
|
147
|
+
type,
|
|
148
|
+
controller: verificationKeys[_].didUrl,
|
|
149
|
+
publicKeyBase58: verificationKeys[_].methodSpecificId.slice(1)
|
|
132
150
|
}
|
|
133
151
|
|
|
134
152
|
case VerificationMethods.JWK:
|
|
135
153
|
return {
|
|
136
154
|
id: verificationKeys[_].keyId,
|
|
137
|
-
type
|
|
155
|
+
type,
|
|
138
156
|
controller: verificationKeys[_].didUrl,
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
},
|
|
145
|
-
publicKeyMultibase: ''
|
|
146
|
-
})
|
|
157
|
+
publicKeyJWK: {
|
|
158
|
+
crv: 'Ed25519',
|
|
159
|
+
kty: 'OKP',
|
|
160
|
+
x: toString( fromString( verificationKeys[_].publicKey, 'base64pad' ), 'base64url' )
|
|
161
|
+
}
|
|
147
162
|
}
|
|
148
163
|
}
|
|
149
164
|
}) ?? []
|
|
150
165
|
}
|
|
151
166
|
|
|
152
|
-
export function createDidPayload(verificationMethods:
|
|
167
|
+
export function createDidPayload(verificationMethods: VerificationMethodPayload[], verificationKeys: IVerificationKeys[]): MsgCreateDidPayload {
|
|
153
168
|
if (!verificationMethods || verificationMethods.length === 0)
|
|
154
169
|
throw new Error('No verification methods provided')
|
|
155
170
|
if (!verificationKeys || verificationKeys.length === 0)
|
|
156
171
|
throw new Error('No verification keys provided')
|
|
157
172
|
|
|
158
173
|
const did = verificationKeys[0].didUrl
|
|
159
|
-
return
|
|
174
|
+
return MsgCreateDidPayload.fromPartial(
|
|
160
175
|
{
|
|
161
176
|
id: did,
|
|
162
177
|
controller: verificationKeys.map(key => key.didUrl),
|
|
@@ -167,56 +182,17 @@ export function createDidPayload(verificationMethods: VerificationMethod[], veri
|
|
|
167
182
|
)
|
|
168
183
|
}
|
|
169
184
|
|
|
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
185
|
function sha256(message: string) {
|
|
210
186
|
return createHash('sha256').update(message).digest('hex')
|
|
211
187
|
}
|
|
212
188
|
|
|
213
189
|
// encode a multibase base58-btc multicodec key
|
|
214
|
-
|
|
215
|
-
|
|
190
|
+
function _encodeMbKey(header: any, key: Uint8Array) {
|
|
191
|
+
const mbKey = new Uint8Array(header.length + key.length);
|
|
216
192
|
|
|
217
|
-
|
|
218
|
-
|
|
193
|
+
mbKey.set(header);
|
|
194
|
+
mbKey.set(key, header.length);
|
|
219
195
|
|
|
220
|
-
|
|
221
|
-
|
|
196
|
+
return bases['base58btc'].encode(mbKey);
|
|
197
|
+
}
|
|
222
198
|
|
|
@@ -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 })
|