@babylonlabs-io/ts-sdk 3.3.0 → 4.0.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 (170) hide show
  1. package/dist/{BTCVaultRegistry.abi-BzNTa_EU.js → BTCVaultRegistry.abi-DnP4UkB5.js} +9 -140
  2. package/dist/BTCVaultRegistry.abi-DnP4UkB5.js.map +1 -0
  3. package/dist/{BTCVaultRegistry.abi-BH2-LHxN.cjs → BTCVaultRegistry.abi-DzbfZ9_s.cjs} +2 -2
  4. package/dist/BTCVaultRegistry.abi-DzbfZ9_s.cjs.map +1 -0
  5. package/dist/{PayoutManager-xEGvTbhL.js → PayoutManager-BUWP-H-q.js} +3 -3
  6. package/dist/PayoutManager-BUWP-H-q.js.map +1 -0
  7. package/dist/{PayoutManager-B1Ev0r7o.cjs → PayoutManager-Dopxq_Jv.cjs} +2 -2
  8. package/dist/PayoutManager-Dopxq_Jv.cjs.map +1 -0
  9. package/dist/PeginManager-CMbRRTnr.cjs +2 -0
  10. package/dist/{PeginManager-Co43rW_x.cjs.map → PeginManager-CMbRRTnr.cjs.map} +1 -1
  11. package/dist/{PeginManager-BJnUgW8C.js → PeginManager-Cas6_j7t.js} +118 -107
  12. package/dist/{PeginManager-BJnUgW8C.js.map → PeginManager-Cas6_j7t.js.map} +1 -1
  13. package/dist/{ProtocolParams.abi-Cv77fsUe.js → ProtocolParams.abi-CuDl7AuC.js} +3 -3
  14. package/dist/{ProtocolParams.abi-Cv77fsUe.js.map → ProtocolParams.abi-CuDl7AuC.js.map} +1 -1
  15. package/dist/{ProtocolParams.abi-BgEZaQ2I.cjs → ProtocolParams.abi-DWfIh6VH.cjs} +2 -2
  16. package/dist/{ProtocolParams.abi-BgEZaQ2I.cjs.map → ProtocolParams.abi-DWfIh6VH.cjs.map} +1 -1
  17. package/dist/VaultErrors.abi-Dc3UnB_h.js +5 -0
  18. package/dist/{VaultErrors.abi-Boz4w97c.js.map → VaultErrors.abi-Dc3UnB_h.js.map} +1 -1
  19. package/dist/VaultErrors.abi-Hjn1CdLs.cjs +2 -0
  20. package/dist/{VaultErrors.abi-DQ18kM0L.cjs.map → VaultErrors.abi-Hjn1CdLs.cjs.map} +1 -1
  21. package/dist/buildAndBroadcastReclaim-CVmG3ldA.cjs +2 -0
  22. package/dist/buildAndBroadcastReclaim-CVmG3ldA.cjs.map +1 -0
  23. package/dist/{buildAndBroadcastReclaim-CQANDXVJ.js → buildAndBroadcastReclaim-XRWuJWVL.js} +48 -50
  24. package/dist/buildAndBroadcastReclaim-XRWuJWVL.js.map +1 -0
  25. package/dist/{challengeAssert-C3eMcM5Y.cjs → challengeAssert-BE6Wm4x1.cjs} +2 -2
  26. package/dist/challengeAssert-BE6Wm4x1.cjs.map +1 -0
  27. package/dist/{challengeAssert-B2otuf7y.js → challengeAssert-DUKSjirl.js} +3 -3
  28. package/dist/challengeAssert-DUKSjirl.js.map +1 -0
  29. package/dist/constants-BCg6O0PX.cjs +2 -0
  30. package/dist/constants-BCg6O0PX.cjs.map +1 -0
  31. package/dist/constants-CmDDuM3L.js +50 -0
  32. package/dist/constants-CmDDuM3L.js.map +1 -0
  33. package/dist/{index-BRsWXDlv.js → index-B-9aXMxk.js} +6 -6
  34. package/dist/{index-BRsWXDlv.js.map → index-B-9aXMxk.js.map} +1 -1
  35. package/dist/{index-C6avwx1s.cjs → index-Dn7RlsKK.cjs} +2 -2
  36. package/dist/{index-C6avwx1s.cjs.map → index-Dn7RlsKK.cjs.map} +1 -1
  37. package/dist/index.cjs +1 -1
  38. package/dist/index.js +16 -16
  39. package/dist/pegin-registration-client-DLlaZbsZ.cjs +2 -0
  40. package/dist/pegin-registration-client-DLlaZbsZ.cjs.map +1 -0
  41. package/dist/{pegin-registration-client-Cvjk4ILq.js → pegin-registration-client-ZI0k10_3.js} +90 -96
  42. package/dist/pegin-registration-client-ZI0k10_3.js.map +1 -0
  43. package/dist/{primeVpAuth-D4UWXQ76.js → primeVpAuth-C-ET0XF4.js} +2 -2
  44. package/dist/{primeVpAuth-D4UWXQ76.js.map → primeVpAuth-C-ET0XF4.js.map} +1 -1
  45. package/dist/{primeVpAuth-CXNXYKrh.cjs → primeVpAuth-Ch-ig2My.cjs} +2 -2
  46. package/dist/{primeVpAuth-CXNXYKrh.cjs.map → primeVpAuth-Ch-ig2My.cjs.map} +1 -1
  47. package/dist/registration-records-CKc0OVuK.cjs +2 -0
  48. package/dist/registration-records-CKc0OVuK.cjs.map +1 -0
  49. package/dist/{registration-records-DJJC2NiO.js → registration-records-D39ApuHS.js} +141 -141
  50. package/dist/registration-records-D39ApuHS.js.map +1 -0
  51. package/dist/shared/index.cjs.map +1 -1
  52. package/dist/shared/index.js.map +1 -1
  53. package/dist/shared/wallets/interfaces/BitcoinWallet.d.ts +5 -0
  54. package/dist/shared/wallets/interfaces/BitcoinWallet.d.ts.map +1 -1
  55. package/dist/{signer-set-reader-GrFe_rsW.cjs → signer-set-reader-CJfV-GDz.cjs} +2 -2
  56. package/dist/{signer-set-reader-GrFe_rsW.cjs.map → signer-set-reader-CJfV-GDz.cjs.map} +1 -1
  57. package/dist/{signer-set-reader-CSUe92zE.js → signer-set-reader-DiwLeqik.js} +3 -3
  58. package/dist/{signer-set-reader-CSUe92zE.js.map → signer-set-reader-DiwLeqik.js.map} +1 -1
  59. package/dist/tbv/core/clients/eth/index.cjs +1 -1
  60. package/dist/tbv/core/clients/eth/index.js +4 -4
  61. package/dist/tbv/core/clients/eth/protocol-params-validation.d.ts.map +1 -1
  62. package/dist/tbv/core/clients/eth/registration-logs-error.d.ts +6 -6
  63. package/dist/tbv/core/clients/eth/registration-records.d.ts +1 -1
  64. package/dist/tbv/core/clients/eth/types.d.ts +12 -13
  65. package/dist/tbv/core/clients/eth/types.d.ts.map +1 -1
  66. package/dist/tbv/core/clients/eth/vault-registry-reader.d.ts +1 -1
  67. package/dist/tbv/core/clients/eth/vault-registry-reader.d.ts.map +1 -1
  68. package/dist/tbv/core/clients/index.cjs +1 -1
  69. package/dist/tbv/core/clients/index.js +6 -6
  70. package/dist/tbv/core/clients/vault-provider/status/index.cjs +1 -1
  71. package/dist/tbv/core/clients/vault-provider/status/index.js +1 -1
  72. package/dist/tbv/core/contracts/abis/BTCVaultRegistry.abi.d.ts +5 -111
  73. package/dist/tbv/core/contracts/abis/BTCVaultRegistry.abi.d.ts.map +1 -1
  74. package/dist/tbv/core/contracts/abis/ProtocolParams.abi.d.ts +2 -2
  75. package/dist/tbv/core/contracts/abis/vaultErrors.abi.json.d.ts +1 -1
  76. package/dist/tbv/core/contracts/index.cjs +1 -1
  77. package/dist/tbv/core/contracts/index.js +3 -3
  78. package/dist/tbv/core/deposit-terms/__tests__/rebuildDepositTermsCore.test.d.ts +1 -1
  79. package/dist/tbv/core/deposit-terms/commissionCeiling.d.ts +1 -1
  80. package/dist/tbv/core/deposit-terms/depositTerms.d.ts +5 -5
  81. package/dist/tbv/core/deposit-terms/rebuildDepositTermsCore.d.ts.map +1 -1
  82. package/dist/tbv/core/index.cjs +1 -1
  83. package/dist/tbv/core/index.js +16 -16
  84. package/dist/tbv/core/managers/PeginManager.d.ts +2 -1
  85. package/dist/tbv/core/managers/PeginManager.d.ts.map +1 -1
  86. package/dist/tbv/core/managers/index.cjs +1 -1
  87. package/dist/tbv/core/managers/index.js +2 -2
  88. package/dist/tbv/core/primitives/__tests__/vaultCoreVersion.test.d.ts +1 -1
  89. package/dist/tbv/core/primitives/index.cjs +1 -1
  90. package/dist/tbv/core/primitives/index.js +3 -3
  91. package/dist/tbv/core/primitives/psbt/__tests__/deriveExpectedPeginPayoutScriptPubKey.test.d.ts +1 -1
  92. package/dist/tbv/core/primitives/psbt/assertWasmPeginSizing.d.ts.map +1 -1
  93. package/dist/tbv/core/primitives/psbt/constants.d.ts +38 -13
  94. package/dist/tbv/core/primitives/psbt/constants.d.ts.map +1 -1
  95. package/dist/tbv/core/primitives/psbt/depositorClaim.d.ts +3 -6
  96. package/dist/tbv/core/primitives/psbt/depositorClaim.d.ts.map +1 -1
  97. package/dist/tbv/core/primitives/psbt/pegin.d.ts +3 -5
  98. package/dist/tbv/core/primitives/psbt/pegin.d.ts.map +1 -1
  99. package/dist/tbv/core/recovery/peginParamsCandidates.d.ts +1 -1
  100. package/dist/tbv/core/recovery/reconstructPeginParams.d.ts.map +1 -1
  101. package/dist/tbv/core/services/delegated-claim/__tests__/realWasmWatchtowerArtifacts.test.d.ts +2 -2
  102. package/dist/tbv/core/services/delegated-claim/assembleWatchtowerArtifacts.d.ts +2 -1
  103. package/dist/tbv/core/services/delegated-claim/assembleWatchtowerArtifacts.d.ts.map +1 -1
  104. package/dist/tbv/core/services/delegated-claim/deriveClaimerWotsKeypair.d.ts +1 -1
  105. package/dist/tbv/core/services/delegated-claim/deriveClaimerWotsKeypair.d.ts.map +1 -1
  106. package/dist/tbv/core/services/delegated-claim/planDelegatedClaimSigning.d.ts +2 -1
  107. package/dist/tbv/core/services/delegated-claim/planDelegatedClaimSigning.d.ts.map +1 -1
  108. package/dist/tbv/core/services/delegated-claim/readDelegatedClaimVaultContext.d.ts +1 -1
  109. package/dist/tbv/core/services/delegated-claim/readDelegatedClaimVaultContext.d.ts.map +1 -1
  110. package/dist/tbv/core/services/delegated-claim/readWatchtowerArtifacts.d.ts +3 -3
  111. package/dist/tbv/core/services/delegated-claim/readWatchtowerArtifacts.d.ts.map +1 -1
  112. package/dist/tbv/core/services/delegated-claim/types.d.ts +5 -6
  113. package/dist/tbv/core/services/delegated-claim/types.d.ts.map +1 -1
  114. package/dist/tbv/core/services/deposit/__tests__/signDepositorGraph.realGraph.test.d.ts +3 -3
  115. package/dist/tbv/core/services/deposit/signDepositorGraph.d.ts.map +1 -1
  116. package/dist/tbv/core/services/index.cjs +1 -1
  117. package/dist/tbv/core/services/index.js +2 -2
  118. package/dist/tbv/core/wasm/index.cjs.map +1 -1
  119. package/dist/tbv/core/wasm/index.d.ts +8 -11
  120. package/dist/tbv/core/wasm/index.d.ts.map +1 -1
  121. package/dist/tbv/core/wasm/index.js.map +1 -1
  122. package/dist/tbv/index.cjs +1 -1
  123. package/dist/tbv/index.js +16 -16
  124. package/dist/toRefundInputs-BSQjDOK9.cjs +2 -0
  125. package/dist/toRefundInputs-BSQjDOK9.cjs.map +1 -0
  126. package/dist/{toRefundInputs-Dzw1cteD.js → toRefundInputs-BbbvPb2A.js} +175 -173
  127. package/dist/toRefundInputs-BbbvPb2A.js.map +1 -0
  128. package/dist/{types-BC2TGzcp.cjs → types-BnZIbDHb.cjs} +2 -2
  129. package/dist/types-BnZIbDHb.cjs.map +1 -0
  130. package/dist/{types-24A9Qoxb.js → types-K_aM5GZO.js} +39 -39
  131. package/dist/types-K_aM5GZO.js.map +1 -0
  132. package/dist/{verifyKeyPathSchnorrSignature-IIj3Z2se.js → verifyKeyPathSchnorrSignature-DPXOFOol.js} +2 -2
  133. package/dist/{verifyKeyPathSchnorrSignature-IIj3Z2se.js.map → verifyKeyPathSchnorrSignature-DPXOFOol.js.map} +1 -1
  134. package/dist/{verifyKeyPathSchnorrSignature-BRTpEH9X.cjs → verifyKeyPathSchnorrSignature-DcxCojp0.cjs} +2 -2
  135. package/dist/{verifyKeyPathSchnorrSignature-BRTpEH9X.cjs.map → verifyKeyPathSchnorrSignature-DcxCojp0.cjs.map} +1 -1
  136. package/dist/verifyScriptPathSchnorrSignature-CgDa9Rcg.cjs +2 -0
  137. package/dist/verifyScriptPathSchnorrSignature-CgDa9Rcg.cjs.map +1 -0
  138. package/dist/{verifyScriptPathSchnorrSignature-owu3BfyT.js → verifyScriptPathSchnorrSignature-D-fdi-sG.js} +462 -459
  139. package/dist/verifyScriptPathSchnorrSignature-D-fdi-sG.js.map +1 -0
  140. package/package.json +3 -3
  141. package/dist/BTCVaultRegistry.abi-BH2-LHxN.cjs.map +0 -1
  142. package/dist/BTCVaultRegistry.abi-BzNTa_EU.js.map +0 -1
  143. package/dist/PayoutManager-B1Ev0r7o.cjs.map +0 -1
  144. package/dist/PayoutManager-xEGvTbhL.js.map +0 -1
  145. package/dist/PeginManager-Co43rW_x.cjs +0 -2
  146. package/dist/VaultErrors.abi-Boz4w97c.js +0 -5
  147. package/dist/VaultErrors.abi-DQ18kM0L.cjs +0 -2
  148. package/dist/buildAndBroadcastReclaim-CQANDXVJ.js.map +0 -1
  149. package/dist/buildAndBroadcastReclaim-DPk36Uhp.cjs +0 -2
  150. package/dist/buildAndBroadcastReclaim-DPk36Uhp.cjs.map +0 -1
  151. package/dist/challengeAssert-B2otuf7y.js.map +0 -1
  152. package/dist/challengeAssert-C3eMcM5Y.cjs.map +0 -1
  153. package/dist/constants-CAm10Qwp.cjs +0 -2
  154. package/dist/constants-CAm10Qwp.cjs.map +0 -1
  155. package/dist/constants-CvQZuxKv.js +0 -48
  156. package/dist/constants-CvQZuxKv.js.map +0 -1
  157. package/dist/pegin-registration-client-CdRyXP3j.cjs +0 -2
  158. package/dist/pegin-registration-client-CdRyXP3j.cjs.map +0 -1
  159. package/dist/pegin-registration-client-Cvjk4ILq.js.map +0 -1
  160. package/dist/registration-records-DJJC2NiO.js.map +0 -1
  161. package/dist/registration-records-XQMIKjGV.cjs +0 -2
  162. package/dist/registration-records-XQMIKjGV.cjs.map +0 -1
  163. package/dist/toRefundInputs-DTuWi--u.cjs +0 -2
  164. package/dist/toRefundInputs-DTuWi--u.cjs.map +0 -1
  165. package/dist/toRefundInputs-Dzw1cteD.js.map +0 -1
  166. package/dist/types-24A9Qoxb.js.map +0 -1
  167. package/dist/types-BC2TGzcp.cjs.map +0 -1
  168. package/dist/verifyScriptPathSchnorrSignature-CahYx5Td.cjs +0 -2
  169. package/dist/verifyScriptPathSchnorrSignature-CahYx5Td.cjs.map +0 -1
  170. package/dist/verifyScriptPathSchnorrSignature-owu3BfyT.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pegin-registration-client-DLlaZbsZ.cjs","sources":["../src/tbv/core/deposit-terms/commissionCeiling.ts","../src/tbv/core/clients/eth/vault-registry-reader.ts","../src/tbv/core/clients/eth/pegin-registration-client.ts"],"sourcesContent":["/**\n * The depositor's commission ceiling (`maxAcceptableCommissionBps`) policy:\n * quoted VP commission + drift headroom, capped below the contract's\n * exclusive bound. Shared by `PeginManager` (the approved terms) and the\n * registration calldata so both carry the same ceiling; a resume rebuild reads\n * that submitted value back from the `PegInSubmitted` log instead.\n *\n * @module deposit-terms/commissionCeiling\n */\n\n/*\n * Commission-check map (each guards a DIFFERENT boundary — do not consolidate):\n * 1. assertVpCommissionInProtocolRange (vault app, vaultPayoutSignatureService)\n * — chain-read trust boundary; mirrors VPKeyRegistryLogic.sol bounds.\n * 2. capMaxAcceptableCommissionBps (here) — depositor quote → ceiling policy;\n * mirrors PeginLogic.sol's strict > check via the +25bps headroom.\n * 3. buildDepositTerms range check — public-API precondition on the projection\n * that mints the device-enforced commissionFee.\n * 4. payout.ts commission cap — the VP-built tx's output value vs bps at the\n * signing site (CLAUDE.md Critical Path #3).\n * 5. envelope.ts dust/cross-field gates (ledger-vault-signer) — firmware-only\n * constants, pre-device-I/O (Critical Path #7).\n */\n\nimport { MAX_VP_COMMISSION_BPS_EXCLUSIVE } from \"../primitives/psbt/constants\";\n\n/**\n * Headroom (in basis points) added to the current VP commission to compute\n * `maxAcceptableCommissionBps` at submit time. Lets the VP raise its\n * commission by up to this amount between read and submit without forcing\n * a re-quote. Capped by {@link MAX_ACCEPTABLE_COMMISSION_BPS_CAP}.\n *\n * Contract check is strict `>` (PeginLogic.sol `VaultProviderCommissionExceeded`\n * revert), so +25 allows up\n * to +25 bps of drift.\n */\nexport const COMMISSION_BPS_HEADROOM = 25;\n\n/**\n * Hard ceiling for `maxAcceptableCommissionBps`. The contract enforces\n * `commissionBps < 10000`, so any value at/above that is unreachable;\n * `9999` is the maximum useful cap.\n */\nexport const MAX_ACCEPTABLE_COMMISSION_BPS_CAP = 9999;\n\n/**\n * The commission ceiling submitted as registration calldata and mirrored\n * into `DepositTerms.commissionFee`: quoted + drift headroom, capped.\n * Single source for both consumers — feed it the SAME quoted bps at prepare\n * and register time so device-accept stays coextensive with contract-accept.\n */\nexport function capMaxAcceptableCommissionBps(bps: number): number {\n // Validate the raw quote before headroom shifts its domain — a negative\n // quote must throw here, not become a small \"legal\" ceiling.\n // Reject an out-of-range quote outright — clamping it to 9999 would turn a\n // bad read into a 99.99% ceiling, the exact failure the cap exists to stop.\n if (\n !Number.isInteger(bps) ||\n bps < 0 ||\n bps >= MAX_VP_COMMISSION_BPS_EXCLUSIVE\n ) {\n throw new Error(\n `Quoted commissionBps must be an integer in ` +\n `[0, ${MAX_VP_COMMISSION_BPS_EXCLUSIVE}), got ${bps}`,\n );\n }\n return Math.min(\n bps + COMMISSION_BPS_HEADROOM,\n MAX_ACCEPTABLE_COMMISSION_BPS_CAP,\n );\n}\n","/**\n * Concrete BTCVaultRegistry reader using viem's readContract.\n *\n * This is an optional utility — callers can use their own implementation\n * of the VaultRegistryReader interface.\n */\n\nimport type { Abi, Address, Hex, PublicClient } from \"viem\";\nimport { getAbiItem } from \"viem\";\n\nimport { BTCVaultRegistryABI } from \"../../contracts/abis/BTCVaultRegistry.abi\";\nimport { BTCVaultRegistryKeyEpochsABI } from \"../../contracts/abis/BTCVaultRegistryKeyEpochs.abi\";\nimport { VaultClaimableByNotFoundError } from \"./claimable-event-error\";\nimport { assertOnChainBtcPubkey } from \"./onChainBtcPubkey\";\nimport { assertValidOffchainParamsVersion } from \"./protocol-params-validation\";\nimport { RegistrationLogsUnavailableError } from \"./registration-logs-error\";\nimport { findRegistrationRecord } from \"./registration-records\";\nimport type {\n KeyEpochs,\n OnChainBtcPubkey,\n PeginRegistrationRecord,\n VaultBasicInfo,\n VaultClaimableByEvent,\n VaultData,\n VaultProtocolInfo,\n VaultRegistryReader,\n} from \"./types\";\n\n/**\n * Inclusive upper bound the BTCVaultRegistry contract enforces on a vault\n * provider's commission (the contract check is `< 10000`).\n */\nconst MAX_VP_COMMISSION_BPS = 9999;\n\n/** Raw `getBtcVaultBasicInfo` tuple as decoded by viem. */\ntype RawVaultBasicInfo = {\n depositor: Address;\n depositorBtcPubKey: Hex;\n amount: bigint;\n vaultProvider: Address;\n status: number;\n applicationEntryPoint: Address;\n createdAt: bigint;\n};\n\n/**\n * Raw `getBtcVaultProtocolInfo` tuple as decoded by viem.\n *\n * Mirrors the ABI's components. The trailing key epochs are read through the\n * separate key-epochs ABI, so this prefix stops at `vaultCoreVersion`.\n */\ntype RawVaultProtocolInfo = {\n depositorSignedPeginTx: Hex;\n universalChallengersVersion: number;\n appVaultKeepersVersion: number;\n offchainParamsVersion: number;\n verifiedAt: bigint;\n depositorWotsPkHash: Hex;\n hashlock: Hex;\n htlcVout: number;\n depositorPopSignature: Hex;\n prePeginTxHash: Hex;\n vaultProviderCommissionBps: number;\n claimExpiredUntil: bigint;\n vaultCoreVersion: number;\n};\n\nfunction mapVaultBasicInfo(result: RawVaultBasicInfo): VaultBasicInfo {\n return {\n depositor: result.depositor,\n depositorBtcPubKey: result.depositorBtcPubKey,\n amount: result.amount,\n vaultProvider: result.vaultProvider,\n status: result.status,\n applicationEntryPoint: result.applicationEntryPoint,\n createdAt: result.createdAt,\n };\n}\n\nfunction mapVaultProtocolInfo(result: RawVaultProtocolInfo): VaultProtocolInfo {\n const offchainParamsVersion = Number(result.offchainParamsVersion);\n assertValidOffchainParamsVersion(offchainParamsVersion);\n return {\n depositorSignedPeginTx: result.depositorSignedPeginTx,\n universalChallengersVersion: result.universalChallengersVersion,\n appVaultKeepersVersion: result.appVaultKeepersVersion,\n offchainParamsVersion,\n verifiedAt: result.verifiedAt,\n depositorWotsPkHash: result.depositorWotsPkHash,\n hashlock: result.hashlock,\n htlcVout: result.htlcVout,\n depositorPopSignature: result.depositorPopSignature,\n prePeginTxHash: result.prePeginTxHash,\n vaultProviderCommissionBps: result.vaultProviderCommissionBps,\n claimExpiredUntil: result.claimExpiredUntil,\n vaultCoreVersion: result.vaultCoreVersion,\n };\n}\n\n/**\n * Exclusive upper bound for a `uint64` epoch.\n *\n * viem does not range-check a decoded `uint64`, so a misaligned decode can\n * hand back a value far larger than the field can hold. Rejecting those is\n * cheap defence in depth against a mis-decode of the extended ABI.\n *\n * The state this is load-bearing for is narrower than \"a registry that predates\n * RFC-006\". Against a *fully* pre-RFC-006 registry the path fails closed on its\n * own: `resolveParticipantKeysAtEpochs` goes on to call\n * `getOperationBtcKeyAtEpochOrGenesis` on ApplicationRegistry and\n * ProtocolParams, which do not exist there, so the multicall reverts and these\n * epochs are never used. The reachable gap is a registry that *has* the\n * operation-key getters but whose `BTCVaultProtocolInfo` struct is not\n * extended — there the tail-data epochs resolve with no error at all, and this\n * range check is the only thing looking at them.\n *\n * Even for that case it is only a backstop, and a weak one: a misaligned decode\n * can land on a small, plausible-looking integer this range accepts. Correctness\n * rests on only ever pointing at an RFC-006 registry, which is a deployment\n * precondition rather than something this call can establish — see\n * https://github.com/babylonlabs-io/babylon-toolkit/issues/2192 for where that\n * check is owned, and `BTCVaultRegistryKeyEpochs.abi.ts` for the decode hazard.\n */\nconst UINT64_EXCLUSIVE_UPPER_BOUND = 1n << 64n;\n\n/**\n * The epoch a vault provider's registration key is bonded at.\n *\n * A provider's operation-key history is append-only and every appended version\n * is stamped at epoch 1 or later, so epoch 0 always resolves to the key set at\n * registration. This is what lets `getOperationBtcKeyAtEpoch` stand in for the\n * removed `getVaultProviderBTCKey` getter.\n */\nconst VP_GENESIS_KEY_EPOCH = 0n;\n\nconst PEGIN_SUBMITTED_EVENT = getAbiItem({\n abi: BTCVaultRegistryABI,\n name: \"PegInSubmitted\",\n});\n\nconst VAULT_CLAIMABLE_BY_EVENT = getAbiItem({\n abi: BTCVaultRegistryABI,\n name: \"VaultClaimableBy\",\n});\n\n/**\n * Block span of one `VaultClaimableBy` query: btc-vault's own scan chunk\n * (`EVENT_QUERY_CHUNK_BLOCKS = 7200`, `crates/eth-client/src/client.rs:793`\n * @ ac4954e7), about a day of Ethereum blocks, so a recent redeem costs one\n * request. Not every provider serves a range this wide — an Alchemy free key\n * caps `eth_getLogs` at 10 blocks\n * (https://www.alchemy.com/docs/reference/eth-getlogs) — and a provider that\n * answered a wide range short instead of erroring would make this scan report\n * not-found, so confirming the RPC honours 7,200-block ranges is a\n * prerequisite of a claim run.\n */\nconst VAULT_CLAIMABLE_BY_QUERY_CHUNK_BLOCKS = 7_200n;\n\nfunction maxBigint(a: bigint, b: bigint): bigint {\n return a > b ? a : b;\n}\n\n/** A `PegInSubmitted` log's decoded args, as viem's strict `getLogs` hands them back. */\ninterface PegInSubmittedArgs {\n vaultId: Hex;\n peginTxHash: Hex;\n depositor: Address;\n vaultProvider: Address;\n amount: bigint;\n vaultCoreVersion: number;\n universalChallengersVersion: number;\n appVaultKeepersVersion: number;\n proverCircuitVersion: number;\n offchainParamsVersion: number;\n depositorPayoutBtcAddress: Hex;\n depositorWotsPkHash: Hex;\n hashlock: Hex;\n htlcVout: number;\n unsignedPrePeginTx: Hex;\n maxAcceptableCommissionBps: number;\n}\n\nfunction mapRegistrationRecord(\n args: PegInSubmittedArgs,\n blockNumber: bigint,\n): PeginRegistrationRecord {\n // A plain decode of every registration log in the block, strangers'\n // included: nothing here parses a transaction or bound-checks a script, so\n // one malformed registration elsewhere in the block cannot fail the\n // caller's read. The strict per-record checks live in\n // registration-records.ts. A duplicate vault id is not covered: a vault\n // registers once, so two logs for one id are an inconsistent node and fail\n // the read closed (see the caller).\n return {\n vaultId: args.vaultId.toLowerCase() as Hex,\n depositor: args.depositor,\n vaultProvider: args.vaultProvider,\n amount: args.amount,\n vaultCoreVersion: args.vaultCoreVersion,\n universalChallengersVersion: args.universalChallengersVersion,\n appVaultKeepersVersion: args.appVaultKeepersVersion,\n proverCircuitVersion: args.proverCircuitVersion,\n offchainParamsVersion: args.offchainParamsVersion,\n peginTxHash: args.peginTxHash.toLowerCase() as Hex,\n depositorPayoutScriptPubKey:\n args.depositorPayoutBtcAddress.toLowerCase() as Hex,\n unsignedPrePeginTx: args.unsignedPrePeginTx,\n maxAcceptableCommissionBps: args.maxAcceptableCommissionBps,\n blockNumber,\n };\n}\n\nfunction assertEpochInRange(\n value: bigint,\n field: string,\n vaultId: Hex,\n): bigint {\n if (value < 0n || value >= UINT64_EXCLUSIVE_UPPER_BOUND) {\n throw new Error(\n `getBtcVaultProtocolInfo returned ${field}=${value} for vault ${vaultId}, ` +\n `outside the uint64 range — the registry may predate RFC-006`,\n );\n }\n return value;\n}\n\nfunction mapKeyEpochs(result: KeyEpochs, vaultId: Hex): KeyEpochs {\n return {\n vpKeyEpoch: assertEpochInRange(result.vpKeyEpoch, \"vpKeyEpoch\", vaultId),\n appKeeperKeyEpoch: assertEpochInRange(\n result.appKeeperKeyEpoch,\n \"appKeeperKeyEpoch\",\n vaultId,\n ),\n ucKeyEpoch: assertEpochInRange(result.ucKeyEpoch, \"ucKeyEpoch\", vaultId),\n };\n}\n\n/**\n * Concrete vault registry reader using viem.\n *\n * Usage:\n * ```ts\n * const reader = new ViemVaultRegistryReader(publicClient, registryAddress);\n * const data = await reader.getVaultData(vaultId);\n * ```\n */\nexport class ViemVaultRegistryReader implements VaultRegistryReader {\n constructor(\n private publicClient: PublicClient,\n private contractAddress: Address,\n ) {}\n\n /**\n * Read the VP's **genesis** (registration) x-only BTC pubkey — the key bonded\n * at version 0, which never moves when the operator rotates.\n *\n * Resolved as \"the operation key at epoch 0\" rather than through the\n * dedicated `getVaultProviderBTCKey` getter, which\n * https://github.com/babylonlabs-io/vault-contracts-aave-v4/pull/539 removes.\n * Epoch 0 predates any rotation — appended versions are stamped at epoch 1 or\n * later — so it resolves to the registration key, and the contracts team has\n * confirmed that is a property we can rely on rather than an implementation\n * detail. The devnet comparison behind that claim — both getters returning the\n * identical key for a provider that *has* rotated, while\n * `getCurrentOperationBtcKey` differed — is recorded in\n * https://github.com/babylonlabs-io/babylon-toolkit/issues/2188.\n *\n * This makes the read RFC-006-only, where the removed getter also existed on a\n * legacy registry. That costs nothing: every caller of this method already\n * resolves participant keys through `OperationKeyReader`, so all of them\n * require an RFC-006 registry regardless.\n *\n * Validates length, hex form, and secp256k1 curve membership before minting\n * the brand. Returns 64-char lowercase hex without the `0x` prefix.\n */\n async getVaultProviderGenesisBtcPubKey(\n vpAddress: Address,\n blockNumber?: bigint,\n ): Promise<OnChainBtcPubkey> {\n return this.getVaultProviderOperationBtcKeyAtEpoch(\n vpAddress,\n VP_GENESIS_KEY_EPOCH,\n blockNumber,\n );\n }\n\n /**\n * Read the VP operation key selected by `epoch`.\n *\n * This is public rather than hidden inside `OperationKeyReader` because\n * subject-specific VP authentication needs exactly one participant: the\n * gRPC bootstrap is signed by the key frozen into the vault, while the\n * JSON-RPC bootstrap is signed by the provider's live key.\n */\n async getVaultProviderOperationBtcKeyAtEpoch(\n vpAddress: Address,\n epoch: bigint,\n blockNumber?: bigint,\n ): Promise<OnChainBtcPubkey> {\n const result = (await this.publicClient.readContract({\n address: this.contractAddress,\n abi: BTCVaultRegistryABI,\n functionName: \"getOperationBtcKeyAtEpoch\",\n args: [vpAddress, epoch],\n blockNumber,\n })) as Hex;\n return assertOnChainBtcPubkey(\n result,\n `getOperationBtcKeyAtEpoch (vp=${vpAddress}, epoch=${epoch})`,\n );\n }\n\n /**\n * Read the application entry point a vault provider is registered for.\n *\n * This is the registry's own `vaultProviders[vp].applicationEntryPoint`, and\n * it is the value the peg-in submit path resolves internally — it selects\n * which application's vault-keeper roster, roster version and keeper key\n * epoch a deposit is bonded to. The dApp separately carries an entry point\n * from its own configuration; the two agree today, but they are different\n * sources of truth, so the build path reads this one and asserts the\n * configured value matches it rather than trusting either alone.\n */\n async getVaultProviderApplication(\n vpAddress: Address,\n blockNumber?: bigint,\n ): Promise<Address> {\n return (await this.publicClient.readContract({\n address: this.contractAddress,\n abi: BTCVaultRegistryABI,\n functionName: \"getVaultProviderApplication\",\n args: [vpAddress],\n blockNumber,\n })) as Address;\n }\n\n /**\n * Read a vault provider's *current* RFC-006 operation BTC key.\n *\n * Falls back on-chain to the registration key when the provider has never\n * rotated, so this returns the same value as\n * `getVaultProviderGenesisBtcPubKey` until the first rotation.\n *\n * This is the key the VP's server uses for JSON-RPC-subject authentication.\n * The gRPC-subject bootstrap is instead bound to the existing vault's frozen\n * epoch and resolves through `getVaultProviderOperationBtcKeyAtEpoch`.\n */\n async getCurrentVaultProviderOperationBtcKey(\n vpAddress: Address,\n ): Promise<OnChainBtcPubkey> {\n const result = (await this.publicClient.readContract({\n address: this.contractAddress,\n abi: BTCVaultRegistryABI,\n functionName: \"getCurrentOperationBtcKey\",\n args: [vpAddress],\n })) as Hex;\n return assertOnChainBtcPubkey(\n result,\n `getCurrentOperationBtcKey (vp=${vpAddress})`,\n );\n }\n\n /**\n * Read a vault's frozen RFC-006 operation-key epochs.\n *\n * Reads `getBtcVaultProtocolInfo` through the **extended** ABI, which is only\n * valid against an RFC-006 registry: against one whose `BTCVaultProtocolInfo`\n * struct is not extended this call does not fail for a populated vault, it\n * silently returns three words of tail data as epochs. Nothing here can detect\n * that, so the guarantee is a deployment one — every network this ships to has\n * the RFC-006 getters, and mainnet is a fresh RFC-006 deploy.\n *\n * A registry missing the operation-key getters entirely is the *safer* of the\n * two cases: `resolveParticipantKeysAtEpochs` reverts downstream and these\n * epochs never reach key resolution. See {@link UINT64_EXCLUSIVE_UPPER_BOUND}\n * for which state the range check actually guards, and\n * `BTCVaultRegistryKeyEpochs.abi.ts` for the decode hazard.\n */\n async getVaultKeyEpochs(vaultId: Hex): Promise<KeyEpochs> {\n const result = (await this.publicClient.readContract({\n address: this.contractAddress,\n abi: BTCVaultRegistryKeyEpochsABI,\n functionName: \"getBtcVaultProtocolInfo\",\n args: [vaultId],\n })) as unknown as KeyEpochs;\n\n return mapKeyEpochs(result, vaultId);\n }\n\n async getVaultKeyEpochsBatch(vaultIds: readonly Hex[]): Promise<KeyEpochs[]> {\n if (vaultIds.length === 0) return [];\n\n const results = await this.publicClient.multicall({\n contracts: vaultIds.map((vaultId) => ({\n address: this.contractAddress,\n abi: BTCVaultRegistryKeyEpochsABI as Abi,\n functionName: \"getBtcVaultProtocolInfo\" as const,\n args: [vaultId] as const,\n })),\n allowFailure: false,\n });\n\n return results.map((info, i) =>\n mapKeyEpochs(info as unknown as KeyEpochs, vaultIds[i]),\n );\n }\n\n async getVaultBasicInfo(vaultId: Hex): Promise<VaultBasicInfo> {\n const result = (await this.publicClient.readContract({\n address: this.contractAddress,\n abi: BTCVaultRegistryABI,\n functionName: \"getBtcVaultBasicInfo\",\n args: [vaultId],\n })) as RawVaultBasicInfo;\n\n return mapVaultBasicInfo(result);\n }\n\n async getVaultProtocolInfo(vaultId: Hex): Promise<VaultProtocolInfo> {\n const result = (await this.publicClient.readContract({\n address: this.contractAddress,\n abi: BTCVaultRegistryABI,\n functionName: \"getBtcVaultProtocolInfo\",\n args: [vaultId],\n })) as RawVaultProtocolInfo;\n\n return mapVaultProtocolInfo(result);\n }\n\n async getProtocolInfoBatch(\n vaultIds: readonly Hex[],\n ): Promise<VaultProtocolInfo[]> {\n if (vaultIds.length === 0) return [];\n\n const results = await this.publicClient.multicall({\n contracts: vaultIds.map((vaultId) => ({\n address: this.contractAddress,\n abi: BTCVaultRegistryABI as Abi,\n functionName: \"getBtcVaultProtocolInfo\" as const,\n args: [vaultId] as const,\n })),\n allowFailure: false,\n });\n\n return results.map((info, i) => {\n const result = info as unknown as RawVaultProtocolInfo;\n if (\n !result.depositorSignedPeginTx ||\n result.depositorSignedPeginTx === \"0x\"\n ) {\n // An empty record is not proof the vault is absent: a lagging RPC\n // node returns HTTP 200 with a zero struct, so no retry below this\n // layer can see it. Single-shot is only safe because the finality\n // gate (`waitForPeginRegistrationDepth`) runs first on the deposit\n // path — move this ahead of it and the read-after-write race returns.\n // The vault app matches this message to render \"still confirming\".\n throw new Error(\n `Vault ${vaultIds[i]} not found on-chain or has no pegin transaction`,\n );\n }\n return mapVaultProtocolInfo(result);\n });\n }\n\n /**\n * Read the protocol pegin fee (in wei) for a given vault provider.\n * Mirrors the `getPegInFee(address)` view on BTCVaultRegistry.\n */\n async getPegInFee(vaultProvider: Address): Promise<bigint> {\n return (await this.publicClient.readContract({\n address: this.contractAddress,\n abi: BTCVaultRegistryABI,\n functionName: \"getPegInFee\",\n args: [vaultProvider],\n })) as bigint;\n }\n\n /**\n * Read a vault provider's current commission in basis points from\n * BTCVaultRegistry. The contract enforces `commissionBps < 10000`, so the\n * legitimate range is `[0, 9999]`; anything outside indicates a wrong\n * contract address or ABI drift and is surfaced as an error rather than\n * trusted.\n */\n async getVaultProviderCommission(vaultProvider: Address): Promise<number> {\n // viem infers `number` from the `uint16` return in the `as const` ABI.\n const bps = await this.publicClient.readContract({\n address: this.contractAddress,\n abi: BTCVaultRegistryABI,\n functionName: \"getVaultProviderCommission\",\n args: [vaultProvider],\n });\n\n if (!Number.isInteger(bps) || bps < 0 || bps > MAX_VP_COMMISSION_BPS) {\n throw new Error(\n `getVaultProviderCommission returned ${bps} bps for ${vaultProvider}, ` +\n `outside the protocol range [0, ${MAX_VP_COMMISSION_BPS}]`,\n );\n }\n\n return bps;\n }\n\n async getVaultData(vaultId: Hex): Promise<VaultData> {\n // One round-trip for both structs (hard-fail): they feed signing/refund/\n // broadcast rebinds, so reading them in a single multicall also pins both\n // to the same block — no basic/protocol skew across two `eth_call`s.\n const [basicRaw, protocolRaw] = await this.publicClient.multicall({\n contracts: [\n {\n address: this.contractAddress,\n abi: BTCVaultRegistryABI,\n functionName: \"getBtcVaultBasicInfo\",\n args: [vaultId],\n },\n {\n address: this.contractAddress,\n abi: BTCVaultRegistryABI,\n functionName: \"getBtcVaultProtocolInfo\",\n args: [vaultId],\n },\n ],\n allowFailure: false,\n });\n\n const basic = mapVaultBasicInfo(basicRaw);\n const protocol = mapVaultProtocolInfo(protocolRaw);\n\n if (\n !protocol.depositorSignedPeginTx ||\n protocol.depositorSignedPeginTx === \"0x\"\n ) {\n throw new Error(\n `Vault ${vaultId} not found on-chain or has no pegin transaction`,\n );\n }\n\n return { basic, protocol };\n }\n\n /** @inheritdoc */\n async getRegistrationRecordsAtBlock(\n createdAt: bigint,\n ): Promise<PeginRegistrationRecord[]> {\n // Deliberately no `vaultId` topic filter: the block holds the target's\n // registration, so only an unfiltered answer can tell a node that served\n // nothing (empty) from one that lacks the target (findRegistrationRecord),\n // and one query serves every vault a caller reads from the block. strict:\n // a log whose data does not decode against the ABI is dropped (viem\n // parseEventLogs) instead of surfacing as `args: {}`.\n const logs = await this.publicClient.getLogs({\n address: this.contractAddress,\n event: PEGIN_SUBMITTED_EVENT,\n fromBlock: createdAt,\n toBlock: createdAt,\n strict: true,\n });\n if (logs.length === 0) {\n throw new RegistrationLogsUnavailableError(createdAt);\n }\n\n const records = new Map<string, PeginRegistrationRecord>();\n for (const log of logs) {\n const record = mapRegistrationRecord(log.args, log.blockNumber);\n // Lenient decoding covers a malformed log, not a duplicate: a vault\n // registers once, so two logs for any id mean the node is inconsistent\n // and every record from this block is suspect — fail closed by design.\n if (records.has(record.vaultId)) {\n throw new Error(\n `Expected one PegInSubmitted log for vault ${record.vaultId} at block ${createdAt}, ` +\n `found more than one`,\n );\n }\n records.set(record.vaultId, record);\n }\n return [...records.values()];\n }\n\n /**\n * Read the depositor's commission ceiling (`maxAcceptableCommissionBps`)\n * for vaults registered in the same block, from their `PegInSubmitted`\n * logs. Returned in `vaultIds` order.\n *\n * The contract bound-checks the ceiling and discards it (PeginLogic.sol,\n * `VaultProviderCommissionExceeded`), so the registration log is its only\n * on-chain source. Vault ids are matched case-insensitively.\n *\n * @throws As {@link getRegistrationRecordsAtBlock}, plus the same typed\n * transient error when a vault has no registration log in its own\n * `createdAt` block.\n */\n async getMaxAcceptableCommissionBpsBatch(\n vaultIds: readonly Hex[],\n createdAt: bigint,\n ): Promise<number[]> {\n if (vaultIds.length === 0) return [];\n\n const records = await this.getRegistrationRecordsAtBlock(createdAt);\n return vaultIds.map(\n (vaultId) =>\n findRegistrationRecord(records, vaultId, createdAt)\n .maxAcceptableCommissionBps,\n );\n }\n\n /** @inheritdoc */\n async getVaultClaimableBy(\n vaultId: Hex,\n claimerPk: Hex,\n createdAt: bigint,\n ): Promise<VaultClaimableByEvent> {\n const claimer = assertOnChainBtcPubkey(\n claimerPk,\n `getVaultClaimableBy claimer (vault=${vaultId})`,\n );\n const claimerTopic = `0x${claimer}` as Hex;\n // viem re-filters the decoded logs client-side against `args`, comparing a\n // bytes32 with `===` against lower-case hex (parseEventLogs.ts:140,172-188).\n const vaultIdTopic = vaultId.toLowerCase() as Hex;\n // Finalized, not latest: the block found here is what the prover proves\n // against, and an unfinalized redeem can reorg away (btc-vault binds the\n // same scan to its finality level, eth-client client.rs:5989-6040).\n const { number: finalized } = await this.publicClient.getBlock({\n blockTag: \"finalized\",\n });\n if (finalized < createdAt) {\n throw new Error(\n `Finalized block ${finalized} is below vault ${vaultId}'s registration block ${createdAt}; ` +\n `the registration is not finalized yet, or the node is behind it`,\n );\n }\n\n // Newest first: the redeem usually trails the tip by far less than it\n // trails the registration. The contract emits every VaultClaimableBy of a\n // vault in one transaction, so the first non-empty chunk is the answer.\n let toBlock = finalized;\n for (;;) {\n const fromBlock = maxBigint(\n createdAt,\n toBlock - VAULT_CLAIMABLE_BY_QUERY_CHUNK_BLOCKS + 1n,\n );\n const logs = await this.publicClient.getLogs({\n address: this.contractAddress,\n event: VAULT_CLAIMABLE_BY_EVENT,\n args: { vaultId: vaultIdTopic, claimerPK: claimerTopic },\n fromBlock,\n toBlock,\n strict: true,\n });\n // A redeem emits every VaultClaimableBy of a vault in ONE transaction\n // (RedeemLogic.sol), and `redeemForDepositor` emits the VP's key and\n // then the depositor's — so when those two keys are equal this filter\n // legitimately matches twice. Identical authorizations from one\n // transaction are the same fact; logs spanning transactions are not.\n if (logs.length > 1) {\n const transactions = new Set(logs.map((log) => log.transactionHash));\n if (transactions.size > 1) {\n throw new Error(\n `Found ${logs.length} VaultClaimableBy logs for vault ${vaultId} and claimer ` +\n `${claimerTopic} across ${transactions.size} transactions in blocks ` +\n `${fromBlock}..${toBlock}; a vault is redeemed once, so the node's answer ` +\n `is inconsistent`,\n );\n }\n }\n if (logs.length >= 1) {\n const log = logs[0];\n return {\n blockNumber: log.blockNumber,\n claimerPk: assertOnChainBtcPubkey(\n log.args.claimerPK,\n `VaultClaimableBy.claimerPK (vault=${vaultId})`,\n ),\n peginTxHash: log.args.peginTxHash,\n vaultCoreVersion: log.args.vaultCoreVersion,\n proverCircuitVersion: log.args.proverCircuitVersion,\n offchainParamsVersion: log.args.offchainParamsVersion,\n universalChallengersVersion: log.args.universalChallengersVersion,\n appVaultKeepersVersion: log.args.appVaultKeepersVersion,\n };\n }\n if (fromBlock === createdAt) {\n throw new VaultClaimableByNotFoundError(\n vaultId,\n claimerTopic,\n createdAt,\n finalized,\n );\n }\n toBlock = fromBlock - 1n;\n }\n }\n}\n","import {\n encodeFunctionData,\n isAddressEqual,\n zeroAddress,\n type Address,\n type Chain,\n type Hex,\n type PublicClient,\n type WalletClient,\n} from \"viem\";\n\nimport { BTCVaultRegistryABI } from \"../../contracts/abis/BTCVaultRegistry.abi\";\nimport { handleContractError } from \"../../contracts/errors\";\nimport {\n capMaxAcceptableCommissionBps,\n COMMISSION_BPS_HEADROOM,\n} from \"../../deposit-terms/commissionCeiling\";\nimport { waitForTransactionReceiptSmartAware } from \"../../utils/eth\";\nimport { assertOnChainBtcPubkey } from \"./onChainBtcPubkey\";\nimport { assertPayoutScriptMatchesPopKey } from \"./payout-script\";\nimport { calculateBtcTxHash, derivePeginVaultId } from \"./pegin-transaction\";\nimport { ViemVaultRegistryReader } from \"./vault-registry-reader\";\n\n/** Referral code sent with peg-in registration. Zero means no referral. */\nexport const NO_REFERRAL_CODE = 0;\nconst UINT8_MAX = 255;\n// Match the prior vault-service timeout. A dropped transaction must not wait forever.\nconst RECEIPT_TIMEOUT_MS = 120_000;\n\nfunction ensureHex(value: string, label: string): Hex {\n const prefixed = value.startsWith(\"0x\")\n ? value\n : value.startsWith(\"0X\")\n ? `0x${value.slice(2)}`\n : `0x${value}`;\n if (!/^0x(?:[0-9a-fA-F]{2})+$/.test(prefixed)) {\n throw new Error(`${label} must be non-empty, even-length hex`);\n }\n return prefixed as Hex;\n}\n\nfunction assertBytes32(value: Hex, label: string): void {\n if (!/^0x[0-9a-fA-F]{64}$/.test(value)) {\n throw new Error(`${label} must be a 32-byte hex value`);\n }\n}\n\n/** All-zero `bytes32` — the shape an unresolved fingerprint takes. */\nconst ZERO_BYTES32 =\n \"0x0000000000000000000000000000000000000000000000000000000000000000\";\n\n/**\n * The single validation point for `expectedFingerprint`, on both the singular\n * and batch paths.\n *\n * Zero is rejected separately from the shape check because it is a *well-formed*\n * `bytes32` that the registry can never accept — the live fingerprint is a\n * keccak256 over a domain-separated preimage — so it can only ever mean the\n * caller had no value and filled the slot. Catching it here turns a defaulted\n * field into a named error instead of an opaque on-chain revert with two\n * hashes and no hint.\n */\nfunction assertFingerprint(value: Hex): void {\n assertBytes32(value, \"expectedFingerprint\");\n if (value.toLowerCase() === ZERO_BYTES32) {\n throw new Error(\n \"expectedFingerprint must not be zero: the registry cannot resolve a \" +\n \"zero fingerprint, so this submission would always revert\",\n );\n }\n}\n\nfunction assertHtlcVout(value: number): void {\n if (!Number.isInteger(value) || value < 0 || value > UINT8_MAX) {\n throw new Error(`htlcVout must be a uint8, got ${value}`);\n }\n}\n\n/** A PoP prepared by a Bitcoin wallet, reusable by the ETH submit client. */\nexport interface PopSignature {\n btcPopSignature: Hex;\n depositorEthAddress: Address;\n /** x-only secp256k1 public key, 64 hex chars without `0x`. */\n depositorBtcPubkey: string;\n}\n\nexport interface ViemPeginRegistrationClientConfig {\n ethWallet: WalletClient;\n ethChain: Chain;\n publicClient: PublicClient;\n btcVaultRegistry: Address;\n receiptTimeoutMs?: number;\n /**\n * Refuse to register without a `quotedCommissionBps`. Set it to `true` when\n * the depositor approved deposit terms on a device: approval froze the\n * commission ceiling from the quote, so the chain-current fallback could\n * admit a commission the device would later refuse to pay out.\n *\n * Required, with no default: an omitted flag would silently pick the unsafe\n * direction for the integrator least able to probe the wallet capability.\n */\n requireQuotedCommissionBps: boolean;\n}\n\nexport interface RegisterPeginOnChainParams {\n unsignedPrePeginTx: string;\n depositorSignedPeginTx: string;\n vaultProvider: Address;\n hashlock: Hex;\n depositorWotsPkHash: Hex;\n popSignature: PopSignature;\n /** Raw x-only, compressed, or uncompressed BTC pubkey from the PoP wallet. */\n depositorBtcPubkeyRaw: string;\n htlcVout: number;\n /**\n * Bitcoin output script bytes, not an address. The client verifies that the\n * script pays the proof-of-possession key before it submits the transaction.\n */\n depositorPayoutScriptPubKey: string;\n quotedCommissionBps?: number;\n /**\n * `keccak256(abi.encode(...))` over the protocol state the Pre-PegIn was\n * built against — see the SDK's `pegin-fingerprint` module.\n *\n * The registry recomputes it live at inclusion and reverts with\n * `PeginFingerprintChanged` on any difference, so it must be computed from\n * the same block-pinned snapshot that shaped the Bitcoin scripts. Required,\n * with no default: a fingerprint the caller did not resolve is not a\n * fingerprint, and the registry has no way to tell the two apart.\n */\n expectedFingerprint: Hex;\n}\n\nexport interface PeginRegistrationResult {\n ethTxHash: Hex;\n vaultId: Hex;\n peginTxHash: Hex;\n}\n\nexport interface BatchPeginRegistrationItem {\n depositorSignedPeginTx: string;\n hashlock: Hex;\n htlcVout: number;\n /**\n * Bitcoin output script bytes, not an address. The client verifies that the\n * script pays the proof-of-possession key before it submits the transaction.\n */\n depositorPayoutScriptPubKey: string;\n depositorWotsPkHash: Hex;\n}\n\nexport interface RegisterPeginBatchOnChainParams {\n vaultProvider: Address;\n unsignedPrePeginTx: string;\n requests: BatchPeginRegistrationItem[];\n popSignature: PopSignature;\n /** Raw x-only, compressed, or uncompressed BTC pubkey from the PoP wallet. */\n depositorBtcPubkeyRaw: string;\n quotedCommissionBps?: number;\n /**\n * See {@link RegisterPeginOnChainParams.expectedFingerprint}. One value for\n * the whole batch: the fingerprint takes no per-request input and a batch\n * fixes one vault provider, so every entry would resolve the same value.\n */\n expectedFingerprint: Hex;\n}\n\nexport interface BatchPeginRegistrationResultItem {\n vaultId: Hex;\n peginTxHash: Hex;\n}\n\nexport interface PeginBatchRegistrationResult {\n ethTxHash: Hex;\n vaults: BatchPeginRegistrationResultItem[];\n}\n\n/**\n * Ethereum-only client for the on-chain half of peg-in registration.\n *\n * It consumes Bitcoin artifacts that were prepared earlier, but owns no BTC\n * wallet and imports neither Bitcoin libraries nor the Rust/WASM package.\n */\nexport class ViemPeginRegistrationClient {\n constructor(private readonly config: ViemPeginRegistrationClientConfig) {}\n\n async registerPeginOnChain(\n params: RegisterPeginOnChainParams,\n ): Promise<PeginRegistrationResult> {\n const request = {\n ...params,\n popSignature: { ...params.popSignature },\n };\n this.assertQuotedCommissionPresentWhenRequired(request.quotedCommissionBps);\n // Second, matching the batch path, so the two public entry points validate\n // in the same order and neither can drift behind a chain call.\n assertFingerprint(request.expectedFingerprint);\n const depositor = this.assertPopMatchesEthAccount(request.popSignature);\n const depositorBtcPubkey = this.normalizeBtcPubkey(request.popSignature);\n const btcPopSignature = ensureHex(\n request.popSignature.btcPopSignature,\n \"btcPopSignature\",\n );\n const normalized = this.normalizeRequest(\n request,\n depositor,\n depositorBtcPubkey,\n );\n\n await this.assertVaultDoesNotExist(\n normalized.vaultId,\n normalized.peginTxHash,\n );\n const peginFee = await this.readPeginFee(request.vaultProvider);\n const maxCommission = await this.resolveMaxAcceptableCommissionBps(\n request.vaultProvider,\n request.quotedCommissionBps,\n );\n const callData = encodeFunctionData({\n abi: BTCVaultRegistryABI,\n functionName: \"submitPeginRequest\",\n args: [\n depositor,\n depositorBtcPubkey,\n btcPopSignature,\n normalized.unsignedPrePeginTx,\n normalized.depositorSignedPeginTx,\n request.vaultProvider,\n maxCommission,\n request.hashlock,\n request.htlcVout,\n normalized.payoutScript,\n request.depositorWotsPkHash,\n // Appended last on the singular overload; the batch takes it at\n // position 4 instead. Order is the selector, so do not \"tidy\" either.\n request.expectedFingerprint,\n ],\n });\n\n const ethTxHash = await this.sendAndWait(\n callData,\n peginFee,\n false,\n depositor,\n );\n return {\n ethTxHash,\n vaultId: normalized.vaultId,\n peginTxHash: normalized.peginTxHash,\n };\n }\n\n async registerPeginBatchOnChain(\n params: RegisterPeginBatchOnChainParams,\n ): Promise<PeginBatchRegistrationResult> {\n const batch = {\n ...params,\n popSignature: { ...params.popSignature },\n requests: params.requests.map((request) => ({ ...request })),\n };\n if (batch.requests.length === 0) {\n throw new Error(\"Batch pegin requires at least one request\");\n }\n this.assertQuotedCommissionPresentWhenRequired(batch.quotedCommissionBps);\n assertFingerprint(batch.expectedFingerprint);\n const depositor = this.assertPopMatchesEthAccount(batch.popSignature);\n const unsignedPrePeginTx = ensureHex(\n batch.unsignedPrePeginTx,\n \"unsignedPrePeginTx\",\n );\n const depositorBtcPubkey = this.normalizeBtcPubkey(batch.popSignature);\n const btcPopSignature = ensureHex(\n batch.popSignature.btcPopSignature,\n \"btcPopSignature\",\n );\n\n const vaults: BatchPeginRegistrationResultItem[] = [];\n const requests = [];\n const seenVaultIds = new Set<string>();\n for (const request of batch.requests) {\n const normalized = this.normalizeRequest(\n {\n ...request,\n unsignedPrePeginTx: batch.unsignedPrePeginTx,\n vaultProvider: batch.vaultProvider,\n depositorBtcPubkeyRaw: batch.depositorBtcPubkeyRaw,\n },\n depositor,\n depositorBtcPubkey,\n );\n if (seenVaultIds.has(normalized.vaultId)) {\n throw new Error(`Duplicate vault in batch: ${normalized.vaultId}`);\n }\n seenVaultIds.add(normalized.vaultId);\n vaults.push({\n vaultId: normalized.vaultId,\n peginTxHash: normalized.peginTxHash,\n });\n requests.push({\n depositorBtcPubKey: depositorBtcPubkey,\n btcPopSignature,\n unsignedPrePeginTx,\n depositorSignedPeginTx: normalized.depositorSignedPeginTx,\n hashlock: request.hashlock,\n htlcVout: request.htlcVout,\n referralCode: NO_REFERRAL_CODE,\n depositorPayoutBtcAddress: normalized.payoutScript,\n depositorWotsPkHash: request.depositorWotsPkHash,\n });\n }\n for (const vault of vaults) {\n await this.assertVaultDoesNotExist(vault.vaultId, vault.peginTxHash);\n }\n\n const peginFee = await this.readPeginFee(batch.vaultProvider);\n const maxCommission = await this.resolveMaxAcceptableCommissionBps(\n batch.vaultProvider,\n batch.quotedCommissionBps,\n );\n const callData = encodeFunctionData({\n abi: BTCVaultRegistryABI,\n functionName: \"submitPeginRequestBatch\",\n // `expectedFingerprint` sits BEFORE `requests`, not appended. Reordering\n // these five changes the selector and the call stops existing.\n args: [\n depositor,\n batch.vaultProvider,\n maxCommission,\n batch.expectedFingerprint,\n requests,\n ],\n });\n const ethTxHash = await this.sendAndWait(\n callData,\n peginFee * BigInt(batch.requests.length),\n true,\n depositor,\n );\n return { ethTxHash, vaults };\n }\n\n private assertQuotedCommissionPresentWhenRequired(\n quotedCommissionBps?: number,\n ): void {\n if (\n quotedCommissionBps === undefined &&\n this.config.requireQuotedCommissionBps\n ) {\n throw new Error(\n \"quotedCommissionBps is required when the wallet approved deposit \" +\n \"terms: the registration ceiling must anchor to the approved quote.\",\n );\n }\n }\n\n private assertPopMatchesEthAccount(pop: PopSignature): Address {\n return this.assertEthAccount(pop.depositorEthAddress);\n }\n\n private assertEthAccount(expectedDepositor: Address): Address {\n const account = this.config.ethWallet.account;\n if (!account) throw new Error(\"Ethereum wallet account not found\");\n if (!isAddressEqual(expectedDepositor, account.address)) {\n throw new Error(\n `Proof of possession was signed for ${expectedDepositor} ` +\n `but the Ethereum wallet is currently connected to ${account.address}. ` +\n `Reconnect the original account or sign a new proof of possession.`,\n );\n }\n return account.address;\n }\n\n private normalizeBtcPubkey(pop: PopSignature): Hex {\n return `0x${assertOnChainBtcPubkey(\n ensureHex(pop.depositorBtcPubkey, \"Proof of possession BTC pubkey\"),\n \"Proof of possession BTC pubkey\",\n )}`;\n }\n\n // `expectedFingerprint` is omitted rather than accepted and ignored: nothing\n // here normalizes it, and requiring it would force the batch loop to thread a\n // value through a per-request helper that has no use for it. It is validated\n // once per call, at the top of each public method.\n private normalizeRequest(\n params: Omit<\n RegisterPeginOnChainParams,\n \"popSignature\" | \"expectedFingerprint\"\n >,\n depositor: Address,\n depositorBtcPubkey: Hex,\n ) {\n assertBytes32(params.hashlock, \"hashlock\");\n assertBytes32(params.depositorWotsPkHash, \"depositorWotsPkHash\");\n assertHtlcVout(params.htlcVout);\n const unsignedPrePeginTx = ensureHex(\n params.unsignedPrePeginTx,\n \"unsignedPrePeginTx\",\n );\n const depositorSignedPeginTx = ensureHex(\n params.depositorSignedPeginTx,\n \"depositorSignedPeginTx\",\n );\n const peginTxHash = calculateBtcTxHash(depositorSignedPeginTx);\n return {\n unsignedPrePeginTx,\n depositorSignedPeginTx,\n payoutScript: assertPayoutScriptMatchesPopKey(\n params.depositorPayoutScriptPubKey,\n depositorBtcPubkey,\n params.depositorBtcPubkeyRaw,\n ),\n peginTxHash,\n vaultId: ensureHex(derivePeginVaultId(peginTxHash, depositor), \"vaultId\"),\n };\n }\n\n private async assertVaultDoesNotExist(\n vaultId: Hex,\n peginTxHash: Hex,\n ): Promise<void> {\n const result = (await this.config.publicClient.readContract({\n address: this.config.btcVaultRegistry,\n abi: BTCVaultRegistryABI,\n functionName: \"getBtcVaultBasicInfo\",\n args: [vaultId],\n })) as { depositor: Address };\n if (result.depositor !== zeroAddress) {\n throw new Error(\n `Vault already exists (ID: ${vaultId}, peginTxHash: ${peginTxHash}). ` +\n `Vault IDs are derived from the pegin transaction hash and depositor address. ` +\n `To create a new vault, use different UTXOs or a different amount to generate a unique transaction.`,\n );\n }\n }\n\n private async readPeginFee(vaultProvider: Address): Promise<bigint> {\n try {\n return (await this.config.publicClient.readContract({\n address: this.config.btcVaultRegistry,\n abi: BTCVaultRegistryABI,\n functionName: \"getPegInFee\",\n args: [vaultProvider],\n })) as bigint;\n } catch (error) {\n throw new Error(\n \"Failed to query pegin fee from the contract. \" +\n \"Please check your network connection and contract address.\",\n { cause: error },\n );\n }\n }\n\n private async resolveMaxAcceptableCommissionBps(\n vaultProvider: Address,\n quotedCommissionBps?: number,\n ): Promise<number> {\n let currentBps: number;\n try {\n currentBps = await new ViemVaultRegistryReader(\n this.config.publicClient,\n this.config.btcVaultRegistry,\n ).getVaultProviderCommission(vaultProvider);\n } catch (error) {\n throw new Error(\n \"Failed to query vault provider commission from the contract. \" +\n \"Please check your network connection and contract address.\",\n { cause: error },\n );\n }\n if (quotedCommissionBps !== undefined) {\n if (currentBps > quotedCommissionBps + COMMISSION_BPS_HEADROOM) {\n throw new Error(\n `Vault provider commission changed since quote: quoted ${quotedCommissionBps} bps, ` +\n `chain currently reports ${currentBps} bps (allowed drift ${COMMISSION_BPS_HEADROOM} bps). ` +\n `Please refresh and try again.`,\n );\n }\n return capMaxAcceptableCommissionBps(quotedCommissionBps);\n }\n return capMaxAcceptableCommissionBps(currentBps);\n }\n\n private async sendAndWait(\n data: Hex,\n value: bigint,\n batch: boolean,\n depositor: Address,\n ): Promise<Hex> {\n let account = this.assertEthAccount(depositor);\n let gas: bigint;\n try {\n gas = await this.config.publicClient.estimateGas({\n to: this.config.btcVaultRegistry,\n data,\n value,\n account,\n });\n } catch (error) {\n handleContractError(error);\n }\n\n account = this.assertEthAccount(depositor);\n let submittedHash: Hex;\n try {\n submittedHash = await this.config.ethWallet.sendTransaction({\n to: this.config.btcVaultRegistry,\n data,\n value,\n gas,\n account,\n chain: this.config.ethChain,\n });\n } catch (error) {\n handleContractError(error);\n }\n const receipt = await waitForTransactionReceiptSmartAware({\n publicClient: this.config.publicClient,\n walletAddress: depositor,\n hash: submittedHash,\n timeout: this.config.receiptTimeoutMs ?? RECEIPT_TIMEOUT_MS,\n });\n if (receipt.status === \"reverted\") {\n handleContractError(\n new Error(\n `${batch ? \"Batch transaction\" : \"Transaction\"} reverted. ` +\n `Hash: ${receipt.transactionHash}. Check a block explorer for details.`,\n ),\n );\n }\n return receipt.transactionHash;\n }\n}\n"],"names":["COMMISSION_BPS_HEADROOM","MAX_ACCEPTABLE_COMMISSION_BPS_CAP","capMaxAcceptableCommissionBps","bps","MAX_VP_COMMISSION_BPS_EXCLUSIVE","MAX_VP_COMMISSION_BPS","mapVaultBasicInfo","result","mapVaultProtocolInfo","offchainParamsVersion","assertValidOffchainParamsVersion","UINT64_EXCLUSIVE_UPPER_BOUND","VP_GENESIS_KEY_EPOCH","PEGIN_SUBMITTED_EVENT","getAbiItem","BTCVaultRegistryABI","VAULT_CLAIMABLE_BY_EVENT","VAULT_CLAIMABLE_BY_QUERY_CHUNK_BLOCKS","maxBigint","a","b","mapRegistrationRecord","args","blockNumber","assertEpochInRange","value","field","vaultId","mapKeyEpochs","ViemVaultRegistryReader","publicClient","contractAddress","vpAddress","epoch","assertOnChainBtcPubkey","BTCVaultRegistryKeyEpochsABI","vaultIds","info","i","vaultProvider","basicRaw","protocolRaw","basic","protocol","createdAt","logs","RegistrationLogsUnavailableError","records","log","record","findRegistrationRecord","claimerPk","claimerTopic","vaultIdTopic","finalized","toBlock","fromBlock","transactions","VaultClaimableByNotFoundError","NO_REFERRAL_CODE","UINT8_MAX","RECEIPT_TIMEOUT_MS","ensureHex","label","prefixed","assertBytes32","ZERO_BYTES32","assertFingerprint","assertHtlcVout","ViemPeginRegistrationClient","config","params","request","depositor","depositorBtcPubkey","btcPopSignature","normalized","peginFee","maxCommission","callData","encodeFunctionData","batch","unsignedPrePeginTx","vaults","requests","seenVaultIds","vault","quotedCommissionBps","pop","expectedDepositor","account","isAddressEqual","depositorSignedPeginTx","peginTxHash","calculateBtcTxHash","assertPayoutScriptMatchesPopKey","derivePeginVaultId","zeroAddress","error","currentBps","data","gas","handleContractError","submittedHash","receipt","waitForTransactionReceiptSmartAware"],"mappings":"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"}
