@dynamic-labs-sdk/bitcoin 0.24.1 → 0.25.0

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 (38) hide show
  1. package/dist/{addBitcoinInjectedWalletsExtension-B6e1W4wk.esm.js → addBitcoinInjectedWalletsExtension-C-0kmbRL.esm.js} +2 -2
  2. package/dist/addBitcoinInjectedWalletsExtension-C-0kmbRL.esm.js.map +1 -0
  3. package/dist/{addBitcoinInjectedWalletsExtension-CNPT-vxV.cjs.js → addBitcoinInjectedWalletsExtension-DK3uOXgu.cjs.js} +3 -3
  4. package/dist/addBitcoinInjectedWalletsExtension-DK3uOXgu.cjs.js.map +1 -0
  5. package/dist/{addWaasBitcoinExtension-Cgh2ZnO9.esm.js → addWaasBitcoinExtension-DsDz51vY.esm.js} +2 -2
  6. package/dist/addWaasBitcoinExtension-DsDz51vY.esm.js.map +1 -0
  7. package/dist/{addWaasBitcoinExtension-CFImdZlf.cjs.js → addWaasBitcoinExtension-j-IFW13l.cjs.js} +2 -2
  8. package/dist/addWaasBitcoinExtension-j-IFW13l.cjs.js.map +1 -0
  9. package/dist/{bitcoinTransferAmount-Dn2plv-v.esm.js → bitcoinTransferAmount-1ObnmBJf.esm.js} +2 -2
  10. package/dist/bitcoinTransferAmount-1ObnmBJf.esm.js.map +1 -0
  11. package/dist/{bitcoinTransferAmount-BXNrJ626.cjs.js → bitcoinTransferAmount-DiaNI_VK.cjs.js} +3 -3
  12. package/dist/bitcoinTransferAmount-DiaNI_VK.cjs.js.map +1 -0
  13. package/dist/errors/InvalidPsbtError.d.ts.map +1 -1
  14. package/dist/errors/PublicKeyNotFoundError.d.ts.map +1 -1
  15. package/dist/index.cjs.js +3 -3
  16. package/dist/index.esm.js +3 -3
  17. package/dist/injected/utils/leather/convertNetworkIdToLeatherNetworkName/convertNetworkIdToLeatherNetworkName.d.ts.map +1 -1
  18. package/dist/injected/utils/magicEden/createMagicEdenBitcoinWalletProvider/createMagicEdenBitcoinWalletProvider.d.ts.map +1 -1
  19. package/dist/injected.cjs.js +3 -3
  20. package/dist/injected.esm.js +2 -2
  21. package/dist/tsconfig.lib.tsbuildinfo +1 -1
  22. package/dist/utils/convertNetworkIdForPsbt/convertNetworkIdForPsbt.d.ts.map +1 -1
  23. package/dist/utils/convertNetworkIdToSatsConnectNetworkType/convertNetworkIdToSatsConnectNetworkType.d.ts.map +1 -1
  24. package/dist/utils/convertPsbtToBase64/convertPsbtToBase64.d.ts.map +1 -1
  25. package/dist/utils/getSatsConnectSigningProtocol/getSatsConnectSigningProtocol.d.ts.map +1 -1
  26. package/dist/utils/isHexEncodedPsbt/isHexEncodedPsbt.d.ts.map +1 -1
  27. package/dist/waas/utils/broadcastTransaction/broadcastTransaction.d.ts.map +1 -1
  28. package/dist/waas/utils/getUTXOs/getUTXOs.d.ts.map +1 -1
  29. package/dist/waas/utils/validateNotTaproot/validateNotTaproot.d.ts.map +1 -1
  30. package/dist/waas.cjs.js +2 -2
  31. package/dist/waas.esm.js +2 -2
  32. package/package.json +4 -4
  33. package/dist/addBitcoinInjectedWalletsExtension-B6e1W4wk.esm.js.map +0 -1
  34. package/dist/addBitcoinInjectedWalletsExtension-CNPT-vxV.cjs.js.map +0 -1
  35. package/dist/addWaasBitcoinExtension-CFImdZlf.cjs.js.map +0 -1
  36. package/dist/addWaasBitcoinExtension-Cgh2ZnO9.esm.js.map +0 -1
  37. package/dist/bitcoinTransferAmount-BXNrJ626.cjs.js.map +0 -1
  38. package/dist/bitcoinTransferAmount-Dn2plv-v.esm.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addBitcoinInjectedWalletsExtension-DK3uOXgu.cjs.js","names":["isBitcoinWalletAccount","InvalidParamError","getMempoolApiUrl","BaseError","Transaction","extractedAddress: string | undefined","address","Transaction","psbtSignOptions: SignPsbtOptions","toSignInputs: SignPsbtOptions['toSignInputs']","BINANCE_METADATA: WalletProviderMetadata","DYNAMIC_ICONIC_SPRITE_URL","chain: Chain","WalletProviderEnum","connect: BitcoinWalletProvider['connect']","getActiveNetworkId: BitcoinWalletProvider['getActiveNetworkId']","getConnectedAddresses: BitcoinWalletProvider['getConnectedAddresses']","signMessage: BitcoinWalletProvider['signMessage']","signPsbt: BitcoinWalletProvider['signPsbt']","Psbt","signPsbts: BitcoinWalletProvider['signPsbts']","signedPsbts: string[]","terminate: BitcoinWalletProvider['terminate']","bitcoinExecuteSwapTransaction","bitcoinTransferAmount","UNISAT_METADATA: WalletProviderMetadata","DYNAMIC_ICONIC_SPRITE_URL","chain: Chain","WalletProviderEnum","connect: BitcoinWalletProvider['connect']","disconnect: BitcoinWalletProvider['disconnect']","getActiveNetworkId: BitcoinWalletProvider['getActiveNetworkId']","chain","getConnectedAddresses: BitcoinWalletProvider['getConnectedAddresses']","sendBitcoin: BitcoinWalletProvider['sendBitcoin']","signMessage: BitcoinWalletProvider['signMessage']","signPsbt: BitcoinWalletProvider['signPsbt']","Psbt","signPsbts: BitcoinWalletProvider['signPsbts']","psbtHexs: string[]","psbtOptions: SignPsbtOptions[]","terminate: BitcoinWalletProvider['terminate']","bitcoinExecuteSwapTransaction","bitcoinTransferAmount","BITGET_METADATA: WalletProviderMetadata","DYNAMIC_ICONIC_SPRITE_URL","networks","LEATHER_METADATA: WalletProviderMetadata","DYNAMIC_ICONIC_SPRITE_URL","chain: Chain","WalletProviderEnum","connect: BitcoinWalletProvider['connect']","addresses: WalletProviderConnectAddress[]","address","getActiveNetworkId: BitcoinWalletProvider['getActiveNetworkId']","getConnectedAddresses: BitcoinWalletProvider['getConnectedAddresses']","sendBitcoin: BitcoinWalletProvider['sendBitcoin']","signMessage: BitcoinWalletProvider['signMessage']","paymentType: BitcoinPaymentTypes","signPsbt: BitcoinWalletProvider['signPsbt']","Psbt","signPsbts: BitcoinWalletProvider['signPsbts']","signedPsbts: string[]","bitcoinExecuteSwapTransaction","bitcoinTransferAmount","BitcoinNetworkType","inputsToSign: InputToSign[]","MessageSigningProtocols","addresses: WalletProviderConnectAddress[]","address","MAGIC_EDEN_METADATA: WalletProviderMetadata","DYNAMIC_ICONIC_SPRITE_URL","chain: Chain","WalletProviderEnum","connect: BitcoinWalletProvider['connect']","UserRejectedError","AddressPurpose","getActiveNetworkId: BitcoinWalletProvider['getActiveNetworkId']","getConnectedAddresses: BitcoinWalletProvider['getConnectedAddresses']","address","sendBitcoin: BitcoinWalletProvider['sendBitcoin']","signMessage: BitcoinWalletProvider['signMessage']","signPsbt: BitcoinWalletProvider['signPsbt']","Psbt","signPsbts: BitcoinWalletProvider['signPsbts']","psbtsToSign: SignMultiplePsbtPayload[]","request","terminate: BitcoinWalletProvider['terminate']","bitcoinExecuteSwapTransaction","bitcoinTransferAmount","OKX_METADATA: WalletProviderMetadata","DYNAMIC_ICONIC_SPRITE_URL","chain: Chain","WalletProviderEnum","connect: BitcoinWalletProvider['connect']","getActiveNetworkId: BitcoinWalletProvider['getActiveNetworkId']","getConnectedAddresses: BitcoinWalletProvider['getConnectedAddresses']","sendBitcoin: BitcoinWalletProvider['sendBitcoin']","signMessage: BitcoinWalletProvider['signMessage']","signPsbt: BitcoinWalletProvider['signPsbt']","Psbt","signPsbts: BitcoinWalletProvider['signPsbts']","psbtHexs: string[]","psbtOptions: SignPsbtOptions[]","terminate: BitcoinWalletProvider['terminate']","bitcoinExecuteSwapTransaction","bitcoinTransferAmount","ONEKEY_METADATA: WalletProviderMetadata","DYNAMIC_ICONIC_SPRITE_URL","chain: Chain","WalletProviderEnum","connect: BitcoinWalletProvider['connect']","getActiveNetworkId: BitcoinWalletProvider['getActiveNetworkId']","getConnectedAddresses: BitcoinWalletProvider['getConnectedAddresses']","sendBitcoin: BitcoinWalletProvider['sendBitcoin']","signMessage: BitcoinWalletProvider['signMessage']","signPsbt: BitcoinWalletProvider['signPsbt']","Psbt","signPsbts: BitcoinWalletProvider['signPsbts']","psbtHexs: string[]","terminate: BitcoinWalletProvider['terminate']","bitcoinExecuteSwapTransaction","bitcoinTransferAmount","OYL_METADATA: WalletProviderMetadata","DYNAMIC_ICONIC_SPRITE_URL","chain: Chain","WalletProviderEnum","connect: BitcoinWalletProvider['connect']","addresses: WalletProviderConnectAddress[]","getActiveNetworkId: BitcoinWalletProvider['getActiveNetworkId']","getConnectedAddresses: BitcoinWalletProvider['getConnectedAddresses']","address","signMessage: BitcoinWalletProvider['signMessage']","signPsbt: BitcoinWalletProvider['signPsbt']","Psbt","signPsbts: BitcoinWalletProvider['signPsbts']","signedPsbts: string[]","bitcoinExecuteSwapTransaction","bitcoinTransferAmount","PHANTOM_METADATA: WalletProviderMetadata","DYNAMIC_ICONIC_SPRITE_URL","chain: Chain","WalletProviderEnum","connect: BitcoinWalletProvider['connect']","addresses: WalletProviderConnectAddress[]","getActiveNetworkId: BitcoinWalletProvider['getActiveNetworkId']","getConnectedAddresses: BitcoinWalletProvider['getConnectedAddresses']","address","signMessage: BitcoinWalletProvider['signMessage']","signPsbt: BitcoinWalletProvider['signPsbt']","Psbt","signPsbts: BitcoinWalletProvider['signPsbts']","signedPsbts: string[]","terminate: BitcoinWalletProvider['terminate']","bitcoinExecuteSwapTransaction","bitcoinTransferAmount","UserRejectedError","XVERSE_METADATA: WalletProviderMetadata","DYNAMIC_ICONIC_SPRITE_URL","chain: Chain","WalletProviderEnum","connect: BitcoinWalletProvider['connect']","disconnect: BitcoinWalletProvider['disconnect']","getActiveNetworkId: BitcoinWalletProvider['getActiveNetworkId']","getConnectedAddresses: BitcoinWalletProvider['getConnectedAddresses']","address","RpcErrorCode","sendBitcoin: BitcoinWalletProvider['sendBitcoin']","signMessage: BitcoinWalletProvider['signMessage']","signPsbt: BitcoinWalletProvider['signPsbt']","Psbt","signPsbts: BitcoinWalletProvider['signPsbts']","psbtsToSign: SignMultiplePsbtPayload[]","terminate: BitcoinWalletProvider['terminate']","bitcoinExecuteSwapTransaction","bitcoinTransferAmount","injectedWalletProviders: BitcoinWalletProvider[]","WalletProviderPriority"],"sources":["../src/utils/bitcoinConfirmTransaction/bitcoinConfirmTransaction.ts","../src/errors/InvalidPsbtError.ts","../src/utils/getSigHashType/getSigHashType.ts","../src/utils/validatePsbt/validateSigHash/validateSigHash.ts","../src/utils/validatePsbt/extractAddressFromInput/extractAddressFromInput.ts","../src/utils/validatePsbt/validateSigningAddress/validateSigningAddress.ts","../src/utils/validatePsbt/validatePsbt.ts","../src/utils/createPsbtOptions/createPsbtOptions.ts","../src/utils/getNetworkIdFromNetworkName/getNetworkIdFromNetworkName.ts","../src/injected/utils/binance/createBinanceBitcoinWalletProvider/createBinanceBitcoinWalletProvider.ts","../src/injected/utils/binance/getBinanceBitcoinInjectedProvider/getBinanceBitcoinInjectedProvider.ts","../src/injected/utils/unisat/createUnisatWalletProvider/createUnisatWalletProvider.ts","../src/injected/utils/bitget/createBitgetBitcoinWalletProvider/createBitgetBitcoinWalletProvider.ts","../src/injected/utils/bitget/getBitgetBitcoinInjectedProvider/getBitgetBitcoinInjectedProvider.ts","../src/utils/convertNetworkIdForPsbt/convertNetworkIdForPsbt.ts","../src/injected/utils/leather/convertNetworkIdToLeatherNetworkName/convertNetworkIdToLeatherNetworkName.ts","../src/injected/utils/leather/createLeatherBitcoinWalletProvider/createLeatherBitcoinWalletProvider.ts","../src/injected/utils/leather/getLeatherBitcoinInjectedProvider/getLeatherBitcoinInjectedProvider.ts","../src/utils/convertNetworkIdToSatsConnectNetworkType/convertNetworkIdToSatsConnectNetworkType.ts","../src/utils/getPsbtInputsToSignForSatsConnect/getPsbtInputsToSignForSatsConnect.ts","../src/utils/getSatsConnectSigningProtocol/getSatsConnectSigningProtocol.ts","../src/utils/parseBitcoinConnectionResult/parseBitcoinConnectionResult.ts","../src/injected/utils/magicEden/createMagicEdenBitcoinWalletProvider/createMagicEdenBitcoinWalletProvider.ts","../src/injected/utils/magicEden/getMagicEdenInjectedProvider/getMagicEdenInjectedProvider.ts","../src/injected/utils/okx/createOkxBitcoinWalletProvider/createOkxBitcoinWalletProvider.ts","../src/injected/utils/okx/getOkxBitcoinInjectedProvider/getOkxBitcoinInjectedProvider.ts","../src/injected/utils/oneKey/createOneKeyBitcoinWalletProvider/createOneKeyBitcoinWalletProvider.ts","../src/injected/utils/oneKey/getOneKeyBitcoinInjectedProvider/getOneKeyBitcoinInjectedProvider.ts","../src/injected/utils/oyl/createOylBitcoinWalletProvider/createOylBitcoinWalletProvider.ts","../src/injected/utils/oyl/getOylBitcoinInjectedProvider/getOylBitcoinInjectedProvider.ts","../src/injected/utils/phantom/createPhantomBitcoinWalletProvider/createPhantomBitcoinWalletProvider.ts","../src/injected/utils/phantom/getPhantomInjectedProvider/getPhantomInjectedProvider.ts","../src/injected/utils/unisat/getUnisatInjectedProvider/getUnisatInjectedProvider.ts","../src/utils/signMultipleTransactionsWithSatsConnect/signMultipleTransactionsWithSatsConnect.ts","../src/injected/utils/xverse/createXverseBitcoinWalletProvider/createXverseBitcoinWalletProvider.ts","../src/injected/utils/xverse/getXverseInjectedProvider/getXverseInjectedProvider.ts","../src/injected/addBitcoinInjectedWalletsExtension/addBitcoinInjectedWalletsExtension.ts"],"sourcesContent":["import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport { InvalidParamError } from '@dynamic-labs-sdk/client';\nimport type { ConfirmTransactionParams } from '@dynamic-labs-sdk/client/core';\nimport { getCore } from '@dynamic-labs-sdk/client/core';\n\nimport { isBitcoinWalletAccount } from '../../isBitcoinWalletAccount';\nimport { getMempoolApiUrl } from '../getMempoolApiUrl';\n\nconst POLLING_INTERVAL_MS = 3_000;\nconst MAX_POLLING_ATTEMPTS = 300;\n\ntype TxStatus = {\n confirmed: boolean;\n};\n\n/**\n * Waits for a Bitcoin transaction to be confirmed on-chain by polling\n * the mempool.space API until the transaction is confirmed or the\n * maximum number of attempts is exceeded.\n *\n * @param params.transactionHash - The transaction ID to wait for.\n * @param params.walletAccount - The wallet account that submitted the transaction.\n * @param client - The Dynamic client instance.\n * @not-instrumented\n */\nexport const bitcoinConfirmTransaction = async (\n { transactionHash, walletAccount }: ConfirmTransactionParams,\n client: DynamicClient\n): Promise<void> => {\n if (!isBitcoinWalletAccount(walletAccount)) {\n throw new InvalidParamError(\n 'Wallet account is not a Bitcoin wallet account'\n );\n }\n\n const fetchService = getCore(client).fetch;\n const apiUrl = getMempoolApiUrl(walletAccount.address);\n\n for (let attempt = 0; attempt < MAX_POLLING_ATTEMPTS; attempt++) {\n try {\n const response = await fetchService(\n `${apiUrl}/tx/${transactionHash}/status`\n );\n\n if (response.ok) {\n const status = (await response.json()) as TxStatus;\n if (status.confirmed) {\n return;\n }\n }\n } catch {\n // Continue polling on fetch/parse errors\n }\n\n if (attempt < MAX_POLLING_ATTEMPTS - 1) {\n await new Promise<void>((resolve) =>\n setTimeout(resolve, POLLING_INTERVAL_MS)\n );\n }\n }\n\n throw new InvalidParamError(\n `Transaction ${transactionHash} was not confirmed after ${MAX_POLLING_ATTEMPTS} attempts`\n );\n};\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\nexport class InvalidPsbtError extends BaseError {\n // eslint-disable-next-line custom-rules/require-single-object-param\n constructor(message: string) {\n super({\n cause: null,\n code: 'invalid_psbt_error',\n docsUrl: null,\n name: 'InvalidPsbtError',\n shortMessage: message,\n });\n }\n}\n","import { type Psbt, Transaction, payments } from 'bitcoinjs-lib';\n\ntype GetSigHashTypeParams = {\n input: Psbt['data']['inputs'][0];\n};\n\n/**\n * This method will return the signature hash type for the current input.\n * If there is a sighashType, it will return that\n * If there is a witnessUtxo AND it is a taproot address, then it will return SIGHASH_DEFAULT\n * Otherwise, it will return SIGHASH_ALL\n * @not-instrumented\n */\nexport const getSigHashType = ({ input }: GetSigHashTypeParams) => {\n if (input?.sighashType) {\n return input.sighashType;\n }\n\n let isTaprootAddress = false;\n\n if (input.witnessUtxo?.script) {\n try {\n payments.p2tr({\n output: input.witnessUtxo.script,\n });\n isTaprootAddress = true;\n } catch {\n // do nothing - address is not taproot\n }\n }\n\n return isTaprootAddress\n ? Transaction.SIGHASH_DEFAULT\n : Transaction.SIGHASH_ALL;\n};\n","import type { Psbt } from 'bitcoinjs-lib';\n\nimport { InvalidPsbtError } from '../../../errors/InvalidPsbtError';\nimport { getSigHashType } from '../../getSigHashType';\n\ntype ValidateSigHashParams = {\n allowedSigHashTypes: number[];\n input: Psbt['data']['inputs'][0];\n};\n\n/** @not-instrumented */\nexport const validateSigHash = ({\n allowedSigHashTypes,\n input,\n}: ValidateSigHashParams) => {\n const sigHashType = getSigHashType({ input });\n\n // if the request has allowedSigHashTypes, then we need to make sure that the sigHashType\n // is a member of that array before continuing\n if (\n allowedSigHashTypes?.length &&\n !allowedSigHashTypes.includes(sigHashType)\n ) {\n throw new InvalidPsbtError(\n `sigHashType ${sigHashType} not in allowed list`\n );\n }\n};\n","import { type Psbt, Transaction, address } from 'bitcoinjs-lib';\n\ntype ExtractAddressFromInputParams = {\n index: number;\n input: Psbt['data']['inputs'][0];\n psbt: Psbt;\n};\n\n/**\n * This method extracts the address from the input data of the psbt.\n * The address is stored as script (Buffer) in either the witnessUtxo or nonWitnessUtxo as an output\n * @not-instrumented\n */\nexport const extractAddressFromInput = ({\n index,\n input,\n psbt,\n}: ExtractAddressFromInputParams): string | undefined => {\n let extractedAddress: string | undefined;\n\n try {\n if (input.witnessUtxo?.script) {\n extractedAddress = address.fromOutputScript(input.witnessUtxo.script);\n }\n\n if (input.nonWitnessUtxo) {\n const nonWitnessTxn = Transaction.fromBuffer(input.nonWitnessUtxo);\n const txOut = nonWitnessTxn.outs[psbt.txInputs[index].index];\n\n extractedAddress = address.fromOutputScript(txOut.script);\n }\n\n return extractedAddress;\n } catch {\n return extractedAddress;\n }\n};\n","import type { Psbt } from 'bitcoinjs-lib';\n\nimport { InvalidPsbtError } from '../../../errors/InvalidPsbtError';\nimport { extractAddressFromInput } from '../extractAddressFromInput';\n\ntype ValidateSigningAddressParams = {\n index: number;\n inputAtIndex: Psbt['data']['inputs'][0];\n psbt: Psbt;\n signingAddress: string;\n};\n\n/** @not-instrumented */\nexport const validateSigningAddress = ({\n index,\n inputAtIndex,\n psbt,\n signingAddress,\n}: ValidateSigningAddressParams) => {\n // we need to extract the address from the input at the current signing index\n // to be able to compare it to the address provided in the request for the current index\n const extractedAddress = extractAddressFromInput({\n index,\n input: inputAtIndex,\n psbt,\n });\n\n if (!extractedAddress) {\n throw new InvalidPsbtError(\n `Could not extract address from input at index ${index}`\n );\n }\n\n if (extractedAddress !== signingAddress) {\n throw new InvalidPsbtError(\n `Signing address does not match with address extracted from input at index ${index}`\n );\n }\n};\n","import type { Psbt } from 'bitcoinjs-lib';\n\nimport type { BitcoinSignPsbtRequestSignature } from '../../BitcoinWalletProvider.types';\nimport { InvalidPsbtError } from '../../errors/InvalidPsbtError';\nimport { validateSigHash } from './validateSigHash';\nimport { validateSigningAddress } from './validateSigningAddress';\n\ntype ValidatePsbtParams = {\n allowedSigHashTypes: number[];\n psbt: Psbt;\n signatureData?: BitcoinSignPsbtRequestSignature[];\n};\n\n/**\n * This method will validate the psbt against the signature data provided in the request\n * It checks 3 things:\n * - That the signing index exists in the input\n * - That the address provided in the request matches the address in the input,\n * unless the disableAddressValidation flag is set\n * - That the sigHashType of the input is a member of the allowedSigHashTypes array\n * @not-instrumented\n */\nexport const validatePsbt = ({\n allowedSigHashTypes,\n psbt,\n signatureData,\n}: ValidatePsbtParams) => {\n if (!signatureData?.length) {\n return;\n }\n\n for (const input of signatureData) {\n const {\n address: signingAddress,\n signingIndexes,\n // request from ME in cases of multi-sig. Steven wanted this defaulted to true\n disableAddressValidation = true,\n } = input;\n\n if (!signingIndexes?.length) {\n return;\n }\n\n if (!signingAddress) {\n throw new InvalidPsbtError('Missing signing address');\n }\n\n for (const index of signingIndexes) {\n const inputAtIndex = psbt.data.inputs[index];\n\n if (!inputAtIndex) {\n throw new InvalidPsbtError(`Missing input for index ${index}`);\n }\n\n if (!disableAddressValidation) {\n validateSigningAddress({\n index,\n inputAtIndex,\n psbt,\n signingAddress,\n });\n }\n\n validateSigHash({ allowedSigHashTypes, input: inputAtIndex });\n }\n }\n};\n","import type { Psbt } from 'bitcoinjs-lib';\n\nimport type {\n BitcoinSignPsbtRequest,\n SignPsbtOptions,\n} from '../../BitcoinWalletProvider.types';\nimport { validatePsbt } from '../validatePsbt';\n\ntype CreatePsbtOptionsParams = {\n psbt: Psbt;\n request: BitcoinSignPsbtRequest;\n};\n\n/**\n * This method will create the psbt sign options for the given request\n * It will validate the psbt against the signature data provided in the request\n * It will return the psbt sign options with the toSignInputs added if the signature data is provided\n * @not-instrumented\n */\nexport const createPsbtOptions = ({\n psbt,\n request,\n}: CreatePsbtOptionsParams) => {\n const psbtSignOptions: SignPsbtOptions = {\n autoFinalized: false,\n };\n\n if (!request.signature) {\n return psbtSignOptions;\n }\n\n validatePsbt({\n allowedSigHashTypes: request.allowedSighash,\n psbt,\n signatureData: request.signature,\n });\n\n const toSignInputs: SignPsbtOptions['toSignInputs'] = [];\n\n for (const signature of request.signature) {\n if (signature.signingIndexes?.length) {\n for (const index of signature.signingIndexes) {\n toSignInputs.push({\n address: signature.address,\n disableAddressValidation: signature.disableAddressValidation,\n index,\n sighashTypes: request.allowedSighash,\n });\n }\n }\n }\n\n psbtSignOptions.toSignInputs = toSignInputs;\n\n return psbtSignOptions;\n};\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport { getNetworksData } from '@dynamic-labs-sdk/client';\n\ntype getNetworkIdFromNetworkNameParams = {\n networkName: string;\n};\n\n/** @not-instrumented */\nexport const getNetworkIdFromNetworkName = (\n { networkName }: getNetworkIdFromNetworkNameParams,\n client: DynamicClient\n) => {\n const networksData = getNetworksData(client);\n const btcNetworkData = networksData.filter((data) => data.chain === 'BTC');\n\n // try to find the correct networkId based on the network name (cluster)\n // if not found, default to mainnet ('1');\n const networkId =\n btcNetworkData.find((data) => data.cluster === networkName)?.networkId ??\n '1';\n\n return { networkId };\n};\n","import {\n type Chain,\n type DynamicClient,\n type WalletProviderMetadata,\n assertWalletAccountSigningAvailability,\n} from '@dynamic-labs-sdk/client';\nimport {\n DYNAMIC_ICONIC_SPRITE_URL,\n assertDefined,\n createWalletProviderEventEmitter,\n formatWalletProviderGroupKey,\n formatWalletProviderKey,\n} from '@dynamic-labs-sdk/client/core';\nimport { WalletProviderEnum } from '@dynamic-labs/sdk-api-core';\nimport { Psbt } from 'bitcoinjs-lib';\n\nimport type { BitcoinWalletProvider } from '../../../../BitcoinWalletProvider.types';\nimport { bitcoinConfirmTransaction } from '../../../../utils/bitcoinConfirmTransaction';\nimport { bitcoinExecuteSwapTransaction } from '../../../../utils/bitcoinExecuteSwapTransaction';\nimport { bitcoinTransferAmount } from '../../../../utils/bitcoinTransferAmount';\nimport { createPsbtOptions } from '../../../../utils/createPsbtOptions';\nimport { getNetworkIdFromNetworkName } from '../../../../utils/getNetworkIdFromNetworkName';\nimport type { BinanceBitcoinInjectedProvider } from '../BinanceBitcoinInjectedProvider.types';\n\nexport const BINANCE_METADATA: WalletProviderMetadata = {\n displayName: 'Binance Wallet',\n icon: `${DYNAMIC_ICONIC_SPRITE_URL}#onekey`,\n};\n\ntype CreateBinanceBitcoinWalletProviderParams = {\n dynamicClient: DynamicClient;\n injectedProvider: BinanceBitcoinInjectedProvider;\n};\n\n/** @not-instrumented */\nexport const createBinanceBitcoinWalletProvider = ({\n dynamicClient,\n injectedProvider,\n}: CreateBinanceBitcoinWalletProviderParams): BitcoinWalletProvider => {\n const chain: Chain = 'BTC';\n\n const walletProviderType = WalletProviderEnum.BrowserExtension;\n\n const key = formatWalletProviderKey({\n chain,\n displayName: BINANCE_METADATA.displayName,\n walletProviderType,\n });\n\n const connect: BitcoinWalletProvider['connect'] = async () => {\n const accounts = await injectedProvider.requestAccounts();\n\n const address = accounts[0];\n const publicKey = await injectedProvider.getPublicKey();\n\n return {\n addresses: [{ address, publicKey }],\n };\n };\n\n const getActiveNetworkId: BitcoinWalletProvider['getActiveNetworkId'] =\n async () => {\n const network = await injectedProvider.getNetwork();\n\n return getNetworkIdFromNetworkName(\n { networkName: network },\n dynamicClient\n );\n };\n\n const getConnectedAddresses: BitcoinWalletProvider['getConnectedAddresses'] =\n async () => {\n const accounts = await injectedProvider.getAccounts();\n\n return {\n addresses: accounts,\n };\n };\n\n const signMessage: BitcoinWalletProvider['signMessage'] = async ({\n message,\n walletAccount,\n protocol,\n }) => {\n assertDefined(walletAccount, 'Wallet account not found');\n\n await assertWalletAccountSigningAvailability(\n { walletAccount },\n dynamicClient\n );\n\n const signedMessage = await injectedProvider.signMessage(message, protocol);\n\n return {\n signature: signedMessage,\n };\n };\n\n const signPsbt: BitcoinWalletProvider['signPsbt'] = async ({\n request,\n walletAccount,\n }) => {\n await assertWalletAccountSigningAvailability(\n { walletAccount },\n dynamicClient\n );\n\n const psbtFromBase64 = Psbt.fromBase64(request.unsignedPsbtBase64);\n const psbtOptions = createPsbtOptions({ psbt: psbtFromBase64, request });\n\n const signedPsbtHex = await injectedProvider.signPsbt(\n psbtFromBase64.toHex(),\n {\n autoFinalized: false,\n toSignInputs: psbtOptions.toSignInputs || [],\n }\n );\n\n return { signedPsbt: Psbt.fromHex(signedPsbtHex).toBase64() };\n };\n\n const signPsbts: BitcoinWalletProvider['signPsbts'] = async ({\n requests,\n walletAccount,\n }) => {\n await assertWalletAccountSigningAvailability(\n { walletAccount },\n dynamicClient\n );\n\n const signedPsbts: string[] = [];\n\n for (const request of requests) {\n const signedPsbtResponse = await signPsbt({ request, walletAccount });\n\n if (signedPsbtResponse) {\n signedPsbts.push(signedPsbtResponse.signedPsbt);\n }\n }\n\n return {\n signedPsbts,\n };\n };\n\n const { getEventEmitter, cleanupEventEmitter } =\n createWalletProviderEventEmitter({\n removeEventListeners: () => {\n injectedProvider?.removeAllListeners();\n },\n\n setupEventListeners: ({\n handleAccountsChanged,\n handleNetworkChanged,\n }) => {\n injectedProvider?.on('accountsChanged', (addresses) => {\n handleAccountsChanged({ addresses });\n });\n\n injectedProvider?.on('networkChanged', (network) => {\n handleNetworkChanged({ networkId: network });\n });\n },\n\n supportedEvents: ['accountsChanged', 'networkChanged'],\n });\n\n const terminate: BitcoinWalletProvider['terminate'] = async () => {\n cleanupEventEmitter();\n };\n\n return {\n chain,\n confirmTransaction: (args) =>\n bitcoinConfirmTransaction(args, dynamicClient),\n connect,\n get events() {\n return getEventEmitter();\n },\n executeSwapTransaction: (args) =>\n bitcoinExecuteSwapTransaction(args, dynamicClient),\n getActiveNetworkId,\n getConnectedAddresses,\n groupKey: formatWalletProviderGroupKey(BINANCE_METADATA.displayName),\n key,\n metadata: BINANCE_METADATA,\n signMessage,\n signPsbt,\n signPsbts,\n terminate,\n transferAmount: (args) => bitcoinTransferAmount(args, dynamicClient),\n walletProviderType,\n };\n};\n","import { getInjectedProviderFromWindow } from '@dynamic-labs-sdk/client/core';\n\nimport type { BinanceBitcoinInjectedProvider } from '../BinanceBitcoinInjectedProvider.types';\n\nconst BINANCE_BITCOIN_PROVIDER_LOCATOR = 'binancew3w.bitcoin';\n\n/** @not-instrumented */\nexport const getBinanceBitcoinInjectedProvider = () => {\n return getInjectedProviderFromWindow<BinanceBitcoinInjectedProvider>(\n BINANCE_BITCOIN_PROVIDER_LOCATOR\n );\n};\n","import {\n type Chain,\n type DynamicClient,\n type WalletProviderMetadata,\n assertWalletAccountSigningAvailability,\n} from '@dynamic-labs-sdk/client';\nimport {\n DYNAMIC_ICONIC_SPRITE_URL,\n assertDefined,\n createWalletProviderEventEmitter,\n formatWalletProviderGroupKey,\n formatWalletProviderKey,\n} from '@dynamic-labs-sdk/client/core';\nimport { WalletProviderEnum } from '@dynamic-labs/sdk-api-core';\nimport { Psbt } from 'bitcoinjs-lib';\n\nimport type {\n BitcoinSendTransactionResponse,\n BitcoinWalletProvider,\n SignPsbtOptions,\n} from '../../../../BitcoinWalletProvider.types';\nimport { bitcoinConfirmTransaction } from '../../../../utils/bitcoinConfirmTransaction';\nimport { bitcoinExecuteSwapTransaction } from '../../../../utils/bitcoinExecuteSwapTransaction';\nimport { bitcoinTransferAmount } from '../../../../utils/bitcoinTransferAmount';\nimport { createPsbtOptions } from '../../../../utils/createPsbtOptions';\nimport { getNetworkIdFromNetworkName } from '../../../../utils/getNetworkIdFromNetworkName';\nimport type { UnisatInjectedProvider } from '../UnisatInjectedProvider.types';\n\nexport const UNISAT_METADATA: WalletProviderMetadata = {\n displayName: 'UniSat',\n icon: `${DYNAMIC_ICONIC_SPRITE_URL}#unisat`,\n};\n\ntype CreateUnisatWalletProviderParams = {\n dynamicClient: DynamicClient;\n injectedProvider: UnisatInjectedProvider;\n};\n\n/** @not-instrumented */\nexport const createUnisatWalletProvider = ({\n dynamicClient,\n injectedProvider,\n}: CreateUnisatWalletProviderParams): BitcoinWalletProvider => {\n const chain: Chain = 'BTC';\n\n const walletProviderType = WalletProviderEnum.BrowserExtension;\n\n const key = formatWalletProviderKey({\n chain,\n displayName: UNISAT_METADATA.displayName,\n walletProviderType,\n });\n\n const connect: BitcoinWalletProvider['connect'] = async () => {\n const addresses = await injectedProvider.requestAccounts();\n\n return {\n addresses: addresses.map((address) => ({\n address,\n })),\n };\n };\n\n const disconnect: BitcoinWalletProvider['disconnect'] = async () => {\n return injectedProvider.disconnect();\n };\n\n const getActiveNetworkId: BitcoinWalletProvider['getActiveNetworkId'] =\n async () => {\n const chain = await injectedProvider.getChain();\n\n let networkName = 'mainnet';\n if (chain.enum === 'BITCOIN_TESTNET') {\n networkName = 'testnet';\n } else if (chain.enum === 'BITCOIN_SIGNET') {\n networkName = 'signet';\n }\n\n return getNetworkIdFromNetworkName({ networkName }, dynamicClient);\n };\n\n const getConnectedAddresses: BitcoinWalletProvider['getConnectedAddresses'] =\n async () => {\n const accounts = await injectedProvider.getAccounts();\n\n return {\n addresses: accounts,\n };\n };\n\n const sendBitcoin: BitcoinWalletProvider['sendBitcoin'] = async ({\n transaction,\n walletAccount,\n }): Promise<BitcoinSendTransactionResponse> => {\n await assertWalletAccountSigningAvailability(\n { walletAccount },\n dynamicClient\n );\n\n const transactionId = await injectedProvider.sendBitcoin(\n transaction.recipientAddress,\n Number(transaction.amount)\n );\n\n return {\n transactionId,\n };\n };\n\n const signMessage: BitcoinWalletProvider['signMessage'] = async ({\n message,\n walletAccount,\n protocol,\n }) => {\n assertDefined(walletAccount, 'Wallet account not found');\n\n await assertWalletAccountSigningAvailability(\n { walletAccount },\n dynamicClient\n );\n\n const signedMessage = await injectedProvider.signMessage(message, protocol);\n\n return {\n signature: signedMessage,\n };\n };\n\n const signPsbt: BitcoinWalletProvider['signPsbt'] = async ({\n request,\n walletAccount,\n }) => {\n await assertWalletAccountSigningAvailability(\n { walletAccount },\n dynamicClient\n );\n\n const psbtFromBase64 = Psbt.fromBase64(request.unsignedPsbtBase64);\n\n const signedPsbtHex = await injectedProvider.signPsbt(\n psbtFromBase64.toHex(),\n createPsbtOptions({ psbt: psbtFromBase64, request })\n );\n\n return { signedPsbt: Psbt.fromHex(signedPsbtHex).toBase64() };\n };\n\n const signPsbts: BitcoinWalletProvider['signPsbts'] = async ({\n requests,\n walletAccount,\n }) => {\n await assertWalletAccountSigningAvailability(\n { walletAccount },\n dynamicClient\n );\n\n const psbtHexs: string[] = [];\n const psbtOptions: SignPsbtOptions[] = [];\n\n for (const request of requests) {\n const psbtFromBase64 = Psbt.fromBase64(request.unsignedPsbtBase64);\n\n psbtHexs.push(psbtFromBase64.toHex());\n psbtOptions.push(createPsbtOptions({ psbt: psbtFromBase64, request }));\n }\n\n const signedPsbtHexs = await injectedProvider.signPsbts(\n psbtHexs,\n psbtOptions\n );\n\n return {\n signedPsbts: signedPsbtHexs.map((signedPsbtHex) =>\n Psbt.fromHex(signedPsbtHex).toBase64()\n ),\n };\n };\n\n const { getEventEmitter, cleanupEventEmitter } =\n createWalletProviderEventEmitter({\n removeEventListeners: () => {\n injectedProvider?.removeAllListeners();\n },\n\n setupEventListeners: ({\n handleAccountsChanged,\n handleNetworkChanged,\n }) => {\n injectedProvider?.on('accountsChanged', (addresses) => {\n handleAccountsChanged({ addresses });\n });\n\n injectedProvider?.on('networkChanged', (network) => {\n handleNetworkChanged({ networkId: network });\n });\n },\n\n supportedEvents: ['accountsChanged', 'networkChanged'],\n });\n\n const terminate: BitcoinWalletProvider['terminate'] = async () => {\n cleanupEventEmitter();\n };\n\n return {\n chain,\n confirmTransaction: (args) =>\n bitcoinConfirmTransaction(args, dynamicClient),\n connect,\n disconnect,\n get events() {\n return getEventEmitter();\n },\n executeSwapTransaction: (args) =>\n bitcoinExecuteSwapTransaction(args, dynamicClient),\n getActiveNetworkId,\n getConnectedAddresses,\n groupKey: formatWalletProviderGroupKey(UNISAT_METADATA.displayName),\n key,\n metadata: UNISAT_METADATA,\n sendBitcoin,\n signMessage,\n signPsbt,\n signPsbts,\n terminate,\n transferAmount: (args) => bitcoinTransferAmount(args, dynamicClient),\n walletProviderType,\n };\n};\n","import {\n type DynamicClient,\n type WalletProviderMetadata,\n} from '@dynamic-labs-sdk/client';\nimport {\n DYNAMIC_ICONIC_SPRITE_URL,\n formatWalletProviderGroupKey,\n formatWalletProviderKey,\n} from '@dynamic-labs-sdk/client/core';\n\nimport type { BitcoinWalletProvider } from '../../../../BitcoinWalletProvider.types';\nimport type { UnisatInjectedProvider } from '../../unisat/UnisatInjectedProvider.types';\nimport { createUnisatWalletProvider } from '../../unisat/createUnisatWalletProvider';\n\nexport const BITGET_METADATA: WalletProviderMetadata = {\n displayName: 'Bitget Wallet',\n icon: `${DYNAMIC_ICONIC_SPRITE_URL}#bitgetwallet`,\n};\n\ntype CreateBitgetBitcoinWalletProviderParams = {\n dynamicClient: DynamicClient;\n injectedProvider: UnisatInjectedProvider;\n};\n\n// The Bitget provider interface is the same as Unisat provider interface\n// https://docs.bitkeep.com/en/docs/guide/wallet/btc.html\n/** @not-instrumented */\nexport const createBitgetBitcoinWalletProvider = ({\n dynamicClient,\n injectedProvider,\n}: CreateBitgetBitcoinWalletProviderParams): BitcoinWalletProvider => {\n const unisatWalletProvider = createUnisatWalletProvider({\n dynamicClient,\n injectedProvider,\n });\n\n return {\n ...unisatWalletProvider,\n groupKey: formatWalletProviderGroupKey(BITGET_METADATA.displayName),\n key: formatWalletProviderKey({\n chain: unisatWalletProvider.chain,\n displayName: BITGET_METADATA.displayName,\n walletProviderType: unisatWalletProvider.walletProviderType,\n }),\n metadata: BITGET_METADATA,\n };\n};\n","import { getInjectedProviderFromWindow } from '@dynamic-labs-sdk/client/core';\n\nimport type { UnisatInjectedProvider } from '../../unisat/UnisatInjectedProvider.types';\n\nconst BITGET_BITCOIN_PROVIDER_LOCATOR = 'bitkeep.unisat';\n\n// The Bitget provider interface is the same as Unisat provider interface\n// https://docs.bitkeep.com/en/docs/guide/wallet/btc.html\n/** @not-instrumented */\nexport const getBitgetBitcoinInjectedProvider = () => {\n return getInjectedProviderFromWindow<UnisatInjectedProvider>(\n BITGET_BITCOIN_PROVIDER_LOCATOR\n );\n};\n","import { networks } from 'bitcoinjs-lib';\n\n/** @not-instrumented */\n// eslint-disable-next-line custom-rules/require-single-object-param\nexport const convertNetworkIdForPsbt = (networkId: string) => {\n if (networkId === '1') {\n return networks.bitcoin;\n }\n\n // use networks.testnet for both testnet and signet\n if (networkId === '2' || networkId === '3') {\n return networks.testnet;\n }\n\n return undefined;\n};\n","import type { LeatherNetworkName } from '../LeatherBitcoinInjectedProvider.types';\n\n/** @not-instrumented */\n// eslint-disable-next-line custom-rules/require-single-object-param\nexport const convertNetworkIdToLeatherNetworkName = (\n networkId: string\n): LeatherNetworkName | undefined => {\n if (networkId === '1') {\n return 'mainnet';\n }\n\n if (networkId === '2') {\n return 'testnet';\n }\n\n if (networkId === '3') {\n return 'signet';\n }\n\n return undefined;\n};\n","import {\n type Chain,\n type DynamicClient,\n type WalletProviderMetadata,\n} from '@dynamic-labs-sdk/client';\nimport type { WalletProviderConnectAddress } from '@dynamic-labs-sdk/client/core';\nimport {\n DYNAMIC_ICONIC_SPRITE_URL,\n assertDefined,\n formatWalletProviderGroupKey,\n formatWalletProviderKey,\n getActiveNetworkIdFromLastKnownRegistry,\n} from '@dynamic-labs-sdk/client/core';\nimport { WalletProviderEnum } from '@dynamic-labs/sdk-api-core';\nimport type { BitcoinPaymentTypes } from '@leather.io/rpc';\nimport { Psbt } from 'bitcoinjs-lib';\n\nimport type { BitcoinWalletProvider } from '../../../../BitcoinWalletProvider.types';\nimport { bitcoinConfirmTransaction } from '../../../../utils/bitcoinConfirmTransaction';\nimport { bitcoinExecuteSwapTransaction } from '../../../../utils/bitcoinExecuteSwapTransaction';\nimport { bitcoinTransferAmount } from '../../../../utils/bitcoinTransferAmount';\nimport { convertNetworkIdForPsbt } from '../../../../utils/convertNetworkIdForPsbt';\nimport type { LeatherBitcoinInjectedProvider } from '../LeatherBitcoinInjectedProvider.types';\nimport { convertNetworkIdToLeatherNetworkName } from '../convertNetworkIdToLeatherNetworkName';\n\nexport const LEATHER_METADATA: WalletProviderMetadata = {\n displayName: 'Leather',\n icon: `${DYNAMIC_ICONIC_SPRITE_URL}#leather`,\n supportedHardwareWalletVendors: ['ledger'],\n};\n\ntype CreateLeatherBitcoinWalletProviderParams = {\n dynamicClient: DynamicClient;\n injectedProvider: LeatherBitcoinInjectedProvider;\n};\n\n/** @not-instrumented */\nexport const createLeatherBitcoinWalletProvider = ({\n dynamicClient,\n injectedProvider,\n}: CreateLeatherBitcoinWalletProviderParams): BitcoinWalletProvider => {\n const chain: Chain = 'BTC';\n\n const walletProviderType = WalletProviderEnum.BrowserExtension;\n\n const key = formatWalletProviderKey({\n chain,\n displayName: LEATHER_METADATA.displayName,\n walletProviderType,\n });\n\n const getNetworkPayload = async () => {\n const { networkId } = await getActiveNetworkId();\n const networkName = convertNetworkIdToLeatherNetworkName(networkId);\n\n return {\n networkId,\n networkName,\n };\n };\n\n const connect: BitcoinWalletProvider['connect'] = async () => {\n const response = await injectedProvider\n .request('getAddresses')\n .catch(({ error }) => {\n throw error;\n });\n\n const connectedAddresses = response.result.addresses;\n\n const addresses: WalletProviderConnectAddress[] = [];\n\n const ordinalsAddress = connectedAddresses?.find(\n (address) => address.type === 'p2tr'\n );\n\n if (ordinalsAddress) {\n addresses.push({\n address: ordinalsAddress.address,\n publicKey: ordinalsAddress.publicKey,\n type: 'ordinals',\n });\n }\n\n const paymentAddress = connectedAddresses?.find(\n (address) => address.type === 'p2wpkh'\n );\n\n if (paymentAddress) {\n addresses.push({\n address: paymentAddress.address,\n publicKey: paymentAddress.publicKey,\n type: 'payment',\n });\n }\n\n return {\n addresses,\n };\n };\n\n const getActiveNetworkId: BitcoinWalletProvider['getActiveNetworkId'] =\n async () =>\n getActiveNetworkIdFromLastKnownRegistry({\n client: dynamicClient,\n walletProviderKey: key,\n });\n\n // there's no specific method to get connected addresses in Leather\n const getConnectedAddresses: BitcoinWalletProvider['getConnectedAddresses'] =\n async () => {\n const accounts = await connect();\n return {\n addresses: accounts.addresses.map((address) => address.address),\n };\n };\n\n const sendBitcoin: BitcoinWalletProvider['sendBitcoin'] = async ({\n transaction,\n }) => {\n const { networkName } = await getNetworkPayload();\n\n const response = await injectedProvider\n .request('sendTransfer', {\n account: 0,\n address: transaction.recipientAddress,\n amount: transaction.amount.toString(),\n // network is required, so fallback to mainnet\n network: networkName ?? 'mainnet',\n })\n .catch(({ error }) => {\n throw error;\n });\n\n return {\n transactionId: response.result.txid,\n };\n };\n\n const signMessage: BitcoinWalletProvider['signMessage'] = async ({\n message,\n walletAccount,\n addressType,\n }) => {\n assertDefined(walletAccount, 'Wallet account not found');\n\n let paymentType: BitcoinPaymentTypes = 'p2tr';\n if (addressType === 'payment') {\n paymentType = 'p2wpkh';\n }\n\n const { networkName } = await getNetworkPayload();\n\n const response = await injectedProvider\n .request('signMessage', {\n message,\n network: networkName,\n paymentType,\n })\n .catch(({ error }) => {\n throw error;\n });\n\n return {\n signature: response.result.signature,\n };\n };\n\n const signPsbt: BitcoinWalletProvider['signPsbt'] = async ({ request }) => {\n const { networkId, networkName } = await getNetworkPayload();\n const psbtNetwork = convertNetworkIdForPsbt(networkId);\n\n const psbtFromBase64 = Psbt.fromBase64(request.unsignedPsbtBase64, {\n network: psbtNetwork,\n });\n\n const signAtIndex = request.signature\n ?.flatMap((sig) => sig.signingIndexes)\n .filter(Number.isInteger) as number[] | undefined;\n\n const response = await injectedProvider\n .request('signPsbt', {\n account: 0,\n allowedSighash: request.allowedSighash,\n broadcast: false,\n hex: psbtFromBase64.toHex(),\n // network is required, so fallback to mainnet\n network: networkName ?? 'mainnet',\n signAtIndex,\n })\n .catch(({ error }) => {\n throw error;\n });\n\n const signedPsbtHex = response.result.hex;\n\n return {\n signedPsbt: Psbt.fromHex(signedPsbtHex, {\n network: psbtNetwork,\n }).toBase64(),\n };\n };\n\n const signPsbts: BitcoinWalletProvider['signPsbts'] = async ({\n requests,\n walletAccount,\n }) => {\n const signedPsbts: string[] = [];\n\n for (const request of requests) {\n const signedPsbtResponse = await signPsbt({ request, walletAccount });\n\n if (signedPsbtResponse) {\n signedPsbts.push(signedPsbtResponse.signedPsbt);\n }\n }\n\n return {\n signedPsbts,\n };\n };\n\n return {\n chain,\n confirmTransaction: (args) =>\n bitcoinConfirmTransaction(args, dynamicClient),\n connect,\n executeSwapTransaction: (args) =>\n bitcoinExecuteSwapTransaction(args, dynamicClient),\n getActiveNetworkId,\n getConnectedAddresses,\n groupKey: formatWalletProviderGroupKey(LEATHER_METADATA.displayName),\n key,\n metadata: LEATHER_METADATA,\n sendBitcoin,\n signMessage,\n signPsbt,\n signPsbts,\n transferAmount: (args) => bitcoinTransferAmount(args, dynamicClient),\n walletProviderType,\n };\n};\n","import { getInjectedProviderFromWindow } from '@dynamic-labs-sdk/client/core';\n\nimport type { LeatherBitcoinInjectedProvider } from '../LeatherBitcoinInjectedProvider.types';\n\nconst LEATHER_BITCOIN_PROVIDER_LOCATOR = 'LeatherProvider';\n\n/** @not-instrumented */\nexport const getLeatherBitcoinInjectedProvider = () => {\n return getInjectedProviderFromWindow<LeatherBitcoinInjectedProvider>(\n LEATHER_BITCOIN_PROVIDER_LOCATOR\n );\n};\n","import { BitcoinNetworkType } from 'sats-connect';\n\n/** @not-instrumented */\n// eslint-disable-next-line custom-rules/require-single-object-param\nexport const convertNetworkIdToSatsConnectNetworkType = (networkId: string) => {\n if (networkId === '2') {\n return BitcoinNetworkType.Testnet;\n }\n\n if (networkId === '3') {\n return BitcoinNetworkType.Signet;\n }\n\n // fallback to mainnet\n return BitcoinNetworkType.Mainnet;\n};\n","import type { Psbt } from 'bitcoinjs-lib';\nimport type { InputToSign } from 'sats-connect';\n\nimport type { BitcoinSignPsbtRequest } from '../../BitcoinWalletProvider.types';\nimport { getSigHashType } from '../getSigHashType';\nimport { validatePsbt } from '../validatePsbt';\n\ntype GetPsbtInputsToSignForSatsConnectParams = {\n isLegacySatsConnect?: boolean;\n psbt: Psbt;\n request: BitcoinSignPsbtRequest;\n};\n\n/**\n * This method will create the psbt sign options for SatsConnect for the given request\n * It will validate the psbt against the signature data provided in the request\n * It will return the inputs to sign if the signature data is provided\n * @not-instrumented\n */\nexport const getPsbtInputsToSignForSatsConnect = ({\n psbt,\n request,\n isLegacySatsConnect,\n}: GetPsbtInputsToSignForSatsConnectParams) => {\n if (!request.signature) {\n return [];\n }\n\n validatePsbt({\n allowedSigHashTypes: request.allowedSighash,\n psbt,\n signatureData: request.signature,\n });\n\n const inputsToSign: InputToSign[] = [];\n\n for (const signature of request.signature) {\n if (signature.signingIndexes?.length) {\n for (const index of signature.signingIndexes) {\n inputsToSign.push({\n address: signature.address,\n sigHash: isLegacySatsConnect\n ? getSigHashType({ input: psbt.data.inputs[index] })\n : request.allowedSighash[0],\n signingIndexes: [index],\n });\n }\n }\n }\n\n return inputsToSign;\n};\n","import { MessageSigningProtocols } from 'sats-connect';\n\nimport type { BitcoinSignProtocol } from '../../BitcoinWalletProvider.types';\n\n/** @not-instrumented */\n// eslint-disable-next-line custom-rules/require-single-object-param\nexport const getSatsConnectSigningProtocol = (\n protocol: BitcoinSignProtocol | undefined\n): MessageSigningProtocols | undefined => {\n if (!protocol) {\n return undefined;\n }\n\n return protocol === 'ecdsa'\n ? MessageSigningProtocols.ECDSA\n : MessageSigningProtocols.BIP322;\n};\n","import type { WalletProviderConnectAddress } from '@dynamic-labs-sdk/client/core';\n\ntype ParseBitcoinConnectionResultParams = {\n connectedAddresses: {\n address: string;\n publicKey?: string;\n purpose: string;\n }[];\n};\n\n/** @not-instrumented */\nexport const parseBitcoinConnectionResult = ({\n connectedAddresses,\n}: ParseBitcoinConnectionResultParams) => {\n // Xverse will return other addresses/types that we don't support\n // so we filter them out\n const filteredAddresses = connectedAddresses.filter(\n (address) => address.purpose === 'ordinals' || address.purpose === 'payment'\n );\n\n const addresses: WalletProviderConnectAddress[] = filteredAddresses.map(\n (account) => ({\n address: account.address,\n publicKey: account.publicKey,\n type: account.purpose === 'payment' ? 'payment' : 'ordinals',\n })\n );\n\n // put ordinals addresses first, as they should be the main walletAccount address\n addresses.sort((a) => (a.type === 'ordinals' ? -1 : 1));\n\n return {\n addresses,\n };\n};\n","import {\n type Chain,\n type DynamicClient,\n UserRejectedError,\n type WalletProviderMetadata,\n assertWalletAccountSigningAvailability,\n getWalletAccountAddressByType,\n} from '@dynamic-labs-sdk/client';\nimport {\n DYNAMIC_ICONIC_SPRITE_URL,\n assertDefined,\n createWalletProviderEventEmitter,\n formatWalletProviderGroupKey,\n formatWalletProviderKey,\n getActiveNetworkIdFromLastKnownRegistry,\n} from '@dynamic-labs-sdk/client/core';\nimport { WalletProviderEnum } from '@dynamic-labs/sdk-api-core';\nimport { Psbt } from 'bitcoinjs-lib';\nimport { type Json, createUnsecuredToken } from 'jsontokens';\nimport type {\n BitcoinProvider,\n GetAddressResponse,\n SignMultiplePsbtPayload,\n SignMultipleTransactionsPayload,\n} from 'sats-connect';\nimport {\n AddressPurpose,\n addListener,\n getAddress,\n signMessage as satsConnectSignMessage,\n sendBtcTransaction,\n signTransaction,\n} from 'sats-connect';\n\nimport type {\n BitcoinSendTransactionResponse,\n BitcoinWalletProvider,\n} from '../../../../BitcoinWalletProvider.types';\nimport { InvalidPsbtError } from '../../../../errors/InvalidPsbtError';\nimport { bitcoinConfirmTransaction } from '../../../../utils/bitcoinConfirmTransaction';\nimport { bitcoinExecuteSwapTransaction } from '../../../../utils/bitcoinExecuteSwapTransaction';\nimport { bitcoinTransferAmount } from '../../../../utils/bitcoinTransferAmount';\nimport { convertNetworkIdForPsbt } from '../../../../utils/convertNetworkIdForPsbt';\nimport { convertNetworkIdToSatsConnectNetworkType } from '../../../../utils/convertNetworkIdToSatsConnectNetworkType';\nimport { getPsbtInputsToSignForSatsConnect } from '../../../../utils/getPsbtInputsToSignForSatsConnect';\nimport { getSatsConnectSigningProtocol } from '../../../../utils/getSatsConnectSigningProtocol';\nimport { parseBitcoinConnectionResult } from '../../../../utils/parseBitcoinConnectionResult';\n\nexport const MAGIC_EDEN_METADATA: WalletProviderMetadata = {\n displayName: 'Magic Eden',\n icon: `${DYNAMIC_ICONIC_SPRITE_URL}#magiceden`,\n supportedHardwareWalletVendors: ['ledger'],\n};\n\ntype CreateMagicEdenBitcoinWalletProviderParams = {\n dynamicClient: DynamicClient;\n satsConnectProvider: BitcoinProvider;\n};\n\n// https://docs-wallet.magiceden.io/bitcoin/detecting-the-provider\n/** @not-instrumented */\nexport const createMagicEdenBitcoinWalletProvider = ({\n dynamicClient,\n satsConnectProvider,\n}: CreateMagicEdenBitcoinWalletProviderParams): BitcoinWalletProvider => {\n const chain: Chain = 'BTC';\n\n const walletProviderType = WalletProviderEnum.BrowserExtension;\n\n const key = formatWalletProviderKey({\n chain,\n displayName: MAGIC_EDEN_METADATA.displayName,\n walletProviderType,\n });\n\n const getNetworkPayload = async () => {\n const activeNetworkId = await getActiveNetworkId();\n const networkType = convertNetworkIdToSatsConnectNetworkType(\n activeNetworkId.networkId\n );\n\n return {\n network: { type: networkType },\n };\n };\n\n const connect: BitcoinWalletProvider['connect'] = async () => {\n const { network } = await getNetworkPayload();\n\n return new Promise((resolve, reject) => {\n void getAddress({\n getProvider: async () => satsConnectProvider,\n onCancel: () => {\n reject(new UserRejectedError({ action: 'connect' }));\n },\n onFinish: async (response: GetAddressResponse) => {\n const { addresses: connectedAddresses } = response;\n\n const { addresses } = parseBitcoinConnectionResult({\n connectedAddresses,\n });\n\n resolve({\n addresses,\n });\n },\n payload: {\n message: 'Address for receiving Ordinals and payments',\n network,\n purposes: [AddressPurpose.Ordinals, AddressPurpose.Payment],\n },\n });\n });\n };\n\n const getActiveNetworkId: BitcoinWalletProvider['getActiveNetworkId'] =\n async () =>\n getActiveNetworkIdFromLastKnownRegistry({\n client: dynamicClient,\n walletProviderKey: key,\n });\n\n // there's no specific method to get connected addresses in Magic Eden\n // so we use the connect method to get the addresses\n const getConnectedAddresses: BitcoinWalletProvider['getConnectedAddresses'] =\n async () => {\n const { addresses } = await connect();\n return { addresses: addresses.map((address) => address.address) };\n };\n\n const sendBitcoin: BitcoinWalletProvider['sendBitcoin'] = async ({\n transaction,\n walletAccount,\n }): Promise<BitcoinSendTransactionResponse> => {\n await assertWalletAccountSigningAvailability(\n { walletAccount },\n dynamicClient\n );\n\n // should use payment address if available\n const senderAddress =\n getWalletAccountAddressByType({\n type: 'payment',\n walletAccount,\n }) ?? walletAccount.address;\n\n const { network } = await getNetworkPayload();\n\n return new Promise((resolve, reject) => {\n void sendBtcTransaction({\n getProvider: async () => satsConnectProvider,\n onCancel: () => {\n reject(new UserRejectedError({ action: 'sendBitcoin' }));\n },\n onFinish: (response) => {\n resolve({ transactionId: response });\n },\n payload: {\n network,\n recipients: [\n {\n address: transaction.recipientAddress,\n amountSats: BigInt(transaction.amount),\n },\n ],\n senderAddress,\n },\n });\n });\n };\n\n const signMessage: BitcoinWalletProvider['signMessage'] = async ({\n message,\n walletAccount,\n protocol,\n addressType,\n }) => {\n assertDefined(walletAccount, 'Wallet account not found');\n\n await assertWalletAccountSigningAvailability(\n { walletAccount },\n dynamicClient\n );\n\n const { network } = await getNetworkPayload();\n\n let addressToSignWith = walletAccount.address;\n if (addressType) {\n addressToSignWith =\n getWalletAccountAddressByType({\n type: addressType,\n walletAccount,\n }) ?? addressToSignWith;\n }\n\n return new Promise((resolve, reject) => {\n void satsConnectSignMessage({\n getProvider: async () => satsConnectProvider,\n onCancel: () => {\n reject(new UserRejectedError({ action: 'signMessage' }));\n },\n // eslint-disable-next-line custom-rules/require-single-object-param\n onFinish: async (response: string) => {\n resolve({ signature: response });\n },\n payload: {\n address: addressToSignWith,\n message: message,\n network,\n protocol: getSatsConnectSigningProtocol(protocol),\n },\n });\n });\n };\n\n const signPsbt: BitcoinWalletProvider['signPsbt'] = async ({\n request,\n walletAccount,\n }) => {\n if (!request.allowedSighash.length) {\n throw new InvalidPsbtError('allowedSighash cannot be an empty array');\n }\n\n await assertWalletAccountSigningAvailability(\n { walletAccount },\n dynamicClient\n );\n\n const activeNetworkId = await getActiveNetworkId();\n const network = convertNetworkIdForPsbt(activeNetworkId.networkId);\n const { network: networkPayload } = await getNetworkPayload();\n\n const psbtFromBase64 = Psbt.fromBase64(request.unsignedPsbtBase64, {\n network,\n });\n\n const inputsToSign = getPsbtInputsToSignForSatsConnect({\n isLegacySatsConnect: true,\n psbt: psbtFromBase64,\n request,\n });\n\n return new Promise((resolve, reject) => {\n void signTransaction({\n getProvider: async () => satsConnectProvider,\n onCancel: () => {\n reject(new UserRejectedError({ action: 'signPsbt' }));\n },\n onFinish: (response) => {\n resolve({ signedPsbt: response.psbtBase64 });\n },\n payload: {\n broadcast: false,\n inputsToSign,\n message: 'Sign Pbst',\n network: networkPayload,\n psbtBase64: request.unsignedPsbtBase64,\n },\n });\n });\n };\n\n const signPsbts: BitcoinWalletProvider['signPsbts'] = async ({\n requests,\n walletAccount,\n }) => {\n await assertWalletAccountSigningAvailability(\n { walletAccount },\n dynamicClient\n );\n\n const activeNetworkId = await getActiveNetworkId();\n const network = convertNetworkIdForPsbt(activeNetworkId.networkId);\n const { network: networkPayload } = await getNetworkPayload();\n\n const psbtsToSign: SignMultiplePsbtPayload[] = [];\n\n for (const request of requests) {\n const psbtFromBase64 = Psbt.fromBase64(request.unsignedPsbtBase64, {\n network,\n });\n const inputsToSign = getPsbtInputsToSignForSatsConnect({\n isLegacySatsConnect: true,\n psbt: psbtFromBase64,\n request,\n });\n\n psbtsToSign.push({\n inputsToSign,\n psbtBase64: request.unsignedPsbtBase64,\n });\n }\n\n const signMultipleTransactionPayload: SignMultipleTransactionsPayload = {\n message: 'Sign Pbsts',\n network: networkPayload,\n psbts: psbtsToSign,\n };\n\n // Magic Eden has implemented their own signTransactions feature, and have requested us\n // to ensure we use it rather than the general Sats Connect API for this method\n const request = createUnsecuredToken(\n signMultipleTransactionPayload as unknown as Json\n );\n const response = await satsConnectProvider.signMultipleTransactions(\n request\n );\n\n return {\n signedPsbts: response.map((response) => response.psbtBase64),\n };\n };\n\n const { getEventEmitter, cleanupEventEmitter } =\n createWalletProviderEventEmitter<{\n removeAccountChangeListener: VoidFunction;\n }>({\n removeEventListeners: ({ setupReturnValue }) => {\n assertDefined(setupReturnValue, 'Setup return value not defined');\n\n setupReturnValue.removeAccountChangeListener();\n },\n\n setupEventListeners: ({ handleAccountsChanged }) => {\n const removeAccountChangeListener = addListener(\n 'accountsChanged',\n (accounts: { address: string; purpose: AddressPurpose }[]) => {\n if (!accounts) {\n return;\n }\n\n handleAccountsChanged({\n addresses: accounts.map((account) => account.address),\n });\n }\n );\n\n return {\n removeAccountChangeListener,\n };\n },\n\n supportedEvents: ['accountsChanged'],\n });\n\n const terminate: BitcoinWalletProvider['terminate'] = async () => {\n cleanupEventEmitter();\n };\n\n return {\n chain,\n confirmTransaction: (args) =>\n bitcoinConfirmTransaction(args, dynamicClient),\n connect,\n get events() {\n return getEventEmitter();\n },\n executeSwapTransaction: (args) =>\n bitcoinExecuteSwapTransaction(args, dynamicClient),\n getActiveNetworkId,\n getConnectedAddresses,\n groupKey: formatWalletProviderGroupKey(MAGIC_EDEN_METADATA.displayName),\n key,\n metadata: MAGIC_EDEN_METADATA,\n sendBitcoin,\n signMessage,\n signPsbt,\n signPsbts,\n terminate,\n transferAmount: (args) => bitcoinTransferAmount(args, dynamicClient),\n walletProviderType,\n };\n};\n","import { getInjectedProviderFromWindow } from '@dynamic-labs-sdk/client/core';\nimport type { BitcoinProvider } from 'sats-connect';\n\nconst MAGIC_EDEN_BITCOIN_PROVIDER_LOCATOR = 'magicEden.bitcoin';\n\n/** @not-instrumented */\nexport const getMagicEdenInjectedProvider = () => {\n return getInjectedProviderFromWindow<BitcoinProvider>(\n MAGIC_EDEN_BITCOIN_PROVIDER_LOCATOR\n );\n};\n","import {\n type Chain,\n type DynamicClient,\n type WalletProviderMetadata,\n assertWalletAccountSigningAvailability,\n} from '@dynamic-labs-sdk/client';\nimport {\n DYNAMIC_ICONIC_SPRITE_URL,\n assertDefined,\n createWalletProviderEventEmitter,\n formatWalletProviderGroupKey,\n formatWalletProviderKey,\n} from '@dynamic-labs-sdk/client/core';\nimport { WalletProviderEnum } from '@dynamic-labs/sdk-api-core';\nimport { Psbt } from 'bitcoinjs-lib';\n\nimport type {\n BitcoinSendTransactionResponse,\n BitcoinWalletProvider,\n SignPsbtOptions,\n} from '../../../../BitcoinWalletProvider.types';\nimport { bitcoinConfirmTransaction } from '../../../../utils/bitcoinConfirmTransaction';\nimport { bitcoinExecuteSwapTransaction } from '../../../../utils/bitcoinExecuteSwapTransaction';\nimport { bitcoinTransferAmount } from '../../../../utils/bitcoinTransferAmount';\nimport { createPsbtOptions } from '../../../../utils/createPsbtOptions';\nimport { getNetworkIdFromNetworkName } from '../../../../utils/getNetworkIdFromNetworkName';\nimport type { OkxBitcoinInjectedProvider } from '../OkxBitcoinInjectedProvider.types';\n\nexport const OKX_METADATA: WalletProviderMetadata = {\n displayName: 'OKX Wallet',\n icon: `${DYNAMIC_ICONIC_SPRITE_URL}#okx`,\n};\n\ntype CreateOkxBitcoinWalletProviderParams = {\n dynamicClient: DynamicClient;\n injectedProvider: OkxBitcoinInjectedProvider;\n};\n\n/** @not-instrumented */\nexport const createOkxBitcoinWalletProvider = ({\n dynamicClient,\n injectedProvider,\n}: CreateOkxBitcoinWalletProviderParams): BitcoinWalletProvider => {\n const chain: Chain = 'BTC';\n\n const walletProviderType = WalletProviderEnum.BrowserExtension;\n\n const key = formatWalletProviderKey({\n chain,\n displayName: OKX_METADATA.displayName,\n walletProviderType,\n });\n\n const connect: BitcoinWalletProvider['connect'] = async () => {\n const { address, publicKey } = await injectedProvider.connect();\n\n return {\n addresses: [{ address, publicKey }],\n };\n };\n\n const getActiveNetworkId: BitcoinWalletProvider['getActiveNetworkId'] =\n async () => {\n const network = await injectedProvider.getNetwork();\n\n return getNetworkIdFromNetworkName(\n { networkName: network },\n dynamicClient\n );\n };\n\n const getConnectedAddresses: BitcoinWalletProvider['getConnectedAddresses'] =\n async () => {\n const accounts = await injectedProvider.getAccounts();\n\n return {\n addresses: accounts,\n };\n };\n\n const sendBitcoin: BitcoinWalletProvider['sendBitcoin'] = async ({\n transaction,\n walletAccount,\n }): Promise<BitcoinSendTransactionResponse> => {\n await assertWalletAccountSigningAvailability(\n { walletAccount },\n dynamicClient\n );\n\n const transactionId = await injectedProvider.sendBitcoin(\n transaction.recipientAddress,\n transaction.amount.toString()\n );\n\n return {\n transactionId,\n };\n };\n\n const signMessage: BitcoinWalletProvider['signMessage'] = async ({\n message,\n walletAccount,\n protocol,\n }) => {\n assertDefined(walletAccount, 'Wallet account not found');\n\n await assertWalletAccountSigningAvailability(\n { walletAccount },\n dynamicClient\n );\n\n const signedMessage = await injectedProvider.signMessage(message, protocol);\n\n return {\n signature: signedMessage,\n };\n };\n\n const signPsbt: BitcoinWalletProvider['signPsbt'] = async ({\n request,\n walletAccount,\n }) => {\n await assertWalletAccountSigningAvailability(\n { walletAccount },\n dynamicClient\n );\n\n const psbtFromBase64 = Psbt.fromBase64(request.unsignedPsbtBase64);\n\n const signedPsbtHex = await injectedProvider.signPsbt(\n psbtFromBase64.toHex(),\n createPsbtOptions({ psbt: psbtFromBase64, request })\n );\n\n return { signedPsbt: Psbt.fromHex(signedPsbtHex).toBase64() };\n };\n\n const signPsbts: BitcoinWalletProvider['signPsbts'] = async ({\n requests,\n walletAccount,\n }) => {\n await assertWalletAccountSigningAvailability(\n { walletAccount },\n dynamicClient\n );\n\n const psbtHexs: string[] = [];\n const psbtOptions: SignPsbtOptions[] = [];\n\n for (const request of requests) {\n const psbtFromBase64 = Psbt.fromBase64(request.unsignedPsbtBase64);\n\n psbtHexs.push(psbtFromBase64.toHex());\n psbtOptions.push(createPsbtOptions({ psbt: psbtFromBase64, request }));\n }\n\n const signedPsbtHexs = await injectedProvider.signPsbts(\n psbtHexs,\n psbtOptions\n );\n\n return {\n signedPsbts: signedPsbtHexs.map((signedPsbtHex) =>\n Psbt.fromHex(signedPsbtHex).toBase64()\n ),\n };\n };\n\n const { getEventEmitter, cleanupEventEmitter } =\n createWalletProviderEventEmitter({\n removeEventListeners: () => {\n injectedProvider?.removeAllListeners();\n },\n\n setupEventListeners: ({ handleAccountsChanged }) => {\n injectedProvider?.on('accountsChanged', (addresses) => {\n handleAccountsChanged({ addresses });\n });\n },\n\n supportedEvents: ['accountsChanged'],\n });\n\n const terminate: BitcoinWalletProvider['terminate'] = async () => {\n cleanupEventEmitter();\n };\n\n return {\n chain,\n confirmTransaction: (args) =>\n bitcoinConfirmTransaction(args, dynamicClient),\n connect,\n get events() {\n return getEventEmitter();\n },\n executeSwapTransaction: (args) =>\n bitcoinExecuteSwapTransaction(args, dynamicClient),\n getActiveNetworkId,\n getConnectedAddresses,\n groupKey: formatWalletProviderGroupKey(OKX_METADATA.displayName),\n key,\n metadata: OKX_METADATA,\n sendBitcoin,\n signMessage,\n signPsbt,\n signPsbts,\n terminate,\n transferAmount: (args) => bitcoinTransferAmount(args, dynamicClient),\n walletProviderType,\n };\n};\n","import { getInjectedProviderFromWindow } from '@dynamic-labs-sdk/client/core';\n\nimport type { OkxBitcoinInjectedProvider } from '../OkxBitcoinInjectedProvider.types';\n\nconst OKX_BITCOIN_PROVIDER_LOCATOR = 'okxwallet.bitcoin';\n\n/** @not-instrumented */\nexport const getOkxBitcoinInjectedProvider = () => {\n return getInjectedProviderFromWindow<OkxBitcoinInjectedProvider>(\n OKX_BITCOIN_PROVIDER_LOCATOR\n );\n};\n","import {\n type Chain,\n type DynamicClient,\n type WalletProviderMetadata,\n assertWalletAccountSigningAvailability,\n} from '@dynamic-labs-sdk/client';\nimport {\n DYNAMIC_ICONIC_SPRITE_URL,\n assertDefined,\n createWalletProviderEventEmitter,\n formatWalletProviderGroupKey,\n formatWalletProviderKey,\n} from '@dynamic-labs-sdk/client/core';\nimport { WalletProviderEnum } from '@dynamic-labs/sdk-api-core';\nimport { Psbt } from 'bitcoinjs-lib';\n\nimport type {\n BitcoinSendTransactionResponse,\n BitcoinWalletProvider,\n} from '../../../../BitcoinWalletProvider.types';\nimport { bitcoinConfirmTransaction } from '../../../../utils/bitcoinConfirmTransaction';\nimport { bitcoinExecuteSwapTransaction } from '../../../../utils/bitcoinExecuteSwapTransaction';\nimport { bitcoinTransferAmount } from '../../../../utils/bitcoinTransferAmount';\nimport { getNetworkIdFromNetworkName } from '../../../../utils/getNetworkIdFromNetworkName';\nimport type { OneKeyBitcoinInjectedProvider } from '../OneKeyBitcoinInjectedProvider.types';\n\nexport const ONEKEY_METADATA: WalletProviderMetadata = {\n displayName: 'OneKey',\n icon: `${DYNAMIC_ICONIC_SPRITE_URL}#onekey`,\n};\n\ntype CreateOneKeyBitcoinWalletProviderParams = {\n dynamicClient: DynamicClient;\n injectedProvider: OneKeyBitcoinInjectedProvider;\n};\n\n/** @not-instrumented */\nexport const createOneKeyBitcoinWalletProvider = ({\n dynamicClient,\n injectedProvider,\n}: CreateOneKeyBitcoinWalletProviderParams): BitcoinWalletProvider => {\n const chain: Chain = 'BTC';\n\n const walletProviderType = WalletProviderEnum.BrowserExtension;\n\n const key = formatWalletProviderKey({\n chain,\n displayName: ONEKEY_METADATA.displayName,\n walletProviderType,\n });\n\n const connect: BitcoinWalletProvider['connect'] = async () => {\n const accounts = await injectedProvider.requestAccounts();\n\n const address = accounts[0];\n const publicKey = await injectedProvider.getPublicKey();\n\n return {\n addresses: [{ address, publicKey }],\n };\n };\n\n const getActiveNetworkId: BitcoinWalletProvider['getActiveNetworkId'] =\n async () => {\n const network = await injectedProvider.getNetwork();\n\n return getNetworkIdFromNetworkName(\n { networkName: network },\n dynamicClient\n );\n };\n\n const getConnectedAddresses: BitcoinWalletProvider['getConnectedAddresses'] =\n async () => {\n const accounts = await injectedProvider.getAccounts();\n\n return {\n addresses: accounts,\n };\n };\n\n const sendBitcoin: BitcoinWalletProvider['sendBitcoin'] = async ({\n transaction,\n walletAccount,\n }): Promise<BitcoinSendTransactionResponse> => {\n await assertWalletAccountSigningAvailability(\n { walletAccount },\n dynamicClient\n );\n\n const transactionId = await injectedProvider.sendBitcoin(\n transaction.recipientAddress,\n transaction.amount.toString()\n );\n\n return {\n transactionId,\n };\n };\n\n const signMessage: BitcoinWalletProvider['signMessage'] = async ({\n message,\n walletAccount,\n protocol,\n }) => {\n assertDefined(walletAccount, 'Wallet account not found');\n\n await assertWalletAccountSigningAvailability(\n { walletAccount },\n dynamicClient\n );\n\n const signedMessage = await injectedProvider.signMessage(message, protocol);\n\n return {\n signature: signedMessage,\n };\n };\n\n const signPsbt: BitcoinWalletProvider['signPsbt'] = async ({\n request,\n walletAccount,\n }) => {\n await assertWalletAccountSigningAvailability(\n { walletAccount },\n dynamicClient\n );\n\n const psbtFromBase64 = Psbt.fromBase64(request.unsignedPsbtBase64);\n\n const signedPsbtHex = await injectedProvider.signPsbt(\n psbtFromBase64.toHex(),\n { autoFinalized: false }\n );\n\n return { signedPsbt: Psbt.fromHex(signedPsbtHex).toBase64() };\n };\n\n const signPsbts: BitcoinWalletProvider['signPsbts'] = async ({\n requests,\n walletAccount,\n }) => {\n await assertWalletAccountSigningAvailability(\n { walletAccount },\n dynamicClient\n );\n\n const psbtHexs: string[] = [];\n\n for (const request of requests) {\n const psbtFromBase64 = Psbt.fromBase64(request.unsignedPsbtBase64);\n\n psbtHexs.push(psbtFromBase64.toHex());\n }\n\n const signedPsbtHexs = await injectedProvider.signPsbts(psbtHexs, {\n autoFinalized: false,\n });\n\n return {\n signedPsbts: signedPsbtHexs.map((signedPsbtHex) =>\n Psbt.fromHex(signedPsbtHex).toBase64()\n ),\n };\n };\n\n const { getEventEmitter, cleanupEventEmitter } =\n createWalletProviderEventEmitter({\n removeEventListeners: () => {\n injectedProvider?.removeAllListeners();\n },\n\n setupEventListeners: ({\n handleAccountsChanged,\n handleNetworkChanged,\n }) => {\n injectedProvider?.on('accountsChanged', (addresses) => {\n handleAccountsChanged({ addresses });\n });\n\n injectedProvider?.on('networkChanged', (network) => {\n handleNetworkChanged({ networkId: network });\n });\n },\n\n supportedEvents: ['accountsChanged', 'networkChanged'],\n });\n\n const terminate: BitcoinWalletProvider['terminate'] = async () => {\n cleanupEventEmitter();\n };\n\n return {\n chain,\n confirmTransaction: (args) =>\n bitcoinConfirmTransaction(args, dynamicClient),\n connect,\n get events() {\n return getEventEmitter();\n },\n executeSwapTransaction: (args) =>\n bitcoinExecuteSwapTransaction(args, dynamicClient),\n getActiveNetworkId,\n getConnectedAddresses,\n groupKey: formatWalletProviderGroupKey(ONEKEY_METADATA.displayName),\n key,\n metadata: ONEKEY_METADATA,\n sendBitcoin,\n signMessage,\n signPsbt,\n signPsbts,\n terminate,\n transferAmount: (args) => bitcoinTransferAmount(args, dynamicClient),\n walletProviderType,\n };\n};\n","import { getInjectedProviderFromWindow } from '@dynamic-labs-sdk/client/core';\n\nimport type { OneKeyBitcoinInjectedProvider } from '../OneKeyBitcoinInjectedProvider.types';\n\nconst ONEKEY_BITCOIN_PROVIDER_LOCATOR = '$onekey.btc';\n\n/** @not-instrumented */\nexport const getOneKeyBitcoinInjectedProvider = () => {\n return getInjectedProviderFromWindow<OneKeyBitcoinInjectedProvider>(\n ONEKEY_BITCOIN_PROVIDER_LOCATOR\n );\n};\n","import {\n type Chain,\n type DynamicClient,\n type WalletProviderMetadata,\n assertWalletAccountSigningAvailability,\n getWalletAccountAddressByType,\n} from '@dynamic-labs-sdk/client';\nimport type { WalletProviderConnectAddress } from '@dynamic-labs-sdk/client/core';\nimport {\n DYNAMIC_ICONIC_SPRITE_URL,\n assertDefined,\n formatWalletProviderGroupKey,\n formatWalletProviderKey,\n} from '@dynamic-labs-sdk/client/core';\nimport { WalletProviderEnum } from '@dynamic-labs/sdk-api-core';\nimport { Psbt } from 'bitcoinjs-lib';\n\nimport type { BitcoinWalletProvider } from '../../../../BitcoinWalletProvider.types';\nimport { bitcoinConfirmTransaction } from '../../../../utils/bitcoinConfirmTransaction';\nimport { bitcoinExecuteSwapTransaction } from '../../../../utils/bitcoinExecuteSwapTransaction';\nimport { bitcoinTransferAmount } from '../../../../utils/bitcoinTransferAmount';\nimport { getNetworkIdFromNetworkName } from '../../../../utils/getNetworkIdFromNetworkName';\nimport type { OylBitcoinInjectedProvider } from '../OylBitcoinInjectedProvider.types';\n\nexport const OYL_METADATA: WalletProviderMetadata = {\n displayName: 'Oyl Wallet',\n icon: `${DYNAMIC_ICONIC_SPRITE_URL}#oyl`,\n};\n\ntype CreatePhantomBitcoinWalletProviderParams = {\n dynamicClient: DynamicClient;\n injectedProvider: OylBitcoinInjectedProvider;\n};\n\n/** @not-instrumented */\nexport const createOylBitcoinWalletProvider = ({\n dynamicClient,\n injectedProvider,\n}: CreatePhantomBitcoinWalletProviderParams): BitcoinWalletProvider => {\n const chain: Chain = 'BTC';\n\n const walletProviderType = WalletProviderEnum.BrowserExtension;\n\n const key = formatWalletProviderKey({\n chain,\n displayName: OYL_METADATA.displayName,\n walletProviderType,\n });\n\n const connect: BitcoinWalletProvider['connect'] = async () => {\n const connectedAddresses = await injectedProvider.getAddresses();\n\n const addresses: WalletProviderConnectAddress[] = [];\n\n const ordinalsAddress = connectedAddresses.taproot;\n if (ordinalsAddress) {\n addresses.push({\n address: ordinalsAddress.address,\n publicKey: ordinalsAddress.publicKey,\n type: 'ordinals',\n });\n }\n\n const paymentAddress = connectedAddresses.nativeSegwit;\n if (paymentAddress) {\n addresses.push({\n address: paymentAddress.address,\n publicKey: paymentAddress.publicKey,\n type: 'payment',\n });\n }\n\n return {\n addresses,\n };\n };\n\n const getActiveNetworkId: BitcoinWalletProvider['getActiveNetworkId'] =\n async () => {\n const network = await injectedProvider.getNetwork();\n\n return getNetworkIdFromNetworkName(\n { networkName: network },\n dynamicClient\n );\n };\n\n // there's no specific method to get connected addresses in Oyl\n // so we check if the selected account is connected and return the addresses\n // if not, we return an empty array\n const getConnectedAddresses: BitcoinWalletProvider['getConnectedAddresses'] =\n async () => {\n const isSelectedAccountConnected = await injectedProvider.isConnected();\n\n if (!isSelectedAccountConnected) {\n return { addresses: [] };\n }\n\n // calling connect won't prompt the user to connect again if isConnected is true\n const { addresses } = await connect();\n return { addresses: addresses.map((address) => address.address) };\n };\n\n const signMessage: BitcoinWalletProvider['signMessage'] = async ({\n message,\n walletAccount,\n addressType,\n protocol,\n }) => {\n assertDefined(walletAccount, 'Wallet account not found');\n\n await assertWalletAccountSigningAvailability(\n { walletAccount },\n dynamicClient\n );\n\n let addressToSignWith = walletAccount.address;\n if (addressType) {\n addressToSignWith =\n getWalletAccountAddressByType({\n type: addressType,\n walletAccount,\n }) ?? addressToSignWith;\n }\n\n const result = await injectedProvider.signMessage({\n address: addressToSignWith,\n message,\n // Oyl Wallet calls it just bip322 instead of bip322-simple\n protocol: protocol === 'bip322-simple' ? 'bip322' : protocol,\n });\n\n return {\n signature: result.signature,\n };\n };\n\n const signPsbt: BitcoinWalletProvider['signPsbt'] = async ({\n request,\n walletAccount,\n }) => {\n await assertWalletAccountSigningAvailability(\n { walletAccount },\n dynamicClient\n );\n\n const psbtFromBase64 = Psbt.fromBase64(request.unsignedPsbtBase64);\n\n const { psbt: signedPsbtHex } = await injectedProvider.signPsbt({\n broadcast: false,\n finalize: false,\n psbt: psbtFromBase64.toHex(),\n });\n\n return { signedPsbt: Psbt.fromHex(signedPsbtHex).toBase64() };\n };\n\n const signPsbts: BitcoinWalletProvider['signPsbts'] = async ({\n requests,\n walletAccount,\n }) => {\n await assertWalletAccountSigningAvailability(\n { walletAccount },\n dynamicClient\n );\n\n const signedPsbts: string[] = [];\n\n for (const request of requests) {\n const signedPsbtResponse = await signPsbt({ request, walletAccount });\n\n if (signedPsbtResponse) {\n signedPsbts.push(signedPsbtResponse.signedPsbt);\n }\n }\n\n return {\n signedPsbts,\n };\n };\n\n return {\n chain,\n confirmTransaction: (args) =>\n bitcoinConfirmTransaction(args, dynamicClient),\n connect,\n executeSwapTransaction: (args) =>\n bitcoinExecuteSwapTransaction(args, dynamicClient),\n getActiveNetworkId,\n getConnectedAddresses,\n groupKey: formatWalletProviderGroupKey(OYL_METADATA.displayName),\n key,\n metadata: OYL_METADATA,\n signMessage,\n signPsbt,\n signPsbts,\n transferAmount: (args) => bitcoinTransferAmount(args, dynamicClient),\n walletProviderType,\n };\n};\n","import { getInjectedProviderFromWindow } from '@dynamic-labs-sdk/client/core';\n\nimport type { OylBitcoinInjectedProvider } from '../OylBitcoinInjectedProvider.types';\n\nconst OYL_BITCOIN_PROVIDER_LOCATOR = 'oyl';\n\n/** @not-instrumented */\nexport const getOylBitcoinInjectedProvider = () => {\n return getInjectedProviderFromWindow<OylBitcoinInjectedProvider>(\n OYL_BITCOIN_PROVIDER_LOCATOR\n );\n};\n","import {\n type Chain,\n type DynamicClient,\n type WalletProviderMetadata,\n assertWalletAccountSigningAvailability,\n getWalletAccountAddressByType,\n} from '@dynamic-labs-sdk/client';\nimport type { WalletProviderConnectAddress } from '@dynamic-labs-sdk/client/core';\nimport {\n DYNAMIC_ICONIC_SPRITE_URL,\n assertDefined,\n createWalletProviderEventEmitter,\n formatWalletProviderGroupKey,\n formatWalletProviderKey,\n getActiveNetworkIdFromLastKnownRegistry,\n getBuffer,\n} from '@dynamic-labs-sdk/client/core';\nimport { WalletProviderEnum } from '@dynamic-labs/sdk-api-core';\nimport { Psbt } from 'bitcoinjs-lib';\n\nimport type { BitcoinWalletProvider } from '../../../../BitcoinWalletProvider.types';\nimport { bitcoinConfirmTransaction } from '../../../../utils/bitcoinConfirmTransaction';\nimport { bitcoinExecuteSwapTransaction } from '../../../../utils/bitcoinExecuteSwapTransaction';\nimport { bitcoinTransferAmount } from '../../../../utils/bitcoinTransferAmount';\nimport type { PhantomBitcoinInjectedProvider } from '../PhantomBitcoinInjectedProvider.types';\n\nexport const PHANTOM_METADATA: WalletProviderMetadata = {\n displayName: 'Phantom',\n icon: `${DYNAMIC_ICONIC_SPRITE_URL}#phantom`,\n supportedHardwareWalletVendors: ['ledger'],\n};\n\ntype CreatePhantomBitcoinWalletProviderParams = {\n dynamicClient: DynamicClient;\n injectedProvider: PhantomBitcoinInjectedProvider;\n};\n\n/** @not-instrumented */\nexport const createPhantomBitcoinWalletProvider = ({\n dynamicClient,\n injectedProvider,\n}: CreatePhantomBitcoinWalletProviderParams): BitcoinWalletProvider => {\n const chain: Chain = 'BTC';\n\n const walletProviderType = WalletProviderEnum.BrowserExtension;\n\n const key = formatWalletProviderKey({\n chain,\n displayName: PHANTOM_METADATA.displayName,\n walletProviderType,\n });\n\n const connect: BitcoinWalletProvider['connect'] = async () => {\n const accounts = await injectedProvider.requestAccounts();\n\n const addresses: WalletProviderConnectAddress[] = accounts.map(\n (account) => ({\n address: account.address,\n publicKey: account.publicKey,\n type: account.purpose === 'payment' ? 'payment' : 'ordinals',\n })\n );\n\n // put ordinals addresses first, as they should be the main walletAccount address\n addresses.sort((a) => (a.type === 'ordinals' ? -1 : 1));\n\n return {\n addresses,\n };\n };\n\n const getActiveNetworkId: BitcoinWalletProvider['getActiveNetworkId'] =\n async () =>\n getActiveNetworkIdFromLastKnownRegistry({\n client: dynamicClient,\n walletProviderKey: key,\n });\n\n // there's no specific method to get connected addresses in Phantom\n // so we use the connect method to get the addresses\n const getConnectedAddresses: BitcoinWalletProvider['getConnectedAddresses'] =\n async () => {\n const { addresses } = await connect();\n return { addresses: addresses.map((address) => address.address) };\n };\n\n const signMessage: BitcoinWalletProvider['signMessage'] = async ({\n message,\n walletAccount,\n addressType,\n }) => {\n assertDefined(walletAccount, 'Wallet account not found');\n\n await assertWalletAccountSigningAvailability(\n { walletAccount },\n dynamicClient\n );\n\n let addressToSignWith = walletAccount.address;\n if (addressType) {\n addressToSignWith =\n getWalletAccountAddressByType({\n type: addressType,\n walletAccount,\n }) ?? addressToSignWith;\n }\n\n const result = await injectedProvider.signMessage(\n addressToSignWith,\n new TextEncoder().encode(message)\n );\n\n return {\n signature: getBuffer().from(result.signature).toString('base64'),\n };\n };\n\n const signPsbt: BitcoinWalletProvider['signPsbt'] = async ({\n request,\n walletAccount,\n }) => {\n await assertWalletAccountSigningAvailability(\n { walletAccount },\n dynamicClient\n );\n\n const psbtFromBase64 = Psbt.fromBase64(request.unsignedPsbtBase64);\n\n const inputsToSign =\n request.signature?.map((sig) => ({\n address: sig.address,\n sigHash: request.allowedSighash[0],\n signingIndexes: sig.signingIndexes ?? [],\n })) ?? [];\n\n const signedPsbt = await injectedProvider.signPSBT(\n psbtFromBase64.toBuffer(),\n {\n inputsToSign,\n }\n );\n\n return { signedPsbt: Psbt.fromBuffer(signedPsbt).toBase64() };\n };\n\n const signPsbts: BitcoinWalletProvider['signPsbts'] = async ({\n requests,\n walletAccount,\n }) => {\n await assertWalletAccountSigningAvailability(\n { walletAccount },\n dynamicClient\n );\n\n const signedPsbts: string[] = [];\n\n for (const request of requests) {\n const signedPsbtResponse = await signPsbt({ request, walletAccount });\n\n if (signedPsbtResponse) {\n signedPsbts.push(signedPsbtResponse.signedPsbt);\n }\n }\n\n return {\n signedPsbts,\n };\n };\n\n const { getEventEmitter, cleanupEventEmitter } =\n createWalletProviderEventEmitter({\n removeEventListeners: () => {\n injectedProvider?.removeAllListeners();\n },\n\n setupEventListeners: ({ handleAccountsChanged }) => {\n injectedProvider?.on('accountsChanged', (accounts) => {\n handleAccountsChanged({\n addresses: accounts.map((account) => account.address),\n });\n });\n },\n\n supportedEvents: ['accountsChanged'],\n });\n\n const terminate: BitcoinWalletProvider['terminate'] = async () => {\n cleanupEventEmitter();\n };\n\n return {\n chain,\n confirmTransaction: (args) =>\n bitcoinConfirmTransaction(args, dynamicClient),\n connect,\n get events() {\n return getEventEmitter();\n },\n executeSwapTransaction: (args) =>\n bitcoinExecuteSwapTransaction(args, dynamicClient),\n getActiveNetworkId,\n getConnectedAddresses,\n groupKey: formatWalletProviderGroupKey(PHANTOM_METADATA.displayName),\n key,\n metadata: PHANTOM_METADATA,\n signMessage,\n signPsbt,\n signPsbts,\n terminate,\n transferAmount: (args) => bitcoinTransferAmount(args, dynamicClient),\n walletProviderType,\n };\n};\n","import { getInjectedProviderFromWindow } from '@dynamic-labs-sdk/client/core';\n\nimport type { PhantomBitcoinInjectedProvider } from '../PhantomBitcoinInjectedProvider.types';\n\nconst PHANTOM_BITCOIN_PROVIDER_LOCATOR = 'phantom.bitcoin';\n\n/** @not-instrumented */\nexport const getPhantomInjectedProvider = () => {\n return getInjectedProviderFromWindow<PhantomBitcoinInjectedProvider>(\n PHANTOM_BITCOIN_PROVIDER_LOCATOR\n );\n};\n","import { getInjectedProviderFromWindow } from '@dynamic-labs-sdk/client/core';\n\nimport type { UnisatInjectedProvider } from '../UnisatInjectedProvider.types';\n\n// using `unisat_wallet` instead of `unisat` to avoid conflicts with other wallets\n// injecting themselves into the window.unisat object, like OneKey wallet.\nconst UNISAT_PROVIDER_LOCATOR = 'unisat_wallet';\n\n/** @not-instrumented */\nexport const getUnisatInjectedProvider = () => {\n return getInjectedProviderFromWindow<UnisatInjectedProvider>(\n UNISAT_PROVIDER_LOCATOR\n );\n};\n","import { UserRejectedError } from '@dynamic-labs-sdk/client';\nimport type {\n BitcoinNetwork,\n BitcoinProvider,\n SignMultiplePsbtPayload,\n SignTransactionResponse,\n} from 'sats-connect';\nimport { signMultipleTransactions } from 'sats-connect';\n\ntype SignMultipleTransactionsWithSatsConnectParams = {\n network: BitcoinNetwork;\n provider?: BitcoinProvider;\n psbts: SignMultiplePsbtPayload[];\n};\n\n/** @not-instrumented */\nexport const signMultipleTransactionsWithSatsConnect = async ({\n network,\n psbts,\n provider,\n}: SignMultipleTransactionsWithSatsConnectParams): Promise<{\n signedPsbts: string[];\n}> => {\n const response: SignTransactionResponse[] = await new Promise(\n (resolve, reject) => {\n void signMultipleTransactions({\n getProvider: () => Promise.resolve(provider),\n onCancel: () => {\n reject(\n new UserRejectedError({\n action: 'sign psbts',\n })\n );\n },\n onFinish: (response) => {\n resolve(response);\n },\n payload: {\n message: 'Sign Psbts',\n network,\n psbts,\n },\n });\n }\n );\n\n return {\n signedPsbts: response.map((response) => response.psbtBase64),\n };\n};\n","import {\n type Chain,\n type DynamicClient,\n type WalletProviderMetadata,\n assertWalletAccountSigningAvailability,\n getWalletAccountAddressByType,\n} from '@dynamic-labs-sdk/client';\nimport {\n DYNAMIC_ICONIC_SPRITE_URL,\n assertDefined,\n createWalletProviderEventEmitter,\n formatWalletProviderGroupKey,\n formatWalletProviderKey,\n} from '@dynamic-labs-sdk/client/core';\nimport { WalletProviderEnum } from '@dynamic-labs/sdk-api-core';\nimport { Psbt } from 'bitcoinjs-lib';\nimport type {\n AccountChangeEvent,\n BitcoinProvider,\n InputToSign,\n SignMultiplePsbtPayload,\n} from 'sats-connect';\nimport {\n RpcErrorCode,\n addListener,\n request as satsConnectRequest,\n} from 'sats-connect';\n\nimport type {\n BitcoinSendTransactionResponse,\n BitcoinWalletProvider,\n} from '../../../../BitcoinWalletProvider.types';\nimport { InvalidPsbtError } from '../../../../errors/InvalidPsbtError';\nimport { bitcoinConfirmTransaction } from '../../../../utils/bitcoinConfirmTransaction';\nimport { bitcoinExecuteSwapTransaction } from '../../../../utils/bitcoinExecuteSwapTransaction';\nimport { bitcoinTransferAmount } from '../../../../utils/bitcoinTransferAmount';\nimport { convertNetworkIdForPsbt } from '../../../../utils/convertNetworkIdForPsbt';\nimport { convertNetworkIdToSatsConnectNetworkType } from '../../../../utils/convertNetworkIdToSatsConnectNetworkType';\nimport { getNetworkIdFromNetworkName } from '../../../../utils/getNetworkIdFromNetworkName';\nimport { getPsbtInputsToSignForSatsConnect } from '../../../../utils/getPsbtInputsToSignForSatsConnect';\nimport { getSatsConnectSigningProtocol } from '../../../../utils/getSatsConnectSigningProtocol';\nimport { parseBitcoinConnectionResult } from '../../../../utils/parseBitcoinConnectionResult';\nimport { signMultipleTransactionsWithSatsConnect } from '../../../../utils/signMultipleTransactionsWithSatsConnect';\n\nexport const XVERSE_METADATA: WalletProviderMetadata = {\n displayName: 'Xverse',\n icon: `${DYNAMIC_ICONIC_SPRITE_URL}#xverse`,\n supportedHardwareWalletVendors: ['ledger'],\n};\n\ntype CreateXverseBitcoinWalletProviderParams = {\n dynamicClient: DynamicClient;\n satsConnectProvider: BitcoinProvider;\n};\n\n// https://docs.xverse.app/sats-connect/wallet-methods/request-methods\n/** @not-instrumented */\nexport const createXverseBitcoinWalletProvider = ({\n dynamicClient,\n satsConnectProvider,\n}: CreateXverseBitcoinWalletProviderParams): BitcoinWalletProvider => {\n const chain: Chain = 'BTC';\n\n const walletProviderType = WalletProviderEnum.BrowserExtension;\n\n const key = formatWalletProviderKey({\n chain,\n displayName: XVERSE_METADATA.displayName,\n walletProviderType,\n });\n\n const requestPermissions = async (): Promise<void> => {\n const response = await satsConnectRequest(\n 'wallet_requestPermissions',\n undefined\n );\n\n if (response.status === 'success') {\n return;\n }\n\n throw response.error;\n };\n\n const connect: BitcoinWalletProvider['connect'] = async () => {\n // requesting permissions on initial connect will avoid\n // connection prompt for other requests\n await requestPermissions();\n\n const response = await satsConnectRequest('wallet_connect', null);\n\n if (response.status !== 'success') {\n throw response.error;\n }\n\n const { addresses: connectedAddresses } = response.result;\n\n const { addresses } = parseBitcoinConnectionResult({\n connectedAddresses,\n });\n\n return {\n addresses,\n };\n };\n\n const disconnect: BitcoinWalletProvider['disconnect'] = async () => {\n await satsConnectRequest('wallet_renouncePermissions', null);\n };\n\n const getActiveNetworkId: BitcoinWalletProvider['getActiveNetworkId'] =\n async () => {\n const response = await satsConnectRequest('wallet_getNetwork', null);\n\n let networkName = 'mainnet';\n if (response.status === 'success') {\n networkName = response.result.bitcoin.name.toLowerCase();\n }\n\n return getNetworkIdFromNetworkName({ networkName }, dynamicClient);\n };\n\n const getConnectedAddresses: BitcoinWalletProvider['getConnectedAddresses'] =\n async () => {\n const response = await satsConnectRequest('wallet_getAccount', null);\n\n if (response.status === 'success') {\n return {\n addresses: response.result.addresses.map(\n (address) => address.address\n ),\n };\n }\n\n if (response.error.code !== RpcErrorCode.ACCESS_DENIED) {\n throw response.error;\n }\n\n // if error is access denied, it means that the selected account is not\n // connected to the app, so return empty array\n return {\n addresses: [],\n };\n };\n\n const sendBitcoin: BitcoinWalletProvider['sendBitcoin'] = async ({\n transaction,\n walletAccount,\n }): Promise<BitcoinSendTransactionResponse> => {\n await assertWalletAccountSigningAvailability(\n { walletAccount },\n dynamicClient\n );\n\n const response = await satsConnectRequest('sendTransfer', {\n recipients: [\n {\n address: transaction.recipientAddress,\n amount: Number(transaction.amount),\n },\n ],\n });\n\n if (response.status !== 'success') {\n throw response.error;\n }\n\n return {\n transactionId: response.result.txid,\n };\n };\n\n const signMessage: BitcoinWalletProvider['signMessage'] = async ({\n message,\n walletAccount,\n protocol,\n addressType,\n }) => {\n assertDefined(walletAccount, 'Wallet account not found');\n\n await assertWalletAccountSigningAvailability(\n { walletAccount },\n dynamicClient\n );\n\n let addressToSignWith = walletAccount.address;\n if (addressType) {\n addressToSignWith =\n getWalletAccountAddressByType({\n type: addressType,\n walletAccount,\n }) ?? addressToSignWith;\n }\n\n const response = await satsConnectRequest('signMessage', {\n address: addressToSignWith,\n message,\n protocol: getSatsConnectSigningProtocol(protocol),\n });\n\n if (response.status !== 'success') {\n throw response.error;\n }\n\n return {\n signature: response.result.signature,\n };\n };\n\n const signPsbt: BitcoinWalletProvider['signPsbt'] = async ({\n request,\n walletAccount,\n }) => {\n if (!request.allowedSighash.length) {\n throw new InvalidPsbtError('allowedSighash cannot be an empty array');\n }\n\n await assertWalletAccountSigningAvailability(\n { walletAccount },\n dynamicClient\n );\n\n const activeNetworkId = await getActiveNetworkId();\n const network = convertNetworkIdForPsbt(activeNetworkId.networkId);\n\n const psbtFromBase64 = Psbt.fromBase64(request.unsignedPsbtBase64, {\n network,\n });\n\n const inputsToSign = getPsbtInputsToSignForSatsConnect({\n psbt: psbtFromBase64,\n request,\n });\n\n const signPbstPayload = {\n broadcast: false,\n psbt: request.unsignedPsbtBase64,\n // we have to combine signing indexes for like addresses\n signInputs: inputsToSign.reduce(\n (accum: { [address: string]: number[] }, curr: InputToSign) => {\n if (!accum[curr.address]) {\n accum[curr.address] = [];\n }\n accum[curr.address].push(...curr.signingIndexes);\n return accum;\n },\n {}\n ),\n };\n\n const response = await satsConnectRequest('signPsbt', signPbstPayload);\n\n if (response.status !== 'success') {\n throw response.error;\n }\n\n return { signedPsbt: response.result.psbt };\n };\n\n const signPsbts: BitcoinWalletProvider['signPsbts'] = async ({\n requests,\n walletAccount,\n }) => {\n await assertWalletAccountSigningAvailability(\n { walletAccount },\n dynamicClient\n );\n\n const activeNetworkId = await getActiveNetworkId();\n const network = convertNetworkIdForPsbt(activeNetworkId.networkId);\n const networkType = convertNetworkIdToSatsConnectNetworkType(\n activeNetworkId.networkId\n );\n\n const psbtsToSign: SignMultiplePsbtPayload[] = [];\n\n for (const request of requests) {\n const psbtFromBase64 = Psbt.fromBase64(request.unsignedPsbtBase64, {\n network,\n });\n const inputsToSign = getPsbtInputsToSignForSatsConnect({\n psbt: psbtFromBase64,\n request,\n });\n\n psbtsToSign.push({\n inputsToSign,\n psbtBase64: request.unsignedPsbtBase64,\n });\n }\n\n const response = await signMultipleTransactionsWithSatsConnect({\n network: {\n type: networkType,\n },\n provider: satsConnectProvider,\n psbts: psbtsToSign,\n });\n\n return {\n signedPsbts: response.signedPsbts,\n };\n };\n\n const { getEventEmitter, cleanupEventEmitter } =\n createWalletProviderEventEmitter<{\n accountDisconnectedListener: VoidFunction;\n removeAccountChangeListener: VoidFunction;\n }>({\n removeEventListeners: ({ setupReturnValue }) => {\n assertDefined(setupReturnValue, 'Setup return value not defined');\n\n setupReturnValue.removeAccountChangeListener();\n setupReturnValue.accountDisconnectedListener();\n },\n\n setupEventListeners: ({ handleAccountsChanged, handleDisconnected }) => {\n const removeAccountChangeListener = addListener(\n 'accountChange',\n ({ addresses }: AccountChangeEvent) => {\n if (!addresses) {\n return;\n }\n\n handleAccountsChanged({\n addresses: addresses.map((address) => address.address),\n });\n }\n );\n\n const accountDisconnectedListener = addListener(\n 'accountDisconnected',\n () => {\n handleDisconnected();\n }\n );\n\n return {\n accountDisconnectedListener,\n removeAccountChangeListener,\n };\n },\n\n supportedEvents: ['accountsChanged', 'disconnected'],\n });\n\n const terminate: BitcoinWalletProvider['terminate'] = async () => {\n cleanupEventEmitter();\n };\n\n return {\n chain,\n confirmTransaction: (args) =>\n bitcoinConfirmTransaction(args, dynamicClient),\n connect,\n disconnect,\n get events() {\n return getEventEmitter();\n },\n executeSwapTransaction: (args) =>\n bitcoinExecuteSwapTransaction(args, dynamicClient),\n getActiveNetworkId,\n getConnectedAddresses,\n groupKey: formatWalletProviderGroupKey(XVERSE_METADATA.displayName),\n key,\n metadata: XVERSE_METADATA,\n sendBitcoin,\n signMessage,\n signPsbt,\n signPsbts,\n terminate,\n transferAmount: (args) => bitcoinTransferAmount(args, dynamicClient),\n walletProviderType,\n };\n};\n","import { getInjectedProviderFromWindow } from '@dynamic-labs-sdk/client/core';\nimport type { BitcoinProvider } from 'sats-connect';\n\nconst XVERSE_BITCOIN_PROVIDER_LOCATOR = 'XverseProviders.BitcoinProvider';\n\n/** @not-instrumented */\nexport const getXverseInjectedProvider = () => {\n return getInjectedProviderFromWindow<BitcoinProvider>(\n XVERSE_BITCOIN_PROVIDER_LOCATOR\n );\n};\n","import {\n WalletProviderPriority,\n getDefaultClient,\n getWalletProviderRegistry,\n hasExtension,\n registerExtension,\n} from '@dynamic-labs-sdk/client/core';\n\nimport type { BitcoinWalletProvider } from '../../BitcoinWalletProvider.types';\nimport { registerBitcoinNetworkProviderBuilder } from '../../registerBitcoinNetworkProviderBuilder';\nimport { createBinanceBitcoinWalletProvider } from '../utils/binance/createBinanceBitcoinWalletProvider';\nimport { getBinanceBitcoinInjectedProvider } from '../utils/binance/getBinanceBitcoinInjectedProvider';\nimport { createBitgetBitcoinWalletProvider } from '../utils/bitget/createBitgetBitcoinWalletProvider';\nimport { getBitgetBitcoinInjectedProvider } from '../utils/bitget/getBitgetBitcoinInjectedProvider';\nimport { createLeatherBitcoinWalletProvider } from '../utils/leather/createLeatherBitcoinWalletProvider';\nimport { getLeatherBitcoinInjectedProvider } from '../utils/leather/getLeatherBitcoinInjectedProvider';\nimport { createMagicEdenBitcoinWalletProvider } from '../utils/magicEden/createMagicEdenBitcoinWalletProvider';\nimport { getMagicEdenInjectedProvider } from '../utils/magicEden/getMagicEdenInjectedProvider';\nimport { createOkxBitcoinWalletProvider } from '../utils/okx/createOkxBitcoinWalletProvider';\nimport { getOkxBitcoinInjectedProvider } from '../utils/okx/getOkxBitcoinInjectedProvider';\nimport { createOneKeyBitcoinWalletProvider } from '../utils/oneKey/createOneKeyBitcoinWalletProvider';\nimport { getOneKeyBitcoinInjectedProvider } from '../utils/oneKey/getOneKeyBitcoinInjectedProvider';\nimport { createOylBitcoinWalletProvider } from '../utils/oyl/createOylBitcoinWalletProvider';\nimport { getOylBitcoinInjectedProvider } from '../utils/oyl/getOylBitcoinInjectedProvider';\nimport { createPhantomBitcoinWalletProvider } from '../utils/phantom/createPhantomBitcoinWalletProvider';\nimport { getPhantomInjectedProvider } from '../utils/phantom/getPhantomInjectedProvider';\nimport { createUnisatWalletProvider } from '../utils/unisat/createUnisatWalletProvider';\nimport { getUnisatInjectedProvider } from '../utils/unisat/getUnisatInjectedProvider';\nimport { createXverseBitcoinWalletProvider } from '../utils/xverse/createXverseBitcoinWalletProvider';\nimport { getXverseInjectedProvider } from '../utils/xverse/getXverseInjectedProvider';\n\nexport const BITCOIN_INJECTED_WALLETS_EXTENSION_KEY = 'bitcoinInjectedWallets';\n\n/**\n * Adds the Bitcoin Injected Wallets extension to the Dynamic client.\n *\n * This extension enables integration with many Bitcoin wallets, like MagicEden, Xverse, Unisat, Phantom, and more.\n *\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @not-instrumented\n */\nexport const addBitcoinInjectedWalletsExtension = (\n client = getDefaultClient()\n): void => {\n if (\n hasExtension(\n { extensionKey: BITCOIN_INJECTED_WALLETS_EXTENSION_KEY },\n client\n )\n ) {\n return;\n }\n\n registerExtension(\n { extensionKey: BITCOIN_INJECTED_WALLETS_EXTENSION_KEY },\n client\n );\n\n registerBitcoinNetworkProviderBuilder(client);\n\n const walletProviderRegistry = getWalletProviderRegistry(client);\n\n const injectedWalletProviders: BitcoinWalletProvider[] = [];\n\n // Create and register Unisat wallet provider\n const unisatInjectedProvider = getUnisatInjectedProvider();\n if (unisatInjectedProvider) {\n const unisatWalletProvider = createUnisatWalletProvider({\n dynamicClient: client,\n injectedProvider: unisatInjectedProvider,\n });\n injectedWalletProviders.push(unisatWalletProvider);\n }\n\n // Create and register Phantom wallet provider\n const phantomInjectedProvider = getPhantomInjectedProvider();\n if (phantomInjectedProvider) {\n const phantomWalletProvider = createPhantomBitcoinWalletProvider({\n dynamicClient: client,\n injectedProvider: phantomInjectedProvider,\n });\n injectedWalletProviders.push(phantomWalletProvider);\n }\n\n // Create and register Xverse wallet provider\n const xverseInjectedProvider = getXverseInjectedProvider();\n if (xverseInjectedProvider) {\n const xverseWalletProvider = createXverseBitcoinWalletProvider({\n dynamicClient: client,\n satsConnectProvider: xverseInjectedProvider,\n });\n injectedWalletProviders.push(xverseWalletProvider);\n }\n\n // Create and register MagicEden wallet provider\n const magicEdenInjectedProvider = getMagicEdenInjectedProvider();\n if (magicEdenInjectedProvider) {\n const magicEdenWalletProvider = createMagicEdenBitcoinWalletProvider({\n dynamicClient: client,\n satsConnectProvider: magicEdenInjectedProvider,\n });\n injectedWalletProviders.push(magicEdenWalletProvider);\n }\n\n // Create and register OKX wallet provider\n const okxInjectedProvider = getOkxBitcoinInjectedProvider();\n if (okxInjectedProvider) {\n const okxWalletProvider = createOkxBitcoinWalletProvider({\n dynamicClient: client,\n injectedProvider: okxInjectedProvider,\n });\n injectedWalletProviders.push(okxWalletProvider);\n }\n\n // Create and register OneKey wallet provider\n const oneKeyInjectedProvider = getOneKeyBitcoinInjectedProvider();\n if (oneKeyInjectedProvider) {\n const oneKeyWalletProvider = createOneKeyBitcoinWalletProvider({\n dynamicClient: client,\n injectedProvider: oneKeyInjectedProvider,\n });\n injectedWalletProviders.push(oneKeyWalletProvider);\n }\n\n // Create and register Bitget wallet provider\n const bitgetInjectedProvider = getBitgetBitcoinInjectedProvider();\n if (bitgetInjectedProvider) {\n const bitgetWalletProvider = createBitgetBitcoinWalletProvider({\n dynamicClient: client,\n injectedProvider: bitgetInjectedProvider,\n });\n injectedWalletProviders.push(bitgetWalletProvider);\n }\n\n // Create and register Binance wallet provider\n const binanceInjectedProvider = getBinanceBitcoinInjectedProvider();\n if (binanceInjectedProvider) {\n const binanceWalletProvider = createBinanceBitcoinWalletProvider({\n dynamicClient: client,\n injectedProvider: binanceInjectedProvider,\n });\n injectedWalletProviders.push(binanceWalletProvider);\n }\n\n // Create and register OYL wallet provider\n const oylInjectedProvider = getOylBitcoinInjectedProvider();\n if (oylInjectedProvider) {\n const oylWalletProvider = createOylBitcoinWalletProvider({\n dynamicClient: client,\n injectedProvider: oylInjectedProvider,\n });\n injectedWalletProviders.push(oylWalletProvider);\n }\n\n // Create and register Leather wallet provider\n const leatherInjectedProvider = getLeatherBitcoinInjectedProvider();\n if (leatherInjectedProvider) {\n const leatherWalletProvider = createLeatherBitcoinWalletProvider({\n dynamicClient: client,\n injectedProvider: leatherInjectedProvider,\n });\n injectedWalletProviders.push(leatherWalletProvider);\n }\n\n injectedWalletProviders.forEach((walletProvider) => {\n walletProviderRegistry.register({\n priority: WalletProviderPriority.WINDOW_INJECT,\n walletProvider,\n });\n });\n};\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { c as registerBitcoinNetworkProviderBuilder, i as bitcoinExecuteSwapTransaction, t as bitcoinTransferAmount } from "./bitcoinTransferAmount-Dn2plv-v.esm.js";
1
+ import { c as registerBitcoinNetworkProviderBuilder, i as bitcoinExecuteSwapTransaction, t as bitcoinTransferAmount } from "./bitcoinTransferAmount-1ObnmBJf.esm.js";
2
2
  import { WalletProviderPriority, assertDefined, consumeMfaTokenIfRequiredForAction, formatWalletProviderGroupKey, formatWalletProviderKey, getActiveNetworkIdFromLastKnownRegistry, getBuffer, getCore, getDefaultClient, getSignedSessionId, getWalletProviderRegistry, hasExtension, registerExtension, switchActiveNetworkInLastKnownRegistry } from "@dynamic-labs-sdk/client/core";
3
3
  import { BaseError } from "@dynamic-labs-sdk/client";
4
4
  import { MFAAction, WalletProviderEnum } from "@dynamic-labs/sdk-api-core";
@@ -704,4 +704,4 @@ const addWaasBitcoinExtension = (client = getDefaultClient()) => {
704
704
 
705
705
  //#endregion
706
706
  export { TransactionRequiredError as n, TransactionBroadcastFailedError as r, addWaasBitcoinExtension as t };
707
- //# sourceMappingURL=addWaasBitcoinExtension-Cgh2ZnO9.esm.js.map
707
+ //# sourceMappingURL=addWaasBitcoinExtension-DsDz51vY.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addWaasBitcoinExtension-DsDz51vY.esm.js","names":["address","feePerByte: number","address","address","selected: UTXO[]","address","getActiveNetworkId: WaasBitcoinWalletProvider['getActiveNetworkId']","switchActiveNetwork: WaasBitcoinWalletProvider['switchActiveNetwork']","getConnectedAddresses: WaasBitcoinWalletProvider['getConnectedAddresses']","signPsbt: WaasBitcoinWalletProvider['signPsbt']","signPsbts: WaasBitcoinWalletProvider['signPsbts']","signMessage: WaasBitcoinWalletProvider['signMessage']","buildPsbt: WaasBitcoinWalletProvider['buildPsbt']","buildPsbtUtil","sendBitcoin: WaasBitcoinWalletProvider['sendBitcoin']","buildPsbt"],"sources":["../src/errors/TransactionBroadcastFailedError.ts","../src/errors/TransactionRequiredError.ts","../src/waas/constants.ts","../src/waas/utils/broadcastTransaction/broadcastTransaction.ts","../src/errors/InsufficientFundsError.ts","../src/errors/InvalidAmountError.ts","../src/errors/NoUTXOsFoundError.ts","../src/errors/SegwitOutputScriptError.ts","../src/waas/utils/addInputsToPsbt/addInputsToPsbt.ts","../src/waas/utils/addOutputsToPsbt/addOutputsToPsbt.ts","../src/errors/FeeRecommendationsFetchError.ts","../src/waas/utils/getFeeRecommendations/getFeeRecommendations.ts","../src/waas/utils/estimateTransactionFee/estimateTransactionFee.ts","../src/waas/utils/calculateFeeAndChange/calculateFeeAndChange.ts","../src/waas/utils/calculateUTXOTotal/calculateUTXOTotal.ts","../src/errors/UTXOsFetchError.ts","../src/waas/utils/getUTXOs/getUTXOs.ts","../src/waas/utils/selectUTXOsLargestFirst/selectUTXOsLargestFirst.ts","../src/waas/utils/validateAndSelectUTXOs/validateAndSelectUTXOs.ts","../src/errors/TaprootAddressNotSupportedError.ts","../src/waas/utils/validateNotTaproot/validateNotTaproot.ts","../src/waas/utils/buildPsbt/buildPsbt.ts","../src/errors/PublicKeyNotFoundError.ts","../src/waas/utils/getPublicKeyForWalletAccount/getPublicKeyForWalletAccount.ts","../src/waas/utils/createWalletProviderForWaasBitcoin/createWalletProviderForWaasBitcoin.ts","../src/waas/addWaasBitcoinExtension/addWaasBitcoinExtension.ts"],"sourcesContent":["import { BaseError } from '@dynamic-labs-sdk/client';\n\ntype TransactionBroadcastFailedErrorParams = {\n response: Response;\n};\n\nexport class TransactionBroadcastFailedError extends BaseError {\n public readonly response: Response;\n\n constructor({ response }: TransactionBroadcastFailedErrorParams) {\n super({\n cause: null,\n code: 'transaction_broadcast_failed_error',\n details: `Status: ${response.status} ${response.statusText}`,\n docsUrl: null,\n name: 'TransactionBroadcastFailedError',\n shortMessage: 'Failed to broadcast transaction to mempool',\n });\n\n this.response = response;\n }\n}\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\nexport class TransactionRequiredError extends BaseError {\n constructor() {\n super({\n cause: null,\n code: 'transaction_required_error',\n docsUrl: null,\n name: 'TransactionRequiredError',\n shortMessage: 'No transaction specified for broadcast',\n });\n }\n}\n","/**\n * Mempool.space API URL for mainnet\n */\nexport const MEMPOOL_API_URL = 'https://mempool.space/api';\n\n/**\n * Number of satoshis per Bitcoin\n */\nexport const SATOSHIS_PER_BTC = 100_000_000;\n\n/**\n * Bitcoin's dust limit in satoshis\n * Outputs below this value are considered \"dust\" and will be rejected by nodes\n */\nexport const DUST_LIMIT = 546;\n\n/**\n * Accurate vSize constants for Native SegWit (P2WPKH) transactions\n * Used for precise fee estimation\n */\nexport const VSIZE_OVERHEAD = 10.5;\n\nexport const VSIZE_INPUT_P2WPKH = 68;\n\nexport const VSIZE_OUTPUT_P2WPKH = 31;\n\n/**\n * Minimum relay fee in satoshis\n * Added to fee estimate to ensure transaction propagation\n */\nexport const MIN_RELAY_FEE = 111;\n\n/**\n * Conservative default fee estimate in satoshis\n * Used as fallback when fee estimation fails\n */\nexport const DEFAULT_FEE_ESTIMATE = 1000;\n\n/**\n * RBF (Replace-By-Fee) sequence number\n * 0xfffffffd = 4294967293 (enables RBF, not final)\n */\nexport const RBF_SEQUENCE = 0xfffffffd;\n","import { TransactionBroadcastFailedError } from '../../../errors/TransactionBroadcastFailedError';\nimport { TransactionRequiredError } from '../../../errors/TransactionRequiredError';\nimport { MEMPOOL_API_URL } from '../../constants';\n\n/**\n * Sends a raw Bitcoin transaction to the mempool\n *\n * @param rawTransaction - The raw transaction in hex format\n * @returns The transaction ID\n * @throws {TransactionRequiredError} if no transaction is specified\n * @throws {TransactionBroadcastFailedError} if broadcasting fails\n * @not-instrumented\n */\n// eslint-disable-next-line custom-rules/require-single-object-param\nexport const broadcastTransaction = async (\n rawTransaction: string\n): Promise<string> => {\n if (!rawTransaction) {\n throw new TransactionRequiredError();\n }\n\n const response = await fetch(`${MEMPOOL_API_URL}/tx`, {\n body: rawTransaction,\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n method: 'POST',\n });\n\n if (!response.ok) {\n throw new TransactionBroadcastFailedError({ response });\n }\n\n return response.text();\n};\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\nimport { SATOSHIS_PER_BTC } from '../waas/constants';\n\ntype InsufficientFundsErrorParams = {\n availableSatoshis: number;\n requiredSatoshis: number;\n};\n\nexport class InsufficientFundsError extends BaseError {\n public readonly availableSatoshis: number;\n\n public readonly requiredSatoshis: number;\n\n constructor({ availableSatoshis, requiredSatoshis }: InsufficientFundsErrorParams) {\n const availableBtc = availableSatoshis / SATOSHIS_PER_BTC;\n const requiredBtc = requiredSatoshis / SATOSHIS_PER_BTC;\n\n super({\n cause: null,\n code: 'insufficient_funds_error',\n details: `Available: ${availableBtc} BTC (${availableSatoshis} satoshis), Required: ${requiredBtc} BTC (${requiredSatoshis} satoshis)`,\n docsUrl: null,\n name: 'InsufficientFundsError',\n shortMessage: 'Insufficient funds for transaction',\n });\n\n this.availableSatoshis = availableSatoshis;\n\n this.requiredSatoshis = requiredSatoshis;\n }\n}\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\ntype InvalidAmountErrorParams = {\n amountInSatoshis: number;\n reason: string;\n};\n\nexport class InvalidAmountError extends BaseError {\n public readonly amountInSatoshis: number;\n\n constructor({ amountInSatoshis, reason }: InvalidAmountErrorParams) {\n super({\n cause: null,\n code: 'invalid_amount_error',\n details: `Amount: ${amountInSatoshis} satoshis`,\n docsUrl: null,\n name: 'InvalidAmountError',\n shortMessage: reason,\n });\n\n this.amountInSatoshis = amountInSatoshis;\n }\n}\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\ntype NoUTXOsFoundErrorParams = {\n address: string;\n};\n\nexport class NoUTXOsFoundError extends BaseError {\n public readonly address: string;\n\n constructor({ address }: NoUTXOsFoundErrorParams) {\n super({\n cause: null,\n code: 'no_utxos_found_error',\n details: `Address: ${address}`,\n docsUrl: null,\n name: 'NoUTXOsFoundError',\n shortMessage: 'No UTXOs found for this address',\n });\n\n this.address = address;\n }\n}\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\nexport class SegwitOutputScriptError extends BaseError {\n constructor() {\n super({\n cause: null,\n code: 'segwit_output_script_error',\n docsUrl: null,\n name: 'SegwitOutputScriptError',\n shortMessage: 'Failed to create segwit output script',\n });\n }\n}\n","import { getBuffer } from '@dynamic-labs-sdk/client/core';\nimport type { Network, Psbt } from 'bitcoinjs-lib';\nimport { payments } from 'bitcoinjs-lib';\n\nimport { SegwitOutputScriptError } from '../../../errors/SegwitOutputScriptError';\nimport { RBF_SEQUENCE } from '../../constants';\nimport type { UTXO } from '../../WaasBitcoinWalletProvider.types';\n\ntype AddInputsToPsbtOptions = {\n network: Network;\n psbt: Psbt;\n publicKeyPair: { publicKey: Uint8Array };\n selectedUTXOs: UTXO[];\n};\n\n/**\n * Adds inputs to PSBT from selected UTXOs\n *\n * @param options.network - Bitcoin network configuration (mainnet or testnet)\n * @param options.psbt - The PSBT instance to add inputs to\n * @param options.publicKeyPair - Key pair containing the public key for witness script\n * @param options.selectedUTXOs - Array of UTXOs to add as inputs\n * @not-instrumented\n */\nexport const addInputsToPsbt = (options: AddInputsToPsbtOptions): void => {\n const { network, psbt, publicKeyPair, selectedUTXOs } = options;\n\n for (const utxo of selectedUTXOs) {\n const outputScript = payments.p2wpkh({\n network,\n pubkey: publicKeyPair.publicKey,\n }).output;\n\n if (!outputScript) {\n throw new SegwitOutputScriptError();\n }\n\n const txidBuffer = new Uint8Array(\n getBuffer().from(utxo.txid, 'hex').reverse()\n );\n\n psbt.addInput({\n hash: txidBuffer,\n index: utxo.vout,\n sequence: RBF_SEQUENCE,\n witnessUtxo: {\n script: outputScript,\n value: BigInt(utxo.value),\n },\n });\n }\n};\n","import type { Network, Psbt } from 'bitcoinjs-lib';\nimport { address } from 'bitcoinjs-lib';\n\nimport { InvalidAmountError } from '../../../errors/InvalidAmountError';\nimport { DUST_LIMIT, SATOSHIS_PER_BTC } from '../../constants';\n\ntype AddOutputsToPsbtOptions = {\n accountAddress: string;\n amountInSatoshis: number;\n changeAmount: number;\n hasChangeOutput: boolean;\n network: Network;\n psbt: Psbt;\n recipientAddress: string;\n};\n\n/**\n * Adds outputs to PSBT (recipient and optionally change)\n *\n * @param options.accountAddress - The sender's address for receiving change\n * @param options.amountInSatoshis - Amount to send to the recipient in satoshis\n * @param options.changeAmount - Amount to return as change in satoshis\n * @param options.hasChangeOutput - Whether to include a change output\n * @param options.network - Bitcoin network configuration (mainnet or testnet)\n * @param options.psbt - The PSBT instance to add outputs to\n * @param options.recipientAddress - The recipient's Bitcoin address\n * @not-instrumented\n */\nexport const addOutputsToPsbt = (options: AddOutputsToPsbtOptions): void => {\n const {\n accountAddress,\n amountInSatoshis,\n changeAmount,\n hasChangeOutput,\n network,\n psbt,\n recipientAddress,\n } = options;\n\n if (amountInSatoshis < DUST_LIMIT) {\n throw new InvalidAmountError({\n amountInSatoshis,\n reason: `Amount is below dust limit of ${DUST_LIMIT} satoshis (${DUST_LIMIT / SATOSHIS_PER_BTC} BTC)`,\n });\n }\n\n psbt.addOutput({\n script: address.toOutputScript(recipientAddress, network),\n value: BigInt(amountInSatoshis),\n });\n\n if (hasChangeOutput) {\n psbt.addOutput({\n script: address.toOutputScript(accountAddress, network),\n value: BigInt(changeAmount),\n });\n }\n};\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\ntype FeeRecommendationsFetchErrorParams = {\n response: Response;\n};\n\nexport class FeeRecommendationsFetchError extends BaseError {\n public readonly response: Response;\n\n constructor({ response }: FeeRecommendationsFetchErrorParams) {\n super({\n cause: null,\n code: 'fee_recommendations_fetch_error',\n details: `Status: ${response.status} ${response.statusText}`,\n docsUrl: null,\n name: 'FeeRecommendationsFetchError',\n shortMessage: 'Failed to fetch fee recommendations from mempool',\n });\n\n this.response = response;\n }\n}\n","import { FeeRecommendationsFetchError } from '../../../errors/FeeRecommendationsFetchError';\nimport { MEMPOOL_API_URL } from '../../constants';\nimport type { FeeRecommendations } from '../../WaasBitcoinWalletProvider.types';\n\n/**\n * Gets fee recommendations from mempool.space API\n *\n * @returns Fee recommendation data with rates in sat/vB\n * @throws FeeRecommendationsFetchError if fetching fee recommendations fails\n * @not-instrumented\n */\nexport const getFeeRecommendations = async (): Promise<FeeRecommendations> => {\n const response = await fetch(`${MEMPOOL_API_URL}/v1/fees/recommended`);\n\n if (!response.ok) {\n throw new FeeRecommendationsFetchError({ response });\n }\n\n return response.json();\n};\n","import {\n DEFAULT_FEE_ESTIMATE,\n MIN_RELAY_FEE,\n VSIZE_INPUT_P2WPKH,\n VSIZE_OUTPUT_P2WPKH,\n VSIZE_OVERHEAD,\n} from '../../constants';\nimport type { FeePriority } from '../../WaasBitcoinWalletProvider.types';\nimport { getFeeRecommendations } from '../getFeeRecommendations';\n\ntype EstimateTransactionFeeOptions = {\n feePriority?: FeePriority;\n numInputs: number;\n numOutputs: number;\n};\n\n/**\n * Estimates transaction fees based on number of inputs and outputs using accurate vSize\n *\n * @param options.feePriority - Priority level for fee estimation ('low', 'medium', or 'high')\n * @param options.numInputs - Number of transaction inputs (UTXOs being spent)\n * @param options.numOutputs - Number of transaction outputs\n * @returns Estimated fee in satoshis\n * @not-instrumented\n */\nexport const estimateTransactionFee = async ({\n feePriority = 'medium',\n numInputs,\n numOutputs,\n}: EstimateTransactionFeeOptions): Promise<number> => {\n try {\n const feeData = await getFeeRecommendations();\n\n let feePerByte: number;\n\n if (feePriority === 'high') {\n feePerByte = feeData.fastestFee ?? feeData.halfHourFee ?? 1;\n } else if (feePriority === 'low') {\n feePerByte = feeData.economyFee ?? feeData.hourFee ?? 1;\n } else {\n feePerByte =\n feeData.halfHourFee ?? feeData.hourFee ?? feeData.economyFee ?? 1;\n }\n\n const vSize =\n VSIZE_OVERHEAD +\n numInputs * VSIZE_INPUT_P2WPKH +\n numOutputs * VSIZE_OUTPUT_P2WPKH;\n\n return Math.ceil(feePerByte * vSize) + MIN_RELAY_FEE;\n } catch {\n return DEFAULT_FEE_ESTIMATE;\n }\n};\n","import { DUST_LIMIT } from '../../constants';\nimport type { FeePriority, UTXO } from '../../WaasBitcoinWalletProvider.types';\nimport { estimateTransactionFee } from '../estimateTransactionFee';\n\ntype CalculateFeeAndChangeOptions = {\n amountInSatoshis: bigint;\n feePriority: FeePriority;\n selectedTotalValue: number;\n selectedUTXOs: UTXO[];\n};\n\ntype CalculateFeeAndChangeResult = {\n changeAmountNumber: number;\n feeEstimate: number;\n hasChangeOutput: boolean;\n};\n\n/**\n * Calculates fee estimate and change amount, handling dust limit\n *\n * @param options.amountInSatoshis - Amount to send in satoshis\n * @param options.feePriority - Priority level for fee estimation ('low', 'medium', or 'high')\n * @param options.selectedTotalValue - Total value of selected UTXOs in satoshis\n * @param options.selectedUTXOs - Array of selected UTXOs for the transaction\n * @returns Object with feeEstimate, changeAmountNumber, and hasChangeOutput\n * @not-instrumented\n */\nexport const calculateFeeAndChange = async ({\n amountInSatoshis,\n feePriority,\n selectedTotalValue,\n selectedUTXOs,\n}: CalculateFeeAndChangeOptions): Promise<CalculateFeeAndChangeResult> => {\n let feeEstimate = await estimateTransactionFee({\n feePriority,\n numInputs: selectedUTXOs.length,\n numOutputs: 1,\n });\n\n let maxToSpend = selectedTotalValue - feeEstimate;\n let changeAmount = BigInt(maxToSpend) - amountInSatoshis;\n\n const changeAmountNumber = Number(changeAmount);\n\n if (changeAmount > 0 && changeAmountNumber >= DUST_LIMIT) {\n feeEstimate = await estimateTransactionFee({\n feePriority,\n numInputs: selectedUTXOs.length,\n numOutputs: 2,\n });\n maxToSpend = selectedTotalValue - feeEstimate;\n changeAmount = BigInt(maxToSpend) - amountInSatoshis;\n }\n\n const finalChangeAmountNumber = Number(changeAmount);\n const hasChangeOutput =\n changeAmount > 0 && finalChangeAmountNumber >= DUST_LIMIT;\n\n if (changeAmount > 0 && finalChangeAmountNumber < DUST_LIMIT) {\n feeEstimate += finalChangeAmountNumber;\n }\n\n return {\n changeAmountNumber: finalChangeAmountNumber,\n feeEstimate,\n hasChangeOutput,\n };\n};\n","import type { UTXO } from '../../WaasBitcoinWalletProvider.types';\n\n/**\n * Calculates the total value of UTXOs\n *\n * @param utxos - Array of UTXOs\n * @returns Total value in satoshis\n * @not-instrumented\n */\nexport const calculateUTXOTotal = (utxos: UTXO[]): number =>\n utxos.reduce((total: number, utxo: UTXO) => total + utxo.value, 0);\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\ntype UTXOsFetchErrorParams = {\n address: string;\n response: Response;\n};\n\nexport class UTXOsFetchError extends BaseError {\n public readonly address: string;\n\n public readonly response: Response;\n\n constructor({ address, response }: UTXOsFetchErrorParams) {\n super({\n cause: null,\n code: 'utxos_fetch_error',\n details: `Address: ${address}, Status: ${response.status} ${response.statusText}`,\n docsUrl: null,\n name: 'UTXOsFetchError',\n shortMessage: 'Failed to fetch UTXOs from mempool',\n });\n\n this.address = address;\n\n this.response = response;\n }\n}\n","import { UTXOsFetchError } from '../../../errors/UTXOsFetchError';\nimport { MEMPOOL_API_URL } from '../../constants';\nimport type { UTXO } from '../../WaasBitcoinWalletProvider.types';\n\n/**\n * Gets UTXOs for a Bitcoin address from mempool.space API\n *\n * @param address - The Bitcoin address to get UTXOs for\n * @returns Array of UTXOs\n * @throws UTXOsFetchError if fetching UTXOs fails\n * @not-instrumented\n */\n// eslint-disable-next-line custom-rules/require-single-object-param\nexport const getUTXOs = async (address: string): Promise<UTXO[]> => {\n const response = await fetch(`${MEMPOOL_API_URL}/address/${address}/utxo`);\n\n if (!response.ok) {\n throw new UTXOsFetchError({ address, response });\n }\n\n return response.json();\n};\n","import type { UTXO } from '../../WaasBitcoinWalletProvider.types';\n\ntype SelectUTXOsLargestFirstOptions = {\n targetAmount: number;\n utxos: UTXO[];\n};\n\n/**\n * Selects UTXOs using Largest-First (Accumulator) strategy\n * Sorts UTXOs by value (descending) and selects until we have enough to cover amount + fees\n *\n * @param options.targetAmount - Target amount in satoshis (amount + fees + dust limit)\n * @param options.utxos - Array of available UTXOs to select from\n * @returns Selected UTXOs\n * @not-instrumented\n */\nexport const selectUTXOsLargestFirst = (\n options: SelectUTXOsLargestFirstOptions\n) => {\n const { targetAmount, utxos } = options;\n\n const sortedUTXOs = [...utxos].sort((a, b) => b.value - a.value);\n\n const selected: UTXO[] = [];\n let total = 0;\n\n for (const utxo of sortedUTXOs) {\n selected.push(utxo);\n total += utxo.value;\n\n if (total >= targetAmount) {\n break;\n }\n }\n\n return selected;\n};\n","import { InsufficientFundsError } from '../../../errors/InsufficientFundsError';\nimport type { UTXO } from '../../WaasBitcoinWalletProvider.types';\nimport { calculateUTXOTotal } from '../calculateUTXOTotal';\n\ntype ValidateAndSelectUTXOsOptions = {\n allUTXOs: UTXO[];\n amountInSatoshis: number;\n feeEstimate: number;\n selectedTotal: number;\n selectedUTXOs: UTXO[];\n};\n\n/**\n * Validates and ensures sufficient funds for the transaction\n *\n * @param options.allUTXOs - Complete array of available UTXOs for the address\n * @param options.amountInSatoshis - Amount to send in satoshis\n * @param options.feeEstimate - Estimated transaction fee in satoshis\n * @param options.selectedTotal - Total value of initially selected UTXOs in satoshis\n * @param options.selectedUTXOs - Array of initially selected UTXOs\n * @returns Validated selected UTXOs\n * @throws InsufficientFundsError if insufficient funds\n * @not-instrumented\n */\nexport const validateAndSelectUTXOs = (\n options: ValidateAndSelectUTXOsOptions\n) => {\n const {\n allUTXOs,\n amountInSatoshis,\n feeEstimate,\n selectedTotal,\n selectedUTXOs,\n } = options;\n\n const requiredAmount = amountInSatoshis + feeEstimate;\n\n if (selectedTotal >= requiredAmount) {\n return selectedUTXOs;\n }\n\n if (selectedUTXOs.length < allUTXOs.length) {\n const allTotal = calculateUTXOTotal(allUTXOs);\n\n if (allTotal < requiredAmount) {\n throw new InsufficientFundsError({\n availableSatoshis: allTotal,\n requiredSatoshis: amountInSatoshis,\n });\n }\n\n return allUTXOs;\n }\n\n throw new InsufficientFundsError({\n availableSatoshis: selectedTotal,\n requiredSatoshis: amountInSatoshis,\n });\n};\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\nexport class TaprootAddressNotSupportedError extends BaseError {\n constructor() {\n super({\n cause: null,\n code: 'taproot_address_not_supported',\n docsUrl: null,\n name: 'TaprootAddressNotSupportedError',\n shortMessage:\n 'Taproot addresses are not supported for PSBT building. Only Native SegWit (P2WPKH) addresses are allowed.',\n });\n }\n}\n","import { TaprootAddressNotSupportedError } from '../../../errors/TaprootAddressNotSupportedError';\n\n/**\n * Validates that the address is not a Taproot address\n * Only Native SegWit (P2WPKH) is supported for PSBT building\n *\n * @param accountAddress - The account address to check\n * @throws TaprootAddressNotSupportedError if address is Taproot\n * @not-instrumented\n */\n// eslint-disable-next-line custom-rules/require-single-object-param\nexport const validateNotTaproot = (accountAddress: string): void => {\n if (\n accountAddress.toLowerCase().startsWith('bc1p') ||\n accountAddress.toLowerCase().startsWith('tb1p')\n ) {\n throw new TaprootAddressNotSupportedError();\n }\n};\n","import ecc from '@bitcoinerlab/secp256k1';\nimport { getBuffer } from '@dynamic-labs-sdk/client/core';\nimport type { Network } from 'bitcoinjs-lib';\nimport { Psbt } from 'bitcoinjs-lib';\nimport { ECPairFactory } from 'ecpair';\n\nimport { InsufficientFundsError } from '../../../errors/InsufficientFundsError';\nimport { InvalidAmountError } from '../../../errors/InvalidAmountError';\nimport { NoUTXOsFoundError } from '../../../errors/NoUTXOsFoundError';\nimport { DUST_LIMIT } from '../../constants';\nimport type { FeePriority } from '../../WaasBitcoinWalletProvider.types';\nimport { addInputsToPsbt } from '../addInputsToPsbt';\nimport { addOutputsToPsbt } from '../addOutputsToPsbt';\nimport { calculateFeeAndChange } from '../calculateFeeAndChange';\nimport { calculateUTXOTotal } from '../calculateUTXOTotal';\nimport { estimateTransactionFee } from '../estimateTransactionFee';\nimport { getUTXOs } from '../getUTXOs';\nimport { selectUTXOsLargestFirst } from '../selectUTXOsLargestFirst';\nimport { validateAndSelectUTXOs } from '../validateAndSelectUTXOs';\nimport { validateNotTaproot } from '../validateNotTaproot';\n\ntype BuildPsbtOptions = {\n accountAddress: string;\n amountInSatoshis: bigint;\n feePriority?: FeePriority;\n network: Network;\n publicKeyHex: string;\n recipientAddress: string;\n};\n\n/**\n * Builds a PSBT for a Bitcoin transaction with real UTXOs\n * Uses Largest-First UTXO selection strategy with accurate vSize fee estimation\n *\n * @param options.accountAddress - The sender's Bitcoin address\n * @param options.amountInSatoshis - Amount to send in satoshis\n * @param options.feePriority - Priority level for fee estimation ('low', 'medium', or 'high')\n * @param options.network - Bitcoin network configuration (mainnet or testnet)\n * @param options.publicKeyHex - The sender's public key in hexadecimal format\n * @param options.recipientAddress - The recipient's Bitcoin address\n * @returns A PSBT in Base64 format\n * @throws Error if insufficient funds, no UTXOs, or other errors\n * @not-instrumented\n */\nexport const buildPsbt = async ({\n accountAddress,\n amountInSatoshis,\n feePriority = 'medium',\n network,\n publicKeyHex,\n recipientAddress,\n}: BuildPsbtOptions): Promise<string> => {\n if (amountInSatoshis <= BigInt(0)) {\n throw new InvalidAmountError({\n amountInSatoshis: Number(amountInSatoshis),\n reason: 'Amount must be greater than 0',\n });\n }\n\n validateNotTaproot(accountAddress);\n\n const allUTXOs = await getUTXOs(accountAddress);\n\n if (allUTXOs.length === 0) {\n throw new NoUTXOsFoundError({ address: accountAddress });\n }\n\n const publicKeyBuffer = new Uint8Array(getBuffer().from(publicKeyHex, 'hex'));\n const ECPair = ECPairFactory(ecc);\n\n // @ts-expect-error - ecpair types are incompatible with valibot >=1.2.0\n // The options are actually optional at runtime, but TypeScript infers them as required\n const publicKeyPair = ECPair.fromPublicKey(publicKeyBuffer, {\n compressed: true,\n });\n\n const amountInSatoshisNumber = Number(amountInSatoshis);\n\n const initialFeeEstimate = await estimateTransactionFee({\n feePriority,\n numInputs: 1,\n numOutputs: 1,\n });\n\n const targetAmount = amountInSatoshisNumber + initialFeeEstimate + DUST_LIMIT;\n\n let selectedUTXOs = selectUTXOsLargestFirst({\n targetAmount,\n utxos: allUTXOs,\n });\n const selectedTotal = calculateUTXOTotal(selectedUTXOs);\n\n selectedUTXOs = validateAndSelectUTXOs({\n allUTXOs,\n amountInSatoshis: amountInSatoshisNumber,\n feeEstimate: initialFeeEstimate,\n selectedTotal,\n selectedUTXOs,\n });\n\n const selectedTotalValue = calculateUTXOTotal(selectedUTXOs);\n\n const { changeAmountNumber, feeEstimate, hasChangeOutput } =\n await calculateFeeAndChange({\n amountInSatoshis,\n feePriority,\n selectedTotalValue,\n selectedUTXOs,\n });\n\n const maxToSpend = selectedTotalValue - feeEstimate;\n\n if (maxToSpend < amountInSatoshisNumber) {\n throw new InsufficientFundsError({\n availableSatoshis: maxToSpend,\n requiredSatoshis: amountInSatoshisNumber,\n });\n }\n\n const psbt = new Psbt({ network });\n\n addInputsToPsbt({\n network,\n psbt,\n publicKeyPair,\n selectedUTXOs,\n });\n\n addOutputsToPsbt({\n accountAddress,\n amountInSatoshis: amountInSatoshisNumber,\n changeAmount: changeAmountNumber,\n hasChangeOutput,\n network,\n psbt,\n recipientAddress,\n });\n\n return psbt.toBase64();\n};\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\nexport class PublicKeyNotFoundError extends BaseError {\n // eslint-disable-next-line custom-rules/require-single-object-param\n constructor(address: string) {\n super({\n cause: null,\n code: 'public_key_not_found_error',\n docsUrl: null,\n name: 'PublicKeyNotFoundError',\n shortMessage: `No public key found for address ${address}`,\n });\n }\n}\n\n","import type { DynamicClient, WalletAccount } from '@dynamic-labs-sdk/client';\nimport { getCore } from '@dynamic-labs-sdk/client/core';\n\nimport { PublicKeyNotFoundError } from '../../../errors/PublicKeyNotFoundError';\n\n/**\n * Gets the public key for a wallet account from the user's verified credentials\n * @not-instrumented\n */\nexport const getPublicKeyForWalletAccount = (\n walletAccount: WalletAccount,\n client: DynamicClient\n): string => {\n const user = getCore(client).state.get().user;\n\n for (const credential of user?.verifiedCredentials ?? []) {\n const additionalAddress = credential.walletAdditionalAddresses?.find(\n (addr) => addr.address === walletAccount.address\n );\n\n if (additionalAddress?.publicKey) {\n return additionalAddress.publicKey;\n }\n }\n\n throw new PublicKeyNotFoundError(walletAccount.address);\n};\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport {\n assertDefined,\n consumeMfaTokenIfRequiredForAction,\n formatWalletProviderGroupKey,\n formatWalletProviderKey,\n getActiveNetworkIdFromLastKnownRegistry,\n getSignedSessionId,\n switchActiveNetworkInLastKnownRegistry,\n} from '@dynamic-labs-sdk/client/core';\nimport type { BitcoinNetwork } from '@dynamic-labs-sdk/client/waas/core';\nimport {\n DYNAMIC_WAAS_METADATA,\n createWaasProvider,\n getAllUserWaasAddressesForChain,\n} from '@dynamic-labs-sdk/client/waas/core';\nimport { MFAAction, WalletProviderEnum } from '@dynamic-labs/sdk-api-core';\nimport { Psbt, networks } from 'bitcoinjs-lib';\n\nimport type { BitcoinSendTransactionResponse } from '../../../BitcoinWalletProvider.types';\nimport { bitcoinExecuteSwapTransaction } from '../../../utils/bitcoinExecuteSwapTransaction';\nimport { bitcoinTransferAmount } from '../../../utils/bitcoinTransferAmount';\nimport type {\n WaasBitcoinTransaction,\n WaasBitcoinWalletProvider,\n} from '../../WaasBitcoinWalletProvider.types';\nimport { broadcastTransaction } from '../broadcastTransaction';\nimport { buildPsbt as buildPsbtUtil } from '../buildPsbt';\nimport { getPublicKeyForWalletAccount } from '../getPublicKeyForWalletAccount/getPublicKeyForWalletAccount';\n\n/** @not-instrumented */\nexport const createWalletProviderForWaasBitcoin = (\n sdkClient: DynamicClient\n): WaasBitcoinWalletProvider => {\n const chain = 'BTC' as const;\n\n const walletProviderType = WalletProviderEnum.EmbeddedWallet;\n\n const key = formatWalletProviderKey({\n chain,\n displayName: DYNAMIC_WAAS_METADATA.displayName,\n walletProviderType,\n });\n\n const waasProvider = createWaasProvider({ chain, sdkClient });\n\n const getActiveNetworkId: WaasBitcoinWalletProvider['getActiveNetworkId'] =\n async () =>\n getActiveNetworkIdFromLastKnownRegistry({\n client: sdkClient,\n walletProviderKey: key,\n });\n\n const switchActiveNetwork: WaasBitcoinWalletProvider['switchActiveNetwork'] =\n async ({ networkId }) =>\n switchActiveNetworkInLastKnownRegistry({\n client: sdkClient,\n networkId,\n walletProviderKey: key,\n });\n\n const getConnectedAddresses: WaasBitcoinWalletProvider['getConnectedAddresses'] =\n async () => {\n const waasBitcoinAddresses = getAllUserWaasAddressesForChain(\n { chain },\n sdkClient\n );\n\n return {\n addresses: waasBitcoinAddresses,\n };\n };\n\n const signPsbt: WaasBitcoinWalletProvider['signPsbt'] = async ({\n request,\n walletAccount,\n }) => {\n assertDefined(walletAccount, 'Wallet account is required');\n\n const waasClient = await waasProvider.getWaasClient();\n\n const { signature: signedSessionId } = await getSignedSessionId(sdkClient);\n\n const mfaToken = await consumeMfaTokenIfRequiredForAction(\n { mfaAction: MFAAction.WalletWaasSign },\n sdkClient\n );\n\n const signedPsbt = await waasClient.signTransaction({\n authToken: sdkClient.token ?? undefined,\n mfaToken,\n senderAddress: walletAccount.address,\n signedSessionId,\n transaction: request.unsignedPsbtBase64,\n });\n\n return { signedPsbt };\n };\n\n const signPsbts: WaasBitcoinWalletProvider['signPsbts'] = async ({\n requests,\n walletAccount,\n }) => {\n assertDefined(walletAccount, 'Wallet account is required');\n\n const signedPsbts = await Promise.all(\n requests.map(async (request) => {\n const { signedPsbt } = await signPsbt({ request, walletAccount });\n\n return signedPsbt;\n })\n );\n\n return { signedPsbts };\n };\n\n const signMessage: WaasBitcoinWalletProvider['signMessage'] = async ({\n message,\n walletAccount,\n }) => {\n assertDefined(walletAccount, 'Wallet account is required');\n\n const waasClient = await waasProvider.getWaasClient();\n\n const { signature: signedSessionId } = await getSignedSessionId(sdkClient);\n\n const mfaToken = await consumeMfaTokenIfRequiredForAction(\n { mfaAction: MFAAction.WalletWaasSign },\n sdkClient\n );\n\n const signature = await waasClient.signMessage({\n accountAddress: walletAccount.address,\n authToken: sdkClient.token ?? undefined,\n bitcoinConfig: {\n network: 'mainnet' as BitcoinNetwork,\n },\n message,\n mfaToken,\n signedSessionId,\n });\n\n return { signature };\n };\n\n const buildPsbt: WaasBitcoinWalletProvider['buildPsbt'] = async ({\n transaction,\n walletAccount,\n }) => {\n assertDefined(walletAccount, 'Wallet account is required');\n\n const publicKeyHex = getPublicKeyForWalletAccount(walletAccount, sdkClient);\n\n return buildPsbtUtil({\n accountAddress: walletAccount.address,\n amountInSatoshis: transaction.amount,\n feePriority: transaction.feePriority ?? 'medium',\n network: networks.bitcoin,\n publicKeyHex,\n recipientAddress: transaction.recipientAddress,\n });\n };\n\n const sendBitcoin: WaasBitcoinWalletProvider['sendBitcoin'] = async ({\n transaction,\n walletAccount,\n }): Promise<BitcoinSendTransactionResponse> => {\n assertDefined(walletAccount, 'Wallet account is required');\n\n const waasTransaction: WaasBitcoinTransaction = {\n amount: transaction.amount,\n recipientAddress: transaction.recipientAddress,\n };\n\n const unsignedPsbt = await buildPsbt({\n transaction: waasTransaction,\n walletAccount,\n });\n\n const { signedPsbt } = await signPsbt({\n request: { allowedSighash: [], unsignedPsbtBase64: unsignedPsbt },\n walletAccount,\n });\n\n const psbt = Psbt.fromBase64(signedPsbt, { network: networks.bitcoin });\n\n psbt.finalizeAllInputs();\n\n const rawTx = psbt.extractTransaction().toHex();\n\n const transactionId = await broadcastTransaction(rawTx);\n\n return { transactionId };\n };\n\n return {\n ...waasProvider,\n buildPsbt,\n chain,\n executeSwapTransaction: (args) =>\n bitcoinExecuteSwapTransaction(args, sdkClient),\n getActiveNetworkId,\n getConnectedAddresses,\n groupKey: formatWalletProviderGroupKey(DYNAMIC_WAAS_METADATA.displayName),\n key,\n metadata: {\n displayName: DYNAMIC_WAAS_METADATA.displayName,\n icon: DYNAMIC_WAAS_METADATA.icon,\n },\n sendBitcoin,\n signMessage,\n signPsbt,\n signPsbts,\n switchActiveNetwork,\n transferAmount: (args) => bitcoinTransferAmount(args, sdkClient),\n walletProviderType,\n };\n};\n","import {\n WalletProviderPriority,\n getDefaultClient,\n getWalletProviderRegistry,\n hasExtension,\n registerExtension,\n} from '@dynamic-labs-sdk/client/core';\n\nimport { registerBitcoinNetworkProviderBuilder } from '../../registerBitcoinNetworkProviderBuilder';\nimport { createWalletProviderForWaasBitcoin } from '../utils/createWalletProviderForWaasBitcoin';\n\nexport const WAAS_BITCOIN_EXTENSION_KEY = 'waasBitcoin';\n\n/**\n * Adds the Dynamic WaaS (Wallet as a Service) Bitcoin extension to the Dynamic client.\n *\n * This extension enables embedded wallet functionality for Bitcoin blockchain,\n * allowing users to have wallets managed by Dynamic's infrastructure.\n *\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @not-instrumented\n */\nexport const addWaasBitcoinExtension = (client = getDefaultClient()): void => {\n if (hasExtension({ extensionKey: WAAS_BITCOIN_EXTENSION_KEY }, client)) {\n return;\n }\n\n registerExtension({ extensionKey: WAAS_BITCOIN_EXTENSION_KEY }, client);\n registerBitcoinNetworkProviderBuilder(client);\n\n const walletProviderRegistry = getWalletProviderRegistry(client);\n\n const walletProvider = createWalletProviderForWaasBitcoin(client);\n\n walletProviderRegistry.register({\n priority: WalletProviderPriority.WALLET_SDK,\n walletProvider,\n });\n};\n\n"],"mappings":"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"}
@@ -25,7 +25,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
25
25
  }) : target, mod));
