UNPKG

@atomiqlabs/chain-evm

Version:

EVM specific base implementation

52 lines (51 loc) 2.22 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.BitcoinOutputClaimHandler = void 0; const base_1 = require("@atomiqlabs/base"); const IBitcoinClaimHandler_1 = require("./IBitcoinClaimHandler"); const buffer_1 = require("buffer"); const ethers_1 = require("ethers"); const btc_signer_1 = require("@scure/btc-signer"); class BitcoinOutputClaimHandler extends IBitcoinClaimHandler_1.IBitcoinClaimHandler { serializeCommitment(data) { const txoHash = (0, ethers_1.solidityPackedKeccak256)(["uint64", "bytes32"], [data.amount, (0, ethers_1.keccak256)(data.output)]); return buffer_1.Buffer.concat([ buffer_1.Buffer.from(txoHash.substring(2), "hex"), super.serializeCommitment(data) ]); } async getWitness(signer, swapData, witnessData, feeRate) { if (!swapData.isClaimHandler(this.address)) throw new Error("Invalid claim handler"); const txBuffer = buffer_1.Buffer.from(witnessData.tx.hex, "hex"); const parsedBtcTx = btc_signer_1.Transaction.fromRaw(txBuffer); const out = parsedBtcTx.getOutput(witnessData.vout); const { initialTxns, commitment, blockheader, merkleProof } = await this._getWitness(signer, swapData, witnessData, { output: buffer_1.Buffer.from(out.script), amount: out.amount }); const voutAndTxData = buffer_1.Buffer.concat([ base_1.BigIntBufferUtils.toBuffer(BigInt(witnessData.vout), "be", 4), base_1.BigIntBufferUtils.toBuffer(BigInt(txBuffer.length), "be", 32), txBuffer ]); return { initialTxns, witness: buffer_1.Buffer.concat([ commitment, blockheader, voutAndTxData, merkleProof ]) }; } getGas(data) { return BitcoinOutputClaimHandler.gas; } getType() { return BitcoinOutputClaimHandler.type; } } exports.BitcoinOutputClaimHandler = BitcoinOutputClaimHandler; BitcoinOutputClaimHandler.type = base_1.ChainSwapType.CHAIN; BitcoinOutputClaimHandler.gas = 40000;