UNPKG

@unspent/phi

Version:

a collection of anyone can spend contracts

300 lines (252 loc) 10.2 kB
import { opReturn , hexToBin, binToHex, lockingBytecodeToCashAddress} from "@bitauth/libauth"; import { RegTestWallet } from "mainnet-js"; import { Divide } from "./Divide.js"; import { derivePublicKeyHashHex, createOpReturnData, decodeNullDataScript } from "../../common/util.js"; import { getAnAliceWallet } from "../../test/aliceWallet4test.js"; describe(`Divide Class Tests`, () => { test("Should serialize a Divider", async () => { const payees = [ "bchreg:qpddvxmjndqhqgtt747dqtrqdjjj6yacngmmah489n", "bchreg:qz6285p7l8y9pdaxnr6zpeqqrnhvryxg2vtgn6rtt4", "bchreg:qr83275dydrynk3s2rskr3g2mh34eu88pqar07tslm", "bchreg:qzdf6fnhey0wul647j2953svsy7pjfn98s28vgv2ss", ]; const options = { version: 1, network: "regtest" }; const a = new Divide(4000n, payees, options); const chk = derivePublicKeyHashHex(a.getAddress()); expect(a.toString()).toContain(chk); expect(a.toString()).toContain(`D,1,4000`); const a2 = Divide.fromString(a.toString(), options.network); expect(a.toString()).toEqual(a2.toString()); expect(a.getAddress()).toEqual(a2.getAddress()); expect(a.isTestnet()).toEqual(a2.isTestnet()); }); test("Should deserialize and reserialize a chipnet Divider", async () => { const payees = [ "bchreg:qpddvxmjndqhqgtt747dqtrqdjjj6yacngmmah489n", "bchreg:qz6285p7l8y9pdaxnr6zpeqqrnhvryxg2vtgn6rtt4", "bchreg:qr83275dydrynk3s2rskr3g2mh34eu88pqar07tslm", "bchreg:qzdf6fnhey0wul647j2953svsy7pjfn98s28vgv2ss", ]; const options = { version: 1, network: "chipnet" }; const a = new Divide(3000n, payees, options); const chk = derivePublicKeyHashHex(a.getAddress()); expect(a.toString()).toContain(chk); const a2 = Divide.fromString(a.toString(), "chipnet"); expect(a.toString()).toEqual(a2.toString()); expect(a.getAddress()).toEqual(a2.getAddress()); expect(a.isTestnet()).toEqual(a2.isTestnet()); expect(a.isTestnet()).toEqual(true); }); test("Should deserialize and reserialize a regtest Divider to chunks and opreturn", async () => { const payees = [ "bchreg:qpddvxmjndqhqgtt747dqtrqdjjj6yacngmmah489n", "bchreg:qz6285p7l8y9pdaxnr6zpeqqrnhvryxg2vtgn6rtt4", "bchreg:qr83275dydrynk3s2rskr3g2mh34eu88pqar07tslm", "bchreg:qzdf6fnhey0wul647j2953svsy7pjfn98s28vgv2ss", ]; const options = { version: 1, network: "regtest" }; const d1 = new Divide(3000n, payees, options); const opReturn = d1.toOpReturn(); const d2 = Divide.fromOpReturn(opReturn, "regtest"); expect(d1.toString()).toEqual(d2.toString()); expect(d2.isTestnet()).toEqual(true); expect(d1.getAddress()).toEqual(d2.getAddress()); }); test("Should deserialize and reserialize a regtest Divider to chunks and opreturn", async () => { const payees = [ "bchreg:qpddvxmjndqhqgtt747dqtrqdjjj6yacngmmah489n", "bchreg:qz6285p7l8y9pdaxnr6zpeqqrnhvryxg2vtgn6rtt4", "bchreg:qr83275dydrynk3s2rskr3g2mh34eu88pqar07tslm", "bchreg:qzdf6fnhey0wul647j2953svsy7pjfn98s28vgv2ss", ]; const options = { version: 1, network: "regtest" }; const d1 = new Divide(3000n, payees, options); const opReturn = d1.toOpReturn(); const d2 = Divide.fromOpReturn(opReturn, "regtest"); expect(d1.toString()).toEqual(d2.toString()); expect(d2.isTestnet()).toEqual(true); expect(d1.getAddress()).toEqual(d2.getAddress()); }); test("Should pay a division contract", async () => { const payees = [ "bchreg:qpddvxmjndqhqgtt747dqtrqdjjj6yacngmmah489n", "bchreg:qz6285p7l8y9pdaxnr6zpeqqrnhvryxg2vtgn6rtt4", "bchreg:qr83275dydrynk3s2rskr3g2mh34eu88pqar07tslm", "bchreg:qzdf6fnhey0wul647j2953svsy7pjfn98s28vgv2ss", ]; const options = { version: 1, network: "regtest" }; const d1 = new Divide(1200n, payees, options); const alice = await getAnAliceWallet(42000); await alice.send([ { cashaddr: d1.getAddress(), value: 41200, unit: "sat", }, ]); expect(await d1.getBalance()).toBeGreaterThan(100); const response = await d1.execute(); const receipt = await RegTestWallet.watchOnly( "bchreg:qpddvxmjndqhqgtt747dqtrqdjjj6yacngmmah489n" ); expect(await receipt.getBalance("sat")).toBeGreaterThan(10000); }); test("Should deserialize Divider outputs", async () => { const payees = [ "bchreg:qpddvxmjndqhqgtt747dqtrqdjjj6yacngmmah489n", "bchreg:qz6285p7l8y9pdaxnr6zpeqqrnhvryxg2vtgn6rtt4", "bchreg:qr83275dydrynk3s2rskr3g2mh34eu88pqar07tslm", "bchreg:qzdf6fnhey0wul647j2953svsy7pjfn98s28vgv2ss", ]; const options = { version: 1, network: "regtest" }; const a = new Divide(4000n, payees, options); const chk = derivePublicKeyHashHex(a.getAddress()); const outputs = Divide.parseOutputs(a.toOpReturn()) expect(outputs.length).toBe(5); }); test("Should pay division contract to P2SH addresses", async () => { const options = { version: 1, network: "regtest" }; // faucets 0-3 const payees = [ "bchreg:pzqsz2t07725tp0x5s88pufmzapr3n39rsr7s0sgq4", "bchreg:pr9ye5xfn0kqd3cvsvpsjnhnp6y8ytv87uvrsactvf", "bchreg:pqe3hshcgz7vyhwlgq7p623e5wt053te5c6l2gk4yt", "bchreg:pre45xaukxxkznm38lmke28n094c9gya8gj2yuy2ys", ]; const d1 = new Divide(1200n, payees, options); const alice = await getAnAliceWallet(42000); await alice.send([ { cashaddr: d1.getAddress(), value: 41200, unit: "sat", }, ]); expect(await d1.getBalance()).toBeGreaterThan(100); const response = await d1.execute(alice.getDepositAddress()); const receipt = await RegTestWallet.watchOnly(payees[0]); expect(await receipt.getBalance("sat")).toBeGreaterThan(10000); // ... }); test("Should pay division contract to two P2SH addresses", async () => { const options = { version: 1, network: "regtest" }; // faucets 0-3 const payees = [ "bchreg:pzqsz2t07725tp0x5s88pufmzapr3n39rsr7s0sgq4", "bchreg:pr9ye5xfn0kqd3cvsvpsjnhnp6y8ytv87uvrsactvf", ]; const d1 = new Divide(1200n, payees, options); const alice = await getAnAliceWallet(42000); await alice.send([ { cashaddr: d1.getAddress(), value: 41200, unit: "sat", }, ]); expect(await d1.getBalance()).toBeGreaterThan(100); const response = await d1.execute(alice.getDepositAddress()); const receipt = await RegTestWallet.watchOnly(payees[0]); expect(await receipt.getBalance("sat")).toBeGreaterThan(10000); // ... }); test("Should return info", async () => { const options = { version: 1, network: "regtest" }; const payees = [ "bchreg:pzqsz2t07725tp0x5s88pufmzapr3n39rsr7s0sgq4", "bchreg:pr9ye5xfn0kqd3cvsvpsjnhnp6y8ytv87uvrsactvf", "bchreg:pqe3hshcgz7vyhwlgq7p623e5wt053te5c6l2gk4yt", "bchreg:pre45xaukxxkznm38lmke28n094c9gya8gj2yuy2ys", ]; const c1 = new Divide(1200n, payees, options); const info = await c1.info(false); expect(info).toContain(c1.toString()); expect(info).toContain("balance"); }); test("Should generate OP_RETURN less than 223 bytes for 4 x 32 Bytes addresses", async () => { const options = { version: 2, network: "regtest" }; const p2sh32 = hexToBin( 'aa20000000000000000012345678900000000000000000000000000000000000000087' ); let cashAddrResponse = lockingBytecodeToCashAddress({bytecode:p2sh32, prefix:"bchreg"}) if(typeof cashAddrResponse === `string`) throw (cashAddrResponse) const payees = Array(4).fill(cashAddrResponse.address); const d4 = new Divide(1200n, payees, options); const info = await d4.info(false); expect(info).toContain(d4.toString()); expect(info).toContain("balance"); // console.log(d4.toOpReturn(true)) // // 6a // 04 7574786f // 01 44 // 01 02 // 02 b004 // 23 aa20000000000000000012345678900000000000000000000000000000000000000087 // 23 aa20000000000000000012345678900000000000000000000000000000000000000087 // 23 aa20000000000000000012345678900000000000000000000000000000000000000087 // 23 aa20000000000000000012345678900000000000000000000000000000000000000087 // 23 aa20bc286656f1b943079e04471387f4f7a050cd38d42f5d93ad97dd95a473fdffef87 expect(d4.toOpReturn().length).toBeLessThan(223); }); test("Should pay a division v2 contract to completion", async () => { const payees = [ "bchreg:qpddvxmjndqhqgtt747dqtrqdjjj6yacngmmah489n", "bchreg:qz6285p7l8y9pdaxnr6zpeqqrnhvryxg2vtgn6rtt4", "bchreg:qr83275dydrynk3s2rskr3g2mh34eu88pqar07tslm", "bchreg:qzdf6fnhey0wul647j2953svsy7pjfn98s28vgv2ss", ]; const options = { version: 2, network: "regtest" }; const d1 = new Divide(1200n, payees, options); const alice = await getAnAliceWallet(102000); await alice.send([ { cashaddr: d1.getAddress(), value: 41200, unit: "sat", }, { cashaddr: d1.getAddress(), value: 41200, unit: "sat", }, ]); expect(await d1.getBalance()).toBeGreaterThan(100); await d1.execute(); await d1.execute(); const receipt = await RegTestWallet.watchOnly( "bchreg:qpddvxmjndqhqgtt747dqtrqdjjj6yacngmmah489n" ); expect(await receipt.getBalance("sat")).toBeGreaterThan(20000); expect(await d1.getBalance()).toBe(0n); }); test("Should cat a division v2 debug link", async () => { const payees = [ "bchreg:qpddvxmjndqhqgtt747dqtrqdjjj6yacngmmah489n", "bchreg:qz6285p7l8y9pdaxnr6zpeqqrnhvryxg2vtgn6rtt4", ]; const options = { version: 2, network: "regtest" }; const d1 = new Divide(1200n, payees, options); const alice = await getAnAliceWallet(102000); await alice.send([ { cashaddr: d1.getAddress(), value: 41200, unit: "sat", }, { cashaddr: d1.getAddress(), value: 41200, unit: "sat", }, ]); expect(await d1.getBalance()).toBeGreaterThan(100); let link = await d1.execute(undefined, undefined, undefined, true); expect(link.length).toBeGreaterThan(100); }); });