UNPKG

sbtc-bridge-lib

Version:

Library for sBTC Bridge web client and API apps

152 lines (136 loc) 6.1 kB
import { beforeAll, beforeEach, expect, describe, it } from 'vitest' import { parseDepositPayload, buildDepositPayloadOpDrop, buildDepositPayload, PayloadType, getPegWalletAddressFromPublicKey } from '../src/index'; import { base58, hex } from '@scure/base'; import { commit1 } from './payload.data'; import { fail, deepStrictEqual } from 'assert'; import * as btc from '@scure/btc-signer'; import { parsePayloadFromTransaction } from '../src/payload_utils'; describe('Deposit tests', () => { beforeAll(async () => { }) beforeEach(async () => { }) it.concurrent('Convert wif to private key', async () => { const wif = 'cRGhcDVSoLrPLhweao82kNwZHc4BB3QhXxH6JyJrpJkFmUhr7QRn'; const decWif = base58.decode(wif) let pk; pk = decWif.subarray(0, decWif.length - 4) // last 4 bytes are checksum pk = pk.subarray(1) expect(pk.length).equals(33) expect(hex.encode(pk)).equals('6e16df46e3ca6e21dfcb69cb50836766d378f9eef4fba0ec85022f5f880f463901') }) it.concurrent('Check parsing deposit payload fails for out of date payload', async () => { const script = hex.decode(commit1.commitTxScript?.leaves[0].script); // first byte is length try { const parsedPayload = parseDepositPayload(script.subarray(1)); deepStrictEqual(parsedPayload, { amountSats: 0, cname: undefined, lengthOfCname: 0, lengthOfMemo: 0, memo: undefined, opcode: '3C', prinType: 0, revealFee: 0, stacksAddress: 'ST1R1061ZT6KPJXQ7PAXPFB6ZAZ6ZWW28G8HXK9G5', }) fail('if entres here') } catch (err:any) { expect(err.message.indexOf('Invalid version')); } }) it.concurrent('Check parsing and building deposit simple payload', async () => { const payloadUint8 = buildDepositPayloadOpDrop('testnet', 'ST3N4AJFZZYC4BK99H53XP8KDGXFGQ2PRSPNET8TN', 5000); const payload = payloadUint8 expect(payload).equals('3c051aea4549ffff9845cd298947db226d875f0b8ad8cd000000000000001388') const parsedPayload = parseDepositPayload(hex.decode(payloadUint8)); deepStrictEqual(parsedPayload, { amountSats: 0, cname: undefined, lengthOfCname: 0, lengthOfMemo: 0, memo: undefined, opcode: '3C', prinType: 5, revealFee: 5000, stacksAddress: 'ST3N4AJFZZYC4BK99H53XP8KDGXFGQ2PRSPNET8TN', }) }) it.concurrent('Check parsing and building deposit with stacks principal', async () => { const payload = hex.decode(buildDepositPayloadOpDrop('testnet', 'ST1R1061ZT6KPJXQ7PAXPFB6ZAZ6ZWW28G8HXK9G5', 123456675456)); console.log('Check parsing and building deposit with contract payload: ', hex.encode(payload)) const parsedPayload = parseDepositPayload(payload); deepStrictEqual(parsedPayload, { amountSats: 0, cname: undefined, lengthOfCname: 0, lengthOfMemo: 0, memo: undefined, opcode: '3C', prinType: 5, revealFee: 123456675456, stacksAddress: 'ST1R1061ZT6KPJXQ7PAXPFB6ZAZ6ZWW28G8HXK9G5', }) }) it.concurrent('Check parse and build op_drop', async () => { const payload = hex.decode(buildDepositPayloadOpDrop('testnet', 'ST1R1061ZT6KPJXQ7PAXPFB6ZAZ6ZWW28G8HXK9G5.contract-alpha', 5000)); console.log('Check parsing and building deposit with contract payload: ', hex.encode(payload)) const parsedPayload = parseDepositPayload(payload); deepStrictEqual(parsedPayload, { amountSats: 0, cname: 'contract-alpha', lengthOfCname: 14, lengthOfMemo: 0, memo: undefined, opcode: '3C', prinType: 6, revealFee: 5000, stacksAddress: 'ST1R1061ZT6KPJXQ7PAXPFB6ZAZ6ZWW28G8HXK9G5', }) }) it.concurrent('Check parse and build op_return', async () => { const payload = hex.decode(buildDepositPayload('testnet', 'ST1R1061ZT6KPJXQ7PAXPFB6ZAZ6ZWW28G8HXK9G5.contract-alpha')); console.log('Check parsing and building deposit with contract payload: ', hex.encode(payload)) const parsedPayload = parseDepositPayload(payload); deepStrictEqual(parsedPayload, { amountSats: 0, cname: 'contract-alpha', lengthOfCname: 14, lengthOfMemo: 0, memo: undefined, opcode: '3C', prinType: 6, revealFee: 0, stacksAddress: 'ST1R1061ZT6KPJXQ7PAXPFB6ZAZ6ZWW28G8HXK9G5', }) }) it.concurrent('Check parsing and building deposit with contract and memo payload', async () => { const payload = hex.decode(buildDepositPayloadOpDrop('testnet', 'ST1R1061ZT6KPJXQ7PAXPFB6ZAZ6ZWW28G8HXK9G5.contract', 5000)); const parsedPayload = parseDepositPayload(payload); deepStrictEqual(parsedPayload, { amountSats: 0, cname: 'contract', lengthOfCname: 8, lengthOfMemo: 0, memo: undefined, opcode: '3C', prinType: 6, revealFee: 5000, stacksAddress: 'ST1R1061ZT6KPJXQ7PAXPFB6ZAZ6ZWW28G8HXK9G5', }) }) it.concurrent('Parse deposit op_return', async () => { const txHex = '020000000001011c00ea110c259be6cb25d2862e99fd2227081d9007969789fc57ca938f435f1b0300000000ffffffff0300000000000000001b6a1958323c1a7010183fd1a76976e7b2bb67acdf57cdfe704882006400000000000000225120d1f244f7d308f1940aa66ca802ee12268a6442e2c5984d571b76509173de629d355d05000000000016001409c7efcd51a08da9b4e38345645866c2a270eb390247304402201ed151e47f842d211467016fd12e8310e12631540050a0d141885c516bdbb9820220494b426466600ce0903b455a095c0ab779bc003d59c1a4d7a283de40e3ab2dd5012103665ca3afcd61141e97aa9706d180514e28ef8fa29e0425e82a78e5e3b25f2b3600000000'; const payload:PayloadType = parsePayloadFromTransaction('testnet', txHex); console.log('Parse deposit op_return:', payload) expect(payload.stacksAddress).equals('ST1R1061ZT6KPJXQ7PAXPFB6ZAZ6ZWW28G8HXK9G5') expect(payload.amountSats).equals(100) expect(payload.opcode).equals('3C') expect(payload.sbtcWallet).equals('tb1p68eyfa7nprcegz4xdj5q9msjy69xgshzckvy64cmwegfzu77v2wslah8ww') expect(payload.spendingAddress).equals('tb1qp8r7ln235zx6nd8rsdzkgkrxc238p6eecys2m9') expect(payload.prinType).equals(0) }) })