@bitgo-beta/utxo-staking 1.1.1-beta.91 → 1.1.1-beta.911

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.
Files changed (137) hide show
  1. package/dist/cjs/scripts/babylon-sync.d.ts +2 -0
  2. package/dist/cjs/scripts/babylon-sync.d.ts.map +1 -0
  3. package/dist/cjs/scripts/babylon-sync.js +126 -0
  4. package/dist/cjs/src/babylon/delegationMessage.d.ts +38 -0
  5. package/dist/cjs/src/babylon/delegationMessage.d.ts.map +1 -0
  6. package/dist/cjs/src/babylon/delegationMessage.js +285 -0
  7. package/dist/cjs/src/babylon/descriptor.d.ts +48 -0
  8. package/dist/cjs/src/babylon/descriptor.d.ts.map +1 -0
  9. package/dist/cjs/src/babylon/descriptor.js +97 -0
  10. package/dist/cjs/src/babylon/index.d.ts +8 -0
  11. package/dist/cjs/src/babylon/index.d.ts.map +1 -0
  12. package/dist/cjs/src/babylon/index.js +51 -0
  13. package/dist/cjs/src/babylon/network.d.ts +7 -0
  14. package/dist/cjs/src/babylon/network.d.ts.map +1 -0
  15. package/dist/cjs/src/babylon/network.js +66 -0
  16. package/dist/cjs/src/babylon/params.mainnet.json +152 -0
  17. package/dist/cjs/src/babylon/params.testnet.json +212 -0
  18. package/dist/cjs/src/babylon/parseDescriptor.d.ts +26 -0
  19. package/dist/cjs/src/babylon/parseDescriptor.d.ts.map +1 -0
  20. package/dist/cjs/src/babylon/parseDescriptor.js +159 -0
  21. package/dist/cjs/src/babylon/stakingManager.d.ts +6 -0
  22. package/dist/cjs/src/babylon/stakingManager.d.ts.map +1 -0
  23. package/dist/cjs/src/babylon/stakingManager.js +120 -0
  24. package/dist/cjs/src/babylon/stakingParams.d.ts +40 -0
  25. package/dist/cjs/src/babylon/stakingParams.d.ts.map +1 -0
  26. package/dist/cjs/src/babylon/stakingParams.js +132 -0
  27. package/dist/cjs/src/babylon/undelegation/UndelegationResponse.d.ts +24 -0
  28. package/dist/cjs/src/babylon/undelegation/UndelegationResponse.d.ts.map +1 -0
  29. package/dist/cjs/src/babylon/undelegation/UndelegationResponse.js +55 -0
  30. package/dist/cjs/src/babylon/undelegation/index.d.ts +3 -0
  31. package/dist/cjs/src/babylon/undelegation/index.d.ts.map +1 -0
  32. package/dist/{src → cjs/src/babylon/undelegation}/index.js +3 -4
  33. package/dist/cjs/src/babylon/undelegation/unbonding.d.ts +16 -0
  34. package/dist/cjs/src/babylon/undelegation/unbonding.d.ts.map +1 -0
  35. package/dist/cjs/src/babylon/undelegation/unbonding.js +111 -0
  36. package/dist/cjs/src/coreDao/descriptor.d.ts.map +1 -0
  37. package/dist/cjs/src/coreDao/descriptor.js +38 -0
  38. package/dist/cjs/src/coreDao/index.d.ts.map +1 -0
  39. package/dist/{src → cjs/src}/coreDao/index.js +1 -1
  40. package/dist/cjs/src/coreDao/opReturn.d.ts.map +1 -0
  41. package/dist/cjs/src/coreDao/opReturn.js +183 -0
  42. package/dist/{src → cjs/src}/coreDao/transaction.d.ts +16 -7
  43. package/dist/cjs/src/coreDao/transaction.d.ts.map +1 -0
  44. package/dist/cjs/src/coreDao/transaction.js +34 -0
  45. package/dist/cjs/src/index.d.ts +3 -0
  46. package/dist/cjs/src/index.d.ts.map +1 -0
  47. package/dist/cjs/src/index.js +39 -0
  48. package/dist/cjs/test/unit/babylon/bug71.d.ts +2 -0
  49. package/dist/cjs/test/unit/babylon/bug71.d.ts.map +1 -0
  50. package/dist/cjs/test/unit/babylon/bug71.js +108 -0
  51. package/dist/cjs/test/unit/babylon/key.utils.d.ts +6 -0
  52. package/dist/cjs/test/unit/babylon/key.utils.d.ts.map +1 -0
  53. package/dist/cjs/test/unit/babylon/key.utils.js +68 -0
  54. package/dist/cjs/test/unit/babylon/transactions.d.ts +2 -0
  55. package/dist/cjs/test/unit/babylon/transactions.d.ts.map +1 -0
  56. package/dist/cjs/test/unit/babylon/transactions.js +338 -0
  57. package/dist/cjs/test/unit/babylon/undelegation.d.ts +2 -0
  58. package/dist/cjs/test/unit/babylon/undelegation.d.ts.map +1 -0
  59. package/dist/cjs/test/unit/babylon/undelegation.js +156 -0
  60. package/dist/cjs/test/unit/babylon/vendor.utils.d.ts +13 -0
  61. package/dist/cjs/test/unit/babylon/vendor.utils.d.ts.map +1 -0
  62. package/dist/cjs/test/unit/babylon/vendor.utils.js +78 -0
  63. package/dist/cjs/test/unit/coreDao/descriptor.d.ts +2 -0
  64. package/dist/cjs/test/unit/coreDao/descriptor.d.ts.map +1 -0
  65. package/dist/cjs/test/unit/coreDao/descriptor.js +144 -0
  66. package/dist/cjs/test/unit/coreDao/opReturn.d.ts +2 -0
  67. package/dist/cjs/test/unit/coreDao/opReturn.d.ts.map +1 -0
  68. package/dist/cjs/test/unit/coreDao/opReturn.js +275 -0
  69. package/dist/cjs/test/unit/coreDao/utils.d.ts +5 -0
  70. package/dist/cjs/test/unit/coreDao/utils.d.ts.map +1 -0
  71. package/dist/cjs/test/unit/coreDao/utils.js +54 -0
  72. package/dist/cjs/test/unit/fixtures.utils.d.ts +9 -0
  73. package/dist/cjs/test/unit/fixtures.utils.d.ts.map +1 -0
  74. package/dist/cjs/test/unit/fixtures.utils.js +91 -0
  75. package/dist/cjs/tsconfig.tsbuildinfo +1 -0
  76. package/dist/esm/babylon/delegationMessage.d.ts +38 -0
  77. package/dist/esm/babylon/delegationMessage.d.ts.map +1 -0
  78. package/dist/esm/babylon/delegationMessage.js +239 -0
  79. package/dist/esm/babylon/descriptor.d.ts +48 -0
  80. package/dist/esm/babylon/descriptor.d.ts.map +1 -0
  81. package/dist/esm/babylon/descriptor.js +91 -0
  82. package/dist/esm/babylon/index.d.ts +8 -0
  83. package/dist/esm/babylon/index.d.ts.map +1 -0
  84. package/dist/esm/babylon/index.js +13 -0
  85. package/dist/esm/babylon/network.d.ts +7 -0
  86. package/dist/esm/babylon/network.d.ts.map +1 -0
  87. package/dist/esm/babylon/network.js +29 -0
  88. package/dist/esm/babylon/params.mainnet.json +152 -0
  89. package/dist/esm/babylon/params.testnet.json +212 -0
  90. package/dist/esm/babylon/parseDescriptor.d.ts +26 -0
  91. package/dist/esm/babylon/parseDescriptor.d.ts.map +1 -0
  92. package/dist/esm/babylon/parseDescriptor.js +155 -0
  93. package/dist/esm/babylon/stakingManager.d.ts +6 -0
  94. package/dist/esm/babylon/stakingManager.d.ts.map +1 -0
  95. package/dist/esm/babylon/stakingManager.js +83 -0
  96. package/dist/esm/babylon/stakingParams.d.ts +40 -0
  97. package/dist/esm/babylon/stakingParams.d.ts.map +1 -0
  98. package/dist/esm/babylon/stakingParams.js +86 -0
  99. package/dist/esm/babylon/undelegation/UndelegationResponse.d.ts +24 -0
  100. package/dist/esm/babylon/undelegation/UndelegationResponse.d.ts.map +1 -0
  101. package/dist/esm/babylon/undelegation/UndelegationResponse.js +18 -0
  102. package/dist/esm/babylon/undelegation/index.d.ts +3 -0
  103. package/dist/esm/babylon/undelegation/index.d.ts.map +1 -0
  104. package/dist/esm/babylon/undelegation/index.js +3 -0
  105. package/dist/esm/babylon/undelegation/unbonding.d.ts +16 -0
  106. package/dist/esm/babylon/undelegation/unbonding.d.ts.map +1 -0
  107. package/dist/esm/babylon/undelegation/unbonding.js +70 -0
  108. package/dist/esm/coreDao/descriptor.d.ts +18 -0
  109. package/dist/{src → esm}/coreDao/descriptor.d.ts.map +1 -1
  110. package/dist/esm/coreDao/descriptor.js +35 -0
  111. package/dist/esm/coreDao/index.d.ts +4 -0
  112. package/dist/esm/coreDao/index.js +4 -0
  113. package/dist/esm/coreDao/opReturn.d.ts +41 -0
  114. package/dist/esm/coreDao/opReturn.js +175 -0
  115. package/dist/esm/coreDao/transaction.d.ts +28 -0
  116. package/dist/esm/coreDao/transaction.d.ts.map +1 -0
  117. package/dist/esm/coreDao/transaction.js +30 -0
  118. package/dist/esm/index.d.ts +3 -0
  119. package/dist/{src → esm}/index.d.ts.map +1 -1
  120. package/dist/esm/index.js +3 -0
  121. package/package.json +42 -12
  122. package/.eslintignore +0 -5
  123. package/.mocharc.yml +0 -8
  124. package/CHANGELOG.md +0 -63
  125. package/dist/src/coreDao/descriptor.js +0 -37
  126. package/dist/src/coreDao/opReturn.js +0 -183
  127. package/dist/src/coreDao/transaction.d.ts.map +0 -1
  128. package/dist/src/coreDao/transaction.js +0 -26
  129. package/dist/src/index.d.ts +0 -3
  130. package/dist/src/transaction.d.ts +0 -32
  131. package/dist/src/transaction.d.ts.map +0 -1
  132. package/dist/src/transaction.js +0 -54
  133. /package/dist/{src → cjs/src}/coreDao/descriptor.d.ts +0 -0
  134. /package/dist/{src → cjs/src}/coreDao/index.d.ts +0 -0
  135. /package/dist/{src → cjs/src}/coreDao/opReturn.d.ts +0 -0
  136. /package/dist/{src → esm}/coreDao/index.d.ts.map +0 -0
  137. /package/dist/{src → esm}/coreDao/opReturn.d.ts.map +0 -0
