Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
"type-check": "tsc --noEmit"
},
"dependencies": {
"@dynamic-labs/bitcoin": "4.29.4",
"@dynamic-labs/ethereum": "4.29.4",
"@dynamic-labs/ethers-v6": "4.29.4",
"@dynamic-labs/global-wallet-client": "4.15.0",
Expand Down Expand Up @@ -104,6 +105,9 @@
"solana": [
"./dist/types/solana.d.ts"
],
"bitcoin": [
"./dist/types/bitcoin.d.ts"
],
"ethers": [
"./dist/types/ethers.d.ts"
],
Expand Down Expand Up @@ -133,6 +137,11 @@
"import": "./dist/esm/solana.js",
"default": "./dist/cjs/solana.js"
},
"./bitcoin": {
"types": "./dist/types/bitcoin.d.ts",
"import": "./dist/esm/bitcoin.js",
"default": "./dist/cjs/bitcoin.js"
},
"./ethers": {
"types": "./dist/types/ethers.d.ts",
"import": "./dist/esm/ethers.js",
Expand Down
25 changes: 25 additions & 0 deletions src/bitcoin.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
/**
* Bitcoin wallet utilities for @zetachain/wallet
*
* @example
* ```typescript
* import { isBitcoinWallet } from '@zetachain/wallet/bitcoin';
* import { useUniversalSignInContext } from '@zetachain/wallet/react';
*
* const { primaryWallet } = useUniversalSignInContext();
*
* if (isBitcoinWallet(primaryWallet)) {
* // primaryWallet now has Bitcoin-specific methods like signPsbt
* }
* ```
*/

// Re-export Bitcoin type guard from Dynamic Labs
export { isBitcoinWallet } from "@dynamic-labs/bitcoin";

// Export Bitcoin-specific types
export type {
BitcoinSignPsbtResponse,
PrimaryWalletWithBitcoinSigner,
SignPsbtParams,
} from "./types/bitcoin";
7 changes: 6 additions & 1 deletion src/react/providers/UniversalSignInContextProvider.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { BitcoinWalletConnectors } from "@dynamic-labs/bitcoin";
import { EthereumWalletConnectors } from "@dynamic-labs/ethereum";
import {
type DynamicContextProps,
Expand Down Expand Up @@ -116,7 +117,11 @@ export const UniversalSignInContextProvider: React.FC<
"eip155:7000",
],

walletConnectors: [EthereumWalletConnectors, SolanaWalletConnectors],
walletConnectors: [
EthereumWalletConnectors,
SolanaWalletConnectors,
BitcoinWalletConnectors,
],
};

