@lifestonelabs/tokensales 1.0.4 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # Changelog
2
2
  ______________________________________________________________
3
+ ## [1.0.5] - 2026-02-09
4
+ ### Changed
5
+ - `buyNFT` fixed logic so that a MintingNFT owner for the categoryID can purchase tickets for 1000sats rather than paying full price.
6
+ Also adjusted miner fee up to 1700sats
7
+ ______________________________________________________________
3
8
  ## [1.0.4] - 2026-02-08
4
9
  ### Changed
5
10
  - `listAvailableTickets` removed blockheight check so this will always return the NFTs of the requested categoryID on the contract.
package/README.md CHANGED
@@ -5,7 +5,7 @@ A TypeScript library for interacting with TokenSales contracts on Bitcoin Cash.
5
5
  ## Installation
6
6
 
7
7
  ```bash
8
- npm install tokensales
8
+ npm install @lifestonelabs/tokensales
9
9
  ```
10
10
 
11
11
  ## Signing Transactions
@@ -1 +1 @@
1
- {"version":3,"file":"buyNFT.d.ts","sourceRoot":"","sources":["../../src/functions/buyNFT.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,8BAA8B,EAAE,MAAM,UAAU,CAAC;AAIxE;;;;;GAKG;AACH,wBAAsB,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,8BAA8B,CAAC,CAoT1F"}
1
+ {"version":3,"file":"buyNFT.d.ts","sourceRoot":"","sources":["../../src/functions/buyNFT.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,8BAA8B,EAAE,MAAM,UAAU,CAAC;AAIxE;;;;;GAKG;AACH,wBAAsB,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,8BAA8B,CAAC,CA2T1F"}
@@ -1 +1 @@
1
- {"version":3,"file":"listActiveSales.d.ts","sourceRoot":"","sources":["../../src/functions/listActiveSales.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAIhE;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAkD7F"}
1
+ {"version":3,"file":"listActiveSales.d.ts","sourceRoot":"","sources":["../../src/functions/listActiveSales.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAIhE;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAkD7F"}
@@ -1 +1 @@
1
- {"version":3,"file":"listAllSales.d.ts","sourceRoot":"","sources":["../../src/functions/listAllSales.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAI7D;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CA+BvF"}
1
+ {"version":3,"file":"listAllSales.d.ts","sourceRoot":"","sources":["../../src/functions/listAllSales.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAI7D;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CA+BvF"}
@@ -2,9 +2,9 @@ import { Utxo } from 'cashscript';
2
2
  import { ListAvailableTicketsParams } from '../types';
3
3
  /**
4
4
  * List available tickets for purchase from a TokenSale
5
- * Returns ALL UTXOs matching the categoryID, excluding the TokenSale NFT (minting capability)
6
5
  * @param params - ListAvailableTicketsParams object containing all required parameters
7
- * @returns Promise resolving to array of ticket UTXOs (excluding the TokenSale NFT)
6
+ * @returns Promise resolving to array of ticket UTXOs that are available for purchase
7
+ * @throws Error if validation fails or TokenSale is not found/active
8
8
  */
9
9
  export declare function listAvailableTickets(params: ListAvailableTicketsParams): Promise<Utxo[]>;
10
10
  //# sourceMappingURL=listAvailableTickets.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"listAvailableTickets.d.ts","sourceRoot":"","sources":["../../src/functions/listAvailableTickets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,0BAA0B,EAAE,MAAM,UAAU,CAAC;AAItD;;;;;GAKG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,0BAA0B,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CA4C9F"}
1
+ {"version":3,"file":"listAvailableTickets.d.ts","sourceRoot":"","sources":["../../src/functions/listAvailableTickets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,0BAA0B,EAAE,MAAM,UAAU,CAAC;AAItD;;;;;GAKG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,0BAA0B,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAoD9F"}
package/dist/index.esm.js CHANGED
@@ -668,16 +668,24 @@ async function buyNFT(params) {
668
668
  commitment: ticketUtxo.token?.nft?.commitment + ticketType // ticketType appended to commitment
669
669
  }
670
670
  },
671
- })
672
- // Ticket price is sent to admin address
673
- .addOutput({
674
- to: adminAddress,
675
- amount: ticketPrice,
676
671
  });
672
+ // Ticket price is sent to admin address
673
+ if (isAdmin) {
674
+ transaction.addOutput({
675
+ to: adminAddress,
676
+ amount: 1000n,
677
+ });
678
+ }
679
+ else {
680
+ transaction.addOutput({
681
+ to: adminAddress,
682
+ amount: ticketPrice,
683
+ });
684
+ }
677
685
  if (isAdmin) {
678
686
  transaction.addOutput({
679
687
  to: userTokenAddress,
680
- amount: userUTXO.satoshis - 2000n,
688
+ amount: userUTXO.satoshis - 2700n,
681
689
  token: {
682
690
  amount: userUTXO.token?.amount,
683
691
  category: userUTXO.token?.category,
@@ -690,7 +698,7 @@ async function buyNFT(params) {
690
698
  }
691
699
  else {
692
700
  // Calculate change amount (userUTXO - ticketPrice - miner fee)
693
- const changeAmount = userUTXO.satoshis - ticketPrice - 2000n;
701
+ const changeAmount = userUTXO.satoshis - ticketPrice - 1700n;
694
702
  if (changeAmount > 1000n) { // Dust limit
695
703
  transaction.addOutput({
696
704
  to: normalizedUserAddress,
@@ -1458,9 +1466,9 @@ function getContractAddresses() {
1458
1466
 
1459
1467
  /**
1460
1468
  * List available tickets for purchase from a TokenSale
1461
- * Returns ALL UTXOs matching the categoryID, excluding the TokenSale NFT (minting capability)
1462
1469
  * @param params - ListAvailableTicketsParams object containing all required parameters
1463
- * @returns Promise resolving to array of ticket UTXOs (excluding the TokenSale NFT)
1470
+ * @returns Promise resolving to array of ticket UTXOs that are available for purchase
1471
+ * @throws Error if validation fails or TokenSale is not found/active
1464
1472
  */
1465
1473
  async function listAvailableTickets(params) {
1466
1474
  const { electrumProvider, categoryID } = params;
@@ -1484,8 +1492,14 @@ async function listAvailableTickets(params) {
1484
1492
  if (!tokenSaleUtxo) {
1485
1493
  throw new Error(`No active TokenSale found for category ${categoryID}`);
1486
1494
  }
1487
- // Return all UTXOs EXCEPT the TokenSale NFT (minting capability)
1488
- const availableTickets = categoryUtxos.filter((utxo) => !isTicketMaster(utxo));
1495
+ // Parse the TokenSale commitment to get endSale block height
1496
+ const commitment = tokenSaleUtxo.token?.nft?.commitment || '';
1497
+ const tokenSaleData = parseTicketMasterCommitment(commitment);
1498
+ if (!tokenSaleData) {
1499
+ throw new Error('Failed to parse TokenSale commitment');
1500
+ }
1501
+ // Filter to only ticket UTXOs (capability === 'none')
1502
+ const availableTickets = categoryUtxos.filter((utxo) => isTicket(utxo, categoryID));
1489
1503
  return availableTickets;
1490
1504
  }
1491
1505
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/utils/signTransaction.ts","../src/utils/ticketMaster.ts","../src/utils/toTokenAddress.ts","../src/utils/index.ts","../src/functions/buyNFT.ts","../src/functions/modifyTokenSale.ts","../src/functions/burn.ts","../src/functions/addSatoshis.ts","../src/constants/values.ts","../src/functions/createListing.ts","../src/config.ts","../src/functions/listAvailableTickets.ts","../src/functions/listAllSales.ts","../src/functions/listActiveSales.ts"],"sourcesContent":["import { stringify } from '@bitauth/libauth';\r\n\r\n/**\r\n * Creates a signTransaction function for WalletConnect v2\r\n * This function handles transaction signing through WalletConnect's SignClient\r\n * \r\n * @param signClient - The WalletConnect SignClient instance\r\n * @param connectedChain - The connected chain ID (fallback if not found in session)\r\n * @returns A function that signs transactions via WalletConnect\r\n */\r\nexport function createSignTransaction(\r\n signClient: any,\r\n connectedChain?: string\r\n): (transactionOptions: any) => Promise<any> {\r\n return async (transactionOptions: any) => {\r\n if (!signClient) {\r\n throw new Error('SignClient not available. Please ensure wallet is connected.');\r\n }\r\n \r\n // Get all active sessions\r\n const sessions = signClient.session.getAll();\r\n \r\n if (sessions.length === 0) {\r\n throw new Error('No active wallet session. Please connect your wallet first.');\r\n }\r\n \r\n // Use the first active session\r\n const session = sessions[0];\r\n \r\n // Extract chainId from session\r\n // In WalletConnect v2, chainId is in the accounts array as \"chainId:address\"\r\n let chainId: string | null = null;\r\n \r\n const namespaces = session.namespaces || {};\r\n const bchNamespace = namespaces.bch;\r\n \r\n if (bchNamespace && bchNamespace.accounts && bchNamespace.accounts.length > 0) {\r\n // Extract chainId from first account (format: \"chainId:address\")\r\n const firstAccount = bchNamespace.accounts[0];\r\n const accountParts = firstAccount.split(':');\r\n if (accountParts.length >= 2) {\r\n // Reconstruct chainId (could be \"bch:mainnet\" or \"bch:bchtest:chipnet\")\r\n chainId = accountParts.slice(0, -1).join(':'); // Everything except the address part\r\n }\r\n }\r\n \r\n // Fallback: try to find chainId from any namespace\r\n if (!chainId) {\r\n for (const namespaceKey in namespaces) {\r\n const namespace = namespaces[namespaceKey];\r\n if (namespace.accounts && namespace.accounts.length > 0) {\r\n const firstAccount = namespace.accounts[0];\r\n const accountParts = firstAccount.split(':');\r\n if (accountParts.length >= 2 && accountParts[0].includes('bch')) {\r\n chainId = accountParts.slice(0, -1).join(':');\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n \r\n // Final fallback\r\n if (!chainId) {\r\n chainId = connectedChain || 'bch:mainnet';\r\n }\r\n \r\n // Use the same pattern as the working project: JSON.parse(stringify(obj))\r\n // stringify from @bitauth/libauth handles BigInt and Uint8Array serialization\r\n const serializableTxObj = JSON.parse(stringify(transactionOptions));\r\n \r\n try {\r\n const result = await signClient.request({\r\n chainId,\r\n topic: session.topic,\r\n request: {\r\n method: 'bch_signTransaction',\r\n params: serializableTxObj,\r\n },\r\n });\r\n return result;\r\n } catch (error: any) {\r\n // Handle WalletConnect relay errors gracefully\r\n if (error?.message?.includes('onRelayMessage') || error?.message?.includes('failed to process')) {\r\n // The transaction might still have been signed, so we'll let the caller handle it\r\n }\r\n throw error;\r\n }\r\n };\r\n}\r\n\r\n","/**\r\n * Utility functions for parsing TicketMaster NFT data\r\n */\r\n\r\nexport interface TicketMasterData {\r\n priceType1: bigint;\r\n priceType2: bigint;\r\n priceType3: bigint;\r\n endSale: number;\r\n adminPubKeyHash: string;\r\n}\r\n\r\n/**\r\n * Parses TicketMaster NFT commitment to extract sale data\r\n * Commitment format:\r\n * - bytes5 priceType1 (0-5)\r\n * - bytes5 priceType2 (5-10)\r\n * - bytes5 priceType3 (10-15)\r\n * - bytes4 endSale (15-19)\r\n * - bytes20 adminPubKeyHash (19-39)\r\n */\r\nexport function parseTicketMasterCommitment(commitment: string): TicketMasterData | null {\r\n if (!commitment || commitment.length < 78) { // 39 bytes = 78 hex chars\r\n return null;\r\n }\r\n\r\n try {\r\n // Extract priceType1 (bytes5 = 10 hex chars, positions 0-10)\r\n // CashScript stores numbers in little-endian format\r\n const priceType1Hex = commitment.substring(0, 10);\r\n const priceType1BE = priceType1Hex.match(/.{2}/g)?.reverse().join('') || priceType1Hex;\r\n const priceType1 = BigInt('0x' + priceType1BE);\r\n\r\n // Extract priceType2 (bytes5 = 10 hex chars, positions 10-20)\r\n const priceType2Hex = commitment.substring(10, 20);\r\n const priceType2BE = priceType2Hex.match(/.{2}/g)?.reverse().join('') || priceType2Hex;\r\n const priceType2 = BigInt('0x' + priceType2BE);\r\n\r\n // Extract priceType3 (bytes5 = 10 hex chars, positions 20-30)\r\n const priceType3Hex = commitment.substring(20, 30);\r\n const priceType3BE = priceType3Hex.match(/.{2}/g)?.reverse().join('') || priceType3Hex;\r\n const priceType3 = BigInt('0x' + priceType3BE);\r\n\r\n // Extract endSale (bytes4 = 8 hex chars, positions 30-38)\r\n // CashScript stores numbers in little-endian format\r\n // Contract uses: bytes endSale = tx.inputs[0].nftCommitment.slice(15,19);\r\n // This is bytes 15-19 (0-indexed), which is hex positions 30-38\r\n const endSaleHex = commitment.substring(30, 38);\r\n const endSaleBE = endSaleHex.match(/.{2}/g)?.reverse().join('') || endSaleHex;\r\n const endSale = parseInt(endSaleBE, 16);\r\n\r\n // Extract adminPubKeyHash (bytes20 = 40 hex chars, positions 38-78)\r\n const adminPubKeyHash = commitment.substring(38, 78);\r\n\r\n return {\r\n priceType1,\r\n priceType2,\r\n priceType3,\r\n endSale,\r\n adminPubKeyHash,\r\n };\r\n } catch (error) {\r\n console.error('Failed to parse TicketMaster commitment:', error);\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Checks if a UTXO is a TicketMaster (has minting capability)\r\n */\r\nexport function isTicketMaster(utxo: any): boolean {\r\n return (\r\n utxo?.token?.nft?.capability === 'minting' &&\r\n utxo?.token?.nft?.commitment &&\r\n utxo.token.nft.commitment.length >= 78\r\n );\r\n}\r\n\r\n/**\r\n * Checks if a UTXO is a ticket (same category as TicketMaster but immutable)\r\n */\r\nexport function isTicket(utxo: any, ticketMasterCategory: string): boolean {\r\n return (\r\n utxo?.token?.category === ticketMasterCategory &&\r\n utxo?.token?.nft?.capability === 'none'\r\n );\r\n}\r\n\r\n/**\r\n * Formats satoshis to BCH\r\n */\r\nexport function formatBCH(satoshis: bigint | number | string): string {\r\n const sats = typeof satoshis === 'string' ? BigInt(satoshis) : BigInt(satoshis);\r\n const bch = Number(sats) / 100000000;\r\n return bch.toFixed(8);\r\n}\r\n\r\n","import { decodeCashAddress, encodeCashAddress } from '@bitauth/libauth';\r\n\r\n/**\r\n * Converts a regular Bitcoin Cash address to its token address equivalent\r\n * @param address - Bitcoin Cash address (p2pkh)\r\n * @returns Token address (p2pkhWithTokens)\r\n */\r\nfunction toTokenAddress(address: string): string {\r\n const addressInfo: any = decodeCashAddress(address);\r\n const pkhPayoutBin = addressInfo.payload;\r\n const prefix = addressInfo.prefix;\r\n const tokenAddressResult = encodeCashAddress({prefix, type: \"p2pkhWithTokens\", payload: pkhPayoutBin});\r\n \r\n // In libauth v3, encodeCashAddress returns a CashAddressResult object\r\n if (typeof tokenAddressResult === 'string') {\r\n return tokenAddressResult;\r\n }\r\n return tokenAddressResult.address;\r\n}\r\n\r\nexport default toTokenAddress;\r\n\r\n","/**\r\n * Shared utility functions\r\n */\r\n\r\nexport { createSignTransaction } from './signTransaction';\r\nexport { parseTicketMasterCommitment, formatBCH, isTicketMaster, isTicket, type TicketMasterData } from './ticketMaster';\r\nexport { default as toTokenAddress } from './toTokenAddress';\r\n\r\n/**\r\n * Ensures an address has the bitcoincash: prefix for libauth functions\r\n * Addresses from AppKit may come without the prefix after normalization\r\n */\r\nexport function ensureAddressPrefix(address: string): string {\r\n // If address already has a prefix, return as-is\r\n if (address.includes(':')) {\r\n return address;\r\n }\r\n \r\n // Add bitcoincash: prefix for mainnet addresses\r\n // Addresses starting with 'q' or 'p' are mainnet\r\n if (address.startsWith('q') || address.startsWith('p')) {\r\n return `bitcoincash:${address}`;\r\n }\r\n \r\n // For testnet addresses starting with 'bchtest:' or 'q'/'p' on testnet\r\n // This is a simple check - you may need to adjust based on your network\r\n return `bitcoincash:${address}`;\r\n}\r\n\r\n/**\r\n * Converts hex string to Uint8Array\r\n */\r\nexport function hexToUint8Array(hexString: string): Uint8Array {\r\n const bytes = new Uint8Array(hexString.length / 2);\r\n for (let i = 0; i < bytes.length; i++) {\r\n bytes[i] = parseInt(hexString.substr(i * 2, 2), 16);\r\n }\r\n return bytes;\r\n}\r\n\r\n/**\r\n * Converts a number to little-endian hex string\r\n * @param number - The number to convert\r\n * @param byteCount - Number of bytes (e.g., 5 for bytes5, 4 for bytes4)\r\n */\r\nexport function toLittleEndianHexString(number: bigint | number, byteCount: number): string {\r\n const num = typeof number === 'bigint' ? number : BigInt(number);\r\n let hex = num.toString(16);\r\n hex = hex.padStart(byteCount * 2, '0'); // Pad with zeros to ensure correct byteCount\r\n // Split into chunks of 2 (bytes), reverse (for little endian), and join back\r\n return hex.match(/../g)?.reverse().join('') ?? '';\r\n}\r\n\r\n","import { TransactionBuilder, Contract, Utxo, Unlocker } from 'cashscript';\r\nimport { hexToBin, cashAddressToLockingBytecode, decodeTransaction, encodeCashAddress } from '@bitauth/libauth';\r\nimport { BuyNFTParams, WalletConnectTransactionObject } from '../types';\r\nimport { ensureAddressPrefix, hexToUint8Array, toTokenAddress } from '../utils';\r\nimport contractArtifact from '../artifacts/TokenSales.json';\r\n\r\n/**\r\n * Purchase a ticket NFT from a TicketMaster\r\n * @param params - BuyNFTParams object containing all required parameters\r\n * @returns Promise resolving to WalletConnectTransactionObject ready for signing\r\n * @throws Error if validation fails or transaction building fails\r\n */\r\nexport async function buyNFT(params: BuyNFTParams): Promise<WalletConnectTransactionObject> {\r\n const {\r\n electrumProvider,\r\n usersAddress,\r\n ticketMasterUtxo,\r\n ticketUtxo,\r\n ticketType,\r\n isAdmin\r\n } = params;\r\n\r\n if (!electrumProvider) {\r\n throw new Error('Electrum provider not available');\r\n }\r\n\r\n // Compile the contract using the included artifact\r\n const ticketMasterContract = new Contract(contractArtifact as any, [], {\r\n provider: electrumProvider,\r\n addressType: 'p2sh32'\r\n });\r\n\r\n // Parse TicketMaster commitment to get price and admin address\r\n const commitment = ticketMasterUtxo.token?.nft?.commitment || '';\r\n if (commitment.length !== 78) {\r\n throw new Error('Invalid TicketMaster commitment');\r\n }\r\n\r\n // Extract price based on ticket type (little-endian format)\r\n let ticketPrice: bigint;\r\n let priceHex: string;\r\n \r\n if (ticketType === '01') {\r\n priceHex = commitment.substring(0, 10);\r\n const priceBE = priceHex.match(/.{2}/g)?.reverse().join('') || priceHex;\r\n ticketPrice = BigInt('0x' + priceBE);\r\n } else if (ticketType === '02') {\r\n priceHex = commitment.substring(10, 20);\r\n const priceBE = priceHex.match(/.{2}/g)?.reverse().join('') || priceHex;\r\n ticketPrice = BigInt('0x' + priceBE);\r\n if (ticketPrice === 0n) {\r\n throw new Error('Ticket type 2 is not available');\r\n }\r\n } else if (ticketType === '03') {\r\n priceHex = commitment.substring(20, 30);\r\n const priceBE = priceHex.match(/.{2}/g)?.reverse().join('') || priceHex;\r\n ticketPrice = BigInt('0x' + priceBE);\r\n if (ticketPrice === 0n) {\r\n throw new Error('Ticket type 3 is not available');\r\n }\r\n } else {\r\n throw new Error('Invalid ticket type');\r\n }\r\n\r\n // Extract admin pubkey hash (bytes20 = 40 hex chars, positions 38-78)\r\n const adminPubKeyHashHex = commitment.substring(38, 78);\r\n \r\n // Convert hex string to Uint8Array\r\n const adminPKHUint8Array = hexToUint8Array(adminPubKeyHashHex);\r\n \r\n // Derive admin address from embedded pubkey hash\r\n const prefix = 'bitcoincash';\r\n const addressType = 'p2pkh';\r\n const adminAddressResult = encodeCashAddress({\r\n prefix,\r\n type: addressType,\r\n payload: adminPKHUint8Array\r\n });\r\n \r\n if (typeof adminAddressResult === 'string') {\r\n throw new Error(`Failed to encode admin address: ${adminAddressResult}`);\r\n }\r\n const adminAddress = adminAddressResult.address;\r\n \r\n // Get contract address from compiled contract\r\n const contractAddr = ticketMasterContract.address;\r\n \r\n // Convert address to locking bytecode\r\n const contractLockingBytecodeResult = cashAddressToLockingBytecode(contractAddr);\r\n if (typeof contractLockingBytecodeResult === 'string') {\r\n throw new Error(`Failed to convert contract address to locking bytecode: ${contractLockingBytecodeResult}`);\r\n }\r\n\r\n // Creating lockingBytecode for usersAddress\r\n const normalizedUserAddress = ensureAddressPrefix(usersAddress);\r\n const userTokenAddress = toTokenAddress(normalizedUserAddress);\r\n const lockingBytecodeResult = cashAddressToLockingBytecode(normalizedUserAddress);\r\n if (typeof lockingBytecodeResult === 'string') {\r\n throw new Error(`Failed to convert user address to locking bytecode: ${lockingBytecodeResult}`);\r\n }\r\n\r\n // Get user UTXOs\r\n const userUtxos = await electrumProvider.getUtxos(normalizedUserAddress);\r\n\r\n // Get userUTXO\r\n let userUTXO: Utxo | undefined;\r\n if (isAdmin) {\r\n userUTXO = userUtxos.find(\r\n utxo => utxo.token?.category === ticketMasterUtxo.token?.category && \r\n utxo.token?.nft?.capability === 'minting'\r\n );\r\n } else {\r\n // Find pure BCH payment UTXO (need ticketPrice & 3000+ sats for miner fee)\r\n userUTXO = userUtxos.find(\r\n utxo => utxo.satoshis >= (ticketPrice + 3000n) && !utxo.token,\r\n );\r\n\r\n if (!userUTXO) {\r\n // Count up all the sats in userUTXOs that do not have a token\r\n const totalSats = userUtxos.reduce((sum: bigint, utxo: Utxo) => {\r\n if (!utxo.token) {\r\n return sum + utxo.satoshis;\r\n }\r\n return sum;\r\n }, 0n);\r\n\r\n // If totalSats is enough, then user needs to consolidate\r\n if (totalSats >= ticketPrice + 3000n) {\r\n throw new Error('No compatible UTXO found in wallet, consolidate?');\r\n } else {\r\n throw new Error(`Not enough BCH in your wallet. Required: ${ticketPrice + 3000n} sats, Available: ${totalSats} sats`);\r\n }\r\n }\r\n }\r\n\r\n if (!userUTXO) {\r\n throw new Error('No suitable UTXO found for transaction');\r\n }\r\n\r\n // Build Transaction\r\n const p2pkhUnlocker: Unlocker = {\r\n generateLockingBytecode: () => {\r\n const result = cashAddressToLockingBytecode(normalizedUserAddress);\r\n if (typeof result === 'string') {\r\n throw new Error(`Failed to convert CashAddress to locking bytecode: ${result}`);\r\n }\r\n return result.bytecode;\r\n },\r\n generateUnlockingBytecode: () => {\r\n return Uint8Array.from([]);\r\n }\r\n };\r\n \r\n let transaction: any;\r\n try {\r\n transaction = await new TransactionBuilder({ provider: electrumProvider })\r\n .addInput(ticketMasterUtxo, ticketMasterContract.unlock.purchaseNFT(ticketType))\r\n .addInput(ticketUtxo, ticketMasterContract.unlock.purchaseNFT(ticketType))\r\n .addInput(userUTXO, p2pkhUnlocker)\r\n // Ticket master NFT being sent back to contract\r\n .addOutput({\r\n to: ticketMasterContract.tokenAddress, \r\n amount: ticketMasterUtxo.satoshis,\r\n token: {\r\n amount: ticketMasterUtxo.token?.amount!, \r\n category: ticketMasterUtxo.token?.category!, \r\n nft: {\r\n capability: ticketMasterUtxo.token?.nft?.capability!, \r\n commitment: ticketMasterUtxo.token?.nft?.commitment! \r\n }\r\n },\r\n })\r\n // Ticket being purchased\r\n .addOutput({\r\n to: userTokenAddress, \r\n amount: ticketUtxo.satoshis,\r\n token: {\r\n amount: ticketUtxo.token?.amount!, \r\n category: ticketUtxo.token?.category!, \r\n nft: {\r\n capability: ticketUtxo.token?.nft?.capability!, \r\n commitment: ticketUtxo.token?.nft?.commitment! + ticketType // ticketType appended to commitment\r\n }\r\n },\r\n })\r\n // Ticket price is sent to admin address\r\n .addOutput({\r\n to: adminAddress, \r\n amount: ticketPrice,\r\n });\r\n\r\n if (isAdmin) {\r\n transaction.addOutput({\r\n to: userTokenAddress, \r\n amount: userUTXO.satoshis - 2000n,\r\n token: {\r\n amount: userUTXO.token?.amount!, \r\n category: userUTXO.token?.category!, \r\n nft: {\r\n capability: userUTXO.token?.nft?.capability!, \r\n commitment: userUTXO.token?.nft?.commitment! \r\n }\r\n },\r\n });\r\n } else {\r\n // Calculate change amount (userUTXO - ticketPrice - miner fee)\r\n const changeAmount = userUTXO.satoshis - ticketPrice - 2000n;\r\n if (changeAmount > 1000n) { // Dust limit\r\n transaction.addOutput({\r\n to: normalizedUserAddress, \r\n amount: changeAmount\r\n });\r\n }\r\n }\r\n } catch (error) {\r\n if (error instanceof Error) {\r\n throw new Error(`Error building transaction: ${error.message}`);\r\n } else {\r\n throw new Error(`Error building transaction: ${String(error)}`);\r\n }\r\n }\r\n\r\n // Build the transaction\r\n const rawTransactionHex = await transaction.build();\r\n\r\n // Decode transaction for WalletConnect\r\n const decodedTransaction = decodeTransaction(hexToBin(rawTransactionHex));\r\n if (typeof decodedTransaction === \"string\") {\r\n throw new Error(\"Failed to decode transaction\");\r\n }\r\n\r\n // Clear unlocking bytecode for user input (input 2)\r\n decodedTransaction.inputs[2].unlockingBytecode = Uint8Array.from([]);\r\n\r\n // Convert hex strings to Uint8Array for token data\r\n const binTokenCategory = hexToBin(ticketMasterUtxo.token?.category!);\r\n const binTicketMasterCommitment = hexToBin(ticketMasterUtxo.token?.nft?.commitment!);\r\n const binTicketCommitment = hexToBin(ticketUtxo.token?.nft?.commitment!);\r\n const binUserCommitment = isAdmin ? hexToBin(userUTXO.token?.nft?.commitment!) : undefined;\r\n\r\n // Get redeemScript as Uint8Array\r\n const getRedeemScript = (): Uint8Array => {\r\n if ((ticketMasterContract.redeemScript as any).bytecode) {\r\n return (ticketMasterContract.redeemScript as any).bytecode;\r\n }\r\n if (typeof ticketMasterContract.redeemScript === 'string') {\r\n return hexToBin(ticketMasterContract.redeemScript);\r\n }\r\n return new Uint8Array(ticketMasterContract.redeemScript as any);\r\n };\r\n\r\n const redeemScript = getRedeemScript();\r\n\r\n // Construct source outputs for WalletConnect\r\n // Use raw Uint8Arrays and BigInts - stringify from @bitauth/libauth will handle serialization\r\n let listSourceOutputs = [\r\n {\r\n ...decodedTransaction.inputs[0],\r\n lockingBytecode: contractLockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(ticketMasterUtxo.satoshis),\r\n contract: {\r\n abiFunction: ticketMasterContract.artifact.abi,\r\n redeemScript: redeemScript,\r\n artifact: ticketMasterContract.artifact,\r\n },\r\n token: {\r\n amount: ticketMasterUtxo.token?.amount,\r\n category: binTokenCategory,\r\n nft: {\r\n capability: ticketMasterUtxo.token?.nft?.capability!,\r\n commitment: binTicketMasterCommitment\r\n }\r\n }\r\n },\r\n {\r\n ...decodedTransaction.inputs[1],\r\n lockingBytecode: contractLockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(ticketUtxo.satoshis),\r\n contract: {\r\n abiFunction: ticketMasterContract.artifact.abi,\r\n redeemScript: redeemScript,\r\n artifact: ticketMasterContract.artifact,\r\n },\r\n token: {\r\n amount: ticketUtxo.token?.amount,\r\n category: binTokenCategory,\r\n nft: {\r\n capability: ticketUtxo.token?.nft?.capability!,\r\n commitment: binTicketCommitment\r\n }\r\n }\r\n },\r\n ...(isAdmin ? [{\r\n ...decodedTransaction.inputs[2],\r\n lockingBytecode: lockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(userUTXO.satoshis),\r\n token: {\r\n amount: userUTXO.token?.amount,\r\n category: binTokenCategory,\r\n nft: {\r\n capability: userUTXO.token?.nft?.capability!,\r\n commitment: binUserCommitment!\r\n }\r\n }\r\n }] : [{\r\n ...decodedTransaction.inputs[2],\r\n lockingBytecode: lockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(userUTXO.satoshis),\r\n }])\r\n ];\r\n\r\n // Create transaction object for WalletConnect signing\r\n const wcTransactionObj: WalletConnectTransactionObject = {\r\n transaction: decodedTransaction,\r\n sourceOutputs: listSourceOutputs,\r\n broadcast: false,\r\n userPrompt: `Purchase Ticket Type ${ticketType} for ${ticketPrice} sats`\r\n };\r\n\r\n return wcTransactionObj;\r\n}\r\n\r\n","import { TransactionBuilder, Contract, Utxo, Unlocker } from 'cashscript';\r\nimport { hexToBin, cashAddressToLockingBytecode, decodeTransaction } from '@bitauth/libauth';\r\nimport { ModifyTokenSaleParams, WalletConnectTransactionObject } from '../types';\r\nimport { ensureAddressPrefix, toLittleEndianHexString, toTokenAddress } from '../utils';\r\nimport contractArtifact from '../artifacts/TokenSales.json';\r\n\r\n/**\r\n * Modify TokenSale parameters (prices, endSale)\r\n * @param params - ModifyTokenSaleParams object containing all required parameters\r\n * @returns Promise resolving to WalletConnectTransactionObject ready for signing\r\n * @throws Error if validation fails or transaction building fails\r\n */\r\nexport async function modifyTokenSale(params: ModifyTokenSaleParams): Promise<WalletConnectTransactionObject> {\r\n const {\r\n electrumProvider,\r\n usersAddress,\r\n tokenSaleUtxo,\r\n userMintingUtxo,\r\n priceType1,\r\n priceType2,\r\n priceType3,\r\n endSale\r\n } = params;\r\n\r\n if (!electrumProvider) {\r\n throw new Error('Electrum provider not available');\r\n }\r\n\r\n // Compile the contract using the included artifact\r\n const tokenSaleContract = new Contract(contractArtifact as any, [], {\r\n provider: electrumProvider,\r\n addressType: 'p2sh32'\r\n });\r\n\r\n // Parse TokenSale commitment to validate\r\n const commitment = tokenSaleUtxo.token?.nft?.commitment || '';\r\n if (commitment.length !== 78) {\r\n throw new Error('Invalid TokenSale commitment');\r\n }\r\n\r\n // Get contract address from compiled contract\r\n const contractAddr = tokenSaleContract.address;\r\n\r\n // Creating lockingBytecode for contract address\r\n const contractLockingBytecodeResult = cashAddressToLockingBytecode(contractAddr);\r\n if (typeof contractLockingBytecodeResult === 'string') {\r\n throw new Error(`Failed to convert contract address to locking bytecode: ${contractLockingBytecodeResult}`);\r\n }\r\n\r\n // Creating lockingBytecode for usersAddress\r\n const normalizedUserAddress = ensureAddressPrefix(usersAddress);\r\n const userTokenAddress = toTokenAddress(normalizedUserAddress);\r\n const lockingBytecodeResult = cashAddressToLockingBytecode(normalizedUserAddress);\r\n if (typeof lockingBytecodeResult === 'string') {\r\n throw new Error(`Failed to convert user address to locking bytecode: ${lockingBytecodeResult}`);\r\n }\r\n\r\n // Build Transaction\r\n const p2pkhUnlocker: Unlocker = {\r\n generateLockingBytecode: () => {\r\n const result = cashAddressToLockingBytecode(normalizedUserAddress);\r\n if (typeof result === 'string') {\r\n throw new Error(`Failed to convert CashAddress to locking bytecode: ${result}`);\r\n }\r\n return result.bytecode;\r\n },\r\n generateUnlockingBytecode: () => {\r\n return Uint8Array.from([]);\r\n }\r\n };\r\n \r\n const priceType1Hex = toLittleEndianHexString(BigInt(priceType1), 5);\r\n const priceType2Hex = toLittleEndianHexString(BigInt(priceType2), 5);\r\n const priceType3Hex = toLittleEndianHexString(BigInt(priceType3), 5);\r\n const endSaleHex = toLittleEndianHexString(BigInt(endSale), 4);\r\n const adminPkh = tokenSaleUtxo.token?.nft?.commitment!.substring(38, 78);\r\n\r\n let transaction: any;\r\n try {\r\n transaction = await new TransactionBuilder({ provider: electrumProvider })\r\n .addInput(tokenSaleUtxo, tokenSaleContract.unlock.modifyTokenSale(priceType1Hex, priceType2Hex, priceType3Hex, endSaleHex))\r\n .addInput(userMintingUtxo, p2pkhUnlocker)\r\n // TokenSale NFT being sent back to contract with new commitment\r\n .addOutput({\r\n to: tokenSaleContract.tokenAddress, \r\n amount: tokenSaleUtxo.satoshis,\r\n token: {\r\n amount: tokenSaleUtxo.token?.amount!, \r\n category: tokenSaleUtxo.token?.category!, \r\n nft: {\r\n capability: tokenSaleUtxo.token?.nft?.capability!, \r\n commitment: priceType1Hex + priceType2Hex + priceType3Hex + endSaleHex + adminPkh\r\n }\r\n },\r\n })\r\n // Admin NFT being sent back to user\r\n .addOutput({\r\n to: userTokenAddress, \r\n amount: userMintingUtxo.satoshis - 1000n,\r\n token: {\r\n amount: userMintingUtxo.token?.amount!, \r\n category: userMintingUtxo.token?.category!, \r\n nft: {\r\n capability: userMintingUtxo.token?.nft?.capability!, \r\n commitment: userMintingUtxo.token?.nft?.commitment!\r\n }\r\n },\r\n });\r\n } catch (error) {\r\n if (error instanceof Error) {\r\n throw new Error(`Error building transaction: ${error.message}`);\r\n } else {\r\n throw new Error(`Error building transaction: ${String(error)}`);\r\n }\r\n }\r\n\r\n // Build the transaction\r\n const rawTransactionHex = await transaction.build();\r\n\r\n // Decode transaction for WalletConnect\r\n const decodedTransaction = decodeTransaction(hexToBin(rawTransactionHex));\r\n if (typeof decodedTransaction === \"string\") {\r\n throw new Error(\"Failed to decode transaction\");\r\n }\r\n\r\n // Clear unlocking bytecode for user input (input 1)\r\n decodedTransaction.inputs[1].unlockingBytecode = Uint8Array.from([]);\r\n\r\n // Convert hex strings to Uint8Array for token data\r\n const binTokenCategory = hexToBin(tokenSaleUtxo.token?.category!);\r\n const binTokenSaleCommitment = hexToBin(tokenSaleUtxo.token?.nft?.commitment!);\r\n const binUserMintingCommitment = hexToBin(userMintingUtxo.token?.nft?.commitment!);\r\n\r\n // Get redeemScript as Uint8Array\r\n const getRedeemScript = (): Uint8Array => {\r\n if ((tokenSaleContract.redeemScript as any).bytecode) {\r\n return (tokenSaleContract.redeemScript as any).bytecode;\r\n }\r\n if (typeof tokenSaleContract.redeemScript === 'string') {\r\n return hexToBin(tokenSaleContract.redeemScript);\r\n }\r\n return new Uint8Array(tokenSaleContract.redeemScript as any);\r\n };\r\n\r\n const redeemScript = getRedeemScript();\r\n\r\n // Construct source outputs for WalletConnect\r\n let listSourceOutputs = [\r\n {\r\n ...decodedTransaction.inputs[0],\r\n lockingBytecode: contractLockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(tokenSaleUtxo.satoshis),\r\n contract: {\r\n abiFunction: tokenSaleContract.artifact.abi,\r\n redeemScript: redeemScript,\r\n artifact: tokenSaleContract.artifact,\r\n },\r\n token: {\r\n amount: tokenSaleUtxo.token?.amount,\r\n category: binTokenCategory,\r\n nft: {\r\n capability: tokenSaleUtxo.token?.nft?.capability!,\r\n commitment: binTokenSaleCommitment\r\n }\r\n }\r\n },\r\n {\r\n ...decodedTransaction.inputs[1],\r\n lockingBytecode: lockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(userMintingUtxo.satoshis),\r\n token: {\r\n amount: userMintingUtxo.token?.amount,\r\n category: binTokenCategory,\r\n nft: {\r\n capability: userMintingUtxo.token?.nft?.capability!,\r\n commitment: binUserMintingCommitment\r\n }\r\n }\r\n }\r\n ];\r\n\r\n // Create transaction object for WalletConnect signing\r\n const wcTransactionObj: WalletConnectTransactionObject = {\r\n transaction: decodedTransaction,\r\n sourceOutputs: listSourceOutputs,\r\n broadcast: false,\r\n userPrompt: `Modify TokenSale NFT`\r\n };\r\n\r\n return wcTransactionObj;\r\n}\r\n\r\n","import { TransactionBuilder, Contract, Utxo, Unlocker } from 'cashscript';\r\nimport { hexToBin, cashAddressToLockingBytecode, decodeTransaction } from '@bitauth/libauth';\r\nimport { BurnParams, WalletConnectTransactionObject } from '../types';\r\nimport { ensureAddressPrefix, toTokenAddress } from '../utils';\r\nimport contractArtifact from '../artifacts/TokenSales.json';\r\n\r\n/**\r\n * Burn a TicketMaster NFT and all associated tickets\r\n * @param params - BurnParams object containing all required parameters\r\n * @returns Promise resolving to WalletConnectTransactionObject ready for signing\r\n * @throws Error if validation fails or transaction building fails\r\n */\r\nexport async function burn(params: BurnParams): Promise<WalletConnectTransactionObject> {\r\n const {\r\n electrumProvider,\r\n usersAddress,\r\n ticketMasterUtxo,\r\n userMintingNFT,\r\n tickets\r\n } = params;\r\n\r\n if (!electrumProvider) {\r\n throw new Error('Electrum provider not available');\r\n }\r\n\r\n // Compile the contract using the included artifact\r\n const ticketMasterContract = new Contract(contractArtifact as any, [], {\r\n provider: electrumProvider,\r\n addressType: 'p2sh32'\r\n });\r\n\r\n // Get contract address from compiled contract\r\n const contractAddr = ticketMasterContract.address;\r\n\r\n // Creating lockingBytecode for contract address\r\n const contractLockingBytecodeResult = cashAddressToLockingBytecode(contractAddr);\r\n if (typeof contractLockingBytecodeResult === 'string') {\r\n throw new Error(`Failed to convert contract address to locking bytecode: ${contractLockingBytecodeResult}`);\r\n }\r\n\r\n // Creating lockingBytecode for usersAddress\r\n const normalizedUserAddress = ensureAddressPrefix(usersAddress);\r\n const userTokenAddress = toTokenAddress(normalizedUserAddress);\r\n const lockingBytecodeResult = cashAddressToLockingBytecode(normalizedUserAddress);\r\n if (typeof lockingBytecodeResult === 'string') {\r\n throw new Error(`Failed to convert user address to locking bytecode: ${lockingBytecodeResult}`);\r\n }\r\n\r\n // Build Transaction\r\n const p2pkhUnlocker: Unlocker = {\r\n generateLockingBytecode: () => {\r\n const result = cashAddressToLockingBytecode(normalizedUserAddress);\r\n if (typeof result === 'string') {\r\n throw new Error(`Failed to convert CashAddress to locking bytecode: ${result}`);\r\n }\r\n return result.bytecode;\r\n },\r\n generateUnlockingBytecode: () => {\r\n return Uint8Array.from([]);\r\n }\r\n };\r\n\r\n let transaction: any;\r\n try {\r\n // Start building transaction\r\n transaction = await new TransactionBuilder({ provider: electrumProvider })\r\n .addInput(userMintingNFT, p2pkhUnlocker)\r\n // Add TicketMaster to be burned\r\n .addInput(ticketMasterUtxo, ticketMasterContract.unlock.burnTokenSale());\r\n\r\n // Add all tickets to be burned\r\n for (const ticket of tickets) {\r\n transaction = transaction.addInput(ticket, ticketMasterContract.unlock.burnTokenSale());\r\n }\r\n\r\n // Send admin NFT back to user\r\n transaction = transaction.addOutput({\r\n to: userTokenAddress, \r\n amount: userMintingNFT.satoshis,\r\n token: {\r\n amount: userMintingNFT.token?.amount!, \r\n category: userMintingNFT.token?.category!, \r\n nft: {\r\n capability: userMintingNFT.token?.nft?.capability!, \r\n commitment: userMintingNFT.token?.nft?.commitment! \r\n }\r\n },\r\n });\r\n } catch (error) {\r\n if (error instanceof Error) {\r\n throw new Error(`Error building transaction: ${error.message}`);\r\n } else {\r\n throw new Error(`Error building transaction: ${String(error)}`);\r\n }\r\n }\r\n\r\n // Build the transaction\r\n const rawTransactionHex = await transaction.build();\r\n\r\n // Decode transaction for WalletConnect\r\n const decodedTransaction = decodeTransaction(hexToBin(rawTransactionHex));\r\n if (typeof decodedTransaction === \"string\") {\r\n throw new Error(\"Failed to decode transaction\");\r\n }\r\n\r\n // Clear unlocking bytecode for user input (input 0)\r\n decodedTransaction.inputs[0].unlockingBytecode = Uint8Array.from([]);\r\n\r\n // Convert hex strings to Uint8Array for token data\r\n const binTokenCategory = hexToBin(ticketMasterUtxo.token?.category!);\r\n const binTicketMasterCommitment = hexToBin(ticketMasterUtxo.token?.nft?.commitment!);\r\n const binUserMintingCommitment = hexToBin(userMintingNFT.token?.nft?.commitment!);\r\n // For each ticket, convert hex to Uint8Array\r\n const binTicketCommitments = tickets.map((ticket) => hexToBin(ticket.token?.nft?.commitment!));\r\n\r\n // Get redeemScript as Uint8Array\r\n const getRedeemScript = (): Uint8Array => {\r\n if ((ticketMasterContract.redeemScript as any).bytecode) {\r\n return (ticketMasterContract.redeemScript as any).bytecode;\r\n }\r\n if (typeof ticketMasterContract.redeemScript === 'string') {\r\n return hexToBin(ticketMasterContract.redeemScript);\r\n }\r\n return new Uint8Array(ticketMasterContract.redeemScript as any);\r\n };\r\n\r\n const redeemScript = getRedeemScript();\r\n\r\n // Construct source outputs for WalletConnect\r\n let listSourceOutputs = [\r\n {\r\n ...decodedTransaction.inputs[0],\r\n lockingBytecode: lockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(userMintingNFT.satoshis),\r\n token: {\r\n amount: userMintingNFT.token?.amount,\r\n category: binTokenCategory,\r\n nft: {\r\n capability: userMintingNFT.token?.nft?.capability!,\r\n commitment: binUserMintingCommitment\r\n }\r\n }\r\n },\r\n {\r\n ...decodedTransaction.inputs[1],\r\n lockingBytecode: contractLockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(ticketMasterUtxo.satoshis),\r\n contract: {\r\n abiFunction: ticketMasterContract.artifact.abi,\r\n redeemScript: redeemScript,\r\n artifact: ticketMasterContract.artifact,\r\n },\r\n token: {\r\n amount: ticketMasterUtxo.token?.amount,\r\n category: binTokenCategory,\r\n nft: {\r\n capability: ticketMasterUtxo.token?.nft?.capability!,\r\n commitment: binTicketMasterCommitment\r\n }\r\n }\r\n }\r\n ];\r\n\r\n // Add all tickets to the list of source outputs\r\n for (let i = 0; i < tickets.length; i++) {\r\n const ticket = tickets[i];\r\n listSourceOutputs.push({\r\n ...decodedTransaction.inputs[i + 2],\r\n lockingBytecode: contractLockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(ticket.satoshis),\r\n token: {\r\n amount: ticket.token?.amount,\r\n category: binTokenCategory,\r\n nft: {\r\n capability: ticket.token?.nft?.capability!,\r\n commitment: binTicketCommitments[i]\r\n }\r\n }\r\n });\r\n }\r\n\r\n // Create transaction object for WalletConnect signing\r\n const wcTransactionObj: WalletConnectTransactionObject = {\r\n transaction: decodedTransaction,\r\n sourceOutputs: listSourceOutputs,\r\n broadcast: false,\r\n userPrompt: `Burn TicketMaster and ${tickets.length} tickets`\r\n };\r\n\r\n return wcTransactionObj;\r\n}\r\n\r\n","import { TransactionBuilder, Utxo, Unlocker } from 'cashscript';\r\nimport { hexToBin, cashAddressToLockingBytecode, decodeTransaction } from '@bitauth/libauth';\r\nimport { AddSatoshisParams, WalletConnectTransactionObject } from '../types';\r\nimport { ensureAddressPrefix, toTokenAddress } from '../utils';\r\n\r\n/**\r\n * Add satoshis to a minting NFT\r\n * @param params - AddSatoshisParams object containing all required parameters\r\n * @returns Promise resolving to WalletConnectTransactionObject ready for signing\r\n * @throws Error if validation fails or transaction building fails\r\n */\r\nexport async function addSatoshis(params: AddSatoshisParams): Promise<WalletConnectTransactionObject> {\r\n const {\r\n electrumProvider,\r\n usersAddress,\r\n userMintingNFT,\r\n additionalSatoshis\r\n } = params;\r\n\r\n if (!electrumProvider) {\r\n throw new Error('Electrum provider not available');\r\n }\r\n\r\n if (additionalSatoshis <= 0n) {\r\n throw new Error('Additional satoshis must be greater than 0');\r\n }\r\n\r\n // Creating lockingBytecode for usersAddress\r\n const normalizedUserAddress = ensureAddressPrefix(usersAddress);\r\n const userTokenAddress = toTokenAddress(normalizedUserAddress);\r\n const lockingBytecodeResult = cashAddressToLockingBytecode(normalizedUserAddress);\r\n if (typeof lockingBytecodeResult === 'string') {\r\n throw new Error(`Failed to convert user address to locking bytecode: ${lockingBytecodeResult}`);\r\n }\r\n\r\n // Get user UTXOs to find a BCH UTXO to fund the additional satoshis\r\n const userUtxos = await electrumProvider.getUtxos(normalizedUserAddress);\r\n\r\n // Find a BCH UTXO with enough satoshis (additionalSatoshis + miner fee ~1000 sats)\r\n const fundingUTXO = userUtxos.find(\r\n utxo => utxo.satoshis >= (additionalSatoshis + 1000n) && !utxo.token\r\n );\r\n\r\n if (!fundingUTXO) {\r\n // Count up all the sats in userUTXOs that do not have a token\r\n const totalSats = userUtxos.reduce((sum: bigint, utxo: Utxo) => {\r\n if (!utxo.token) {\r\n return sum + utxo.satoshis;\r\n }\r\n return sum;\r\n }, 0n);\r\n\r\n if (totalSats >= additionalSatoshis + 1000n) {\r\n throw new Error('No compatible UTXO found in wallet, consolidate?');\r\n } else {\r\n throw new Error(`Not enough BCH in your wallet. Required: ${additionalSatoshis + 1000n} sats, Available: ${totalSats} sats`);\r\n }\r\n }\r\n\r\n // Build Transaction\r\n const p2pkhUnlocker: Unlocker = {\r\n generateLockingBytecode: () => {\r\n const result = cashAddressToLockingBytecode(normalizedUserAddress);\r\n if (typeof result === 'string') {\r\n throw new Error(`Failed to convert CashAddress to locking bytecode: ${result}`);\r\n }\r\n return result.bytecode;\r\n },\r\n generateUnlockingBytecode: () => {\r\n return Uint8Array.from([]);\r\n }\r\n };\r\n\r\n let transaction: any;\r\n try {\r\n transaction = await new TransactionBuilder({ provider: electrumProvider })\r\n // Add the minting NFT as input\r\n .addInput(userMintingNFT, p2pkhUnlocker)\r\n // Add the funding UTXO to provide additional satoshis\r\n .addInput(fundingUTXO, p2pkhUnlocker)\r\n // Output: minting NFT with additional satoshis\r\n .addOutput({\r\n to: userTokenAddress,\r\n amount: userMintingNFT.satoshis + additionalSatoshis,\r\n token: {\r\n amount: userMintingNFT.token?.amount!,\r\n category: userMintingNFT.token?.category!,\r\n nft: {\r\n capability: userMintingNFT.token?.nft?.capability!,\r\n commitment: userMintingNFT.token?.nft?.commitment!\r\n }\r\n },\r\n });\r\n\r\n // Calculate change (fundingUTXO - additionalSatoshis - miner fee)\r\n const changeAmount = fundingUTXO.satoshis - additionalSatoshis - 1000n;\r\n if (changeAmount >= 1000n) { // Dust limit\r\n transaction.addOutput({\r\n to: normalizedUserAddress,\r\n amount: changeAmount,\r\n });\r\n }\r\n } catch (error) {\r\n if (error instanceof Error) {\r\n throw new Error(`Error building transaction: ${error.message}`);\r\n } else {\r\n throw new Error(`Error building transaction: ${String(error)}`);\r\n }\r\n }\r\n\r\n // Build the transaction\r\n const rawTransactionHex = await transaction.build();\r\n\r\n // Decode transaction for WalletConnect\r\n const decodedTransaction = decodeTransaction(hexToBin(rawTransactionHex));\r\n if (typeof decodedTransaction === \"string\") {\r\n throw new Error(\"Failed to decode transaction\");\r\n }\r\n\r\n // Clear unlocking bytecode for user inputs (wallet will sign these)\r\n decodedTransaction.inputs[0].unlockingBytecode = Uint8Array.from([]);\r\n decodedTransaction.inputs[1].unlockingBytecode = Uint8Array.from([]);\r\n\r\n // Convert hex strings to Uint8Array for token data\r\n const binTokenCategory = hexToBin(userMintingNFT.token?.category!);\r\n const binMintingCommitment = hexToBin(userMintingNFT.token?.nft?.commitment!);\r\n\r\n // Get locking bytecode for user address\r\n const userLockingBytecodeResult = cashAddressToLockingBytecode(normalizedUserAddress);\r\n if (typeof userLockingBytecodeResult === 'string') {\r\n throw new Error(`Failed to convert user address to locking bytecode: ${userLockingBytecodeResult}`);\r\n }\r\n\r\n // Construct source outputs for WalletConnect\r\n const listSourceOutputs = [\r\n {\r\n ...decodedTransaction.inputs[0],\r\n lockingBytecode: userLockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(userMintingNFT.satoshis),\r\n token: {\r\n amount: userMintingNFT.token?.amount,\r\n category: binTokenCategory,\r\n nft: {\r\n capability: userMintingNFT.token?.nft?.capability!,\r\n commitment: binMintingCommitment\r\n }\r\n }\r\n },\r\n {\r\n ...decodedTransaction.inputs[1],\r\n lockingBytecode: userLockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(fundingUTXO.satoshis)\r\n }\r\n ];\r\n\r\n // Create transaction object for WalletConnect signing\r\n const wcTransactionObj: WalletConnectTransactionObject = {\r\n transaction: decodedTransaction,\r\n sourceOutputs: listSourceOutputs,\r\n broadcast: false,\r\n userPrompt: `Add ${additionalSatoshis} satoshis to minting NFT`\r\n };\r\n\r\n return wcTransactionObj;\r\n}\r\n\r\n","// TokenSales_old1 contract addresses\r\n//export const AddressTicketMaster = 'bitcoincash:pvh0yat7d2r9nf228fpns3mypydvstq9arftt9qlmma42xeq2eryszkdd99zq'; //address hash: 2ef2757e6a8659a54a3a43384764091ac82c05e8d2b5941fdefb551b20564648\r\n//export const AddressTicketMasterToken = 'bitcoincash:rvh0yat7d2r9nf228fpns3mypydvstq9arftt9qlmma42xeq2eryss93vuymt';\r\n\r\n// TokenSales contract addresses | simplified change fee calculation in purchaseNFT()\r\nexport const AddressTicketMaster = 'bitcoincash:pdmta0t3lmeufrhjlmyxkx3ye648lvr08cdwmy36eqtkj4wzpagg2m4afvzlt'; //address hash: 76bebd71fef3c48ef2fec86b1a24ceaa7fb06f3e1aed923ac8176955c20f5085\r\nexport const AddressTicketMasterToken = 'bitcoincash:rdmta0t3lmeufrhjlmyxkx3ye648lvr08cdwmy36eqtkj4wzpagg2fxpg4rxq';\r\n\r\n\r\n// Ticket Level Descriptions\r\nexport const TICKET_LEVEL_DESCRIPTIONS = {\r\n '01': {\r\n name: 'Regular',\r\n description: 'Regular tickets provide standard access to the event. This is the base level ticket option.'\r\n },\r\n '02': {\r\n name: 'VIP',\r\n description: 'VIP tickets offer enhanced benefits including priority access, exclusive areas, and additional perks.'\r\n },\r\n '03': {\r\n name: 'Premium',\r\n description: 'Premium tickets provide the highest level of access with all VIP benefits plus additional exclusive features.'\r\n }\r\n};\r\n\r\n","import { TransactionBuilder, Contract, Utxo, Unlocker } from 'cashscript';\r\nimport { hexToBin, cashAddressToLockingBytecode, decodeTransaction } from '@bitauth/libauth';\r\nimport { CreateListingParams, WalletConnectTransactionObject } from '../types';\r\nimport { ensureAddressPrefix, toLittleEndianHexString, toTokenAddress } from '../utils';\r\nimport contractArtifact from '../artifacts/TokenSales.json';\r\nimport { AddressTicketMasterToken } from '../constants/values';\r\n\r\n/**\r\n * Create a new TicketMaster listing\r\n * @param params - CreateListingParams object containing all required parameters\r\n * @returns Promise resolving to WalletConnectTransactionObject ready for signing\r\n * @throws Error if validation fails or transaction building fails\r\n */\r\nexport async function createListing(params: CreateListingParams): Promise<WalletConnectTransactionObject> {\r\n const {\r\n electrumProvider,\r\n usersAddress,\r\n userMintingNFT,\r\n priceType1,\r\n priceType2,\r\n priceType3,\r\n endSale,\r\n adminPubKeyHash\r\n } = params;\r\n\r\n if (!electrumProvider) {\r\n throw new Error('Electrum provider not available');\r\n }\r\n\r\n // Compile the contract using the included artifact\r\n const ticketMasterContract = new Contract(contractArtifact as any, [], {\r\n provider: electrumProvider,\r\n addressType: 'p2sh32'\r\n });\r\n\r\n // Validate adminPubKeyHash\r\n const adminPkhHex = adminPubKeyHash.replace(/^0x/i, '').trim();\r\n if (adminPkhHex.length !== 40 || !/^[0-9a-fA-F]+$/.test(adminPkhHex)) {\r\n throw new Error('Admin PubKey Hash must be 40 hex characters (20 bytes)');\r\n }\r\n\r\n // Normalize user address\r\n const normalizedUserAddress = ensureAddressPrefix(usersAddress);\r\n const userTokenAddress = toTokenAddress(normalizedUserAddress);\r\n const lockingBytecodeResult = cashAddressToLockingBytecode(normalizedUserAddress);\r\n if (typeof lockingBytecodeResult === 'string') {\r\n throw new Error(`Failed to convert user address to locking bytecode: ${lockingBytecodeResult}`);\r\n }\r\n\r\n // Get token address from compiled contract\r\n const contractTokenAddr = ticketMasterContract.tokenAddress;\r\nconsole.log('contractTokenAddr', contractTokenAddr);\r\nconsole.log('AddressTicketMasterToken', AddressTicketMasterToken);\r\n // Get locking bytecode for contract token address\r\n const contractTokenLockingBytecodeResult = cashAddressToLockingBytecode(contractTokenAddr);\r\n if (typeof contractTokenLockingBytecodeResult === 'string') {\r\n throw new Error(`Failed to convert contract token address to locking bytecode: ${contractTokenLockingBytecodeResult}`);\r\n }\r\n\r\n // Build TicketMaster commitment\r\n // Format: bytes5 priceType1 + bytes5 priceType2 + bytes5 priceType3 + bytes4 endSale + bytes20 adminPubKeyHash\r\n // Total: 39 bytes = 78 hex chars\r\n const priceType1Hex = toLittleEndianHexString(priceType1, 5); // 10 hex chars\r\n const priceType2Hex = toLittleEndianHexString(priceType2, 5); // 10 hex chars\r\n const priceType3Hex = toLittleEndianHexString(priceType3, 5); // 10 hex chars\r\n const endSaleHex = toLittleEndianHexString(endSale, 4); // 8 hex chars\r\n const ticketMasterCommitment = priceType1Hex + priceType2Hex + priceType3Hex + endSaleHex + adminPkhHex;\r\n \r\n if (ticketMasterCommitment.length !== 78) {\r\n throw new Error(`Invalid commitment length: ${ticketMasterCommitment.length}, expected 78`);\r\n }\r\n\r\n // Build Transaction\r\n const p2pkhUnlocker: Unlocker = {\r\n generateLockingBytecode: () => {\r\n const result = cashAddressToLockingBytecode(normalizedUserAddress);\r\n if (typeof result === 'string') {\r\n throw new Error(`Failed to convert CashAddress to locking bytecode: ${result}`);\r\n }\r\n return result.bytecode;\r\n },\r\n generateUnlockingBytecode: () => {\r\n return Uint8Array.from([]);\r\n }\r\n };\r\n\r\n let transaction: any;\r\n try {\r\n transaction = await new TransactionBuilder({ provider: electrumProvider })\r\n // Input: user's minting NFT\r\n .addInput(userMintingNFT, p2pkhUnlocker)\r\n // Output 0: user's minting NFT back to user\r\n .addOutput({\r\n to: userTokenAddress,\r\n amount: userMintingNFT.satoshis - 2000n,\r\n token: {\r\n amount: userMintingNFT.token?.amount!,\r\n category: userMintingNFT.token?.category!,\r\n nft: {\r\n capability: userMintingNFT.token?.nft?.capability!,\r\n commitment: userMintingNFT.token?.nft?.commitment!\r\n }\r\n },\r\n })\r\n // Output 1: TicketMaster Minting NFT to contract token address\r\n .addOutput({\r\n to: contractTokenAddr,\r\n amount: 1000n,\r\n token: {\r\n amount: userMintingNFT.token?.amount!,\r\n category: userMintingNFT.token?.category!,\r\n nft: {\r\n capability: 'minting',\r\n commitment: ticketMasterCommitment\r\n }\r\n },\r\n });\r\n } catch (error) {\r\n if (error instanceof Error) {\r\n throw new Error(`Error building transaction: ${error.message}`);\r\n } else {\r\n throw new Error(`Error building transaction: ${String(error)}`);\r\n }\r\n }\r\n\r\n // Build the transaction\r\n const rawTransactionHex = await transaction.build();\r\n\r\n // Decode transaction for WalletConnect\r\n const decodedTransaction = decodeTransaction(hexToBin(rawTransactionHex));\r\n if (typeof decodedTransaction === \"string\") {\r\n throw new Error(\"Failed to decode transaction\");\r\n }\r\n\r\n // Clear unlocking bytecode for user input (wallet will sign this)\r\n decodedTransaction.inputs[0].unlockingBytecode = Uint8Array.from([]);\r\n\r\n // Convert hex strings to Uint8Array for token data\r\n const binTokenCategory = hexToBin(userMintingNFT.token?.category!);\r\n const binUserCommitment = hexToBin(userMintingNFT.token?.nft?.commitment!);\r\n\r\n // Construct source outputs for WalletConnect\r\n const listSourceOutputs = [\r\n {\r\n ...decodedTransaction.inputs[0],\r\n lockingBytecode: lockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(userMintingNFT.satoshis),\r\n token: {\r\n amount: userMintingNFT.token?.amount,\r\n category: binTokenCategory,\r\n nft: {\r\n capability: userMintingNFT.token?.nft?.capability!,\r\n commitment: binUserCommitment\r\n }\r\n }\r\n }\r\n ];\r\n\r\n // Create transaction object for WalletConnect signing\r\n const wcTransactionObj: WalletConnectTransactionObject = {\r\n transaction: decodedTransaction,\r\n sourceOutputs: listSourceOutputs,\r\n broadcast: false,\r\n userPrompt: `Create TicketMaster listing`\r\n };\r\n\r\n return wcTransactionObj;\r\n}\r\n\r\n","/**\r\n * TokenSales contract addresses\r\n * These are the addresses for the TokenSales (TicketMaster) contract\r\n */\r\nimport { AddressTicketMaster, AddressTicketMasterToken } from './constants/values';\r\n\r\nexport const DEFAULT_CONTRACT_ADDRESSES = {\r\n contract: AddressTicketMaster,\r\n token: AddressTicketMasterToken\r\n} as const;\r\n\r\n/**\r\n * Get contract address\r\n * @returns Contract address\r\n */\r\nexport function getContractAddress(): string {\r\n return AddressTicketMaster;\r\n}\r\n\r\n/**\r\n * Get token address\r\n * @returns Token address\r\n */\r\nexport function getTokenAddress(): string {\r\n return AddressTicketMasterToken;\r\n}\r\n\r\n/**\r\n * Get contract addresses\r\n * @returns Object with contract and token addresses\r\n */\r\nexport function getContractAddresses() {\r\n return {\r\n contract: AddressTicketMaster,\r\n token: AddressTicketMasterToken\r\n };\r\n}\r\n\r\n","import { Utxo } from 'cashscript';\r\nimport { ListAvailableTicketsParams } from '../types';\r\nimport { getTokenAddress } from '../config';\r\nimport { isTicketMaster, isTicket } from '../utils/ticketMaster';\r\n\r\n/**\r\n * List available tickets for purchase from a TokenSale\r\n * Returns ALL UTXOs matching the categoryID, excluding the TokenSale NFT (minting capability)\r\n * @param params - ListAvailableTicketsParams object containing all required parameters\r\n * @returns Promise resolving to array of ticket UTXOs (excluding the TokenSale NFT)\r\n */\r\nexport async function listAvailableTickets(params: ListAvailableTicketsParams): Promise<Utxo[]> {\r\n const {\r\n electrumProvider,\r\n categoryID\r\n } = params;\r\n\r\n if (!electrumProvider) {\r\n throw new Error('Electrum provider not available');\r\n }\r\n\r\n if (!categoryID || categoryID.length === 0) {\r\n throw new Error('Category ID is required');\r\n }\r\n\r\n // Get the contract token address\r\n const contractTokenAddress = getTokenAddress();\r\n\r\n // Get all UTXOs from the contract token address\r\n const contractUtxos = await electrumProvider.getUtxos(contractTokenAddress);\r\n\r\n // Filter UTXOs to only those matching the categoryID\r\n const categoryUtxos = contractUtxos.filter((utxo: Utxo) => \r\n utxo?.token?.category === categoryID\r\n );\r\n\r\n if (categoryUtxos.length === 0) {\r\n return []; // No UTXOs found for this category\r\n }\r\n\r\n // Find the TokenSale minting NFT (capability === 'minting')\r\n const tokenSaleUtxo = categoryUtxos.find((utxo: Utxo) => \r\n isTicketMaster(utxo)\r\n );\r\n\r\n if (!tokenSaleUtxo) {\r\n throw new Error(`No active TokenSale found for category ${categoryID}`);\r\n }\r\n\r\n // Return all UTXOs EXCEPT the TokenSale NFT (minting capability)\r\n const availableTickets = categoryUtxos.filter((utxo: Utxo) => \r\n !isTicketMaster(utxo)\r\n );\r\n\r\n return availableTickets;\r\n}\r\n","import { Utxo } from 'cashscript';\r\nimport { ListAllSalesParams, TokenSaleUtxo } from '../types';\r\nimport { getTokenAddress } from '../config';\r\nimport { isTicketMaster, parseTicketMasterCommitment } from '../utils/ticketMaster';\r\n\r\n/**\r\n * List all TokenSale NFTs (minting capability & 39-byte commitment)\r\n * @param params - ListAllSalesParams object containing the electrum provider\r\n * @returns Promise resolving to array of TokenSale UTXOs with parsed commitment data\r\n */\r\nexport async function listAllSales(params: ListAllSalesParams): Promise<TokenSaleUtxo[]> {\r\n const { electrumProvider } = params;\r\n\r\n if (!electrumProvider) {\r\n throw new Error('Electrum provider not available');\r\n }\r\n\r\n // Get the contract token address\r\n const contractTokenAddress = getTokenAddress();\r\n\r\n // Get all UTXOs from the contract token address\r\n const contractUtxos = await electrumProvider.getUtxos(contractTokenAddress);\r\n\r\n // Filter to only TokenSale NFTs (minting capability with 39-byte commitment)\r\n const tokenSaleUtxos: TokenSaleUtxo[] = [];\r\n\r\n for (const utxo of contractUtxos) {\r\n if (isTicketMaster(utxo)) {\r\n const commitment = utxo.token?.nft?.commitment || '';\r\n const tokenSaleData = parseTicketMasterCommitment(commitment);\r\n\r\n if (tokenSaleData) {\r\n tokenSaleUtxos.push({\r\n ...utxo,\r\n tokenSaleData\r\n });\r\n }\r\n }\r\n }\r\n\r\n return tokenSaleUtxos;\r\n}\r\n","import { Utxo } from 'cashscript';\r\nimport { ListActiveSalesParams, TokenSaleUtxo } from '../types';\r\nimport { getTokenAddress } from '../config';\r\nimport { isTicketMaster, parseTicketMasterCommitment } from '../utils/ticketMaster';\r\n\r\n/**\r\n * List active TokenSale NFTs (minting capability, 39-byte commitment, sale not ended)\r\n * A sale is active when current blockheight > endSale commitment field\r\n * @param params - ListActiveSalesParams object containing the electrum provider\r\n * @returns Promise resolving to array of active TokenSale UTXOs with parsed commitment data\r\n */\r\nexport async function listActiveSales(params: ListActiveSalesParams): Promise<TokenSaleUtxo[]> {\r\n const { electrumProvider } = params;\r\n\r\n if (!electrumProvider) {\r\n throw new Error('Electrum provider not available');\r\n }\r\n\r\n // Get current block height\r\n let currentBlockHeight: number;\r\n if (typeof (electrumProvider as any).getBlockHeight === 'function') {\r\n currentBlockHeight = await (electrumProvider as any).getBlockHeight();\r\n } else if (typeof (electrumProvider as any).performRequest === 'function') {\r\n try {\r\n const header = await (electrumProvider as any).performRequest('blockchain.headers.subscribe');\r\n currentBlockHeight = header?.height || header;\r\n } catch (e) {\r\n // Fallback: try to get block height from getUtxos call\r\n throw new Error('Unable to get block height from provider');\r\n }\r\n } else {\r\n throw new Error('Unable to get block height from provider');\r\n }\r\n\r\n // Get the contract token address\r\n const contractTokenAddress = getTokenAddress();\r\n\r\n // Get all UTXOs from the contract token address\r\n const contractUtxos = await electrumProvider.getUtxos(contractTokenAddress);\r\n\r\n // Filter to only active TokenSale NFTs (sale not ended)\r\n const activeSales: TokenSaleUtxo[] = [];\r\n\r\n for (const utxo of contractUtxos) {\r\n if (isTicketMaster(utxo)) {\r\n const commitment = utxo.token?.nft?.commitment || '';\r\n const tokenSaleData = parseTicketMasterCommitment(commitment);\r\n\r\n if (tokenSaleData) {\r\n // Sale is active when current blockheight > endSale\r\n if (currentBlockHeight < tokenSaleData.endSale) {\r\n activeSales.push({\r\n ...utxo,\r\n tokenSaleData\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n return activeSales;\r\n}\r\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/utils/signTransaction.ts","../src/utils/ticketMaster.ts","../src/utils/toTokenAddress.ts","../src/utils/index.ts","../src/functions/buyNFT.ts","../src/functions/modifyTokenSale.ts","../src/functions/burn.ts","../src/functions/addSatoshis.ts","../src/constants/values.ts","../src/functions/createListing.ts","../src/config.ts","../src/functions/listAvailableTickets.ts","../src/functions/listAllSales.ts","../src/functions/listActiveSales.ts"],"sourcesContent":["import { stringify } from '@bitauth/libauth';\r\n\r\n/**\r\n * Creates a signTransaction function for WalletConnect v2\r\n * This function handles transaction signing through WalletConnect's SignClient\r\n * \r\n * @param signClient - The WalletConnect SignClient instance\r\n * @param connectedChain - The connected chain ID (fallback if not found in session)\r\n * @returns A function that signs transactions via WalletConnect\r\n */\r\nexport function createSignTransaction(\r\n signClient: any,\r\n connectedChain?: string\r\n): (transactionOptions: any) => Promise<any> {\r\n return async (transactionOptions: any) => {\r\n if (!signClient) {\r\n throw new Error('SignClient not available. Please ensure wallet is connected.');\r\n }\r\n \r\n // Get all active sessions\r\n const sessions = signClient.session.getAll();\r\n \r\n if (sessions.length === 0) {\r\n throw new Error('No active wallet session. Please connect your wallet first.');\r\n }\r\n \r\n // Use the first active session\r\n const session = sessions[0];\r\n \r\n // Extract chainId from session\r\n // In WalletConnect v2, chainId is in the accounts array as \"chainId:address\"\r\n let chainId: string | null = null;\r\n \r\n const namespaces = session.namespaces || {};\r\n const bchNamespace = namespaces.bch;\r\n \r\n if (bchNamespace && bchNamespace.accounts && bchNamespace.accounts.length > 0) {\r\n // Extract chainId from first account (format: \"chainId:address\")\r\n const firstAccount = bchNamespace.accounts[0];\r\n const accountParts = firstAccount.split(':');\r\n if (accountParts.length >= 2) {\r\n // Reconstruct chainId (could be \"bch:mainnet\" or \"bch:bchtest:chipnet\")\r\n chainId = accountParts.slice(0, -1).join(':'); // Everything except the address part\r\n }\r\n }\r\n \r\n // Fallback: try to find chainId from any namespace\r\n if (!chainId) {\r\n for (const namespaceKey in namespaces) {\r\n const namespace = namespaces[namespaceKey];\r\n if (namespace.accounts && namespace.accounts.length > 0) {\r\n const firstAccount = namespace.accounts[0];\r\n const accountParts = firstAccount.split(':');\r\n if (accountParts.length >= 2 && accountParts[0].includes('bch')) {\r\n chainId = accountParts.slice(0, -1).join(':');\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n \r\n // Final fallback\r\n if (!chainId) {\r\n chainId = connectedChain || 'bch:mainnet';\r\n }\r\n \r\n // Use the same pattern as the working project: JSON.parse(stringify(obj))\r\n // stringify from @bitauth/libauth handles BigInt and Uint8Array serialization\r\n const serializableTxObj = JSON.parse(stringify(transactionOptions));\r\n \r\n try {\r\n const result = await signClient.request({\r\n chainId,\r\n topic: session.topic,\r\n request: {\r\n method: 'bch_signTransaction',\r\n params: serializableTxObj,\r\n },\r\n });\r\n return result;\r\n } catch (error: any) {\r\n // Handle WalletConnect relay errors gracefully\r\n if (error?.message?.includes('onRelayMessage') || error?.message?.includes('failed to process')) {\r\n // The transaction might still have been signed, so we'll let the caller handle it\r\n }\r\n throw error;\r\n }\r\n };\r\n}\r\n\r\n","/**\r\n * Utility functions for parsing TicketMaster NFT data\r\n */\r\n\r\nexport interface TicketMasterData {\r\n priceType1: bigint;\r\n priceType2: bigint;\r\n priceType3: bigint;\r\n endSale: number;\r\n adminPubKeyHash: string;\r\n}\r\n\r\n/**\r\n * Parses TicketMaster NFT commitment to extract sale data\r\n * Commitment format:\r\n * - bytes5 priceType1 (0-5)\r\n * - bytes5 priceType2 (5-10)\r\n * - bytes5 priceType3 (10-15)\r\n * - bytes4 endSale (15-19)\r\n * - bytes20 adminPubKeyHash (19-39)\r\n */\r\nexport function parseTicketMasterCommitment(commitment: string): TicketMasterData | null {\r\n if (!commitment || commitment.length < 78) { // 39 bytes = 78 hex chars\r\n return null;\r\n }\r\n\r\n try {\r\n // Extract priceType1 (bytes5 = 10 hex chars, positions 0-10)\r\n // CashScript stores numbers in little-endian format\r\n const priceType1Hex = commitment.substring(0, 10);\r\n const priceType1BE = priceType1Hex.match(/.{2}/g)?.reverse().join('') || priceType1Hex;\r\n const priceType1 = BigInt('0x' + priceType1BE);\r\n\r\n // Extract priceType2 (bytes5 = 10 hex chars, positions 10-20)\r\n const priceType2Hex = commitment.substring(10, 20);\r\n const priceType2BE = priceType2Hex.match(/.{2}/g)?.reverse().join('') || priceType2Hex;\r\n const priceType2 = BigInt('0x' + priceType2BE);\r\n\r\n // Extract priceType3 (bytes5 = 10 hex chars, positions 20-30)\r\n const priceType3Hex = commitment.substring(20, 30);\r\n const priceType3BE = priceType3Hex.match(/.{2}/g)?.reverse().join('') || priceType3Hex;\r\n const priceType3 = BigInt('0x' + priceType3BE);\r\n\r\n // Extract endSale (bytes4 = 8 hex chars, positions 30-38)\r\n // CashScript stores numbers in little-endian format\r\n // Contract uses: bytes endSale = tx.inputs[0].nftCommitment.slice(15,19);\r\n // This is bytes 15-19 (0-indexed), which is hex positions 30-38\r\n const endSaleHex = commitment.substring(30, 38);\r\n const endSaleBE = endSaleHex.match(/.{2}/g)?.reverse().join('') || endSaleHex;\r\n const endSale = parseInt(endSaleBE, 16);\r\n\r\n // Extract adminPubKeyHash (bytes20 = 40 hex chars, positions 38-78)\r\n const adminPubKeyHash = commitment.substring(38, 78);\r\n\r\n return {\r\n priceType1,\r\n priceType2,\r\n priceType3,\r\n endSale,\r\n adminPubKeyHash,\r\n };\r\n } catch (error) {\r\n console.error('Failed to parse TicketMaster commitment:', error);\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Checks if a UTXO is a TicketMaster (has minting capability)\r\n */\r\nexport function isTicketMaster(utxo: any): boolean {\r\n return (\r\n utxo?.token?.nft?.capability === 'minting' &&\r\n utxo?.token?.nft?.commitment &&\r\n utxo.token.nft.commitment.length >= 78\r\n );\r\n}\r\n\r\n/**\r\n * Checks if a UTXO is a ticket (same category as TicketMaster but immutable)\r\n */\r\nexport function isTicket(utxo: any, ticketMasterCategory: string): boolean {\r\n return (\r\n utxo?.token?.category === ticketMasterCategory &&\r\n utxo?.token?.nft?.capability === 'none'\r\n );\r\n}\r\n\r\n/**\r\n * Formats satoshis to BCH\r\n */\r\nexport function formatBCH(satoshis: bigint | number | string): string {\r\n const sats = typeof satoshis === 'string' ? BigInt(satoshis) : BigInt(satoshis);\r\n const bch = Number(sats) / 100000000;\r\n return bch.toFixed(8);\r\n}\r\n\r\n","import { decodeCashAddress, encodeCashAddress } from '@bitauth/libauth';\r\n\r\n/**\r\n * Converts a regular Bitcoin Cash address to its token address equivalent\r\n * @param address - Bitcoin Cash address (p2pkh)\r\n * @returns Token address (p2pkhWithTokens)\r\n */\r\nfunction toTokenAddress(address: string): string {\r\n const addressInfo: any = decodeCashAddress(address);\r\n const pkhPayoutBin = addressInfo.payload;\r\n const prefix = addressInfo.prefix;\r\n const tokenAddressResult = encodeCashAddress({prefix, type: \"p2pkhWithTokens\", payload: pkhPayoutBin});\r\n \r\n // In libauth v3, encodeCashAddress returns a CashAddressResult object\r\n if (typeof tokenAddressResult === 'string') {\r\n return tokenAddressResult;\r\n }\r\n return tokenAddressResult.address;\r\n}\r\n\r\nexport default toTokenAddress;\r\n\r\n","/**\r\n * Shared utility functions\r\n */\r\n\r\nexport { createSignTransaction } from './signTransaction';\r\nexport { parseTicketMasterCommitment, formatBCH, isTicketMaster, isTicket, type TicketMasterData } from './ticketMaster';\r\nexport { default as toTokenAddress } from './toTokenAddress';\r\n\r\n/**\r\n * Ensures an address has the bitcoincash: prefix for libauth functions\r\n * Addresses from AppKit may come without the prefix after normalization\r\n */\r\nexport function ensureAddressPrefix(address: string): string {\r\n // If address already has a prefix, return as-is\r\n if (address.includes(':')) {\r\n return address;\r\n }\r\n \r\n // Add bitcoincash: prefix for mainnet addresses\r\n // Addresses starting with 'q' or 'p' are mainnet\r\n if (address.startsWith('q') || address.startsWith('p')) {\r\n return `bitcoincash:${address}`;\r\n }\r\n \r\n // For testnet addresses starting with 'bchtest:' or 'q'/'p' on testnet\r\n // This is a simple check - you may need to adjust based on your network\r\n return `bitcoincash:${address}`;\r\n}\r\n\r\n/**\r\n * Converts hex string to Uint8Array\r\n */\r\nexport function hexToUint8Array(hexString: string): Uint8Array {\r\n const bytes = new Uint8Array(hexString.length / 2);\r\n for (let i = 0; i < bytes.length; i++) {\r\n bytes[i] = parseInt(hexString.substr(i * 2, 2), 16);\r\n }\r\n return bytes;\r\n}\r\n\r\n/**\r\n * Converts a number to little-endian hex string\r\n * @param number - The number to convert\r\n * @param byteCount - Number of bytes (e.g., 5 for bytes5, 4 for bytes4)\r\n */\r\nexport function toLittleEndianHexString(number: bigint | number, byteCount: number): string {\r\n const num = typeof number === 'bigint' ? number : BigInt(number);\r\n let hex = num.toString(16);\r\n hex = hex.padStart(byteCount * 2, '0'); // Pad with zeros to ensure correct byteCount\r\n // Split into chunks of 2 (bytes), reverse (for little endian), and join back\r\n return hex.match(/../g)?.reverse().join('') ?? '';\r\n}\r\n\r\n","import { TransactionBuilder, Contract, Utxo, Unlocker } from 'cashscript';\r\nimport { hexToBin, cashAddressToLockingBytecode, decodeTransaction, encodeCashAddress } from '@bitauth/libauth';\r\nimport { BuyNFTParams, WalletConnectTransactionObject } from '../types';\r\nimport { ensureAddressPrefix, hexToUint8Array, toTokenAddress } from '../utils';\r\nimport contractArtifact from '../artifacts/TokenSales.json';\r\n\r\n/**\r\n * Purchase a ticket NFT from a TicketMaster\r\n * @param params - BuyNFTParams object containing all required parameters\r\n * @returns Promise resolving to WalletConnectTransactionObject ready for signing\r\n * @throws Error if validation fails or transaction building fails\r\n */\r\nexport async function buyNFT(params: BuyNFTParams): Promise<WalletConnectTransactionObject> {\r\n const {\r\n electrumProvider,\r\n usersAddress,\r\n ticketMasterUtxo,\r\n ticketUtxo,\r\n ticketType,\r\n isAdmin\r\n } = params;\r\n\r\n if (!electrumProvider) {\r\n throw new Error('Electrum provider not available');\r\n }\r\n\r\n // Compile the contract using the included artifact\r\n const ticketMasterContract = new Contract(contractArtifact as any, [], {\r\n provider: electrumProvider,\r\n addressType: 'p2sh32'\r\n });\r\n\r\n // Parse TicketMaster commitment to get price and admin address\r\n const commitment = ticketMasterUtxo.token?.nft?.commitment || '';\r\n if (commitment.length !== 78) {\r\n throw new Error('Invalid TicketMaster commitment');\r\n }\r\n\r\n // Extract price based on ticket type (little-endian format)\r\n let ticketPrice: bigint;\r\n let priceHex: string;\r\n \r\n if (ticketType === '01') {\r\n priceHex = commitment.substring(0, 10);\r\n const priceBE = priceHex.match(/.{2}/g)?.reverse().join('') || priceHex;\r\n ticketPrice = BigInt('0x' + priceBE);\r\n } else if (ticketType === '02') {\r\n priceHex = commitment.substring(10, 20);\r\n const priceBE = priceHex.match(/.{2}/g)?.reverse().join('') || priceHex;\r\n ticketPrice = BigInt('0x' + priceBE);\r\n if (ticketPrice === 0n) {\r\n throw new Error('Ticket type 2 is not available');\r\n }\r\n } else if (ticketType === '03') {\r\n priceHex = commitment.substring(20, 30);\r\n const priceBE = priceHex.match(/.{2}/g)?.reverse().join('') || priceHex;\r\n ticketPrice = BigInt('0x' + priceBE);\r\n if (ticketPrice === 0n) {\r\n throw new Error('Ticket type 3 is not available');\r\n }\r\n } else {\r\n throw new Error('Invalid ticket type');\r\n }\r\n\r\n // Extract admin pubkey hash (bytes20 = 40 hex chars, positions 38-78)\r\n const adminPubKeyHashHex = commitment.substring(38, 78);\r\n \r\n // Convert hex string to Uint8Array\r\n const adminPKHUint8Array = hexToUint8Array(adminPubKeyHashHex);\r\n \r\n // Derive admin address from embedded pubkey hash\r\n const prefix = 'bitcoincash';\r\n const addressType = 'p2pkh';\r\n const adminAddressResult = encodeCashAddress({\r\n prefix,\r\n type: addressType,\r\n payload: adminPKHUint8Array\r\n });\r\n \r\n if (typeof adminAddressResult === 'string') {\r\n throw new Error(`Failed to encode admin address: ${adminAddressResult}`);\r\n }\r\n const adminAddress = adminAddressResult.address;\r\n \r\n // Get contract address from compiled contract\r\n const contractAddr = ticketMasterContract.address;\r\n \r\n // Convert address to locking bytecode\r\n const contractLockingBytecodeResult = cashAddressToLockingBytecode(contractAddr);\r\n if (typeof contractLockingBytecodeResult === 'string') {\r\n throw new Error(`Failed to convert contract address to locking bytecode: ${contractLockingBytecodeResult}`);\r\n }\r\n\r\n // Creating lockingBytecode for usersAddress\r\n const normalizedUserAddress = ensureAddressPrefix(usersAddress);\r\n const userTokenAddress = toTokenAddress(normalizedUserAddress);\r\n const lockingBytecodeResult = cashAddressToLockingBytecode(normalizedUserAddress);\r\n if (typeof lockingBytecodeResult === 'string') {\r\n throw new Error(`Failed to convert user address to locking bytecode: ${lockingBytecodeResult}`);\r\n }\r\n\r\n // Get user UTXOs\r\n const userUtxos = await electrumProvider.getUtxos(normalizedUserAddress);\r\n\r\n // Get userUTXO\r\n let userUTXO: Utxo | undefined;\r\n if (isAdmin) {\r\n userUTXO = userUtxos.find(\r\n utxo => utxo.token?.category === ticketMasterUtxo.token?.category && \r\n utxo.token?.nft?.capability === 'minting'\r\n );\r\n } else {\r\n // Find pure BCH payment UTXO (need ticketPrice & 3000+ sats for miner fee)\r\n userUTXO = userUtxos.find(\r\n utxo => utxo.satoshis >= (ticketPrice + 3000n) && !utxo.token,\r\n );\r\n\r\n if (!userUTXO) {\r\n // Count up all the sats in userUTXOs that do not have a token\r\n const totalSats = userUtxos.reduce((sum: bigint, utxo: Utxo) => {\r\n if (!utxo.token) {\r\n return sum + utxo.satoshis;\r\n }\r\n return sum;\r\n }, 0n);\r\n\r\n // If totalSats is enough, then user needs to consolidate\r\n if (totalSats >= ticketPrice + 3000n) {\r\n throw new Error('No compatible UTXO found in wallet, consolidate?');\r\n } else {\r\n throw new Error(`Not enough BCH in your wallet. Required: ${ticketPrice + 3000n} sats, Available: ${totalSats} sats`);\r\n }\r\n }\r\n }\r\n\r\n if (!userUTXO) {\r\n throw new Error('No suitable UTXO found for transaction');\r\n }\r\n\r\n // Build Transaction\r\n const p2pkhUnlocker: Unlocker = {\r\n generateLockingBytecode: () => {\r\n const result = cashAddressToLockingBytecode(normalizedUserAddress);\r\n if (typeof result === 'string') {\r\n throw new Error(`Failed to convert CashAddress to locking bytecode: ${result}`);\r\n }\r\n return result.bytecode;\r\n },\r\n generateUnlockingBytecode: () => {\r\n return Uint8Array.from([]);\r\n }\r\n };\r\n \r\n let transaction: any;\r\n try {\r\n transaction = await new TransactionBuilder({ provider: electrumProvider })\r\n .addInput(ticketMasterUtxo, ticketMasterContract.unlock.purchaseNFT(ticketType))\r\n .addInput(ticketUtxo, ticketMasterContract.unlock.purchaseNFT(ticketType))\r\n .addInput(userUTXO, p2pkhUnlocker)\r\n // Ticket master NFT being sent back to contract\r\n .addOutput({\r\n to: ticketMasterContract.tokenAddress, \r\n amount: ticketMasterUtxo.satoshis,\r\n token: {\r\n amount: ticketMasterUtxo.token?.amount!, \r\n category: ticketMasterUtxo.token?.category!, \r\n nft: {\r\n capability: ticketMasterUtxo.token?.nft?.capability!, \r\n commitment: ticketMasterUtxo.token?.nft?.commitment! \r\n }\r\n },\r\n })\r\n // Ticket being purchased\r\n .addOutput({\r\n to: userTokenAddress, \r\n amount: ticketUtxo.satoshis,\r\n token: {\r\n amount: ticketUtxo.token?.amount!, \r\n category: ticketUtxo.token?.category!, \r\n nft: {\r\n capability: ticketUtxo.token?.nft?.capability!, \r\n commitment: ticketUtxo.token?.nft?.commitment! + ticketType // ticketType appended to commitment\r\n }\r\n },\r\n })\r\n // Ticket price is sent to admin address\r\n if (isAdmin) {\r\n transaction.addOutput({\r\n to: adminAddress, \r\n amount: 1000n,\r\n });\r\n } else {\r\n transaction.addOutput({\r\n to: adminAddress, \r\n amount: ticketPrice,\r\n });\r\n }\r\n\r\n if (isAdmin) {\r\n transaction.addOutput({\r\n to: userTokenAddress, \r\n amount: userUTXO.satoshis - 2700n,\r\n token: {\r\n amount: userUTXO.token?.amount!, \r\n category: userUTXO.token?.category!, \r\n nft: {\r\n capability: userUTXO.token?.nft?.capability!, \r\n commitment: userUTXO.token?.nft?.commitment! \r\n }\r\n },\r\n });\r\n } else {\r\n // Calculate change amount (userUTXO - ticketPrice - miner fee)\r\n const changeAmount = userUTXO.satoshis - ticketPrice - 1700n;\r\n if (changeAmount > 1000n) { // Dust limit\r\n transaction.addOutput({\r\n to: normalizedUserAddress, \r\n amount: changeAmount\r\n });\r\n }\r\n }\r\n } catch (error) {\r\n if (error instanceof Error) {\r\n throw new Error(`Error building transaction: ${error.message}`);\r\n } else {\r\n throw new Error(`Error building transaction: ${String(error)}`);\r\n }\r\n }\r\n\r\n // Build the transaction\r\n const rawTransactionHex = await transaction.build();\r\n\r\n // Decode transaction for WalletConnect\r\n const decodedTransaction = decodeTransaction(hexToBin(rawTransactionHex));\r\n if (typeof decodedTransaction === \"string\") {\r\n throw new Error(\"Failed to decode transaction\");\r\n }\r\n\r\n // Clear unlocking bytecode for user input (input 2)\r\n decodedTransaction.inputs[2].unlockingBytecode = Uint8Array.from([]);\r\n\r\n // Convert hex strings to Uint8Array for token data\r\n const binTokenCategory = hexToBin(ticketMasterUtxo.token?.category!);\r\n const binTicketMasterCommitment = hexToBin(ticketMasterUtxo.token?.nft?.commitment!);\r\n const binTicketCommitment = hexToBin(ticketUtxo.token?.nft?.commitment!);\r\n const binUserCommitment = isAdmin ? hexToBin(userUTXO.token?.nft?.commitment!) : undefined;\r\n\r\n // Get redeemScript as Uint8Array\r\n const getRedeemScript = (): Uint8Array => {\r\n if ((ticketMasterContract.redeemScript as any).bytecode) {\r\n return (ticketMasterContract.redeemScript as any).bytecode;\r\n }\r\n if (typeof ticketMasterContract.redeemScript === 'string') {\r\n return hexToBin(ticketMasterContract.redeemScript);\r\n }\r\n return new Uint8Array(ticketMasterContract.redeemScript as any);\r\n };\r\n\r\n const redeemScript = getRedeemScript();\r\n\r\n // Construct source outputs for WalletConnect\r\n // Use raw Uint8Arrays and BigInts - stringify from @bitauth/libauth will handle serialization\r\n let listSourceOutputs = [\r\n {\r\n ...decodedTransaction.inputs[0],\r\n lockingBytecode: contractLockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(ticketMasterUtxo.satoshis),\r\n contract: {\r\n abiFunction: ticketMasterContract.artifact.abi,\r\n redeemScript: redeemScript,\r\n artifact: ticketMasterContract.artifact,\r\n },\r\n token: {\r\n amount: ticketMasterUtxo.token?.amount,\r\n category: binTokenCategory,\r\n nft: {\r\n capability: ticketMasterUtxo.token?.nft?.capability!,\r\n commitment: binTicketMasterCommitment\r\n }\r\n }\r\n },\r\n {\r\n ...decodedTransaction.inputs[1],\r\n lockingBytecode: contractLockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(ticketUtxo.satoshis),\r\n contract: {\r\n abiFunction: ticketMasterContract.artifact.abi,\r\n redeemScript: redeemScript,\r\n artifact: ticketMasterContract.artifact,\r\n },\r\n token: {\r\n amount: ticketUtxo.token?.amount,\r\n category: binTokenCategory,\r\n nft: {\r\n capability: ticketUtxo.token?.nft?.capability!,\r\n commitment: binTicketCommitment\r\n }\r\n }\r\n },\r\n ...(isAdmin ? [{\r\n ...decodedTransaction.inputs[2],\r\n lockingBytecode: lockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(userUTXO.satoshis),\r\n token: {\r\n amount: userUTXO.token?.amount,\r\n category: binTokenCategory,\r\n nft: {\r\n capability: userUTXO.token?.nft?.capability!,\r\n commitment: binUserCommitment!\r\n }\r\n }\r\n }] : [{\r\n ...decodedTransaction.inputs[2],\r\n lockingBytecode: lockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(userUTXO.satoshis),\r\n }])\r\n ];\r\n\r\n // Create transaction object for WalletConnect signing\r\n const wcTransactionObj: WalletConnectTransactionObject = {\r\n transaction: decodedTransaction,\r\n sourceOutputs: listSourceOutputs,\r\n broadcast: false,\r\n userPrompt: `Purchase Ticket Type ${ticketType} for ${ticketPrice} sats`\r\n };\r\n\r\n return wcTransactionObj;\r\n}\r\n\r\n","import { TransactionBuilder, Contract, Unlocker } from 'cashscript';\r\nimport { hexToBin, cashAddressToLockingBytecode, decodeTransaction } from '@bitauth/libauth';\r\nimport { ModifyTokenSaleParams, WalletConnectTransactionObject } from '../types';\r\nimport { ensureAddressPrefix, toLittleEndianHexString, toTokenAddress } from '../utils';\r\nimport contractArtifact from '../artifacts/TokenSales.json';\r\n\r\n/**\r\n * Modify TokenSale parameters (prices, endSale)\r\n * @param params - ModifyTokenSaleParams object containing all required parameters\r\n * @returns Promise resolving to WalletConnectTransactionObject ready for signing\r\n * @throws Error if validation fails or transaction building fails\r\n */\r\nexport async function modifyTokenSale(params: ModifyTokenSaleParams): Promise<WalletConnectTransactionObject> {\r\n const {\r\n electrumProvider,\r\n usersAddress,\r\n tokenSaleUtxo,\r\n userMintingUtxo,\r\n priceType1,\r\n priceType2,\r\n priceType3,\r\n endSale\r\n } = params;\r\n\r\n if (!electrumProvider) {\r\n throw new Error('Electrum provider not available');\r\n }\r\n\r\n // Compile the contract using the included artifact\r\n const tokenSaleContract = new Contract(contractArtifact as any, [], {\r\n provider: electrumProvider,\r\n addressType: 'p2sh32'\r\n });\r\n\r\n // Parse TokenSale commitment to validate\r\n const commitment = tokenSaleUtxo.token?.nft?.commitment || '';\r\n if (commitment.length !== 78) {\r\n throw new Error('Invalid TokenSale commitment');\r\n }\r\n\r\n // Get contract address from compiled contract\r\n const contractAddr = tokenSaleContract.address;\r\n\r\n // Creating lockingBytecode for contract address\r\n const contractLockingBytecodeResult = cashAddressToLockingBytecode(contractAddr);\r\n if (typeof contractLockingBytecodeResult === 'string') {\r\n throw new Error(`Failed to convert contract address to locking bytecode: ${contractLockingBytecodeResult}`);\r\n }\r\n\r\n // Creating lockingBytecode for usersAddress\r\n const normalizedUserAddress = ensureAddressPrefix(usersAddress);\r\n const userTokenAddress = toTokenAddress(normalizedUserAddress);\r\n const lockingBytecodeResult = cashAddressToLockingBytecode(normalizedUserAddress);\r\n if (typeof lockingBytecodeResult === 'string') {\r\n throw new Error(`Failed to convert user address to locking bytecode: ${lockingBytecodeResult}`);\r\n }\r\n\r\n // Build Transaction\r\n const p2pkhUnlocker: Unlocker = {\r\n generateLockingBytecode: () => {\r\n const result = cashAddressToLockingBytecode(normalizedUserAddress);\r\n if (typeof result === 'string') {\r\n throw new Error(`Failed to convert CashAddress to locking bytecode: ${result}`);\r\n }\r\n return result.bytecode;\r\n },\r\n generateUnlockingBytecode: () => {\r\n return Uint8Array.from([]);\r\n }\r\n };\r\n \r\n const priceType1Hex = toLittleEndianHexString(BigInt(priceType1), 5);\r\n const priceType2Hex = toLittleEndianHexString(BigInt(priceType2), 5);\r\n const priceType3Hex = toLittleEndianHexString(BigInt(priceType3), 5);\r\n const endSaleHex = toLittleEndianHexString(BigInt(endSale), 4);\r\n const adminPkh = tokenSaleUtxo.token?.nft?.commitment!.substring(38, 78);\r\n\r\n let transaction: any;\r\n try {\r\n transaction = await new TransactionBuilder({ provider: electrumProvider })\r\n .addInput(tokenSaleUtxo, tokenSaleContract.unlock.modifyTokenSale(priceType1Hex, priceType2Hex, priceType3Hex, endSaleHex))\r\n .addInput(userMintingUtxo, p2pkhUnlocker)\r\n // TokenSale NFT being sent back to contract with new commitment\r\n .addOutput({\r\n to: tokenSaleContract.tokenAddress, \r\n amount: tokenSaleUtxo.satoshis,\r\n token: {\r\n amount: tokenSaleUtxo.token?.amount!, \r\n category: tokenSaleUtxo.token?.category!, \r\n nft: {\r\n capability: tokenSaleUtxo.token?.nft?.capability!, \r\n commitment: priceType1Hex + priceType2Hex + priceType3Hex + endSaleHex + adminPkh\r\n }\r\n },\r\n })\r\n // Admin NFT being sent back to user\r\n .addOutput({\r\n to: userTokenAddress, \r\n amount: userMintingUtxo.satoshis - 1000n,\r\n token: {\r\n amount: userMintingUtxo.token?.amount!, \r\n category: userMintingUtxo.token?.category!, \r\n nft: {\r\n capability: userMintingUtxo.token?.nft?.capability!, \r\n commitment: userMintingUtxo.token?.nft?.commitment!\r\n }\r\n },\r\n });\r\n } catch (error) {\r\n if (error instanceof Error) {\r\n throw new Error(`Error building transaction: ${error.message}`);\r\n } else {\r\n throw new Error(`Error building transaction: ${String(error)}`);\r\n }\r\n }\r\n\r\n // Build the transaction\r\n const rawTransactionHex = await transaction.build();\r\n\r\n // Decode transaction for WalletConnect\r\n const decodedTransaction = decodeTransaction(hexToBin(rawTransactionHex));\r\n if (typeof decodedTransaction === \"string\") {\r\n throw new Error(\"Failed to decode transaction\");\r\n }\r\n\r\n // Clear unlocking bytecode for user input (input 1)\r\n decodedTransaction.inputs[1].unlockingBytecode = Uint8Array.from([]);\r\n\r\n // Convert hex strings to Uint8Array for token data\r\n const binTokenCategory = hexToBin(tokenSaleUtxo.token?.category!);\r\n const binTokenSaleCommitment = hexToBin(tokenSaleUtxo.token?.nft?.commitment!);\r\n const binUserMintingCommitment = hexToBin(userMintingUtxo.token?.nft?.commitment!);\r\n\r\n // Get redeemScript as Uint8Array\r\n const getRedeemScript = (): Uint8Array => {\r\n if ((tokenSaleContract.redeemScript as any).bytecode) {\r\n return (tokenSaleContract.redeemScript as any).bytecode;\r\n }\r\n if (typeof tokenSaleContract.redeemScript === 'string') {\r\n return hexToBin(tokenSaleContract.redeemScript);\r\n }\r\n return new Uint8Array(tokenSaleContract.redeemScript as any);\r\n };\r\n\r\n const redeemScript = getRedeemScript();\r\n\r\n // Construct source outputs for WalletConnect\r\n let listSourceOutputs = [\r\n {\r\n ...decodedTransaction.inputs[0],\r\n lockingBytecode: contractLockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(tokenSaleUtxo.satoshis),\r\n contract: {\r\n abiFunction: tokenSaleContract.artifact.abi,\r\n redeemScript: redeemScript,\r\n artifact: tokenSaleContract.artifact,\r\n },\r\n token: {\r\n amount: tokenSaleUtxo.token?.amount,\r\n category: binTokenCategory,\r\n nft: {\r\n capability: tokenSaleUtxo.token?.nft?.capability!,\r\n commitment: binTokenSaleCommitment\r\n }\r\n }\r\n },\r\n {\r\n ...decodedTransaction.inputs[1],\r\n lockingBytecode: lockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(userMintingUtxo.satoshis),\r\n token: {\r\n amount: userMintingUtxo.token?.amount,\r\n category: binTokenCategory,\r\n nft: {\r\n capability: userMintingUtxo.token?.nft?.capability!,\r\n commitment: binUserMintingCommitment\r\n }\r\n }\r\n }\r\n ];\r\n\r\n // Create transaction object for WalletConnect signing\r\n const wcTransactionObj: WalletConnectTransactionObject = {\r\n transaction: decodedTransaction,\r\n sourceOutputs: listSourceOutputs,\r\n broadcast: false,\r\n userPrompt: `Modify TokenSale NFT`\r\n };\r\n\r\n return wcTransactionObj;\r\n}\r\n\r\n","import { TransactionBuilder, Contract, Unlocker } from 'cashscript';\r\nimport { hexToBin, cashAddressToLockingBytecode, decodeTransaction } from '@bitauth/libauth';\r\nimport { BurnParams, WalletConnectTransactionObject } from '../types';\r\nimport { ensureAddressPrefix, toTokenAddress } from '../utils';\r\nimport contractArtifact from '../artifacts/TokenSales.json';\r\n\r\n/**\r\n * Burn a TicketMaster NFT and all associated tickets\r\n * @param params - BurnParams object containing all required parameters\r\n * @returns Promise resolving to WalletConnectTransactionObject ready for signing\r\n * @throws Error if validation fails or transaction building fails\r\n */\r\nexport async function burn(params: BurnParams): Promise<WalletConnectTransactionObject> {\r\n const {\r\n electrumProvider,\r\n usersAddress,\r\n ticketMasterUtxo,\r\n userMintingNFT,\r\n tickets\r\n } = params;\r\n\r\n if (!electrumProvider) {\r\n throw new Error('Electrum provider not available');\r\n }\r\n\r\n // Compile the contract using the included artifact\r\n const ticketMasterContract = new Contract(contractArtifact as any, [], {\r\n provider: electrumProvider,\r\n addressType: 'p2sh32'\r\n });\r\n\r\n // Get contract address from compiled contract\r\n const contractAddr = ticketMasterContract.address;\r\n\r\n // Creating lockingBytecode for contract address\r\n const contractLockingBytecodeResult = cashAddressToLockingBytecode(contractAddr);\r\n if (typeof contractLockingBytecodeResult === 'string') {\r\n throw new Error(`Failed to convert contract address to locking bytecode: ${contractLockingBytecodeResult}`);\r\n }\r\n\r\n // Creating lockingBytecode for usersAddress\r\n const normalizedUserAddress = ensureAddressPrefix(usersAddress);\r\n const userTokenAddress = toTokenAddress(normalizedUserAddress);\r\n const lockingBytecodeResult = cashAddressToLockingBytecode(normalizedUserAddress);\r\n if (typeof lockingBytecodeResult === 'string') {\r\n throw new Error(`Failed to convert user address to locking bytecode: ${lockingBytecodeResult}`);\r\n }\r\n\r\n // Build Transaction\r\n const p2pkhUnlocker: Unlocker = {\r\n generateLockingBytecode: () => {\r\n const result = cashAddressToLockingBytecode(normalizedUserAddress);\r\n if (typeof result === 'string') {\r\n throw new Error(`Failed to convert CashAddress to locking bytecode: ${result}`);\r\n }\r\n return result.bytecode;\r\n },\r\n generateUnlockingBytecode: () => {\r\n return Uint8Array.from([]);\r\n }\r\n };\r\n\r\n let transaction: any;\r\n try {\r\n // Start building transaction\r\n transaction = await new TransactionBuilder({ provider: electrumProvider })\r\n .addInput(userMintingNFT, p2pkhUnlocker)\r\n // Add TicketMaster to be burned\r\n .addInput(ticketMasterUtxo, ticketMasterContract.unlock.burnTokenSale());\r\n\r\n // Add all tickets to be burned\r\n for (const ticket of tickets) {\r\n transaction = transaction.addInput(ticket, ticketMasterContract.unlock.burnTokenSale());\r\n }\r\n\r\n // Send admin NFT back to user\r\n transaction = transaction.addOutput({\r\n to: userTokenAddress, \r\n amount: userMintingNFT.satoshis,\r\n token: {\r\n amount: userMintingNFT.token?.amount!, \r\n category: userMintingNFT.token?.category!, \r\n nft: {\r\n capability: userMintingNFT.token?.nft?.capability!, \r\n commitment: userMintingNFT.token?.nft?.commitment! \r\n }\r\n },\r\n });\r\n } catch (error) {\r\n if (error instanceof Error) {\r\n throw new Error(`Error building transaction: ${error.message}`);\r\n } else {\r\n throw new Error(`Error building transaction: ${String(error)}`);\r\n }\r\n }\r\n\r\n // Build the transaction\r\n const rawTransactionHex = await transaction.build();\r\n\r\n // Decode transaction for WalletConnect\r\n const decodedTransaction = decodeTransaction(hexToBin(rawTransactionHex));\r\n if (typeof decodedTransaction === \"string\") {\r\n throw new Error(\"Failed to decode transaction\");\r\n }\r\n\r\n // Clear unlocking bytecode for user input (input 0)\r\n decodedTransaction.inputs[0].unlockingBytecode = Uint8Array.from([]);\r\n\r\n // Convert hex strings to Uint8Array for token data\r\n const binTokenCategory = hexToBin(ticketMasterUtxo.token?.category!);\r\n const binTicketMasterCommitment = hexToBin(ticketMasterUtxo.token?.nft?.commitment!);\r\n const binUserMintingCommitment = hexToBin(userMintingNFT.token?.nft?.commitment!);\r\n // For each ticket, convert hex to Uint8Array\r\n const binTicketCommitments = tickets.map((ticket) => hexToBin(ticket.token?.nft?.commitment!));\r\n\r\n // Get redeemScript as Uint8Array\r\n const getRedeemScript = (): Uint8Array => {\r\n if ((ticketMasterContract.redeemScript as any).bytecode) {\r\n return (ticketMasterContract.redeemScript as any).bytecode;\r\n }\r\n if (typeof ticketMasterContract.redeemScript === 'string') {\r\n return hexToBin(ticketMasterContract.redeemScript);\r\n }\r\n return new Uint8Array(ticketMasterContract.redeemScript as any);\r\n };\r\n\r\n const redeemScript = getRedeemScript();\r\n\r\n // Construct source outputs for WalletConnect\r\n let listSourceOutputs = [\r\n {\r\n ...decodedTransaction.inputs[0],\r\n lockingBytecode: lockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(userMintingNFT.satoshis),\r\n token: {\r\n amount: userMintingNFT.token?.amount,\r\n category: binTokenCategory,\r\n nft: {\r\n capability: userMintingNFT.token?.nft?.capability!,\r\n commitment: binUserMintingCommitment\r\n }\r\n }\r\n },\r\n {\r\n ...decodedTransaction.inputs[1],\r\n lockingBytecode: contractLockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(ticketMasterUtxo.satoshis),\r\n contract: {\r\n abiFunction: ticketMasterContract.artifact.abi,\r\n redeemScript: redeemScript,\r\n artifact: ticketMasterContract.artifact,\r\n },\r\n token: {\r\n amount: ticketMasterUtxo.token?.amount,\r\n category: binTokenCategory,\r\n nft: {\r\n capability: ticketMasterUtxo.token?.nft?.capability!,\r\n commitment: binTicketMasterCommitment\r\n }\r\n }\r\n }\r\n ];\r\n\r\n // Add all tickets to the list of source outputs\r\n for (let i = 0; i < tickets.length; i++) {\r\n const ticket = tickets[i];\r\n listSourceOutputs.push({\r\n ...decodedTransaction.inputs[i + 2],\r\n lockingBytecode: contractLockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(ticket.satoshis),\r\n token: {\r\n amount: ticket.token?.amount,\r\n category: binTokenCategory,\r\n nft: {\r\n capability: ticket.token?.nft?.capability!,\r\n commitment: binTicketCommitments[i]\r\n }\r\n }\r\n });\r\n }\r\n\r\n // Create transaction object for WalletConnect signing\r\n const wcTransactionObj: WalletConnectTransactionObject = {\r\n transaction: decodedTransaction,\r\n sourceOutputs: listSourceOutputs,\r\n broadcast: false,\r\n userPrompt: `Burn TicketMaster and ${tickets.length} tickets`\r\n };\r\n\r\n return wcTransactionObj;\r\n}\r\n\r\n","import { TransactionBuilder, Utxo, Unlocker } from 'cashscript';\r\nimport { hexToBin, cashAddressToLockingBytecode, decodeTransaction } from '@bitauth/libauth';\r\nimport { AddSatoshisParams, WalletConnectTransactionObject } from '../types';\r\nimport { ensureAddressPrefix, toTokenAddress } from '../utils';\r\n\r\n/**\r\n * Add satoshis to a minting NFT\r\n * @param params - AddSatoshisParams object containing all required parameters\r\n * @returns Promise resolving to WalletConnectTransactionObject ready for signing\r\n * @throws Error if validation fails or transaction building fails\r\n */\r\nexport async function addSatoshis(params: AddSatoshisParams): Promise<WalletConnectTransactionObject> {\r\n const {\r\n electrumProvider,\r\n usersAddress,\r\n userMintingNFT,\r\n additionalSatoshis\r\n } = params;\r\n\r\n if (!electrumProvider) {\r\n throw new Error('Electrum provider not available');\r\n }\r\n\r\n if (additionalSatoshis <= 0n) {\r\n throw new Error('Additional satoshis must be greater than 0');\r\n }\r\n\r\n // Creating lockingBytecode for usersAddress\r\n const normalizedUserAddress = ensureAddressPrefix(usersAddress);\r\n const userTokenAddress = toTokenAddress(normalizedUserAddress);\r\n const lockingBytecodeResult = cashAddressToLockingBytecode(normalizedUserAddress);\r\n if (typeof lockingBytecodeResult === 'string') {\r\n throw new Error(`Failed to convert user address to locking bytecode: ${lockingBytecodeResult}`);\r\n }\r\n\r\n // Get user UTXOs to find a BCH UTXO to fund the additional satoshis\r\n const userUtxos = await electrumProvider.getUtxos(normalizedUserAddress);\r\n\r\n // Find a BCH UTXO with enough satoshis (additionalSatoshis + miner fee ~1000 sats)\r\n const fundingUTXO = userUtxos.find(\r\n utxo => utxo.satoshis >= (additionalSatoshis + 1000n) && !utxo.token\r\n );\r\n\r\n if (!fundingUTXO) {\r\n // Count up all the sats in userUTXOs that do not have a token\r\n const totalSats = userUtxos.reduce((sum: bigint, utxo: Utxo) => {\r\n if (!utxo.token) {\r\n return sum + utxo.satoshis;\r\n }\r\n return sum;\r\n }, 0n);\r\n\r\n if (totalSats >= additionalSatoshis + 1000n) {\r\n throw new Error('No compatible UTXO found in wallet, consolidate?');\r\n } else {\r\n throw new Error(`Not enough BCH in your wallet. Required: ${additionalSatoshis + 1000n} sats, Available: ${totalSats} sats`);\r\n }\r\n }\r\n\r\n // Build Transaction\r\n const p2pkhUnlocker: Unlocker = {\r\n generateLockingBytecode: () => {\r\n const result = cashAddressToLockingBytecode(normalizedUserAddress);\r\n if (typeof result === 'string') {\r\n throw new Error(`Failed to convert CashAddress to locking bytecode: ${result}`);\r\n }\r\n return result.bytecode;\r\n },\r\n generateUnlockingBytecode: () => {\r\n return Uint8Array.from([]);\r\n }\r\n };\r\n\r\n let transaction: any;\r\n try {\r\n transaction = await new TransactionBuilder({ provider: electrumProvider })\r\n // Add the minting NFT as input\r\n .addInput(userMintingNFT, p2pkhUnlocker)\r\n // Add the funding UTXO to provide additional satoshis\r\n .addInput(fundingUTXO, p2pkhUnlocker)\r\n // Output: minting NFT with additional satoshis\r\n .addOutput({\r\n to: userTokenAddress,\r\n amount: userMintingNFT.satoshis + additionalSatoshis,\r\n token: {\r\n amount: userMintingNFT.token?.amount!,\r\n category: userMintingNFT.token?.category!,\r\n nft: {\r\n capability: userMintingNFT.token?.nft?.capability!,\r\n commitment: userMintingNFT.token?.nft?.commitment!\r\n }\r\n },\r\n });\r\n\r\n // Calculate change (fundingUTXO - additionalSatoshis - miner fee)\r\n const changeAmount = fundingUTXO.satoshis - additionalSatoshis - 1000n;\r\n if (changeAmount >= 1000n) { // Dust limit\r\n transaction.addOutput({\r\n to: normalizedUserAddress,\r\n amount: changeAmount,\r\n });\r\n }\r\n } catch (error) {\r\n if (error instanceof Error) {\r\n throw new Error(`Error building transaction: ${error.message}`);\r\n } else {\r\n throw new Error(`Error building transaction: ${String(error)}`);\r\n }\r\n }\r\n\r\n // Build the transaction\r\n const rawTransactionHex = await transaction.build();\r\n\r\n // Decode transaction for WalletConnect\r\n const decodedTransaction = decodeTransaction(hexToBin(rawTransactionHex));\r\n if (typeof decodedTransaction === \"string\") {\r\n throw new Error(\"Failed to decode transaction\");\r\n }\r\n\r\n // Clear unlocking bytecode for user inputs (wallet will sign these)\r\n decodedTransaction.inputs[0].unlockingBytecode = Uint8Array.from([]);\r\n decodedTransaction.inputs[1].unlockingBytecode = Uint8Array.from([]);\r\n\r\n // Convert hex strings to Uint8Array for token data\r\n const binTokenCategory = hexToBin(userMintingNFT.token?.category!);\r\n const binMintingCommitment = hexToBin(userMintingNFT.token?.nft?.commitment!);\r\n\r\n // Get locking bytecode for user address\r\n const userLockingBytecodeResult = cashAddressToLockingBytecode(normalizedUserAddress);\r\n if (typeof userLockingBytecodeResult === 'string') {\r\n throw new Error(`Failed to convert user address to locking bytecode: ${userLockingBytecodeResult}`);\r\n }\r\n\r\n // Construct source outputs for WalletConnect\r\n const listSourceOutputs = [\r\n {\r\n ...decodedTransaction.inputs[0],\r\n lockingBytecode: userLockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(userMintingNFT.satoshis),\r\n token: {\r\n amount: userMintingNFT.token?.amount,\r\n category: binTokenCategory,\r\n nft: {\r\n capability: userMintingNFT.token?.nft?.capability!,\r\n commitment: binMintingCommitment\r\n }\r\n }\r\n },\r\n {\r\n ...decodedTransaction.inputs[1],\r\n lockingBytecode: userLockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(fundingUTXO.satoshis)\r\n }\r\n ];\r\n\r\n // Create transaction object for WalletConnect signing\r\n const wcTransactionObj: WalletConnectTransactionObject = {\r\n transaction: decodedTransaction,\r\n sourceOutputs: listSourceOutputs,\r\n broadcast: false,\r\n userPrompt: `Add ${additionalSatoshis} satoshis to minting NFT`\r\n };\r\n\r\n return wcTransactionObj;\r\n}\r\n\r\n","// TokenSales_old1 contract addresses\r\n//export const AddressTicketMaster = 'bitcoincash:pvh0yat7d2r9nf228fpns3mypydvstq9arftt9qlmma42xeq2eryszkdd99zq'; //address hash: 2ef2757e6a8659a54a3a43384764091ac82c05e8d2b5941fdefb551b20564648\r\n//export const AddressTicketMasterToken = 'bitcoincash:rvh0yat7d2r9nf228fpns3mypydvstq9arftt9qlmma42xeq2eryss93vuymt';\r\n\r\n// TokenSales contract addresses | simplified change fee calculation in purchaseNFT()\r\nexport const AddressTicketMaster = 'bitcoincash:pdmta0t3lmeufrhjlmyxkx3ye648lvr08cdwmy36eqtkj4wzpagg2m4afvzlt'; //address hash: 76bebd71fef3c48ef2fec86b1a24ceaa7fb06f3e1aed923ac8176955c20f5085\r\nexport const AddressTicketMasterToken = 'bitcoincash:rdmta0t3lmeufrhjlmyxkx3ye648lvr08cdwmy36eqtkj4wzpagg2fxpg4rxq';\r\n\r\n\r\n// Ticket Level Descriptions\r\nexport const TICKET_LEVEL_DESCRIPTIONS = {\r\n '01': {\r\n name: 'Regular',\r\n description: 'Regular tickets provide standard access to the event. This is the base level ticket option.'\r\n },\r\n '02': {\r\n name: 'VIP',\r\n description: 'VIP tickets offer enhanced benefits including priority access, exclusive areas, and additional perks.'\r\n },\r\n '03': {\r\n name: 'Premium',\r\n description: 'Premium tickets provide the highest level of access with all VIP benefits plus additional exclusive features.'\r\n }\r\n};\r\n\r\n","import { TransactionBuilder, Contract, Unlocker } from 'cashscript';\r\nimport { hexToBin, cashAddressToLockingBytecode, decodeTransaction } from '@bitauth/libauth';\r\nimport { CreateListingParams, WalletConnectTransactionObject } from '../types';\r\nimport { ensureAddressPrefix, toLittleEndianHexString, toTokenAddress } from '../utils';\r\nimport contractArtifact from '../artifacts/TokenSales.json';\r\nimport { AddressTicketMasterToken } from '../constants/values';\r\n\r\n/**\r\n * Create a new TicketMaster listing\r\n * @param params - CreateListingParams object containing all required parameters\r\n * @returns Promise resolving to WalletConnectTransactionObject ready for signing\r\n * @throws Error if validation fails or transaction building fails\r\n */\r\nexport async function createListing(params: CreateListingParams): Promise<WalletConnectTransactionObject> {\r\n const {\r\n electrumProvider,\r\n usersAddress,\r\n userMintingNFT,\r\n priceType1,\r\n priceType2,\r\n priceType3,\r\n endSale,\r\n adminPubKeyHash\r\n } = params;\r\n\r\n if (!electrumProvider) {\r\n throw new Error('Electrum provider not available');\r\n }\r\n\r\n // Compile the contract using the included artifact\r\n const ticketMasterContract = new Contract(contractArtifact as any, [], {\r\n provider: electrumProvider,\r\n addressType: 'p2sh32'\r\n });\r\n\r\n // Validate adminPubKeyHash\r\n const adminPkhHex = adminPubKeyHash.replace(/^0x/i, '').trim();\r\n if (adminPkhHex.length !== 40 || !/^[0-9a-fA-F]+$/.test(adminPkhHex)) {\r\n throw new Error('Admin PubKey Hash must be 40 hex characters (20 bytes)');\r\n }\r\n\r\n // Normalize user address\r\n const normalizedUserAddress = ensureAddressPrefix(usersAddress);\r\n const userTokenAddress = toTokenAddress(normalizedUserAddress);\r\n const lockingBytecodeResult = cashAddressToLockingBytecode(normalizedUserAddress);\r\n if (typeof lockingBytecodeResult === 'string') {\r\n throw new Error(`Failed to convert user address to locking bytecode: ${lockingBytecodeResult}`);\r\n }\r\n\r\n // Get token address from compiled contract\r\n const contractTokenAddr = ticketMasterContract.tokenAddress;\r\nconsole.log('contractTokenAddr', contractTokenAddr);\r\nconsole.log('AddressTicketMasterToken', AddressTicketMasterToken);\r\n // Get locking bytecode for contract token address\r\n const contractTokenLockingBytecodeResult = cashAddressToLockingBytecode(contractTokenAddr);\r\n if (typeof contractTokenLockingBytecodeResult === 'string') {\r\n throw new Error(`Failed to convert contract token address to locking bytecode: ${contractTokenLockingBytecodeResult}`);\r\n }\r\n\r\n // Build TicketMaster commitment\r\n // Format: bytes5 priceType1 + bytes5 priceType2 + bytes5 priceType3 + bytes4 endSale + bytes20 adminPubKeyHash\r\n // Total: 39 bytes = 78 hex chars\r\n const priceType1Hex = toLittleEndianHexString(priceType1, 5); // 10 hex chars\r\n const priceType2Hex = toLittleEndianHexString(priceType2, 5); // 10 hex chars\r\n const priceType3Hex = toLittleEndianHexString(priceType3, 5); // 10 hex chars\r\n const endSaleHex = toLittleEndianHexString(endSale, 4); // 8 hex chars\r\n const ticketMasterCommitment = priceType1Hex + priceType2Hex + priceType3Hex + endSaleHex + adminPkhHex;\r\n \r\n if (ticketMasterCommitment.length !== 78) {\r\n throw new Error(`Invalid commitment length: ${ticketMasterCommitment.length}, expected 78`);\r\n }\r\n\r\n // Build Transaction\r\n const p2pkhUnlocker: Unlocker = {\r\n generateLockingBytecode: () => {\r\n const result = cashAddressToLockingBytecode(normalizedUserAddress);\r\n if (typeof result === 'string') {\r\n throw new Error(`Failed to convert CashAddress to locking bytecode: ${result}`);\r\n }\r\n return result.bytecode;\r\n },\r\n generateUnlockingBytecode: () => {\r\n return Uint8Array.from([]);\r\n }\r\n };\r\n\r\n let transaction: any;\r\n try {\r\n transaction = await new TransactionBuilder({ provider: electrumProvider })\r\n // Input: user's minting NFT\r\n .addInput(userMintingNFT, p2pkhUnlocker)\r\n // Output 0: user's minting NFT back to user\r\n .addOutput({\r\n to: userTokenAddress,\r\n amount: userMintingNFT.satoshis - 2000n,\r\n token: {\r\n amount: userMintingNFT.token?.amount!,\r\n category: userMintingNFT.token?.category!,\r\n nft: {\r\n capability: userMintingNFT.token?.nft?.capability!,\r\n commitment: userMintingNFT.token?.nft?.commitment!\r\n }\r\n },\r\n })\r\n // Output 1: TicketMaster Minting NFT to contract token address\r\n .addOutput({\r\n to: contractTokenAddr,\r\n amount: 1000n,\r\n token: {\r\n amount: userMintingNFT.token?.amount!,\r\n category: userMintingNFT.token?.category!,\r\n nft: {\r\n capability: 'minting',\r\n commitment: ticketMasterCommitment\r\n }\r\n },\r\n });\r\n } catch (error) {\r\n if (error instanceof Error) {\r\n throw new Error(`Error building transaction: ${error.message}`);\r\n } else {\r\n throw new Error(`Error building transaction: ${String(error)}`);\r\n }\r\n }\r\n\r\n // Build the transaction\r\n const rawTransactionHex = await transaction.build();\r\n\r\n // Decode transaction for WalletConnect\r\n const decodedTransaction = decodeTransaction(hexToBin(rawTransactionHex));\r\n if (typeof decodedTransaction === \"string\") {\r\n throw new Error(\"Failed to decode transaction\");\r\n }\r\n\r\n // Clear unlocking bytecode for user input (wallet will sign this)\r\n decodedTransaction.inputs[0].unlockingBytecode = Uint8Array.from([]);\r\n\r\n // Convert hex strings to Uint8Array for token data\r\n const binTokenCategory = hexToBin(userMintingNFT.token?.category!);\r\n const binUserCommitment = hexToBin(userMintingNFT.token?.nft?.commitment!);\r\n\r\n // Construct source outputs for WalletConnect\r\n const listSourceOutputs = [\r\n {\r\n ...decodedTransaction.inputs[0],\r\n lockingBytecode: lockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(userMintingNFT.satoshis),\r\n token: {\r\n amount: userMintingNFT.token?.amount,\r\n category: binTokenCategory,\r\n nft: {\r\n capability: userMintingNFT.token?.nft?.capability!,\r\n commitment: binUserCommitment\r\n }\r\n }\r\n }\r\n ];\r\n\r\n // Create transaction object for WalletConnect signing\r\n const wcTransactionObj: WalletConnectTransactionObject = {\r\n transaction: decodedTransaction,\r\n sourceOutputs: listSourceOutputs,\r\n broadcast: false,\r\n userPrompt: `Create TicketMaster listing`\r\n };\r\n\r\n return wcTransactionObj;\r\n}\r\n\r\n","/**\r\n * TokenSales contract addresses\r\n * These are the addresses for the TokenSales (TicketMaster) contract\r\n */\r\nimport { AddressTicketMaster, AddressTicketMasterToken } from './constants/values';\r\n\r\nexport const DEFAULT_CONTRACT_ADDRESSES = {\r\n contract: AddressTicketMaster,\r\n token: AddressTicketMasterToken\r\n} as const;\r\n\r\n/**\r\n * Get contract address\r\n * @returns Contract address\r\n */\r\nexport function getContractAddress(): string {\r\n return AddressTicketMaster;\r\n}\r\n\r\n/**\r\n * Get token address\r\n * @returns Token address\r\n */\r\nexport function getTokenAddress(): string {\r\n return AddressTicketMasterToken;\r\n}\r\n\r\n/**\r\n * Get contract addresses\r\n * @returns Object with contract and token addresses\r\n */\r\nexport function getContractAddresses() {\r\n return {\r\n contract: AddressTicketMaster,\r\n token: AddressTicketMasterToken\r\n };\r\n}\r\n\r\n","import { Utxo } from 'cashscript';\nimport { ListAvailableTicketsParams } from '../types';\nimport { getTokenAddress } from '../config';\nimport { parseTicketMasterCommitment, isTicketMaster, isTicket } from '../utils/ticketMaster';\n\n/**\n * List available tickets for purchase from a TokenSale\n * @param params - ListAvailableTicketsParams object containing all required parameters\n * @returns Promise resolving to array of ticket UTXOs that are available for purchase\n * @throws Error if validation fails or TokenSale is not found/active\n */\nexport async function listAvailableTickets(params: ListAvailableTicketsParams): Promise<Utxo[]> {\n const {\n electrumProvider,\n categoryID\n } = params;\n\n if (!electrumProvider) {\n throw new Error('Electrum provider not available');\n }\n\n if (!categoryID || categoryID.length === 0) {\n throw new Error('Category ID is required');\n }\n\n // Get the contract token address\n const contractTokenAddress = getTokenAddress();\n\n // Get all UTXOs from the contract token address\n const contractUtxos = await electrumProvider.getUtxos(contractTokenAddress);\n\n // Filter UTXOs to only those matching the categoryID\n const categoryUtxos = contractUtxos.filter((utxo: Utxo) => \n utxo?.token?.category === categoryID\n );\n\n if (categoryUtxos.length === 0) {\n return []; // No UTXOs found for this category\n }\n\n // Find the TokenSale minting NFT (capability === 'minting')\n const tokenSaleUtxo = categoryUtxos.find((utxo: Utxo) => \n isTicketMaster(utxo)\n );\n\n if (!tokenSaleUtxo) {\n throw new Error(`No active TokenSale found for category ${categoryID}`);\n }\n\n // Parse the TokenSale commitment to get endSale block height\n const commitment = tokenSaleUtxo.token?.nft?.commitment || '';\n const tokenSaleData = parseTicketMasterCommitment(commitment);\n\n if (!tokenSaleData) {\n throw new Error('Failed to parse TokenSale commitment');\n }\n\n // Filter to only ticket UTXOs (capability === 'none')\n const availableTickets = categoryUtxos.filter((utxo: Utxo) => \n isTicket(utxo, categoryID)\n );\n\n return availableTickets;\n}\n","import { ListAllSalesParams, TokenSaleUtxo } from '../types';\r\nimport { getTokenAddress } from '../config';\r\nimport { isTicketMaster, parseTicketMasterCommitment } from '../utils/ticketMaster';\r\n\r\n/**\r\n * List all TokenSale NFTs (minting capability & 39-byte commitment)\r\n * @param params - ListAllSalesParams object containing the electrum provider\r\n * @returns Promise resolving to array of TokenSale UTXOs with parsed commitment data\r\n */\r\nexport async function listAllSales(params: ListAllSalesParams): Promise<TokenSaleUtxo[]> {\r\n const { electrumProvider } = params;\r\n\r\n if (!electrumProvider) {\r\n throw new Error('Electrum provider not available');\r\n }\r\n\r\n // Get the contract token address\r\n const contractTokenAddress = getTokenAddress();\r\n\r\n // Get all UTXOs from the contract token address\r\n const contractUtxos = await electrumProvider.getUtxos(contractTokenAddress);\r\n\r\n // Filter to only TokenSale NFTs (minting capability with 39-byte commitment)\r\n const tokenSaleUtxos: TokenSaleUtxo[] = [];\r\n\r\n for (const utxo of contractUtxos) {\r\n if (isTicketMaster(utxo)) {\r\n const commitment = utxo.token?.nft?.commitment || '';\r\n const tokenSaleData = parseTicketMasterCommitment(commitment);\r\n\r\n if (tokenSaleData) {\r\n tokenSaleUtxos.push({\r\n ...utxo,\r\n tokenSaleData\r\n });\r\n }\r\n }\r\n }\r\n\r\n return tokenSaleUtxos;\r\n}\r\n","import { ListActiveSalesParams, TokenSaleUtxo } from '../types';\r\nimport { getTokenAddress } from '../config';\r\nimport { isTicketMaster, parseTicketMasterCommitment } from '../utils/ticketMaster';\r\n\r\n/**\r\n * List active TokenSale NFTs (minting capability, 39-byte commitment, sale not ended)\r\n * A sale is active when current blockheight > endSale commitment field\r\n * @param params - ListActiveSalesParams object containing the electrum provider\r\n * @returns Promise resolving to array of active TokenSale UTXOs with parsed commitment data\r\n */\r\nexport async function listActiveSales(params: ListActiveSalesParams): Promise<TokenSaleUtxo[]> {\r\n const { electrumProvider } = params;\r\n\r\n if (!electrumProvider) {\r\n throw new Error('Electrum provider not available');\r\n }\r\n\r\n // Get current block height\r\n let currentBlockHeight: number;\r\n if (typeof (electrumProvider as any).getBlockHeight === 'function') {\r\n currentBlockHeight = await (electrumProvider as any).getBlockHeight();\r\n } else if (typeof (electrumProvider as any).performRequest === 'function') {\r\n try {\r\n const header = await (electrumProvider as any).performRequest('blockchain.headers.subscribe');\r\n currentBlockHeight = header?.height || header;\r\n } catch (e) {\r\n // Fallback: try to get block height from getUtxos call\r\n throw new Error('Unable to get block height from provider');\r\n }\r\n } else {\r\n throw new Error('Unable to get block height from provider');\r\n }\r\n\r\n // Get the contract token address\r\n const contractTokenAddress = getTokenAddress();\r\n\r\n // Get all UTXOs from the contract token address\r\n const contractUtxos = await electrumProvider.getUtxos(contractTokenAddress);\r\n\r\n // Filter to only active TokenSale NFTs (sale not ended)\r\n const activeSales: TokenSaleUtxo[] = [];\r\n\r\n for (const utxo of contractUtxos) {\r\n if (isTicketMaster(utxo)) {\r\n const commitment = utxo.token?.nft?.commitment || '';\r\n const tokenSaleData = parseTicketMasterCommitment(commitment);\r\n\r\n if (tokenSaleData) {\r\n // Sale is active when current blockheight > endSale\r\n if (currentBlockHeight < tokenSaleData.endSale) {\r\n activeSales.push({\r\n ...utxo,\r\n tokenSaleData\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n return activeSales;\r\n}\r\n"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -670,16 +670,24 @@ async function buyNFT(params) {
670
670
  commitment: ticketUtxo.token?.nft?.commitment + ticketType // ticketType appended to commitment
671
671
  }
672
672
  },
673
- })
674
- // Ticket price is sent to admin address
675
- .addOutput({
676
- to: adminAddress,
677
- amount: ticketPrice,
678
673
  });
674
+ // Ticket price is sent to admin address
675
+ if (isAdmin) {
676
+ transaction.addOutput({
677
+ to: adminAddress,
678
+ amount: 1000n,
679
+ });
680
+ }
681
+ else {
682
+ transaction.addOutput({
683
+ to: adminAddress,
684
+ amount: ticketPrice,
685
+ });
686
+ }
679
687
  if (isAdmin) {
680
688
  transaction.addOutput({
681
689
  to: userTokenAddress,
682
- amount: userUTXO.satoshis - 2000n,
690
+ amount: userUTXO.satoshis - 2700n,
683
691
  token: {
684
692
  amount: userUTXO.token?.amount,
685
693
  category: userUTXO.token?.category,
@@ -692,7 +700,7 @@ async function buyNFT(params) {
692
700
  }
693
701
  else {
694
702
  // Calculate change amount (userUTXO - ticketPrice - miner fee)
695
- const changeAmount = userUTXO.satoshis - ticketPrice - 2000n;
703
+ const changeAmount = userUTXO.satoshis - ticketPrice - 1700n;
696
704
  if (changeAmount > 1000n) { // Dust limit
697
705
  transaction.addOutput({
698
706
  to: normalizedUserAddress,
@@ -1460,9 +1468,9 @@ function getContractAddresses() {
1460
1468
 
1461
1469
  /**
1462
1470
  * List available tickets for purchase from a TokenSale
1463
- * Returns ALL UTXOs matching the categoryID, excluding the TokenSale NFT (minting capability)
1464
1471
  * @param params - ListAvailableTicketsParams object containing all required parameters
1465
- * @returns Promise resolving to array of ticket UTXOs (excluding the TokenSale NFT)
1472
+ * @returns Promise resolving to array of ticket UTXOs that are available for purchase
1473
+ * @throws Error if validation fails or TokenSale is not found/active
1466
1474
  */
1467
1475
  async function listAvailableTickets(params) {
1468
1476
  const { electrumProvider, categoryID } = params;
@@ -1486,8 +1494,14 @@ async function listAvailableTickets(params) {
1486
1494
  if (!tokenSaleUtxo) {
1487
1495
  throw new Error(`No active TokenSale found for category ${categoryID}`);
1488
1496
  }
1489
- // Return all UTXOs EXCEPT the TokenSale NFT (minting capability)
1490
- const availableTickets = categoryUtxos.filter((utxo) => !isTicketMaster(utxo));
1497
+ // Parse the TokenSale commitment to get endSale block height
1498
+ const commitment = tokenSaleUtxo.token?.nft?.commitment || '';
1499
+ const tokenSaleData = parseTicketMasterCommitment(commitment);
1500
+ if (!tokenSaleData) {
1501
+ throw new Error('Failed to parse TokenSale commitment');
1502
+ }
1503
+ // Filter to only ticket UTXOs (capability === 'none')
1504
+ const availableTickets = categoryUtxos.filter((utxo) => isTicket(utxo, categoryID));
1491
1505
  return availableTickets;
1492
1506
  }
1493
1507
 
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/utils/signTransaction.ts","../src/utils/ticketMaster.ts","../src/utils/toTokenAddress.ts","../src/utils/index.ts","../src/functions/buyNFT.ts","../src/functions/modifyTokenSale.ts","../src/functions/burn.ts","../src/functions/addSatoshis.ts","../src/constants/values.ts","../src/functions/createListing.ts","../src/config.ts","../src/functions/listAvailableTickets.ts","../src/functions/listAllSales.ts","../src/functions/listActiveSales.ts"],"sourcesContent":["import { stringify } from '@bitauth/libauth';\r\n\r\n/**\r\n * Creates a signTransaction function for WalletConnect v2\r\n * This function handles transaction signing through WalletConnect's SignClient\r\n * \r\n * @param signClient - The WalletConnect SignClient instance\r\n * @param connectedChain - The connected chain ID (fallback if not found in session)\r\n * @returns A function that signs transactions via WalletConnect\r\n */\r\nexport function createSignTransaction(\r\n signClient: any,\r\n connectedChain?: string\r\n): (transactionOptions: any) => Promise<any> {\r\n return async (transactionOptions: any) => {\r\n if (!signClient) {\r\n throw new Error('SignClient not available. Please ensure wallet is connected.');\r\n }\r\n \r\n // Get all active sessions\r\n const sessions = signClient.session.getAll();\r\n \r\n if (sessions.length === 0) {\r\n throw new Error('No active wallet session. Please connect your wallet first.');\r\n }\r\n \r\n // Use the first active session\r\n const session = sessions[0];\r\n \r\n // Extract chainId from session\r\n // In WalletConnect v2, chainId is in the accounts array as \"chainId:address\"\r\n let chainId: string | null = null;\r\n \r\n const namespaces = session.namespaces || {};\r\n const bchNamespace = namespaces.bch;\r\n \r\n if (bchNamespace && bchNamespace.accounts && bchNamespace.accounts.length > 0) {\r\n // Extract chainId from first account (format: \"chainId:address\")\r\n const firstAccount = bchNamespace.accounts[0];\r\n const accountParts = firstAccount.split(':');\r\n if (accountParts.length >= 2) {\r\n // Reconstruct chainId (could be \"bch:mainnet\" or \"bch:bchtest:chipnet\")\r\n chainId = accountParts.slice(0, -1).join(':'); // Everything except the address part\r\n }\r\n }\r\n \r\n // Fallback: try to find chainId from any namespace\r\n if (!chainId) {\r\n for (const namespaceKey in namespaces) {\r\n const namespace = namespaces[namespaceKey];\r\n if (namespace.accounts && namespace.accounts.length > 0) {\r\n const firstAccount = namespace.accounts[0];\r\n const accountParts = firstAccount.split(':');\r\n if (accountParts.length >= 2 && accountParts[0].includes('bch')) {\r\n chainId = accountParts.slice(0, -1).join(':');\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n \r\n // Final fallback\r\n if (!chainId) {\r\n chainId = connectedChain || 'bch:mainnet';\r\n }\r\n \r\n // Use the same pattern as the working project: JSON.parse(stringify(obj))\r\n // stringify from @bitauth/libauth handles BigInt and Uint8Array serialization\r\n const serializableTxObj = JSON.parse(stringify(transactionOptions));\r\n \r\n try {\r\n const result = await signClient.request({\r\n chainId,\r\n topic: session.topic,\r\n request: {\r\n method: 'bch_signTransaction',\r\n params: serializableTxObj,\r\n },\r\n });\r\n return result;\r\n } catch (error: any) {\r\n // Handle WalletConnect relay errors gracefully\r\n if (error?.message?.includes('onRelayMessage') || error?.message?.includes('failed to process')) {\r\n // The transaction might still have been signed, so we'll let the caller handle it\r\n }\r\n throw error;\r\n }\r\n };\r\n}\r\n\r\n","/**\r\n * Utility functions for parsing TicketMaster NFT data\r\n */\r\n\r\nexport interface TicketMasterData {\r\n priceType1: bigint;\r\n priceType2: bigint;\r\n priceType3: bigint;\r\n endSale: number;\r\n adminPubKeyHash: string;\r\n}\r\n\r\n/**\r\n * Parses TicketMaster NFT commitment to extract sale data\r\n * Commitment format:\r\n * - bytes5 priceType1 (0-5)\r\n * - bytes5 priceType2 (5-10)\r\n * - bytes5 priceType3 (10-15)\r\n * - bytes4 endSale (15-19)\r\n * - bytes20 adminPubKeyHash (19-39)\r\n */\r\nexport function parseTicketMasterCommitment(commitment: string): TicketMasterData | null {\r\n if (!commitment || commitment.length < 78) { // 39 bytes = 78 hex chars\r\n return null;\r\n }\r\n\r\n try {\r\n // Extract priceType1 (bytes5 = 10 hex chars, positions 0-10)\r\n // CashScript stores numbers in little-endian format\r\n const priceType1Hex = commitment.substring(0, 10);\r\n const priceType1BE = priceType1Hex.match(/.{2}/g)?.reverse().join('') || priceType1Hex;\r\n const priceType1 = BigInt('0x' + priceType1BE);\r\n\r\n // Extract priceType2 (bytes5 = 10 hex chars, positions 10-20)\r\n const priceType2Hex = commitment.substring(10, 20);\r\n const priceType2BE = priceType2Hex.match(/.{2}/g)?.reverse().join('') || priceType2Hex;\r\n const priceType2 = BigInt('0x' + priceType2BE);\r\n\r\n // Extract priceType3 (bytes5 = 10 hex chars, positions 20-30)\r\n const priceType3Hex = commitment.substring(20, 30);\r\n const priceType3BE = priceType3Hex.match(/.{2}/g)?.reverse().join('') || priceType3Hex;\r\n const priceType3 = BigInt('0x' + priceType3BE);\r\n\r\n // Extract endSale (bytes4 = 8 hex chars, positions 30-38)\r\n // CashScript stores numbers in little-endian format\r\n // Contract uses: bytes endSale = tx.inputs[0].nftCommitment.slice(15,19);\r\n // This is bytes 15-19 (0-indexed), which is hex positions 30-38\r\n const endSaleHex = commitment.substring(30, 38);\r\n const endSaleBE = endSaleHex.match(/.{2}/g)?.reverse().join('') || endSaleHex;\r\n const endSale = parseInt(endSaleBE, 16);\r\n\r\n // Extract adminPubKeyHash (bytes20 = 40 hex chars, positions 38-78)\r\n const adminPubKeyHash = commitment.substring(38, 78);\r\n\r\n return {\r\n priceType1,\r\n priceType2,\r\n priceType3,\r\n endSale,\r\n adminPubKeyHash,\r\n };\r\n } catch (error) {\r\n console.error('Failed to parse TicketMaster commitment:', error);\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Checks if a UTXO is a TicketMaster (has minting capability)\r\n */\r\nexport function isTicketMaster(utxo: any): boolean {\r\n return (\r\n utxo?.token?.nft?.capability === 'minting' &&\r\n utxo?.token?.nft?.commitment &&\r\n utxo.token.nft.commitment.length >= 78\r\n );\r\n}\r\n\r\n/**\r\n * Checks if a UTXO is a ticket (same category as TicketMaster but immutable)\r\n */\r\nexport function isTicket(utxo: any, ticketMasterCategory: string): boolean {\r\n return (\r\n utxo?.token?.category === ticketMasterCategory &&\r\n utxo?.token?.nft?.capability === 'none'\r\n );\r\n}\r\n\r\n/**\r\n * Formats satoshis to BCH\r\n */\r\nexport function formatBCH(satoshis: bigint | number | string): string {\r\n const sats = typeof satoshis === 'string' ? BigInt(satoshis) : BigInt(satoshis);\r\n const bch = Number(sats) / 100000000;\r\n return bch.toFixed(8);\r\n}\r\n\r\n","import { decodeCashAddress, encodeCashAddress } from '@bitauth/libauth';\r\n\r\n/**\r\n * Converts a regular Bitcoin Cash address to its token address equivalent\r\n * @param address - Bitcoin Cash address (p2pkh)\r\n * @returns Token address (p2pkhWithTokens)\r\n */\r\nfunction toTokenAddress(address: string): string {\r\n const addressInfo: any = decodeCashAddress(address);\r\n const pkhPayoutBin = addressInfo.payload;\r\n const prefix = addressInfo.prefix;\r\n const tokenAddressResult = encodeCashAddress({prefix, type: \"p2pkhWithTokens\", payload: pkhPayoutBin});\r\n \r\n // In libauth v3, encodeCashAddress returns a CashAddressResult object\r\n if (typeof tokenAddressResult === 'string') {\r\n return tokenAddressResult;\r\n }\r\n return tokenAddressResult.address;\r\n}\r\n\r\nexport default toTokenAddress;\r\n\r\n","/**\r\n * Shared utility functions\r\n */\r\n\r\nexport { createSignTransaction } from './signTransaction';\r\nexport { parseTicketMasterCommitment, formatBCH, isTicketMaster, isTicket, type TicketMasterData } from './ticketMaster';\r\nexport { default as toTokenAddress } from './toTokenAddress';\r\n\r\n/**\r\n * Ensures an address has the bitcoincash: prefix for libauth functions\r\n * Addresses from AppKit may come without the prefix after normalization\r\n */\r\nexport function ensureAddressPrefix(address: string): string {\r\n // If address already has a prefix, return as-is\r\n if (address.includes(':')) {\r\n return address;\r\n }\r\n \r\n // Add bitcoincash: prefix for mainnet addresses\r\n // Addresses starting with 'q' or 'p' are mainnet\r\n if (address.startsWith('q') || address.startsWith('p')) {\r\n return `bitcoincash:${address}`;\r\n }\r\n \r\n // For testnet addresses starting with 'bchtest:' or 'q'/'p' on testnet\r\n // This is a simple check - you may need to adjust based on your network\r\n return `bitcoincash:${address}`;\r\n}\r\n\r\n/**\r\n * Converts hex string to Uint8Array\r\n */\r\nexport function hexToUint8Array(hexString: string): Uint8Array {\r\n const bytes = new Uint8Array(hexString.length / 2);\r\n for (let i = 0; i < bytes.length; i++) {\r\n bytes[i] = parseInt(hexString.substr(i * 2, 2), 16);\r\n }\r\n return bytes;\r\n}\r\n\r\n/**\r\n * Converts a number to little-endian hex string\r\n * @param number - The number to convert\r\n * @param byteCount - Number of bytes (e.g., 5 for bytes5, 4 for bytes4)\r\n */\r\nexport function toLittleEndianHexString(number: bigint | number, byteCount: number): string {\r\n const num = typeof number === 'bigint' ? number : BigInt(number);\r\n let hex = num.toString(16);\r\n hex = hex.padStart(byteCount * 2, '0'); // Pad with zeros to ensure correct byteCount\r\n // Split into chunks of 2 (bytes), reverse (for little endian), and join back\r\n return hex.match(/../g)?.reverse().join('') ?? '';\r\n}\r\n\r\n","import { TransactionBuilder, Contract, Utxo, Unlocker } from 'cashscript';\r\nimport { hexToBin, cashAddressToLockingBytecode, decodeTransaction, encodeCashAddress } from '@bitauth/libauth';\r\nimport { BuyNFTParams, WalletConnectTransactionObject } from '../types';\r\nimport { ensureAddressPrefix, hexToUint8Array, toTokenAddress } from '../utils';\r\nimport contractArtifact from '../artifacts/TokenSales.json';\r\n\r\n/**\r\n * Purchase a ticket NFT from a TicketMaster\r\n * @param params - BuyNFTParams object containing all required parameters\r\n * @returns Promise resolving to WalletConnectTransactionObject ready for signing\r\n * @throws Error if validation fails or transaction building fails\r\n */\r\nexport async function buyNFT(params: BuyNFTParams): Promise<WalletConnectTransactionObject> {\r\n const {\r\n electrumProvider,\r\n usersAddress,\r\n ticketMasterUtxo,\r\n ticketUtxo,\r\n ticketType,\r\n isAdmin\r\n } = params;\r\n\r\n if (!electrumProvider) {\r\n throw new Error('Electrum provider not available');\r\n }\r\n\r\n // Compile the contract using the included artifact\r\n const ticketMasterContract = new Contract(contractArtifact as any, [], {\r\n provider: electrumProvider,\r\n addressType: 'p2sh32'\r\n });\r\n\r\n // Parse TicketMaster commitment to get price and admin address\r\n const commitment = ticketMasterUtxo.token?.nft?.commitment || '';\r\n if (commitment.length !== 78) {\r\n throw new Error('Invalid TicketMaster commitment');\r\n }\r\n\r\n // Extract price based on ticket type (little-endian format)\r\n let ticketPrice: bigint;\r\n let priceHex: string;\r\n \r\n if (ticketType === '01') {\r\n priceHex = commitment.substring(0, 10);\r\n const priceBE = priceHex.match(/.{2}/g)?.reverse().join('') || priceHex;\r\n ticketPrice = BigInt('0x' + priceBE);\r\n } else if (ticketType === '02') {\r\n priceHex = commitment.substring(10, 20);\r\n const priceBE = priceHex.match(/.{2}/g)?.reverse().join('') || priceHex;\r\n ticketPrice = BigInt('0x' + priceBE);\r\n if (ticketPrice === 0n) {\r\n throw new Error('Ticket type 2 is not available');\r\n }\r\n } else if (ticketType === '03') {\r\n priceHex = commitment.substring(20, 30);\r\n const priceBE = priceHex.match(/.{2}/g)?.reverse().join('') || priceHex;\r\n ticketPrice = BigInt('0x' + priceBE);\r\n if (ticketPrice === 0n) {\r\n throw new Error('Ticket type 3 is not available');\r\n }\r\n } else {\r\n throw new Error('Invalid ticket type');\r\n }\r\n\r\n // Extract admin pubkey hash (bytes20 = 40 hex chars, positions 38-78)\r\n const adminPubKeyHashHex = commitment.substring(38, 78);\r\n \r\n // Convert hex string to Uint8Array\r\n const adminPKHUint8Array = hexToUint8Array(adminPubKeyHashHex);\r\n \r\n // Derive admin address from embedded pubkey hash\r\n const prefix = 'bitcoincash';\r\n const addressType = 'p2pkh';\r\n const adminAddressResult = encodeCashAddress({\r\n prefix,\r\n type: addressType,\r\n payload: adminPKHUint8Array\r\n });\r\n \r\n if (typeof adminAddressResult === 'string') {\r\n throw new Error(`Failed to encode admin address: ${adminAddressResult}`);\r\n }\r\n const adminAddress = adminAddressResult.address;\r\n \r\n // Get contract address from compiled contract\r\n const contractAddr = ticketMasterContract.address;\r\n \r\n // Convert address to locking bytecode\r\n const contractLockingBytecodeResult = cashAddressToLockingBytecode(contractAddr);\r\n if (typeof contractLockingBytecodeResult === 'string') {\r\n throw new Error(`Failed to convert contract address to locking bytecode: ${contractLockingBytecodeResult}`);\r\n }\r\n\r\n // Creating lockingBytecode for usersAddress\r\n const normalizedUserAddress = ensureAddressPrefix(usersAddress);\r\n const userTokenAddress = toTokenAddress(normalizedUserAddress);\r\n const lockingBytecodeResult = cashAddressToLockingBytecode(normalizedUserAddress);\r\n if (typeof lockingBytecodeResult === 'string') {\r\n throw new Error(`Failed to convert user address to locking bytecode: ${lockingBytecodeResult}`);\r\n }\r\n\r\n // Get user UTXOs\r\n const userUtxos = await electrumProvider.getUtxos(normalizedUserAddress);\r\n\r\n // Get userUTXO\r\n let userUTXO: Utxo | undefined;\r\n if (isAdmin) {\r\n userUTXO = userUtxos.find(\r\n utxo => utxo.token?.category === ticketMasterUtxo.token?.category && \r\n utxo.token?.nft?.capability === 'minting'\r\n );\r\n } else {\r\n // Find pure BCH payment UTXO (need ticketPrice & 3000+ sats for miner fee)\r\n userUTXO = userUtxos.find(\r\n utxo => utxo.satoshis >= (ticketPrice + 3000n) && !utxo.token,\r\n );\r\n\r\n if (!userUTXO) {\r\n // Count up all the sats in userUTXOs that do not have a token\r\n const totalSats = userUtxos.reduce((sum: bigint, utxo: Utxo) => {\r\n if (!utxo.token) {\r\n return sum + utxo.satoshis;\r\n }\r\n return sum;\r\n }, 0n);\r\n\r\n // If totalSats is enough, then user needs to consolidate\r\n if (totalSats >= ticketPrice + 3000n) {\r\n throw new Error('No compatible UTXO found in wallet, consolidate?');\r\n } else {\r\n throw new Error(`Not enough BCH in your wallet. Required: ${ticketPrice + 3000n} sats, Available: ${totalSats} sats`);\r\n }\r\n }\r\n }\r\n\r\n if (!userUTXO) {\r\n throw new Error('No suitable UTXO found for transaction');\r\n }\r\n\r\n // Build Transaction\r\n const p2pkhUnlocker: Unlocker = {\r\n generateLockingBytecode: () => {\r\n const result = cashAddressToLockingBytecode(normalizedUserAddress);\r\n if (typeof result === 'string') {\r\n throw new Error(`Failed to convert CashAddress to locking bytecode: ${result}`);\r\n }\r\n return result.bytecode;\r\n },\r\n generateUnlockingBytecode: () => {\r\n return Uint8Array.from([]);\r\n }\r\n };\r\n \r\n let transaction: any;\r\n try {\r\n transaction = await new TransactionBuilder({ provider: electrumProvider })\r\n .addInput(ticketMasterUtxo, ticketMasterContract.unlock.purchaseNFT(ticketType))\r\n .addInput(ticketUtxo, ticketMasterContract.unlock.purchaseNFT(ticketType))\r\n .addInput(userUTXO, p2pkhUnlocker)\r\n // Ticket master NFT being sent back to contract\r\n .addOutput({\r\n to: ticketMasterContract.tokenAddress, \r\n amount: ticketMasterUtxo.satoshis,\r\n token: {\r\n amount: ticketMasterUtxo.token?.amount!, \r\n category: ticketMasterUtxo.token?.category!, \r\n nft: {\r\n capability: ticketMasterUtxo.token?.nft?.capability!, \r\n commitment: ticketMasterUtxo.token?.nft?.commitment! \r\n }\r\n },\r\n })\r\n // Ticket being purchased\r\n .addOutput({\r\n to: userTokenAddress, \r\n amount: ticketUtxo.satoshis,\r\n token: {\r\n amount: ticketUtxo.token?.amount!, \r\n category: ticketUtxo.token?.category!, \r\n nft: {\r\n capability: ticketUtxo.token?.nft?.capability!, \r\n commitment: ticketUtxo.token?.nft?.commitment! + ticketType // ticketType appended to commitment\r\n }\r\n },\r\n })\r\n // Ticket price is sent to admin address\r\n .addOutput({\r\n to: adminAddress, \r\n amount: ticketPrice,\r\n });\r\n\r\n if (isAdmin) {\r\n transaction.addOutput({\r\n to: userTokenAddress, \r\n amount: userUTXO.satoshis - 2000n,\r\n token: {\r\n amount: userUTXO.token?.amount!, \r\n category: userUTXO.token?.category!, \r\n nft: {\r\n capability: userUTXO.token?.nft?.capability!, \r\n commitment: userUTXO.token?.nft?.commitment! \r\n }\r\n },\r\n });\r\n } else {\r\n // Calculate change amount (userUTXO - ticketPrice - miner fee)\r\n const changeAmount = userUTXO.satoshis - ticketPrice - 2000n;\r\n if (changeAmount > 1000n) { // Dust limit\r\n transaction.addOutput({\r\n to: normalizedUserAddress, \r\n amount: changeAmount\r\n });\r\n }\r\n }\r\n } catch (error) {\r\n if (error instanceof Error) {\r\n throw new Error(`Error building transaction: ${error.message}`);\r\n } else {\r\n throw new Error(`Error building transaction: ${String(error)}`);\r\n }\r\n }\r\n\r\n // Build the transaction\r\n const rawTransactionHex = await transaction.build();\r\n\r\n // Decode transaction for WalletConnect\r\n const decodedTransaction = decodeTransaction(hexToBin(rawTransactionHex));\r\n if (typeof decodedTransaction === \"string\") {\r\n throw new Error(\"Failed to decode transaction\");\r\n }\r\n\r\n // Clear unlocking bytecode for user input (input 2)\r\n decodedTransaction.inputs[2].unlockingBytecode = Uint8Array.from([]);\r\n\r\n // Convert hex strings to Uint8Array for token data\r\n const binTokenCategory = hexToBin(ticketMasterUtxo.token?.category!);\r\n const binTicketMasterCommitment = hexToBin(ticketMasterUtxo.token?.nft?.commitment!);\r\n const binTicketCommitment = hexToBin(ticketUtxo.token?.nft?.commitment!);\r\n const binUserCommitment = isAdmin ? hexToBin(userUTXO.token?.nft?.commitment!) : undefined;\r\n\r\n // Get redeemScript as Uint8Array\r\n const getRedeemScript = (): Uint8Array => {\r\n if ((ticketMasterContract.redeemScript as any).bytecode) {\r\n return (ticketMasterContract.redeemScript as any).bytecode;\r\n }\r\n if (typeof ticketMasterContract.redeemScript === 'string') {\r\n return hexToBin(ticketMasterContract.redeemScript);\r\n }\r\n return new Uint8Array(ticketMasterContract.redeemScript as any);\r\n };\r\n\r\n const redeemScript = getRedeemScript();\r\n\r\n // Construct source outputs for WalletConnect\r\n // Use raw Uint8Arrays and BigInts - stringify from @bitauth/libauth will handle serialization\r\n let listSourceOutputs = [\r\n {\r\n ...decodedTransaction.inputs[0],\r\n lockingBytecode: contractLockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(ticketMasterUtxo.satoshis),\r\n contract: {\r\n abiFunction: ticketMasterContract.artifact.abi,\r\n redeemScript: redeemScript,\r\n artifact: ticketMasterContract.artifact,\r\n },\r\n token: {\r\n amount: ticketMasterUtxo.token?.amount,\r\n category: binTokenCategory,\r\n nft: {\r\n capability: ticketMasterUtxo.token?.nft?.capability!,\r\n commitment: binTicketMasterCommitment\r\n }\r\n }\r\n },\r\n {\r\n ...decodedTransaction.inputs[1],\r\n lockingBytecode: contractLockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(ticketUtxo.satoshis),\r\n contract: {\r\n abiFunction: ticketMasterContract.artifact.abi,\r\n redeemScript: redeemScript,\r\n artifact: ticketMasterContract.artifact,\r\n },\r\n token: {\r\n amount: ticketUtxo.token?.amount,\r\n category: binTokenCategory,\r\n nft: {\r\n capability: ticketUtxo.token?.nft?.capability!,\r\n commitment: binTicketCommitment\r\n }\r\n }\r\n },\r\n ...(isAdmin ? [{\r\n ...decodedTransaction.inputs[2],\r\n lockingBytecode: lockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(userUTXO.satoshis),\r\n token: {\r\n amount: userUTXO.token?.amount,\r\n category: binTokenCategory,\r\n nft: {\r\n capability: userUTXO.token?.nft?.capability!,\r\n commitment: binUserCommitment!\r\n }\r\n }\r\n }] : [{\r\n ...decodedTransaction.inputs[2],\r\n lockingBytecode: lockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(userUTXO.satoshis),\r\n }])\r\n ];\r\n\r\n // Create transaction object for WalletConnect signing\r\n const wcTransactionObj: WalletConnectTransactionObject = {\r\n transaction: decodedTransaction,\r\n sourceOutputs: listSourceOutputs,\r\n broadcast: false,\r\n userPrompt: `Purchase Ticket Type ${ticketType} for ${ticketPrice} sats`\r\n };\r\n\r\n return wcTransactionObj;\r\n}\r\n\r\n","import { TransactionBuilder, Contract, Utxo, Unlocker } from 'cashscript';\r\nimport { hexToBin, cashAddressToLockingBytecode, decodeTransaction } from '@bitauth/libauth';\r\nimport { ModifyTokenSaleParams, WalletConnectTransactionObject } from '../types';\r\nimport { ensureAddressPrefix, toLittleEndianHexString, toTokenAddress } from '../utils';\r\nimport contractArtifact from '../artifacts/TokenSales.json';\r\n\r\n/**\r\n * Modify TokenSale parameters (prices, endSale)\r\n * @param params - ModifyTokenSaleParams object containing all required parameters\r\n * @returns Promise resolving to WalletConnectTransactionObject ready for signing\r\n * @throws Error if validation fails or transaction building fails\r\n */\r\nexport async function modifyTokenSale(params: ModifyTokenSaleParams): Promise<WalletConnectTransactionObject> {\r\n const {\r\n electrumProvider,\r\n usersAddress,\r\n tokenSaleUtxo,\r\n userMintingUtxo,\r\n priceType1,\r\n priceType2,\r\n priceType3,\r\n endSale\r\n } = params;\r\n\r\n if (!electrumProvider) {\r\n throw new Error('Electrum provider not available');\r\n }\r\n\r\n // Compile the contract using the included artifact\r\n const tokenSaleContract = new Contract(contractArtifact as any, [], {\r\n provider: electrumProvider,\r\n addressType: 'p2sh32'\r\n });\r\n\r\n // Parse TokenSale commitment to validate\r\n const commitment = tokenSaleUtxo.token?.nft?.commitment || '';\r\n if (commitment.length !== 78) {\r\n throw new Error('Invalid TokenSale commitment');\r\n }\r\n\r\n // Get contract address from compiled contract\r\n const contractAddr = tokenSaleContract.address;\r\n\r\n // Creating lockingBytecode for contract address\r\n const contractLockingBytecodeResult = cashAddressToLockingBytecode(contractAddr);\r\n if (typeof contractLockingBytecodeResult === 'string') {\r\n throw new Error(`Failed to convert contract address to locking bytecode: ${contractLockingBytecodeResult}`);\r\n }\r\n\r\n // Creating lockingBytecode for usersAddress\r\n const normalizedUserAddress = ensureAddressPrefix(usersAddress);\r\n const userTokenAddress = toTokenAddress(normalizedUserAddress);\r\n const lockingBytecodeResult = cashAddressToLockingBytecode(normalizedUserAddress);\r\n if (typeof lockingBytecodeResult === 'string') {\r\n throw new Error(`Failed to convert user address to locking bytecode: ${lockingBytecodeResult}`);\r\n }\r\n\r\n // Build Transaction\r\n const p2pkhUnlocker: Unlocker = {\r\n generateLockingBytecode: () => {\r\n const result = cashAddressToLockingBytecode(normalizedUserAddress);\r\n if (typeof result === 'string') {\r\n throw new Error(`Failed to convert CashAddress to locking bytecode: ${result}`);\r\n }\r\n return result.bytecode;\r\n },\r\n generateUnlockingBytecode: () => {\r\n return Uint8Array.from([]);\r\n }\r\n };\r\n \r\n const priceType1Hex = toLittleEndianHexString(BigInt(priceType1), 5);\r\n const priceType2Hex = toLittleEndianHexString(BigInt(priceType2), 5);\r\n const priceType3Hex = toLittleEndianHexString(BigInt(priceType3), 5);\r\n const endSaleHex = toLittleEndianHexString(BigInt(endSale), 4);\r\n const adminPkh = tokenSaleUtxo.token?.nft?.commitment!.substring(38, 78);\r\n\r\n let transaction: any;\r\n try {\r\n transaction = await new TransactionBuilder({ provider: electrumProvider })\r\n .addInput(tokenSaleUtxo, tokenSaleContract.unlock.modifyTokenSale(priceType1Hex, priceType2Hex, priceType3Hex, endSaleHex))\r\n .addInput(userMintingUtxo, p2pkhUnlocker)\r\n // TokenSale NFT being sent back to contract with new commitment\r\n .addOutput({\r\n to: tokenSaleContract.tokenAddress, \r\n amount: tokenSaleUtxo.satoshis,\r\n token: {\r\n amount: tokenSaleUtxo.token?.amount!, \r\n category: tokenSaleUtxo.token?.category!, \r\n nft: {\r\n capability: tokenSaleUtxo.token?.nft?.capability!, \r\n commitment: priceType1Hex + priceType2Hex + priceType3Hex + endSaleHex + adminPkh\r\n }\r\n },\r\n })\r\n // Admin NFT being sent back to user\r\n .addOutput({\r\n to: userTokenAddress, \r\n amount: userMintingUtxo.satoshis - 1000n,\r\n token: {\r\n amount: userMintingUtxo.token?.amount!, \r\n category: userMintingUtxo.token?.category!, \r\n nft: {\r\n capability: userMintingUtxo.token?.nft?.capability!, \r\n commitment: userMintingUtxo.token?.nft?.commitment!\r\n }\r\n },\r\n });\r\n } catch (error) {\r\n if (error instanceof Error) {\r\n throw new Error(`Error building transaction: ${error.message}`);\r\n } else {\r\n throw new Error(`Error building transaction: ${String(error)}`);\r\n }\r\n }\r\n\r\n // Build the transaction\r\n const rawTransactionHex = await transaction.build();\r\n\r\n // Decode transaction for WalletConnect\r\n const decodedTransaction = decodeTransaction(hexToBin(rawTransactionHex));\r\n if (typeof decodedTransaction === \"string\") {\r\n throw new Error(\"Failed to decode transaction\");\r\n }\r\n\r\n // Clear unlocking bytecode for user input (input 1)\r\n decodedTransaction.inputs[1].unlockingBytecode = Uint8Array.from([]);\r\n\r\n // Convert hex strings to Uint8Array for token data\r\n const binTokenCategory = hexToBin(tokenSaleUtxo.token?.category!);\r\n const binTokenSaleCommitment = hexToBin(tokenSaleUtxo.token?.nft?.commitment!);\r\n const binUserMintingCommitment = hexToBin(userMintingUtxo.token?.nft?.commitment!);\r\n\r\n // Get redeemScript as Uint8Array\r\n const getRedeemScript = (): Uint8Array => {\r\n if ((tokenSaleContract.redeemScript as any).bytecode) {\r\n return (tokenSaleContract.redeemScript as any).bytecode;\r\n }\r\n if (typeof tokenSaleContract.redeemScript === 'string') {\r\n return hexToBin(tokenSaleContract.redeemScript);\r\n }\r\n return new Uint8Array(tokenSaleContract.redeemScript as any);\r\n };\r\n\r\n const redeemScript = getRedeemScript();\r\n\r\n // Construct source outputs for WalletConnect\r\n let listSourceOutputs = [\r\n {\r\n ...decodedTransaction.inputs[0],\r\n lockingBytecode: contractLockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(tokenSaleUtxo.satoshis),\r\n contract: {\r\n abiFunction: tokenSaleContract.artifact.abi,\r\n redeemScript: redeemScript,\r\n artifact: tokenSaleContract.artifact,\r\n },\r\n token: {\r\n amount: tokenSaleUtxo.token?.amount,\r\n category: binTokenCategory,\r\n nft: {\r\n capability: tokenSaleUtxo.token?.nft?.capability!,\r\n commitment: binTokenSaleCommitment\r\n }\r\n }\r\n },\r\n {\r\n ...decodedTransaction.inputs[1],\r\n lockingBytecode: lockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(userMintingUtxo.satoshis),\r\n token: {\r\n amount: userMintingUtxo.token?.amount,\r\n category: binTokenCategory,\r\n nft: {\r\n capability: userMintingUtxo.token?.nft?.capability!,\r\n commitment: binUserMintingCommitment\r\n }\r\n }\r\n }\r\n ];\r\n\r\n // Create transaction object for WalletConnect signing\r\n const wcTransactionObj: WalletConnectTransactionObject = {\r\n transaction: decodedTransaction,\r\n sourceOutputs: listSourceOutputs,\r\n broadcast: false,\r\n userPrompt: `Modify TokenSale NFT`\r\n };\r\n\r\n return wcTransactionObj;\r\n}\r\n\r\n","import { TransactionBuilder, Contract, Utxo, Unlocker } from 'cashscript';\r\nimport { hexToBin, cashAddressToLockingBytecode, decodeTransaction } from '@bitauth/libauth';\r\nimport { BurnParams, WalletConnectTransactionObject } from '../types';\r\nimport { ensureAddressPrefix, toTokenAddress } from '../utils';\r\nimport contractArtifact from '../artifacts/TokenSales.json';\r\n\r\n/**\r\n * Burn a TicketMaster NFT and all associated tickets\r\n * @param params - BurnParams object containing all required parameters\r\n * @returns Promise resolving to WalletConnectTransactionObject ready for signing\r\n * @throws Error if validation fails or transaction building fails\r\n */\r\nexport async function burn(params: BurnParams): Promise<WalletConnectTransactionObject> {\r\n const {\r\n electrumProvider,\r\n usersAddress,\r\n ticketMasterUtxo,\r\n userMintingNFT,\r\n tickets\r\n } = params;\r\n\r\n if (!electrumProvider) {\r\n throw new Error('Electrum provider not available');\r\n }\r\n\r\n // Compile the contract using the included artifact\r\n const ticketMasterContract = new Contract(contractArtifact as any, [], {\r\n provider: electrumProvider,\r\n addressType: 'p2sh32'\r\n });\r\n\r\n // Get contract address from compiled contract\r\n const contractAddr = ticketMasterContract.address;\r\n\r\n // Creating lockingBytecode for contract address\r\n const contractLockingBytecodeResult = cashAddressToLockingBytecode(contractAddr);\r\n if (typeof contractLockingBytecodeResult === 'string') {\r\n throw new Error(`Failed to convert contract address to locking bytecode: ${contractLockingBytecodeResult}`);\r\n }\r\n\r\n // Creating lockingBytecode for usersAddress\r\n const normalizedUserAddress = ensureAddressPrefix(usersAddress);\r\n const userTokenAddress = toTokenAddress(normalizedUserAddress);\r\n const lockingBytecodeResult = cashAddressToLockingBytecode(normalizedUserAddress);\r\n if (typeof lockingBytecodeResult === 'string') {\r\n throw new Error(`Failed to convert user address to locking bytecode: ${lockingBytecodeResult}`);\r\n }\r\n\r\n // Build Transaction\r\n const p2pkhUnlocker: Unlocker = {\r\n generateLockingBytecode: () => {\r\n const result = cashAddressToLockingBytecode(normalizedUserAddress);\r\n if (typeof result === 'string') {\r\n throw new Error(`Failed to convert CashAddress to locking bytecode: ${result}`);\r\n }\r\n return result.bytecode;\r\n },\r\n generateUnlockingBytecode: () => {\r\n return Uint8Array.from([]);\r\n }\r\n };\r\n\r\n let transaction: any;\r\n try {\r\n // Start building transaction\r\n transaction = await new TransactionBuilder({ provider: electrumProvider })\r\n .addInput(userMintingNFT, p2pkhUnlocker)\r\n // Add TicketMaster to be burned\r\n .addInput(ticketMasterUtxo, ticketMasterContract.unlock.burnTokenSale());\r\n\r\n // Add all tickets to be burned\r\n for (const ticket of tickets) {\r\n transaction = transaction.addInput(ticket, ticketMasterContract.unlock.burnTokenSale());\r\n }\r\n\r\n // Send admin NFT back to user\r\n transaction = transaction.addOutput({\r\n to: userTokenAddress, \r\n amount: userMintingNFT.satoshis,\r\n token: {\r\n amount: userMintingNFT.token?.amount!, \r\n category: userMintingNFT.token?.category!, \r\n nft: {\r\n capability: userMintingNFT.token?.nft?.capability!, \r\n commitment: userMintingNFT.token?.nft?.commitment! \r\n }\r\n },\r\n });\r\n } catch (error) {\r\n if (error instanceof Error) {\r\n throw new Error(`Error building transaction: ${error.message}`);\r\n } else {\r\n throw new Error(`Error building transaction: ${String(error)}`);\r\n }\r\n }\r\n\r\n // Build the transaction\r\n const rawTransactionHex = await transaction.build();\r\n\r\n // Decode transaction for WalletConnect\r\n const decodedTransaction = decodeTransaction(hexToBin(rawTransactionHex));\r\n if (typeof decodedTransaction === \"string\") {\r\n throw new Error(\"Failed to decode transaction\");\r\n }\r\n\r\n // Clear unlocking bytecode for user input (input 0)\r\n decodedTransaction.inputs[0].unlockingBytecode = Uint8Array.from([]);\r\n\r\n // Convert hex strings to Uint8Array for token data\r\n const binTokenCategory = hexToBin(ticketMasterUtxo.token?.category!);\r\n const binTicketMasterCommitment = hexToBin(ticketMasterUtxo.token?.nft?.commitment!);\r\n const binUserMintingCommitment = hexToBin(userMintingNFT.token?.nft?.commitment!);\r\n // For each ticket, convert hex to Uint8Array\r\n const binTicketCommitments = tickets.map((ticket) => hexToBin(ticket.token?.nft?.commitment!));\r\n\r\n // Get redeemScript as Uint8Array\r\n const getRedeemScript = (): Uint8Array => {\r\n if ((ticketMasterContract.redeemScript as any).bytecode) {\r\n return (ticketMasterContract.redeemScript as any).bytecode;\r\n }\r\n if (typeof ticketMasterContract.redeemScript === 'string') {\r\n return hexToBin(ticketMasterContract.redeemScript);\r\n }\r\n return new Uint8Array(ticketMasterContract.redeemScript as any);\r\n };\r\n\r\n const redeemScript = getRedeemScript();\r\n\r\n // Construct source outputs for WalletConnect\r\n let listSourceOutputs = [\r\n {\r\n ...decodedTransaction.inputs[0],\r\n lockingBytecode: lockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(userMintingNFT.satoshis),\r\n token: {\r\n amount: userMintingNFT.token?.amount,\r\n category: binTokenCategory,\r\n nft: {\r\n capability: userMintingNFT.token?.nft?.capability!,\r\n commitment: binUserMintingCommitment\r\n }\r\n }\r\n },\r\n {\r\n ...decodedTransaction.inputs[1],\r\n lockingBytecode: contractLockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(ticketMasterUtxo.satoshis),\r\n contract: {\r\n abiFunction: ticketMasterContract.artifact.abi,\r\n redeemScript: redeemScript,\r\n artifact: ticketMasterContract.artifact,\r\n },\r\n token: {\r\n amount: ticketMasterUtxo.token?.amount,\r\n category: binTokenCategory,\r\n nft: {\r\n capability: ticketMasterUtxo.token?.nft?.capability!,\r\n commitment: binTicketMasterCommitment\r\n }\r\n }\r\n }\r\n ];\r\n\r\n // Add all tickets to the list of source outputs\r\n for (let i = 0; i < tickets.length; i++) {\r\n const ticket = tickets[i];\r\n listSourceOutputs.push({\r\n ...decodedTransaction.inputs[i + 2],\r\n lockingBytecode: contractLockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(ticket.satoshis),\r\n token: {\r\n amount: ticket.token?.amount,\r\n category: binTokenCategory,\r\n nft: {\r\n capability: ticket.token?.nft?.capability!,\r\n commitment: binTicketCommitments[i]\r\n }\r\n }\r\n });\r\n }\r\n\r\n // Create transaction object for WalletConnect signing\r\n const wcTransactionObj: WalletConnectTransactionObject = {\r\n transaction: decodedTransaction,\r\n sourceOutputs: listSourceOutputs,\r\n broadcast: false,\r\n userPrompt: `Burn TicketMaster and ${tickets.length} tickets`\r\n };\r\n\r\n return wcTransactionObj;\r\n}\r\n\r\n","import { TransactionBuilder, Utxo, Unlocker } from 'cashscript';\r\nimport { hexToBin, cashAddressToLockingBytecode, decodeTransaction } from '@bitauth/libauth';\r\nimport { AddSatoshisParams, WalletConnectTransactionObject } from '../types';\r\nimport { ensureAddressPrefix, toTokenAddress } from '../utils';\r\n\r\n/**\r\n * Add satoshis to a minting NFT\r\n * @param params - AddSatoshisParams object containing all required parameters\r\n * @returns Promise resolving to WalletConnectTransactionObject ready for signing\r\n * @throws Error if validation fails or transaction building fails\r\n */\r\nexport async function addSatoshis(params: AddSatoshisParams): Promise<WalletConnectTransactionObject> {\r\n const {\r\n electrumProvider,\r\n usersAddress,\r\n userMintingNFT,\r\n additionalSatoshis\r\n } = params;\r\n\r\n if (!electrumProvider) {\r\n throw new Error('Electrum provider not available');\r\n }\r\n\r\n if (additionalSatoshis <= 0n) {\r\n throw new Error('Additional satoshis must be greater than 0');\r\n }\r\n\r\n // Creating lockingBytecode for usersAddress\r\n const normalizedUserAddress = ensureAddressPrefix(usersAddress);\r\n const userTokenAddress = toTokenAddress(normalizedUserAddress);\r\n const lockingBytecodeResult = cashAddressToLockingBytecode(normalizedUserAddress);\r\n if (typeof lockingBytecodeResult === 'string') {\r\n throw new Error(`Failed to convert user address to locking bytecode: ${lockingBytecodeResult}`);\r\n }\r\n\r\n // Get user UTXOs to find a BCH UTXO to fund the additional satoshis\r\n const userUtxos = await electrumProvider.getUtxos(normalizedUserAddress);\r\n\r\n // Find a BCH UTXO with enough satoshis (additionalSatoshis + miner fee ~1000 sats)\r\n const fundingUTXO = userUtxos.find(\r\n utxo => utxo.satoshis >= (additionalSatoshis + 1000n) && !utxo.token\r\n );\r\n\r\n if (!fundingUTXO) {\r\n // Count up all the sats in userUTXOs that do not have a token\r\n const totalSats = userUtxos.reduce((sum: bigint, utxo: Utxo) => {\r\n if (!utxo.token) {\r\n return sum + utxo.satoshis;\r\n }\r\n return sum;\r\n }, 0n);\r\n\r\n if (totalSats >= additionalSatoshis + 1000n) {\r\n throw new Error('No compatible UTXO found in wallet, consolidate?');\r\n } else {\r\n throw new Error(`Not enough BCH in your wallet. Required: ${additionalSatoshis + 1000n} sats, Available: ${totalSats} sats`);\r\n }\r\n }\r\n\r\n // Build Transaction\r\n const p2pkhUnlocker: Unlocker = {\r\n generateLockingBytecode: () => {\r\n const result = cashAddressToLockingBytecode(normalizedUserAddress);\r\n if (typeof result === 'string') {\r\n throw new Error(`Failed to convert CashAddress to locking bytecode: ${result}`);\r\n }\r\n return result.bytecode;\r\n },\r\n generateUnlockingBytecode: () => {\r\n return Uint8Array.from([]);\r\n }\r\n };\r\n\r\n let transaction: any;\r\n try {\r\n transaction = await new TransactionBuilder({ provider: electrumProvider })\r\n // Add the minting NFT as input\r\n .addInput(userMintingNFT, p2pkhUnlocker)\r\n // Add the funding UTXO to provide additional satoshis\r\n .addInput(fundingUTXO, p2pkhUnlocker)\r\n // Output: minting NFT with additional satoshis\r\n .addOutput({\r\n to: userTokenAddress,\r\n amount: userMintingNFT.satoshis + additionalSatoshis,\r\n token: {\r\n amount: userMintingNFT.token?.amount!,\r\n category: userMintingNFT.token?.category!,\r\n nft: {\r\n capability: userMintingNFT.token?.nft?.capability!,\r\n commitment: userMintingNFT.token?.nft?.commitment!\r\n }\r\n },\r\n });\r\n\r\n // Calculate change (fundingUTXO - additionalSatoshis - miner fee)\r\n const changeAmount = fundingUTXO.satoshis - additionalSatoshis - 1000n;\r\n if (changeAmount >= 1000n) { // Dust limit\r\n transaction.addOutput({\r\n to: normalizedUserAddress,\r\n amount: changeAmount,\r\n });\r\n }\r\n } catch (error) {\r\n if (error instanceof Error) {\r\n throw new Error(`Error building transaction: ${error.message}`);\r\n } else {\r\n throw new Error(`Error building transaction: ${String(error)}`);\r\n }\r\n }\r\n\r\n // Build the transaction\r\n const rawTransactionHex = await transaction.build();\r\n\r\n // Decode transaction for WalletConnect\r\n const decodedTransaction = decodeTransaction(hexToBin(rawTransactionHex));\r\n if (typeof decodedTransaction === \"string\") {\r\n throw new Error(\"Failed to decode transaction\");\r\n }\r\n\r\n // Clear unlocking bytecode for user inputs (wallet will sign these)\r\n decodedTransaction.inputs[0].unlockingBytecode = Uint8Array.from([]);\r\n decodedTransaction.inputs[1].unlockingBytecode = Uint8Array.from([]);\r\n\r\n // Convert hex strings to Uint8Array for token data\r\n const binTokenCategory = hexToBin(userMintingNFT.token?.category!);\r\n const binMintingCommitment = hexToBin(userMintingNFT.token?.nft?.commitment!);\r\n\r\n // Get locking bytecode for user address\r\n const userLockingBytecodeResult = cashAddressToLockingBytecode(normalizedUserAddress);\r\n if (typeof userLockingBytecodeResult === 'string') {\r\n throw new Error(`Failed to convert user address to locking bytecode: ${userLockingBytecodeResult}`);\r\n }\r\n\r\n // Construct source outputs for WalletConnect\r\n const listSourceOutputs = [\r\n {\r\n ...decodedTransaction.inputs[0],\r\n lockingBytecode: userLockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(userMintingNFT.satoshis),\r\n token: {\r\n amount: userMintingNFT.token?.amount,\r\n category: binTokenCategory,\r\n nft: {\r\n capability: userMintingNFT.token?.nft?.capability!,\r\n commitment: binMintingCommitment\r\n }\r\n }\r\n },\r\n {\r\n ...decodedTransaction.inputs[1],\r\n lockingBytecode: userLockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(fundingUTXO.satoshis)\r\n }\r\n ];\r\n\r\n // Create transaction object for WalletConnect signing\r\n const wcTransactionObj: WalletConnectTransactionObject = {\r\n transaction: decodedTransaction,\r\n sourceOutputs: listSourceOutputs,\r\n broadcast: false,\r\n userPrompt: `Add ${additionalSatoshis} satoshis to minting NFT`\r\n };\r\n\r\n return wcTransactionObj;\r\n}\r\n\r\n","// TokenSales_old1 contract addresses\r\n//export const AddressTicketMaster = 'bitcoincash:pvh0yat7d2r9nf228fpns3mypydvstq9arftt9qlmma42xeq2eryszkdd99zq'; //address hash: 2ef2757e6a8659a54a3a43384764091ac82c05e8d2b5941fdefb551b20564648\r\n//export const AddressTicketMasterToken = 'bitcoincash:rvh0yat7d2r9nf228fpns3mypydvstq9arftt9qlmma42xeq2eryss93vuymt';\r\n\r\n// TokenSales contract addresses | simplified change fee calculation in purchaseNFT()\r\nexport const AddressTicketMaster = 'bitcoincash:pdmta0t3lmeufrhjlmyxkx3ye648lvr08cdwmy36eqtkj4wzpagg2m4afvzlt'; //address hash: 76bebd71fef3c48ef2fec86b1a24ceaa7fb06f3e1aed923ac8176955c20f5085\r\nexport const AddressTicketMasterToken = 'bitcoincash:rdmta0t3lmeufrhjlmyxkx3ye648lvr08cdwmy36eqtkj4wzpagg2fxpg4rxq';\r\n\r\n\r\n// Ticket Level Descriptions\r\nexport const TICKET_LEVEL_DESCRIPTIONS = {\r\n '01': {\r\n name: 'Regular',\r\n description: 'Regular tickets provide standard access to the event. This is the base level ticket option.'\r\n },\r\n '02': {\r\n name: 'VIP',\r\n description: 'VIP tickets offer enhanced benefits including priority access, exclusive areas, and additional perks.'\r\n },\r\n '03': {\r\n name: 'Premium',\r\n description: 'Premium tickets provide the highest level of access with all VIP benefits plus additional exclusive features.'\r\n }\r\n};\r\n\r\n","import { TransactionBuilder, Contract, Utxo, Unlocker } from 'cashscript';\r\nimport { hexToBin, cashAddressToLockingBytecode, decodeTransaction } from '@bitauth/libauth';\r\nimport { CreateListingParams, WalletConnectTransactionObject } from '../types';\r\nimport { ensureAddressPrefix, toLittleEndianHexString, toTokenAddress } from '../utils';\r\nimport contractArtifact from '../artifacts/TokenSales.json';\r\nimport { AddressTicketMasterToken } from '../constants/values';\r\n\r\n/**\r\n * Create a new TicketMaster listing\r\n * @param params - CreateListingParams object containing all required parameters\r\n * @returns Promise resolving to WalletConnectTransactionObject ready for signing\r\n * @throws Error if validation fails or transaction building fails\r\n */\r\nexport async function createListing(params: CreateListingParams): Promise<WalletConnectTransactionObject> {\r\n const {\r\n electrumProvider,\r\n usersAddress,\r\n userMintingNFT,\r\n priceType1,\r\n priceType2,\r\n priceType3,\r\n endSale,\r\n adminPubKeyHash\r\n } = params;\r\n\r\n if (!electrumProvider) {\r\n throw new Error('Electrum provider not available');\r\n }\r\n\r\n // Compile the contract using the included artifact\r\n const ticketMasterContract = new Contract(contractArtifact as any, [], {\r\n provider: electrumProvider,\r\n addressType: 'p2sh32'\r\n });\r\n\r\n // Validate adminPubKeyHash\r\n const adminPkhHex = adminPubKeyHash.replace(/^0x/i, '').trim();\r\n if (adminPkhHex.length !== 40 || !/^[0-9a-fA-F]+$/.test(adminPkhHex)) {\r\n throw new Error('Admin PubKey Hash must be 40 hex characters (20 bytes)');\r\n }\r\n\r\n // Normalize user address\r\n const normalizedUserAddress = ensureAddressPrefix(usersAddress);\r\n const userTokenAddress = toTokenAddress(normalizedUserAddress);\r\n const lockingBytecodeResult = cashAddressToLockingBytecode(normalizedUserAddress);\r\n if (typeof lockingBytecodeResult === 'string') {\r\n throw new Error(`Failed to convert user address to locking bytecode: ${lockingBytecodeResult}`);\r\n }\r\n\r\n // Get token address from compiled contract\r\n const contractTokenAddr = ticketMasterContract.tokenAddress;\r\nconsole.log('contractTokenAddr', contractTokenAddr);\r\nconsole.log('AddressTicketMasterToken', AddressTicketMasterToken);\r\n // Get locking bytecode for contract token address\r\n const contractTokenLockingBytecodeResult = cashAddressToLockingBytecode(contractTokenAddr);\r\n if (typeof contractTokenLockingBytecodeResult === 'string') {\r\n throw new Error(`Failed to convert contract token address to locking bytecode: ${contractTokenLockingBytecodeResult}`);\r\n }\r\n\r\n // Build TicketMaster commitment\r\n // Format: bytes5 priceType1 + bytes5 priceType2 + bytes5 priceType3 + bytes4 endSale + bytes20 adminPubKeyHash\r\n // Total: 39 bytes = 78 hex chars\r\n const priceType1Hex = toLittleEndianHexString(priceType1, 5); // 10 hex chars\r\n const priceType2Hex = toLittleEndianHexString(priceType2, 5); // 10 hex chars\r\n const priceType3Hex = toLittleEndianHexString(priceType3, 5); // 10 hex chars\r\n const endSaleHex = toLittleEndianHexString(endSale, 4); // 8 hex chars\r\n const ticketMasterCommitment = priceType1Hex + priceType2Hex + priceType3Hex + endSaleHex + adminPkhHex;\r\n \r\n if (ticketMasterCommitment.length !== 78) {\r\n throw new Error(`Invalid commitment length: ${ticketMasterCommitment.length}, expected 78`);\r\n }\r\n\r\n // Build Transaction\r\n const p2pkhUnlocker: Unlocker = {\r\n generateLockingBytecode: () => {\r\n const result = cashAddressToLockingBytecode(normalizedUserAddress);\r\n if (typeof result === 'string') {\r\n throw new Error(`Failed to convert CashAddress to locking bytecode: ${result}`);\r\n }\r\n return result.bytecode;\r\n },\r\n generateUnlockingBytecode: () => {\r\n return Uint8Array.from([]);\r\n }\r\n };\r\n\r\n let transaction: any;\r\n try {\r\n transaction = await new TransactionBuilder({ provider: electrumProvider })\r\n // Input: user's minting NFT\r\n .addInput(userMintingNFT, p2pkhUnlocker)\r\n // Output 0: user's minting NFT back to user\r\n .addOutput({\r\n to: userTokenAddress,\r\n amount: userMintingNFT.satoshis - 2000n,\r\n token: {\r\n amount: userMintingNFT.token?.amount!,\r\n category: userMintingNFT.token?.category!,\r\n nft: {\r\n capability: userMintingNFT.token?.nft?.capability!,\r\n commitment: userMintingNFT.token?.nft?.commitment!\r\n }\r\n },\r\n })\r\n // Output 1: TicketMaster Minting NFT to contract token address\r\n .addOutput({\r\n to: contractTokenAddr,\r\n amount: 1000n,\r\n token: {\r\n amount: userMintingNFT.token?.amount!,\r\n category: userMintingNFT.token?.category!,\r\n nft: {\r\n capability: 'minting',\r\n commitment: ticketMasterCommitment\r\n }\r\n },\r\n });\r\n } catch (error) {\r\n if (error instanceof Error) {\r\n throw new Error(`Error building transaction: ${error.message}`);\r\n } else {\r\n throw new Error(`Error building transaction: ${String(error)}`);\r\n }\r\n }\r\n\r\n // Build the transaction\r\n const rawTransactionHex = await transaction.build();\r\n\r\n // Decode transaction for WalletConnect\r\n const decodedTransaction = decodeTransaction(hexToBin(rawTransactionHex));\r\n if (typeof decodedTransaction === \"string\") {\r\n throw new Error(\"Failed to decode transaction\");\r\n }\r\n\r\n // Clear unlocking bytecode for user input (wallet will sign this)\r\n decodedTransaction.inputs[0].unlockingBytecode = Uint8Array.from([]);\r\n\r\n // Convert hex strings to Uint8Array for token data\r\n const binTokenCategory = hexToBin(userMintingNFT.token?.category!);\r\n const binUserCommitment = hexToBin(userMintingNFT.token?.nft?.commitment!);\r\n\r\n // Construct source outputs for WalletConnect\r\n const listSourceOutputs = [\r\n {\r\n ...decodedTransaction.inputs[0],\r\n lockingBytecode: lockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(userMintingNFT.satoshis),\r\n token: {\r\n amount: userMintingNFT.token?.amount,\r\n category: binTokenCategory,\r\n nft: {\r\n capability: userMintingNFT.token?.nft?.capability!,\r\n commitment: binUserCommitment\r\n }\r\n }\r\n }\r\n ];\r\n\r\n // Create transaction object for WalletConnect signing\r\n const wcTransactionObj: WalletConnectTransactionObject = {\r\n transaction: decodedTransaction,\r\n sourceOutputs: listSourceOutputs,\r\n broadcast: false,\r\n userPrompt: `Create TicketMaster listing`\r\n };\r\n\r\n return wcTransactionObj;\r\n}\r\n\r\n","/**\r\n * TokenSales contract addresses\r\n * These are the addresses for the TokenSales (TicketMaster) contract\r\n */\r\nimport { AddressTicketMaster, AddressTicketMasterToken } from './constants/values';\r\n\r\nexport const DEFAULT_CONTRACT_ADDRESSES = {\r\n contract: AddressTicketMaster,\r\n token: AddressTicketMasterToken\r\n} as const;\r\n\r\n/**\r\n * Get contract address\r\n * @returns Contract address\r\n */\r\nexport function getContractAddress(): string {\r\n return AddressTicketMaster;\r\n}\r\n\r\n/**\r\n * Get token address\r\n * @returns Token address\r\n */\r\nexport function getTokenAddress(): string {\r\n return AddressTicketMasterToken;\r\n}\r\n\r\n/**\r\n * Get contract addresses\r\n * @returns Object with contract and token addresses\r\n */\r\nexport function getContractAddresses() {\r\n return {\r\n contract: AddressTicketMaster,\r\n token: AddressTicketMasterToken\r\n };\r\n}\r\n\r\n","import { Utxo } from 'cashscript';\r\nimport { ListAvailableTicketsParams } from '../types';\r\nimport { getTokenAddress } from '../config';\r\nimport { isTicketMaster, isTicket } from '../utils/ticketMaster';\r\n\r\n/**\r\n * List available tickets for purchase from a TokenSale\r\n * Returns ALL UTXOs matching the categoryID, excluding the TokenSale NFT (minting capability)\r\n * @param params - ListAvailableTicketsParams object containing all required parameters\r\n * @returns Promise resolving to array of ticket UTXOs (excluding the TokenSale NFT)\r\n */\r\nexport async function listAvailableTickets(params: ListAvailableTicketsParams): Promise<Utxo[]> {\r\n const {\r\n electrumProvider,\r\n categoryID\r\n } = params;\r\n\r\n if (!electrumProvider) {\r\n throw new Error('Electrum provider not available');\r\n }\r\n\r\n if (!categoryID || categoryID.length === 0) {\r\n throw new Error('Category ID is required');\r\n }\r\n\r\n // Get the contract token address\r\n const contractTokenAddress = getTokenAddress();\r\n\r\n // Get all UTXOs from the contract token address\r\n const contractUtxos = await electrumProvider.getUtxos(contractTokenAddress);\r\n\r\n // Filter UTXOs to only those matching the categoryID\r\n const categoryUtxos = contractUtxos.filter((utxo: Utxo) => \r\n utxo?.token?.category === categoryID\r\n );\r\n\r\n if (categoryUtxos.length === 0) {\r\n return []; // No UTXOs found for this category\r\n }\r\n\r\n // Find the TokenSale minting NFT (capability === 'minting')\r\n const tokenSaleUtxo = categoryUtxos.find((utxo: Utxo) => \r\n isTicketMaster(utxo)\r\n );\r\n\r\n if (!tokenSaleUtxo) {\r\n throw new Error(`No active TokenSale found for category ${categoryID}`);\r\n }\r\n\r\n // Return all UTXOs EXCEPT the TokenSale NFT (minting capability)\r\n const availableTickets = categoryUtxos.filter((utxo: Utxo) => \r\n !isTicketMaster(utxo)\r\n );\r\n\r\n return availableTickets;\r\n}\r\n","import { Utxo } from 'cashscript';\r\nimport { ListAllSalesParams, TokenSaleUtxo } from '../types';\r\nimport { getTokenAddress } from '../config';\r\nimport { isTicketMaster, parseTicketMasterCommitment } from '../utils/ticketMaster';\r\n\r\n/**\r\n * List all TokenSale NFTs (minting capability & 39-byte commitment)\r\n * @param params - ListAllSalesParams object containing the electrum provider\r\n * @returns Promise resolving to array of TokenSale UTXOs with parsed commitment data\r\n */\r\nexport async function listAllSales(params: ListAllSalesParams): Promise<TokenSaleUtxo[]> {\r\n const { electrumProvider } = params;\r\n\r\n if (!electrumProvider) {\r\n throw new Error('Electrum provider not available');\r\n }\r\n\r\n // Get the contract token address\r\n const contractTokenAddress = getTokenAddress();\r\n\r\n // Get all UTXOs from the contract token address\r\n const contractUtxos = await electrumProvider.getUtxos(contractTokenAddress);\r\n\r\n // Filter to only TokenSale NFTs (minting capability with 39-byte commitment)\r\n const tokenSaleUtxos: TokenSaleUtxo[] = [];\r\n\r\n for (const utxo of contractUtxos) {\r\n if (isTicketMaster(utxo)) {\r\n const commitment = utxo.token?.nft?.commitment || '';\r\n const tokenSaleData = parseTicketMasterCommitment(commitment);\r\n\r\n if (tokenSaleData) {\r\n tokenSaleUtxos.push({\r\n ...utxo,\r\n tokenSaleData\r\n });\r\n }\r\n }\r\n }\r\n\r\n return tokenSaleUtxos;\r\n}\r\n","import { Utxo } from 'cashscript';\r\nimport { ListActiveSalesParams, TokenSaleUtxo } from '../types';\r\nimport { getTokenAddress } from '../config';\r\nimport { isTicketMaster, parseTicketMasterCommitment } from '../utils/ticketMaster';\r\n\r\n/**\r\n * List active TokenSale NFTs (minting capability, 39-byte commitment, sale not ended)\r\n * A sale is active when current blockheight > endSale commitment field\r\n * @param params - ListActiveSalesParams object containing the electrum provider\r\n * @returns Promise resolving to array of active TokenSale UTXOs with parsed commitment data\r\n */\r\nexport async function listActiveSales(params: ListActiveSalesParams): Promise<TokenSaleUtxo[]> {\r\n const { electrumProvider } = params;\r\n\r\n if (!electrumProvider) {\r\n throw new Error('Electrum provider not available');\r\n }\r\n\r\n // Get current block height\r\n let currentBlockHeight: number;\r\n if (typeof (electrumProvider as any).getBlockHeight === 'function') {\r\n currentBlockHeight = await (electrumProvider as any).getBlockHeight();\r\n } else if (typeof (electrumProvider as any).performRequest === 'function') {\r\n try {\r\n const header = await (electrumProvider as any).performRequest('blockchain.headers.subscribe');\r\n currentBlockHeight = header?.height || header;\r\n } catch (e) {\r\n // Fallback: try to get block height from getUtxos call\r\n throw new Error('Unable to get block height from provider');\r\n }\r\n } else {\r\n throw new Error('Unable to get block height from provider');\r\n }\r\n\r\n // Get the contract token address\r\n const contractTokenAddress = getTokenAddress();\r\n\r\n // Get all UTXOs from the contract token address\r\n const contractUtxos = await electrumProvider.getUtxos(contractTokenAddress);\r\n\r\n // Filter to only active TokenSale NFTs (sale not ended)\r\n const activeSales: TokenSaleUtxo[] = [];\r\n\r\n for (const utxo of contractUtxos) {\r\n if (isTicketMaster(utxo)) {\r\n const commitment = utxo.token?.nft?.commitment || '';\r\n const tokenSaleData = parseTicketMasterCommitment(commitment);\r\n\r\n if (tokenSaleData) {\r\n // Sale is active when current blockheight > endSale\r\n if (currentBlockHeight < tokenSaleData.endSale) {\r\n activeSales.push({\r\n ...utxo,\r\n tokenSaleData\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n return activeSales;\r\n}\r\n"],"names":["stringify","decodeCashAddress","encodeCashAddress","Contract","cashAddressToLockingBytecode","TransactionBuilder","decodeTransaction","hexToBin"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/utils/signTransaction.ts","../src/utils/ticketMaster.ts","../src/utils/toTokenAddress.ts","../src/utils/index.ts","../src/functions/buyNFT.ts","../src/functions/modifyTokenSale.ts","../src/functions/burn.ts","../src/functions/addSatoshis.ts","../src/constants/values.ts","../src/functions/createListing.ts","../src/config.ts","../src/functions/listAvailableTickets.ts","../src/functions/listAllSales.ts","../src/functions/listActiveSales.ts"],"sourcesContent":["import { stringify } from '@bitauth/libauth';\r\n\r\n/**\r\n * Creates a signTransaction function for WalletConnect v2\r\n * This function handles transaction signing through WalletConnect's SignClient\r\n * \r\n * @param signClient - The WalletConnect SignClient instance\r\n * @param connectedChain - The connected chain ID (fallback if not found in session)\r\n * @returns A function that signs transactions via WalletConnect\r\n */\r\nexport function createSignTransaction(\r\n signClient: any,\r\n connectedChain?: string\r\n): (transactionOptions: any) => Promise<any> {\r\n return async (transactionOptions: any) => {\r\n if (!signClient) {\r\n throw new Error('SignClient not available. Please ensure wallet is connected.');\r\n }\r\n \r\n // Get all active sessions\r\n const sessions = signClient.session.getAll();\r\n \r\n if (sessions.length === 0) {\r\n throw new Error('No active wallet session. Please connect your wallet first.');\r\n }\r\n \r\n // Use the first active session\r\n const session = sessions[0];\r\n \r\n // Extract chainId from session\r\n // In WalletConnect v2, chainId is in the accounts array as \"chainId:address\"\r\n let chainId: string | null = null;\r\n \r\n const namespaces = session.namespaces || {};\r\n const bchNamespace = namespaces.bch;\r\n \r\n if (bchNamespace && bchNamespace.accounts && bchNamespace.accounts.length > 0) {\r\n // Extract chainId from first account (format: \"chainId:address\")\r\n const firstAccount = bchNamespace.accounts[0];\r\n const accountParts = firstAccount.split(':');\r\n if (accountParts.length >= 2) {\r\n // Reconstruct chainId (could be \"bch:mainnet\" or \"bch:bchtest:chipnet\")\r\n chainId = accountParts.slice(0, -1).join(':'); // Everything except the address part\r\n }\r\n }\r\n \r\n // Fallback: try to find chainId from any namespace\r\n if (!chainId) {\r\n for (const namespaceKey in namespaces) {\r\n const namespace = namespaces[namespaceKey];\r\n if (namespace.accounts && namespace.accounts.length > 0) {\r\n const firstAccount = namespace.accounts[0];\r\n const accountParts = firstAccount.split(':');\r\n if (accountParts.length >= 2 && accountParts[0].includes('bch')) {\r\n chainId = accountParts.slice(0, -1).join(':');\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n \r\n // Final fallback\r\n if (!chainId) {\r\n chainId = connectedChain || 'bch:mainnet';\r\n }\r\n \r\n // Use the same pattern as the working project: JSON.parse(stringify(obj))\r\n // stringify from @bitauth/libauth handles BigInt and Uint8Array serialization\r\n const serializableTxObj = JSON.parse(stringify(transactionOptions));\r\n \r\n try {\r\n const result = await signClient.request({\r\n chainId,\r\n topic: session.topic,\r\n request: {\r\n method: 'bch_signTransaction',\r\n params: serializableTxObj,\r\n },\r\n });\r\n return result;\r\n } catch (error: any) {\r\n // Handle WalletConnect relay errors gracefully\r\n if (error?.message?.includes('onRelayMessage') || error?.message?.includes('failed to process')) {\r\n // The transaction might still have been signed, so we'll let the caller handle it\r\n }\r\n throw error;\r\n }\r\n };\r\n}\r\n\r\n","/**\r\n * Utility functions for parsing TicketMaster NFT data\r\n */\r\n\r\nexport interface TicketMasterData {\r\n priceType1: bigint;\r\n priceType2: bigint;\r\n priceType3: bigint;\r\n endSale: number;\r\n adminPubKeyHash: string;\r\n}\r\n\r\n/**\r\n * Parses TicketMaster NFT commitment to extract sale data\r\n * Commitment format:\r\n * - bytes5 priceType1 (0-5)\r\n * - bytes5 priceType2 (5-10)\r\n * - bytes5 priceType3 (10-15)\r\n * - bytes4 endSale (15-19)\r\n * - bytes20 adminPubKeyHash (19-39)\r\n */\r\nexport function parseTicketMasterCommitment(commitment: string): TicketMasterData | null {\r\n if (!commitment || commitment.length < 78) { // 39 bytes = 78 hex chars\r\n return null;\r\n }\r\n\r\n try {\r\n // Extract priceType1 (bytes5 = 10 hex chars, positions 0-10)\r\n // CashScript stores numbers in little-endian format\r\n const priceType1Hex = commitment.substring(0, 10);\r\n const priceType1BE = priceType1Hex.match(/.{2}/g)?.reverse().join('') || priceType1Hex;\r\n const priceType1 = BigInt('0x' + priceType1BE);\r\n\r\n // Extract priceType2 (bytes5 = 10 hex chars, positions 10-20)\r\n const priceType2Hex = commitment.substring(10, 20);\r\n const priceType2BE = priceType2Hex.match(/.{2}/g)?.reverse().join('') || priceType2Hex;\r\n const priceType2 = BigInt('0x' + priceType2BE);\r\n\r\n // Extract priceType3 (bytes5 = 10 hex chars, positions 20-30)\r\n const priceType3Hex = commitment.substring(20, 30);\r\n const priceType3BE = priceType3Hex.match(/.{2}/g)?.reverse().join('') || priceType3Hex;\r\n const priceType3 = BigInt('0x' + priceType3BE);\r\n\r\n // Extract endSale (bytes4 = 8 hex chars, positions 30-38)\r\n // CashScript stores numbers in little-endian format\r\n // Contract uses: bytes endSale = tx.inputs[0].nftCommitment.slice(15,19);\r\n // This is bytes 15-19 (0-indexed), which is hex positions 30-38\r\n const endSaleHex = commitment.substring(30, 38);\r\n const endSaleBE = endSaleHex.match(/.{2}/g)?.reverse().join('') || endSaleHex;\r\n const endSale = parseInt(endSaleBE, 16);\r\n\r\n // Extract adminPubKeyHash (bytes20 = 40 hex chars, positions 38-78)\r\n const adminPubKeyHash = commitment.substring(38, 78);\r\n\r\n return {\r\n priceType1,\r\n priceType2,\r\n priceType3,\r\n endSale,\r\n adminPubKeyHash,\r\n };\r\n } catch (error) {\r\n console.error('Failed to parse TicketMaster commitment:', error);\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Checks if a UTXO is a TicketMaster (has minting capability)\r\n */\r\nexport function isTicketMaster(utxo: any): boolean {\r\n return (\r\n utxo?.token?.nft?.capability === 'minting' &&\r\n utxo?.token?.nft?.commitment &&\r\n utxo.token.nft.commitment.length >= 78\r\n );\r\n}\r\n\r\n/**\r\n * Checks if a UTXO is a ticket (same category as TicketMaster but immutable)\r\n */\r\nexport function isTicket(utxo: any, ticketMasterCategory: string): boolean {\r\n return (\r\n utxo?.token?.category === ticketMasterCategory &&\r\n utxo?.token?.nft?.capability === 'none'\r\n );\r\n}\r\n\r\n/**\r\n * Formats satoshis to BCH\r\n */\r\nexport function formatBCH(satoshis: bigint | number | string): string {\r\n const sats = typeof satoshis === 'string' ? BigInt(satoshis) : BigInt(satoshis);\r\n const bch = Number(sats) / 100000000;\r\n return bch.toFixed(8);\r\n}\r\n\r\n","import { decodeCashAddress, encodeCashAddress } from '@bitauth/libauth';\r\n\r\n/**\r\n * Converts a regular Bitcoin Cash address to its token address equivalent\r\n * @param address - Bitcoin Cash address (p2pkh)\r\n * @returns Token address (p2pkhWithTokens)\r\n */\r\nfunction toTokenAddress(address: string): string {\r\n const addressInfo: any = decodeCashAddress(address);\r\n const pkhPayoutBin = addressInfo.payload;\r\n const prefix = addressInfo.prefix;\r\n const tokenAddressResult = encodeCashAddress({prefix, type: \"p2pkhWithTokens\", payload: pkhPayoutBin});\r\n \r\n // In libauth v3, encodeCashAddress returns a CashAddressResult object\r\n if (typeof tokenAddressResult === 'string') {\r\n return tokenAddressResult;\r\n }\r\n return tokenAddressResult.address;\r\n}\r\n\r\nexport default toTokenAddress;\r\n\r\n","/**\r\n * Shared utility functions\r\n */\r\n\r\nexport { createSignTransaction } from './signTransaction';\r\nexport { parseTicketMasterCommitment, formatBCH, isTicketMaster, isTicket, type TicketMasterData } from './ticketMaster';\r\nexport { default as toTokenAddress } from './toTokenAddress';\r\n\r\n/**\r\n * Ensures an address has the bitcoincash: prefix for libauth functions\r\n * Addresses from AppKit may come without the prefix after normalization\r\n */\r\nexport function ensureAddressPrefix(address: string): string {\r\n // If address already has a prefix, return as-is\r\n if (address.includes(':')) {\r\n return address;\r\n }\r\n \r\n // Add bitcoincash: prefix for mainnet addresses\r\n // Addresses starting with 'q' or 'p' are mainnet\r\n if (address.startsWith('q') || address.startsWith('p')) {\r\n return `bitcoincash:${address}`;\r\n }\r\n \r\n // For testnet addresses starting with 'bchtest:' or 'q'/'p' on testnet\r\n // This is a simple check - you may need to adjust based on your network\r\n return `bitcoincash:${address}`;\r\n}\r\n\r\n/**\r\n * Converts hex string to Uint8Array\r\n */\r\nexport function hexToUint8Array(hexString: string): Uint8Array {\r\n const bytes = new Uint8Array(hexString.length / 2);\r\n for (let i = 0; i < bytes.length; i++) {\r\n bytes[i] = parseInt(hexString.substr(i * 2, 2), 16);\r\n }\r\n return bytes;\r\n}\r\n\r\n/**\r\n * Converts a number to little-endian hex string\r\n * @param number - The number to convert\r\n * @param byteCount - Number of bytes (e.g., 5 for bytes5, 4 for bytes4)\r\n */\r\nexport function toLittleEndianHexString(number: bigint | number, byteCount: number): string {\r\n const num = typeof number === 'bigint' ? number : BigInt(number);\r\n let hex = num.toString(16);\r\n hex = hex.padStart(byteCount * 2, '0'); // Pad with zeros to ensure correct byteCount\r\n // Split into chunks of 2 (bytes), reverse (for little endian), and join back\r\n return hex.match(/../g)?.reverse().join('') ?? '';\r\n}\r\n\r\n","import { TransactionBuilder, Contract, Utxo, Unlocker } from 'cashscript';\r\nimport { hexToBin, cashAddressToLockingBytecode, decodeTransaction, encodeCashAddress } from '@bitauth/libauth';\r\nimport { BuyNFTParams, WalletConnectTransactionObject } from '../types';\r\nimport { ensureAddressPrefix, hexToUint8Array, toTokenAddress } from '../utils';\r\nimport contractArtifact from '../artifacts/TokenSales.json';\r\n\r\n/**\r\n * Purchase a ticket NFT from a TicketMaster\r\n * @param params - BuyNFTParams object containing all required parameters\r\n * @returns Promise resolving to WalletConnectTransactionObject ready for signing\r\n * @throws Error if validation fails or transaction building fails\r\n */\r\nexport async function buyNFT(params: BuyNFTParams): Promise<WalletConnectTransactionObject> {\r\n const {\r\n electrumProvider,\r\n usersAddress,\r\n ticketMasterUtxo,\r\n ticketUtxo,\r\n ticketType,\r\n isAdmin\r\n } = params;\r\n\r\n if (!electrumProvider) {\r\n throw new Error('Electrum provider not available');\r\n }\r\n\r\n // Compile the contract using the included artifact\r\n const ticketMasterContract = new Contract(contractArtifact as any, [], {\r\n provider: electrumProvider,\r\n addressType: 'p2sh32'\r\n });\r\n\r\n // Parse TicketMaster commitment to get price and admin address\r\n const commitment = ticketMasterUtxo.token?.nft?.commitment || '';\r\n if (commitment.length !== 78) {\r\n throw new Error('Invalid TicketMaster commitment');\r\n }\r\n\r\n // Extract price based on ticket type (little-endian format)\r\n let ticketPrice: bigint;\r\n let priceHex: string;\r\n \r\n if (ticketType === '01') {\r\n priceHex = commitment.substring(0, 10);\r\n const priceBE = priceHex.match(/.{2}/g)?.reverse().join('') || priceHex;\r\n ticketPrice = BigInt('0x' + priceBE);\r\n } else if (ticketType === '02') {\r\n priceHex = commitment.substring(10, 20);\r\n const priceBE = priceHex.match(/.{2}/g)?.reverse().join('') || priceHex;\r\n ticketPrice = BigInt('0x' + priceBE);\r\n if (ticketPrice === 0n) {\r\n throw new Error('Ticket type 2 is not available');\r\n }\r\n } else if (ticketType === '03') {\r\n priceHex = commitment.substring(20, 30);\r\n const priceBE = priceHex.match(/.{2}/g)?.reverse().join('') || priceHex;\r\n ticketPrice = BigInt('0x' + priceBE);\r\n if (ticketPrice === 0n) {\r\n throw new Error('Ticket type 3 is not available');\r\n }\r\n } else {\r\n throw new Error('Invalid ticket type');\r\n }\r\n\r\n // Extract admin pubkey hash (bytes20 = 40 hex chars, positions 38-78)\r\n const adminPubKeyHashHex = commitment.substring(38, 78);\r\n \r\n // Convert hex string to Uint8Array\r\n const adminPKHUint8Array = hexToUint8Array(adminPubKeyHashHex);\r\n \r\n // Derive admin address from embedded pubkey hash\r\n const prefix = 'bitcoincash';\r\n const addressType = 'p2pkh';\r\n const adminAddressResult = encodeCashAddress({\r\n prefix,\r\n type: addressType,\r\n payload: adminPKHUint8Array\r\n });\r\n \r\n if (typeof adminAddressResult === 'string') {\r\n throw new Error(`Failed to encode admin address: ${adminAddressResult}`);\r\n }\r\n const adminAddress = adminAddressResult.address;\r\n \r\n // Get contract address from compiled contract\r\n const contractAddr = ticketMasterContract.address;\r\n \r\n // Convert address to locking bytecode\r\n const contractLockingBytecodeResult = cashAddressToLockingBytecode(contractAddr);\r\n if (typeof contractLockingBytecodeResult === 'string') {\r\n throw new Error(`Failed to convert contract address to locking bytecode: ${contractLockingBytecodeResult}`);\r\n }\r\n\r\n // Creating lockingBytecode for usersAddress\r\n const normalizedUserAddress = ensureAddressPrefix(usersAddress);\r\n const userTokenAddress = toTokenAddress(normalizedUserAddress);\r\n const lockingBytecodeResult = cashAddressToLockingBytecode(normalizedUserAddress);\r\n if (typeof lockingBytecodeResult === 'string') {\r\n throw new Error(`Failed to convert user address to locking bytecode: ${lockingBytecodeResult}`);\r\n }\r\n\r\n // Get user UTXOs\r\n const userUtxos = await electrumProvider.getUtxos(normalizedUserAddress);\r\n\r\n // Get userUTXO\r\n let userUTXO: Utxo | undefined;\r\n if (isAdmin) {\r\n userUTXO = userUtxos.find(\r\n utxo => utxo.token?.category === ticketMasterUtxo.token?.category && \r\n utxo.token?.nft?.capability === 'minting'\r\n );\r\n } else {\r\n // Find pure BCH payment UTXO (need ticketPrice & 3000+ sats for miner fee)\r\n userUTXO = userUtxos.find(\r\n utxo => utxo.satoshis >= (ticketPrice + 3000n) && !utxo.token,\r\n );\r\n\r\n if (!userUTXO) {\r\n // Count up all the sats in userUTXOs that do not have a token\r\n const totalSats = userUtxos.reduce((sum: bigint, utxo: Utxo) => {\r\n if (!utxo.token) {\r\n return sum + utxo.satoshis;\r\n }\r\n return sum;\r\n }, 0n);\r\n\r\n // If totalSats is enough, then user needs to consolidate\r\n if (totalSats >= ticketPrice + 3000n) {\r\n throw new Error('No compatible UTXO found in wallet, consolidate?');\r\n } else {\r\n throw new Error(`Not enough BCH in your wallet. Required: ${ticketPrice + 3000n} sats, Available: ${totalSats} sats`);\r\n }\r\n }\r\n }\r\n\r\n if (!userUTXO) {\r\n throw new Error('No suitable UTXO found for transaction');\r\n }\r\n\r\n // Build Transaction\r\n const p2pkhUnlocker: Unlocker = {\r\n generateLockingBytecode: () => {\r\n const result = cashAddressToLockingBytecode(normalizedUserAddress);\r\n if (typeof result === 'string') {\r\n throw new Error(`Failed to convert CashAddress to locking bytecode: ${result}`);\r\n }\r\n return result.bytecode;\r\n },\r\n generateUnlockingBytecode: () => {\r\n return Uint8Array.from([]);\r\n }\r\n };\r\n \r\n let transaction: any;\r\n try {\r\n transaction = await new TransactionBuilder({ provider: electrumProvider })\r\n .addInput(ticketMasterUtxo, ticketMasterContract.unlock.purchaseNFT(ticketType))\r\n .addInput(ticketUtxo, ticketMasterContract.unlock.purchaseNFT(ticketType))\r\n .addInput(userUTXO, p2pkhUnlocker)\r\n // Ticket master NFT being sent back to contract\r\n .addOutput({\r\n to: ticketMasterContract.tokenAddress, \r\n amount: ticketMasterUtxo.satoshis,\r\n token: {\r\n amount: ticketMasterUtxo.token?.amount!, \r\n category: ticketMasterUtxo.token?.category!, \r\n nft: {\r\n capability: ticketMasterUtxo.token?.nft?.capability!, \r\n commitment: ticketMasterUtxo.token?.nft?.commitment! \r\n }\r\n },\r\n })\r\n // Ticket being purchased\r\n .addOutput({\r\n to: userTokenAddress, \r\n amount: ticketUtxo.satoshis,\r\n token: {\r\n amount: ticketUtxo.token?.amount!, \r\n category: ticketUtxo.token?.category!, \r\n nft: {\r\n capability: ticketUtxo.token?.nft?.capability!, \r\n commitment: ticketUtxo.token?.nft?.commitment! + ticketType // ticketType appended to commitment\r\n }\r\n },\r\n })\r\n // Ticket price is sent to admin address\r\n if (isAdmin) {\r\n transaction.addOutput({\r\n to: adminAddress, \r\n amount: 1000n,\r\n });\r\n } else {\r\n transaction.addOutput({\r\n to: adminAddress, \r\n amount: ticketPrice,\r\n });\r\n }\r\n\r\n if (isAdmin) {\r\n transaction.addOutput({\r\n to: userTokenAddress, \r\n amount: userUTXO.satoshis - 2700n,\r\n token: {\r\n amount: userUTXO.token?.amount!, \r\n category: userUTXO.token?.category!, \r\n nft: {\r\n capability: userUTXO.token?.nft?.capability!, \r\n commitment: userUTXO.token?.nft?.commitment! \r\n }\r\n },\r\n });\r\n } else {\r\n // Calculate change amount (userUTXO - ticketPrice - miner fee)\r\n const changeAmount = userUTXO.satoshis - ticketPrice - 1700n;\r\n if (changeAmount > 1000n) { // Dust limit\r\n transaction.addOutput({\r\n to: normalizedUserAddress, \r\n amount: changeAmount\r\n });\r\n }\r\n }\r\n } catch (error) {\r\n if (error instanceof Error) {\r\n throw new Error(`Error building transaction: ${error.message}`);\r\n } else {\r\n throw new Error(`Error building transaction: ${String(error)}`);\r\n }\r\n }\r\n\r\n // Build the transaction\r\n const rawTransactionHex = await transaction.build();\r\n\r\n // Decode transaction for WalletConnect\r\n const decodedTransaction = decodeTransaction(hexToBin(rawTransactionHex));\r\n if (typeof decodedTransaction === \"string\") {\r\n throw new Error(\"Failed to decode transaction\");\r\n }\r\n\r\n // Clear unlocking bytecode for user input (input 2)\r\n decodedTransaction.inputs[2].unlockingBytecode = Uint8Array.from([]);\r\n\r\n // Convert hex strings to Uint8Array for token data\r\n const binTokenCategory = hexToBin(ticketMasterUtxo.token?.category!);\r\n const binTicketMasterCommitment = hexToBin(ticketMasterUtxo.token?.nft?.commitment!);\r\n const binTicketCommitment = hexToBin(ticketUtxo.token?.nft?.commitment!);\r\n const binUserCommitment = isAdmin ? hexToBin(userUTXO.token?.nft?.commitment!) : undefined;\r\n\r\n // Get redeemScript as Uint8Array\r\n const getRedeemScript = (): Uint8Array => {\r\n if ((ticketMasterContract.redeemScript as any).bytecode) {\r\n return (ticketMasterContract.redeemScript as any).bytecode;\r\n }\r\n if (typeof ticketMasterContract.redeemScript === 'string') {\r\n return hexToBin(ticketMasterContract.redeemScript);\r\n }\r\n return new Uint8Array(ticketMasterContract.redeemScript as any);\r\n };\r\n\r\n const redeemScript = getRedeemScript();\r\n\r\n // Construct source outputs for WalletConnect\r\n // Use raw Uint8Arrays and BigInts - stringify from @bitauth/libauth will handle serialization\r\n let listSourceOutputs = [\r\n {\r\n ...decodedTransaction.inputs[0],\r\n lockingBytecode: contractLockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(ticketMasterUtxo.satoshis),\r\n contract: {\r\n abiFunction: ticketMasterContract.artifact.abi,\r\n redeemScript: redeemScript,\r\n artifact: ticketMasterContract.artifact,\r\n },\r\n token: {\r\n amount: ticketMasterUtxo.token?.amount,\r\n category: binTokenCategory,\r\n nft: {\r\n capability: ticketMasterUtxo.token?.nft?.capability!,\r\n commitment: binTicketMasterCommitment\r\n }\r\n }\r\n },\r\n {\r\n ...decodedTransaction.inputs[1],\r\n lockingBytecode: contractLockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(ticketUtxo.satoshis),\r\n contract: {\r\n abiFunction: ticketMasterContract.artifact.abi,\r\n redeemScript: redeemScript,\r\n artifact: ticketMasterContract.artifact,\r\n },\r\n token: {\r\n amount: ticketUtxo.token?.amount,\r\n category: binTokenCategory,\r\n nft: {\r\n capability: ticketUtxo.token?.nft?.capability!,\r\n commitment: binTicketCommitment\r\n }\r\n }\r\n },\r\n ...(isAdmin ? [{\r\n ...decodedTransaction.inputs[2],\r\n lockingBytecode: lockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(userUTXO.satoshis),\r\n token: {\r\n amount: userUTXO.token?.amount,\r\n category: binTokenCategory,\r\n nft: {\r\n capability: userUTXO.token?.nft?.capability!,\r\n commitment: binUserCommitment!\r\n }\r\n }\r\n }] : [{\r\n ...decodedTransaction.inputs[2],\r\n lockingBytecode: lockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(userUTXO.satoshis),\r\n }])\r\n ];\r\n\r\n // Create transaction object for WalletConnect signing\r\n const wcTransactionObj: WalletConnectTransactionObject = {\r\n transaction: decodedTransaction,\r\n sourceOutputs: listSourceOutputs,\r\n broadcast: false,\r\n userPrompt: `Purchase Ticket Type ${ticketType} for ${ticketPrice} sats`\r\n };\r\n\r\n return wcTransactionObj;\r\n}\r\n\r\n","import { TransactionBuilder, Contract, Unlocker } from 'cashscript';\r\nimport { hexToBin, cashAddressToLockingBytecode, decodeTransaction } from '@bitauth/libauth';\r\nimport { ModifyTokenSaleParams, WalletConnectTransactionObject } from '../types';\r\nimport { ensureAddressPrefix, toLittleEndianHexString, toTokenAddress } from '../utils';\r\nimport contractArtifact from '../artifacts/TokenSales.json';\r\n\r\n/**\r\n * Modify TokenSale parameters (prices, endSale)\r\n * @param params - ModifyTokenSaleParams object containing all required parameters\r\n * @returns Promise resolving to WalletConnectTransactionObject ready for signing\r\n * @throws Error if validation fails or transaction building fails\r\n */\r\nexport async function modifyTokenSale(params: ModifyTokenSaleParams): Promise<WalletConnectTransactionObject> {\r\n const {\r\n electrumProvider,\r\n usersAddress,\r\n tokenSaleUtxo,\r\n userMintingUtxo,\r\n priceType1,\r\n priceType2,\r\n priceType3,\r\n endSale\r\n } = params;\r\n\r\n if (!electrumProvider) {\r\n throw new Error('Electrum provider not available');\r\n }\r\n\r\n // Compile the contract using the included artifact\r\n const tokenSaleContract = new Contract(contractArtifact as any, [], {\r\n provider: electrumProvider,\r\n addressType: 'p2sh32'\r\n });\r\n\r\n // Parse TokenSale commitment to validate\r\n const commitment = tokenSaleUtxo.token?.nft?.commitment || '';\r\n if (commitment.length !== 78) {\r\n throw new Error('Invalid TokenSale commitment');\r\n }\r\n\r\n // Get contract address from compiled contract\r\n const contractAddr = tokenSaleContract.address;\r\n\r\n // Creating lockingBytecode for contract address\r\n const contractLockingBytecodeResult = cashAddressToLockingBytecode(contractAddr);\r\n if (typeof contractLockingBytecodeResult === 'string') {\r\n throw new Error(`Failed to convert contract address to locking bytecode: ${contractLockingBytecodeResult}`);\r\n }\r\n\r\n // Creating lockingBytecode for usersAddress\r\n const normalizedUserAddress = ensureAddressPrefix(usersAddress);\r\n const userTokenAddress = toTokenAddress(normalizedUserAddress);\r\n const lockingBytecodeResult = cashAddressToLockingBytecode(normalizedUserAddress);\r\n if (typeof lockingBytecodeResult === 'string') {\r\n throw new Error(`Failed to convert user address to locking bytecode: ${lockingBytecodeResult}`);\r\n }\r\n\r\n // Build Transaction\r\n const p2pkhUnlocker: Unlocker = {\r\n generateLockingBytecode: () => {\r\n const result = cashAddressToLockingBytecode(normalizedUserAddress);\r\n if (typeof result === 'string') {\r\n throw new Error(`Failed to convert CashAddress to locking bytecode: ${result}`);\r\n }\r\n return result.bytecode;\r\n },\r\n generateUnlockingBytecode: () => {\r\n return Uint8Array.from([]);\r\n }\r\n };\r\n \r\n const priceType1Hex = toLittleEndianHexString(BigInt(priceType1), 5);\r\n const priceType2Hex = toLittleEndianHexString(BigInt(priceType2), 5);\r\n const priceType3Hex = toLittleEndianHexString(BigInt(priceType3), 5);\r\n const endSaleHex = toLittleEndianHexString(BigInt(endSale), 4);\r\n const adminPkh = tokenSaleUtxo.token?.nft?.commitment!.substring(38, 78);\r\n\r\n let transaction: any;\r\n try {\r\n transaction = await new TransactionBuilder({ provider: electrumProvider })\r\n .addInput(tokenSaleUtxo, tokenSaleContract.unlock.modifyTokenSale(priceType1Hex, priceType2Hex, priceType3Hex, endSaleHex))\r\n .addInput(userMintingUtxo, p2pkhUnlocker)\r\n // TokenSale NFT being sent back to contract with new commitment\r\n .addOutput({\r\n to: tokenSaleContract.tokenAddress, \r\n amount: tokenSaleUtxo.satoshis,\r\n token: {\r\n amount: tokenSaleUtxo.token?.amount!, \r\n category: tokenSaleUtxo.token?.category!, \r\n nft: {\r\n capability: tokenSaleUtxo.token?.nft?.capability!, \r\n commitment: priceType1Hex + priceType2Hex + priceType3Hex + endSaleHex + adminPkh\r\n }\r\n },\r\n })\r\n // Admin NFT being sent back to user\r\n .addOutput({\r\n to: userTokenAddress, \r\n amount: userMintingUtxo.satoshis - 1000n,\r\n token: {\r\n amount: userMintingUtxo.token?.amount!, \r\n category: userMintingUtxo.token?.category!, \r\n nft: {\r\n capability: userMintingUtxo.token?.nft?.capability!, \r\n commitment: userMintingUtxo.token?.nft?.commitment!\r\n }\r\n },\r\n });\r\n } catch (error) {\r\n if (error instanceof Error) {\r\n throw new Error(`Error building transaction: ${error.message}`);\r\n } else {\r\n throw new Error(`Error building transaction: ${String(error)}`);\r\n }\r\n }\r\n\r\n // Build the transaction\r\n const rawTransactionHex = await transaction.build();\r\n\r\n // Decode transaction for WalletConnect\r\n const decodedTransaction = decodeTransaction(hexToBin(rawTransactionHex));\r\n if (typeof decodedTransaction === \"string\") {\r\n throw new Error(\"Failed to decode transaction\");\r\n }\r\n\r\n // Clear unlocking bytecode for user input (input 1)\r\n decodedTransaction.inputs[1].unlockingBytecode = Uint8Array.from([]);\r\n\r\n // Convert hex strings to Uint8Array for token data\r\n const binTokenCategory = hexToBin(tokenSaleUtxo.token?.category!);\r\n const binTokenSaleCommitment = hexToBin(tokenSaleUtxo.token?.nft?.commitment!);\r\n const binUserMintingCommitment = hexToBin(userMintingUtxo.token?.nft?.commitment!);\r\n\r\n // Get redeemScript as Uint8Array\r\n const getRedeemScript = (): Uint8Array => {\r\n if ((tokenSaleContract.redeemScript as any).bytecode) {\r\n return (tokenSaleContract.redeemScript as any).bytecode;\r\n }\r\n if (typeof tokenSaleContract.redeemScript === 'string') {\r\n return hexToBin(tokenSaleContract.redeemScript);\r\n }\r\n return new Uint8Array(tokenSaleContract.redeemScript as any);\r\n };\r\n\r\n const redeemScript = getRedeemScript();\r\n\r\n // Construct source outputs for WalletConnect\r\n let listSourceOutputs = [\r\n {\r\n ...decodedTransaction.inputs[0],\r\n lockingBytecode: contractLockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(tokenSaleUtxo.satoshis),\r\n contract: {\r\n abiFunction: tokenSaleContract.artifact.abi,\r\n redeemScript: redeemScript,\r\n artifact: tokenSaleContract.artifact,\r\n },\r\n token: {\r\n amount: tokenSaleUtxo.token?.amount,\r\n category: binTokenCategory,\r\n nft: {\r\n capability: tokenSaleUtxo.token?.nft?.capability!,\r\n commitment: binTokenSaleCommitment\r\n }\r\n }\r\n },\r\n {\r\n ...decodedTransaction.inputs[1],\r\n lockingBytecode: lockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(userMintingUtxo.satoshis),\r\n token: {\r\n amount: userMintingUtxo.token?.amount,\r\n category: binTokenCategory,\r\n nft: {\r\n capability: userMintingUtxo.token?.nft?.capability!,\r\n commitment: binUserMintingCommitment\r\n }\r\n }\r\n }\r\n ];\r\n\r\n // Create transaction object for WalletConnect signing\r\n const wcTransactionObj: WalletConnectTransactionObject = {\r\n transaction: decodedTransaction,\r\n sourceOutputs: listSourceOutputs,\r\n broadcast: false,\r\n userPrompt: `Modify TokenSale NFT`\r\n };\r\n\r\n return wcTransactionObj;\r\n}\r\n\r\n","import { TransactionBuilder, Contract, Unlocker } from 'cashscript';\r\nimport { hexToBin, cashAddressToLockingBytecode, decodeTransaction } from '@bitauth/libauth';\r\nimport { BurnParams, WalletConnectTransactionObject } from '../types';\r\nimport { ensureAddressPrefix, toTokenAddress } from '../utils';\r\nimport contractArtifact from '../artifacts/TokenSales.json';\r\n\r\n/**\r\n * Burn a TicketMaster NFT and all associated tickets\r\n * @param params - BurnParams object containing all required parameters\r\n * @returns Promise resolving to WalletConnectTransactionObject ready for signing\r\n * @throws Error if validation fails or transaction building fails\r\n */\r\nexport async function burn(params: BurnParams): Promise<WalletConnectTransactionObject> {\r\n const {\r\n electrumProvider,\r\n usersAddress,\r\n ticketMasterUtxo,\r\n userMintingNFT,\r\n tickets\r\n } = params;\r\n\r\n if (!electrumProvider) {\r\n throw new Error('Electrum provider not available');\r\n }\r\n\r\n // Compile the contract using the included artifact\r\n const ticketMasterContract = new Contract(contractArtifact as any, [], {\r\n provider: electrumProvider,\r\n addressType: 'p2sh32'\r\n });\r\n\r\n // Get contract address from compiled contract\r\n const contractAddr = ticketMasterContract.address;\r\n\r\n // Creating lockingBytecode for contract address\r\n const contractLockingBytecodeResult = cashAddressToLockingBytecode(contractAddr);\r\n if (typeof contractLockingBytecodeResult === 'string') {\r\n throw new Error(`Failed to convert contract address to locking bytecode: ${contractLockingBytecodeResult}`);\r\n }\r\n\r\n // Creating lockingBytecode for usersAddress\r\n const normalizedUserAddress = ensureAddressPrefix(usersAddress);\r\n const userTokenAddress = toTokenAddress(normalizedUserAddress);\r\n const lockingBytecodeResult = cashAddressToLockingBytecode(normalizedUserAddress);\r\n if (typeof lockingBytecodeResult === 'string') {\r\n throw new Error(`Failed to convert user address to locking bytecode: ${lockingBytecodeResult}`);\r\n }\r\n\r\n // Build Transaction\r\n const p2pkhUnlocker: Unlocker = {\r\n generateLockingBytecode: () => {\r\n const result = cashAddressToLockingBytecode(normalizedUserAddress);\r\n if (typeof result === 'string') {\r\n throw new Error(`Failed to convert CashAddress to locking bytecode: ${result}`);\r\n }\r\n return result.bytecode;\r\n },\r\n generateUnlockingBytecode: () => {\r\n return Uint8Array.from([]);\r\n }\r\n };\r\n\r\n let transaction: any;\r\n try {\r\n // Start building transaction\r\n transaction = await new TransactionBuilder({ provider: electrumProvider })\r\n .addInput(userMintingNFT, p2pkhUnlocker)\r\n // Add TicketMaster to be burned\r\n .addInput(ticketMasterUtxo, ticketMasterContract.unlock.burnTokenSale());\r\n\r\n // Add all tickets to be burned\r\n for (const ticket of tickets) {\r\n transaction = transaction.addInput(ticket, ticketMasterContract.unlock.burnTokenSale());\r\n }\r\n\r\n // Send admin NFT back to user\r\n transaction = transaction.addOutput({\r\n to: userTokenAddress, \r\n amount: userMintingNFT.satoshis,\r\n token: {\r\n amount: userMintingNFT.token?.amount!, \r\n category: userMintingNFT.token?.category!, \r\n nft: {\r\n capability: userMintingNFT.token?.nft?.capability!, \r\n commitment: userMintingNFT.token?.nft?.commitment! \r\n }\r\n },\r\n });\r\n } catch (error) {\r\n if (error instanceof Error) {\r\n throw new Error(`Error building transaction: ${error.message}`);\r\n } else {\r\n throw new Error(`Error building transaction: ${String(error)}`);\r\n }\r\n }\r\n\r\n // Build the transaction\r\n const rawTransactionHex = await transaction.build();\r\n\r\n // Decode transaction for WalletConnect\r\n const decodedTransaction = decodeTransaction(hexToBin(rawTransactionHex));\r\n if (typeof decodedTransaction === \"string\") {\r\n throw new Error(\"Failed to decode transaction\");\r\n }\r\n\r\n // Clear unlocking bytecode for user input (input 0)\r\n decodedTransaction.inputs[0].unlockingBytecode = Uint8Array.from([]);\r\n\r\n // Convert hex strings to Uint8Array for token data\r\n const binTokenCategory = hexToBin(ticketMasterUtxo.token?.category!);\r\n const binTicketMasterCommitment = hexToBin(ticketMasterUtxo.token?.nft?.commitment!);\r\n const binUserMintingCommitment = hexToBin(userMintingNFT.token?.nft?.commitment!);\r\n // For each ticket, convert hex to Uint8Array\r\n const binTicketCommitments = tickets.map((ticket) => hexToBin(ticket.token?.nft?.commitment!));\r\n\r\n // Get redeemScript as Uint8Array\r\n const getRedeemScript = (): Uint8Array => {\r\n if ((ticketMasterContract.redeemScript as any).bytecode) {\r\n return (ticketMasterContract.redeemScript as any).bytecode;\r\n }\r\n if (typeof ticketMasterContract.redeemScript === 'string') {\r\n return hexToBin(ticketMasterContract.redeemScript);\r\n }\r\n return new Uint8Array(ticketMasterContract.redeemScript as any);\r\n };\r\n\r\n const redeemScript = getRedeemScript();\r\n\r\n // Construct source outputs for WalletConnect\r\n let listSourceOutputs = [\r\n {\r\n ...decodedTransaction.inputs[0],\r\n lockingBytecode: lockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(userMintingNFT.satoshis),\r\n token: {\r\n amount: userMintingNFT.token?.amount,\r\n category: binTokenCategory,\r\n nft: {\r\n capability: userMintingNFT.token?.nft?.capability!,\r\n commitment: binUserMintingCommitment\r\n }\r\n }\r\n },\r\n {\r\n ...decodedTransaction.inputs[1],\r\n lockingBytecode: contractLockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(ticketMasterUtxo.satoshis),\r\n contract: {\r\n abiFunction: ticketMasterContract.artifact.abi,\r\n redeemScript: redeemScript,\r\n artifact: ticketMasterContract.artifact,\r\n },\r\n token: {\r\n amount: ticketMasterUtxo.token?.amount,\r\n category: binTokenCategory,\r\n nft: {\r\n capability: ticketMasterUtxo.token?.nft?.capability!,\r\n commitment: binTicketMasterCommitment\r\n }\r\n }\r\n }\r\n ];\r\n\r\n // Add all tickets to the list of source outputs\r\n for (let i = 0; i < tickets.length; i++) {\r\n const ticket = tickets[i];\r\n listSourceOutputs.push({\r\n ...decodedTransaction.inputs[i + 2],\r\n lockingBytecode: contractLockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(ticket.satoshis),\r\n token: {\r\n amount: ticket.token?.amount,\r\n category: binTokenCategory,\r\n nft: {\r\n capability: ticket.token?.nft?.capability!,\r\n commitment: binTicketCommitments[i]\r\n }\r\n }\r\n });\r\n }\r\n\r\n // Create transaction object for WalletConnect signing\r\n const wcTransactionObj: WalletConnectTransactionObject = {\r\n transaction: decodedTransaction,\r\n sourceOutputs: listSourceOutputs,\r\n broadcast: false,\r\n userPrompt: `Burn TicketMaster and ${tickets.length} tickets`\r\n };\r\n\r\n return wcTransactionObj;\r\n}\r\n\r\n","import { TransactionBuilder, Utxo, Unlocker } from 'cashscript';\r\nimport { hexToBin, cashAddressToLockingBytecode, decodeTransaction } from '@bitauth/libauth';\r\nimport { AddSatoshisParams, WalletConnectTransactionObject } from '../types';\r\nimport { ensureAddressPrefix, toTokenAddress } from '../utils';\r\n\r\n/**\r\n * Add satoshis to a minting NFT\r\n * @param params - AddSatoshisParams object containing all required parameters\r\n * @returns Promise resolving to WalletConnectTransactionObject ready for signing\r\n * @throws Error if validation fails or transaction building fails\r\n */\r\nexport async function addSatoshis(params: AddSatoshisParams): Promise<WalletConnectTransactionObject> {\r\n const {\r\n electrumProvider,\r\n usersAddress,\r\n userMintingNFT,\r\n additionalSatoshis\r\n } = params;\r\n\r\n if (!electrumProvider) {\r\n throw new Error('Electrum provider not available');\r\n }\r\n\r\n if (additionalSatoshis <= 0n) {\r\n throw new Error('Additional satoshis must be greater than 0');\r\n }\r\n\r\n // Creating lockingBytecode for usersAddress\r\n const normalizedUserAddress = ensureAddressPrefix(usersAddress);\r\n const userTokenAddress = toTokenAddress(normalizedUserAddress);\r\n const lockingBytecodeResult = cashAddressToLockingBytecode(normalizedUserAddress);\r\n if (typeof lockingBytecodeResult === 'string') {\r\n throw new Error(`Failed to convert user address to locking bytecode: ${lockingBytecodeResult}`);\r\n }\r\n\r\n // Get user UTXOs to find a BCH UTXO to fund the additional satoshis\r\n const userUtxos = await electrumProvider.getUtxos(normalizedUserAddress);\r\n\r\n // Find a BCH UTXO with enough satoshis (additionalSatoshis + miner fee ~1000 sats)\r\n const fundingUTXO = userUtxos.find(\r\n utxo => utxo.satoshis >= (additionalSatoshis + 1000n) && !utxo.token\r\n );\r\n\r\n if (!fundingUTXO) {\r\n // Count up all the sats in userUTXOs that do not have a token\r\n const totalSats = userUtxos.reduce((sum: bigint, utxo: Utxo) => {\r\n if (!utxo.token) {\r\n return sum + utxo.satoshis;\r\n }\r\n return sum;\r\n }, 0n);\r\n\r\n if (totalSats >= additionalSatoshis + 1000n) {\r\n throw new Error('No compatible UTXO found in wallet, consolidate?');\r\n } else {\r\n throw new Error(`Not enough BCH in your wallet. Required: ${additionalSatoshis + 1000n} sats, Available: ${totalSats} sats`);\r\n }\r\n }\r\n\r\n // Build Transaction\r\n const p2pkhUnlocker: Unlocker = {\r\n generateLockingBytecode: () => {\r\n const result = cashAddressToLockingBytecode(normalizedUserAddress);\r\n if (typeof result === 'string') {\r\n throw new Error(`Failed to convert CashAddress to locking bytecode: ${result}`);\r\n }\r\n return result.bytecode;\r\n },\r\n generateUnlockingBytecode: () => {\r\n return Uint8Array.from([]);\r\n }\r\n };\r\n\r\n let transaction: any;\r\n try {\r\n transaction = await new TransactionBuilder({ provider: electrumProvider })\r\n // Add the minting NFT as input\r\n .addInput(userMintingNFT, p2pkhUnlocker)\r\n // Add the funding UTXO to provide additional satoshis\r\n .addInput(fundingUTXO, p2pkhUnlocker)\r\n // Output: minting NFT with additional satoshis\r\n .addOutput({\r\n to: userTokenAddress,\r\n amount: userMintingNFT.satoshis + additionalSatoshis,\r\n token: {\r\n amount: userMintingNFT.token?.amount!,\r\n category: userMintingNFT.token?.category!,\r\n nft: {\r\n capability: userMintingNFT.token?.nft?.capability!,\r\n commitment: userMintingNFT.token?.nft?.commitment!\r\n }\r\n },\r\n });\r\n\r\n // Calculate change (fundingUTXO - additionalSatoshis - miner fee)\r\n const changeAmount = fundingUTXO.satoshis - additionalSatoshis - 1000n;\r\n if (changeAmount >= 1000n) { // Dust limit\r\n transaction.addOutput({\r\n to: normalizedUserAddress,\r\n amount: changeAmount,\r\n });\r\n }\r\n } catch (error) {\r\n if (error instanceof Error) {\r\n throw new Error(`Error building transaction: ${error.message}`);\r\n } else {\r\n throw new Error(`Error building transaction: ${String(error)}`);\r\n }\r\n }\r\n\r\n // Build the transaction\r\n const rawTransactionHex = await transaction.build();\r\n\r\n // Decode transaction for WalletConnect\r\n const decodedTransaction = decodeTransaction(hexToBin(rawTransactionHex));\r\n if (typeof decodedTransaction === \"string\") {\r\n throw new Error(\"Failed to decode transaction\");\r\n }\r\n\r\n // Clear unlocking bytecode for user inputs (wallet will sign these)\r\n decodedTransaction.inputs[0].unlockingBytecode = Uint8Array.from([]);\r\n decodedTransaction.inputs[1].unlockingBytecode = Uint8Array.from([]);\r\n\r\n // Convert hex strings to Uint8Array for token data\r\n const binTokenCategory = hexToBin(userMintingNFT.token?.category!);\r\n const binMintingCommitment = hexToBin(userMintingNFT.token?.nft?.commitment!);\r\n\r\n // Get locking bytecode for user address\r\n const userLockingBytecodeResult = cashAddressToLockingBytecode(normalizedUserAddress);\r\n if (typeof userLockingBytecodeResult === 'string') {\r\n throw new Error(`Failed to convert user address to locking bytecode: ${userLockingBytecodeResult}`);\r\n }\r\n\r\n // Construct source outputs for WalletConnect\r\n const listSourceOutputs = [\r\n {\r\n ...decodedTransaction.inputs[0],\r\n lockingBytecode: userLockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(userMintingNFT.satoshis),\r\n token: {\r\n amount: userMintingNFT.token?.amount,\r\n category: binTokenCategory,\r\n nft: {\r\n capability: userMintingNFT.token?.nft?.capability!,\r\n commitment: binMintingCommitment\r\n }\r\n }\r\n },\r\n {\r\n ...decodedTransaction.inputs[1],\r\n lockingBytecode: userLockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(fundingUTXO.satoshis)\r\n }\r\n ];\r\n\r\n // Create transaction object for WalletConnect signing\r\n const wcTransactionObj: WalletConnectTransactionObject = {\r\n transaction: decodedTransaction,\r\n sourceOutputs: listSourceOutputs,\r\n broadcast: false,\r\n userPrompt: `Add ${additionalSatoshis} satoshis to minting NFT`\r\n };\r\n\r\n return wcTransactionObj;\r\n}\r\n\r\n","// TokenSales_old1 contract addresses\r\n//export const AddressTicketMaster = 'bitcoincash:pvh0yat7d2r9nf228fpns3mypydvstq9arftt9qlmma42xeq2eryszkdd99zq'; //address hash: 2ef2757e6a8659a54a3a43384764091ac82c05e8d2b5941fdefb551b20564648\r\n//export const AddressTicketMasterToken = 'bitcoincash:rvh0yat7d2r9nf228fpns3mypydvstq9arftt9qlmma42xeq2eryss93vuymt';\r\n\r\n// TokenSales contract addresses | simplified change fee calculation in purchaseNFT()\r\nexport const AddressTicketMaster = 'bitcoincash:pdmta0t3lmeufrhjlmyxkx3ye648lvr08cdwmy36eqtkj4wzpagg2m4afvzlt'; //address hash: 76bebd71fef3c48ef2fec86b1a24ceaa7fb06f3e1aed923ac8176955c20f5085\r\nexport const AddressTicketMasterToken = 'bitcoincash:rdmta0t3lmeufrhjlmyxkx3ye648lvr08cdwmy36eqtkj4wzpagg2fxpg4rxq';\r\n\r\n\r\n// Ticket Level Descriptions\r\nexport const TICKET_LEVEL_DESCRIPTIONS = {\r\n '01': {\r\n name: 'Regular',\r\n description: 'Regular tickets provide standard access to the event. This is the base level ticket option.'\r\n },\r\n '02': {\r\n name: 'VIP',\r\n description: 'VIP tickets offer enhanced benefits including priority access, exclusive areas, and additional perks.'\r\n },\r\n '03': {\r\n name: 'Premium',\r\n description: 'Premium tickets provide the highest level of access with all VIP benefits plus additional exclusive features.'\r\n }\r\n};\r\n\r\n","import { TransactionBuilder, Contract, Unlocker } from 'cashscript';\r\nimport { hexToBin, cashAddressToLockingBytecode, decodeTransaction } from '@bitauth/libauth';\r\nimport { CreateListingParams, WalletConnectTransactionObject } from '../types';\r\nimport { ensureAddressPrefix, toLittleEndianHexString, toTokenAddress } from '../utils';\r\nimport contractArtifact from '../artifacts/TokenSales.json';\r\nimport { AddressTicketMasterToken } from '../constants/values';\r\n\r\n/**\r\n * Create a new TicketMaster listing\r\n * @param params - CreateListingParams object containing all required parameters\r\n * @returns Promise resolving to WalletConnectTransactionObject ready for signing\r\n * @throws Error if validation fails or transaction building fails\r\n */\r\nexport async function createListing(params: CreateListingParams): Promise<WalletConnectTransactionObject> {\r\n const {\r\n electrumProvider,\r\n usersAddress,\r\n userMintingNFT,\r\n priceType1,\r\n priceType2,\r\n priceType3,\r\n endSale,\r\n adminPubKeyHash\r\n } = params;\r\n\r\n if (!electrumProvider) {\r\n throw new Error('Electrum provider not available');\r\n }\r\n\r\n // Compile the contract using the included artifact\r\n const ticketMasterContract = new Contract(contractArtifact as any, [], {\r\n provider: electrumProvider,\r\n addressType: 'p2sh32'\r\n });\r\n\r\n // Validate adminPubKeyHash\r\n const adminPkhHex = adminPubKeyHash.replace(/^0x/i, '').trim();\r\n if (adminPkhHex.length !== 40 || !/^[0-9a-fA-F]+$/.test(adminPkhHex)) {\r\n throw new Error('Admin PubKey Hash must be 40 hex characters (20 bytes)');\r\n }\r\n\r\n // Normalize user address\r\n const normalizedUserAddress = ensureAddressPrefix(usersAddress);\r\n const userTokenAddress = toTokenAddress(normalizedUserAddress);\r\n const lockingBytecodeResult = cashAddressToLockingBytecode(normalizedUserAddress);\r\n if (typeof lockingBytecodeResult === 'string') {\r\n throw new Error(`Failed to convert user address to locking bytecode: ${lockingBytecodeResult}`);\r\n }\r\n\r\n // Get token address from compiled contract\r\n const contractTokenAddr = ticketMasterContract.tokenAddress;\r\nconsole.log('contractTokenAddr', contractTokenAddr);\r\nconsole.log('AddressTicketMasterToken', AddressTicketMasterToken);\r\n // Get locking bytecode for contract token address\r\n const contractTokenLockingBytecodeResult = cashAddressToLockingBytecode(contractTokenAddr);\r\n if (typeof contractTokenLockingBytecodeResult === 'string') {\r\n throw new Error(`Failed to convert contract token address to locking bytecode: ${contractTokenLockingBytecodeResult}`);\r\n }\r\n\r\n // Build TicketMaster commitment\r\n // Format: bytes5 priceType1 + bytes5 priceType2 + bytes5 priceType3 + bytes4 endSale + bytes20 adminPubKeyHash\r\n // Total: 39 bytes = 78 hex chars\r\n const priceType1Hex = toLittleEndianHexString(priceType1, 5); // 10 hex chars\r\n const priceType2Hex = toLittleEndianHexString(priceType2, 5); // 10 hex chars\r\n const priceType3Hex = toLittleEndianHexString(priceType3, 5); // 10 hex chars\r\n const endSaleHex = toLittleEndianHexString(endSale, 4); // 8 hex chars\r\n const ticketMasterCommitment = priceType1Hex + priceType2Hex + priceType3Hex + endSaleHex + adminPkhHex;\r\n \r\n if (ticketMasterCommitment.length !== 78) {\r\n throw new Error(`Invalid commitment length: ${ticketMasterCommitment.length}, expected 78`);\r\n }\r\n\r\n // Build Transaction\r\n const p2pkhUnlocker: Unlocker = {\r\n generateLockingBytecode: () => {\r\n const result = cashAddressToLockingBytecode(normalizedUserAddress);\r\n if (typeof result === 'string') {\r\n throw new Error(`Failed to convert CashAddress to locking bytecode: ${result}`);\r\n }\r\n return result.bytecode;\r\n },\r\n generateUnlockingBytecode: () => {\r\n return Uint8Array.from([]);\r\n }\r\n };\r\n\r\n let transaction: any;\r\n try {\r\n transaction = await new TransactionBuilder({ provider: electrumProvider })\r\n // Input: user's minting NFT\r\n .addInput(userMintingNFT, p2pkhUnlocker)\r\n // Output 0: user's minting NFT back to user\r\n .addOutput({\r\n to: userTokenAddress,\r\n amount: userMintingNFT.satoshis - 2000n,\r\n token: {\r\n amount: userMintingNFT.token?.amount!,\r\n category: userMintingNFT.token?.category!,\r\n nft: {\r\n capability: userMintingNFT.token?.nft?.capability!,\r\n commitment: userMintingNFT.token?.nft?.commitment!\r\n }\r\n },\r\n })\r\n // Output 1: TicketMaster Minting NFT to contract token address\r\n .addOutput({\r\n to: contractTokenAddr,\r\n amount: 1000n,\r\n token: {\r\n amount: userMintingNFT.token?.amount!,\r\n category: userMintingNFT.token?.category!,\r\n nft: {\r\n capability: 'minting',\r\n commitment: ticketMasterCommitment\r\n }\r\n },\r\n });\r\n } catch (error) {\r\n if (error instanceof Error) {\r\n throw new Error(`Error building transaction: ${error.message}`);\r\n } else {\r\n throw new Error(`Error building transaction: ${String(error)}`);\r\n }\r\n }\r\n\r\n // Build the transaction\r\n const rawTransactionHex = await transaction.build();\r\n\r\n // Decode transaction for WalletConnect\r\n const decodedTransaction = decodeTransaction(hexToBin(rawTransactionHex));\r\n if (typeof decodedTransaction === \"string\") {\r\n throw new Error(\"Failed to decode transaction\");\r\n }\r\n\r\n // Clear unlocking bytecode for user input (wallet will sign this)\r\n decodedTransaction.inputs[0].unlockingBytecode = Uint8Array.from([]);\r\n\r\n // Convert hex strings to Uint8Array for token data\r\n const binTokenCategory = hexToBin(userMintingNFT.token?.category!);\r\n const binUserCommitment = hexToBin(userMintingNFT.token?.nft?.commitment!);\r\n\r\n // Construct source outputs for WalletConnect\r\n const listSourceOutputs = [\r\n {\r\n ...decodedTransaction.inputs[0],\r\n lockingBytecode: lockingBytecodeResult.bytecode,\r\n valueSatoshis: BigInt(userMintingNFT.satoshis),\r\n token: {\r\n amount: userMintingNFT.token?.amount,\r\n category: binTokenCategory,\r\n nft: {\r\n capability: userMintingNFT.token?.nft?.capability!,\r\n commitment: binUserCommitment\r\n }\r\n }\r\n }\r\n ];\r\n\r\n // Create transaction object for WalletConnect signing\r\n const wcTransactionObj: WalletConnectTransactionObject = {\r\n transaction: decodedTransaction,\r\n sourceOutputs: listSourceOutputs,\r\n broadcast: false,\r\n userPrompt: `Create TicketMaster listing`\r\n };\r\n\r\n return wcTransactionObj;\r\n}\r\n\r\n","/**\r\n * TokenSales contract addresses\r\n * These are the addresses for the TokenSales (TicketMaster) contract\r\n */\r\nimport { AddressTicketMaster, AddressTicketMasterToken } from './constants/values';\r\n\r\nexport const DEFAULT_CONTRACT_ADDRESSES = {\r\n contract: AddressTicketMaster,\r\n token: AddressTicketMasterToken\r\n} as const;\r\n\r\n/**\r\n * Get contract address\r\n * @returns Contract address\r\n */\r\nexport function getContractAddress(): string {\r\n return AddressTicketMaster;\r\n}\r\n\r\n/**\r\n * Get token address\r\n * @returns Token address\r\n */\r\nexport function getTokenAddress(): string {\r\n return AddressTicketMasterToken;\r\n}\r\n\r\n/**\r\n * Get contract addresses\r\n * @returns Object with contract and token addresses\r\n */\r\nexport function getContractAddresses() {\r\n return {\r\n contract: AddressTicketMaster,\r\n token: AddressTicketMasterToken\r\n };\r\n}\r\n\r\n","import { Utxo } from 'cashscript';\nimport { ListAvailableTicketsParams } from '../types';\nimport { getTokenAddress } from '../config';\nimport { parseTicketMasterCommitment, isTicketMaster, isTicket } from '../utils/ticketMaster';\n\n/**\n * List available tickets for purchase from a TokenSale\n * @param params - ListAvailableTicketsParams object containing all required parameters\n * @returns Promise resolving to array of ticket UTXOs that are available for purchase\n * @throws Error if validation fails or TokenSale is not found/active\n */\nexport async function listAvailableTickets(params: ListAvailableTicketsParams): Promise<Utxo[]> {\n const {\n electrumProvider,\n categoryID\n } = params;\n\n if (!electrumProvider) {\n throw new Error('Electrum provider not available');\n }\n\n if (!categoryID || categoryID.length === 0) {\n throw new Error('Category ID is required');\n }\n\n // Get the contract token address\n const contractTokenAddress = getTokenAddress();\n\n // Get all UTXOs from the contract token address\n const contractUtxos = await electrumProvider.getUtxos(contractTokenAddress);\n\n // Filter UTXOs to only those matching the categoryID\n const categoryUtxos = contractUtxos.filter((utxo: Utxo) => \n utxo?.token?.category === categoryID\n );\n\n if (categoryUtxos.length === 0) {\n return []; // No UTXOs found for this category\n }\n\n // Find the TokenSale minting NFT (capability === 'minting')\n const tokenSaleUtxo = categoryUtxos.find((utxo: Utxo) => \n isTicketMaster(utxo)\n );\n\n if (!tokenSaleUtxo) {\n throw new Error(`No active TokenSale found for category ${categoryID}`);\n }\n\n // Parse the TokenSale commitment to get endSale block height\n const commitment = tokenSaleUtxo.token?.nft?.commitment || '';\n const tokenSaleData = parseTicketMasterCommitment(commitment);\n\n if (!tokenSaleData) {\n throw new Error('Failed to parse TokenSale commitment');\n }\n\n // Filter to only ticket UTXOs (capability === 'none')\n const availableTickets = categoryUtxos.filter((utxo: Utxo) => \n isTicket(utxo, categoryID)\n );\n\n return availableTickets;\n}\n","import { ListAllSalesParams, TokenSaleUtxo } from '../types';\r\nimport { getTokenAddress } from '../config';\r\nimport { isTicketMaster, parseTicketMasterCommitment } from '../utils/ticketMaster';\r\n\r\n/**\r\n * List all TokenSale NFTs (minting capability & 39-byte commitment)\r\n * @param params - ListAllSalesParams object containing the electrum provider\r\n * @returns Promise resolving to array of TokenSale UTXOs with parsed commitment data\r\n */\r\nexport async function listAllSales(params: ListAllSalesParams): Promise<TokenSaleUtxo[]> {\r\n const { electrumProvider } = params;\r\n\r\n if (!electrumProvider) {\r\n throw new Error('Electrum provider not available');\r\n }\r\n\r\n // Get the contract token address\r\n const contractTokenAddress = getTokenAddress();\r\n\r\n // Get all UTXOs from the contract token address\r\n const contractUtxos = await electrumProvider.getUtxos(contractTokenAddress);\r\n\r\n // Filter to only TokenSale NFTs (minting capability with 39-byte commitment)\r\n const tokenSaleUtxos: TokenSaleUtxo[] = [];\r\n\r\n for (const utxo of contractUtxos) {\r\n if (isTicketMaster(utxo)) {\r\n const commitment = utxo.token?.nft?.commitment || '';\r\n const tokenSaleData = parseTicketMasterCommitment(commitment);\r\n\r\n if (tokenSaleData) {\r\n tokenSaleUtxos.push({\r\n ...utxo,\r\n tokenSaleData\r\n });\r\n }\r\n }\r\n }\r\n\r\n return tokenSaleUtxos;\r\n}\r\n","import { ListActiveSalesParams, TokenSaleUtxo } from '../types';\r\nimport { getTokenAddress } from '../config';\r\nimport { isTicketMaster, parseTicketMasterCommitment } from '../utils/ticketMaster';\r\n\r\n/**\r\n * List active TokenSale NFTs (minting capability, 39-byte commitment, sale not ended)\r\n * A sale is active when current blockheight > endSale commitment field\r\n * @param params - ListActiveSalesParams object containing the electrum provider\r\n * @returns Promise resolving to array of active TokenSale UTXOs with parsed commitment data\r\n */\r\nexport async function listActiveSales(params: ListActiveSalesParams): Promise<TokenSaleUtxo[]> {\r\n const { electrumProvider } = params;\r\n\r\n if (!electrumProvider) {\r\n throw new Error('Electrum provider not available');\r\n }\r\n\r\n // Get current block height\r\n let currentBlockHeight: number;\r\n if (typeof (electrumProvider as any).getBlockHeight === 'function') {\r\n currentBlockHeight = await (electrumProvider as any).getBlockHeight();\r\n } else if (typeof (electrumProvider as any).performRequest === 'function') {\r\n try {\r\n const header = await (electrumProvider as any).performRequest('blockchain.headers.subscribe');\r\n currentBlockHeight = header?.height || header;\r\n } catch (e) {\r\n // Fallback: try to get block height from getUtxos call\r\n throw new Error('Unable to get block height from provider');\r\n }\r\n } else {\r\n throw new Error('Unable to get block height from provider');\r\n }\r\n\r\n // Get the contract token address\r\n const contractTokenAddress = getTokenAddress();\r\n\r\n // Get all UTXOs from the contract token address\r\n const contractUtxos = await electrumProvider.getUtxos(contractTokenAddress);\r\n\r\n // Filter to only active TokenSale NFTs (sale not ended)\r\n const activeSales: TokenSaleUtxo[] = [];\r\n\r\n for (const utxo of contractUtxos) {\r\n if (isTicketMaster(utxo)) {\r\n const commitment = utxo.token?.nft?.commitment || '';\r\n const tokenSaleData = parseTicketMasterCommitment(commitment);\r\n\r\n if (tokenSaleData) {\r\n // Sale is active when current blockheight > endSale\r\n if (currentBlockHeight < tokenSaleData.endSale) {\r\n activeSales.push({\r\n ...utxo,\r\n tokenSaleData\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n return activeSales;\r\n}\r\n"],"names":["stringify","decodeCashAddress","encodeCashAddress","Contract","cashAddressToLockingBytecode","TransactionBuilder","decodeTransaction","hexToBin"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lifestonelabs/tokensales",
3
- "version": "1.0.4",
3
+ "version": "1.0.5",
4
4
  "description": "Library for interacting with TokenSales contracts on Bitcoin Cash",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",