diff --git a/examples/rgbpp/logs/.gitkeep b/examples/rgbpp/logs/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/examples/rgbpp/shared/utils.ts b/examples/rgbpp/shared/utils.ts new file mode 100644 index 00000000..2c5d2e6f --- /dev/null +++ b/examples/rgbpp/shared/utils.ts @@ -0,0 +1,49 @@ +import * as fs from 'fs'; +import * as path from 'path'; +import { + BaseCkbVirtualTxResult, + SporeVirtualTxResult, + SporeCreateVirtualTxResult, + SporeTransferVirtualTxResult, +} from 'rgbpp/ckb'; + +/** + * Save ckbVirtualTxResult to a log file + * @param ckbVirtualTxResult - The ckbVirtualTxResult to save + * @param exampleName - Example name used to distinguish different log files + */ + +export type CkbVirtualTxResultType = + | BaseCkbVirtualTxResult + | SporeVirtualTxResult + | SporeCreateVirtualTxResult + | SporeTransferVirtualTxResult; + +export const saveCkbVirtualTxResult = (ckbVirtualTxResult: CkbVirtualTxResultType, exampleName: string) => { + try { + // Define log file path + const logDir = path.resolve(__dirname, '../logs'); + const timestamp = new Date().toISOString().replace(/:/g, '-'); // Replace colons with hyphens + const logFilePath = path.join(logDir, `${exampleName}-${timestamp}-ckbVirtualTxResult.log`); + + // Ensure the log directory exists + if (!fs.existsSync(logDir)) { + fs.mkdirSync(logDir); + } + + // Validate and save ckbVirtualTxResult to log file + if (typeof ckbVirtualTxResult === 'object' && ckbVirtualTxResult !== null) { + fs.writeFileSync(logFilePath, JSON.stringify(ckbVirtualTxResult, null, 2)); + console.info(`Saved ckbVirtualTxResult to ${logFilePath}`); + } else { + console.error('Invalid ckbVirtualTxResult format'); + } + + // Remind developers to save the transaction result + console.info( + `Important: It's recommended to save the rgbpp_ckb_tx_virtual locally before the isomorphic transactions are finalized.`, + ); + } catch (error) { + console.error('Failed to save ckbVirtualTxResult:', error); + } +}; diff --git a/examples/rgbpp/spore/4-transfer-spore.ts b/examples/rgbpp/spore/4-transfer-spore.ts index 3a7738a0..7646f4fe 100644 --- a/examples/rgbpp/spore/4-transfer-spore.ts +++ b/examples/rgbpp/spore/4-transfer-spore.ts @@ -3,6 +3,7 @@ import { genTransferSporeCkbVirtualTx, sendRgbppUtxos } from 'rgbpp'; import { getSporeTypeScript, Hex } from 'rgbpp/ckb'; import { serializeScript } from '@nervosnetwork/ckb-sdk-utils'; import { isMainnet, collector, btcAddress, btcDataSource, btcKeyPair, btcService } from '../env'; +import { saveCkbVirtualTxResult } from '../shared/utils'; interface SporeTransferParams { sporeRgbppLockArgs: Hex; @@ -23,6 +24,9 @@ const transferSpore = async ({ sporeRgbppLockArgs, toBtcAddress, sporeTypeArgs } isMainnet, }); + // Save ckbVirtualTxResult + saveCkbVirtualTxResult(ckbVirtualTxResult, '4-transfer-spore'); + const { commitment, ckbRawTx } = ckbVirtualTxResult; // Send BTC tx diff --git a/examples/rgbpp/spore/5-leap-spore-to-ckb.ts b/examples/rgbpp/spore/5-leap-spore-to-ckb.ts index c4af4cde..1f0ae59e 100644 --- a/examples/rgbpp/spore/5-leap-spore-to-ckb.ts +++ b/examples/rgbpp/spore/5-leap-spore-to-ckb.ts @@ -3,6 +3,7 @@ import { genLeapSporeFromBtcToCkbVirtualTx, sendRgbppUtxos } from 'rgbpp'; import { getSporeTypeScript, Hex } from 'rgbpp/ckb'; import { serializeScript } from '@nervosnetwork/ckb-sdk-utils'; import { isMainnet, collector, btcAddress, btcDataSource, btcKeyPair, btcService } from '../env'; +import { saveCkbVirtualTxResult } from '../shared/utils'; interface SporeLeapParams { sporeRgbppLockArgs: Hex; @@ -24,6 +25,9 @@ const leapSporeFromBtcToCkb = async ({ sporeRgbppLockArgs, toCkbAddress, sporeTy isMainnet, }); + // Save ckbVirtualTxResult + saveCkbVirtualTxResult(ckbVirtualTxResult, '5-leap-spore-to-ckb'); + const { commitment, ckbRawTx } = ckbVirtualTxResult; // Send BTC tx diff --git a/examples/rgbpp/spore/launch/2-create-cluster.ts b/examples/rgbpp/spore/launch/2-create-cluster.ts index 5fefc541..97e3cdd1 100644 --- a/examples/rgbpp/spore/launch/2-create-cluster.ts +++ b/examples/rgbpp/spore/launch/2-create-cluster.ts @@ -9,6 +9,7 @@ import { sendCkbTx, updateCkbTxWithRealBtcTxId, } from 'rgbpp/ckb'; +import { saveCkbVirtualTxResult } from '../../shared/utils'; const createCluster = async ({ ownerRgbppLockArgs }: { ownerRgbppLockArgs: string }) => { const ckbVirtualTxResult = await genCreateClusterCkbVirtualTx({ @@ -19,6 +20,9 @@ const createCluster = async ({ ownerRgbppLockArgs }: { ownerRgbppLockArgs: strin ckbFeeRate: BigInt(2000), }); + // Save ckbVirtualTxResult + saveCkbVirtualTxResult(ckbVirtualTxResult, '2-create-cluster'); + const { commitment, ckbRawTx, clusterId } = ckbVirtualTxResult; console.log('clusterId: ', clusterId); diff --git a/examples/rgbpp/spore/launch/3-create-spores.ts b/examples/rgbpp/spore/launch/3-create-spores.ts index b073b067..342b8e6a 100644 --- a/examples/rgbpp/spore/launch/3-create-spores.ts +++ b/examples/rgbpp/spore/launch/3-create-spores.ts @@ -20,6 +20,7 @@ import { RawSporeData, } from 'rgbpp/ckb'; import { transactionToHex, utf8ToBuffer } from 'rgbpp/btc'; +import { saveCkbVirtualTxResult } from '../../shared/utils'; interface SporeCreateParams { clusterRgbppLockArgs: Hex; @@ -38,6 +39,9 @@ const createSpores = async ({ clusterRgbppLockArgs, receivers }: SporeCreatePara ckbFeeRate: BigInt(2000), }); + // Save ckbVirtualTxResult + saveCkbVirtualTxResult(ckbVirtualTxResult, '3-create-spores'); + const { commitment, ckbRawTx, sumInputsCapacity, clusterCell } = ckbVirtualTxResult; // Send BTC tx diff --git a/examples/rgbpp/spore/local/4-transfer-spore.ts b/examples/rgbpp/spore/local/4-transfer-spore.ts index 369a0a9f..a695c818 100644 --- a/examples/rgbpp/spore/local/4-transfer-spore.ts +++ b/examples/rgbpp/spore/local/4-transfer-spore.ts @@ -12,6 +12,7 @@ import { sendRgbppUtxos, transactionToHex } from 'rgbpp/btc'; import { BtcAssetsApiError } from 'rgbpp'; import { serializeScript } from '@nervosnetwork/ckb-sdk-utils'; import { isMainnet, collector, btcAddress, btcDataSource, btcKeyPair, btcService } from '../../env'; +import { saveCkbVirtualTxResult } from '../../shared/utils'; interface SporeTransferParams { sporeRgbppLockArgs: Hex; @@ -35,6 +36,9 @@ const transferSpore = async ({ sporeRgbppLockArgs, toBtcAddress, sporeTypeArgs } ckbFeeRate: BigInt(5000), }); + // Save ckbVirtualTxResult + saveCkbVirtualTxResult(ckbVirtualTxResult, '4-transfer-spore-local'); + const { commitment, ckbRawTx, sporeCell } = ckbVirtualTxResult; // console.log(JSON.stringify(ckbRawTx)) diff --git a/examples/rgbpp/spore/local/5-leap-spore-to-ckb.ts b/examples/rgbpp/spore/local/5-leap-spore-to-ckb.ts index 5d4cc7a3..06856e96 100644 --- a/examples/rgbpp/spore/local/5-leap-spore-to-ckb.ts +++ b/examples/rgbpp/spore/local/5-leap-spore-to-ckb.ts @@ -12,6 +12,7 @@ import { sendRgbppUtxos, transactionToHex } from 'rgbpp/btc'; import { serializeScript } from '@nervosnetwork/ckb-sdk-utils'; import { isMainnet, collector, btcAddress, btcDataSource, btcKeyPair, btcService } from '../../env'; import { BtcAssetsApiError } from 'rgbpp'; +import { saveCkbVirtualTxResult } from '../../shared/utils'; interface SporeLeapParams { sporeRgbppLockArgs: Hex; @@ -35,6 +36,9 @@ const leapSpore = async ({ sporeRgbppLockArgs, toCkbAddress, sporeTypeArgs }: Sp isMainnet, }); + // Save ckbVirtualTxResult + saveCkbVirtualTxResult(ckbVirtualTxResult, '5-leap-spore-to-ckb-local'); + const { commitment, ckbRawTx, sporeCell } = ckbVirtualTxResult; // console.log(JSON.stringify(ckbRawTx)) diff --git a/examples/rgbpp/xudt/2-btc-transfer.ts b/examples/rgbpp/xudt/2-btc-transfer.ts index 047d8822..0fdd274a 100644 --- a/examples/rgbpp/xudt/2-btc-transfer.ts +++ b/examples/rgbpp/xudt/2-btc-transfer.ts @@ -2,6 +2,7 @@ import { buildRgbppLockArgs, getXudtTypeScript } from 'rgbpp/ckb'; import { serializeScript } from '@nervosnetwork/ckb-sdk-utils'; import { genBtcTransferCkbVirtualTx, sendRgbppUtxos } from 'rgbpp'; import { isMainnet, collector, btcAddress, btcKeyPair, btcService, btcDataSource } from '../env'; +import { saveCkbVirtualTxResult } from '../shared/utils'; interface RgbppTransferParams { rgbppLockArgsList: string[]; @@ -24,6 +25,9 @@ const transfer = async ({ rgbppLockArgsList, toBtcAddress, xudtTypeArgs, transfe isMainnet, }); + // Save ckbVirtualTxResult + saveCkbVirtualTxResult(ckbVirtualTxResult, '2-btc-transfer'); + const { commitment, ckbRawTx } = ckbVirtualTxResult; // Send BTC tx diff --git a/examples/rgbpp/xudt/3-btc-leap-ckb.ts b/examples/rgbpp/xudt/3-btc-leap-ckb.ts index 406058b3..0f54b137 100644 --- a/examples/rgbpp/xudt/3-btc-leap-ckb.ts +++ b/examples/rgbpp/xudt/3-btc-leap-ckb.ts @@ -2,6 +2,7 @@ import { buildRgbppLockArgs, getXudtTypeScript } from 'rgbpp/ckb'; import { serializeScript } from '@nervosnetwork/ckb-sdk-utils'; import { genBtcJumpCkbVirtualTx, sendRgbppUtxos } from 'rgbpp'; import { isMainnet, collector, btcAddress, btcKeyPair, btcService, btcDataSource } from '../env'; +import { saveCkbVirtualTxResult } from '../shared/utils'; interface LeapToCkbParams { rgbppLockArgsList: string[]; @@ -25,6 +26,9 @@ const leapFromBtcToCKB = async ({ rgbppLockArgsList, toCkbAddress, xudtTypeArgs, isMainnet, }); + // Save ckbVirtualTxResult + saveCkbVirtualTxResult(ckbVirtualTxResult, '3-btc-leap-ckb'); + const { commitment, ckbRawTx } = ckbVirtualTxResult; // Send BTC tx diff --git a/examples/rgbpp/xudt/launch/2-launch-rgbpp.ts b/examples/rgbpp/xudt/launch/2-launch-rgbpp.ts index 50d751f5..d7708bcf 100644 --- a/examples/rgbpp/xudt/launch/2-launch-rgbpp.ts +++ b/examples/rgbpp/xudt/launch/2-launch-rgbpp.ts @@ -9,6 +9,7 @@ import { import { RGBPP_TOKEN_INFO } from './0-rgbpp-token-info'; import { btcAddress, btcDataSource, btcKeyPair, btcService, collector, isMainnet } from '../../env'; import { transactionToHex } from 'rgbpp/btc'; +import { saveCkbVirtualTxResult } from '../../shared/utils'; interface Params { ownerRgbppLockArgs: string; @@ -24,6 +25,9 @@ const launchRgppAsset = async ({ ownerRgbppLockArgs, launchAmount, rgbppTokenInf isMainnet, }); + // Save ckbVirtualTxResult + saveCkbVirtualTxResult(ckbVirtualTxResult, '2-launch-rgbpp'); + const { commitment, ckbRawTx } = ckbVirtualTxResult; console.log('RGB++ Asset type script args: ', ckbRawTx.outputs[0].type?.args); diff --git a/examples/rgbpp/xudt/launch/3-distribute-rgbpp.ts b/examples/rgbpp/xudt/launch/3-distribute-rgbpp.ts index 2c801113..e9c25300 100644 --- a/examples/rgbpp/xudt/launch/3-distribute-rgbpp.ts +++ b/examples/rgbpp/xudt/launch/3-distribute-rgbpp.ts @@ -21,6 +21,7 @@ import { updateCkbTxWithRealBtcTxId, } from 'rgbpp/ckb'; import { transactionToHex } from 'rgbpp/btc'; +import { saveCkbVirtualTxResult } from '../../shared/utils'; interface Params { rgbppLockArgsList: string[]; @@ -43,6 +44,9 @@ const distributeRgbppAssetOnBtc = async ({ rgbppLockArgsList, receivers, xudtTyp isMainnet, }); + // Save ckbVirtualTxResult + saveCkbVirtualTxResult(ckbVirtualTxResult, '3-distribute-rgbpp'); + const { commitment, ckbRawTx, sumInputsCapacity, rgbppChangeOutIndex } = ckbVirtualTxResult; // The first output utxo is OP_RETURN diff --git a/examples/rgbpp/xudt/local/2-btc-transfer.ts b/examples/rgbpp/xudt/local/2-btc-transfer.ts index 4de9ab89..92a4185d 100644 --- a/examples/rgbpp/xudt/local/2-btc-transfer.ts +++ b/examples/rgbpp/xudt/local/2-btc-transfer.ts @@ -9,6 +9,7 @@ import { } from 'rgbpp/ckb'; import { isMainnet, collector, btcAddress, btcDataSource, btcKeyPair, btcService } from '../../env'; import { transactionToHex } from 'rgbpp/btc'; +import { saveCkbVirtualTxResult } from '../../shared/utils'; interface RgbppTransferParams { rgbppLockArgsList: string[]; @@ -32,6 +33,9 @@ const transfer = async ({ rgbppLockArgsList, toBtcAddress, xudtTypeArgs, transfe isMainnet, }); + // Save ckbVirtualTxResult + saveCkbVirtualTxResult(ckbVirtualTxResult, '2-btc-transfer-local'); + const { commitment, ckbRawTx } = ckbVirtualTxResult; // Send BTC tx diff --git a/examples/rgbpp/xudt/local/3-btc-leap-ckb.ts b/examples/rgbpp/xudt/local/3-btc-leap-ckb.ts index 877015ed..d42615a8 100644 --- a/examples/rgbpp/xudt/local/3-btc-leap-ckb.ts +++ b/examples/rgbpp/xudt/local/3-btc-leap-ckb.ts @@ -9,6 +9,7 @@ import { } from 'rgbpp/ckb'; import { isMainnet, collector, btcAddress, btcDataSource, btcKeyPair, btcService } from '../../env'; import { transactionToHex } from 'rgbpp/btc'; +import { saveCkbVirtualTxResult } from '../../shared/utils'; interface LeapToCkbParams { rgbppLockArgsList: string[]; @@ -33,6 +34,9 @@ const leapFromBtcToCkb = async ({ rgbppLockArgsList, toCkbAddress, xudtTypeArgs, isMainnet, }); + // Save ckbVirtualTxResult + saveCkbVirtualTxResult(ckbVirtualTxResult, '3-btc-leap-ckb-local'); + const { commitment, ckbRawTx } = ckbVirtualTxResult; // Send BTC tx