return (
Expand Down
52 changes: 52 additions & 0 deletions src/types/bitcoin.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import { PrimaryWallet } from "./wallet";

/**
* Parameters required for signing a Bitcoin PSBT with Dynamic Labs wallets
*/
export interface SignPsbtParams {
/** Array of allowed SIGHASH types. [1] = SIGHASH_ALL */
allowedSighash: number[];
/** Array of signature configurations */
signature: Array<{
/** The address that will sign */
address: string;
/** Array of input indexes to sign */
signingIndexes: number[];
}>;
/** The unsigned PSBT encoded as base64 */
unsignedPsbtBase64: string;
}

/**
* Response from Dynamic Labs signPsbt method
* Contains the signed PSBT in base64 format
*
* Note: Different wallets may return different formats:
* - Some return { psbt: string }
* - Phantom returns { signedPsbt: string }
* - Others return the base64 string directly
*/
export interface BitcoinSignPsbtResponse {
psbt?: string;
signedPsbt?: string;
}

/**
* Extended PrimaryWallet type that includes Bitcoin-specific methods.
* This type should be used when you've verified the wallet is a Bitcoin wallet using isBitcoinWallet.
*/
export type PrimaryWalletWithBitcoinSigner = PrimaryWallet & {
/**
* Signs a Partially Signed Bitcoin Transaction (PSBT)
* @param params - Parameters for signing the PSBT
* @returns The signed PSBT (string or object with psbt property) or undefined if signing fails
*
* Note: Return type varies by wallet implementation:
* - Some wallets return the base64 string directly
* - Others return { psbt: string }
* - Handle both cases in your code
*/
signPsbt(
params: SignPsbtParams
): Promise<string | BitcoinSignPsbtResponse | undefined>;
};
146 changes: 142 additions & 4 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -666,6 +666,11 @@
"@babel/helper-string-parser" "^7.27.1"
"@babel/helper-validator-identifier" "^7.27.1"

"@btckit/[email protected]":
version "0.0.19"
resolved "https://registry.yarnpkg.com/@btckit/types/-/types-0.0.19.tgz#8454326b669d3b029094d3d20026fdc6e6c72319"
integrity sha512-APoOfYSg9SRR4CMXL606IDtpgh+ZD3kS/+iY0BkUALD6HvXo2pVw20L5YYIc+HrgMcF6WN0TH7TXdVs+Vu+kww==

"@coinbase/[email protected]":
version "4.3.7"
resolved "https://registry.yarnpkg.com/@coinbase/wallet-sdk/-/wallet-sdk-4.3.7.tgz#e67d47238714a6f288d59d1b83c7c2c9656fecba"
Expand Down Expand Up @@ -727,6 +732,25 @@
dependencies:
"@dynamic-labs/logger" "4.29.4"

"@dynamic-labs/[email protected]":
version "4.29.4"
resolved "https://registry.yarnpkg.com/@dynamic-labs/bitcoin/-/bitcoin-4.29.4.tgz#3e331976156376055a8e54b189a9e1cbe8f03305"
integrity sha512-sNMzqr/E+en4XYeQ9Er22+AhzL81I2dlD6uDA92/yOilJsFtOKty6ek82cewu/baL7mlpRkrKwJH+C4pIxwy2g==
dependencies:
"@btckit/types" "0.0.19"
"@dynamic-labs/assert-package-version" "4.29.4"
"@dynamic-labs/sdk-api-core" "0.0.758"
"@dynamic-labs/types" "4.29.4"
"@dynamic-labs/utils" "4.29.4"
"@dynamic-labs/wallet-book" "4.29.4"
"@dynamic-labs/wallet-connector-core" "4.29.4"
"@wallet-standard/app" "1.0.1"
"@wallet-standard/base" "1.0.1"
bitcoinjs-lib "6.1.5"
eventemitter3 "5.0.1"
jsontokens "4.0.1"
sats-connect "3.6.1"

"@dynamic-labs/[email protected]":
version "4.29.4"
resolved "https://registry.yarnpkg.com/@dynamic-labs/embedded-wallet-evm/-/embedded-wallet-evm-4.29.4.tgz#315f299ef2c19cdabc705577168d45e53be3dbc1"
Expand Down Expand Up @@ -1873,11 +1897,16 @@
resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.7.2.tgz#d53c65a21658fb02f3303e7ee3ba89d6754c64b4"
integrity sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ==

"@noble/[email protected]", "@noble/hashes@^1.8.0", "@noble/hashes@~1.8.0":
"@noble/[email protected]", "@noble/hashes@^1.1.2", "@noble/hashes@^1.8.0", "@noble/hashes@~1.8.0":
version "1.8.0"
resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.8.0.tgz#cee43d801fcef9644b11b8194857695acd5f815a"
integrity sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==

"@noble/secp256k1@^1.6.3":
version "1.7.2"
resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.2.tgz#c2c3343e2dce80e15a914d7442147507f8a98e7f"
integrity sha512-/qzwYl5eFLH8OWIecQWM31qld2g1NfjgylK+TNhqtaUKP37Nm+Y+z30Fjhw0Ct8p9yCQEm2N3W/AckdIb3SMcQ==

"@nodelib/[email protected]":
version "2.1.5"
resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
Expand Down Expand Up @@ -2342,6 +2371,34 @@
resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8"
integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==

"@sats-connect/[email protected]":
version "0.6.11"
resolved "https://registry.yarnpkg.com/@sats-connect/core/-/core-0.6.11.tgz#b1842ba2a61aa721004e31e11a9b87a9ddfe19f4"
integrity sha512-xF2zGCJTH3ZargGRe/n3aiA7vfVzKhlPUDt+Q3dmY5tQiUXqiIjwQY7MBY9ZjQ7SFdURI6fTudMbSzbb2i0mkQ==
dependencies:
axios "1.8.4"
bitcoin-address-validation "2.2.3"
buffer "6.0.3"
jsontokens "4.0.1"

"@sats-connect/[email protected]":
version "0.0.10"
resolved "https://registry.yarnpkg.com/@sats-connect/make-default-provider-config/-/make-default-provider-config-0.0.10.tgz#12bf6e2453fd37ca4b7336df5c21b188b8f3f469"
integrity sha512-BBot3Ofa2J7OwXprgYPD4C8dppX4nnPxj4FXWq1H7fDsvwJmW4sAnfmnAIzwmyWZJOR2uZqtTkXAA08sVkoN5g==
dependencies:
"@sats-connect/ui" "^0.0.6"
bowser "^2.11.0"

"@sats-connect/[email protected]":
version "0.0.7"
resolved "https://registry.yarnpkg.com/@sats-connect/ui/-/ui-0.0.7.tgz#a93082ff4b9a0e8ba8d85cab3c7d81a05b078183"
integrity sha512-dq02JxvTSAkfgFzEz4iWDSamm6Dte1omzxK0F1yytRZbIrbjjz1KmlMHM+uuxnFN9+EzHIHNsA4aS2dEDwh0xw==

"@sats-connect/ui@^0.0.6":
version "0.0.6"
resolved "https://registry.yarnpkg.com/@sats-connect/ui/-/ui-0.0.6.tgz#67b2239dbca95e8df110ed821795340128b36aad"
integrity sha512-H3bFFhr9CcY1oNosNi/QJszmMHSht4U19bUWfM3vzayAKgV4ebY6iUnRK5g3p2rVLLWVzlpaw1J9m+7JWwyBfA==

"@scure/[email protected]", "@scure/base@^1.1.3", "@scure/base@^1.2.4", "@scure/base@~1.2.2", "@scure/base@~1.2.4", "@scure/base@~1.2.5":
version "1.2.6"
resolved "https://registry.npmjs.org/@scure/base/-/base-1.2.6.tgz#ca917184b8231394dd8847509c67a0be522e59f6"
Expand Down Expand Up @@ -3822,6 +3879,15 @@ available-typed-arrays@^1.0.7:
dependencies:
possible-typed-array-names "^1.0.0"

[email protected]:
version "1.8.4"
resolved "https://registry.yarnpkg.com/axios/-/axios-1.8.4.tgz#78990bb4bc63d2cae072952d374835950a82f447"
integrity sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==
dependencies:
follow-redirects "^1.15.6"
form-data "^4.0.0"
proxy-from-env "^1.1.0"

[email protected]:
version "1.9.0"
resolved "https://registry.yarnpkg.com/axios/-/axios-1.9.0.tgz#25534e3b72b54540077d33046f77e3b8d7081901"
Expand Down Expand Up @@ -3889,11 +3955,21 @@ base-x@^5.0.0:
resolved "https://registry.yarnpkg.com/base-x/-/base-x-5.0.1.tgz#16bf35254be1df8aca15e36b7c1dda74b2aa6b03"
integrity sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==

base58-js@^1.0.0:
version "1.0.5"
resolved "https://registry.yarnpkg.com/base58-js/-/base58-js-1.0.5.tgz#00697bff954aa85007fa45ce76b699b7960768cd"
integrity sha512-LkkAPP8Zu+c0SVNRTRVDyMfKVORThX+rCViget00xdgLRrKkClCTz1T7cIrpr69ShwV5XJuuoZvMvJ43yURwkA==

base64-js@^1.3.1, base64-js@^1.5.1:
version "1.5.1"
resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==

bech32@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/bech32/-/bech32-2.0.0.tgz#078d3686535075c8c79709f054b1b226a133b355"
integrity sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==

[email protected]:
version "6.2.2"
resolved "https://registry.yarnpkg.com/big.js/-/big.js-6.2.2.tgz#be3bb9ac834558b53b099deef2a1d06ac6368e1a"
Expand Down Expand Up @@ -3923,6 +3999,32 @@ bindings@^1.3.0:
dependencies:
file-uri-to-path "1.0.0"

bip174@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/bip174/-/bip174-2.1.1.tgz#ef3e968cf76de234a546962bcf572cc150982f9f"
integrity sha512-mdFV5+/v0XyNYXjBS6CQPLo9ekCx4gtKZFnJm5PMto7Fs9hTTDpkkzOB7/FtluRI6JbUUAu+snTYfJRgHLZbZQ==

[email protected]:
version "2.2.3"
resolved "https://registry.yarnpkg.com/bitcoin-address-validation/-/bitcoin-address-validation-2.2.3.tgz#ffae6d48facd5ce7ef60574891aab979d21f9828"
integrity sha512-1uGCGl26Ye8JG5qcExtFLQfuib6qEZWNDo1ZlLlwp/z7ygUFby3IxolgEfgMGaC+LG9csbVASLcH8fRLv7DIOg==
dependencies:
base58-js "^1.0.0"
bech32 "^2.0.0"
sha256-uint8array "^0.10.3"

[email protected]:
version "6.1.5"
resolved "https://registry.yarnpkg.com/bitcoinjs-lib/-/bitcoinjs-lib-6.1.5.tgz#3b03509ae7ddd80a440f10fc38c4a97f0a028d8c"
integrity sha512-yuf6xs9QX/E8LWE2aMJPNd0IxGofwfuVOiYdNUESkc+2bHHVKjhJd8qewqapeoolh9fihzHGoDCB5Vkr57RZCQ==
dependencies:
"@noble/hashes" "^1.2.0"
bech32 "^2.0.0"
bip174 "^2.1.1"
bs58check "^3.0.1"
typeforce "^1.11.3"
varuint-bitcoin "^1.1.2"

bl@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a"
Expand Down Expand Up @@ -3956,7 +4058,7 @@ borsh@^0.7.0:
bs58 "^4.0.0"
text-encoding-utf-8 "^1.0.2"

bowser@^2.9.0:
bowser@^2.11.0, bowser@^2.9.0:
version "2.12.1"
resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.12.1.tgz#f9ad78d7aebc472feb63dd9635e3ce2337e0e2c1"
integrity sha512-z4rE2Gxh7tvshQ4hluIT7XcFrgLIQaw9X3A+kTTRdovCz5PMukm/0QC/BKSYPj3omF5Qfypn9O/c5kgpmvYUCw==
Expand Down Expand Up @@ -6382,6 +6484,15 @@ jsonfile@^4.0.0:
optionalDependencies:
graceful-fs "^4.1.6"

[email protected]:
version "4.0.1"
resolved "https://registry.yarnpkg.com/jsontokens/-/jsontokens-4.0.1.tgz#c3edf74a01160b2ca6d62b021b288edd59d1184a"
integrity sha512-+MO415LEN6M+3FGsRz4wU20g7N2JA+2j9d9+pGaNJHviG4L8N0qzavGyENw6fJqsq9CcrHOIL6iWX5yeTZ86+Q==
dependencies:
"@noble/hashes" "^1.1.2"
"@noble/secp256k1" "^1.6.3"
base64-js "^1.5.1"

keyv@^4.5.3:
version "4.5.4"
resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93"
Expand Down Expand Up @@ -7973,7 +8084,7 @@ safe-array-concat@^1.1.3:
has-symbols "^1.1.0"
isarray "^2.0.5"

[email protected], safe-buffer@^5.0.1, safe-buffer@~5.2.0:
[email protected], safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.2.0:
version "5.2.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
Expand Down Expand Up @@ -8005,6 +8116,16 @@ safe-stable-stringify@^2.1.0:
resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz#4ca2f8e385f2831c432a719b108a3bf7af42a1dd"
integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==

[email protected]:
version "3.6.1"
resolved "https://registry.yarnpkg.com/sats-connect/-/sats-connect-3.6.1.tgz#b0419a1f14a6376dc547bc113fffa453f9440609"
integrity sha512-57yyNbyyzrWyRR46Bui6RKhQoFe9SsEwXR2wqGXzZYdgzIwvK0tApPc3CWbL/A7fkvCuAOjxqWG3ZdmfgPNEdg==
dependencies:
"@sats-connect/core" "0.6.11"
"@sats-connect/make-default-provider-config" "0.0.10"
"@sats-connect/ui" "0.0.7"
valibot "1.1.0"

[email protected]:
version "0.24.0-canary-efb381bbf-20230505"
resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.24.0-canary-efb381bbf-20230505.tgz#5dddc60e29f91cd7f8b983d7ce4a99c2202d178f"
Expand Down Expand Up @@ -8115,7 +8236,7 @@ [email protected]:
resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==

sha256-uint8array@^0.10.7:
sha256-uint8array@^0.10.3, sha256-uint8array@^0.10.7:
version "0.10.7"
resolved "https://registry.yarnpkg.com/sha256-uint8array/-/sha256-uint8array-0.10.7.tgz#c751fc914f4227b26d996980562065fa4eadcf99"
integrity sha512-1Q6JQU4tX9NqsDGodej6pkrUVQVNapLZnvkwIhddH/JqzBZF1fSaxSWNY6sziXBE8aEa2twtGkXUrwzGeZCMpQ==
Expand Down Expand Up @@ -8727,6 +8848,11 @@ typed-array-length@^1.0.7:
possible-typed-array-names "^1.0.0"
reflect.getprototypeof "^1.0.6"

typeforce@^1.11.3:
version "1.18.0"
resolved "https://registry.yarnpkg.com/typeforce/-/typeforce-1.18.0.tgz#d7416a2c5845e085034d70fcc5b6cc4a90edbfdc"
integrity sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==

[email protected]:
version "5.0.4"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.0.4.tgz#b217fd20119bd61a94d4011274e0ab369058da3b"
Expand Down Expand Up @@ -8938,6 +9064,11 @@ uuid@^9.0.1:
resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30"
integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==

[email protected]:
version "1.1.0"
resolved "https://registry.yarnpkg.com/valibot/-/valibot-1.1.0.tgz#873bb1af9e1577391690307bfe0520bd1360ec2d"
integrity sha512-Nk8lX30Qhu+9txPYTwM0cFlWLdPFsFr6LblzqIySfbZph9+BFsAHsNvHOymEviUepeIW6KFHzpX8TKhbptBXXw==

valibot@^0.36.0:
version "0.36.0"
resolved "https://registry.yarnpkg.com/valibot/-/valibot-0.36.0.tgz#74e746694b1abcc1879e4393db551d4ce1e10578"
Expand All @@ -8952,6 +9083,13 @@ [email protected]:
proxy-compare "2.6.0"
use-sync-external-store "1.2.0"

varuint-bitcoin@^1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/varuint-bitcoin/-/varuint-bitcoin-1.1.2.tgz#e76c138249d06138b480d4c5b40ef53693e24e92"
integrity sha512-4EVb+w4rx+YfVM32HQX42AbbT7/1f5zwAYhIujKXKk8NQK+JfRVl3pqT3hjNn/L+RstigmGGKVwHA/P0wgITZw==
dependencies:
safe-buffer "^5.1.1"

vary@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
Expand Down