UNPKG

@xlink-network/xlink-sdk

Version:
1 lines 4.57 kB
{"version":3,"sources":["../src/bitcoinUtils/apiHelpers/createBitcoinPegInRecipients.ts"],"sourcesContent":["import { estimateInputVSizeAfterSign } from \"@c4/btc-utils\"\nimport { toHex } from \"viem\"\nimport { requestAPI } from \"../../utils/apiHelpers\"\nimport { BigNumber } from \"../../utils/BigNumber\"\nimport { UnsupportedBridgeRouteError } from \"../../utils/errors\"\nimport { decodeHex } from \"../../utils/hexHelpers\"\nimport { KnownChainId, KnownTokenId } from \"../../utils/types/knownIds\"\nimport { SDKGlobalContext } from \"../../xlinkSdkUtils/types.internal\"\nimport { getBTCPegInAddress } from \"../btcAddresses\"\nimport { calculateFee } from \"../prepareTransaction\"\n\nconst REVEAL_TX_OUTPUT_AMOUNT = 546n\n\nexport async function createBitcoinPegInRecipients(\n sdkContext: Pick<SDKGlobalContext, \"backendAPI\">,\n info: {\n fromChain: KnownChainId.BitcoinChain\n toChain: KnownChainId.StacksChain | KnownChainId.EVMChain\n fromToken: KnownTokenId.BitcoinToken\n toToken: KnownTokenId.StacksToken | KnownTokenId.EVMToken\n fromAddress: {\n address: string\n scriptPubKey: Uint8Array\n }\n toAddress: string\n fromAmount: BigNumber\n feeRate: bigint\n orderData: Uint8Array\n },\n): Promise<{\n address: string\n scriptPubKey: Uint8Array\n satsAmount: bigint\n}> {\n const pegInAddress = await getBTCPegInAddress(info.fromChain, info.toChain)\n if (pegInAddress == null) {\n throw new UnsupportedBridgeRouteError(\n info.fromChain,\n info.toChain,\n KnownTokenId.Bitcoin.BTC,\n )\n }\n\n const resp = await requestAPI<{\n addresses: BitcoinPegInRecipient[]\n }>(sdkContext, {\n path: `/2024-10-01/bitcoin/peg-in-recipients`,\n method: \"POST\",\n body: {\n fromChain: info.fromChain,\n toChain: info.toChain,\n fromToken: info.fromToken,\n toToken: info.toToken,\n fromAddress: {\n address: info.fromAddress.address,\n scriptPubKeyHex: toHex(info.fromAddress.scriptPubKey),\n },\n toAddress: info.toAddress,\n fromAmount: BigNumber.toString(info.fromAmount),\n orderDataHex: toHex(info.orderData),\n },\n })\n\n const recipient = resp.addresses.find(\n address => address.type === \"commitOrder\",\n )!\n\n const revealInputSize = estimateInputVSizeAfterSign({\n addressType: \"p2tr-leafScript\",\n tapLeafScriptArgumentByteLengths: [/* signature */ 64],\n tapLeafScriptByteLength: recipient.tapScriptHex.length / 2,\n controlBlockByteLength: 33,\n })\n const { fee: newTxFee } = await calculateFee({\n recipientAddressScriptPubKeys: [pegInAddress.scriptPubKey],\n opReturnData: [],\n selectedUTXOs: [],\n feeRate: info.feeRate,\n extraSize: revealInputSize.inputSize + revealInputSize.witnessDataSize / 4,\n })\n\n const revealUTXOSatsAmount = BigNumber.sum([\n newTxFee,\n REVEAL_TX_OUTPUT_AMOUNT,\n ])\n\n return {\n address: recipient.address,\n scriptPubKey: decodeHex(recipient.scriptPubKeyHex),\n satsAmount: BigNumber.toBigInt(\n { roundingMode: BigNumber.roundUp },\n revealUTXOSatsAmount,\n ),\n }\n}\n\nexport interface BitcoinPegInRecipient {\n type: \"commitOrder\"\n address: string\n scriptPubKeyHex: string\n tapScriptHex: `0x${string}`\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,mCAAmC;AAC5C,SAAS,aAAa;AAUtB,IAAM,0BAA0B;AAEhC,eAAsB,6BACpB,YACA,MAkBC;AACD,QAAM,eAAe,MAAM,mBAAmB,KAAK,WAAW,KAAK,OAAO;AAC1E,MAAI,gBAAgB,MAAM;AACxB,UAAM,IAAI;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AAAA,MACL,aAAa,QAAQ;AAAA,IACvB;AAAA,EACF;AAEA,QAAM,OAAO,MAAM,WAEhB,YAAY;AAAA,IACb,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,MAAM;AAAA,MACJ,WAAW,KAAK;AAAA,MAChB,SAAS,KAAK;AAAA,MACd,WAAW,KAAK;AAAA,MAChB,SAAS,KAAK;AAAA,MACd,aAAa;AAAA,QACX,SAAS,KAAK,YAAY;AAAA,QAC1B,iBAAiB,MAAM,KAAK,YAAY,YAAY;AAAA,MACtD;AAAA,MACA,WAAW,KAAK;AAAA,MAChB,YAAY,UAAU,SAAS,KAAK,UAAU;AAAA,MAC9C,cAAc,MAAM,KAAK,SAAS;AAAA,IACpC;AAAA,EACF,CAAC;AAED,QAAM,YAAY,KAAK,UAAU;AAAA,IAC/B,aAAW,QAAQ,SAAS;AAAA,EAC9B;AAEA,QAAM,kBAAkB,4BAA4B;AAAA,IAClD,aAAa;AAAA,IACb,kCAAkC;AAAA;AAAA,MAAiB;AAAA,IAAE;AAAA,IACrD,yBAAyB,UAAU,aAAa,SAAS;AAAA,IACzD,wBAAwB;AAAA,EAC1B,CAAC;AACD,QAAM,EAAE,KAAK,SAAS,IAAI,MAAM,aAAa;AAAA,IAC3C,+BAA+B,CAAC,aAAa,YAAY;AAAA,IACzD,cAAc,CAAC;AAAA,IACf,eAAe,CAAC;AAAA,IAChB,SAAS,KAAK;AAAA,IACd,WAAW,gBAAgB,YAAY,gBAAgB,kBAAkB;AAAA,EAC3E,CAAC;AAED,QAAM,uBAAuB,UAAU,IAAI;AAAA,IACzC;AAAA,IACA;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,SAAS,UAAU;AAAA,IACnB,cAAc,UAAU,UAAU,eAAe;AAAA,IACjD,YAAY,UAAU;AAAA,MACpB,EAAE,cAAc,UAAU,QAAQ;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AACF;","names":[]}