@@ -0,0 +1,83 @@
1
+ import * as bitcoinjslib from 'bitcoinjs-lib';
2
+ import * as utxolib from '@bitgo-beta/utxo-lib';
3
+ import * as vendor from '@bitgo-beta/babylonlabs-io-btc-staking-ts';
4
+ import { BIP322Sig, BTCSigType, } from '@babylonlabs-io/babylon-proto-ts/dist/generated/babylon/btcstaking/v1/pop';
5
+ import { getStakingParams } from './stakingParams';
6
+ /**
7
+ * Subclass of BabylonBtcStakingManager with the sole purpose of forcing
8
+ * a ECDSA signature.
9
+ */
10
+ class BitGoStakingManager extends vendor.BabylonBtcStakingManager {
11
+ constructor(network, stakingParams, btcProvider, babylonProvider) {
12
+ super(network, stakingParams, btcProvider, babylonProvider);
13
+ }
14
+ /**
15
+ * Creates a proof of possession for the staker based on ECDSA signature.
16
+ *
17
+ * This is a parameterized version of the superclass method which infers
18
+ * the signature type from the stakerBtcAddress.
19
+ *
20
+ * @param bech32Address - The staker's bech32 address on the babylon network.
21
+ * @param stakerBtcAddress - The staker's BTC address.
22
+ * @param sigType - The signature type (BIP322 or ECDSA).
23
+ * @returns The proof of possession.
24
+ */
25
+ async createProofOfPossessionWithSigType(bech32Address, stakerBtcAddress, sigType) {
26
+ if (!bech32Address.startsWith('bbn1')) {
27
+ throw new Error('invalid bech32 babylon address, must start with bbn1');
28
+ }
29
+ const signedBabylonAddress = await this.btcProvider.signMessage(bech32Address, sigType === BTCSigType.BIP322 ? 'bip322-simple' : 'ecdsa');
30
+ let btcSig;
31
+ if (sigType === BTCSigType.BIP322) {
32
+ const bip322Sig = BIP322Sig.fromPartial({
33
+ address: stakerBtcAddress,
34
+ sig: Buffer.from(signedBabylonAddress, 'base64'),
35
+ });
36
+ // Encode the BIP322 protobuf message to a Uint8Array
37
+ btcSig = BIP322Sig.encode(bip322Sig).finish();
38
+ }
39
+ else {
40
+ // Encode the ECDSA signature to a Uint8Array
41
+ btcSig = Buffer.from(signedBabylonAddress, 'base64');
42
+ }
43
+ return {
44
+ btcSigType: sigType,
45
+ btcSig,
46
+ };
47
+ }
48
+ /**
49
+ * Creates a proof of possession for the staker based on ECDSA signature.
50
+ * @param channel - The channel for which the proof of possession is created.
51
+ * @param bech32Address - The staker's bech32 address on the babylon network.
52
+ * @param stakerBtcAddress
53
+ * @returns The proof of possession.
54
+ */
55
+ async createProofOfPossession(channel, bech32Address, stakerBtcAddress) {
56
+ // force the ECDSA signature type
57
+ return this.createProofOfPossessionWithSigType(bech32Address, stakerBtcAddress, BTCSigType.ECDSA);
58
+ }
59
+ }
60
+ export const mockBabylonProvider = {
61
+ signTransaction() {
62
+ throw new Error('Function not implemented.');
63
+ },
64
+ };
65
+ export function createStakingManager(network, btcProvider, stakingParams, babylonProvider = mockBabylonProvider) {
66
+ if (utxolib.isValidNetwork(network)) {
67
+ switch (network) {
68
+ case utxolib.networks.bitcoin:
69
+ network = bitcoinjslib.networks.bitcoin;
70
+ break;
71
+ case utxolib.networks.testnet:
72
+ case utxolib.networks.bitcoinTestnet4:
73
+ throw new Error('Unsupported bitcoin testnet network - only signet is supported');
74
+ case utxolib.networks.bitcoinPublicSignet:
75
+ network = bitcoinjslib.networks.testnet;
76
+ break;
77
+ default:
78
+ throw new Error('Unsupported network');
79
+ }
80
+ }
81
+ return new BitGoStakingManager(network, stakingParams ?? getStakingParams(network), btcProvider, babylonProvider);
82
+ }
83
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Rha2luZ01hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYmFieWxvbi9zdGFraW5nTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssWUFBWSxNQUFNLGVBQWUsQ0FBQztBQUM5QyxPQUFPLEtBQUssT0FBTyxNQUFNLHNCQUFzQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxNQUFNLE1BQU0sMkNBQTJDLENBQUM7QUFDcEUsT0FBTyxFQUNMLFNBQVMsRUFDVCxVQUFVLEdBRVgsTUFBTSwyRUFBMkUsQ0FBQztBQUVuRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVuRDs7O0dBR0c7QUFDSCxNQUFNLG1CQUFvQixTQUFRLE1BQU0sQ0FBQyx3QkFBd0I7SUFDL0QsWUFDRSxPQUE2QixFQUM3QixhQUE4QyxFQUM5QyxXQUErQixFQUMvQixlQUF1QztRQUV2QyxLQUFLLENBQUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSCxLQUFLLENBQUMsa0NBQWtDLENBQ3RDLGFBQXFCLEVBQ3JCLGdCQUF3QixFQUN4QixPQUFtQjtRQUVuQixJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3RDLE1BQU0sSUFBSSxLQUFLLENBQUMsc0RBQXNELENBQUMsQ0FBQztRQUMxRSxDQUFDO1FBQ0QsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUM3RCxhQUFhLEVBQ2IsT0FBTyxLQUFLLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUMxRCxDQUFDO1FBRUYsSUFBSSxNQUFrQixDQUFDO1FBQ3ZCLElBQUksT0FBTyxLQUFLLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNsQyxNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsV0FBVyxDQUFDO2dCQUN0QyxPQUFPLEVBQUUsZ0JBQWdCO2dCQUN6QixHQUFHLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxRQUFRLENBQUM7YUFDakQsQ0FBQyxDQUFDO1lBQ0gscURBQXFEO1lBQ3JELE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2hELENBQUM7YUFBTSxDQUFDO1lBQ04sNkNBQTZDO1lBQzdDLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFFRCxPQUFPO1lBQ0wsVUFBVSxFQUFFLE9BQU87WUFDbkIsTUFBTTtTQUNQLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ00sS0FBSyxDQUFDLHVCQUF1QixDQUNwQyxPQUFvRCxFQUNwRCxhQUFxQixFQUNyQixnQkFBd0I7UUFFeEIsaUNBQWlDO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLGtDQUFrQyxDQUFDLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEcsQ0FBQztDQUNGO0FBRUQsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQTJCO0lBQ3pELGVBQWU7UUFDYixNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUM7SUFDL0MsQ0FBQztDQUNGLENBQUM7QUFFRixNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLE9BQStDLEVBQy9DLFdBQStCLEVBQy9CLGFBQStDLEVBQy9DLGVBQWUsR0FBRyxtQkFBbUI7SUFFckMsSUFBSSxPQUFPLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDcEMsUUFBUSxPQUFPLEVBQUUsQ0FBQztZQUNoQixLQUFLLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTztnQkFDM0IsT0FBTyxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO2dCQUN4QyxNQUFNO1lBQ1IsS0FBSyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztZQUM5QixLQUFLLE9BQU8sQ0FBQyxRQUFRLENBQUMsZUFBZTtnQkFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxnRUFBZ0UsQ0FBQyxDQUFDO1lBQ3BGLEtBQUssT0FBTyxDQUFDLFFBQVEsQ0FBQyxtQkFBbUI7Z0JBQ3ZDLE9BQU8sR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztnQkFDeEMsTUFBTTtZQUNSO2dCQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUMzQyxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sSUFBSSxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsYUFBYSxJQUFJLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxFQUFFLFdBQVcsRUFBRSxlQUFlLENBQUMsQ0FBQztBQUNwSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgYml0Y29pbmpzbGliIGZyb20gJ2JpdGNvaW5qcy1saWInO1xuaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5pbXBvcnQgKiBhcyB2ZW5kb3IgZnJvbSAnQGJpdGdvLWJldGEvYmFieWxvbmxhYnMtaW8tYnRjLXN0YWtpbmctdHMnO1xuaW1wb3J0IHtcbiAgQklQMzIyU2lnLFxuICBCVENTaWdUeXBlLFxuICBQcm9vZk9mUG9zc2Vzc2lvbkJUQyxcbn0gZnJvbSAnQGJhYnlsb25sYWJzLWlvL2JhYnlsb24tcHJvdG8tdHMvZGlzdC9nZW5lcmF0ZWQvYmFieWxvbi9idGNzdGFraW5nL3YxL3BvcCc7XG5cbmltcG9ydCB7IGdldFN0YWtpbmdQYXJhbXMgfSBmcm9tICcuL3N0YWtpbmdQYXJhbXMnO1xuXG4vKipcbiAqIFN1YmNsYXNzIG9mIEJhYnlsb25CdGNTdGFraW5nTWFuYWdlciB3aXRoIHRoZSBzb2xlIHB1cnBvc2Ugb2YgZm9yY2luZ1xuICogYSBFQ0RTQSBzaWduYXR1cmUuXG4gKi9cbmNsYXNzIEJpdEdvU3Rha2luZ01hbmFnZXIgZXh0ZW5kcyB2ZW5kb3IuQmFieWxvbkJ0Y1N0YWtpbmdNYW5hZ2VyIHtcbiAgY29uc3RydWN0b3IoXG4gICAgbmV0d29yazogYml0Y29pbmpzbGliLk5ldHdvcmssXG4gICAgc3Rha2luZ1BhcmFtczogdmVuZG9yLlZlcnNpb25lZFN0YWtpbmdQYXJhbXNbXSxcbiAgICBidGNQcm92aWRlcjogdmVuZG9yLkJ0Y1Byb3ZpZGVyLFxuICAgIGJhYnlsb25Qcm92aWRlcjogdmVuZG9yLkJhYnlsb25Qcm92aWRlclxuICApIHtcbiAgICBzdXBlcihuZXR3b3JrLCBzdGFraW5nUGFyYW1zLCBidGNQcm92aWRlciwgYmFieWxvblByb3ZpZGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgcHJvb2Ygb2YgcG9zc2Vzc2lvbiBmb3IgdGhlIHN0YWtlciBiYXNlZCBvbiBFQ0RTQSBzaWduYXR1cmUuXG4gICAqXG4gICAqIFRoaXMgaXMgYSBwYXJhbWV0ZXJpemVkIHZlcnNpb24gb2YgdGhlIHN1cGVyY2xhc3MgbWV0aG9kIHdoaWNoIGluZmVyc1xuICAgKiB0aGUgc2lnbmF0dXJlIHR5cGUgZnJvbSB0aGUgc3Rha2VyQnRjQWRkcmVzcy5cbiAgICpcbiAgICogQHBhcmFtIGJlY2gzMkFkZHJlc3MgLSBUaGUgc3Rha2VyJ3MgYmVjaDMyIGFkZHJlc3Mgb24gdGhlIGJhYnlsb24gbmV0d29yay5cbiAgICogQHBhcmFtIHN0YWtlckJ0Y0FkZHJlc3MgLSBUaGUgc3Rha2VyJ3MgQlRDIGFkZHJlc3MuXG4gICAqIEBwYXJhbSBzaWdUeXBlIC0gVGhlIHNpZ25hdHVyZSB0eXBlIChCSVAzMjIgb3IgRUNEU0EpLlxuICAgKiBAcmV0dXJucyBUaGUgcHJvb2Ygb2YgcG9zc2Vzc2lvbi5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZVByb29mT2ZQb3NzZXNzaW9uV2l0aFNpZ1R5cGUoXG4gICAgYmVjaDMyQWRkcmVzczogc3RyaW5nLFxuICAgIHN0YWtlckJ0Y0FkZHJlc3M6IHN0cmluZyxcbiAgICBzaWdUeXBlOiBCVENTaWdUeXBlXG4gICk6IFByb21pc2U8UHJvb2ZPZlBvc3Nlc3Npb25CVEM+IHtcbiAgICBpZiAoIWJlY2gzMkFkZHJlc3Muc3RhcnRzV2l0aCgnYmJuMScpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYmVjaDMyIGJhYnlsb24gYWRkcmVzcywgbXVzdCBzdGFydCB3aXRoIGJibjEnKTtcbiAgICB9XG4gICAgY29uc3Qgc2lnbmVkQmFieWxvbkFkZHJlc3MgPSBhd2FpdCB0aGlzLmJ0Y1Byb3ZpZGVyLnNpZ25NZXNzYWdlKFxuICAgICAgYmVjaDMyQWRkcmVzcyxcbiAgICAgIHNpZ1R5cGUgPT09IEJUQ1NpZ1R5cGUuQklQMzIyID8gJ2JpcDMyMi1zaW1wbGUnIDogJ2VjZHNhJ1xuICAgICk7XG5cbiAgICBsZXQgYnRjU2lnOiBVaW50OEFycmF5O1xuICAgIGlmIChzaWdUeXBlID09PSBCVENTaWdUeXBlLkJJUDMyMikge1xuICAgICAgY29uc3QgYmlwMzIyU2lnID0gQklQMzIyU2lnLmZyb21QYXJ0aWFsKHtcbiAgICAgICAgYWRkcmVzczogc3Rha2VyQnRjQWRkcmVzcyxcbiAgICAgICAgc2lnOiBCdWZmZXIuZnJvbShzaWduZWRCYWJ5bG9uQWRkcmVzcywgJ2Jhc2U2NCcpLFxuICAgICAgfSk7XG4gICAgICAvLyBFbmNvZGUgdGhlIEJJUDMyMiBwcm90b2J1ZiBtZXNzYWdlIHRvIGEgVWludDhBcnJheVxuICAgICAgYnRjU2lnID0gQklQMzIyU2lnLmVuY29kZShiaXAzMjJTaWcpLmZpbmlzaCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBFbmNvZGUgdGhlIEVDRFNBIHNpZ25hdHVyZSB0byBhIFVpbnQ4QXJyYXlcbiAgICAgIGJ0Y1NpZyA9IEJ1ZmZlci5mcm9tKHNpZ25lZEJhYnlsb25BZGRyZXNzLCAnYmFzZTY0Jyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGJ0Y1NpZ1R5cGU6IHNpZ1R5cGUsXG4gICAgICBidGNTaWcsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgcHJvb2Ygb2YgcG9zc2Vzc2lvbiBmb3IgdGhlIHN0YWtlciBiYXNlZCBvbiBFQ0RTQSBzaWduYXR1cmUuXG4gICAqIEBwYXJhbSBjaGFubmVsIC0gVGhlIGNoYW5uZWwgZm9yIHdoaWNoIHRoZSBwcm9vZiBvZiBwb3NzZXNzaW9uIGlzIGNyZWF0ZWQuXG4gICAqIEBwYXJhbSBiZWNoMzJBZGRyZXNzIC0gVGhlIHN0YWtlcidzIGJlY2gzMiBhZGRyZXNzIG9uIHRoZSBiYWJ5bG9uIG5ldHdvcmsuXG4gICAqIEBwYXJhbSBzdGFrZXJCdGNBZGRyZXNzXG4gICAqIEByZXR1cm5zIFRoZSBwcm9vZiBvZiBwb3NzZXNzaW9uLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlUHJvb2ZPZlBvc3Nlc3Npb24oXG4gICAgY2hhbm5lbDogJ2RlbGVnYXRpb246Y3JlYXRlJyB8ICdkZWxlZ2F0aW9uOnJlZ2lzdGVyJyxcbiAgICBiZWNoMzJBZGRyZXNzOiBzdHJpbmcsXG4gICAgc3Rha2VyQnRjQWRkcmVzczogc3RyaW5nXG4gICk6IFByb21pc2U8UHJvb2ZPZlBvc3Nlc3Npb25CVEM+IHtcbiAgICAvLyBmb3JjZSB0aGUgRUNEU0Egc2lnbmF0dXJlIHR5cGVcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVQcm9vZk9mUG9zc2Vzc2lvbldpdGhTaWdUeXBlKGJlY2gzMkFkZHJlc3MsIHN0YWtlckJ0Y0FkZHJlc3MsIEJUQ1NpZ1R5cGUuRUNEU0EpO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBtb2NrQmFieWxvblByb3ZpZGVyOiB2ZW5kb3IuQmFieWxvblByb3ZpZGVyID0ge1xuICBzaWduVHJhbnNhY3Rpb24oKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH0sXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU3Rha2luZ01hbmFnZXIoXG4gIG5ldHdvcms6IGJpdGNvaW5qc2xpYi5OZXR3b3JrIHwgdXR4b2xpYi5OZXR3b3JrLFxuICBidGNQcm92aWRlcjogdmVuZG9yLkJ0Y1Byb3ZpZGVyLFxuICBzdGFraW5nUGFyYW1zPzogdmVuZG9yLlZlcnNpb25lZFN0YWtpbmdQYXJhbXNbXSxcbiAgYmFieWxvblByb3ZpZGVyID0gbW9ja0JhYnlsb25Qcm92aWRlclxuKTogdmVuZG9yLkJhYnlsb25CdGNTdGFraW5nTWFuYWdlciB7XG4gIGlmICh1dHhvbGliLmlzVmFsaWROZXR3b3JrKG5ldHdvcmspKSB7XG4gICAgc3dpdGNoIChuZXR3b3JrKSB7XG4gICAgICBjYXNlIHV0eG9saWIubmV0d29ya3MuYml0Y29pbjpcbiAgICAgICAgbmV0d29yayA9IGJpdGNvaW5qc2xpYi5uZXR3b3Jrcy5iaXRjb2luO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgdXR4b2xpYi5uZXR3b3Jrcy50ZXN0bmV0OlxuICAgICAgY2FzZSB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW5UZXN0bmV0NDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBiaXRjb2luIHRlc3RuZXQgbmV0d29yayAtIG9ubHkgc2lnbmV0IGlzIHN1cHBvcnRlZCcpO1xuICAgICAgY2FzZSB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW5QdWJsaWNTaWduZXQ6XG4gICAgICAgIG5ldHdvcmsgPSBiaXRjb2luanNsaWIubmV0d29ya3MudGVzdG5ldDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIG5ldHdvcmsnKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5ldyBCaXRHb1N0YWtpbmdNYW5hZ2VyKG5ldHdvcmssIHN0YWtpbmdQYXJhbXMgPz8gZ2V0U3Rha2luZ1BhcmFtcyhuZXR3b3JrKSwgYnRjUHJvdmlkZXIsIGJhYnlsb25Qcm92aWRlcik7XG59XG4iXX0=
@@ -0,0 +1,40 @@
1
+ import * as t from 'io-ts';
2
+ import * as tt from 'io-ts-types';
3
+ import * as utxolib from '@bitgo-beta/utxo-lib';
4
+ import { StakerInfo, StakingInputs, StakingParams, VersionedStakingParams } from '@bitgo-beta/babylonlabs-io-btc-staking-ts';
5
+ export { getBabylonParamByVersion, getBabylonParamByBtcHeight } from '@bitgo-beta/babylonlabs-io-btc-staking-ts';
6
+ import { BabylonDescriptorBuilder } from './descriptor';
7
+ import { BabylonNetworkLike } from './network';
8
+ /** @see https://docs.babylonlabs.io/api/babylon-gRPC/params/ */
9
+ declare const BabylonParamsJSON: t.TypeC<{
10
+ covenant_pks: t.ArrayC<t.StringC>;
11
+ covenant_quorum: t.NumberC;
12
+ min_staking_value_sat: tt.NumberFromStringC;
13
+ max_staking_value_sat: tt.NumberFromStringC;
14
+ min_staking_time_blocks: t.NumberC;
15
+ max_staking_time_blocks: t.NumberC;
16
+ slashing_pk_script: t.StringC;
17
+ min_slashing_tx_fee_sat: tt.NumberFromStringC;
18
+ slashing_rate: t.StringC;
19
+ unbonding_time_blocks: t.NumberC;
20
+ unbonding_fee_sat: tt.NumberFromStringC;
21
+ min_commission_rate: tt.NumberFromStringC;
22
+ delegation_creation_base_gas_fee: tt.NumberFromStringC;
23
+ allow_list_expiration_height: tt.NumberFromStringC;
24
+ btc_activation_height: t.NumberC;
25
+ }>;
26
+ type BabylonParamsJSON = t.TypeOf<typeof BabylonParamsJSON>;
27
+ export declare function toVersionedParams(ps: BabylonParamsJSON[]): VersionedStakingParams[];
28
+ export declare const mainnetStakingParams: readonly VersionedStakingParams[];
29
+ export declare const testnetStakingParams: readonly VersionedStakingParams[];
30
+ export declare function getStakingParams(network: BabylonNetworkLike): VersionedStakingParams[];
31
+ export declare const testnetFinalityProvider0: Buffer<ArrayBuffer>;
32
+ type DescriptorStakingParams = Pick<StakingParams, 'covenantNoCoordPks' | 'covenantQuorum' | 'minStakingTimeBlocks' | 'unbondingTime'>;
33
+ export declare function getDescriptorBuilderForParams(userKey: utxolib.BIP32Interface | utxolib.ECPairInterface | Buffer, finalityProviderKeys: Buffer[], stakingTimelock: number, params: DescriptorStakingParams): BabylonDescriptorBuilder;
34
+ export declare function getDescriptorProviderForStakingParams(stakerBtcInfo: Pick<StakerInfo, 'publicKeyNoCoordHex'>, stakingInput: StakingInputs, stakingParams: DescriptorStakingParams): BabylonDescriptorBuilder;
35
+ export declare function getTestnetDescriptorBuilder(userKey: utxolib.BIP32Interface | utxolib.ECPairInterface | Buffer, { finalityProviderKeys, params, stakingTimelock, }?: {
36
+ finalityProviderKeys?: Buffer[];
37
+ params?: StakingParams;
38
+ stakingTimelock?: number;
39
+ }): BabylonDescriptorBuilder;
40
+ //# sourceMappingURL=stakingParams.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stakingParams.d.ts","sourceRoot":"","sources":["../../../src/babylon/stakingParams.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,OAAO,CAAC;AAC3B,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAGlC,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAEL,UAAU,EACV,aAAa,EACb,aAAa,EACb,sBAAsB,EACvB,MAAM,2CAA2C,CAAC;AACnD,OAAO,EAAE,wBAAwB,EAAE,0BAA0B,EAAE,MAAM,2CAA2C,CAAC;AAEjH,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAGxD,OAAO,EAAE,kBAAkB,EAAoB,MAAM,WAAW,CAAC;AAEjE,gEAAgE;AAChE,QAAA,MAAM,iBAAiB;;;;;;;;;;;;;;;;EAgBrB,CAAC;AAEH,KAAK,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,iBAAiB,EAAE,GAAG,sBAAsB,EAAE,CAkBnF;AAeD,eAAO,MAAM,oBAAoB,EAAE,SAAS,sBAAsB,EAEjE,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,SAAS,sBAAsB,EAEjE,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,kBAAkB,GAAG,sBAAsB,EAAE,CAStF;AAGD,eAAO,MAAM,wBAAwB,qBAGpC,CAAC;AAEF,KAAK,uBAAuB,GAAG,IAAI,CACjC,aAAa,EACb,oBAAoB,GAAG,gBAAgB,GAAG,sBAAsB,GAAG,eAAe,CACnF,CAAC;AAEF,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,OAAO,CAAC,cAAc,GAAG,OAAO,CAAC,eAAe,GAAG,MAAM,EAClE,oBAAoB,EAAE,MAAM,EAAE,EAC9B,eAAe,EAAE,MAAM,EACvB,MAAM,EAAE,uBAAuB,GAC9B,wBAAwB,CAY1B;AAED,wBAAgB,qCAAqC,CACnD,aAAa,EAAE,IAAI,CAAC,UAAU,EAAE,qBAAqB,CAAC,EACtD,YAAY,EAAE,aAAa,EAC3B,aAAa,EAAE,uBAAuB,GACrC,wBAAwB,CAI1B;AAED,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,OAAO,CAAC,cAAc,GAAG,OAAO,CAAC,eAAe,GAAG,MAAM,EAClE,EACE,oBAAiD,EACjD,MAAiE,EACjE,eAA6C,GAC9C,GAAE;IACD,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;CACrB,GACL,wBAAwB,CAE1B"}
@@ -0,0 +1,86 @@
1
+ import * as t from 'io-ts';
2
+ import * as tt from 'io-ts-types';
3
+ import { isLeft } from 'fp-ts/Either';
4
+ import { PathReporter } from 'io-ts/lib/PathReporter';
5
+ import { getBabylonParamByVersion, } from '@bitgo-beta/babylonlabs-io-btc-staking-ts';
6
+ export { getBabylonParamByVersion, getBabylonParamByBtcHeight } from '@bitgo-beta/babylonlabs-io-btc-staking-ts';
7
+ import { BabylonDescriptorBuilder } from './descriptor';
8
+ import jsonMainnetParams from './params.mainnet.json';
9
+ import jsonTestnetParams from './params.testnet.json';
10
+ import { toBabylonNetwork } from './network';
11
+ /** @see https://docs.babylonlabs.io/api/babylon-gRPC/params/ */
12
+ const BabylonParamsJSON = t.type({
13
+ covenant_pks: t.array(t.string),
14
+ covenant_quorum: t.number,
15
+ min_staking_value_sat: tt.NumberFromString,
16
+ max_staking_value_sat: tt.NumberFromString,
17
+ min_staking_time_blocks: t.number,
18
+ max_staking_time_blocks: t.number,
19
+ slashing_pk_script: t.string,
20
+ min_slashing_tx_fee_sat: tt.NumberFromString,
21
+ slashing_rate: t.string,
22
+ unbonding_time_blocks: t.number,
23
+ unbonding_fee_sat: tt.NumberFromString,
24
+ min_commission_rate: tt.NumberFromString,
25
+ delegation_creation_base_gas_fee: tt.NumberFromString,
26
+ allow_list_expiration_height: tt.NumberFromString,
27
+ btc_activation_height: t.number,
28
+ });
29
+ export function toVersionedParams(ps) {
30
+ return ps.map((p, version) => ({
31
+ version,
32
+ btcActivationHeight: p.btc_activation_height,
33
+ covenantNoCoordPks: p.covenant_pks,
34
+ covenantQuorum: p.covenant_quorum,
35
+ unbondingTime: p.unbonding_time_blocks,
36
+ unbondingFeeSat: p.unbonding_fee_sat,
37
+ maxStakingAmountSat: p.max_staking_value_sat,
38
+ minStakingAmountSat: p.min_staking_value_sat,
39
+ maxStakingTimeBlocks: p.max_staking_time_blocks,
40
+ minStakingTimeBlocks: p.min_staking_time_blocks,
41
+ slashing: {
42
+ slashingPkScriptHex: Buffer.from(p.slashing_pk_script, 'base64').toString('hex'),
43
+ slashingRate: parseFloat(p.slashing_rate),
44
+ minSlashingTxFeeSat: p.min_slashing_tx_fee_sat,
45
+ },
46
+ }));
47
+ }
48
+ function toVersionedParamsFromJson(jsonParams) {
49
+ return toVersionedParams(jsonParams.map((p) => {
50
+ const result = t.type({ params: BabylonParamsJSON }).decode(p);
51
+ if (isLeft(result)) {
52
+ const msg = PathReporter.report(result).join('\n');
53
+ throw new Error(`Invalid params: ${msg}`);
54
+ }
55
+ return result.right.params;
56
+ }));
57
+ }
58
+ export const mainnetStakingParams = Object.freeze(toVersionedParamsFromJson(jsonMainnetParams));
59
+ export const testnetStakingParams = Object.freeze(toVersionedParamsFromJson(jsonTestnetParams));
60
+ export function getStakingParams(network) {
61
+ switch (toBabylonNetwork(network)) {
62
+ case 'mainnet':
63
+ return [...mainnetStakingParams];
64
+ case 'testnet':
65
+ return [...testnetStakingParams];
66
+ default:
67
+ throw new Error('Unsupported network');
68
+ }
69
+ }
70
+ // Source: https://btcstaking.testnet.babylonlabs.io/ "Babylon Foundation 0"
71
+ export const testnetFinalityProvider0 = Buffer.from('d23c2c25e1fcf8fd1c21b9a402c19e2e309e531e45e92fb1e9805b6056b0cc76', 'hex');
72
+ export function getDescriptorBuilderForParams(userKey, finalityProviderKeys, stakingTimelock, params) {
73
+ if (!Buffer.isBuffer(userKey)) {
74
+ userKey = userKey.publicKey;
75
+ }
76
+ return new BabylonDescriptorBuilder(userKey, finalityProviderKeys, params.covenantNoCoordPks.map((pk) => Buffer.from(pk, 'hex')), params.covenantQuorum, stakingTimelock, params.unbondingTime);
77
+ }
78
+ export function getDescriptorProviderForStakingParams(stakerBtcInfo, stakingInput, stakingParams) {
79
+ const userKey = Buffer.from(stakerBtcInfo.publicKeyNoCoordHex, 'hex');
80
+ const finalityProviderKeys = stakingInput.finalityProviderPksNoCoordHex.map((pk) => Buffer.from(pk, 'hex'));
81
+ return getDescriptorBuilderForParams(userKey, finalityProviderKeys, stakingInput.stakingTimelock, stakingParams);
82
+ }
83
+ export function getTestnetDescriptorBuilder(userKey, { finalityProviderKeys = [testnetFinalityProvider0], params = getBabylonParamByVersion(5, getStakingParams('testnet')), stakingTimelock = params.minStakingTimeBlocks, } = {}) {
84
+ return getDescriptorBuilderForParams(userKey, finalityProviderKeys, stakingTimelock, params);
85
+ }
86
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Rha2luZ1BhcmFtcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iYWJ5bG9uL3N0YWtpbmdQYXJhbXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLENBQUMsTUFBTSxPQUFPLENBQUM7QUFDM0IsT0FBTyxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN0QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFdEQsT0FBTyxFQUNMLHdCQUF3QixHQUt6QixNQUFNLDJDQUEyQyxDQUFDO0FBQ25ELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBRWpILE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN4RCxPQUFPLGlCQUFpQixNQUFNLHVCQUF1QixDQUFDO0FBQ3RELE9BQU8saUJBQWlCLE1BQU0sdUJBQXVCLENBQUM7QUFDdEQsT0FBTyxFQUFzQixnQkFBZ0IsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVqRSxnRUFBZ0U7QUFDaEUsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQy9CLFlBQVksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDL0IsZUFBZSxFQUFFLENBQUMsQ0FBQyxNQUFNO0lBQ3pCLHFCQUFxQixFQUFFLEVBQUUsQ0FBQyxnQkFBZ0I7SUFDMUMscUJBQXFCLEVBQUUsRUFBRSxDQUFDLGdCQUFnQjtJQUMxQyx1QkFBdUIsRUFBRSxDQUFDLENBQUMsTUFBTTtJQUNqQyx1QkFBdUIsRUFBRSxDQUFDLENBQUMsTUFBTTtJQUNqQyxrQkFBa0IsRUFBRSxDQUFDLENBQUMsTUFBTTtJQUM1Qix1QkFBdUIsRUFBRSxFQUFFLENBQUMsZ0JBQWdCO0lBQzVDLGFB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QUMsRUFDakQsTUFBTSxHQUFHLHdCQUF3QixDQUFDLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUNqRSxlQUFlLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixNQUszQyxFQUFFO0lBRU4sT0FBTyw2QkFBNkIsQ0FBQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsZUFBZSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQy9GLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyB0IGZyb20gJ2lvLXRzJztcbmltcG9ydCAqIGFzIHR0IGZyb20gJ2lvLXRzLXR5cGVzJztcbmltcG9ydCB7IGlzTGVmdCB9IGZyb20gJ2ZwLXRzL0VpdGhlcic7XG5pbXBvcnQgeyBQYXRoUmVwb3J0ZXIgfSBmcm9tICdpby10cy9saWIvUGF0aFJlcG9ydGVyJztcbmltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvLWJldGEvdXR4by1saWInO1xuaW1wb3J0IHtcbiAgZ2V0QmFieWxvblBhcmFtQnlWZXJzaW9uLFxuICBTdGFrZXJJbmZvLFxuICBTdGFraW5nSW5wdXRzLFxuICBTdGFraW5nUGFyYW1zLFxuICBWZXJzaW9uZWRTdGFraW5nUGFyYW1zLFxufSBmcm9tICdAYml0Z28tYmV0YS9iYWJ5bG9ubGFicy1pby1idGMtc3Rha2luZy10cyc7XG5leHBvcnQgeyBnZXRCYWJ5bG9uUGFyYW1CeVZlcnNpb24sIGdldEJhYnlsb25QYXJhbUJ5QnRjSGVpZ2h0IH0gZnJvbSAnQGJpdGdvLWJldGEvYmFieWxvbmxhYnMtaW8tYnRjLXN0YWtpbmctdHMnO1xuXG5pbXBvcnQgeyBCYWJ5bG9uRGVzY3JpcHRvckJ1aWxkZXIgfSBmcm9tICcuL2Rlc2NyaXB0b3InO1xuaW1wb3J0IGpzb25NYWlubmV0UGFyYW1zIGZyb20gJy4vcGFyYW1zLm1haW5uZXQuanNvbic7XG5pbXBvcnQganNvblRlc3RuZXRQYXJhbXMgZnJvbSAnLi9wYXJhbXMudGVzdG5ldC5qc29uJztcbmltcG9ydCB7IEJhYnlsb25OZXR3b3JrTGlrZSwgdG9CYWJ5bG9uTmV0d29yayB9IGZyb20gJy4vbmV0d29yayc7XG5cbi8qKiBAc2VlIGh0dHBzOi8vZG9jcy5iYWJ5bG9ubGFicy5pby9hcGkvYmFieWxvbi1nUlBDL3BhcmFtcy8gKi9cbmNvbnN0IEJhYnlsb25QYXJhbXNKU09OID0gdC50eXBlKHtcbiAgY292ZW5hbnRfcGtzOiB0LmFycmF5KHQuc3RyaW5nKSxcbiAgY292ZW5hbnRfcXVvcnVtOiB0Lm51bWJlcixcbiAgbWluX3N0YWtpbmdfdmFsdWVfc2F0OiB0dC5OdW1iZXJGcm9tU3RyaW5nLFxuICBtYXhfc3Rha2luZ192YWx1ZV9zYXQ6IHR0Lk51bWJlckZyb21TdHJpbmcsXG4gIG1pbl9zdGFraW5nX3RpbWVfYmxvY2tzOiB0Lm51bWJlcixcbiAgbWF4X3N0YWtpbmdfdGltZV9ibG9ja3M6IHQubnVtYmVyLFxuICBzbGFzaGluZ19wa19zY3JpcHQ6IHQuc3RyaW5nLFxuICBtaW5fc2xhc2hpbmdfdHhfZmVlX3NhdDogdHQuTnVtYmVyRnJvbVN0cmluZyxcbiAgc2xhc2hpbmdfcmF0ZTogdC5zdHJpbmcsXG4gIHVuYm9uZGluZ190aW1lX2Jsb2NrczogdC5udW1iZXIsXG4gIHVuYm9uZGluZ19mZWVfc2F0OiB0dC5OdW1iZXJGcm9tU3RyaW5nLFxuICBtaW5fY29tbWlzc2lvbl9yYXRlOiB0dC5OdW1iZXJGcm9tU3RyaW5nLFxuICBkZWxlZ2F0aW9uX2NyZWF0aW9uX2Jhc2VfZ2FzX2ZlZTogdHQuTnVtYmVyRnJvbVN0cmluZyxcbiAgYWxsb3dfbGlzdF9leHBpcmF0aW9uX2hlaWdodDogdHQuTnVtYmVyRnJvbVN0cmluZyxcbiAgYnRjX2FjdGl2YXRpb25faGVpZ2h0OiB0Lm51bWJlcixcbn0pO1xuXG50eXBlIEJhYnlsb25QYXJhbXNKU09OID0gdC5UeXBlT2Y8dHlwZW9mIEJhYnlsb25QYXJhbXNKU09OPjtcblxuZXhwb3J0IGZ1bmN0aW9uIHRvVmVyc2lvbmVkUGFyYW1zKHBzOiBCYWJ5bG9uUGFyYW1zSlNPTltdKTogVmVyc2lvbmVkU3Rha2luZ1BhcmFtc1tdIHtcbiAgcmV0dXJuIHBzLm1hcCgocCwgdmVyc2lvbikgPT4gKHtcbiAgICB2ZXJzaW9uLFxuICAgIGJ0Y0FjdGl2YXRpb25IZWlnaHQ6IHAuYnRjX2FjdGl2YXRpb25faGVpZ2h0LFxuICAgIGNvdmVuYW50Tm9Db29yZFBrczogcC5jb3ZlbmFudF9wa3MsXG4gICAgY292ZW5hbnRRdW9ydW06IHAuY292ZW5hbnRfcXVvcnVtLFxuICAgIHVuYm9uZGluZ1RpbWU6IHAudW5ib25kaW5nX3RpbWVfYmxvY2tzLFxuICAgIHVuYm9uZGluZ0ZlZVNhdDogcC51bmJvbmRpbmdfZmVlX3NhdCxcbiAgICBtYXhTdGFraW5nQW1vdW50U2F0OiBwLm1heF9zdGFraW5nX3ZhbHVlX3NhdCxcbiAgICBtaW5TdGFraW5nQW1vdW50U2F0OiBwLm1pbl9zdGFraW5nX3ZhbHVlX3NhdCxcbiAgICBtYXhTdGFraW5nVGltZUJsb2NrczogcC5tYXhfc3Rha2luZ190aW1lX2Jsb2NrcyxcbiAgICBtaW5TdGFraW5nVGltZUJsb2NrczogcC5taW5fc3Rha2luZ190aW1lX2Jsb2NrcyxcbiAgICBzbGFzaGluZzoge1xuICAgICAgc2xhc2hpbmdQa1NjcmlwdEhleDogQnVmZmVyLmZyb20ocC5zbGFzaGluZ19wa19zY3JpcHQsICdiYXNlNjQnKS50b1N0cmluZygnaGV4JyksXG4gICAgICBzbGFzaGluZ1JhdGU6IHBhcnNlRmxvYXQocC5zbGFzaGluZ19yYXRlKSxcbiAgICAgIG1pblNsYXNoaW5nVHhGZWVTYXQ6IHAubWluX3NsYXNoaW5nX3R4X2ZlZV9zYXQsXG4gICAgfSxcbiAgfSkpO1xufVxuXG5mdW5jdGlvbiB0b1ZlcnNpb25lZFBhcmFtc0Zyb21Kc29uKGpzb25QYXJhbXM6IHVua25vd25bXSk6IFZlcnNpb25lZFN0YWtpbmdQYXJhbXNbXSB7XG4gIHJldHVybiB0b1ZlcnNpb25lZFBhcmFtcyhcbiAgICBqc29uUGFyYW1zLm1hcCgocCk6IEJhYnlsb25QYXJhbXNKU09OID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHQudHlwZSh7IHBhcmFtczogQmFieWxvblBhcmFtc0pTT04gfSkuZGVjb2RlKHApO1xuICAgICAgaWYgKGlzTGVmdChyZXN1bHQpKSB7XG4gICAgICAgIGNvbnN0IG1zZyA9IFBhdGhSZXBvcnRlci5yZXBvcnQocmVzdWx0KS5qb2luKCdcXG4nKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBhcmFtczogJHttc2d9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0LnJpZ2h0LnBhcmFtcztcbiAgICB9KVxuICApO1xufVxuXG5leHBvcnQgY29uc3QgbWFpbm5ldFN0YWtpbmdQYXJhbXM6IHJlYWRvbmx5IFZlcnNpb25lZFN0YWtpbmdQYXJhbXNbXSA9IE9iamVjdC5mcmVlemUoXG4gIHRvVmVyc2lvbmVkUGFyYW1zRnJvbUpzb24oanNvbk1haW5uZXRQYXJhbXMpXG4pO1xuXG5leHBvcnQgY29uc3QgdGVzdG5ldFN0YWtpbmdQYXJhbXM6IHJlYWRvbmx5IFZlcnNpb25lZFN0YWtpbmdQYXJhbXNbXSA9IE9iamVjdC5mcmVlemUoXG4gIHRvVmVyc2lvbmVkUGFyYW1zRnJvbUpzb24oanNvblRlc3RuZXRQYXJhbXMpXG4pO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3Rha2luZ1BhcmFtcyhuZXR3b3JrOiBCYWJ5bG9uTmV0d29ya0xpa2UpOiBWZXJzaW9uZWRTdGFraW5nUGFyYW1zW10ge1xuICBzd2l0Y2ggKHRvQmFieWxvbk5ldHdvcmsobmV0d29yaykpIHtcbiAgICBjYXNlICdtYWlubmV0JzpcbiAgICAgIHJldHVybiBbLi4ubWFpbm5ldFN0YWtpbmdQYXJhbXNdO1xuICAgIGNhc2UgJ3Rlc3RuZXQnOlxuICAgICAgcmV0dXJuIFsuLi50ZXN0bmV0U3Rha2luZ1BhcmFtc107XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgbmV0d29yaycpO1xuICB9XG59XG5cbi8vIFNvdXJjZTogaHR0cHM6Ly9idGNzdGFraW5nLnRlc3RuZXQuYmFieWxvbmxhYnMuaW8vIFwiQmFieWxvbiBGb3VuZGF0aW9uIDBcIlxuZXhwb3J0IGNvbnN0IHRlc3RuZXRGaW5hbGl0eVByb3ZpZGVyMCA9IEJ1ZmZlci5mcm9tKFxuICAnZDIzYzJjMjVlMWZjZjhmZDFjMjFiOWE0MDJjMTllMmUzMDllNTMxZTQ1ZTkyZmIxZTk4MDViNjA1NmIwY2M3NicsXG4gICdoZXgnXG4pO1xuXG50eXBlIERlc2NyaXB0b3JTdGFraW5nUGFyYW1zID0gUGljazxcbiAgU3Rha2luZ1BhcmFtcyxcbiAgJ2NvdmVuYW50Tm9Db29yZFBrcycgfCAnY292ZW5hbnRRdW9ydW0nIHwgJ21pblN0YWtpbmdUaW1lQmxvY2tzJyB8ICd1bmJvbmRpbmdUaW1lJ1xuPjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldERlc2NyaXB0b3JCdWlsZGVyRm9yUGFyYW1zKFxuICB1c2VyS2V5OiB1dHhvbGliLkJJUDMySW50ZXJmYWNlIHwgdXR4b2xpYi5FQ1BhaXJJbnRlcmZhY2UgfCBCdWZmZXIsXG4gIGZpbmFsaXR5UHJvdmlkZXJLZXlzOiBCdWZmZXJbXSxcbiAgc3Rha2luZ1RpbWVsb2NrOiBudW1iZXIsXG4gIHBhcmFtczogRGVzY3JpcHRvclN0YWtpbmdQYXJhbXNcbik6IEJhYnlsb25EZXNjcmlwdG9yQnVpbGRlciB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKHVzZXJLZXkpKSB7XG4gICAgdXNlcktleSA9IHVzZXJLZXkucHVibGljS2V5O1xuICB9XG4gIHJldHVybiBuZXcgQmFieWxvbkRlc2NyaXB0b3JCdWlsZGVyKFxuICAgIHVzZXJLZXksXG4gICAgZmluYWxpdHlQcm92aWRlcktleXMsXG4gICAgcGFyYW1zLmNvdmVuYW50Tm9Db29yZFBrcy5tYXAoKHBrKSA9PiBCdWZmZXIuZnJvbShwaywgJ2hleCcpKSxcbiAgICBwYXJhbXMuY292ZW5hbnRRdW9ydW0sXG4gICAgc3Rha2luZ1RpbWVsb2NrLFxuICAgIHBhcmFtcy51bmJvbmRpbmdUaW1lXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZXNjcmlwdG9yUHJvdmlkZXJGb3JTdGFraW5nUGFyYW1zKFxuICBzdGFrZXJCdGNJbmZvOiBQaWNrPFN0YWtlckluZm8sICdwdWJsaWNLZXlOb0Nvb3JkSGV4Jz4sXG4gIHN0YWtpbmdJbnB1dDogU3Rha2luZ0lucHV0cyxcbiAgc3Rha2luZ1BhcmFtczogRGVzY3JpcHRvclN0YWtpbmdQYXJhbXNcbik6IEJhYnlsb25EZXNjcmlwdG9yQnVpbGRlciB7XG4gIGNvbnN0IHVzZXJLZXkgPSBCdWZmZXIuZnJvbShzdGFrZXJCdGNJbmZvLnB1YmxpY0tleU5vQ29vcmRIZXgsICdoZXgnKTtcbiAgY29uc3QgZmluYWxpdHlQcm92aWRlcktleXMgPSBzdGFraW5nSW5wdXQuZmluYWxpdHlQcm92aWRlclBrc05vQ29vcmRIZXgubWFwKChwaykgPT4gQnVmZmVyLmZyb20ocGssICdoZXgnKSk7XG4gIHJldHVybiBnZXREZXNjcmlwdG9yQnVpbGRlckZvclBhcmFtcyh1c2VyS2V5LCBmaW5hbGl0eVByb3ZpZGVyS2V5cywgc3Rha2luZ0lucHV0LnN0YWtpbmdUaW1lbG9jaywgc3Rha2luZ1BhcmFtcyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUZXN0bmV0RGVzY3JpcHRvckJ1aWxkZXIoXG4gIHVzZXJLZXk6IHV0eG9saWIuQklQMzJJbnRlcmZhY2UgfCB1dHhvbGliLkVDUGFpckludGVyZmFjZSB8IEJ1ZmZlcixcbiAge1xuICAgIGZpbmFsaXR5UHJvdmlkZXJLZXlzID0gW3Rlc3RuZXRGaW5hbGl0eVByb3ZpZGVyMF0sXG4gICAgcGFyYW1zID0gZ2V0QmFieWxvblBhcmFtQnlWZXJzaW9uKDUsIGdldFN0YWtpbmdQYXJhbXMoJ3Rlc3RuZXQnKSksXG4gICAgc3Rha2luZ1RpbWVsb2NrID0gcGFyYW1zLm1pblN0YWtpbmdUaW1lQmxvY2tzLFxuICB9OiB7XG4gICAgZmluYWxpdHlQcm92aWRlcktleXM/OiBCdWZmZXJbXTtcbiAgICBwYXJhbXM/OiBTdGFraW5nUGFyYW1zO1xuICAgIHN0YWtpbmdUaW1lbG9jaz86IG51bWJlcjtcbiAgfSA9IHt9XG4pOiBCYWJ5bG9uRGVzY3JpcHRvckJ1aWxkZXIge1xuICByZXR1cm4gZ2V0RGVzY3JpcHRvckJ1aWxkZXJGb3JQYXJhbXModXNlcktleSwgZmluYWxpdHlQcm92aWRlcktleXMsIHN0YWtpbmdUaW1lbG9jaywgcGFyYW1zKTtcbn1cbiJdfQ==
@@ -0,0 +1,24 @@
1
+ import * as t from 'io-ts';
2
+ import { PartialSig } from 'bip174/src/lib/interfaces';
3
+ /** As returned by https://babylon.nodes.guru/api#/Query/BTCDelegation */
4
+ export declare const Signature: t.TypeC<{
5
+ pk: t.StringC;
6
+ sig: t.StringC;
7
+ }>;
8
+ /** As returned by https://babylon.nodes.guru/api#/Query/BTCDelegation */
9
+ export declare const UndelegationResponse: t.TypeC<{
10
+ /** Network-formatted transaction hex */
11
+ unbonding_tx_hex: t.StringC;
12
+ /** List of signatures for the unbonding covenant */
13
+ covenant_unbonding_sig_list: t.ArrayC<t.TypeC<{
14
+ pk: t.StringC;
15
+ sig: t.StringC;
16
+ }>>;
17
+ }>;
18
+ export type UndelegationResponse = t.TypeOf<typeof UndelegationResponse>;
19
+ /** Converts a gRPC signature to a PartialSig as used by bitcoinjs-lib and utxo-lib */
20
+ export declare function toPartialSig(grpcSig: {
21
+ pk: string;
22
+ sig: string;
23
+ }): PartialSig;
24
+ //# sourceMappingURL=UndelegationResponse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UndelegationResponse.d.ts","sourceRoot":"","sources":["../../../../src/babylon/undelegation/UndelegationResponse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,OAAO,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAEvD,yEAAyE;AACzE,eAAO,MAAM,SAAS;;;EAAuD,CAAC;AAE9E,yEAAyE;AACzE,eAAO,MAAM,oBAAoB;IAE7B,wCAAwC;;IAExC,oDAAoD;;;;;EAIvD,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAEzE,sFAAsF;AACtF,wBAAgB,YAAY,CAAC,OAAO,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,UAAU,CAK7E"}
@@ -0,0 +1,18 @@
1
+ import * as t from 'io-ts';
2
+ /** As returned by https://babylon.nodes.guru/api#/Query/BTCDelegation */
3
+ export const Signature = t.type({ pk: t.string, sig: t.string }, 'Signature');
4
+ /** As returned by https://babylon.nodes.guru/api#/Query/BTCDelegation */
5
+ export const UndelegationResponse = t.type({
6
+ /** Network-formatted transaction hex */
7
+ unbonding_tx_hex: t.string,
8
+ /** List of signatures for the unbonding covenant */
9
+ covenant_unbonding_sig_list: t.array(Signature),
10
+ }, 'UndelegationResponse');
11
+ /** Converts a gRPC signature to a PartialSig as used by bitcoinjs-lib and utxo-lib */
12
+ export function toPartialSig(grpcSig) {
13
+ return {
14
+ pubkey: Buffer.from(grpcSig.pk, 'hex'),
15
+ signature: Buffer.from(grpcSig.sig, 'base64'),
16
+ };
17
+ }
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVW5kZWxlZ2F0aW9uUmVzcG9uc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYmFieWxvbi91bmRlbGVnYXRpb24vVW5kZWxlZ2F0aW9uUmVzcG9uc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLENBQUMsTUFBTSxPQUFPLENBQUM7QUFHM0IseUVBQXlFO0FBQ3pFLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQztBQUU5RSx5RUFBeUU7QUFDekUsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FDeEM7SUFDRSx3Q0FBd0M7SUFDeEMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLE1BQU07SUFDMUIsb0RBQW9EO0lBQ3BELDJCQUEyQixFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDO0NBQ2hELEVBQ0Qsc0JBQXNCLENBQ3ZCLENBQUM7QUFJRixzRkFBc0Y7QUFDdEYsTUFBTSxVQUFVLFlBQVksQ0FBQyxPQUFvQztJQUMvRCxPQUFPO1FBQ0wsTUFBTSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUM7UUFDdEMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUM7S0FDOUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyB0IGZyb20gJ2lvLXRzJztcbmltcG9ydCB7IFBhcnRpYWxTaWcgfSBmcm9tICdiaXAxNzQvc3JjL2xpYi9pbnRlcmZhY2VzJztcblxuLyoqIEFzIHJldHVybmVkIGJ5IGh0dHBzOi8vYmFieWxvbi5ub2Rlcy5ndXJ1L2FwaSMvUXVlcnkvQlRDRGVsZWdhdGlvbiAqL1xuZXhwb3J0IGNvbnN0IFNpZ25hdHVyZSA9IHQudHlwZSh7IHBrOiB0LnN0cmluZywgc2lnOiB0LnN0cmluZyB9LCAnU2lnbmF0dXJlJyk7XG5cbi8qKiBBcyByZXR1cm5lZCBieSBodHRwczovL2JhYnlsb24ubm9kZXMuZ3VydS9hcGkjL1F1ZXJ5L0JUQ0RlbGVnYXRpb24gKi9cbmV4cG9ydCBjb25zdCBVbmRlbGVnYXRpb25SZXNwb25zZSA9IHQudHlwZShcbiAge1xuICAgIC8qKiBOZXR3b3JrLWZvcm1hdHRlZCB0cmFuc2FjdGlvbiBoZXggKi9cbiAgICB1bmJvbmRpbmdfdHhfaGV4OiB0LnN0cmluZyxcbiAgICAvKiogTGlzdCBvZiBzaWduYXR1cmVzIGZvciB0aGUgdW5ib25kaW5nIGNvdmVuYW50ICovXG4gICAgY292ZW5hbnRfdW5ib25kaW5nX3NpZ19saXN0OiB0LmFycmF5KFNpZ25hdHVyZSksXG4gIH0sXG4gICdVbmRlbGVnYXRpb25SZXNwb25zZSdcbik7XG5cbmV4cG9ydCB0eXBlIFVuZGVsZWdhdGlvblJlc3BvbnNlID0gdC5UeXBlT2Y8dHlwZW9mIFVuZGVsZWdhdGlvblJlc3BvbnNlPjtcblxuLyoqIENvbnZlcnRzIGEgZ1JQQyBzaWduYXR1cmUgdG8gYSBQYXJ0aWFsU2lnIGFzIHVzZWQgYnkgYml0Y29pbmpzLWxpYiBhbmQgdXR4by1saWIgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1BhcnRpYWxTaWcoZ3JwY1NpZzogeyBwazogc3RyaW5nOyBzaWc6IHN0cmluZyB9KTogUGFydGlhbFNpZyB7XG4gIHJldHVybiB7XG4gICAgcHVia2V5OiBCdWZmZXIuZnJvbShncnBjU2lnLnBrLCAnaGV4JyksXG4gICAgc2lnbmF0dXJlOiBCdWZmZXIuZnJvbShncnBjU2lnLnNpZywgJ2Jhc2U2NCcpLFxuICB9O1xufVxuIl19
@@ -0,0 +1,3 @@
1
+ export * from './unbonding';
2
+ export * from './UndelegationResponse';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/babylon/undelegation/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,wBAAwB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './unbonding';
2
+ export * from './UndelegationResponse';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYmFieWxvbi91bmRlbGVnYXRpb24vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyx3QkFBd0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vdW5ib25kaW5nJztcbmV4cG9ydCAqIGZyb20gJy4vVW5kZWxlZ2F0aW9uUmVzcG9uc2UnO1xuIl19
@@ -0,0 +1,16 @@
1
+ import * as utxolib from '@bitgo-beta/utxo-lib';
2
+ import { PartialSig, WitnessUtxo } from 'bip174/src/lib/interfaces';
3
+ import { Descriptor } from '@bitgo/wasm-utxo';
4
+ /**
5
+ * Asserts that the provided signatures are valid for the given PSBT input.
6
+ */
7
+ export declare function assertValidSignatures(psbt: utxolib.bitgo.UtxoPsbt, inputIndex: number, signatures: PartialSig[]): void;
8
+ /**
9
+ * @return unsigned PSBT for an unbonding transaction
10
+ */
11
+ export declare function toUnbondingPsbt(tx: utxolib.bitgo.UtxoTransaction<bigint>, witnessUtxo: WitnessUtxo, stakingDescriptor: Descriptor, network: utxolib.Network): utxolib.bitgo.UtxoPsbt;
12
+ /**
13
+ * @return PSBT for an unbonding transaction with signatures
14
+ */
15
+ export declare function toUnbondingPsbtWithSignatures(tx: utxolib.bitgo.UtxoTransaction<bigint>, witnessUtxo: WitnessUtxo, stakingDescriptor: Descriptor, signatures: PartialSig[], network: utxolib.Network): utxolib.bitgo.UtxoPsbt;
16
+ //# sourceMappingURL=unbonding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unbonding.d.ts","sourceRoot":"","sources":["../../../../src/babylon/undelegation/unbonding.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,UAAU,EAAmB,MAAM,kBAAkB,CAAC;AAiB/D;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,EAC5B,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,UAAU,EAAE,GACvB,IAAI,CAON;AAQD;;GAEG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,EACzC,WAAW,EAAE,WAAW,EACxB,iBAAiB,EAAE,UAAU,EAC7B,OAAO,EAAE,OAAO,CAAC,OAAO,GACvB,OAAO,CAAC,KAAK,CAAC,QAAQ,CA4BxB;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAC3C,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,EACzC,WAAW,EAAE,WAAW,EACxB,iBAAiB,EAAE,UAAU,EAC7B,UAAU,EAAE,UAAU,EAAE,EACxB,OAAO,EAAE,OAAO,CAAC,OAAO,GACvB,OAAO,CAAC,KAAK,CAAC,QAAQ,CAMxB"}
@@ -0,0 +1,70 @@
1
+ import assert from 'assert';
2
+ import * as utxolib from '@bitgo-beta/utxo-lib';
3
+ import { Miniscript, ast } from '@bitgo/wasm-utxo';
4
+ import { findTapLeafScript, toUtxoPsbt, toWrappedPsbt } from '@bitgo-beta/utxo-core/descriptor';
5
+ import { parseStakingDescriptor } from '../parseDescriptor';
6
+ /**
7
+ * Adds covenant signatures to a PSBT input.
8
+ */
9
+ function addCovenantSignatures(psbt, inputIndex, signatures) {
10
+ const input = psbt.data.inputs[inputIndex];
11
+ assert(input.tapLeafScript, 'Input must have tapLeafScript');
12
+ assert(input.tapLeafScript.length === 1, 'Input must have exactly one tapLeafScript');
13
+ const [{ controlBlock, script }] = input.tapLeafScript;
14
+ const leafHash = utxolib.taproot.getTapleafHash(utxolib.ecc, controlBlock, script);
15
+ psbt.updateInput(inputIndex, { tapScriptSig: signatures.map((s) => ({ ...s, leafHash })) });
16
+ }
17
+ /**
18
+ * Asserts that the provided signatures are valid for the given PSBT input.
19
+ */
20
+ export function assertValidSignatures(psbt, inputIndex, signatures) {
21
+ signatures.forEach((s) => {
22
+ assert(psbt.validateTaprootSignaturesOfInput(inputIndex, s.pubkey), `Signature validation failed for ${s.pubkey.toString('hex')}`);
23
+ });
24
+ }
25
+ function getUnbondingScript(stakingDescriptor) {
26
+ const parsedDescriptor = parseStakingDescriptor(stakingDescriptor);
27
+ assert(parsedDescriptor, 'Invalid staking descriptor');
28
+ return Miniscript.fromString(ast.formatNode(parsedDescriptor.unbondingMiniscriptNode), 'tap');
29
+ }
30
+ /**
31
+ * @return unsigned PSBT for an unbonding transaction
32
+ */
33
+ export function toUnbondingPsbt(tx, witnessUtxo, stakingDescriptor, network) {
34
+ const unbondingScript = getUnbondingScript(stakingDescriptor);
35
+ const psbt = new utxolib.Psbt({ network });
36
+ psbt.setVersion(tx.version);
37
+ psbt.setLocktime(tx.locktime);
38
+ psbt.addOutputs(tx.outs.map((output) => ({
39
+ script: output.script,
40
+ value: BigInt(output.value),
41
+ })));
42
+ assert(tx.ins.length === 1);
43
+ const input = tx.ins[0];
44
+ psbt.addInput({
45
+ hash: input.hash,
46
+ index: input.index,
47
+ sequence: input.sequence,
48
+ witnessUtxo,
49
+ });
50
+ const wrappedPsbt = toWrappedPsbt(psbt);
51
+ wrappedPsbt.updateInputWithDescriptor(0, stakingDescriptor);
52
+ const unwrapped = toUtxoPsbt(wrappedPsbt, network);
53
+ assert(unwrapped.data.inputs.length === 1, 'Unbonding transaction must have exactly one input');
54
+ const unwrappedInputData = unwrapped.data.inputs[0];
55
+ assert(unwrappedInputData.tapLeafScript);
56
+ const unwrappedUnbond = findTapLeafScript(unwrappedInputData.tapLeafScript, unbondingScript);
57
+ unwrappedInputData.tapLeafScript = [unwrappedUnbond];
58
+ return unwrapped;
59
+ }
60
+ /**
61
+ * @return PSBT for an unbonding transaction with signatures
62
+ */
63
+ export function toUnbondingPsbtWithSignatures(tx, witnessUtxo, stakingDescriptor, signatures, network) {
64
+ const psbt = toUnbondingPsbt(tx, witnessUtxo, stakingDescriptor, network);
65
+ assert(psbt.data.inputs.length === 1, 'Unbonding transaction must have exactly one input');
66
+ addCovenantSignatures(psbt, 0, signatures);
67
+ assertValidSignatures(psbt, 0, signatures);
68
+ return psbt;
69
+ }
70
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5ib25kaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2JhYnlsb24vdW5kZWxlZ2F0aW9uL3VuYm9uZGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFFNUIsT0FBTyxLQUFLLE9BQU8sTUFBTSxzQkFBc0IsQ0FBQztBQUVoRCxPQUFPLEVBQWMsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFaEcsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFNUQ7O0dBRUc7QUFDSCxTQUFTLHFCQUFxQixDQUFDLElBQTRCLEVBQUUsVUFBa0IsRUFBRSxVQUF3QjtJQUN2RyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMzQyxNQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSwrQkFBK0IsQ0FBQyxDQUFDO0lBQzdELE1BQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsMkNBQTJDLENBQUMsQ0FBQztJQUN0RixNQUFNLENBQUMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDO0lBQ3ZELE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ25GLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLEVBQUUsWUFBWSxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFH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TyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLDZCQUE2QixDQUMzQyxFQUF5QyxFQUN6QyxXQUF3QixFQUN4QixpQkFBNkIsRUFDN0IsVUFBd0IsRUFDeEIsT0FBd0I7SUFFeEIsTUFBTSxJQUFJLEdBQUcsZUFBZSxDQUFDLEVBQUUsRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDMUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsbURBQW1ELENBQUMsQ0FBQztJQUMzRixxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzNDLHFCQUFxQixDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDM0MsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCB7IFBhcnRpYWxTaWcsIFdpdG5lc3NVdHhvIH0gZnJvbSAnYmlwMTc0L3NyYy9saWIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBEZXNjcmlwdG9yLCBNaW5pc2NyaXB0LCBhc3QgfSBmcm9tICdAYml0Z28vd2FzbS11dHhvJztcbmltcG9ydCB7IGZpbmRUYXBMZWFmU2NyaXB0LCB0b1V0eG9Qc2J0LCB0b1dyYXBwZWRQc2J0IH0gZnJvbSAnQGJpdGdvLWJldGEvdXR4by1jb3JlL2Rlc2NyaXB0b3InO1xuXG5pbXBvcnQgeyBwYXJzZVN0YWtpbmdEZXNjcmlwdG9yIH0gZnJvbSAnLi4vcGFyc2VEZXNjcmlwdG9yJztcblxuLyoqXG4gKiBBZGRzIGNvdmVuYW50IHNpZ25hdHVyZXMgdG8gYSBQU0JUIGlucHV0LlxuICovXG5mdW5jdGlvbiBhZGRDb3ZlbmFudFNpZ25hdHVyZXMocHNidDogdXR4b2xpYi5iaXRnby5VdHhvUHNidCwgaW5wdXRJbmRleDogbnVtYmVyLCBzaWduYXR1cmVzOiBQYXJ0aWFsU2lnW10pOiB2b2lkIHtcbiAgY29uc3QgaW5wdXQgPSBwc2J0LmRhdGEuaW5wdXRzW2lucHV0SW5kZXhdO1xuICBhc3NlcnQoaW5wdXQudGFwTGVhZlNjcmlwdCwgJ0lucHV0IG11c3QgaGF2ZSB0YXBMZWFmU2NyaXB0Jyk7XG4gIGFzc2VydChpbnB1dC50YXBMZWFmU2NyaXB0Lmxlbmd0aCA9PT0gMSwgJ0lucHV0IG11c3QgaGF2ZSBleGFjdGx5IG9uZSB0YXBMZWFmU2NyaXB0Jyk7XG4gIGNvbnN0IFt7IGNvbnRyb2xCbG9jaywgc2NyaXB0IH1dID0gaW5wdXQudGFwTGVhZlNjcmlwdDtcbiAgY29uc3QgbGVhZkhhc2ggPSB1dHhvbGliLnRhcHJvb3QuZ2V0VGFwbGVhZkhhc2godXR4b2xpYi5lY2MsIGNvbnRyb2xCbG9jaywgc2NyaXB0KTtcbiAgcHNidC51cGRhdGVJbnB1dChpbnB1dEluZGV4LCB7IHRhcFNjcmlwdFNpZzogc2lnbmF0dXJlcy5tYXAoKHMpID0+ICh7IC4uLnMsIGxlYWZIYXNoIH0pKSB9KTtcbn1cblxuLyoqXG4gKiBBc3NlcnRzIHRoYXQgdGhlIHByb3ZpZGVkIHNpZ25hdHVyZXMgYXJlIHZhbGlkIGZvciB0aGUgZ2l2ZW4gUFNCVCBpbnB1dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFZhbGlkU2lnbmF0dXJlcyhcbiAgcHNidDogdXR4b2xpYi5iaXRnby5VdHhvUHNidCxcbiAgaW5wdXRJbmRleDogbnVtYmVyLFxuICBzaWduYXR1cmVzOiBQYXJ0aWFsU2lnW11cbik6IHZvaWQge1xuICBzaWduYXR1cmVzLmZvckVhY2goKHMpID0+IHtcbiAgICBhc3NlcnQoXG4gICAgICBwc2J0LnZhbGlkYXRlVGFwcm9vdFNpZ25hdHVyZXNPZklucHV0KGlucHV0SW5kZXgsIHMucHVia2V5KSxcbiAgICAgIGBTaWduYXR1cmUgdmFsaWRhdGlvbiBmYWlsZWQgZm9yICR7cy5wdWJrZXkudG9TdHJpbmcoJ2hleCcpfWBcbiAgICApO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0VW5ib25kaW5nU2NyaXB0KHN0YWtpbmdEZXNjcmlwdG9yOiBEZXNjcmlwdG9yKTogTWluaXNjcmlwdCB7XG4gIGNvbnN0IHBhcnNlZERlc2NyaXB0b3IgPSBwYXJzZVN0YWtpbmdEZXNjcmlwdG9yKHN0YWtpbmdEZXNjcmlwdG9yKTtcbiAgYXNzZXJ0KHBhcnNlZERlc2NyaXB0b3IsICdJbnZhbGlkIHN0YWtpbmcgZGVzY3JpcHRvcicpO1xuICByZXR1cm4gTWluaXNjcmlwdC5mcm9tU3RyaW5nKGFzdC5mb3JtYXROb2RlKHBhcnNlZERlc2NyaXB0b3IudW5ib25kaW5nTWluaXNjcmlwdE5vZGUpLCAndGFwJyk7XG59XG5cbi8qKlxuICogQHJldHVybiB1bnNpZ25lZCBQU0JUIGZvciBhbiB1bmJvbmRpbmcgdHJhbnNhY3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvVW5ib25kaW5nUHNidChcbiAgdHg6IHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uPGJpZ2ludD4sXG4gIHdpdG5lc3NVdHhvOiBXaXRuZXNzVXR4byxcbiAgc3Rha2luZ0Rlc2NyaXB0b3I6IERlc2NyaXB0b3IsXG4gIG5ldHdvcms6IHV0eG9saWIuTmV0d29ya1xuKTogdXR4b2xpYi5iaXRnby5VdHhvUHNidCB7XG4gIGNvbnN0IHVuYm9uZGluZ1NjcmlwdCA9IGdldFVuYm9uZGluZ1NjcmlwdChzdGFraW5nRGVzY3JpcHRvcik7XG4gIGNvbnN0IHBzYnQgPSBuZXcgdXR4b2xpYi5Qc2J0KHsgbmV0d29yayB9KTtcbiAgcHNidC5zZXRWZXJzaW9uKHR4LnZlcnNpb24pO1xuICBwc2J0LnNldExvY2t0aW1lKHR4LmxvY2t0aW1lKTtcbiAgcHNidC5hZGRPdXRwdXRzKFxuICAgIHR4Lm91dHMubWFwKChvdXRwdXQpID0+ICh7XG4gICAgICBzY3JpcHQ6IG91dHB1dC5zY3JpcHQsXG4gICAgICB2YWx1ZTogQmlnSW50KG91dHB1dC52YWx1ZSksXG4gICAgfSkpXG4gICk7XG4gIGFzc2VydCh0eC5pbnMubGVuZ3RoID09PSAxKTtcbiAgY29uc3QgaW5wdXQgPSB0eC5pbnNbMF07XG4gIHBzYnQuYWRkSW5wdXQoe1xuICAgIGhhc2g6IGlucHV0Lmhhc2gsXG4gICAgaW5kZXg6IGlucHV0LmluZGV4LFxuICAgIHNlcXVlbmNlOiBpbnB1dC5zZXF1ZW5jZSxcbiAgICB3aXRuZXNzVXR4byxcbiAgfSk7XG4gIGNvbnN0IHdyYXBwZWRQc2J0ID0gdG9XcmFwcGVkUHNidChwc2J0KTtcbiAgd3JhcHBlZFBzYnQudXBkYXRlSW5wdXRXaXRoRGVzY3JpcHRvcigwLCBzdGFraW5nRGVzY3JpcHRvcik7XG4gIGNvbnN0IHVud3JhcHBlZCA9IHRvVXR4b1BzYnQod3JhcHBlZFBzYnQsIG5ldHdvcmspO1xuICBhc3NlcnQodW53cmFwcGVkLmRhdGEuaW5wdXRzLmxlbmd0aCA9PT0gMSwgJ1VuYm9uZGluZyB0cmFuc2FjdGlvbiBtdXN0IGhhdmUgZXhhY3RseSBvbmUgaW5wdXQnKTtcbiAgY29uc3QgdW53cmFwcGVkSW5wdXREYXRhID0gdW53cmFwcGVkLmRhdGEuaW5wdXRzWzBdO1xuICBhc3NlcnQodW53cmFwcGVkSW5wdXREYXRhLnRhcExlYWZTY3JpcHQpO1xuICBjb25zdCB1bndyYXBwZWRVbmJvbmQgPSBmaW5kVGFwTGVhZlNjcmlwdCh1bndyYXBwZWRJbnB1dERhdGEudGFwTGVhZlNjcmlwdCwgdW5ib25kaW5nU2NyaXB0KTtcbiAgdW53cmFwcGVkSW5wdXREYXRhLnRhcExlYWZTY3JpcHQgPSBbdW53cmFwcGVkVW5ib25kXTtcbiAgcmV0dXJuIHVud3JhcHBlZDtcbn1cblxuLyoqXG4gKiBAcmV0dXJuIFBTQlQgZm9yIGFuIHVuYm9uZGluZyB0cmFuc2FjdGlvbiB3aXRoIHNpZ25hdHVyZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvVW5ib25kaW5nUHNidFdpdGhTaWduYXR1cmVzKFxuICB0eDogdXR4b2xpYi5iaXRnby5VdHhvVHJhbnNhY3Rpb248YmlnaW50PixcbiAgd2l0bmVzc1V0eG86IFdpdG5lc3NVdHhvLFxuICBzdGFraW5nRGVzY3JpcHRvcjogRGVzY3JpcHRvcixcbiAgc2lnbmF0dXJlczogUGFydGlhbFNpZ1tdLFxuICBuZXR3b3JrOiB1dHhvbGliLk5ldHdvcmtcbik6IHV0eG9saWIuYml0Z28uVXR4b1BzYnQge1xuICBjb25zdCBwc2J0ID0gdG9VbmJvbmRpbmdQc2J0KHR4LCB3aXRuZXNzVXR4bywgc3Rha2luZ0Rlc2NyaXB0b3IsIG5ldHdvcmspO1xuICBhc3NlcnQocHNidC5kYXRhLmlucHV0cy5sZW5ndGggPT09IDEsICdVbmJvbmRpbmcgdHJhbnNhY3Rpb24gbXVzdCBoYXZlIGV4YWN0bHkgb25lIGlucHV0Jyk7XG4gIGFkZENvdmVuYW50U2lnbmF0dXJlcyhwc2J0LCAwLCBzaWduYXR1cmVzKTtcbiAgYXNzZXJ0VmFsaWRTaWduYXR1cmVzKHBzYnQsIDAsIHNpZ25hdHVyZXMpO1xuICByZXR1cm4gcHNidDtcbn1cbiJdfQ==
@@ -0,0 +1,18 @@
1
+ import { BIP32Interface } from '@bitgo-beta/utxo-lib';
2
+ /**
3
+ * Script type for a descriptor.
4
+ *
5
+ * See https://docs.coredao.org/docs/Learn/products/btc-staking/design#p2shp2wsh-output
6
+ */
7
+ export type ScriptType = 'sh' | 'sh-wsh' | 'wsh';
8
+ /**
9
+ * Create a multi-sig descriptor to produce a coredao staking address
10
+ * @param scriptType segwit or legacy
11
+ * @param locktime locktime for CLTV
12
+ * @param m Total number of keys required to unlock
13
+ * @param orderedKeys If Bip32Interfaces, these are xprvs or xpubs and are derivable.
14
+ * If they are buffers, then they are pub/prv keys and are not derivable.
15
+ * @param neutered If true, neuter the keys. Default to true
16
+ */
17
+ export declare function createMultiSigDescriptor(scriptType: ScriptType, locktime: number, m: number, orderedKeys: (BIP32Interface | Buffer)[], neutered?: boolean): string;
18
+ //# sourceMappingURL=descriptor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"descriptor.d.ts","sourceRoot":"","sources":["../../../src/coreDao/descriptor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,QAAQ,GAAG,KAAK,CAAC;AASjD;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,MAAM,EAChB,CAAC,EAAE,MAAM,EACT,WAAW,EAAE,CAAC,cAAc,GAAG,MAAM,CAAC,EAAE,EACxC,QAAQ,UAAO,GACd,MAAM,CAmBR"}
1
+ {"version":3,"file":"descriptor.d.ts","sourceRoot":"","sources":["../../../src/coreDao/descriptor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,QAAQ,GAAG,KAAK,CAAC;AASjD;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,MAAM,EAChB,CAAC,EAAE,MAAM,EACT,WAAW,EAAE,CAAC,cAAc,GAAG,MAAM,CAAC,EAAE,EACxC,QAAQ,UAAO,GACd,MAAM,CAmBR"}
@@ -0,0 +1,35 @@
1
+ import { ast } from '@bitgo/wasm-utxo';
2
+ function asDescriptorKey(key, neutered) {
3
+ if (Buffer.isBuffer(key)) {
4
+ return key.toString('hex');
5
+ }
6
+ return (neutered ? key.neutered() : key).toBase58() + '/*';
7
+ }
8
+ /**
9
+ * Create a multi-sig descriptor to produce a coredao staking address
10
+ * @param scriptType segwit or legacy
11
+ * @param locktime locktime for CLTV
12
+ * @param m Total number of keys required to unlock
13
+ * @param orderedKeys If Bip32Interfaces, these are xprvs or xpubs and are derivable.
14
+ * If they are buffers, then they are pub/prv keys and are not derivable.
15
+ * @param neutered If true, neuter the keys. Default to true
16
+ */
17
+ export function createMultiSigDescriptor(scriptType, locktime, m, orderedKeys, neutered = true) {
18
+ if (m > orderedKeys.length || m < 1) {
19
+ throw new Error(`m (${m}) must be less than or equal to the number of keys (${orderedKeys.length}) and greater than 0`);
20
+ }
21
+ if (locktime <= 0) {
22
+ throw new Error(`locktime (${locktime}) must be greater than 0`);
23
+ }
24
+ const keys = orderedKeys.map((key) => asDescriptorKey(key, neutered));
25
+ const inner = { and_v: [{ 'r:after': locktime }, { multi: [m, ...keys] }] };
26
+ switch (scriptType) {
27
+ case 'sh':
28
+ return ast.formatNode({ sh: inner });
29
+ case 'sh-wsh':
30
+ return ast.formatNode({ sh: { wsh: inner } });
31
+ case 'wsh':
32
+ return ast.formatNode({ wsh: inner });
33
+ }
34
+ }
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzY3JpcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb3JlRGFvL2Rlc2NyaXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBU3ZDLFNBQVMsZUFBZSxDQUFDLEdBQTRCLEVBQUUsUUFBaUI7SUFDdEUsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDekIsT0FBTyxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFDRCxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQztBQUM3RCxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsd0JBQXdCLENBQ3RDLFVBQXNCLEVBQ3RCLFFBQWdCLEVBQ2hCLENBQVMsRUFDVCxXQUF3QyxFQUN4QyxRQUFRLEdBQUcsSUFBSTtJQUVmLElBQUksQ0FBQyxHQUFHLFdBQVcsQ0FBQyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sSUFBSSxLQUFLLENBQ2IsTUFBTSxDQUFDLHVEQUF1RCxXQUFXLENBQUMsTUFBTSxzQkFBc0IsQ0FDdkcsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFJLFFBQVEsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNsQixNQUFNLElBQUksS0FBSyxDQUFDLGFBQWEsUUFBUSwwQkFBMEIsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFDRCxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxlQUFlLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDdEUsTUFBTSxLQUFLLEdBQXVCLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUNoRyxRQUFRLFVBQVUsRUFBRSxDQUFDO1FBQ25CLEtBQUssSUFBSTtZQUNQLE9BQU8sR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZDLEtBQUssUUFBUTtZQUNYLE9BQU8sR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDaEQsS0FBSyxLQUFLO1lBQ1IsT0FBTyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDMUMsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCSVAzMkludGVyZmFjZSB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCB7IGFzdCB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8nO1xuXG4vKipcbiAqIFNjcmlwdCB0eXBlIGZvciBhIGRlc2NyaXB0b3IuXG4gKlxuICogU2VlIGh0dHBzOi8vZG9jcy5jb3JlZGFvLm9yZy9kb2NzL0xlYXJuL3Byb2R1Y3RzL2J0Yy1zdGFraW5nL2Rlc2lnbiNwMnNocDJ3c2gtb3V0cHV0XG4gKi9cbmV4cG9ydCB0eXBlIFNjcmlwdFR5cGUgPSAnc2gnIHwgJ3NoLXdzaCcgfCAnd3NoJztcblxuZnVuY3Rpb24gYXNEZXNjcmlwdG9yS2V5KGtleTogQklQMzJJbnRlcmZhY2UgfCBCdWZmZXIsIG5ldXRlcmVkOiBib29sZWFuKTogc3RyaW5nIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihrZXkpKSB7XG4gICAgcmV0dXJuIGtleS50b1N0cmluZygnaGV4Jyk7XG4gIH1cbiAgcmV0dXJuIChuZXV0ZXJlZCA/IGtleS5uZXV0ZXJlZCgpIDoga2V5KS50b0Jhc2U1OCgpICsgJy8qJztcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBtdWx0aS1zaWcgZGVzY3JpcHRvciB0byBwcm9kdWNlIGEgY29yZWRhbyBzdGFraW5nIGFkZHJlc3NcbiAqIEBwYXJhbSBzY3JpcHRUeXBlIHNlZ3dpdCBvciBsZWdhY3lcbiAqIEBwYXJhbSBsb2NrdGltZSBsb2NrdGltZSBmb3IgQ0xUVlxuICogQHBhcmFtIG0gVG90YWwgbnVtYmVyIG9mIGtleXMgcmVxdWlyZWQgdG8gdW5sb2NrXG4gKiBAcGFyYW0gb3JkZXJlZEtleXMgSWYgQmlwMzJJbnRlcmZhY2VzLCB0aGVzZSBhcmUgeHBydnMgb3IgeHB1YnMgYW5kIGFyZSBkZXJpdmFibGUuXG4gKiAgICAgICAgICAgICAgICAgICAgSWYgdGhleSBhcmUgYnVmZmVycywgdGhlbiB0aGV5IGFyZSBwdWIvcHJ2IGtleXMgYW5kIGFyZSBub3QgZGVyaXZhYmxlLlxuICogQHBhcmFtIG5ldXRlcmVkIElmIHRydWUsIG5ldXRlciB0aGUga2V5cy4gRGVmYXVsdCB0byB0cnVlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNdWx0aVNpZ0Rlc2NyaXB0b3IoXG4gIHNjcmlwdFR5cGU6IFNjcmlwdFR5cGUsXG4gIGxvY2t0aW1lOiBudW1iZXIsXG4gIG06IG51bWJlcixcbiAgb3JkZXJlZEtleXM6IChCSVAzMkludGVyZmFjZSB8IEJ1ZmZlcilbXSxcbiAgbmV1dGVyZWQgPSB0cnVlXG4pOiBzdHJpbmcge1xuICBpZiAobSA+IG9yZGVyZWRLZXlzLmxlbmd0aCB8fCBtIDwgMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBtICgke219KSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGtleXMgKCR7b3JkZXJlZEtleXMubGVuZ3RofSkgYW5kIGdyZWF0ZXIgdGhhbiAwYFxuICAgICk7XG4gIH1cbiAgaWYgKGxvY2t0aW1lIDw9IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGxvY2t0aW1lICgke2xvY2t0aW1lfSkgbXVzdCBiZSBncmVhdGVyIHRoYW4gMGApO1xuICB9XG4gIGNvbnN0IGtleXMgPSBvcmRlcmVkS2V5cy5tYXAoKGtleSkgPT4gYXNEZXNjcmlwdG9yS2V5KGtleSwgbmV1dGVyZWQpKTtcbiAgY29uc3QgaW5uZXI6IGFzdC5NaW5pc2NyaXB0Tm9kZSA9IHsgYW5kX3Y6IFt7ICdyOmFmdGVyJzogbG9ja3RpbWUgfSwgeyBtdWx0aTogW20sIC4uLmtleXNdIH1dIH07XG4gIHN3aXRjaCAoc2NyaXB0VHlwZSkge1xuICAgIGNhc2UgJ3NoJzpcbiAgICAgIHJldHVybiBhc3QuZm9ybWF0Tm9kZSh7IHNoOiBpbm5lciB9KTtcbiAgICBjYXNlICdzaC13c2gnOlxuICAgICAgcmV0dXJuIGFzdC5mb3JtYXROb2RlKHsgc2g6IHsgd3NoOiBpbm5lciB9IH0pO1xuICAgIGNhc2UgJ3dzaCc6XG4gICAgICByZXR1cm4gYXN0LmZvcm1hdE5vZGUoeyB3c2g6IGlubmVyIH0pO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,4 @@
1
+ export * from './opReturn';
2
+ export * from './descriptor';
3
+ export * from './transaction';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,4 @@
1
+ export * from './opReturn';
2
+ export * from './descriptor';
3
+ export * from './transaction';
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZURhby9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLFlBQVksQ0FBQztBQUMzQixjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLGVBQWUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vb3BSZXR1cm4nO1xuZXhwb3J0ICogZnJvbSAnLi9kZXNjcmlwdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuIl19
@@ -0,0 +1,41 @@
1
+ export declare const CORE_DAO_DEVNET_CHAIN_ID: Buffer<ArrayBuffer>;
2
+ export declare const CORE_DAO_TESTNET2_CHAIN_ID: Buffer<ArrayBuffer>;
3
+ export declare const CORE_DAO_TESTNET_CHAIN_ID: Buffer<ArrayBuffer>;
4
+ export declare const CORE_DAO_MAINNET_CHAIN_ID: Buffer<ArrayBuffer>;
5
+ export declare const CORE_DAO_SATOSHI_PLUS_IDENTIFIER: Buffer<ArrayBuffer>;
6
+ export declare function encodeTimelock(timelock: number): Buffer;
7
+ export declare function decodeTimelock(buffer: Buffer): number;
8
+ type BaseParams = {
9
+ version: number;
10
+ chainId: Buffer;
11
+ delegator: Buffer;
12
+ validator: Buffer;
13
+ fee: number;
14
+ };
15
+ export type OpReturnParams = BaseParams & ({
16
+ redeemScript: Buffer;
17
+ } | {
18
+ timelock: number;
19
+ });
20
+ /**
21
+ * Create a CoreDAO OP_RETURN output script
22
+ *
23
+ * @param version Version of the OP_RETURN
24
+ * @param chainId Chain ID
25
+ * @param delegator Delegator address
26
+ * @param validator Validator address
27
+ * @param fee Fee for relayer
28
+ * @param redeemScript Redeem script of the staking output
29
+ * @param timelock Timelock for the staking output
30
+ * @returns Buffer OP_RETURN buffer
31
+ */
32
+ export declare function createCoreDaoOpReturnOutputScript({ version, chainId, delegator, validator, fee, ...rest }: OpReturnParams): Buffer;
33
+ /**
34
+ * Parse a CoreDAO OP_RETURN output script into the constituent parts
35
+ * @param script
36
+ * @returns OpReturnParams
37
+ */
38
+ export declare function parseCoreDaoOpReturnOutputScript(script: Buffer): OpReturnParams;
39
+ export declare function toString(params: OpReturnParams): string;
40
+ export {};
41
+ //# sourceMappingURL=opReturn.d.ts.map