@lifi/sdk-provider-bitcoin 4.0.0-alpha.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.
Files changed (133) hide show
  1. package/CHANGELOG.md +1272 -0
  2. package/LICENSE +165 -0
  3. package/README.md +79 -0
  4. package/dist/cjs/BitcoinProvider.d.ts +2 -0
  5. package/dist/cjs/BitcoinProvider.js +37 -0
  6. package/dist/cjs/BitcoinProvider.js.map +1 -0
  7. package/dist/cjs/BitcoinStepExecutor.d.ts +12 -0
  8. package/dist/cjs/BitcoinStepExecutor.js +199 -0
  9. package/dist/cjs/BitcoinStepExecutor.js.map +1 -0
  10. package/dist/cjs/actions/getBitcoinBalance.d.ts +2 -0
  11. package/dist/cjs/actions/getBitcoinBalance.js +28 -0
  12. package/dist/cjs/actions/getBitcoinBalance.js.map +1 -0
  13. package/dist/cjs/actions/resolveBitcoinAddress.d.ts +1 -0
  14. package/dist/cjs/actions/resolveBitcoinAddress.js +7 -0
  15. package/dist/cjs/actions/resolveBitcoinAddress.js.map +1 -0
  16. package/dist/cjs/client/publicClient.d.ts +5 -0
  17. package/dist/cjs/client/publicClient.js +47 -0
  18. package/dist/cjs/client/publicClient.js.map +1 -0
  19. package/dist/cjs/errors/parseBitcoinErrors.d.ts +2 -0
  20. package/dist/cjs/errors/parseBitcoinErrors.js +31 -0
  21. package/dist/cjs/errors/parseBitcoinErrors.js.map +1 -0
  22. package/dist/cjs/index.d.ts +3 -0
  23. package/dist/cjs/index.js +8 -0
  24. package/dist/cjs/index.js.map +1 -0
  25. package/dist/cjs/package.json +1 -0
  26. package/dist/cjs/types.d.ts +9 -0
  27. package/dist/cjs/types.js +8 -0
  28. package/dist/cjs/types.js.map +1 -0
  29. package/dist/cjs/utils/generateRedeemScript.d.ts +1 -0
  30. package/dist/cjs/utils/generateRedeemScript.js +7 -0
  31. package/dist/cjs/utils/generateRedeemScript.js.map +1 -0
  32. package/dist/cjs/utils/isPsbtFinalized.d.ts +2 -0
  33. package/dist/cjs/utils/isPsbtFinalized.js +13 -0
  34. package/dist/cjs/utils/isPsbtFinalized.js.map +1 -0
  35. package/dist/cjs/utils/toBigmiChainId.d.ts +3 -0
  36. package/dist/cjs/utils/toBigmiChainId.js +15 -0
  37. package/dist/cjs/utils/toBigmiChainId.js.map +1 -0
  38. package/dist/cjs/utils/toXOnly.d.ts +1 -0
  39. package/dist/cjs/utils/toXOnly.js +6 -0
  40. package/dist/cjs/utils/toXOnly.js.map +1 -0
  41. package/dist/cjs/version.d.ts +2 -0
  42. package/dist/cjs/version.js +6 -0
  43. package/dist/cjs/version.js.map +1 -0
  44. package/dist/esm/BitcoinProvider.d.ts +2 -0
  45. package/dist/esm/BitcoinProvider.js +34 -0
  46. package/dist/esm/BitcoinProvider.js.map +1 -0
  47. package/dist/esm/BitcoinStepExecutor.d.ts +12 -0
  48. package/dist/esm/BitcoinStepExecutor.js +212 -0
  49. package/dist/esm/BitcoinStepExecutor.js.map +1 -0
  50. package/dist/esm/actions/getBitcoinBalance.d.ts +2 -0
  51. package/dist/esm/actions/getBitcoinBalance.js +24 -0
  52. package/dist/esm/actions/getBitcoinBalance.js.map +1 -0
  53. package/dist/esm/actions/resolveBitcoinAddress.d.ts +1 -0
  54. package/dist/esm/actions/resolveBitcoinAddress.js +5 -0
  55. package/dist/esm/actions/resolveBitcoinAddress.js.map +1 -0
  56. package/dist/esm/client/publicClient.d.ts +11 -0
  57. package/dist/esm/client/publicClient.js +50 -0
  58. package/dist/esm/client/publicClient.js.map +1 -0
  59. package/dist/esm/errors/parseBitcoinErrors.d.ts +2 -0
  60. package/dist/esm/errors/parseBitcoinErrors.js +28 -0
  61. package/dist/esm/errors/parseBitcoinErrors.js.map +1 -0
  62. package/dist/esm/index.d.ts +3 -0
  63. package/dist/esm/index.js +4 -0
  64. package/dist/esm/index.js.map +1 -0
  65. package/dist/esm/package.json +1 -0
  66. package/dist/esm/types.d.ts +9 -0
  67. package/dist/esm/types.js +5 -0
  68. package/dist/esm/types.js.map +1 -0
  69. package/dist/esm/utils/generateRedeemScript.d.ts +6 -0
  70. package/dist/esm/utils/generateRedeemScript.js +10 -0
  71. package/dist/esm/utils/generateRedeemScript.js.map +1 -0
  72. package/dist/esm/utils/isPsbtFinalized.d.ts +2 -0
  73. package/dist/esm/utils/isPsbtFinalized.js +10 -0
  74. package/dist/esm/utils/isPsbtFinalized.js.map +1 -0
  75. package/dist/esm/utils/toBigmiChainId.d.ts +3 -0
  76. package/dist/esm/utils/toBigmiChainId.js +11 -0
  77. package/dist/esm/utils/toBigmiChainId.js.map +1 -0
  78. package/dist/esm/utils/toXOnly.d.ts +1 -0
  79. package/dist/esm/utils/toXOnly.js +3 -0
  80. package/dist/esm/utils/toXOnly.js.map +1 -0
  81. package/dist/esm/version.d.ts +2 -0
  82. package/dist/esm/version.js +3 -0
  83. package/dist/esm/version.js.map +1 -0
  84. package/dist/types/BitcoinProvider.d.ts +3 -0
  85. package/dist/types/BitcoinProvider.d.ts.map +1 -0
  86. package/dist/types/BitcoinStepExecutor.d.ts +13 -0
  87. package/dist/types/BitcoinStepExecutor.d.ts.map +1 -0
  88. package/dist/types/actions/getBitcoinBalance.d.ts +3 -0
  89. package/dist/types/actions/getBitcoinBalance.d.ts.map +1 -0
  90. package/dist/types/actions/resolveBitcoinAddress.d.ts +2 -0
  91. package/dist/types/actions/resolveBitcoinAddress.d.ts.map +1 -0
  92. package/dist/types/client/publicClient.d.ts +12 -0
  93. package/dist/types/client/publicClient.d.ts.map +1 -0
  94. package/dist/types/errors/parseBitcoinErrors.d.ts +3 -0
  95. package/dist/types/errors/parseBitcoinErrors.d.ts.map +1 -0
  96. package/dist/types/index.d.ts +4 -0
  97. package/dist/types/index.d.ts.map +1 -0
  98. package/dist/types/types.d.ts +10 -0
  99. package/dist/types/types.d.ts.map +1 -0
  100. package/dist/types/utils/generateRedeemScript.d.ts +7 -0
  101. package/dist/types/utils/generateRedeemScript.d.ts.map +1 -0
  102. package/dist/types/utils/isPsbtFinalized.d.ts +3 -0
  103. package/dist/types/utils/isPsbtFinalized.d.ts.map +1 -0
  104. package/dist/types/utils/toBigmiChainId.d.ts +4 -0
  105. package/dist/types/utils/toBigmiChainId.d.ts.map +1 -0
  106. package/dist/types/utils/toXOnly.d.ts +2 -0
  107. package/dist/types/utils/toXOnly.d.ts.map +1 -0
  108. package/dist/types/version.d.ts +3 -0
  109. package/dist/types/version.d.ts.map +1 -0
  110. package/package.json +63 -0
  111. package/package.json.tmp +105 -0
  112. package/src/BitcoinProvider.ts +42 -0
  113. package/src/BitcoinProvider.unit.spec.ts +50 -0
  114. package/src/BitcoinStepExecutor.ts +344 -0
  115. package/src/actions/getBitcoinBalance.int.spec.ts +66 -0
  116. package/src/actions/getBitcoinBalance.ts +34 -0
  117. package/src/actions/resolveBitcoinAddress.ts +6 -0
  118. package/src/actions/resolveBitcoinAddress.unit.spec.ts +11 -0
  119. package/src/client/publicClient.ts +85 -0
  120. package/src/errors/parseBitcoinErrors.ts +52 -0
  121. package/src/errors/parseBitcoinErrors.unit.spec.ts +45 -0
  122. package/src/index.ts +4 -0
  123. package/src/types.ts +16 -0
  124. package/src/utils/generateRedeemScript.ts +10 -0
  125. package/src/utils/generateRedeemScript.unit.spec.ts +22 -0
  126. package/src/utils/isPsbtFinalized.ts +10 -0
  127. package/src/utils/isPsbtFinalized.unit.spec.ts +22 -0
  128. package/src/utils/toBigmiChainId.ts +11 -0
  129. package/src/utils/toBigmiChainId.unit.spec.ts +16 -0
  130. package/src/utils/toXOnly.ts +3 -0
  131. package/src/utils/toXOnly.unit.spec.ts +24 -0
  132. package/src/version.ts +2 -0
  133. package/tsconfig.json +18 -0
