@did-btcr2/method 0.13.1
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/LICENSE +373 -0
- package/README.md +7 -0
- package/dist/browser.js +2364 -0
- package/dist/browser.js.map +7 -0
- package/dist/browser.mjs +2364 -0
- package/dist/browser.mjs.map +7 -0
- package/dist/cjs/bitcoin/constants.js +20 -0
- package/dist/cjs/bitcoin/constants.js.map +1 -0
- package/dist/cjs/bitcoin/errors.js +11 -0
- package/dist/cjs/bitcoin/errors.js.map +1 -0
- package/dist/cjs/bitcoin/index.js +95 -0
- package/dist/cjs/bitcoin/index.js.map +1 -0
- package/dist/cjs/bitcoin/interface.js +2 -0
- package/dist/cjs/bitcoin/interface.js.map +1 -0
- package/dist/cjs/bitcoin/network.js +17 -0
- package/dist/cjs/bitcoin/network.js.map +1 -0
- package/dist/cjs/bitcoin/rest-client.js +289 -0
- package/dist/cjs/bitcoin/rest-client.js.map +1 -0
- package/dist/cjs/bitcoin/rpc-client.js +722 -0
- package/dist/cjs/bitcoin/rpc-client.js.map +1 -0
- package/dist/cjs/bitcoin/taproot.js +219 -0
- package/dist/cjs/bitcoin/taproot.js.map +1 -0
- package/dist/cjs/btcr2/beacon/aggregation/coordinator.js +120 -0
- package/dist/cjs/btcr2/beacon/aggregation/coordinator.js.map +1 -0
- package/dist/cjs/btcr2/beacon/aggregation/messages/advert.js +24 -0
- package/dist/cjs/btcr2/beacon/aggregation/messages/advert.js.map +1 -0
- package/dist/cjs/btcr2/beacon/aggregation/messages/base.js +37 -0
- package/dist/cjs/btcr2/beacon/aggregation/messages/base.js.map +1 -0
- package/dist/cjs/btcr2/beacon/aggregation/messages/cohort-set.js +25 -0
- package/dist/cjs/btcr2/beacon/aggregation/messages/cohort-set.js.map +1 -0
- package/dist/cjs/btcr2/beacon/aggregation/messages/keygen.js +8 -0
- package/dist/cjs/btcr2/beacon/aggregation/messages/keygen.js.map +1 -0
- package/dist/cjs/btcr2/beacon/aggregation/messages/opt-in.js +23 -0
- package/dist/cjs/btcr2/beacon/aggregation/messages/opt-in.js.map +1 -0
- package/dist/cjs/btcr2/beacon/aggregation/messages/sign.js +7 -0
- package/dist/cjs/btcr2/beacon/aggregation/messages/sign.js.map +1 -0
- package/dist/cjs/btcr2/beacon/aggregation/models/cohort/index.js +92 -0
- package/dist/cjs/btcr2/beacon/aggregation/models/cohort/index.js.map +1 -0
- package/dist/cjs/btcr2/beacon/aggregation/models/cohort/status.js +8 -0
- package/dist/cjs/btcr2/beacon/aggregation/models/cohort/status.js.map +1 -0
- package/dist/cjs/btcr2/beacon/aggregation/participant.js +2 -0
- package/dist/cjs/btcr2/beacon/aggregation/participant.js.map +1 -0
- package/dist/cjs/btcr2/beacon/aggregation/protocol/nostr.js +57 -0
- package/dist/cjs/btcr2/beacon/aggregation/protocol/nostr.js.map +1 -0
- package/dist/cjs/btcr2/beacon/aggregation/protocol/service.js +2 -0
- package/dist/cjs/btcr2/beacon/aggregation/protocol/service.js.map +1 -0
- package/dist/cjs/btcr2/beacon/cid-aggregate.js +116 -0
- package/dist/cjs/btcr2/beacon/cid-aggregate.js.map +1 -0
- package/dist/cjs/btcr2/beacon/factory.js +30 -0
- package/dist/cjs/btcr2/beacon/factory.js.map +1 -0
- package/dist/cjs/btcr2/beacon/singleton.js +220 -0
- package/dist/cjs/btcr2/beacon/singleton.js.map +1 -0
- package/dist/cjs/btcr2/beacon/smt-aggregate.js +126 -0
- package/dist/cjs/btcr2/beacon/smt-aggregate.js.map +1 -0
- package/dist/cjs/btcr2/crud/create.js +102 -0
- package/dist/cjs/btcr2/crud/create.js.map +1 -0
- package/dist/cjs/btcr2/crud/deactivate.js +14 -0
- package/dist/cjs/btcr2/crud/deactivate.js.map +1 -0
- package/dist/cjs/btcr2/crud/read.js +686 -0
- package/dist/cjs/btcr2/crud/read.js.map +1 -0
- package/dist/cjs/btcr2/crud/update.js +195 -0
- package/dist/cjs/btcr2/crud/update.js.map +1 -0
- package/dist/cjs/btcr2/key-manager/index.js +290 -0
- package/dist/cjs/btcr2/key-manager/index.js.map +1 -0
- package/dist/cjs/btcr2/key-manager/interface.js +2 -0
- package/dist/cjs/btcr2/key-manager/interface.js.map +1 -0
- package/dist/cjs/did-btcr2.js +222 -0
- package/dist/cjs/did-btcr2.js.map +1 -0
- package/dist/cjs/index.js +27 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/interfaces/beacon.js +41 -0
- package/dist/cjs/interfaces/beacon.js.map +1 -0
- package/dist/cjs/interfaces/crud.js +2 -0
- package/dist/cjs/interfaces/crud.js.map +1 -0
- package/dist/cjs/interfaces/ibeacon.js +2 -0
- package/dist/cjs/interfaces/ibeacon.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/types/bitcoin.js +62 -0
- package/dist/cjs/types/bitcoin.js.map +1 -0
- package/dist/cjs/types/crud.js +2 -0
- package/dist/cjs/types/crud.js.map +1 -0
- package/dist/cjs/utils/appendix.js +221 -0
- package/dist/cjs/utils/appendix.js.map +1 -0
- package/dist/cjs/utils/beacons.js +206 -0
- package/dist/cjs/utils/beacons.js.map +1 -0
- package/dist/cjs/utils/did-document-builder.js +61 -0
- package/dist/cjs/utils/did-document-builder.js.map +1 -0
- package/dist/cjs/utils/did-document.js +380 -0
- package/dist/cjs/utils/did-document.js.map +1 -0
- package/dist/cjs/utils/general.js +195 -0
- package/dist/cjs/utils/general.js.map +1 -0
- package/dist/cjs/utils/identifier.js +238 -0
- package/dist/cjs/utils/identifier.js.map +1 -0
- package/dist/esm/bitcoin/constants.js +20 -0
- package/dist/esm/bitcoin/constants.js.map +1 -0
- package/dist/esm/bitcoin/errors.js +11 -0
- package/dist/esm/bitcoin/errors.js.map +1 -0
- package/dist/esm/bitcoin/index.js +95 -0
- package/dist/esm/bitcoin/index.js.map +1 -0
- package/dist/esm/bitcoin/interface.js +2 -0
- package/dist/esm/bitcoin/interface.js.map +1 -0
- package/dist/esm/bitcoin/network.js +17 -0
- package/dist/esm/bitcoin/network.js.map +1 -0
- package/dist/esm/bitcoin/rest-client.js +289 -0
- package/dist/esm/bitcoin/rest-client.js.map +1 -0
- package/dist/esm/bitcoin/rpc-client.js +722 -0
- package/dist/esm/bitcoin/rpc-client.js.map +1 -0
- package/dist/esm/bitcoin/taproot.js +219 -0
- package/dist/esm/bitcoin/taproot.js.map +1 -0
- package/dist/esm/btcr2/beacon/aggregation/coordinator.js +120 -0
- package/dist/esm/btcr2/beacon/aggregation/coordinator.js.map +1 -0
- package/dist/esm/btcr2/beacon/aggregation/messages/advert.js +24 -0
- package/dist/esm/btcr2/beacon/aggregation/messages/advert.js.map +1 -0
- package/dist/esm/btcr2/beacon/aggregation/messages/base.js +37 -0
- package/dist/esm/btcr2/beacon/aggregation/messages/base.js.map +1 -0
- package/dist/esm/btcr2/beacon/aggregation/messages/cohort-set.js +25 -0
- package/dist/esm/btcr2/beacon/aggregation/messages/cohort-set.js.map +1 -0
- package/dist/esm/btcr2/beacon/aggregation/messages/keygen.js +8 -0
- package/dist/esm/btcr2/beacon/aggregation/messages/keygen.js.map +1 -0
- package/dist/esm/btcr2/beacon/aggregation/messages/opt-in.js +23 -0
- package/dist/esm/btcr2/beacon/aggregation/messages/opt-in.js.map +1 -0
- package/dist/esm/btcr2/beacon/aggregation/messages/sign.js +7 -0
- package/dist/esm/btcr2/beacon/aggregation/messages/sign.js.map +1 -0
- package/dist/esm/btcr2/beacon/aggregation/models/cohort/index.js +92 -0
- package/dist/esm/btcr2/beacon/aggregation/models/cohort/index.js.map +1 -0
- package/dist/esm/btcr2/beacon/aggregation/models/cohort/status.js +8 -0
- package/dist/esm/btcr2/beacon/aggregation/models/cohort/status.js.map +1 -0
- package/dist/esm/btcr2/beacon/aggregation/participant.js +2 -0
- package/dist/esm/btcr2/beacon/aggregation/participant.js.map +1 -0
- package/dist/esm/btcr2/beacon/aggregation/protocol/nostr.js +57 -0
- package/dist/esm/btcr2/beacon/aggregation/protocol/nostr.js.map +1 -0
- package/dist/esm/btcr2/beacon/aggregation/protocol/service.js +2 -0
- package/dist/esm/btcr2/beacon/aggregation/protocol/service.js.map +1 -0
- package/dist/esm/btcr2/beacon/cid-aggregate.js +116 -0
- package/dist/esm/btcr2/beacon/cid-aggregate.js.map +1 -0
- package/dist/esm/btcr2/beacon/factory.js +30 -0
- package/dist/esm/btcr2/beacon/factory.js.map +1 -0
- package/dist/esm/btcr2/beacon/singleton.js +220 -0
- package/dist/esm/btcr2/beacon/singleton.js.map +1 -0
- package/dist/esm/btcr2/beacon/smt-aggregate.js +126 -0
- package/dist/esm/btcr2/beacon/smt-aggregate.js.map +1 -0
- package/dist/esm/btcr2/crud/create.js +102 -0
- package/dist/esm/btcr2/crud/create.js.map +1 -0
- package/dist/esm/btcr2/crud/deactivate.js +14 -0
- package/dist/esm/btcr2/crud/deactivate.js.map +1 -0
- package/dist/esm/btcr2/crud/read.js +686 -0
- package/dist/esm/btcr2/crud/read.js.map +1 -0
- package/dist/esm/btcr2/crud/update.js +195 -0
- package/dist/esm/btcr2/crud/update.js.map +1 -0
- package/dist/esm/btcr2/key-manager/index.js +290 -0
- package/dist/esm/btcr2/key-manager/index.js.map +1 -0
- package/dist/esm/btcr2/key-manager/interface.js +2 -0
- package/dist/esm/btcr2/key-manager/interface.js.map +1 -0
- package/dist/esm/did-btcr2.js +222 -0
- package/dist/esm/did-btcr2.js.map +1 -0
- package/dist/esm/index.js +27 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/interfaces/beacon.js +41 -0
- package/dist/esm/interfaces/beacon.js.map +1 -0
- package/dist/esm/interfaces/crud.js +2 -0
- package/dist/esm/interfaces/crud.js.map +1 -0
- package/dist/esm/interfaces/ibeacon.js +2 -0
- package/dist/esm/interfaces/ibeacon.js.map +1 -0
- package/dist/esm/types/bitcoin.js +62 -0
- package/dist/esm/types/bitcoin.js.map +1 -0
- package/dist/esm/types/crud.js +2 -0
- package/dist/esm/types/crud.js.map +1 -0
- package/dist/esm/utils/appendix.js +221 -0
- package/dist/esm/utils/appendix.js.map +1 -0
- package/dist/esm/utils/beacons.js +206 -0
- package/dist/esm/utils/beacons.js.map +1 -0
- package/dist/esm/utils/did-document-builder.js +61 -0
- package/dist/esm/utils/did-document-builder.js.map +1 -0
- package/dist/esm/utils/did-document.js +380 -0
- package/dist/esm/utils/did-document.js.map +1 -0
- package/dist/esm/utils/general.js +195 -0
- package/dist/esm/utils/general.js.map +1 -0
- package/dist/esm/utils/identifier.js +238 -0
- package/dist/esm/utils/identifier.js.map +1 -0
- package/dist/types/bitcoin/constants.d.ts +19 -0
- package/dist/types/bitcoin/constants.d.ts.map +1 -0
- package/dist/types/bitcoin/errors.d.ts +5 -0
- package/dist/types/bitcoin/errors.d.ts.map +1 -0
- package/dist/types/bitcoin/index.d.ts +75 -0
- package/dist/types/bitcoin/index.d.ts.map +1 -0
- package/dist/types/bitcoin/interface.d.ts +86 -0
- package/dist/types/bitcoin/interface.d.ts.map +1 -0
- package/dist/types/bitcoin/network.d.ts +2 -0
- package/dist/types/bitcoin/network.d.ts.map +1 -0
- package/dist/types/bitcoin/rest-client.d.ts +268 -0
- package/dist/types/bitcoin/rest-client.d.ts.map +1 -0
- package/dist/types/bitcoin/rpc-client.d.ts +506 -0
- package/dist/types/bitcoin/rpc-client.d.ts.map +1 -0
- package/dist/types/bitcoin/taproot.d.ts +34 -0
- package/dist/types/bitcoin/taproot.d.ts.map +1 -0
- package/dist/types/btcr2/beacon/aggregation/coordinator.d.ts +74 -0
- package/dist/types/btcr2/beacon/aggregation/coordinator.d.ts.map +1 -0
- package/dist/types/btcr2/beacon/aggregation/messages/advert.d.ts +22 -0
- package/dist/types/btcr2/beacon/aggregation/messages/advert.d.ts.map +1 -0
- package/dist/types/btcr2/beacon/aggregation/messages/base.d.ts +36 -0
- package/dist/types/btcr2/beacon/aggregation/messages/base.d.ts.map +1 -0
- package/dist/types/btcr2/beacon/aggregation/messages/cohort-set.d.ts +23 -0
- package/dist/types/btcr2/beacon/aggregation/messages/cohort-set.d.ts.map +1 -0
- package/dist/types/btcr2/beacon/aggregation/messages/keygen.d.ts +6 -0
- package/dist/types/btcr2/beacon/aggregation/messages/keygen.d.ts.map +1 -0
- package/dist/types/btcr2/beacon/aggregation/messages/opt-in.d.ts +22 -0
- package/dist/types/btcr2/beacon/aggregation/messages/opt-in.d.ts.map +1 -0
- package/dist/types/btcr2/beacon/aggregation/messages/sign.d.ts +5 -0
- package/dist/types/btcr2/beacon/aggregation/messages/sign.d.ts.map +1 -0
- package/dist/types/btcr2/beacon/aggregation/models/cohort/index.d.ts +77 -0
- package/dist/types/btcr2/beacon/aggregation/models/cohort/index.d.ts.map +1 -0
- package/dist/types/btcr2/beacon/aggregation/models/cohort/status.d.ts +7 -0
- package/dist/types/btcr2/beacon/aggregation/models/cohort/status.d.ts.map +1 -0
- package/dist/types/btcr2/beacon/aggregation/participant.d.ts +1 -0
- package/dist/types/btcr2/beacon/aggregation/participant.d.ts.map +1 -0
- package/dist/types/btcr2/beacon/aggregation/protocol/nostr.d.ts +36 -0
- package/dist/types/btcr2/beacon/aggregation/protocol/nostr.d.ts.map +1 -0
- package/dist/types/btcr2/beacon/aggregation/protocol/service.d.ts +6 -0
- package/dist/types/btcr2/beacon/aggregation/protocol/service.d.ts.map +1 -0
- package/dist/types/btcr2/beacon/cid-aggregate.d.ts +103 -0
- package/dist/types/btcr2/beacon/cid-aggregate.d.ts.map +1 -0
- package/dist/types/btcr2/beacon/factory.d.ts +17 -0
- package/dist/types/btcr2/beacon/factory.d.ts.map +1 -0
- package/dist/types/btcr2/beacon/singleton.d.ts +93 -0
- package/dist/types/btcr2/beacon/singleton.d.ts.map +1 -0
- package/dist/types/btcr2/beacon/smt-aggregate.d.ts +112 -0
- package/dist/types/btcr2/beacon/smt-aggregate.d.ts.map +1 -0
- package/dist/types/btcr2/crud/create.d.ts +92 -0
- package/dist/types/btcr2/crud/create.d.ts.map +1 -0
- package/dist/types/btcr2/crud/deactivate.d.ts +13 -0
- package/dist/types/btcr2/crud/deactivate.d.ts.map +1 -0
- package/dist/types/btcr2/crud/read.d.ts +341 -0
- package/dist/types/btcr2/crud/read.d.ts.map +1 -0
- package/dist/types/btcr2/crud/update.d.ts +83 -0
- package/dist/types/btcr2/crud/update.d.ts.map +1 -0
- package/dist/types/btcr2/key-manager/index.d.ts +145 -0
- package/dist/types/btcr2/key-manager/index.d.ts.map +1 -0
- package/dist/types/btcr2/key-manager/interface.d.ts +113 -0
- package/dist/types/btcr2/key-manager/interface.d.ts.map +1 -0
- package/dist/types/did-btcr2.d.ts +117 -0
- package/dist/types/did-btcr2.d.ts.map +1 -0
- package/dist/types/index.d.ts +26 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/interfaces/beacon.d.ts +57 -0
- package/dist/types/interfaces/beacon.d.ts.map +1 -0
- package/dist/types/interfaces/crud.d.ts +35 -0
- package/dist/types/interfaces/crud.d.ts.map +1 -0
- package/dist/types/interfaces/ibeacon.d.ts +66 -0
- package/dist/types/interfaces/ibeacon.d.ts.map +1 -0
- package/dist/types/types/bitcoin.d.ts +827 -0
- package/dist/types/types/bitcoin.d.ts.map +1 -0
- package/dist/types/types/crud.d.ts +38 -0
- package/dist/types/types/crud.d.ts.map +1 -0
- package/dist/types/utils/appendix.d.ts +118 -0
- package/dist/types/utils/appendix.d.ts.map +1 -0
- package/dist/types/utils/beacons.d.ts +156 -0
- package/dist/types/utils/beacons.d.ts.map +1 -0
- package/dist/types/utils/did-document-builder.d.ts +13 -0
- package/dist/types/utils/did-document-builder.d.ts.map +1 -0
- package/dist/types/utils/did-document.d.ts +211 -0
- package/dist/types/utils/did-document.d.ts.map +1 -0
- package/dist/types/utils/general.d.ts +85 -0
- package/dist/types/utils/general.d.ts.map +1 -0
- package/dist/types/utils/identifier.d.ts +59 -0
- package/dist/types/utils/identifier.d.ts.map +1 -0
- package/package.json +137 -0
- package/src/bitcoin/constants.ts +19 -0
- package/src/bitcoin/errors.ts +10 -0
- package/src/bitcoin/index.ts +154 -0
- package/src/bitcoin/interface.ts +160 -0
- package/src/bitcoin/network.ts +17 -0
- package/src/bitcoin/rest-client.ts +415 -0
- package/src/bitcoin/rpc-client.ts +888 -0
- package/src/bitcoin/taproot.ts +237 -0
- package/src/btcr2/beacon/aggregation/coordinator.ts +135 -0
- package/src/btcr2/beacon/aggregation/messages/advert.ts +36 -0
- package/src/btcr2/beacon/aggregation/messages/base.ts +59 -0
- package/src/btcr2/beacon/aggregation/messages/cohort-set.ts +37 -0
- package/src/btcr2/beacon/aggregation/messages/keygen.ts +8 -0
- package/src/btcr2/beacon/aggregation/messages/opt-in.ts +35 -0
- package/src/btcr2/beacon/aggregation/messages/sign.ts +7 -0
- package/src/btcr2/beacon/aggregation/models/cohort/index.ts +112 -0
- package/src/btcr2/beacon/aggregation/models/cohort/status.ts +7 -0
- package/src/btcr2/beacon/aggregation/participant.ts +0 -0
- package/src/btcr2/beacon/aggregation/protocol/nostr.ts +81 -0
- package/src/btcr2/beacon/aggregation/protocol/service.ts +6 -0
- package/src/btcr2/beacon/cid-aggregate.ts +154 -0
- package/src/btcr2/beacon/factory.ts +36 -0
- package/src/btcr2/beacon/singleton.ts +257 -0
- package/src/btcr2/beacon/smt-aggregate.ts +136 -0
- package/src/btcr2/crud/create.ts +160 -0
- package/src/btcr2/crud/deactivate.ts +13 -0
- package/src/btcr2/crud/read.ts +946 -0
- package/src/btcr2/crud/update.ts +277 -0
- package/src/btcr2/key-manager/index.ts +364 -0
- package/src/btcr2/key-manager/interface.ts +129 -0
- package/src/canonicalize.d.ts +6 -0
- package/src/did-btcr2.ts +288 -0
- package/src/index.ts +34 -0
- package/src/interfaces/beacon.ts +68 -0
- package/src/interfaces/crud.ts +36 -0
- package/src/interfaces/ibeacon.ts +76 -0
- package/src/types/bitcoin.ts +1028 -0
- package/src/types/crud.ts +41 -0
- package/src/utils/appendix.ts +257 -0
- package/src/utils/beacons.ts +276 -0
- package/src/utils/did-document-builder.ts +73 -0
- package/src/utils/did-document.ts +474 -0
- package/src/utils/general.ts +204 -0
- package/src/utils/identifier.ts +276 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"did-document.js","sourceRoot":"","sources":["../../../src/utils/did-document.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { BIP340_PUBLIC_KEY_MULTIBASE_PREFIX } from '@did-btcr2/common';
|
|
2
|
+
import { sha256 } from '@noble/hashes/sha2';
|
|
3
|
+
import { CURVE, getPublicKey, utils } from '@noble/secp256k1';
|
|
4
|
+
import { HDKey } from '@scure/bip32';
|
|
5
|
+
import { generateMnemonic, mnemonicToSeed } from '@scure/bip39';
|
|
6
|
+
import { wordlist } from '@scure/bip39/wordlists/english';
|
|
7
|
+
import { base58btc } from 'multiformats/bases/base58';
|
|
8
|
+
/**
|
|
9
|
+
* Static class of general utility functions for the did-btcr2 spec implementation
|
|
10
|
+
* @class GeneralUtils
|
|
11
|
+
* @type {GeneralUtils}
|
|
12
|
+
*/
|
|
13
|
+
export class GeneralUtils {
|
|
14
|
+
/**
|
|
15
|
+
* Helper function to encode a secp256k1 key in SchnorrSecp256k1 Multikey Format
|
|
16
|
+
* @param {KeyBytes} xOnlyKeyBytes
|
|
17
|
+
* @returns {PublicKeyMultibase}
|
|
18
|
+
*/
|
|
19
|
+
static encode(xOnlyKeyBytes) {
|
|
20
|
+
if (xOnlyKeyBytes.length !== 32) {
|
|
21
|
+
throw new Error('x-only public key must be 32 bytes');
|
|
22
|
+
}
|
|
23
|
+
const prefix = Array.from(BIP340_PUBLIC_KEY_MULTIBASE_PREFIX);
|
|
24
|
+
const x = Array.from(xOnlyKeyBytes);
|
|
25
|
+
// Set the prefix and the public key bytes
|
|
26
|
+
const multikeyBytes = new Uint8Array([...prefix, ...x]);
|
|
27
|
+
// Encode the public key as a multibase base58btc string
|
|
28
|
+
return base58btc.encode(multikeyBytes);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Converts a bigint to a buffer
|
|
32
|
+
* @param {bigint} value The bigint to convert
|
|
33
|
+
* @returns {Buffer} The buffer representation of the bigint
|
|
34
|
+
*/
|
|
35
|
+
static bigintToBuffer(value) {
|
|
36
|
+
const hex = value.toString(16).padStart(64, '0');
|
|
37
|
+
return Buffer.fromHex(hex);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Generates a new mnemonic phrase and HD wallet
|
|
41
|
+
* @returns {HdWallet} Promise resolving to a new hdwallet object w/ mnemonic and hdkey
|
|
42
|
+
* @throws {Error} if the public key bytes cannot be derived
|
|
43
|
+
*/
|
|
44
|
+
static async generateHdWallet() {
|
|
45
|
+
// Generate random mnemonic phrase.
|
|
46
|
+
const mnemonic = generateMnemonic(wordlist, 128);
|
|
47
|
+
// Generate seed from random mnemonic phrase.
|
|
48
|
+
const seed = await mnemonicToSeed(mnemonic);
|
|
49
|
+
// Generate HDKey from seed.
|
|
50
|
+
const hdkey = HDKey.fromMasterSeed(seed);
|
|
51
|
+
// Ensure HDKey returns valid
|
|
52
|
+
if (!hdkey) {
|
|
53
|
+
throw new Error('Failed to derive hd wallet');
|
|
54
|
+
}
|
|
55
|
+
return { mnemonic, hdkey };
|
|
56
|
+
}
|
|
57
|
+
static generateCompressedSecp256k1KeyPair() {
|
|
58
|
+
const privateKey = utils.randomPrivateKey();
|
|
59
|
+
if (!utils.isValidPrivateKey(privateKey)) {
|
|
60
|
+
throw new Error('Invalid private key');
|
|
61
|
+
}
|
|
62
|
+
return { privateKey, publicKey: getPublicKey(privateKey, true) };
|
|
63
|
+
}
|
|
64
|
+
;
|
|
65
|
+
/**
|
|
66
|
+
* Recovers an HDKey from a mnemonic phrase
|
|
67
|
+
* @param {string} mnemonic The mnemonic phrase to recover the HDKey from
|
|
68
|
+
* @param {Uint8Array} seed Optional seed to recover the HDKey from
|
|
69
|
+
* @returns {HDKey} Promise resolving to the recovered HDKey
|
|
70
|
+
* @throws Error if the HDKey cannot be recovered
|
|
71
|
+
*/
|
|
72
|
+
static async recoverHdWallet(mnemonic, seed) {
|
|
73
|
+
seed ??= await mnemonicToSeed(mnemonic);
|
|
74
|
+
// Generate HDKey from seed.
|
|
75
|
+
const hdkey = HDKey.fromMasterSeed(seed);
|
|
76
|
+
// Ensure HDKey returns valid
|
|
77
|
+
if (!hdkey) {
|
|
78
|
+
throw new Error('Failed to recover hdkey');
|
|
79
|
+
}
|
|
80
|
+
// Return the HDKey
|
|
81
|
+
return hdkey;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Recovers a secp256k1 privateKey from its original entropy
|
|
85
|
+
* @param {Uint8Array} xorEntropy The original entropy to recover the privateKey from
|
|
86
|
+
* @param {Uint8Array} salt The salt used to tweak the privateKey
|
|
87
|
+
* @returns {Uint8Array} The recovered privateKey
|
|
88
|
+
* @throws {Error} if the privateKey cannot be recovered
|
|
89
|
+
*/
|
|
90
|
+
static recoverTweakedRawPrivateKey(xorEntropy, salt) {
|
|
91
|
+
// If entropy is not 32 bytes, hash it to get a deterministic 32-byte private key
|
|
92
|
+
if (xorEntropy.length !== 32) {
|
|
93
|
+
xorEntropy = sha256(xorEntropy);
|
|
94
|
+
}
|
|
95
|
+
const entropy = this.XNOR(xorEntropy, salt);
|
|
96
|
+
// Convert entropy to hex
|
|
97
|
+
const hexEntropy = Buffer.from(entropy).toString('hex');
|
|
98
|
+
// Convert hexEntropy to BigInt
|
|
99
|
+
const privateKey = BigInt(`0x${hexEntropy}`);
|
|
100
|
+
// Ensure private key is in valid secp256k1 range1
|
|
101
|
+
if (privateKey < BigInt(1) || privateKey >= CURVE.n) {
|
|
102
|
+
throw new Error('Invalid private key derived from entropy');
|
|
103
|
+
}
|
|
104
|
+
// The valid 32-byte private key
|
|
105
|
+
return entropy;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Recovers a secp256k1 privateKey from its original entropy
|
|
109
|
+
* @param {Uint8Array} entropy The entropy to recover the privateKey from
|
|
110
|
+
* @returns {Uint8Array} The recovered privateKey
|
|
111
|
+
* @throws {Error} if the privateKey cannot be recovered
|
|
112
|
+
*/
|
|
113
|
+
static recoverRawPrivateKey(entropy) {
|
|
114
|
+
// If entropy is not 32 bytes, hash it to get a deterministic 32-byte private key
|
|
115
|
+
if (entropy.length !== 32) {
|
|
116
|
+
entropy = sha256(entropy);
|
|
117
|
+
}
|
|
118
|
+
// Convert entropy to hex
|
|
119
|
+
const hexEntropy = Buffer.from(entropy).toString('hex');
|
|
120
|
+
// Convert hexEntropy to BigInt
|
|
121
|
+
const privateKey = BigInt(`0x${hexEntropy}`);
|
|
122
|
+
// Ensure private key is in valid secp256k1 range1
|
|
123
|
+
if (privateKey < BigInt(1) || privateKey >= CURVE.n) {
|
|
124
|
+
throw new Error('Invalid private key derived from entropy');
|
|
125
|
+
}
|
|
126
|
+
// The valid 32-byte private key
|
|
127
|
+
return entropy;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Tweak the entropy with a salt using XOR
|
|
131
|
+
* @param {Uint8Array} entropy The entropy to tweak
|
|
132
|
+
* @param {Uint8Array} salt The salt to tweak the entropy with
|
|
133
|
+
* @returns {Uint8Array} The tweaked entropy
|
|
134
|
+
*/
|
|
135
|
+
static XOR(entropy, salt) {
|
|
136
|
+
const tweaked = new Uint8Array(entropy.length);
|
|
137
|
+
for (let i = 0; i < entropy.length; i++) {
|
|
138
|
+
tweaked[i] = entropy[i] ^ salt[i % salt.length]; // XOR with repeating salt
|
|
139
|
+
}
|
|
140
|
+
return tweaked;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Untweak the entropy with a salt using XNOR
|
|
144
|
+
*
|
|
145
|
+
* @param {Uint8Array} tweakedEntropy The tweaked entropy to untweak
|
|
146
|
+
* @param {Uint8Array} salt The salt to untweak the entropy with
|
|
147
|
+
* @returns {Uint8Array} The original entropy
|
|
148
|
+
*/
|
|
149
|
+
static XNOR(tweakedEntropy, salt) {
|
|
150
|
+
const originalEntropy = new Uint8Array(tweakedEntropy.length);
|
|
151
|
+
for (let i = 0; i < tweakedEntropy.length; i++) {
|
|
152
|
+
originalEntropy[i] = tweakedEntropy[i] ^ salt[i % salt.length]; // XOR with salt again
|
|
153
|
+
}
|
|
154
|
+
return originalEntropy;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Recovers an HDKey from a mnemonic phrase
|
|
158
|
+
* @param {string} mnemonic The mnemonic phrase to recover the HDKey from
|
|
159
|
+
* @param {string} path The path to derive the child key from
|
|
160
|
+
* @returns {Uint8Array} Promise resolving to the recovered private key bytes
|
|
161
|
+
* @throws {Error} if the HDKey cannot be recovered
|
|
162
|
+
*/
|
|
163
|
+
static async recoverHdChildFromMnemonic(mnemonic, path) {
|
|
164
|
+
// Generate HDKey from seed.
|
|
165
|
+
const hdkey = await this.recoverHdWallet(mnemonic);
|
|
166
|
+
// Ensure HDKey returns valid
|
|
167
|
+
if (!hdkey) {
|
|
168
|
+
throw new Error('Failed to recover hdkey');
|
|
169
|
+
}
|
|
170
|
+
// Return the privateKey of the derived childKey
|
|
171
|
+
const childPrivKeyBytes = hdkey.derive(path).privateKey;
|
|
172
|
+
if (!childPrivKeyBytes) {
|
|
173
|
+
throw new Error('Failed to recover child private key');
|
|
174
|
+
}
|
|
175
|
+
return childPrivKeyBytes;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Derives a child key from an HDKey
|
|
179
|
+
* @param {HDKey} hdkey The HDKey to derive the child key from
|
|
180
|
+
* @param {string} path The path to derive the child key from
|
|
181
|
+
* @returns {HDKey} A Promise resolving to the child key
|
|
182
|
+
* @throws {Error} Error if the child key cannot be derived
|
|
183
|
+
*/
|
|
184
|
+
static deriveChildKey(hdkey, path) {
|
|
185
|
+
// Derive child key from HDKey.
|
|
186
|
+
const childKey = hdkey.derive(path);
|
|
187
|
+
// Ensure child key returns valid
|
|
188
|
+
if (!childKey) {
|
|
189
|
+
throw new Error(`Failed to derive child key`);
|
|
190
|
+
}
|
|
191
|
+
// Return the child key
|
|
192
|
+
return childKey;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=general.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"general.js","sourceRoot":"","sources":["../../../src/utils/general.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import { BitcoinNetworkNames, Btcr2Error, Btcr2IdentifierTypes, INVALID_DID, METHOD_NOT_SUPPORTED } from '@did-btcr2/common';
|
|
2
|
+
import { PublicKey, SchnorrKeyPair } from '@did-btcr2/keypair';
|
|
3
|
+
import { bech32m } from '@scure/base';
|
|
4
|
+
/**
|
|
5
|
+
* Implements {@link https://dcdpr.github.io/did-btcr2/#syntax | 3 Syntax}.
|
|
6
|
+
* A did:btcr2 DID consists of a did:btcr2 prefix, followed by an id-bech32 value, which is a Bech32m encoding of:
|
|
7
|
+
* - the specification version;
|
|
8
|
+
* - the Bitcoin network identifier; and
|
|
9
|
+
* - either:
|
|
10
|
+
* - a key-value representing a secp256k1 public key; or
|
|
11
|
+
* - a hash-value representing the hash of an initiating external DID document.
|
|
12
|
+
* @class Btc1Identifier
|
|
13
|
+
* @type {Btc1Identifier}
|
|
14
|
+
*/
|
|
15
|
+
export class Btc1Identifier {
|
|
16
|
+
/**
|
|
17
|
+
* Implements {@link https://dcdpr.github.io/did-btcr2/#didbtc1-identifier-encoding | 3.2 did:btcr2 Identifier Encoding}.
|
|
18
|
+
*
|
|
19
|
+
* A did:btcr2 DID consists of a did:btcr2 prefix, followed by an id-bech32 value, which is a Bech32m encoding of:
|
|
20
|
+
* - the specification version;
|
|
21
|
+
* - the Bitcoin network identifier; and
|
|
22
|
+
* - either:
|
|
23
|
+
* - a key-value representing a secp256k1 public key; or
|
|
24
|
+
* - a hash-value representing the hash of an initiating external DID document.
|
|
25
|
+
*
|
|
26
|
+
* @param {CreateIdentifierParams} params See {@link CreateIdentifierParams} for details.
|
|
27
|
+
* @param {Btcr2IdentifierTypes} params.idType Identifier type (key or external).
|
|
28
|
+
* @param {string} params.network Bitcoin network name.
|
|
29
|
+
* @param {number} params.version Identifier version.
|
|
30
|
+
* @param {KeyBytes | DocumentBytes} params.genesisBytes Public key or an intermediate document bytes.
|
|
31
|
+
* @returns {string} The new did:btcr2 identifier.
|
|
32
|
+
*/
|
|
33
|
+
static encode({ idType, version, network, genesisBytes }) {
|
|
34
|
+
// 1. If idType is not a valid value per above, raise invalidDid error.
|
|
35
|
+
if (!(idType in Btcr2IdentifierTypes)) {
|
|
36
|
+
throw new Btcr2Error('Expected "idType" to be "KEY" or "EXTERNAL"', INVALID_DID, { idType });
|
|
37
|
+
}
|
|
38
|
+
// 2. If version is greater than 1, raise invalidDid error.
|
|
39
|
+
if (isNaN(version) || version > 1) {
|
|
40
|
+
throw new Btcr2Error('Expected "version" to be 1', INVALID_DID, { version });
|
|
41
|
+
}
|
|
42
|
+
// 3. If network is not a valid value (bitcoin|signet|regtest|testnet3|testnet4|number), raise invalidDid error.
|
|
43
|
+
if (typeof network === 'string' && !(network in BitcoinNetworkNames)) {
|
|
44
|
+
throw new Btcr2Error('Invalid "network" name', INVALID_DID, { network });
|
|
45
|
+
}
|
|
46
|
+
// 4. If network is a number and is outside the range of 1-8, raise invalidDid error.
|
|
47
|
+
if (typeof network === 'number' && (network < 0 || network > 8)) {
|
|
48
|
+
throw new Btcr2Error('Invalid "network" number', INVALID_DID, { network });
|
|
49
|
+
}
|
|
50
|
+
// 5. If idType is “key” and genesisBytes is not a valid compressed secp256k1 public key, raise invalidDid error.
|
|
51
|
+
if (idType === 'KEY') {
|
|
52
|
+
try {
|
|
53
|
+
new PublicKey(genesisBytes);
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
throw new Btcr2Error('Expected "genesisBytes" to be a valid compressed secp256k1 public key', INVALID_DID, { genesisBytes });
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// 6. Map idType to hrp from the following:
|
|
60
|
+
// 6.1 “key” - “k”
|
|
61
|
+
// 6.2 “external” - “x”
|
|
62
|
+
const hrp = idType === 'KEY' ? 'k' : 'x';
|
|
63
|
+
// 7. Create an empty nibbles numeric array.
|
|
64
|
+
const nibbles = [];
|
|
65
|
+
// 8. Set fCount equal to (version - 1) / 15, rounded down.
|
|
66
|
+
const fCount = Math.floor((version - 1) / 15);
|
|
67
|
+
// 9. Append hexadecimal F (decimal 15) to nibbles fCount times.
|
|
68
|
+
for (let i = 0; i < fCount; i++) {
|
|
69
|
+
nibbles.push(15);
|
|
70
|
+
}
|
|
71
|
+
// 10. Append (version - 1) mod 15 to nibbles.
|
|
72
|
+
nibbles.push((version - 1) % 15);
|
|
73
|
+
// 11. If network is a string, append the numeric value from the following map to nibbles:
|
|
74
|
+
// "bitcoin" - 0
|
|
75
|
+
// "signet" - 1
|
|
76
|
+
// "regtest" - 2
|
|
77
|
+
// "testnet3" - 3
|
|
78
|
+
// "testnet4" - 4
|
|
79
|
+
// "mutinynet" - 5
|
|
80
|
+
if (typeof network === 'string') {
|
|
81
|
+
nibbles.push(BitcoinNetworkNames[network]);
|
|
82
|
+
}
|
|
83
|
+
else if (typeof network === 'number') {
|
|
84
|
+
// 12. If network is a number, append network + 11 to nibbles.
|
|
85
|
+
nibbles.push(network + 11);
|
|
86
|
+
}
|
|
87
|
+
// 13. If the number of entries in nibbles is odd, append 0.
|
|
88
|
+
if (nibbles.length % 2 !== 0) {
|
|
89
|
+
nibbles.push(0);
|
|
90
|
+
}
|
|
91
|
+
// 14. Create a dataBytes byte array from nibbles, where index is from 0 to nibbles.length / 2 - 1 and
|
|
92
|
+
// encodingBytes[index] = (nibbles[2 * index] << 4) | nibbles[2 * index + 1].
|
|
93
|
+
if (fCount !== 0) {
|
|
94
|
+
for (let index in Array.from({ length: (nibbles.length / 2) - 1 })) {
|
|
95
|
+
throw new Btcr2Error('Not implemented', 'NOT_IMPLEMENTED', { index });
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
const dataBytes = new Uint8Array([(nibbles[2 * 0] << 4) | nibbles[2 * 0 + 1], ...genesisBytes]);
|
|
99
|
+
// 15. Set identifier to “did:btcr2:”.
|
|
100
|
+
// 16. Pass hrp and dataBytes to the Bech32m Encoding algorithm, retrieving encodedString.
|
|
101
|
+
// 17. Append encodedString to identifier.
|
|
102
|
+
// 18. Return identifier.
|
|
103
|
+
return `did:btcr2:${bech32m.encodeFromBytes(hrp, dataBytes)}`;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Implements {@link https://dcdpr.github.io/did-btcr2/#didbtc1-identifier-decoding | 3.3 did:btcr2 Identifier Decoding}.
|
|
107
|
+
* @param {string} identifier The BTCR2 DID to be parsed
|
|
108
|
+
* @returns {DidComponents} The parsed identifier components. See {@link DidComponents} for details.
|
|
109
|
+
* @throws {DidError} if an error occurs while parsing the identifier
|
|
110
|
+
* @throws {DidErrorCode.InvalidDid} if identifier is invalid
|
|
111
|
+
* @throws {DidErrorCode.MethodNotSupported} if the method is not supported
|
|
112
|
+
*/
|
|
113
|
+
static decode(identifier) {
|
|
114
|
+
// 1. Split identifier into an array of components at the colon : character.
|
|
115
|
+
const components = identifier.split(':');
|
|
116
|
+
// 2. If the length of the components array is not 3, raise invalidDid error.
|
|
117
|
+
if (components.length !== 3) {
|
|
118
|
+
throw new Btcr2Error(`Invalid did: ${identifier}`, INVALID_DID, { identifier });
|
|
119
|
+
}
|
|
120
|
+
// Deconstruct the components of the identifier: scheme, method, encoded
|
|
121
|
+
const [scheme, method, encoded] = components;
|
|
122
|
+
// 3. If components[0] is not “did”, raise invalidDid error.
|
|
123
|
+
if (scheme !== 'did') {
|
|
124
|
+
throw new Btcr2Error(`Invalid did: ${identifier}`, INVALID_DID, { identifier });
|
|
125
|
+
}
|
|
126
|
+
// 4. If components[1] is not “btcr2”, raise methodNotSupported error.
|
|
127
|
+
if (method !== 'btcr2') {
|
|
128
|
+
throw new Btcr2Error(`Invalid did method: ${method}`, METHOD_NOT_SUPPORTED, { identifier });
|
|
129
|
+
}
|
|
130
|
+
// 5. Set encodedString to components[2].
|
|
131
|
+
if (!encoded) {
|
|
132
|
+
throw new Btcr2Error(`Invalid method-specific id: ${identifier}`, INVALID_DID, { identifier });
|
|
133
|
+
}
|
|
134
|
+
// 6. Pass encodedString to the Bech32m Decoding algorithm, retrieving hrp and dataBytes.
|
|
135
|
+
const { prefix: hrp, bytes: dataBytes } = bech32m.decodeToBytes(encoded);
|
|
136
|
+
// 7. If the Bech32m decoding algorithm fails, raise invalidDid error.
|
|
137
|
+
if (!['x', 'k'].includes(hrp)) {
|
|
138
|
+
throw new Btcr2Error(`Invalid hrp: ${hrp}`, INVALID_DID, { identifier });
|
|
139
|
+
}
|
|
140
|
+
if (!dataBytes) {
|
|
141
|
+
throw new Btcr2Error(`Failed to decode id: ${encoded}`, INVALID_DID, { identifier });
|
|
142
|
+
}
|
|
143
|
+
// 8. Map hrp to idType from the following:
|
|
144
|
+
// “k” - “key”
|
|
145
|
+
// “x” - “external”
|
|
146
|
+
// other - raise invalidDid error
|
|
147
|
+
const idType = hrp === 'k' ? 'KEY' : 'EXTERNAL';
|
|
148
|
+
// 9. Set version to 1.
|
|
149
|
+
let version = 1;
|
|
150
|
+
let byteIndex = 0;
|
|
151
|
+
// 10. If at any point in the remaining steps there are not enough nibbles to complete the process,
|
|
152
|
+
// raise invalidDid error.
|
|
153
|
+
let nibblesConsumed = 0;
|
|
154
|
+
// 11. Start with the first nibble (the higher nibble of the first byte) of dataBytes.
|
|
155
|
+
let currentByte = dataBytes[byteIndex];
|
|
156
|
+
let versionNibble = currentByte >>> 4;
|
|
157
|
+
// 12. Add the value of the current nibble to version.
|
|
158
|
+
while (versionNibble === 0xF) {
|
|
159
|
+
// 13. If the value of the nibble is hexadecimal F (decimal 15), advance to the next nibble (the lower nibble of
|
|
160
|
+
// the current byte or the higher nibble of the next byte) and return to the previous step.
|
|
161
|
+
version += 15;
|
|
162
|
+
if (nibblesConsumed % 2 === 0) {
|
|
163
|
+
versionNibble = currentByte & 0x0F;
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
currentByte = dataBytes[++byteIndex];
|
|
167
|
+
versionNibble = currentByte >>> 4;
|
|
168
|
+
}
|
|
169
|
+
nibblesConsumed += 1;
|
|
170
|
+
// 14. If version is greater than 1, raise invalidDid error.
|
|
171
|
+
if (version > 1) {
|
|
172
|
+
throw new Btcr2Error(`Invalid version: ${version}`, INVALID_DID, { identifier });
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
version += versionNibble;
|
|
176
|
+
nibblesConsumed += 1;
|
|
177
|
+
// 15. Advance to the next nibble and set networkValue to its value.
|
|
178
|
+
let networkValue = nibblesConsumed % 2 === 0
|
|
179
|
+
? dataBytes[++byteIndex] >>> 4
|
|
180
|
+
: currentByte & 0x0F;
|
|
181
|
+
nibblesConsumed += 1;
|
|
182
|
+
// 16. Map networkValue to network from the following:
|
|
183
|
+
// 0 - "bitcoin"
|
|
184
|
+
// 1 - "signet"
|
|
185
|
+
// 2 - "regtest"
|
|
186
|
+
// 3 - "testnet3"
|
|
187
|
+
// 4 - "testnet4"
|
|
188
|
+
// 5 - "mutinynet"
|
|
189
|
+
// 6-7 - raise invalidDid error
|
|
190
|
+
// 8-F - networkValue - 11
|
|
191
|
+
let network = BitcoinNetworkNames[networkValue];
|
|
192
|
+
if (!network) {
|
|
193
|
+
if (networkValue >= 0x8 && networkValue <= 0xF) {
|
|
194
|
+
network = networkValue - 11;
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
throw new Btcr2Error(`Invalid did: ${identifier}`, INVALID_DID, { identifier });
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
// 17. If the number of nibbles consumed is odd:
|
|
201
|
+
if (nibblesConsumed % 2 === 1) {
|
|
202
|
+
// 17.1 Advance to the next nibble and set fillerNibble to its value.
|
|
203
|
+
const fillerNibble = currentByte & 0x0F;
|
|
204
|
+
// 17.2 If fillerNibble is not 0, raise invalidDid error.
|
|
205
|
+
if (fillerNibble !== 0) {
|
|
206
|
+
throw new Btcr2Error(`Invalid did: ${identifier}`, INVALID_DID, { identifier });
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
// 18. Set genesisBytes to the remaining dataBytes.
|
|
210
|
+
const genesisBytes = dataBytes.slice(byteIndex + 1);
|
|
211
|
+
// 19. If idType is “key” and genesisBytes is not a valid compressed secp256k1 public key, raise invalidDid error.
|
|
212
|
+
if (idType === 'KEY') {
|
|
213
|
+
try {
|
|
214
|
+
new PublicKey(genesisBytes);
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
throw new Btcr2Error(`Invalid genesisBytes: ${genesisBytes}`, INVALID_DID, { identifier });
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
// 20. Return idType, version, network, and genesisBytes.
|
|
221
|
+
return { idType, hrp, version, network, genesisBytes };
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Generates a new did:btcr2 identifier based on a newly generated key pair.
|
|
225
|
+
* @returns {string} The new did:btcr2 identifier.
|
|
226
|
+
*/
|
|
227
|
+
static generate() {
|
|
228
|
+
const keys = SchnorrKeyPair.generate();
|
|
229
|
+
const did = this.encode({
|
|
230
|
+
idType: Btcr2IdentifierTypes.KEY,
|
|
231
|
+
version: 1,
|
|
232
|
+
network: BitcoinNetworkNames.bitcoin,
|
|
233
|
+
genesisBytes: keys.publicKey.compressed
|
|
234
|
+
});
|
|
235
|
+
return { keys, identifier: { controller: did, id: '#initialKey' } };
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=identifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identifier.js","sourceRoot":"","sources":["../../../src/utils/identifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,oBAAoB,EAAS,WAAW,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACpI,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC;;;;;;;;;;GAUG;AACH,MAAM,OAAO,cAAc;IACzB;;;;;;;;;;;;;;;;OAgBG;IACI,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAK5D;QACC,uEAAuE;QACvE,IAAI,CAAC,CAAC,MAAM,IAAI,oBAAoB,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,UAAU,CAAC,6CAA6C,EAAE,WAAW,EAAE,EAAC,MAAM,EAAC,CAAC,CAAC;QAC7F,CAAC;QAED,2DAA2D;QAC3D,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,UAAU,CAAC,4BAA4B,EAAE,WAAW,EAAE,EAAC,OAAO,EAAC,CAAC,CAAC;QAC7E,CAAC;QAED,gHAAgH;QAChH,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,IAAI,mBAAmB,CAAC,EAAE,CAAC;YACrE,MAAM,IAAI,UAAU,CAAC,wBAAwB,EAAE,WAAW,EAAE,EAAC,OAAO,EAAC,CAAC,CAAC;QACzE,CAAC;QAED,qFAAqF;QACrF,IAAG,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,CAAC,EAAE,CAAC;YAC/D,MAAM,IAAI,UAAU,CAAC,0BAA0B,EAAE,WAAW,EAAE,EAAC,OAAO,EAAC,CAAC,CAAC;QAC3E,CAAC;QAED,iHAAiH;QACjH,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACrB,IAAI,CAAC;gBACH,IAAI,SAAS,CAAC,YAAY,CAAC,CAAC;YAC9B,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,IAAI,UAAU,CAClB,uEAAuE,EACvE,WAAW,EAAE,EAAE,YAAY,EAAE,CAC9B,CAAC;YACJ,CAAC;QACH,CAAC;QAED,2CAA2C;QAC3C,oBAAoB;QACpB,yBAAyB;QACzB,MAAM,GAAG,GAAG,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAEzC,4CAA4C;QAC5C,MAAM,OAAO,GAAkB,EAAE,CAAC;QAElC,2DAA2D;QAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QAE9C,gEAAgE;QAChE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAChC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnB,CAAC;QAED,8CAA8C;QAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QAEjC,0FAA0F;QAC1F,oBAAoB;QACpB,mBAAmB;QACnB,oBAAoB;QACpB,qBAAqB;QACrB,qBAAqB;QACrB,sBAAsB;QACtB,IAAG,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,OAA2C,CAAC,CAAC,CAAC;QACjF,CAAC;aAAM,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YACvC,8DAA8D;YAC9D,OAAO,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;QAC7B,CAAC;QAED,4DAA4D;QAC5D,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,sGAAsG;QACtG,iFAAiF;QACjF,IAAI,MAAM,KAAK,CAAC,EAAC,CAAC;YAChB,KAAI,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBAClE,MAAM,IAAI,UAAU,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC;QAEhG,sCAAsC;QACtC,0FAA0F;QAC1F,0CAA0C;QAC1C,yBAAyB;QACzB,OAAO,aAAa,OAAO,CAAC,eAAe,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,CAAC;IAChE,CAAC;IAED;;;;;;;OAOG;IACI,MAAM,CAAC,MAAM,CAAC,UAAkB;QACrC,4EAA4E;QAC5E,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAEzC,6EAA6E;QAC7E,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAC,CAAC;YAC3B,MAAM,IAAI,UAAU,CAAC,gBAAgB,UAAU,EAAE,EAAE,WAAW,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;QAClF,CAAC;QAED,wEAAwE;QACxE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU,CAAC;QAE7C,4DAA4D;QAC5D,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACrB,MAAM,IAAI,UAAU,CAAC,gBAAgB,UAAU,EAAE,EAAE,WAAW,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;QAClF,CAAC;QACD,sEAAsE;QACtE,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;YACvB,MAAM,IAAI,UAAU,CAAC,uBAAuB,MAAM,EAAE,EAAE,oBAAoB,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;QAC9F,CAAC;QAED,yCAAyC;QACzC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,UAAU,CAAC,+BAA+B,UAAU,EAAE,EAAE,WAAW,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;QACjG,CAAC;QACD,yFAAyF;QACzF,MAAM,EAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAC,GAAG,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAEvE,sEAAsE;QACtE,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,UAAU,CAAC,gBAAgB,GAAG,EAAE,EAAE,WAAW,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;QAC3E,CAAC;QACD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,UAAU,CAAC,wBAAwB,OAAO,EAAE,EAAE,WAAW,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;QACvF,CAAC;QAED,2CAA2C;QAC3C,iBAAiB;QACjB,sBAAsB;QACtB,oCAAoC;QACpC,MAAM,MAAM,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC;QAEhD,uBAAuB;QACvB,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,mGAAmG;QACnG,8BAA8B;QAC9B,IAAI,eAAe,GAAG,CAAC,CAAC;QAExB,sFAAsF;QACtF,IAAI,WAAW,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,aAAa,GAAG,WAAW,KAAK,CAAC,CAAC;QAEtC,sDAAsD;QACtD,OAAO,aAAa,KAAK,GAAG,EAAE,CAAC;YAC7B,gHAAgH;YAChH,+FAA+F;YAC/F,OAAO,IAAI,EAAE,CAAC;YAEd,IAAI,eAAe,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC9B,aAAa,GAAG,WAAW,GAAG,IAAI,CAAC;YACrC,CAAC;iBAAM,CAAC;gBACN,WAAW,GAAG,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC;gBACrC,aAAa,GAAG,WAAW,KAAK,CAAC,CAAC;YACpC,CAAC;YACD,eAAe,IAAI,CAAC,CAAC;YACrB,4DAA4D;YAC5D,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;gBAChB,MAAM,IAAI,UAAU,CAAC,oBAAoB,OAAO,EAAE,EAAE,WAAW,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;YACnF,CAAC;QACH,CAAC;QAED,OAAO,IAAI,aAAa,CAAC;QACzB,eAAe,IAAI,CAAC,CAAC;QAErB,oEAAoE;QACpE,IAAI,YAAY,GAAW,eAAe,GAAG,CAAC,KAAK,CAAC;YAClD,CAAC,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,KAAK,CAAC;YAC9B,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC;QAEvB,eAAe,IAAI,CAAC,CAAC;QAErB,sDAAsD;QACtD,oBAAoB;QACpB,mBAAmB;QACnB,oBAAoB;QACpB,qBAAqB;QACrB,qBAAqB;QACrB,sBAAsB;QACtB,mCAAmC;QACnC,8BAA8B;QAC9B,IAAI,OAAO,GAAgC,mBAAmB,CAAC,YAAY,CAAC,CAAC;QAC7E,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,IAAI,YAAY,IAAI,GAAG,IAAI,YAAY,IAAI,GAAG,EAAE,CAAC;gBAC/C,OAAO,GAAG,YAAY,GAAG,EAAE,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,UAAU,CAAC,gBAAgB,UAAU,EAAE,EAAE,WAAW,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;YAClF,CAAC;QACH,CAAC;QAED,gDAAgD;QAChD,IAAI,eAAe,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,yEAAyE;YACzE,MAAM,YAAY,GAAG,WAAW,GAAG,IAAI,CAAC;YACxC,6DAA6D;YAC7D,IAAI,YAAY,KAAK,CAAC,EAAE,CAAC;gBACvB,MAAM,IAAI,UAAU,CAAC,gBAAgB,UAAU,EAAE,EAAE,WAAW,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;YAClF,CAAC;QACH,CAAC;QAED,mDAAmD;QACnD,MAAM,YAAY,GAAG,SAAS,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;QAEpD,kHAAkH;QAClH,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACrB,IAAI,CAAC;gBACH,IAAI,SAAS,CAAC,YAAY,CAAC,CAAC;YAC9B,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,IAAI,UAAU,CAAC,yBAAyB,YAAY,EAAE,EAAE,WAAW,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;YAC7F,CAAC;QACH,CAAC;QAED,yDAAyD;QACzD,OAAO,EAAC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAkB,CAAC;IACxE,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,QAAQ;QACpB,MAAM,IAAI,GAAG,cAAc,CAAC,QAAQ,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;YACtB,MAAM,EAAS,oBAAoB,CAAC,GAAG;YACvC,OAAO,EAAQ,CAAC;YAChB,OAAO,EAAQ,mBAAmB,CAAC,OAAO;YAC1C,YAAY,EAAG,IAAI,CAAC,SAAS,CAAC,UAAU;SACzC,CAAC,CAAC;QAEH,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE,EAAE,aAAa,EAAC,EAAE,CAAC;IACrE,CAAC;CACF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export const INITIAL_BLOCK_REWARD = 50;
|
|
2
|
+
export const HALVING_INTERVAL = 150;
|
|
3
|
+
export const COINBASE_MATURITY_DELAY = 100;
|
|
4
|
+
export const DEFAULT_RPC_CLIENT_CONFIG = {
|
|
5
|
+
network: 'regtest',
|
|
6
|
+
host: 'http://localhost:18443',
|
|
7
|
+
port: 18443,
|
|
8
|
+
username: 'polaruser',
|
|
9
|
+
password: 'polarpass',
|
|
10
|
+
allowDefaultWallet: true,
|
|
11
|
+
version: '28.1.0',
|
|
12
|
+
};
|
|
13
|
+
export const DEFAULT_REST_CLIENT_CONFIG = {
|
|
14
|
+
network: 'regtest',
|
|
15
|
+
host: 'http://localhost:3000'
|
|
16
|
+
};
|
|
17
|
+
export const DEFAULT_BLOCK_CONFIRMATIONS = 7;
|
|
18
|
+
export const TXIN_WITNESS_COINBASE = '0000000000000000000000000000000000000000000000000000000000000000';
|
|
19
|
+
export const GENESIS_TX_ID = '4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b';
|
|
20
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/bitcoin/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AACvC,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AACpC,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAC3C,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,OAAO,EAAc,SAAS;IAC9B,IAAI,EAAiB,wBAAwB;IAC7C,IAAI,EAAiB,KAAK;IAC1B,QAAQ,EAAa,WAAW;IAChC,QAAQ,EAAa,WAAW;IAChC,kBAAkB,EAAG,IAAI;IACzB,OAAO,EAAc,QAAQ;CAC9B,CAAC;AACF,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,OAAO,EAAG,SAAS;IACnB,IAAI,EAAM,uBAAuB;CAClC,CAAC;AACF,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC;AAC7C,MAAM,CAAC,MAAM,qBAAqB,GAAG,kEAAkE,CAAC;AACxG,MAAM,CAAC,MAAM,aAAa,GAAG,kEAAkE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/bitcoin/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACxB,IAAI,CAAkB;IACtB,IAAI,CAAO;IAC3B,YAAY,IAAqB,EAAE,OAAe,EAAE,IAAU;QAC5D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { Btcr2Error } from '@did-btcr2/common';
|
|
2
|
+
import { DEFAULT_REST_CLIENT_CONFIG, DEFAULT_RPC_CLIENT_CONFIG } from './constants.js';
|
|
3
|
+
import { getNetwork } from './network.js';
|
|
4
|
+
import BitcoinRest from './rest-client.js';
|
|
5
|
+
import BitcoinRpc from './rpc-client.js';
|
|
6
|
+
/**
|
|
7
|
+
* General class to house the Bitcoin client connections, client config and various utility methods.
|
|
8
|
+
* @name Bitcoin
|
|
9
|
+
* @type {Bitcoin}
|
|
10
|
+
*/
|
|
11
|
+
export class Bitcoin {
|
|
12
|
+
network;
|
|
13
|
+
mainnet;
|
|
14
|
+
testnet;
|
|
15
|
+
signet;
|
|
16
|
+
mutinynet;
|
|
17
|
+
regtest;
|
|
18
|
+
/**
|
|
19
|
+
* Creates an instance of the Bitcoin class.
|
|
20
|
+
* @param {BitcoinNetworkConfigMap} configs Optional configuration object for the Bitcoin client. If not provided, it will
|
|
21
|
+
* be loaded from the BITCOIN_CLIENT_CONFIG environment variables.
|
|
22
|
+
* @throws {Btcr2Error} If no configs is passed and BITCOIN_NETWORK_CONFIG is missing or invalid.
|
|
23
|
+
*/
|
|
24
|
+
constructor(configs) {
|
|
25
|
+
const BITCOIN_NETWORK_CONFIG = process.env.BITCOIN_NETWORK_CONFIG ?? JSON.stringify(configs ?? {
|
|
26
|
+
regtest: {
|
|
27
|
+
rpc: DEFAULT_RPC_CLIENT_CONFIG,
|
|
28
|
+
rest: DEFAULT_REST_CLIENT_CONFIG
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
if (!BITCOIN_NETWORK_CONFIG) {
|
|
32
|
+
throw new Btcr2Error('No BITCOIN_NETWORK_CONFIG available: must pass `configs` to constructor or set `BITCOIN_NETWORK_CONFIG` in env', 'MISSING_BITCOIN_NETWORK_CONFIG', { BITCOIN_NETWORK_CONFIG });
|
|
33
|
+
}
|
|
34
|
+
// Check if BITCOIN_NETWORK_CONFIG is parsable JSON string
|
|
35
|
+
if (!JSON.parsable(BITCOIN_NETWORK_CONFIG)) {
|
|
36
|
+
throw new Btcr2Error('Parsing failed: malformed BITCOIN_NETWORK_CONFIG', 'MISSING_MALFORMED_BITCOIN_NETWORK_CONFIG', { BITCOIN_NETWORK_CONFIG });
|
|
37
|
+
}
|
|
38
|
+
// Parse the BITCOIN_NETWORK_CONFIG
|
|
39
|
+
const networkConfigs = JSON.parse(BITCOIN_NETWORK_CONFIG);
|
|
40
|
+
// Set a list of available networks
|
|
41
|
+
const networks = ['mainnet', 'testnet', 'signet', 'mutinynet', 'regtest'];
|
|
42
|
+
// Iterate over the networks and create the client connections
|
|
43
|
+
for (const network of networks) {
|
|
44
|
+
const networkConfig = (configs?.[network] ?? networkConfigs[network]);
|
|
45
|
+
if (networkConfig) {
|
|
46
|
+
this[network] = {
|
|
47
|
+
name: network,
|
|
48
|
+
config: networkConfig,
|
|
49
|
+
rpc: new BitcoinRpc(networkConfig.rpc ?? DEFAULT_RPC_CLIENT_CONFIG),
|
|
50
|
+
rest: new BitcoinRest(networkConfig.rest ?? DEFAULT_REST_CLIENT_CONFIG),
|
|
51
|
+
data: getNetwork(network),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// Load and check the ACTIVE_NETWORK variable
|
|
56
|
+
const ACTIVE_NETWORK = (process.env.ACTIVE_NETWORK?.toLowerCase() ?? 'regtest');
|
|
57
|
+
if (!ACTIVE_NETWORK) {
|
|
58
|
+
throw new Btcr2Error('Missing ACTIVE_NETWORK environment variable', 'MISSING_ACTIVE_NETWORK', { ACTIVE_NETWORK });
|
|
59
|
+
}
|
|
60
|
+
if (!this[ACTIVE_NETWORK]) {
|
|
61
|
+
throw new Btcr2Error(`No configuration found for ACTIVE_NETWORK='${ACTIVE_NETWORK}'`, 'MISSING_CONFIG_FOR_NETWORK');
|
|
62
|
+
}
|
|
63
|
+
this.network = this[ACTIVE_NETWORK];
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Converts Bitcoin (BTC) to satoshis (SAT).
|
|
67
|
+
* @param {number} btc - The amount in BTC.
|
|
68
|
+
* @returns {number} The amount in SAT.
|
|
69
|
+
*/
|
|
70
|
+
static btcToSats(btc) {
|
|
71
|
+
return Math.round(btc * 1e8);
|
|
72
|
+
}
|
|
73
|
+
;
|
|
74
|
+
/**
|
|
75
|
+
* Converts satoshis (SAT) to Bitcoin (BTC).
|
|
76
|
+
* @param {number} sats - The amount in SAT.
|
|
77
|
+
* @returns {number} The amount in BTC.
|
|
78
|
+
*/
|
|
79
|
+
static satsToBtc(sats) {
|
|
80
|
+
return sats / 1e8;
|
|
81
|
+
}
|
|
82
|
+
;
|
|
83
|
+
}
|
|
84
|
+
const connection = new Bitcoin();
|
|
85
|
+
const network = connection.network;
|
|
86
|
+
const bitcoin = {
|
|
87
|
+
network,
|
|
88
|
+
rest: {
|
|
89
|
+
transaction: network.rest.transaction,
|
|
90
|
+
block: network.rest.block,
|
|
91
|
+
address: network.rest.address,
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
export default bitcoin;
|
|
95
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/bitcoin/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interface.js","sourceRoot":"","sources":["../../../src/bitcoin/interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { networks } from 'bitcoinjs-lib';
|
|
2
|
+
export function getNetwork(network) {
|
|
3
|
+
switch (network) {
|
|
4
|
+
case 'bitcoin':
|
|
5
|
+
return networks.bitcoin;
|
|
6
|
+
case 'testnet3':
|
|
7
|
+
case 'testnet4':
|
|
8
|
+
case 'signet':
|
|
9
|
+
case 'mutinynet':
|
|
10
|
+
return networks.testnet;
|
|
11
|
+
case 'regtest':
|
|
12
|
+
return networks.regtest;
|
|
13
|
+
default:
|
|
14
|
+
throw new Error(`Unknown network "${network}"`);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=network.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network.js","sourceRoot":"","sources":["../../../src/bitcoin/network.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,SAAS;YACZ,OAAO,QAAQ,CAAC,OAAO,CAAC;QAC1B,KAAK,UAAU,CAAC;QAChB,KAAK,UAAU,CAAC;QAChB,KAAK,QAAQ,CAAC;QACd,KAAK,WAAW;YACd,OAAO,QAAQ,CAAC,OAAO,CAAC;QAC1B,KAAK,SAAS;YACZ,OAAO,QAAQ,CAAC,OAAO,CAAC;QAC1B;YACE,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,GAAG,CAAC,CAAC;IACpD,CAAC;AACH,CAAC"}
|