26
26
 
27
27
  //#endregion
28
- const require_bitcoinTransferAmount = require('./bitcoinTransferAmount-BXNrJ626.cjs.js');
28
+ const require_bitcoinTransferAmount = require('./bitcoinTransferAmount-DiaNI_VK.cjs.js');
29
29
  let _dynamic_labs_sdk_client_core = require("@dynamic-labs-sdk/client/core");
30
30
  let _dynamic_labs_sdk_client = require("@dynamic-labs-sdk/client");
31
31
  let _dynamic_labs_sdk_api_core = require("@dynamic-labs/sdk-api-core");
@@ -755,4 +755,4 @@ Object.defineProperty(exports, 'addWaasBitcoinExtension', {
755
755
  return addWaasBitcoinExtension;
756
756
  }
757
757
  });
758
- //# sourceMappingURL=addWaasBitcoinExtension-CFImdZlf.cjs.js.map
758
+ //# sourceMappingURL=addWaasBitcoinExtension-j-IFW13l.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addWaasBitcoinExtension-j-IFW13l.cjs.js","names":["BaseError","BaseError","BaseError","BaseError","BaseError","address","BaseError","payments","address","BaseError","feePerByte: number","BaseError","address","address","selected: UTXO[]","BaseError","ecc","Psbt","BaseError","address","WalletProviderEnum","DYNAMIC_WAAS_METADATA","getActiveNetworkId: WaasBitcoinWalletProvider['getActiveNetworkId']","switchActiveNetwork: WaasBitcoinWalletProvider['switchActiveNetwork']","getConnectedAddresses: WaasBitcoinWalletProvider['getConnectedAddresses']","signPsbt: WaasBitcoinWalletProvider['signPsbt']","MFAAction","signPsbts: WaasBitcoinWalletProvider['signPsbts']","signMessage: WaasBitcoinWalletProvider['signMessage']","buildPsbt: WaasBitcoinWalletProvider['buildPsbt']","buildPsbtUtil","networks","sendBitcoin: WaasBitcoinWalletProvider['sendBitcoin']","buildPsbt","Psbt","bitcoinExecuteSwapTransaction","bitcoinTransferAmount","WalletProviderPriority"],"sources":["../src/errors/TransactionBroadcastFailedError.ts","../src/errors/TransactionRequiredError.ts","../src/waas/constants.ts","../src/waas/utils/broadcastTransaction/broadcastTransaction.ts","../src/errors/InsufficientFundsError.ts","../src/errors/InvalidAmountError.ts","../src/errors/NoUTXOsFoundError.ts","../src/errors/SegwitOutputScriptError.ts","../src/waas/utils/addInputsToPsbt/addInputsToPsbt.ts","../src/waas/utils/addOutputsToPsbt/addOutputsToPsbt.ts","../src/errors/FeeRecommendationsFetchError.ts","../src/waas/utils/getFeeRecommendations/getFeeRecommendations.ts","../src/waas/utils/estimateTransactionFee/estimateTransactionFee.ts","../src/waas/utils/calculateFeeAndChange/calculateFeeAndChange.ts","../src/waas/utils/calculateUTXOTotal/calculateUTXOTotal.ts","../src/errors/UTXOsFetchError.ts","../src/waas/utils/getUTXOs/getUTXOs.ts","../src/waas/utils/selectUTXOsLargestFirst/selectUTXOsLargestFirst.ts","../src/waas/utils/validateAndSelectUTXOs/validateAndSelectUTXOs.ts","../src/errors/TaprootAddressNotSupportedError.ts","../src/waas/utils/validateNotTaproot/validateNotTaproot.ts","../src/waas/utils/buildPsbt/buildPsbt.ts","../src/errors/PublicKeyNotFoundError.ts","../src/waas/utils/getPublicKeyForWalletAccount/getPublicKeyForWalletAccount.ts","../src/waas/utils/createWalletProviderForWaasBitcoin/createWalletProviderForWaasBitcoin.ts","../src/waas/addWaasBitcoinExtension/addWaasBitcoinExtension.ts"],"sourcesContent":["import { BaseError } from '@dynamic-labs-sdk/client';\n\ntype TransactionBroadcastFailedErrorParams = {\n response: Response;\n};\n\nexport class TransactionBroadcastFailedError extends BaseError {\n public readonly response: Response;\n\n constructor({ response }: TransactionBroadcastFailedErrorParams) {\n super({\n cause: null,\n code: 'transaction_broadcast_failed_error',\n details: `Status: ${response.status} ${response.statusText}`,\n docsUrl: null,\n name: 'TransactionBroadcastFailedError',\n shortMessage: 'Failed to broadcast transaction to mempool',\n });\n\n this.response = response;\n }\n}\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\nexport class TransactionRequiredError extends BaseError {\n constructor() {\n super({\n cause: null,\n code: 'transaction_required_error',\n docsUrl: null,\n name: 'TransactionRequiredError',\n shortMessage: 'No transaction specified for broadcast',\n });\n }\n}\n","/**\n * Mempool.space API URL for mainnet\n */\nexport const MEMPOOL_API_URL = 'https://mempool.space/api';\n\n/**\n * Number of satoshis per Bitcoin\n */\nexport const SATOSHIS_PER_BTC = 100_000_000;\n\n/**\n * Bitcoin's dust limit in satoshis\n * Outputs below this value are considered \"dust\" and will be rejected by nodes\n */\nexport const DUST_LIMIT = 546;\n\n/**\n * Accurate vSize constants for Native SegWit (P2WPKH) transactions\n * Used for precise fee estimation\n */\nexport const VSIZE_OVERHEAD = 10.5;\n\nexport const VSIZE_INPUT_P2WPKH = 68;\n\nexport const VSIZE_OUTPUT_P2WPKH = 31;\n\n/**\n * Minimum relay fee in satoshis\n * Added to fee estimate to ensure transaction propagation\n */\nexport const MIN_RELAY_FEE = 111;\n\n/**\n * Conservative default fee estimate in satoshis\n * Used as fallback when fee estimation fails\n */\nexport const DEFAULT_FEE_ESTIMATE = 1000;\n\n/**\n * RBF (Replace-By-Fee) sequence number\n * 0xfffffffd = 4294967293 (enables RBF, not final)\n */\nexport const RBF_SEQUENCE = 0xfffffffd;\n","import { TransactionBroadcastFailedError } from '../../../errors/TransactionBroadcastFailedError';\nimport { TransactionRequiredError } from '../../../errors/TransactionRequiredError';\nimport { MEMPOOL_API_URL } from '../../constants';\n\n/**\n * Sends a raw Bitcoin transaction to the mempool\n *\n * @param rawTransaction - The raw transaction in hex format\n * @returns The transaction ID\n * @throws {TransactionRequiredError} if no transaction is specified\n * @throws {TransactionBroadcastFailedError} if broadcasting fails\n * @not-instrumented\n */\n// eslint-disable-next-line custom-rules/require-single-object-param\nexport const broadcastTransaction = async (\n rawTransaction: string\n): Promise<string> => {\n if (!rawTransaction) {\n throw new TransactionRequiredError();\n }\n\n const response = await fetch(`${MEMPOOL_API_URL}/tx`, {\n body: rawTransaction,\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n method: 'POST',\n });\n\n if (!response.ok) {\n throw new TransactionBroadcastFailedError({ response });\n }\n\n return response.text();\n};\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\nimport { SATOSHIS_PER_BTC } from '../waas/constants';\n\ntype InsufficientFundsErrorParams = {\n availableSatoshis: number;\n requiredSatoshis: number;\n};\n\nexport class InsufficientFundsError extends BaseError {\n public readonly availableSatoshis: number;\n\n public readonly requiredSatoshis: number;\n\n constructor({ availableSatoshis, requiredSatoshis }: InsufficientFundsErrorParams) {\n const availableBtc = availableSatoshis / SATOSHIS_PER_BTC;\n const requiredBtc = requiredSatoshis / SATOSHIS_PER_BTC;\n\n super({\n cause: null,\n code: 'insufficient_funds_error',\n details: `Available: ${availableBtc} BTC (${availableSatoshis} satoshis), Required: ${requiredBtc} BTC (${requiredSatoshis} satoshis)`,\n docsUrl: null,\n name: 'InsufficientFundsError',\n shortMessage: 'Insufficient funds for transaction',\n });\n\n this.availableSatoshis = availableSatoshis;\n\n this.requiredSatoshis = requiredSatoshis;\n }\n}\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\ntype InvalidAmountErrorParams = {\n amountInSatoshis: number;\n reason: string;\n};\n\nexport class InvalidAmountError extends BaseError {\n public readonly amountInSatoshis: number;\n\n constructor({ amountInSatoshis, reason }: InvalidAmountErrorParams) {\n super({\n cause: null,\n code: 'invalid_amount_error',\n details: `Amount: ${amountInSatoshis} satoshis`,\n docsUrl: null,\n name: 'InvalidAmountError',\n shortMessage: reason,\n });\n\n this.amountInSatoshis = amountInSatoshis;\n }\n}\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\ntype NoUTXOsFoundErrorParams = {\n address: string;\n};\n\nexport class NoUTXOsFoundError extends BaseError {\n public readonly address: string;\n\n constructor({ address }: NoUTXOsFoundErrorParams) {\n super({\n cause: null,\n code: 'no_utxos_found_error',\n details: `Address: ${address}`,\n docsUrl: null,\n name: 'NoUTXOsFoundError',\n shortMessage: 'No UTXOs found for this address',\n });\n\n this.address = address;\n }\n}\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\nexport class SegwitOutputScriptError extends BaseError {\n constructor() {\n super({\n cause: null,\n code: 'segwit_output_script_error',\n docsUrl: null,\n name: 'SegwitOutputScriptError',\n shortMessage: 'Failed to create segwit output script',\n });\n }\n}\n","import { getBuffer } from '@dynamic-labs-sdk/client/core';\nimport type { Network, Psbt } from 'bitcoinjs-lib';\nimport { payments } from 'bitcoinjs-lib';\n\nimport { SegwitOutputScriptError } from '../../../errors/SegwitOutputScriptError';\nimport { RBF_SEQUENCE } from '../../constants';\nimport type { UTXO } from '../../WaasBitcoinWalletProvider.types';\n\ntype AddInputsToPsbtOptions = {\n network: Network;\n psbt: Psbt;\n publicKeyPair: { publicKey: Uint8Array };\n selectedUTXOs: UTXO[];\n};\n\n/**\n * Adds inputs to PSBT from selected UTXOs\n *\n * @param options.network - Bitcoin network configuration (mainnet or testnet)\n * @param options.psbt - The PSBT instance to add inputs to\n * @param options.publicKeyPair - Key pair containing the public key for witness script\n * @param options.selectedUTXOs - Array of UTXOs to add as inputs\n * @not-instrumented\n */\nexport const addInputsToPsbt = (options: AddInputsToPsbtOptions): void => {\n const { network, psbt, publicKeyPair, selectedUTXOs } = options;\n\n for (const utxo of selectedUTXOs) {\n const outputScript = payments.p2wpkh({\n network,\n pubkey: publicKeyPair.publicKey,\n }).output;\n\n if (!outputScript) {\n throw new SegwitOutputScriptError();\n }\n\n const txidBuffer = new Uint8Array(\n getBuffer().from(utxo.txid, 'hex').reverse()\n );\n\n psbt.addInput({\n hash: txidBuffer,\n index: utxo.vout,\n sequence: RBF_SEQUENCE,\n witnessUtxo: {\n script: outputScript,\n value: BigInt(utxo.value),\n },\n });\n }\n};\n","import type { Network, Psbt } from 'bitcoinjs-lib';\nimport { address } from 'bitcoinjs-lib';\n\nimport { InvalidAmountError } from '../../../errors/InvalidAmountError';\nimport { DUST_LIMIT, SATOSHIS_PER_BTC } from '../../constants';\n\ntype AddOutputsToPsbtOptions = {\n accountAddress: string;\n amountInSatoshis: number;\n changeAmount: number;\n hasChangeOutput: boolean;\n network: Network;\n psbt: Psbt;\n recipientAddress: string;\n};\n\n/**\n * Adds outputs to PSBT (recipient and optionally change)\n *\n * @param options.accountAddress - The sender's address for receiving change\n * @param options.amountInSatoshis - Amount to send to the recipient in satoshis\n * @param options.changeAmount - Amount to return as change in satoshis\n * @param options.hasChangeOutput - Whether to include a change output\n * @param options.network - Bitcoin network configuration (mainnet or testnet)\n * @param options.psbt - The PSBT instance to add outputs to\n * @param options.recipientAddress - The recipient's Bitcoin address\n * @not-instrumented\n */\nexport const addOutputsToPsbt = (options: AddOutputsToPsbtOptions): void => {\n const {\n accountAddress,\n amountInSatoshis,\n changeAmount,\n hasChangeOutput,\n network,\n psbt,\n recipientAddress,\n } = options;\n\n if (amountInSatoshis < DUST_LIMIT) {\n throw new InvalidAmountError({\n amountInSatoshis,\n reason: `Amount is below dust limit of ${DUST_LIMIT} satoshis (${DUST_LIMIT / SATOSHIS_PER_BTC} BTC)`,\n });\n }\n\n psbt.addOutput({\n script: address.toOutputScript(recipientAddress, network),\n value: BigInt(amountInSatoshis),\n });\n\n if (hasChangeOutput) {\n psbt.addOutput({\n script: address.toOutputScript(accountAddress, network),\n value: BigInt(changeAmount),\n });\n }\n};\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\ntype FeeRecommendationsFetchErrorParams = {\n response: Response;\n};\n\nexport class FeeRecommendationsFetchError extends BaseError {\n public readonly response: Response;\n\n constructor({ response }: FeeRecommendationsFetchErrorParams) {\n super({\n cause: null,\n code: 'fee_recommendations_fetch_error',\n details: `Status: ${response.status} ${response.statusText}`,\n docsUrl: null,\n name: 'FeeRecommendationsFetchError',\n shortMessage: 'Failed to fetch fee recommendations from mempool',\n });\n\n this.response = response;\n }\n}\n","import { FeeRecommendationsFetchError } from '../../../errors/FeeRecommendationsFetchError';\nimport { MEMPOOL_API_URL } from '../../constants';\nimport type { FeeRecommendations } from '../../WaasBitcoinWalletProvider.types';\n\n/**\n * Gets fee recommendations from mempool.space API\n *\n * @returns Fee recommendation data with rates in sat/vB\n * @throws FeeRecommendationsFetchError if fetching fee recommendations fails\n * @not-instrumented\n */\nexport const getFeeRecommendations = async (): Promise<FeeRecommendations> => {\n const response = await fetch(`${MEMPOOL_API_URL}/v1/fees/recommended`);\n\n if (!response.ok) {\n throw new FeeRecommendationsFetchError({ response });\n }\n\n return response.json();\n};\n","import {\n DEFAULT_FEE_ESTIMATE,\n MIN_RELAY_FEE,\n VSIZE_INPUT_P2WPKH,\n VSIZE_OUTPUT_P2WPKH,\n VSIZE_OVERHEAD,\n} from '../../constants';\nimport type { FeePriority } from '../../WaasBitcoinWalletProvider.types';\nimport { getFeeRecommendations } from '../getFeeRecommendations';\n\ntype EstimateTransactionFeeOptions = {\n feePriority?: FeePriority;\n numInputs: number;\n numOutputs: number;\n};\n\n/**\n * Estimates transaction fees based on number of inputs and outputs using accurate vSize\n *\n * @param options.feePriority - Priority level for fee estimation ('low', 'medium', or 'high')\n * @param options.numInputs - Number of transaction inputs (UTXOs being spent)\n * @param options.numOutputs - Number of transaction outputs\n * @returns Estimated fee in satoshis\n * @not-instrumented\n */\nexport const estimateTransactionFee = async ({\n feePriority = 'medium',\n numInputs,\n numOutputs,\n}: EstimateTransactionFeeOptions): Promise<number> => {\n try {\n const feeData = await getFeeRecommendations();\n\n let feePerByte: number;\n\n if (feePriority === 'high') {\n feePerByte = feeData.fastestFee ?? feeData.halfHourFee ?? 1;\n } else if (feePriority === 'low') {\n feePerByte = feeData.economyFee ?? feeData.hourFee ?? 1;\n } else {\n feePerByte =\n feeData.halfHourFee ?? feeData.hourFee ?? feeData.economyFee ?? 1;\n }\n\n const vSize =\n VSIZE_OVERHEAD +\n numInputs * VSIZE_INPUT_P2WPKH +\n numOutputs * VSIZE_OUTPUT_P2WPKH;\n\n return Math.ceil(feePerByte * vSize) + MIN_RELAY_FEE;\n } catch {\n return DEFAULT_FEE_ESTIMATE;\n }\n};\n","import { DUST_LIMIT } from '../../constants';\nimport type { FeePriority, UTXO } from '../../WaasBitcoinWalletProvider.types';\nimport { estimateTransactionFee } from '../estimateTransactionFee';\n\ntype CalculateFeeAndChangeOptions = {\n amountInSatoshis: bigint;\n feePriority: FeePriority;\n selectedTotalValue: number;\n selectedUTXOs: UTXO[];\n};\n\ntype CalculateFeeAndChangeResult = {\n changeAmountNumber: number;\n feeEstimate: number;\n hasChangeOutput: boolean;\n};\n\n/**\n * Calculates fee estimate and change amount, handling dust limit\n *\n * @param options.amountInSatoshis - Amount to send in satoshis\n * @param options.feePriority - Priority level for fee estimation ('low', 'medium', or 'high')\n * @param options.selectedTotalValue - Total value of selected UTXOs in satoshis\n * @param options.selectedUTXOs - Array of selected UTXOs for the transaction\n * @returns Object with feeEstimate, changeAmountNumber, and hasChangeOutput\n * @not-instrumented\n */\nexport const calculateFeeAndChange = async ({\n amountInSatoshis,\n feePriority,\n selectedTotalValue,\n selectedUTXOs,\n}: CalculateFeeAndChangeOptions): Promise<CalculateFeeAndChangeResult> => {\n let feeEstimate = await estimateTransactionFee({\n feePriority,\n numInputs: selectedUTXOs.length,\n numOutputs: 1,\n });\n\n let maxToSpend = selectedTotalValue - feeEstimate;\n let changeAmount = BigInt(maxToSpend) - amountInSatoshis;\n\n const changeAmountNumber = Number(changeAmount);\n\n if (changeAmount > 0 && changeAmountNumber >= DUST_LIMIT) {\n feeEstimate = await estimateTransactionFee({\n feePriority,\n numInputs: selectedUTXOs.length,\n numOutputs: 2,\n });\n maxToSpend = selectedTotalValue - feeEstimate;\n changeAmount = BigInt(maxToSpend) - amountInSatoshis;\n }\n\n const finalChangeAmountNumber = Number(changeAmount);\n const hasChangeOutput =\n changeAmount > 0 && finalChangeAmountNumber >= DUST_LIMIT;\n\n if (changeAmount > 0 && finalChangeAmountNumber < DUST_LIMIT) {\n feeEstimate += finalChangeAmountNumber;\n }\n\n return {\n changeAmountNumber: finalChangeAmountNumber,\n feeEstimate,\n hasChangeOutput,\n };\n};\n","import type { UTXO } from '../../WaasBitcoinWalletProvider.types';\n\n/**\n * Calculates the total value of UTXOs\n *\n * @param utxos - Array of UTXOs\n * @returns Total value in satoshis\n * @not-instrumented\n */\nexport const calculateUTXOTotal = (utxos: UTXO[]): number =>\n utxos.reduce((total: number, utxo: UTXO) => total + utxo.value, 0);\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\ntype UTXOsFetchErrorParams = {\n address: string;\n response: Response;\n};\n\nexport class UTXOsFetchError extends BaseError {\n public readonly address: string;\n\n public readonly response: Response;\n\n constructor({ address, response }: UTXOsFetchErrorParams) {\n super({\n cause: null,\n code: 'utxos_fetch_error',\n details: `Address: ${address}, Status: ${response.status} ${response.statusText}`,\n docsUrl: null,\n name: 'UTXOsFetchError',\n shortMessage: 'Failed to fetch UTXOs from mempool',\n });\n\n this.address = address;\n\n this.response = response;\n }\n}\n","import { UTXOsFetchError } from '../../../errors/UTXOsFetchError';\nimport { MEMPOOL_API_URL } from '../../constants';\nimport type { UTXO } from '../../WaasBitcoinWalletProvider.types';\n\n/**\n * Gets UTXOs for a Bitcoin address from mempool.space API\n *\n * @param address - The Bitcoin address to get UTXOs for\n * @returns Array of UTXOs\n * @throws UTXOsFetchError if fetching UTXOs fails\n * @not-instrumented\n */\n// eslint-disable-next-line custom-rules/require-single-object-param\nexport const getUTXOs = async (address: string): Promise<UTXO[]> => {\n const response = await fetch(`${MEMPOOL_API_URL}/address/${address}/utxo`);\n\n if (!response.ok) {\n throw new UTXOsFetchError({ address, response });\n }\n\n return response.json();\n};\n","import type { UTXO } from '../../WaasBitcoinWalletProvider.types';\n\ntype SelectUTXOsLargestFirstOptions = {\n targetAmount: number;\n utxos: UTXO[];\n};\n\n/**\n * Selects UTXOs using Largest-First (Accumulator) strategy\n * Sorts UTXOs by value (descending) and selects until we have enough to cover amount + fees\n *\n * @param options.targetAmount - Target amount in satoshis (amount + fees + dust limit)\n * @param options.utxos - Array of available UTXOs to select from\n * @returns Selected UTXOs\n * @not-instrumented\n */\nexport const selectUTXOsLargestFirst = (\n options: SelectUTXOsLargestFirstOptions\n) => {\n const { targetAmount, utxos } = options;\n\n const sortedUTXOs = [...utxos].sort((a, b) => b.value - a.value);\n\n const selected: UTXO[] = [];\n let total = 0;\n\n for (const utxo of sortedUTXOs) {\n selected.push(utxo);\n total += utxo.value;\n\n if (total >= targetAmount) {\n break;\n }\n }\n\n return selected;\n};\n","import { InsufficientFundsError } from '../../../errors/InsufficientFundsError';\nimport type { UTXO } from '../../WaasBitcoinWalletProvider.types';\nimport { calculateUTXOTotal } from '../calculateUTXOTotal';\n\ntype ValidateAndSelectUTXOsOptions = {\n allUTXOs: UTXO[];\n amountInSatoshis: number;\n feeEstimate: number;\n selectedTotal: number;\n selectedUTXOs: UTXO[];\n};\n\n/**\n * Validates and ensures sufficient funds for the transaction\n *\n * @param options.allUTXOs - Complete array of available UTXOs for the address\n * @param options.amountInSatoshis - Amount to send in satoshis\n * @param options.feeEstimate - Estimated transaction fee in satoshis\n * @param options.selectedTotal - Total value of initially selected UTXOs in satoshis\n * @param options.selectedUTXOs - Array of initially selected UTXOs\n * @returns Validated selected UTXOs\n * @throws InsufficientFundsError if insufficient funds\n * @not-instrumented\n */\nexport const validateAndSelectUTXOs = (\n options: ValidateAndSelectUTXOsOptions\n) => {\n const {\n allUTXOs,\n amountInSatoshis,\n feeEstimate,\n selectedTotal,\n selectedUTXOs,\n } = options;\n\n const requiredAmount = amountInSatoshis + feeEstimate;\n\n if (selectedTotal >= requiredAmount) {\n return selectedUTXOs;\n }\n\n if (selectedUTXOs.length < allUTXOs.length) {\n const allTotal = calculateUTXOTotal(allUTXOs);\n\n if (allTotal < requiredAmount) {\n throw new InsufficientFundsError({\n availableSatoshis: allTotal,\n requiredSatoshis: amountInSatoshis,\n });\n }\n\n return allUTXOs;\n }\n\n throw new InsufficientFundsError({\n availableSatoshis: selectedTotal,\n requiredSatoshis: amountInSatoshis,\n });\n};\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\nexport class TaprootAddressNotSupportedError extends BaseError {\n constructor() {\n super({\n cause: null,\n code: 'taproot_address_not_supported',\n docsUrl: null,\n name: 'TaprootAddressNotSupportedError',\n shortMessage:\n 'Taproot addresses are not supported for PSBT building. Only Native SegWit (P2WPKH) addresses are allowed.',\n });\n }\n}\n","import { TaprootAddressNotSupportedError } from '../../../errors/TaprootAddressNotSupportedError';\n\n/**\n * Validates that the address is not a Taproot address\n * Only Native SegWit (P2WPKH) is supported for PSBT building\n *\n * @param accountAddress - The account address to check\n * @throws TaprootAddressNotSupportedError if address is Taproot\n * @not-instrumented\n */\n// eslint-disable-next-line custom-rules/require-single-object-param\nexport const validateNotTaproot = (accountAddress: string): void => {\n if (\n accountAddress.toLowerCase().startsWith('bc1p') ||\n accountAddress.toLowerCase().startsWith('tb1p')\n ) {\n throw new TaprootAddressNotSupportedError();\n }\n};\n","import ecc from '@bitcoinerlab/secp256k1';\nimport { getBuffer } from '@dynamic-labs-sdk/client/core';\nimport type { Network } from 'bitcoinjs-lib';\nimport { Psbt } from 'bitcoinjs-lib';\nimport { ECPairFactory } from 'ecpair';\n\nimport { InsufficientFundsError } from '../../../errors/InsufficientFundsError';\nimport { InvalidAmountError } from '../../../errors/InvalidAmountError';\nimport { NoUTXOsFoundError } from '../../../errors/NoUTXOsFoundError';\nimport { DUST_LIMIT } from '../../constants';\nimport type { FeePriority } from '../../WaasBitcoinWalletProvider.types';\nimport { addInputsToPsbt } from '../addInputsToPsbt';\nimport { addOutputsToPsbt } from '../addOutputsToPsbt';\nimport { calculateFeeAndChange } from '../calculateFeeAndChange';\nimport { calculateUTXOTotal } from '../calculateUTXOTotal';\nimport { estimateTransactionFee } from '../estimateTransactionFee';\nimport { getUTXOs } from '../getUTXOs';\nimport { selectUTXOsLargestFirst } from '../selectUTXOsLargestFirst';\nimport { validateAndSelectUTXOs } from '../validateAndSelectUTXOs';\nimport { validateNotTaproot } from '../validateNotTaproot';\n\ntype BuildPsbtOptions = {\n accountAddress: string;\n amountInSatoshis: bigint;\n feePriority?: FeePriority;\n network: Network;\n publicKeyHex: string;\n recipientAddress: string;\n};\n\n/**\n * Builds a PSBT for a Bitcoin transaction with real UTXOs\n * Uses Largest-First UTXO selection strategy with accurate vSize fee estimation\n *\n * @param options.accountAddress - The sender's Bitcoin address\n * @param options.amountInSatoshis - Amount to send in satoshis\n * @param options.feePriority - Priority level for fee estimation ('low', 'medium', or 'high')\n * @param options.network - Bitcoin network configuration (mainnet or testnet)\n * @param options.publicKeyHex - The sender's public key in hexadecimal format\n * @param options.recipientAddress - The recipient's Bitcoin address\n * @returns A PSBT in Base64 format\n * @throws Error if insufficient funds, no UTXOs, or other errors\n * @not-instrumented\n */\nexport const buildPsbt = async ({\n accountAddress,\n amountInSatoshis,\n feePriority = 'medium',\n network,\n publicKeyHex,\n recipientAddress,\n}: BuildPsbtOptions): Promise<string> => {\n if (amountInSatoshis <= BigInt(0)) {\n throw new InvalidAmountError({\n amountInSatoshis: Number(amountInSatoshis),\n reason: 'Amount must be greater than 0',\n });\n }\n\n validateNotTaproot(accountAddress);\n\n const allUTXOs = await getUTXOs(accountAddress);\n\n if (allUTXOs.length === 0) {\n throw new NoUTXOsFoundError({ address: accountAddress });\n }\n\n const publicKeyBuffer = new Uint8Array(getBuffer().from(publicKeyHex, 'hex'));\n const ECPair = ECPairFactory(ecc);\n\n // @ts-expect-error - ecpair types are incompatible with valibot >=1.2.0\n // The options are actually optional at runtime, but TypeScript infers them as required\n const publicKeyPair = ECPair.fromPublicKey(publicKeyBuffer, {\n compressed: true,\n });\n\n const amountInSatoshisNumber = Number(amountInSatoshis);\n\n const initialFeeEstimate = await estimateTransactionFee({\n feePriority,\n numInputs: 1,\n numOutputs: 1,\n });\n\n const targetAmount = amountInSatoshisNumber + initialFeeEstimate + DUST_LIMIT;\n\n let selectedUTXOs = selectUTXOsLargestFirst({\n targetAmount,\n utxos: allUTXOs,\n });\n const selectedTotal = calculateUTXOTotal(selectedUTXOs);\n\n selectedUTXOs = validateAndSelectUTXOs({\n allUTXOs,\n amountInSatoshis: amountInSatoshisNumber,\n feeEstimate: initialFeeEstimate,\n selectedTotal,\n selectedUTXOs,\n });\n\n const selectedTotalValue = calculateUTXOTotal(selectedUTXOs);\n\n const { changeAmountNumber, feeEstimate, hasChangeOutput } =\n await calculateFeeAndChange({\n amountInSatoshis,\n feePriority,\n selectedTotalValue,\n selectedUTXOs,\n });\n\n const maxToSpend = selectedTotalValue - feeEstimate;\n\n if (maxToSpend < amountInSatoshisNumber) {\n throw new InsufficientFundsError({\n availableSatoshis: maxToSpend,\n requiredSatoshis: amountInSatoshisNumber,\n });\n }\n\n const psbt = new Psbt({ network });\n\n addInputsToPsbt({\n network,\n psbt,\n publicKeyPair,\n selectedUTXOs,\n });\n\n addOutputsToPsbt({\n accountAddress,\n amountInSatoshis: amountInSatoshisNumber,\n changeAmount: changeAmountNumber,\n hasChangeOutput,\n network,\n psbt,\n recipientAddress,\n });\n\n return psbt.toBase64();\n};\n","import { BaseError } from '@dynamic-labs-sdk/client';\n\nexport class PublicKeyNotFoundError extends BaseError {\n // eslint-disable-next-line custom-rules/require-single-object-param\n constructor(address: string) {\n super({\n cause: null,\n code: 'public_key_not_found_error',\n docsUrl: null,\n name: 'PublicKeyNotFoundError',\n shortMessage: `No public key found for address ${address}`,\n });\n }\n}\n\n","import type { DynamicClient, WalletAccount } from '@dynamic-labs-sdk/client';\nimport { getCore } from '@dynamic-labs-sdk/client/core';\n\nimport { PublicKeyNotFoundError } from '../../../errors/PublicKeyNotFoundError';\n\n/**\n * Gets the public key for a wallet account from the user's verified credentials\n * @not-instrumented\n */\nexport const getPublicKeyForWalletAccount = (\n walletAccount: WalletAccount,\n client: DynamicClient\n): string => {\n const user = getCore(client).state.get().user;\n\n for (const credential of user?.verifiedCredentials ?? []) {\n const additionalAddress = credential.walletAdditionalAddresses?.find(\n (addr) => addr.address === walletAccount.address\n );\n\n if (additionalAddress?.publicKey) {\n return additionalAddress.publicKey;\n }\n }\n\n throw new PublicKeyNotFoundError(walletAccount.address);\n};\n","import type { DynamicClient } from '@dynamic-labs-sdk/client';\nimport {\n assertDefined,\n consumeMfaTokenIfRequiredForAction,\n formatWalletProviderGroupKey,\n formatWalletProviderKey,\n getActiveNetworkIdFromLastKnownRegistry,\n getSignedSessionId,\n switchActiveNetworkInLastKnownRegistry,\n} from '@dynamic-labs-sdk/client/core';\nimport type { BitcoinNetwork } from '@dynamic-labs-sdk/client/waas/core';\nimport {\n DYNAMIC_WAAS_METADATA,\n createWaasProvider,\n getAllUserWaasAddressesForChain,\n} from '@dynamic-labs-sdk/client/waas/core';\nimport { MFAAction, WalletProviderEnum } from '@dynamic-labs/sdk-api-core';\nimport { Psbt, networks } from 'bitcoinjs-lib';\n\nimport type { BitcoinSendTransactionResponse } from '../../../BitcoinWalletProvider.types';\nimport { bitcoinExecuteSwapTransaction } from '../../../utils/bitcoinExecuteSwapTransaction';\nimport { bitcoinTransferAmount } from '../../../utils/bitcoinTransferAmount';\nimport type {\n WaasBitcoinTransaction,\n WaasBitcoinWalletProvider,\n} from '../../WaasBitcoinWalletProvider.types';\nimport { broadcastTransaction } from '../broadcastTransaction';\nimport { buildPsbt as buildPsbtUtil } from '../buildPsbt';\nimport { getPublicKeyForWalletAccount } from '../getPublicKeyForWalletAccount/getPublicKeyForWalletAccount';\n\n/** @not-instrumented */\nexport const createWalletProviderForWaasBitcoin = (\n sdkClient: DynamicClient\n): WaasBitcoinWalletProvider => {\n const chain = 'BTC' as const;\n\n const walletProviderType = WalletProviderEnum.EmbeddedWallet;\n\n const key = formatWalletProviderKey({\n chain,\n displayName: DYNAMIC_WAAS_METADATA.displayName,\n walletProviderType,\n });\n\n const waasProvider = createWaasProvider({ chain, sdkClient });\n\n const getActiveNetworkId: WaasBitcoinWalletProvider['getActiveNetworkId'] =\n async () =>\n getActiveNetworkIdFromLastKnownRegistry({\n client: sdkClient,\n walletProviderKey: key,\n });\n\n const switchActiveNetwork: WaasBitcoinWalletProvider['switchActiveNetwork'] =\n async ({ networkId }) =>\n switchActiveNetworkInLastKnownRegistry({\n client: sdkClient,\n networkId,\n walletProviderKey: key,\n });\n\n const getConnectedAddresses: WaasBitcoinWalletProvider['getConnectedAddresses'] =\n async () => {\n const waasBitcoinAddresses = getAllUserWaasAddressesForChain(\n { chain },\n sdkClient\n );\n\n return {\n addresses: waasBitcoinAddresses,\n };\n };\n\n const signPsbt: WaasBitcoinWalletProvider['signPsbt'] = async ({\n request,\n walletAccount,\n }) => {\n assertDefined(walletAccount, 'Wallet account is required');\n\n const waasClient = await waasProvider.getWaasClient();\n\n const { signature: signedSessionId } = await getSignedSessionId(sdkClient);\n\n const mfaToken = await consumeMfaTokenIfRequiredForAction(\n { mfaAction: MFAAction.WalletWaasSign },\n sdkClient\n );\n\n const signedPsbt = await waasClient.signTransaction({\n authToken: sdkClient.token ?? undefined,\n mfaToken,\n senderAddress: walletAccount.address,\n signedSessionId,\n transaction: request.unsignedPsbtBase64,\n });\n\n return { signedPsbt };\n };\n\n const signPsbts: WaasBitcoinWalletProvider['signPsbts'] = async ({\n requests,\n walletAccount,\n }) => {\n assertDefined(walletAccount, 'Wallet account is required');\n\n const signedPsbts = await Promise.all(\n requests.map(async (request) => {\n const { signedPsbt } = await signPsbt({ request, walletAccount });\n\n return signedPsbt;\n })\n );\n\n return { signedPsbts };\n };\n\n const signMessage: WaasBitcoinWalletProvider['signMessage'] = async ({\n message,\n walletAccount,\n }) => {\n assertDefined(walletAccount, 'Wallet account is required');\n\n const waasClient = await waasProvider.getWaasClient();\n\n const { signature: signedSessionId } = await getSignedSessionId(sdkClient);\n\n const mfaToken = await consumeMfaTokenIfRequiredForAction(\n { mfaAction: MFAAction.WalletWaasSign },\n sdkClient\n );\n\n const signature = await waasClient.signMessage({\n accountAddress: walletAccount.address,\n authToken: sdkClient.token ?? undefined,\n bitcoinConfig: {\n network: 'mainnet' as BitcoinNetwork,\n },\n message,\n mfaToken,\n signedSessionId,\n });\n\n return { signature };\n };\n\n const buildPsbt: WaasBitcoinWalletProvider['buildPsbt'] = async ({\n transaction,\n walletAccount,\n }) => {\n assertDefined(walletAccount, 'Wallet account is required');\n\n const publicKeyHex = getPublicKeyForWalletAccount(walletAccount, sdkClient);\n\n return buildPsbtUtil({\n accountAddress: walletAccount.address,\n amountInSatoshis: transaction.amount,\n feePriority: transaction.feePriority ?? 'medium',\n network: networks.bitcoin,\n publicKeyHex,\n recipientAddress: transaction.recipientAddress,\n });\n };\n\n const sendBitcoin: WaasBitcoinWalletProvider['sendBitcoin'] = async ({\n transaction,\n walletAccount,\n }): Promise<BitcoinSendTransactionResponse> => {\n assertDefined(walletAccount, 'Wallet account is required');\n\n const waasTransaction: WaasBitcoinTransaction = {\n amount: transaction.amount,\n recipientAddress: transaction.recipientAddress,\n };\n\n const unsignedPsbt = await buildPsbt({\n transaction: waasTransaction,\n walletAccount,\n });\n\n const { signedPsbt } = await signPsbt({\n request: { allowedSighash: [], unsignedPsbtBase64: unsignedPsbt },\n walletAccount,\n });\n\n const psbt = Psbt.fromBase64(signedPsbt, { network: networks.bitcoin });\n\n psbt.finalizeAllInputs();\n\n const rawTx = psbt.extractTransaction().toHex();\n\n const transactionId = await broadcastTransaction(rawTx);\n\n return { transactionId };\n };\n\n return {\n ...waasProvider,\n buildPsbt,\n chain,\n executeSwapTransaction: (args) =>\n bitcoinExecuteSwapTransaction(args, sdkClient),\n getActiveNetworkId,\n getConnectedAddresses,\n groupKey: formatWalletProviderGroupKey(DYNAMIC_WAAS_METADATA.displayName),\n key,\n metadata: {\n displayName: DYNAMIC_WAAS_METADATA.displayName,\n icon: DYNAMIC_WAAS_METADATA.icon,\n },\n sendBitcoin,\n signMessage,\n signPsbt,\n signPsbts,\n switchActiveNetwork,\n transferAmount: (args) => bitcoinTransferAmount(args, sdkClient),\n walletProviderType,\n };\n};\n","import {\n WalletProviderPriority,\n getDefaultClient,\n getWalletProviderRegistry,\n hasExtension,\n registerExtension,\n} from '@dynamic-labs-sdk/client/core';\n\nimport { registerBitcoinNetworkProviderBuilder } from '../../registerBitcoinNetworkProviderBuilder';\nimport { createWalletProviderForWaasBitcoin } from '../utils/createWalletProviderForWaasBitcoin';\n\nexport const WAAS_BITCOIN_EXTENSION_KEY = 'waasBitcoin';\n\n/**\n * Adds the Dynamic WaaS (Wallet as a Service) Bitcoin extension to the Dynamic client.\n *\n * This extension enables embedded wallet functionality for Bitcoin blockchain,\n * allowing users to have wallets managed by Dynamic's infrastructure.\n *\n * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.\n * @not-instrumented\n */\nexport const addWaasBitcoinExtension = (client = getDefaultClient()): void => {\n if (hasExtension({ extensionKey: WAAS_BITCOIN_EXTENSION_KEY }, client)) {\n return;\n }\n\n registerExtension({ extensionKey: WAAS_BITCOIN_EXTENSION_KEY }, client);\n registerBitcoinNetworkProviderBuilder(client);\n\n const walletProviderRegistry = getWalletProviderRegistry(client);\n\n const walletProvider = createWalletProviderForWaasBitcoin(client);\n\n walletProviderRegistry.register({\n priority: WalletProviderPriority.WALLET_SDK,\n walletProvider,\n });\n};\n\n"],"mappings":"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"}