diff --git a/examples/p-chain/base.ts b/examples/p-chain/base.ts new file mode 100644 index 000000000..5455c41ab --- /dev/null +++ b/examples/p-chain/base.ts @@ -0,0 +1,33 @@ +import { addTxSignatures } from '../../src/signer'; +import { TransferableOutput } from '../../src/serializable/avax'; +import { bech32ToBytes, hexToBuffer } from '../../src/utils'; +import { getContextFromURI } from '../../src/vms/context'; +import { newBaseTx } from '../../src/vms/pvm'; +import { pvmapi } from '../chain_apis'; + +const P_CHAIN_ADDRESS = process.env.P_CHAIN_ADDRESS; +const PRIVATE_KEY = process.env.PRIVATE_KEY; + +const main = async () => { + if (!P_CHAIN_ADDRESS || !PRIVATE_KEY) { + throw new Error('Missing environment variable(s).'); + } + + const { utxos } = await pvmapi.getUTXOs({ addresses: [P_CHAIN_ADDRESS] }); + const context = await getContextFromURI(process.env.AVAX_PUBLIC_URL); + + const tx = newBaseTx(context, [bech32ToBytes(P_CHAIN_ADDRESS)], utxos, [ + TransferableOutput.fromNative(context.avaxAssetID, BigInt(0.1 * 1e9), [ + bech32ToBytes(P_CHAIN_ADDRESS), + ]), + ]); + + await addTxSignatures({ + unsignedTx: tx, + privateKeys: [hexToBuffer(PRIVATE_KEY)], + }); + + return pvmapi.issueSignedTx(tx.getSignedTx()); +}; + +main().then(console.log); diff --git a/src/vms/avm/builder.ts b/src/vms/avm/builder.ts index be2872fb1..0c5a75f52 100644 --- a/src/vms/avm/builder.ts +++ b/src/vms/avm/builder.ts @@ -19,7 +19,7 @@ import { BaseTx } from '../../serializable/avm/baseTx'; import type { UTXOCalculationResult } from '../utils/calculateSpend'; import { calculateUTXOSpend } from '../utils/calculateSpend'; import { useAvmAndCorethUTXOs } from './utxoCalculationFns'; -import { baseTxUnsafe } from '../common'; +import { baseTxUnsafeAvm } from '../common'; /** * @@ -216,7 +216,7 @@ export function newBaseTx( return new UnsignedTx( new BaseTx( - baseTxUnsafe(context, allOutputs, inputs, defaultedOptions.memo), + baseTxUnsafeAvm(context, allOutputs, inputs, defaultedOptions.memo), ), inputUTXOs, addressMaps, @@ -259,7 +259,7 @@ const exportTxUnsafe = ( return new UnsignedTx( new ExportTx( - baseTxUnsafe(context, changeOutputs, inputs, memo), + baseTxUnsafeAvm(context, changeOutputs, inputs, memo), Id.fromString(destinationChain), outputs, ), diff --git a/src/vms/common/builder.ts b/src/vms/common/builder.ts index 94f9c62b7..9ba179c7f 100644 --- a/src/vms/common/builder.ts +++ b/src/vms/common/builder.ts @@ -3,12 +3,12 @@ import type { Context } from '../context/model'; import { BaseTx as AvaxBaseTx } from '../../serializable/avax'; /** - * format a BaseTx directly from inputs with no validation + * format a BaseTx for xChain directly from inputs with no validation * @param changeOutputs - the output representing the remaining amounts from each input * @param inputs - the inputs of the tx * @param memo - optional memo */ -export const baseTxUnsafe = ( +export const baseTxUnsafeAvm = ( context: Context, changeOutputs: TransferableOutput[], inputs: TransferableInput[], @@ -22,3 +22,24 @@ export const baseTxUnsafe = ( memo, ); }; + +/** + * format a BaseTx for pChain directly from inputs with no validation + * @param changeOutputs - the output representing the remaining amounts from each input + * @param inputs - the inputs of the tx + * @param memo - optional memo + */ +export const baseTxUnsafePvm = ( + context: Context, + changeOutputs: TransferableOutput[], + inputs: TransferableInput[], + memo: Uint8Array, +) => { + return AvaxBaseTx.fromNative( + context.networkID, + context.pBlockchainID, + changeOutputs, + inputs, + memo, + ); +}; diff --git a/src/vms/pvm/builder.ts b/src/vms/pvm/builder.ts index 40763f6b0..eb6b42610 100644 --- a/src/vms/pvm/builder.ts +++ b/src/vms/pvm/builder.ts @@ -42,7 +42,7 @@ import { } from './utxoCalculationFns'; import { NodeId } from '../../serializable/fxs/common/nodeId'; import { createSignerOrSignerEmptyFromStrings } from '../../serializable/pvm/signer'; -import { baseTxUnsafe } from '../common'; +import { baseTxUnsafePvm } from '../common'; /* Builder is useful for building transactions that are specific to a chain. @@ -88,7 +88,7 @@ export function newBaseTx( return new UnsignedTx( new BaseTx( - baseTxUnsafe(context, allOutputs, inputs, defaultedOptions.memo), + baseTxUnsafePvm(context, allOutputs, inputs, defaultedOptions.memo), ), inputUTXOs, addressMaps,