UNPKG

sbtc-bridge-lib

Version:

Library for sBTC Bridge web client and API apps

123 lines (101 loc) 5.7 kB
import { beforeAll, beforeEach, expect, describe, it } from 'vitest' import { amountToBigUint64, bigUint64ToAmount, buildWithdrawPayload, parseWithdrawPayload, PayloadType, parsePayloadFromTransaction } from '../src/index'; import { hex } from '@scure/base'; import assert from 'assert'; import * as btc from '@scure/btc-signer'; import { amountToUint8, getStacksAddressFromPubkey, getStacksAddressFromSignature, getStacksAddressFromSignatureRsv } from '../src/payload_utils'; describe('Withdraw tests', () => { beforeAll(async () => { ////console.log("beforeAll: -----------------------------------------------"); }) beforeEach(async () => { }) it.concurrent('Check hex encoded data lenght', async () => { let s = hex.encode(amountToUint8(30, 1)) console.log('Check hex encoded data lenght: ' + amountToUint8(30, 1)) console.log('Check hex encoded data lenght: ' + s) assert(s === '1e') }) it.concurrent('Check converting numbers to from uint8 arrays works', async () => { let s = hex.encode(amountToBigUint64(42, 8)) //console.log((s)) assert(s === '000000000000002a') let y = bigUint64ToAmount(hex.decode(s)) //console.log((y)) assert(y === 42) //console.log(bigUint64ToAmount(hex.decode('000000000000022b'))) // 0000 0000 0000 03ae s = hex.encode(amountToBigUint64(942, 8)) assert((s) === '00000000000003ae') //console.log('s: ' + (s)); y = bigUint64ToAmount(hex.decode(s)) //console.log('y: ' + y); assert(y === 942) s = hex.encode(amountToBigUint64(5000, 8)) //console.log('s: ' + (s)); y = bigUint64ToAmount(hex.decode(s)) //console.log('y: ' + y); assert(y === 5000) //0000 0000 05f5 e100 s = hex.encode(amountToBigUint64(100000000, 8)) //console.log('s: ' + (s)); y = bigUint64ToAmount(hex.decode(s)) //console.log('y: ' + y); assert(y === 100000000) // 100000000 00000000 /** */ }) it.concurrent('Check parsing and building withdrawal payload 1', async () => { const sig = { publicKey: "032dea00ee2172e11fc18fc3c3ab2712038bf95d7b89330d0195624cc20764e414", signature: "00b9710b4fda0bcf7a066d49f29ed76032c28862e5c496c5c9803501baa6130eb915e992eef765daaebf06acba5efa49ae8e0a438c5f22b03088c9d94dd061ca30" } getStacksAddressFromPubkey(hex.decode(sig.publicKey)) const fromAddress = 'tb1qwe9ddxp6v32uef2v66j00vx6wxax5zat223tms' const stacksAddress = 'ST1NXBK3K5YYMD6FD41MVNP3JS1GABZ8TRVX023PT'; const amount = 800; const payload = buildWithdrawPayload('testnet', amount, sig.signature); //assert(hex.encode(payload) === data); //const tx = new btc.Transaction({ allowUnknowOutput: true, allowUnknownInputs:true, allowUnknownOutputs:true }); //tx.addOutputAddress(fromAddress, BigInt(dust), btc.TEST_NETWORK); const parsedPayload = parseWithdrawPayload('testnet', payload, fromAddress, 'vrs'); //console.log('parsedPayload1: ', parsedPayload); assert(parsedPayload.amountSats === amount); assert(parsedPayload.opcode === '3E'); assert(parsedPayload.signature === sig.signature); // incorrect in data expect(parsedPayload.stacksAddress).equals(stacksAddress); }) it.concurrent('Check parsing and building withdrawal payload 2', async () => { const fromAddress = 'tb1qp8r7ln235zx6nd8rsdzkgkrxc238p6eecys2m9' const stacksAddress = 'ST1NXBK3K5YYMD6FD41MVNP3JS1GABZ8TRVX023PT'; const amount = 942; const sig = { publicKey: "02e30e89dc85db23273fed237c21d4ca495de4fbffbdf8a90d90e902847fb411c7", signature: "00251c10f7e9a650409416fd70a4c9f3467723f3bdbcc6a534c1d11776c6da76df57dfddfb524c01776af0443da6fd7be5e189ec4d42290ee80db2a1e7f08dda5e" } const messageHash = 'b37a0c9bf56598e9d39da2eaf6762c99fd403c61605148a34c505c62271880cc' const addresses = getStacksAddressFromSignature(hex.decode(messageHash), sig.signature) //console.log('Check parsing and building withdrawal payload 2:addresses: ', addresses); //console.log('parsedPayload0: ', addresses); const payload = buildWithdrawPayload('testnet', amount, sig.signature); const parsedPayload = parseWithdrawPayload('testnet', payload, fromAddress, 'vrs'); //console.log('Check parsing and building withdrawal payload 2:parsedPayload: ', parsedPayload); assert(parsedPayload.amountSats === amount); assert(parsedPayload.opcode === '3E'); assert(parsedPayload.signature === sig.signature); //TODO: fix this !!! expect(parsedPayload.stacksAddress).equals(stacksAddress); }) it.concurrent('Parse deposit op_return', async () => { const txHex = '02000000000101b45477dbbb0529da2113432a3a4956de86225db8cbe7d5542e7789cd6a440f6c0100000000ffffffff0300000000000000004f6a4c4c54323e0000000000000315019d9f202861ef9e2d8ec332aac3f60d922ba7d1a98adf46f9416756e6f750639f4a949af7ff0c7b30dc24c0db2bdd7ea70cf3e9096108eb4023b2eca79d35a494f40100000000000016001409c7efcd51a08da9b4e38345645866c2a270eb39d14305000000000016001409c7efcd51a08da9b4e38345645866c2a270eb3902483045022100de9e244dd9bd6f307e979547e088736f54fde25d250e435fe867ddf4948f4d0202207762316984993ef5a8cefad1723eee8f07200437b87f3c141a39c3b150cffd27012103665ca3afcd61141e97aa9706d180514e28ef8fa29e0425e82a78e5e3b25f2b3600000000'; const payload:PayloadType = parsePayloadFromTransaction('testnet', txHex); // incorrect in data expect(payload.stacksAddress).equals('ST1R1061ZT6KPJXQ7PAXPFB6ZAZ6ZWW28G8HXK9G5') expect(payload.amountSats).equals(789) expect(payload.opcode).equals('3E') expect(payload.sbtcWallet).equals('tb1qp8r7ln235zx6nd8rsdzkgkrxc238p6eecys2m9') }) })