@@ -0,0 +1,22 @@
1
+ import { payments } from 'bitcoinjs-lib'
2
+ import { describe, expect, it } from 'vitest'
3
+ import { generateRedeemScript } from './generateRedeemScript.js'
4
+
5
+ describe('generateRedeemScript', () => {
6
+ it('should generate redeem script for P2SH address', () => {
7
+ // Use a valid 33-byte compressed public key
8
+ const publicKey = new Uint8Array(33)
9
+ publicKey[0] = 0x02
10
+ publicKey.fill(0x01, 1, 33)
11
+
12
+ const redeemScript = generateRedeemScript(publicKey)
13
+
14
+ expect(redeemScript).toBeDefined()
15
+ expect(redeemScript).toBeInstanceOf(Uint8Array)
16
+ expect(redeemScript!.length).toBeGreaterThan(0)
17
+
18
+ // Verify it's the same as calling payments.p2wpkh directly
19
+ const expected = payments.p2wpkh({ pubkey: publicKey }).output
20
+ expect(redeemScript).toEqual(expected)
21
+ })
22
+ })
@@ -0,0 +1,10 @@
1
+ import type { Psbt } from 'bitcoinjs-lib'
2
+
3
+ export function isPsbtFinalized(psbt: Psbt): boolean {
4
+ try {
5
+ psbt.extractTransaction()
6
+ return true
7
+ } catch (_) {
8
+ return false
9
+ }
10
+ }
@@ -0,0 +1,22 @@
1
+ import { describe, expect, it, vi } from 'vitest'
2
+ import { isPsbtFinalized } from './isPsbtFinalized.js'
3
+
4
+ describe('isPsbtFinalized', () => {
5
+ it('should return true when psbt.extractTransaction() succeeds', () => {
6
+ const finalizedPsbt = {
7
+ extractTransaction: vi.fn().mockReturnValue({}),
8
+ } as any
9
+
10
+ expect(isPsbtFinalized(finalizedPsbt)).toBe(true)
11
+ })
12
+
13
+ it('should return false when psbt.extractTransaction() throws', () => {
14
+ const unsignedPsbt = {
15
+ extractTransaction: vi.fn().mockImplementation(() => {
16
+ throw new Error('Not finalized')
17
+ }),
18
+ } as any
19
+
20
+ expect(isPsbtFinalized(unsignedPsbt)).toBe(false)
21
+ })
22
+ })
@@ -0,0 +1,11 @@
1
+ import { ChainId as BigmiChainId } from '@bigmi/core'
2
+ import { ChainId } from '@lifi/sdk'
3
+
4
+ export const toBigmiChainId = (chainId: ChainId): BigmiChainId => {
5
+ switch (chainId) {
6
+ case ChainId.BTC:
7
+ return BigmiChainId.BITCOIN_MAINNET
8
+ default:
9
+ throw new Error(`Unsupported chainId mapping: ${chainId}`)
10
+ }
11
+ }
@@ -0,0 +1,16 @@
1
+ import { ChainId } from '@lifi/sdk'
2
+ import { describe, expect, it } from 'vitest'
3
+ import { toBigmiChainId } from './toBigmiChainId.js'
4
+
5
+ describe('toBigmiChainId', () => {
6
+ it('should convert BTC ChainId to BITCOIN_MAINNET', () => {
7
+ const bigmiChainId = toBigmiChainId(ChainId.BTC)
8
+ expect(bigmiChainId).toBe('bitcoin:mainnet')
9
+ })
10
+
11
+ it('should throw error for unsupported chainId', () => {
12
+ expect(() => {
13
+ toBigmiChainId(1 as ChainId)
14
+ }).toThrow('Unsupported chainId mapping: 1')
15
+ })
16
+ })
@@ -0,0 +1,3 @@
1
+ // helper function to convert full public key (33 bytes) to x-only compressed format (32 bytes) required after taproot update
2
+ export const toXOnly = (pubKey: Uint8Array) =>
3
+ pubKey.length === 32 ? pubKey : pubKey.subarray(1, 33)
@@ -0,0 +1,24 @@
1
+ import { describe, expect, it } from 'vitest'
2
+ import { toXOnly } from './toXOnly.js'
3
+
4
+ describe('toXOnly', () => {
5
+ it('should return 32-byte public key as-is', () => {
6
+ const pubKey = new Uint8Array(32).fill(1)
7
+ const result = toXOnly(pubKey)
8
+
9
+ expect(result).toBe(pubKey)
10
+ expect(result.length).toBe(32)
11
+ })
12
+
13
+ it('should extract last 32 bytes from 33-byte public key', () => {
14
+ const pubKey = new Uint8Array(33)
15
+ pubKey[0] = 2 // compressed prefix
16
+ pubKey.fill(5, 1, 33) // rest of the key
17
+
18
+ const result = toXOnly(pubKey)
19
+
20
+ expect(result.length).toBe(32)
21
+ expect(result[0]).toBe(5)
22
+ expect(result[31]).toBe(5)
23
+ })
24
+ })
package/src/version.ts ADDED
@@ -0,0 +1,2 @@
1
+ export const name = '@lifi/sdk-provider-bitcoin'
2
+ export const version = '4.0.0-alpha.1'
package/tsconfig.json ADDED
@@ -0,0 +1,18 @@
1
+ {
2
+ "extends": "../../tsconfig.json",
3
+ "compilerOptions": {
4
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.tsbuildinfo",
5
+ "composite": true,
6
+ "sourceMap": true,
7
+ "rootDir": "./src",
8
+ "moduleResolution": "Node",
9
+ "outDir": "./dist"
10
+ },
11
+ "include": ["./src/**/*", "./src/**/*.json"],
12
+ "exclude": [
13
+ "tests",
14
+ "./src/**/*.spec.ts",
15
+ "./src/**/*.mock.ts",
16
+ "./src/**/*.handlers.ts"
17
+ ]
18
+ }