PHP WebShell
Текущая директория: /opt/BitGoJS/modules/bitgo/test/v2/unit/coins/utxo/util
Просмотр файла: transaction.ts
/**
* @prettier
*/
import * as utxolib from '@bitgo/utxo-lib';
const { isWalletUnspent, signInputWithUnspent } = utxolib.bitgo;
type RootWalletKeys = utxolib.bitgo.RootWalletKeys;
type Unspent<TNumber extends number | bigint = number> = utxolib.bitgo.Unspent<TNumber>;
export type TransactionObj = {
id: string;
hex: string;
ins: {
txid: string;
index: number;
scriptSig?: string;
witness?: string[];
}[];
outs: {
script: string;
value: number | string;
}[];
};
function toTxOutput<TNumber extends number | bigint = number>(
u: Unspent<TNumber>,
network: utxolib.Network
): utxolib.TxOutput<TNumber> {
return {
script: utxolib.address.toOutputScript(u.address, network),
value: u.value,
};
}
export function transactionToObj<TNumber extends number | bigint = number>(
tx: utxolib.bitgo.UtxoTransaction<TNumber>
): TransactionObj {
return {
id: tx.getId(),
hex: tx.toBuffer().toString('hex'),
ins: tx.ins.map((v) => ({
txid: Buffer.from(v.hash).reverse().toString('hex'),
index: v.index,
script: v.script?.toString('hex'),
witness: v.witness?.map((v) => v.toString('hex')),
})),
outs: tx.outs.map((v) => ({
script: v.script.toString('hex'),
value: typeof v.value === 'bigint' ? v.value.toString() : (v.value as number),
})),
};
}
export function transactionHexToObj(
txHex: string,
network: utxolib.Network,
amountType: 'number' | 'bigint' = 'number'
): TransactionObj {
const obj = transactionToObj(
utxolib.bitgo.createTransactionFromBuffer(Buffer.from(txHex, 'hex'), network, { amountType })
);
if (obj.hex !== txHex) {
throw new Error(`serialized txHex does not match input`);
}
return obj;
}
export function createPrebuildTransaction<TNumber extends number | bigint = number>(
network: utxolib.Network,
unspents: Unspent<TNumber>[],
outputAddress: string
): utxolib.bitgo.UtxoTransaction<TNumber> {
const txb = utxolib.bitgo.createTransactionBuilderForNetwork<TNumber>(network);
unspents.forEach((u) => {
const [txid, vin] = u.id.split(':');
txb.addInput(txid, Number(vin));
});
const amountType = unspents.length > 0 && typeof unspents[0].value === 'bigint' ? 'bigint' : 'number';
if (amountType === 'number') {
unspents.forEach((u) => (u.value = Math.round(u.value as number) as TNumber));
}
const unspentSum = utxolib.bitgo.unspentSum<TNumber>(unspents, amountType);
txb.addOutput(outputAddress, utxolib.bitgo.toTNumber<TNumber>(BigInt(unspentSum) - BigInt(1000), amountType));
return txb.buildIncomplete();
}
function createTransactionBuilderWithSignedInputs<TNumber extends number | bigint = number>(
network: utxolib.Network,
unspents: Unspent<TNumber>[],
signer: utxolib.bitgo.WalletUnspentSigner<RootWalletKeys>,
inputTransaction: utxolib.bitgo.UtxoTransaction<TNumber>
): utxolib.bitgo.UtxoTransactionBuilder<TNumber> {
const txBuilder = utxolib.bitgo.createTransactionBuilderFromTransaction<TNumber>(
inputTransaction,
unspents.map((u) => toTxOutput<TNumber>(u, network))
);
unspents.forEach((u, inputIndex) => {
if (isWalletUnspent<TNumber>(u)) {
signInputWithUnspent<TNumber>(txBuilder, inputIndex, u, signer);
}
});
return txBuilder;
}
export function createHalfSignedTransaction<TNumber extends number | bigint = number>(
network: utxolib.Network,
unspents: Unspent<TNumber>[],
outputAddress: string,
signer: utxolib.bitgo.WalletUnspentSigner<RootWalletKeys>,
prebuild?: utxolib.bitgo.UtxoTransaction<TNumber>
): utxolib.bitgo.UtxoTransaction<TNumber> {
if (!prebuild) {
prebuild = createPrebuildTransaction<TNumber>(network, unspents, outputAddress);
}
return createTransactionBuilderWithSignedInputs<TNumber>(network, unspents, signer, prebuild).buildIncomplete();
}
export function createFullSignedTransaction<TNumber extends number | bigint = number>(
network: utxolib.Network,
unspents: Unspent<TNumber>[],
outputAddress: string,
signer: utxolib.bitgo.WalletUnspentSigner<RootWalletKeys>,
halfSigned?: utxolib.bitgo.UtxoTransaction<TNumber>
): utxolib.bitgo.UtxoTransaction<TNumber> {
if (!halfSigned) {
halfSigned = createHalfSignedTransaction<TNumber>(network, unspents, outputAddress, signer);
}
return createTransactionBuilderWithSignedInputs<TNumber>(
network,
unspents,
new utxolib.bitgo.WalletUnspentSigner(signer.walletKeys, signer.cosigner, signer.signer),
halfSigned
).build();
}
Выполнить команду
Для локальной разработки. Не используйте в интернете!