@@ -1,22 +1,22 @@
1
- import { getAbiItem as V, encodeFunctionData as E, isAddressEqual as R, zeroAddress as K } from "viem";
2
- import { B as a } from "./BTCVaultRegistry.abi-BzNTa_EU.js";
3
- import { B as v, h as b } from "./BTCVaultRegistryKeyEpochs.abi-Btg0nBz1.js";
4
- import { M as x } from "./constants-CvQZuxKv.js";
5
- import { waitForTransactionReceiptSmartAware as N } from "./tbv/core/utils/eth/index.js";
6
- import { a as P, R as T, g as H, V as _, j as M, h as q, k as F, d as O } from "./registration-records-DJJC2NiO.js";
7
- const y = 25, L = 9999;
8
- function S(o) {
1
+ import { getAbiItem as k, encodeFunctionData as B, isAddressEqual as R, zeroAddress as $ } from "viem";
2
+ import { B as a } from "./BTCVaultRegistry.abi-DnP4UkB5.js";
3
+ import { B as E, h as b } from "./BTCVaultRegistryKeyEpochs.abi-Btg0nBz1.js";
4
+ import { M as x } from "./constants-CmDDuM3L.js";
5
+ import { waitForTransactionReceiptSmartAware as K } from "./tbv/core/utils/eth/index.js";
6
+ import { a as P, R as N, g as H, V as _, j as M, h as q, k as F, d as O } from "./registration-records-D39ApuHS.js";
7
+ const V = 25, L = 9999;
8
+ function v(o) {
9
9
  if (!Number.isInteger(o) || o < 0 || o >= x)
10
10
  throw new Error(
11
11
  `Quoted commissionBps must be an integer in [0, ${x}), got ${o}`
12
12
  );
13
13
  return Math.min(
14
- o + y,
14
+ o + V,
15
15
  L
16
16
  );
17
17
  }
18
- const A = 9999;
19
- function I(o) {
18
+ const T = 9999;
19
+ function A(o) {
20
20
  return {
21
21
  depositor: o.depositor,
22
22
  depositorBtcPubKey: o.depositorBtcPubKey,
@@ -27,7 +27,7 @@ function I(o) {
27
27
  createdAt: o.createdAt
28
28
  };
29
29
  }
30
- function w(o) {
30
+ function C(o) {
31
31
  const t = Number(o.offchainParamsVersion);
32
32
  return M(t), {
33
33
  depositorSignedPeginTx: o.depositorSignedPeginTx,
@@ -45,10 +45,10 @@ function w(o) {
45
45
  vaultCoreVersion: o.vaultCoreVersion
46
46
  };
47
47
  }
48
- const z = 1n << 64n, W = 0n, U = [
49
- V({ abi: a, name: "PegInSubmitted" }),
50
- V({ abi: a, name: "PegInSubmittedV2" })
51
- ], D = V({
48
+ const z = 1n << 64n, W = 0n, U = k({
49
+ abi: a,
50
+ name: "PegInSubmitted"
51
+ }), D = k({
52
52
  abi: a,
53
53
  name: "VaultClaimableBy"
54
54
  }), X = 7200n;
@@ -73,22 +73,22 @@ function Y(o, t) {
73
73
  blockNumber: t
74
74
  };
75
75
  }
76
- function C(o, t, e) {
76
+ function w(o, t, e) {
77
77
  if (o < 0n || o >= z)
78
78
  throw new Error(
79
79
  `getBtcVaultProtocolInfo returned ${t}=${o} for vault ${e}, outside the uint64 range — the registry may predate RFC-006`
80
80
  );
81
81
  return o;
82
82
  }
83
- function k(o, t) {
83
+ function S(o, t) {
84
84
  return {
85
- vpKeyEpoch: C(o.vpKeyEpoch, "vpKeyEpoch", t),
86
- appKeeperKeyEpoch: C(
85
+ vpKeyEpoch: w(o.vpKeyEpoch, "vpKeyEpoch", t),
86
+ appKeeperKeyEpoch: w(
87
87
  o.appKeeperKeyEpoch,
88
88
  "appKeeperKeyEpoch",
89
89
  t
90
90
  ),
91
- ucKeyEpoch: C(o.ucKeyEpoch, "ucKeyEpoch", t)
91
+ ucKeyEpoch: w(o.ucKeyEpoch, "ucKeyEpoch", t)
92
92
  };
93
93
  }
94
94
  class G {
@@ -134,7 +134,7 @@ class G {
134
134
  * JSON-RPC bootstrap is signed by the provider's live key.
135
135
  */
136
136
  async getVaultProviderOperationBtcKeyAtEpoch(t, e, r) {
137
- const n = await this.publicClient.readContract({
137
+ const s = await this.publicClient.readContract({
138
138
  address: this.contractAddress,
139
139
  abi: a,
140
140
  functionName: "getOperationBtcKeyAtEpoch",
@@ -142,7 +142,7 @@ class G {
142
142
  blockNumber: r
143
143
  });
144
144
  return P(
145
- n,
145
+ s,
146
146
  `getOperationBtcKeyAtEpoch (vp=${t}, epoch=${e})`
147
147
  );
148
148
  }
@@ -208,23 +208,23 @@ class G {
208
208
  async getVaultKeyEpochs(t) {
209
209
  const e = await this.publicClient.readContract({
210
210
  address: this.contractAddress,
211
- abi: v,
211
+ abi: E,
212
212
  functionName: "getBtcVaultProtocolInfo",
213
213
  args: [t]
214
214
  });
215
- return k(e, t);
215
+ return S(e, t);
216
216
  }
217
217
  async getVaultKeyEpochsBatch(t) {
218
218
  return t.length === 0 ? [] : (await this.publicClient.multicall({
219
219
  contracts: t.map((r) => ({
220
220
  address: this.contractAddress,
221
- abi: v,
221
+ abi: E,
222
222
  functionName: "getBtcVaultProtocolInfo",
223
223
  args: [r]
224
224
  })),
225
225
  allowFailure: !1
226
226
  })).map(
227
- (r, n) => k(r, t[n])
227
+ (r, s) => S(r, t[s])
228
228
  );
229
229
  }
230
230
  async getVaultBasicInfo(t) {
@@ -234,7 +234,7 @@ class G {
234
234
  functionName: "getBtcVaultBasicInfo",
235
235
  args: [t]
236
236
  });
237
- return I(e);
237
+ return A(e);
238
238
  }
239
239
  async getVaultProtocolInfo(t) {
240
240
  const e = await this.publicClient.readContract({
@@ -243,7 +243,7 @@ class G {
243
243
  functionName: "getBtcVaultProtocolInfo",
244
244
  args: [t]
245
245
  });
246
- return w(e);
246
+ return C(e);
247
247
  }
248
248
  async getProtocolInfoBatch(t) {
249
249
  return t.length === 0 ? [] : (await this.publicClient.multicall({
@@ -254,13 +254,13 @@ class G {
254
254
  args: [r]
255
255
  })),
256
256
  allowFailure: !1
257
- })).map((r, n) => {
257
+ })).map((r, s) => {
258
258
  const i = r;
259
259
  if (!i.depositorSignedPeginTx || i.depositorSignedPeginTx === "0x")
260
260
  throw new Error(
261
- `Vault ${t[n]} not found on-chain or has no pegin transaction`
261
+ `Vault ${t[s]} not found on-chain or has no pegin transaction`
262
262
  );
263
- return w(i);
263
+ return C(i);
264
264
  });
265
265
  }
266
266
  /**
@@ -289,9 +289,9 @@ class G {
289
289
  functionName: "getVaultProviderCommission",
290
290
  args: [t]
291
291
  });
292
- if (!Number.isInteger(e) || e < 0 || e > A)
292
+ if (!Number.isInteger(e) || e < 0 || e > T)
293
293
  throw new Error(
294
- `getVaultProviderCommission returned ${e} bps for ${t}, outside the protocol range [0, ${A}]`
294
+ `getVaultProviderCommission returned ${e} bps for ${t}, outside the protocol range [0, ${T}]`
295
295
  );
296
296
  return e;
297
297
  }
@@ -312,44 +312,38 @@ class G {
312
312
  }
313
313
  ],
314
314
  allowFailure: !1
315
- }), n = I(e), i = w(r);
315
+ }), s = A(e), i = C(r);
316
316
  if (!i.depositorSignedPeginTx || i.depositorSignedPeginTx === "0x")
317
317
  throw new Error(
318
318
  `Vault ${t} not found on-chain or has no pegin transaction`
319
319
  );
320
- return { basic: n, protocol: i };
320
+ return { basic: s, protocol: i };
321
321
  }
322
322
  /** @inheritdoc */
323
323
  async getRegistrationRecordsAtBlock(t) {
324
324
  const e = await this.publicClient.getLogs({
325
325
  address: this.contractAddress,
326
- events: U,
326
+ event: U,
327
327
  fromBlock: t,
328
328
  toBlock: t,
329
329
  strict: !0
330
330
  });
331
331
  if (e.length === 0)
332
- throw new T(t);
332
+ throw new N(t);
333
333
  const r = /* @__PURE__ */ new Map();
334
- for (const n of e) {
335
- if (n.eventName !== "PegInSubmittedV2") continue;
336
- const i = Y(n.args, n.blockNumber);
334
+ for (const s of e) {
335
+ const i = Y(s.args, s.blockNumber);
337
336
  if (r.has(i.vaultId))
338
337
  throw new Error(
339
- `Expected one PegInSubmittedV2 log for vault ${i.vaultId} at block ${t}, found more than one`
338
+ `Expected one PegInSubmitted log for vault ${i.vaultId} at block ${t}, found more than one`
340
339
  );
341
340
  r.set(i.vaultId, i);
342
341
  }
343
- if (r.size === 0)
344
- throw new T(
345
- t,
346
- `Block ${t} holds ${e.length} PegInSubmitted registration log(s) but no PegInSubmittedV2 log: either the node served a partial answer for block ${t} (retry, preferably another node) or the registry predates the depositor's commission ceiling (vault-contracts-aave-v4 #548) and the ceiling cannot be recovered on-chain`
347
- );
348
342
  return [...r.values()];
349
343
  }
350
344
  /**
351
345
  * Read the depositor's commission ceiling (`maxAcceptableCommissionBps`)
352
- * for vaults registered in the same block, from their `PegInSubmittedV2`
346
+ * for vaults registered in the same block, from their `PegInSubmitted`
353
347
  * logs. Returned in `vaultIds` order.
354
348
  *
355
349
  * The contract bound-checks the ceiling and discards it (PeginLogic.sol,
@@ -364,7 +358,7 @@ class G {
364
358
  if (t.length === 0) return [];
365
359
  const r = await this.getRegistrationRecordsAtBlock(e);
366
360
  return t.map(
367
- (n) => H(r, n, e).maxAcceptableCommissionBps
361
+ (s) => H(r, s, e).maxAcceptableCommissionBps
368
362
  );
369
363
  }
370
364
  /** @inheritdoc */
@@ -372,7 +366,7 @@ class G {
372
366
  const i = `0x${P(
373
367
  e,
374
368
  `getVaultClaimableBy claimer (vault=${t})`
375
- )}`, s = t.toLowerCase(), { number: c } = await this.publicClient.getBlock({
369
+ )}`, n = t.toLowerCase(), { number: c } = await this.publicClient.getBlock({
376
370
  blockTag: "finalized"
377
371
  });
378
372
  if (c < r)
@@ -387,7 +381,7 @@ class G {
387
381
  ), p = await this.publicClient.getLogs({
388
382
  address: this.contractAddress,
389
383
  event: D,
390
- args: { vaultId: s, claimerPK: i },
384
+ args: { vaultId: n, claimerPK: i },
391
385
  fromBlock: l,
392
386
  toBlock: u,
393
387
  strict: !0
@@ -433,13 +427,13 @@ function m(o, t) {
433
427
  throw new Error(`${t} must be non-empty, even-length hex`);
434
428
  return e;
435
429
  }
436
- function B(o, t) {
430
+ function y(o, t) {
437
431
  if (!/^0x[0-9a-fA-F]{64}$/.test(o))
438
432
  throw new Error(`${t} must be a 32-byte hex value`);
439
433
  }
440
434
  const tt = "0x0000000000000000000000000000000000000000000000000000000000000000";
441
- function $(o) {
442
- if (B(o, "expectedFingerprint"), o.toLowerCase() === tt)
435
+ function I(o) {
436
+ if (y(o, "expectedFingerprint"), o.toLowerCase() === tt)
443
437
  throw new Error(
444
438
  "expectedFingerprint must not be zero: the registry cannot resolve a zero fingerprint, so this submission would always revert"
445
439
  );
@@ -457,36 +451,36 @@ class ut {
457
451
  ...t,
458
452
  popSignature: { ...t.popSignature }
459
453
  };
460
- this.assertQuotedCommissionPresentWhenRequired(e.quotedCommissionBps), $(e.expectedFingerprint);
461
- const r = this.assertPopMatchesEthAccount(e.popSignature), n = this.normalizeBtcPubkey(e.popSignature), i = m(
454
+ this.assertQuotedCommissionPresentWhenRequired(e.quotedCommissionBps), I(e.expectedFingerprint);
455
+ const r = this.assertPopMatchesEthAccount(e.popSignature), s = this.normalizeBtcPubkey(e.popSignature), i = m(
462
456
  e.popSignature.btcPopSignature,
463
457
  "btcPopSignature"
464
- ), s = this.normalizeRequest(
458
+ ), n = this.normalizeRequest(
465
459
  e,
466
460
  r,
467
- n
461
+ s
468
462
  );
469
463
  await this.assertVaultDoesNotExist(
470
- s.vaultId,
471
- s.peginTxHash
464
+ n.vaultId,
465
+ n.peginTxHash
472
466
  );
473
467
  const c = await this.readPeginFee(e.vaultProvider), u = await this.resolveMaxAcceptableCommissionBps(
474
468
  e.vaultProvider,
475
469
  e.quotedCommissionBps
476
- ), l = E({
470
+ ), l = B({
477
471
  abi: a,
478
472
  functionName: "submitPeginRequest",
479
473
  args: [
480
474
  r,
481
- n,
475
+ s,
482
476
  i,
483
- s.unsignedPrePeginTx,
484
- s.depositorSignedPeginTx,
477
+ n.unsignedPrePeginTx,
478
+ n.depositorSignedPeginTx,
485
479
  e.vaultProvider,
486
480
  u,
487
481
  e.hashlock,
488
482
  e.htlcVout,
489
- s.payoutScript,
483
+ n.payoutScript,
490
484
  e.depositorWotsPkHash,
491
485
  // Appended last on the singular overload; the batch takes it at
492
486
  // position 4 instead. Order is the selector, so do not "tidy" either.
@@ -500,8 +494,8 @@ class ut {
500
494
  !1,
501
495
  r
502
496
  ),
503
- vaultId: s.vaultId,
504
- peginTxHash: s.peginTxHash
497
+ vaultId: n.vaultId,
498
+ peginTxHash: n.peginTxHash
505
499
  };
506
500
  }
507
501
  async registerPeginBatchOnChain(t) {
@@ -512,11 +506,11 @@ class ut {
512
506
  };
513
507
  if (e.requests.length === 0)
514
508
  throw new Error("Batch pegin requires at least one request");
515
- this.assertQuotedCommissionPresentWhenRequired(e.quotedCommissionBps), $(e.expectedFingerprint);
516
- const r = this.assertPopMatchesEthAccount(e.popSignature), n = m(
509
+ this.assertQuotedCommissionPresentWhenRequired(e.quotedCommissionBps), I(e.expectedFingerprint);
510
+ const r = this.assertPopMatchesEthAccount(e.popSignature), s = m(
517
511
  e.unsignedPrePeginTx,
518
512
  "unsignedPrePeginTx"
519
- ), i = this.normalizeBtcPubkey(e.popSignature), s = m(
513
+ ), i = this.normalizeBtcPubkey(e.popSignature), n = m(
520
514
  e.popSignature.btcPopSignature,
521
515
  "btcPopSignature"
522
516
  ), c = [], u = [], l = /* @__PURE__ */ new Set();
@@ -538,8 +532,8 @@ class ut {
538
532
  peginTxHash: g.peginTxHash
539
533
  }), u.push({
540
534
  depositorBtcPubKey: i,
541
- btcPopSignature: s,
542
- unsignedPrePeginTx: n,
535
+ btcPopSignature: n,
536
+ unsignedPrePeginTx: s,
543
537
  depositorSignedPeginTx: g.depositorSignedPeginTx,
544
538
  hashlock: h.hashlock,
545
539
  htlcVout: h.htlcVout,
@@ -553,7 +547,7 @@ class ut {
553
547
  const p = await this.readPeginFee(e.vaultProvider), d = await this.resolveMaxAcceptableCommissionBps(
554
548
  e.vaultProvider,
555
549
  e.quotedCommissionBps
556
- ), f = E({
550
+ ), f = B({
557
551
  abi: a,
558
552
  functionName: "submitPeginRequestBatch",
559
553
  // `expectedFingerprint` sits BEFORE `requests`, not appended. Reordering
@@ -602,24 +596,24 @@ class ut {
602
596
  // value through a per-request helper that has no use for it. It is validated
603
597
  // once per call, at the top of each public method.
604
598
  normalizeRequest(t, e, r) {
605
- B(t.hashlock, "hashlock"), B(t.depositorWotsPkHash, "depositorWotsPkHash"), et(t.htlcVout);
606
- const n = m(
599
+ y(t.hashlock, "hashlock"), y(t.depositorWotsPkHash, "depositorWotsPkHash"), et(t.htlcVout);
600
+ const s = m(
607
601
  t.unsignedPrePeginTx,
608
602
  "unsignedPrePeginTx"
609
603
  ), i = m(
610
604
  t.depositorSignedPeginTx,
611
605
  "depositorSignedPeginTx"
612
- ), s = q(i);
606
+ ), n = q(i);
613
607
  return {
614
- unsignedPrePeginTx: n,
608
+ unsignedPrePeginTx: s,
615
609
  depositorSignedPeginTx: i,
616
610
  payoutScript: F(
617
611
  t.depositorPayoutScriptPubKey,
618
612
  r,
619
613
  t.depositorBtcPubkeyRaw
620
614
  ),
621
- peginTxHash: s,
622
- vaultId: m(O(s, e), "vaultId")
615
+ peginTxHash: n,
616
+ vaultId: m(O(n, e), "vaultId")
623
617
  };
624
618
  }
625
619
  async assertVaultDoesNotExist(t, e) {
@@ -628,7 +622,7 @@ class ut {
628
622
  abi: a,
629
623
  functionName: "getBtcVaultBasicInfo",
630
624
  args: [t]
631
- })).depositor !== K)
625
+ })).depositor !== $)
632
626
  throw new Error(
633
627
  `Vault already exists (ID: ${t}, peginTxHash: ${e}). Vault IDs are derived from the pegin transaction hash and depositor address. To create a new vault, use different UTXOs or a different amount to generate a unique transaction.`
634
628
  );
@@ -655,25 +649,25 @@ class ut {
655
649
  this.config.publicClient,
656
650
  this.config.btcVaultRegistry
657
651
  ).getVaultProviderCommission(t);
658
- } catch (n) {
652
+ } catch (s) {
659
653
  throw new Error(
660
654
  "Failed to query vault provider commission from the contract. Please check your network connection and contract address.",
661
- { cause: n }
655
+ { cause: s }
662
656
  );
663
657
  }
664
658
  if (e !== void 0) {
665
- if (r > e + y)
659
+ if (r > e + V)
666
660
  throw new Error(
667
- `Vault provider commission changed since quote: quoted ${e} bps, chain currently reports ${r} bps (allowed drift ${y} bps). Please refresh and try again.`
661
+ `Vault provider commission changed since quote: quoted ${e} bps, chain currently reports ${r} bps (allowed drift ${V} bps). Please refresh and try again.`
668
662
  );
669
- return S(e);
663
+ return v(e);
670
664
  }
671
- return S(r);
665
+ return v(r);
672
666
  }
673
- async sendAndWait(t, e, r, n) {
674
- let i = this.assertEthAccount(n), s;
667
+ async sendAndWait(t, e, r, s) {
668
+ let i = this.assertEthAccount(s), n;
675
669
  try {
676
- s = await this.config.publicClient.estimateGas({
670
+ n = await this.config.publicClient.estimateGas({
677
671
  to: this.config.btcVaultRegistry,
678
672
  data: t,
679
673
  value: e,
@@ -682,23 +676,23 @@ class ut {
682
676
  } catch (l) {
683
677
  b(l);
684
678
  }
685
- i = this.assertEthAccount(n);
679
+ i = this.assertEthAccount(s);
686
680
  let c;
687
681
  try {
688
682
  c = await this.config.ethWallet.sendTransaction({
689
683
  to: this.config.btcVaultRegistry,
690
684
  data: t,
691
685
  value: e,
692
- gas: s,
686
+ gas: n,
693
687
  account: i,
694
688
  chain: this.config.ethChain
695
689
  });
696
690
  } catch (l) {
697
691
  b(l);
698
692
  }
699
- const u = await N({
693
+ const u = await K({
700
694
  publicClient: this.config.publicClient,
701
- walletAddress: n,
695
+ walletAddress: s,
702
696
  hash: c,
703
697
  timeout: this.config.receiptTimeoutMs ?? J
704
698
  });
@@ -710,10 +704,10 @@ class ut {
710
704
  }
711
705
  }
712
706
  export {
713
- y as C,
707
+ V as C,
714
708
  L as M,
715
709
  ut as V,
716
710
  G as a,
717
- S as c
711
+ v as c
718
712
  };
719
- //# sourceMappingURL=pegin-registration-client-Cvjk4ILq.js.map
713
+ //# sourceMappingURL=pegin-registration-client-ZI0k10_3.js.map