@cheqd/sdk 1.4.0 → 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/build.yml +3 -2
- package/.github/workflows/dispatch.yml +7 -1
- package/.github/workflows/test.yml +66 -0
- package/CHANGELOG.md +22 -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 +41 -28
- package/build/modules/did.d.ts.map +1 -1
- package/build/modules/did.js +78 -30
- package/build/modules/did.js.map +1 -1
- package/build/modules/resource.d.ts +4 -4
- package/build/modules/resource.d.ts.map +1 -1
- package/build/modules/resource.js +14 -33
- package/build/modules/resource.js.map +1 -1
- package/build/signer.d.ts +4 -4
- package/build/signer.d.ts.map +1 -1
- package/build/signer.js +27 -16
- package/build/signer.js.map +1 -1
- package/build/types.d.ts +239 -1
- 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 +5 -17
- package/build/utils.d.ts.map +1 -1
- package/build/utils.js +52 -60
- package/build/utils.js.map +1 -1
- package/docker/Dockerfile +55 -0
- package/docker/entrypoint.sh +58 -0
- package/docker/localnet/build-latest.env +7 -0
- package/docker/localnet/container-env/observer-0.env +13 -0
- package/docker/localnet/container-env/seed-0.env +17 -0
- package/docker/localnet/container-env/validator-0.env +13 -0
- package/docker/localnet/container-env/validator-1.env +13 -0
- package/docker/localnet/container-env/validator-2.env +13 -0
- package/docker/localnet/container-env/validator-3.env +13 -0
- package/docker/localnet/docker-compose.yml +281 -0
- package/docker/localnet/gen-network-config.sh +259 -0
- package/docker/localnet/import-keys.sh +31 -0
- package/package.json +2 -2
- package/src/index.ts +1 -3
- package/src/modules/did.ts +118 -44
- package/src/modules/resource.ts +10 -33
- package/src/signer.ts +29 -16
- package/src/types.ts +160 -2
- package/src/utils.ts +67 -70
- package/tests/modules/did.test.ts +69 -9
- package/tests/modules/resource.test.ts +6 -4
- package/tests/signer.test.ts +25 -23
- package/tests/testutils.test.ts +43 -25
- package/tests/utils.test.ts +22 -2
package/src/utils.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { VerificationMethod } from "@cheqd/ts-proto/cheqd/v1/did"
|
|
2
1
|
import {
|
|
3
2
|
IKeyPair,
|
|
4
3
|
IKeyValuePair,
|
|
@@ -9,14 +8,17 @@ import {
|
|
|
9
8
|
TVerificationKey,
|
|
10
9
|
TVerificationKeyPrefix,
|
|
11
10
|
CheqdNetwork,
|
|
12
|
-
IVerificationKeys
|
|
11
|
+
IVerificationKeys,
|
|
12
|
+
MsgCreateDidPayload,
|
|
13
|
+
VerificationMethodPayload,
|
|
14
|
+
MsgUpdateDidPayload
|
|
13
15
|
} from "./types"
|
|
14
16
|
import { fromString, toString } from 'uint8arrays'
|
|
15
17
|
import { bases } from "multiformats/basics"
|
|
16
18
|
import { base64ToBytes } from "did-jwt"
|
|
17
19
|
import { generateKeyPair, generateKeyPairFromSeed, KeyPair } from '@stablelib/ed25519'
|
|
18
20
|
import { v4 } from 'uuid'
|
|
19
|
-
import {
|
|
21
|
+
import { createHash } from 'crypto'
|
|
20
22
|
|
|
21
23
|
export type TImportableEd25519Key = {
|
|
22
24
|
publicKeyHex: string
|
|
@@ -25,43 +27,53 @@ export type TImportableEd25519Key = {
|
|
|
25
27
|
type: "Ed25519"
|
|
26
28
|
}
|
|
27
29
|
|
|
28
|
-
|
|
30
|
+
// multicodec ed25519-pub header as varint
|
|
31
|
+
const MULTICODEC_ED25519_PUB_HEADER = new Uint8Array([0xed, 0x01]);
|
|
29
32
|
|
|
30
|
-
export
|
|
31
|
-
return Object.entries(object).map(([key, value]) => ({ key, value }))
|
|
32
|
-
}
|
|
33
|
+
export type IdentifierPayload = Partial<MsgCreateDidPayload> | Partial<MsgUpdateDidPayload>
|
|
33
34
|
|
|
34
35
|
export function isEqualKeyValuePair(kv1: IKeyValuePair[], kv2: IKeyValuePair[]): boolean {
|
|
35
36
|
return kv1.every((item, index) => item.key === kv2[index].key && item.value === kv2[index].value)
|
|
36
37
|
}
|
|
37
38
|
|
|
38
|
-
export function createSignInputsFromImportableEd25519Key(key: TImportableEd25519Key, verificationMethod:
|
|
39
|
+
export function createSignInputsFromImportableEd25519Key(key: TImportableEd25519Key, verificationMethod: VerificationMethodPayload[]): ISignInputs {
|
|
39
40
|
if (verificationMethod?.length === 0) throw new Error('No verification methods provided')
|
|
40
41
|
|
|
41
42
|
const publicKey = fromString(key.publicKeyHex, 'hex')
|
|
42
43
|
|
|
43
44
|
for(const method of verificationMethod) {
|
|
44
45
|
switch (method?.type) {
|
|
45
|
-
case VerificationMethods.
|
|
46
|
-
const publicKeyMultibase =
|
|
46
|
+
case VerificationMethods.Ed255192020:
|
|
47
|
+
const publicKeyMultibase = _encodeMbKey(MULTICODEC_ED25519_PUB_HEADER, publicKey)
|
|
47
48
|
if (method.publicKeyMultibase === publicKeyMultibase) {
|
|
48
49
|
return {
|
|
49
50
|
verificationMethodId: method.id,
|
|
50
51
|
privateKeyHex: key.privateKeyHex
|
|
51
52
|
}
|
|
52
53
|
}
|
|
54
|
+
|
|
55
|
+
case VerificationMethods.Ed255192018:
|
|
56
|
+
const publicKeyBase58 = bases['base58btc'].encode(publicKey).slice(1)
|
|
57
|
+
if (method.publicKeyBase58 === publicKeyBase58) {
|
|
58
|
+
return {
|
|
59
|
+
verificationMethodId: method.id,
|
|
60
|
+
privateKeyHex: key.privateKeyHex
|
|
61
|
+
}
|
|
62
|
+
}
|
|
53
63
|
|
|
54
64
|
case VerificationMethods.JWK:
|
|
55
|
-
const publicKeyJWK =
|
|
65
|
+
const publicKeyJWK: any = {
|
|
56
66
|
crv: 'Ed25519',
|
|
57
67
|
kty: 'OKP',
|
|
58
68
|
x: toString( publicKey, 'base64url' )
|
|
59
|
-
}
|
|
60
|
-
if (
|
|
69
|
+
}
|
|
70
|
+
if (JSON.stringify(method.publicKeyJWK) === JSON.stringify(publicKeyJWK)) {
|
|
61
71
|
return {
|
|
62
72
|
verificationMethodId: method.id,
|
|
63
73
|
privateKeyHex: key.privateKeyHex
|
|
64
74
|
}
|
|
75
|
+
} else {
|
|
76
|
+
throw new Error(`JWK not matching ${method.publicKeyJWK}, ${publicKeyJWK}`)
|
|
65
77
|
}
|
|
66
78
|
}
|
|
67
79
|
}
|
|
@@ -89,62 +101,70 @@ export function createKeyPairHex(seed?: string): IKeyPair {
|
|
|
89
101
|
}
|
|
90
102
|
}
|
|
91
103
|
|
|
92
|
-
export function createVerificationKeys(
|
|
104
|
+
export function createVerificationKeys(publicKey: string, algo: MethodSpecificIdAlgo, key: TVerificationKey<TVerificationKeyPrefix, number>, network: CheqdNetwork = CheqdNetwork.Testnet): IVerificationKeys {
|
|
93
105
|
let methodSpecificId: TMethodSpecificId
|
|
94
106
|
let didUrl: IVerificationKeys['didUrl']
|
|
107
|
+
|
|
108
|
+
publicKey = isBase64(publicKey) ? publicKey : toString(fromString(publicKey, 'hex'), 'base64')
|
|
95
109
|
switch (algo) {
|
|
96
110
|
case MethodSpecificIdAlgo.Base58:
|
|
97
|
-
methodSpecificId = bases['base58btc'].encode(base64ToBytes(
|
|
98
|
-
didUrl = `did:cheqd:${network}:${
|
|
111
|
+
methodSpecificId = bases['base58btc'].encode(base64ToBytes(publicKey))
|
|
112
|
+
didUrl = `did:cheqd:${network}:${(bases['base58btc'].encode((fromString(sha256(publicKey))).slice(0,16))).slice(1)}`
|
|
99
113
|
return {
|
|
100
114
|
methodSpecificId,
|
|
101
115
|
didUrl,
|
|
102
116
|
keyId: `${didUrl}#${key}`,
|
|
103
|
-
publicKey
|
|
117
|
+
publicKey,
|
|
104
118
|
}
|
|
105
119
|
case MethodSpecificIdAlgo.Uuid:
|
|
106
|
-
methodSpecificId = bases['base58btc'].encode(base64ToBytes(
|
|
120
|
+
methodSpecificId = bases['base58btc'].encode(base64ToBytes(publicKey))
|
|
107
121
|
didUrl = `did:cheqd:${network}:${v4()}`
|
|
108
122
|
return {
|
|
109
123
|
methodSpecificId,
|
|
110
124
|
didUrl,
|
|
111
125
|
keyId: `${didUrl}#${key}`,
|
|
112
|
-
publicKey
|
|
126
|
+
publicKey,
|
|
113
127
|
}
|
|
114
128
|
}
|
|
115
129
|
}
|
|
116
130
|
|
|
117
|
-
|
|
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[] {
|
|
118
134
|
return verificationMethodTypes.map((type, _) => {
|
|
119
135
|
switch (type) {
|
|
120
|
-
case VerificationMethods.
|
|
136
|
+
case VerificationMethods.Ed255192020:
|
|
121
137
|
return {
|
|
122
138
|
id: verificationKeys[_].keyId,
|
|
123
|
-
type
|
|
139
|
+
type,
|
|
124
140
|
controller: verificationKeys[_].didUrl,
|
|
125
|
-
publicKeyMultibase: verificationKeys[_].
|
|
126
|
-
|
|
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)
|
|
127
150
|
}
|
|
128
151
|
|
|
129
152
|
case VerificationMethods.JWK:
|
|
130
153
|
return {
|
|
131
154
|
id: verificationKeys[_].keyId,
|
|
132
|
-
type
|
|
155
|
+
type,
|
|
133
156
|
controller: verificationKeys[_].didUrl,
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
}
|
|
140
|
-
),
|
|
141
|
-
publicKeyMultibase: ''
|
|
157
|
+
publicKeyJWK: {
|
|
158
|
+
crv: 'Ed25519',
|
|
159
|
+
kty: 'OKP',
|
|
160
|
+
x: toString( fromString( verificationKeys[_].publicKey, 'base64pad' ), 'base64url' )
|
|
161
|
+
}
|
|
142
162
|
}
|
|
143
163
|
}
|
|
144
164
|
}) ?? []
|
|
145
165
|
}
|
|
146
166
|
|
|
147
|
-
export function createDidPayload(verificationMethods:
|
|
167
|
+
export function createDidPayload(verificationMethods: VerificationMethodPayload[], verificationKeys: IVerificationKeys[]): MsgCreateDidPayload {
|
|
148
168
|
if (!verificationMethods || verificationMethods.length === 0)
|
|
149
169
|
throw new Error('No verification methods provided')
|
|
150
170
|
if (!verificationKeys || verificationKeys.length === 0)
|
|
@@ -156,46 +176,23 @@ export function createDidPayload(verificationMethods: VerificationMethod[], veri
|
|
|
156
176
|
id: did,
|
|
157
177
|
controller: verificationKeys.map(key => key.didUrl),
|
|
158
178
|
verificationMethod: verificationMethods,
|
|
159
|
-
authentication: verificationKeys.map(key => key.keyId)
|
|
179
|
+
authentication: verificationKeys.map(key => key.keyId),
|
|
180
|
+
versionId: v4()
|
|
160
181
|
}
|
|
161
182
|
)
|
|
162
183
|
}
|
|
163
184
|
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
if(!keys) {
|
|
168
|
-
keys = [seed ? createKeyPairBase64(seed) : createKeyPairBase64()]
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
const verificationMethodTypes = keys.map((key) => !key.algo || key.algo == MethodSpecificIdAlgo.Base58 ? VerificationMethods.Base58 : VerificationMethods.JWK)
|
|
172
|
-
const verificationKeys = keys.map((key, i) => createVerificationKeys(key, key.algo || MethodSpecificIdAlgo.Base58, `key-${i}`))
|
|
173
|
-
const verificationMethod = createDidVerificationMethod(verificationMethodTypes, verificationKeys)
|
|
174
|
-
|
|
175
|
-
let payload : Partial<MsgCreateDidPayload> = {
|
|
176
|
-
id: verificationKeys[0].didUrl,
|
|
177
|
-
controller: verificationKeys.map(key => key.didUrl),
|
|
178
|
-
verificationMethod: verificationMethod,
|
|
179
|
-
authentication: verificationKeys.map(key => key.keyId),
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
const keyHexs = keys.map((key)=>convertKeyPairtoTImportableEd25519Key(key))
|
|
183
|
-
const signInputs = keyHexs.map((key)=>createSignInputsFromImportableEd25519Key(key, verificationMethod))
|
|
184
|
-
|
|
185
|
-
return { didPayload: MsgCreateDidPayload.fromPartial(payload), keys, signInputs }
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
export function convertKeyPairtoTImportableEd25519Key(keyPair: IKeyPair) : TImportableEd25519Key {
|
|
189
|
-
return {
|
|
190
|
-
type: 'Ed25519',
|
|
191
|
-
privateKeyHex: toString(fromString(keyPair.privateKey, 'base64'), 'hex'),
|
|
192
|
-
kid: 'kid',
|
|
193
|
-
publicKeyHex: toString(fromString(keyPair.publicKey, 'base64'), 'hex')
|
|
194
|
-
}
|
|
185
|
+
function sha256(message: string) {
|
|
186
|
+
return createHash('sha256').update(message).digest('hex')
|
|
195
187
|
}
|
|
196
188
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
const
|
|
200
|
-
|
|
189
|
+
// encode a multibase base58-btc multicodec key
|
|
190
|
+
function _encodeMbKey(header: any, key: Uint8Array) {
|
|
191
|
+
const mbKey = new Uint8Array(header.length + key.length);
|
|
192
|
+
|
|
193
|
+
mbKey.set(header);
|
|
194
|
+
mbKey.set(key, header.length);
|
|
195
|
+
|
|
196
|
+
return bases['base58btc'].encode(mbKey);
|
|
201
197
|
}
|
|
198
|
+
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { MsgUpdateDidDocPayload } from "@cheqd/ts-proto/cheqd/did/v2"
|
|
2
2
|
import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"
|
|
3
3
|
import { DeliverTxResponse } from "@cosmjs/stargate"
|
|
4
4
|
import { fromString, toString } from 'uint8arrays'
|
|
5
|
+
import { v4 } from "uuid"
|
|
5
6
|
import { DIDModule } from "../../src"
|
|
6
7
|
import { createDefaultCheqdRegistry } from "../../src/registry"
|
|
7
8
|
import { CheqdSigningStargateClient } from "../../src/signer"
|
|
8
|
-
import { DidStdFee, ISignInputs, MethodSpecificIdAlgo, VerificationMethods } from "../../src/types"
|
|
9
|
+
import { DidStdFee, ISignInputs, MethodSpecificIdAlgo, MsgCreateDidPayload, MsgDeactivateDidPayload, VerificationMethods } from "../../src/types"
|
|
9
10
|
import { createDidPayload, createDidVerificationMethod, createKeyPairBase64, createVerificationKeys, exampleCheqdNetwork, faucet } from "../testutils.test"
|
|
10
11
|
|
|
11
12
|
const defaultAsyncTxTimeout = 30000
|
|
@@ -28,7 +29,7 @@ describe('DIDModule', () => {
|
|
|
28
29
|
const didModule = new DIDModule(signer)
|
|
29
30
|
const keyPair = createKeyPairBase64()
|
|
30
31
|
const verificationKeys = createVerificationKeys(keyPair, MethodSpecificIdAlgo.Base58, 'key-1', 16)
|
|
31
|
-
const verificationMethods = createDidVerificationMethod([VerificationMethods.
|
|
32
|
+
const verificationMethods = createDidVerificationMethod([VerificationMethods.JWK], [verificationKeys])
|
|
32
33
|
const didPayload = createDidPayload(verificationMethods, [verificationKeys])
|
|
33
34
|
|
|
34
35
|
const signInputs: ISignInputs[] = [
|
|
@@ -44,7 +45,7 @@ describe('DIDModule', () => {
|
|
|
44
45
|
amount: '5000000'
|
|
45
46
|
}
|
|
46
47
|
],
|
|
47
|
-
gas: '
|
|
48
|
+
gas: '200000',
|
|
48
49
|
payer: (await wallet.getAccounts())[0].address
|
|
49
50
|
}
|
|
50
51
|
const didTx: DeliverTxResponse = await didModule.createDidTx(
|
|
@@ -67,8 +68,9 @@ describe('DIDModule', () => {
|
|
|
67
68
|
const didModule = new DIDModule(signer)
|
|
68
69
|
const keyPair = createKeyPairBase64()
|
|
69
70
|
const verificationKeys = createVerificationKeys(keyPair, MethodSpecificIdAlgo.Uuid, 'key-1', 16)
|
|
70
|
-
const verificationMethods = createDidVerificationMethod([VerificationMethods.
|
|
71
|
+
const verificationMethods = createDidVerificationMethod([VerificationMethods.Ed255192020], [verificationKeys])
|
|
71
72
|
const didPayload = createDidPayload(verificationMethods, [verificationKeys])
|
|
73
|
+
didPayload.versionId = v4()
|
|
72
74
|
const signInputs: ISignInputs[] = [
|
|
73
75
|
{
|
|
74
76
|
verificationMethodId: didPayload.verificationMethod[0].id,
|
|
@@ -82,7 +84,7 @@ describe('DIDModule', () => {
|
|
|
82
84
|
amount: '5000000'
|
|
83
85
|
}
|
|
84
86
|
],
|
|
85
|
-
gas: '
|
|
87
|
+
gas: '200000',
|
|
86
88
|
payer: (await wallet.getAccounts())[0].address
|
|
87
89
|
}
|
|
88
90
|
const didTx: DeliverTxResponse = await didModule.createDidTx(
|
|
@@ -108,7 +110,7 @@ describe('DIDModule', () => {
|
|
|
108
110
|
|
|
109
111
|
const keyPair = createKeyPairBase64()
|
|
110
112
|
const verificationKeys = createVerificationKeys(keyPair, MethodSpecificIdAlgo.Base58, 'key-1', 16)
|
|
111
|
-
const verificationMethods = createDidVerificationMethod([VerificationMethods.
|
|
113
|
+
const verificationMethods = createDidVerificationMethod([VerificationMethods.Ed255192020], [verificationKeys])
|
|
112
114
|
const didPayload = createDidPayload(verificationMethods, [verificationKeys])
|
|
113
115
|
const signInputs: ISignInputs[] = [
|
|
114
116
|
{
|
|
@@ -123,7 +125,7 @@ describe('DIDModule', () => {
|
|
|
123
125
|
amount: '5000000'
|
|
124
126
|
}
|
|
125
127
|
],
|
|
126
|
-
gas: '
|
|
128
|
+
gas: '200000',
|
|
127
129
|
payer: (await wallet.getAccounts())[0].address
|
|
128
130
|
}
|
|
129
131
|
const didTx: DeliverTxResponse = await didModule.createDidTx(
|
|
@@ -139,7 +141,7 @@ describe('DIDModule', () => {
|
|
|
139
141
|
expect(didTx.code).toBe(0)
|
|
140
142
|
|
|
141
143
|
// Update the DID
|
|
142
|
-
const updateDidPayload =
|
|
144
|
+
const updateDidPayload = MsgCreateDidPayload.fromPartial({
|
|
143
145
|
context: didPayload.context,
|
|
144
146
|
id: didPayload.id,
|
|
145
147
|
controller: didPayload.controller,
|
|
@@ -160,4 +162,62 @@ describe('DIDModule', () => {
|
|
|
160
162
|
expect(updateDidTx.code).toBe(0)
|
|
161
163
|
}, defaultAsyncTxTimeout)
|
|
162
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
|
+
})
|
|
163
223
|
})
|
|
@@ -6,7 +6,7 @@ import { createDefaultCheqdRegistry } from "../../src/registry"
|
|
|
6
6
|
import { CheqdSigningStargateClient } from "../../src/signer"
|
|
7
7
|
import { DidStdFee, ISignInputs, MethodSpecificIdAlgo, VerificationMethods } from '../../src/types';
|
|
8
8
|
import { createDidPayload, createDidVerificationMethod, createKeyPairBase64, createVerificationKeys, exampleCheqdNetwork, faucet } from "../testutils.test"
|
|
9
|
-
import { MsgCreateResourcePayload } from '@cheqd/ts-proto/resource/
|
|
9
|
+
import { MsgCreateResourcePayload } from '@cheqd/ts-proto/cheqd/resource/v2';
|
|
10
10
|
import { randomUUID } from "crypto"
|
|
11
11
|
|
|
12
12
|
const defaultAsyncTxTimeout = 30000
|
|
@@ -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[] = [
|
|
@@ -48,10 +48,10 @@ describe('ResourceModule', () => {
|
|
|
48
48
|
amount: [
|
|
49
49
|
{
|
|
50
50
|
denom: 'ncheq',
|
|
51
|
-
amount: '
|
|
51
|
+
amount: '2500000000'
|
|
52
52
|
}
|
|
53
53
|
],
|
|
54
|
-
gas: '
|
|
54
|
+
gas: '200000',
|
|
55
55
|
payer: (await wallet.getAccounts())[0].address
|
|
56
56
|
}
|
|
57
57
|
|
|
@@ -74,6 +74,8 @@ describe('ResourceModule', () => {
|
|
|
74
74
|
const resourcePayload: MsgCreateResourcePayload = {
|
|
75
75
|
collectionId: didPayload.id.split(":").reverse()[0],
|
|
76
76
|
id: randomUUID(),
|
|
77
|
+
version: "1.0",
|
|
78
|
+
alsoKnownAs: [],
|
|
77
79
|
name: 'Test Resource',
|
|
78
80
|
resourceType: 'test-resource-type',
|
|
79
81
|
data: new TextEncoder().encode("{ \"message\": \"hello world\"}")
|
package/tests/signer.test.ts
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import { VerificationMethod } from "@cheqd/ts-proto/cheqd/
|
|
2
|
-
import { MsgCreateDid, MsgCreateDidPayload, SignInfo } from "@cheqd/ts-proto/cheqd/v1/tx"
|
|
1
|
+
import { MsgCreateDidDoc, MsgCreateDidDocPayload, VerificationMethod } from "@cheqd/ts-proto/cheqd/did/v2"
|
|
3
2
|
import { DirectSecp256k1HdWallet, Registry } from "@cosmjs/proto-signing"
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
3
|
+
import { EdDSASigner } from "did-jwt"
|
|
4
|
+
import { typeUrlMsgCreateDidDoc } from '../src/modules/did'
|
|
6
5
|
import { CheqdSigningStargateClient } from "../src/signer"
|
|
7
|
-
import { ISignInputs, MethodSpecificIdAlgo, VerificationMethods } from "../src/types"
|
|
6
|
+
import { ISignInputs, MethodSpecificIdAlgo, MsgCreateDidPayload, VerificationMethods } from "../src/types"
|
|
8
7
|
import { fromString, toString } from 'uint8arrays'
|
|
9
8
|
import { createDidPayload, createDidVerificationMethod, createKeyPairBase64, createVerificationKeys, exampleCheqdNetwork, faucet } from "./testutils.test"
|
|
10
9
|
import { verify } from "@stablelib/ed25519"
|
|
@@ -42,9 +41,9 @@ describe('CheqdSigningStargateClient', () => {
|
|
|
42
41
|
it('can be constructed with cheqd custom registry', async () => {
|
|
43
42
|
const wallet = await DirectSecp256k1HdWallet.fromMnemonic(faucet.mnemonic)
|
|
44
43
|
const registry = new Registry()
|
|
45
|
-
registry.register(
|
|
44
|
+
registry.register(typeUrlMsgCreateDidDoc, MsgCreateDidDoc)
|
|
46
45
|
const signer = await CheqdSigningStargateClient.connectWithSigner(exampleCheqdNetwork.rpcUrl, wallet, { registry })
|
|
47
|
-
expect(signer.registry.lookupType(
|
|
46
|
+
expect(signer.registry.lookupType(typeUrlMsgCreateDidDoc)).toBe(MsgCreateDidDoc)
|
|
48
47
|
})
|
|
49
48
|
})
|
|
50
49
|
|
|
@@ -54,8 +53,8 @@ describe('CheqdSigningStargateClient', () => {
|
|
|
54
53
|
const signer = await CheqdSigningStargateClient.connectWithSigner(exampleCheqdNetwork.rpcUrl, wallet)
|
|
55
54
|
const keyPair = createKeyPairBase64()
|
|
56
55
|
const verificationKeys = createVerificationKeys(keyPair, MethodSpecificIdAlgo.Base58, 'key-1', 16)
|
|
57
|
-
const verificationMethods = createDidVerificationMethod([VerificationMethods.
|
|
58
|
-
const didPayload = createDidPayload(verificationMethods, [verificationKeys])
|
|
56
|
+
const verificationMethods = createDidVerificationMethod([VerificationMethods.Ed255192020], [verificationKeys])
|
|
57
|
+
const didPayload = MsgCreateDidPayload.transformPayload(createDidPayload(verificationMethods, [verificationKeys]))
|
|
59
58
|
const didSigner = await signer.getDidSigner(didPayload.verificationMethod[0].id, didPayload.verificationMethod)
|
|
60
59
|
|
|
61
60
|
expect(didSigner).toBe(EdDSASigner)
|
|
@@ -73,7 +72,7 @@ describe('CheqdSigningStargateClient', () => {
|
|
|
73
72
|
const signer = await CheqdSigningStargateClient.connectWithSigner(exampleCheqdNetwork.rpcUrl, wallet)
|
|
74
73
|
const keyPair = createKeyPairBase64()
|
|
75
74
|
const verificationKeys = createVerificationKeys(keyPair, MethodSpecificIdAlgo.Base58, 'key-1', 16)
|
|
76
|
-
const verificationMethods = createDidVerificationMethod([VerificationMethods.
|
|
75
|
+
const verificationMethods = createDidVerificationMethod([VerificationMethods.Ed255192020], [verificationKeys])
|
|
77
76
|
const didPayload = createDidPayload(verificationMethods, [verificationKeys])
|
|
78
77
|
await expect(signer.getDidSigner(nonExistingKeyId, didPayload.verificationMethod)).rejects.toThrow()
|
|
79
78
|
})
|
|
@@ -85,12 +84,12 @@ describe('CheqdSigningStargateClient', () => {
|
|
|
85
84
|
const signer = await CheqdSigningStargateClient.connectWithSigner(exampleCheqdNetwork.rpcUrl, wallet)
|
|
86
85
|
const keyPair = createKeyPairBase64()
|
|
87
86
|
const verificationKeys = createVerificationKeys(keyPair, MethodSpecificIdAlgo.Base58, 'key-1', 16)
|
|
88
|
-
const verificationMethods = createDidVerificationMethod([VerificationMethods.
|
|
89
|
-
const didPayload = createDidPayload(verificationMethods, [verificationKeys])
|
|
87
|
+
const verificationMethods = createDidVerificationMethod([VerificationMethods.Ed255192020], [verificationKeys])
|
|
88
|
+
const didPayload = MsgCreateDidPayload.transformPayload(createDidPayload(verificationMethods, [verificationKeys]))
|
|
90
89
|
|
|
91
90
|
const didSigners = await signer.checkDidSigners(didPayload.verificationMethod)
|
|
92
91
|
|
|
93
|
-
expect(didSigners[VerificationMethods.
|
|
92
|
+
expect(didSigners[VerificationMethods.Ed255192020]).toBe(EdDSASigner)
|
|
94
93
|
})
|
|
95
94
|
|
|
96
95
|
it('should instantiate multiple signers for a did with multiple verification methods', async () => {
|
|
@@ -98,15 +97,18 @@ describe('CheqdSigningStargateClient', () => {
|
|
|
98
97
|
const signer = await CheqdSigningStargateClient.connectWithSigner(exampleCheqdNetwork.rpcUrl, wallet)
|
|
99
98
|
const keyPair1 = createKeyPairBase64()
|
|
100
99
|
const keyPair2 = createKeyPairBase64()
|
|
100
|
+
const keyPair3 = createKeyPairBase64()
|
|
101
101
|
const verificationKeys1 = createVerificationKeys(keyPair1, MethodSpecificIdAlgo.Base58, 'key-1', 16)
|
|
102
102
|
const verificationKeys2 = createVerificationKeys(keyPair2, MethodSpecificIdAlgo.Base58, 'key-2', 16)
|
|
103
|
-
const
|
|
104
|
-
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]))
|
|
105
106
|
|
|
106
107
|
const didSigners = await signer.checkDidSigners(didPayload.verificationMethod)
|
|
107
108
|
|
|
108
|
-
expect(didSigners[VerificationMethods.
|
|
109
|
+
expect(didSigners[VerificationMethods.Ed255192020]).toBe(EdDSASigner)
|
|
109
110
|
expect(didSigners[VerificationMethods.JWK]).toBe(EdDSASigner)
|
|
111
|
+
expect(didSigners[VerificationMethods.Ed255192018]).toBe(EdDSASigner)
|
|
110
112
|
})
|
|
111
113
|
|
|
112
114
|
it('should throw for non-supported verification method', async () => {
|
|
@@ -114,9 +116,9 @@ describe('CheqdSigningStargateClient', () => {
|
|
|
114
116
|
const signer = await CheqdSigningStargateClient.connectWithSigner(exampleCheqdNetwork.rpcUrl, wallet)
|
|
115
117
|
const verificationMethod: Partial<VerificationMethod> = {
|
|
116
118
|
id: nonExistingKeyId,
|
|
117
|
-
|
|
119
|
+
verificationMethodType: nonExistingVerificationMethod,
|
|
118
120
|
controller: nonExistingDid,
|
|
119
|
-
publicKeyMultibase: nonExistingPublicKeyMultibase
|
|
121
|
+
verificationMaterial: JSON.stringify({publicKeyMultibase: nonExistingPublicKeyMultibase})
|
|
120
122
|
}
|
|
121
123
|
|
|
122
124
|
await expect(signer.checkDidSigners([VerificationMethod.fromPartial(verificationMethod)])).rejects.toThrow()
|
|
@@ -129,8 +131,8 @@ describe('CheqdSigningStargateClient', () => {
|
|
|
129
131
|
const signer = await CheqdSigningStargateClient.connectWithSigner(exampleCheqdNetwork.rpcUrl, wallet)
|
|
130
132
|
const keyPair = createKeyPairBase64()
|
|
131
133
|
const verificationKeys = createVerificationKeys(keyPair, MethodSpecificIdAlgo.Base58, 'key-1', 16)
|
|
132
|
-
const verificationMethods = createDidVerificationMethod([VerificationMethods.
|
|
133
|
-
const didPayload = createDidPayload(verificationMethods, [verificationKeys])
|
|
134
|
+
const verificationMethods = createDidVerificationMethod([VerificationMethods.Ed255192020], [verificationKeys])
|
|
135
|
+
const didPayload = MsgCreateDidPayload.transformPayload(MsgCreateDidPayload.fromPartial(createDidPayload(verificationMethods, [verificationKeys])))
|
|
134
136
|
const signInputs: ISignInputs[] = [
|
|
135
137
|
{
|
|
136
138
|
verificationMethodId: didPayload.verificationMethod[0].id,
|
|
@@ -139,12 +141,12 @@ describe('CheqdSigningStargateClient', () => {
|
|
|
139
141
|
]
|
|
140
142
|
const signInfos = await signer.signCreateDidTx(signInputs, didPayload)
|
|
141
143
|
const publicKeyRaw = fromString(keyPair.publicKey, 'base64')
|
|
142
|
-
const messageRaw =
|
|
143
|
-
|
|
144
|
+
const messageRaw = MsgCreateDidDocPayload.encode(didPayload).finish()
|
|
145
|
+
|
|
144
146
|
const verified = verify(
|
|
145
147
|
publicKeyRaw,
|
|
146
148
|
messageRaw,
|
|
147
|
-
|
|
149
|
+
signInfos[0].signature
|
|
148
150
|
)
|
|
149
151
|
|
|
150
152
|
expect(verified).toBe(true)
|