PHP WebShell
Текущая директория: /opt/BitGoJS/modules/bitgo/test/v2/unit/coins/utxo/util
Просмотр файла: unspents.ts
/**
* @prettier
*/
import * as utxolib from '@bitgo/utxo-lib';
const { scriptTypeForChain, chainCodesP2sh, getExternalChainCode, getInternalChainCode } = utxolib.bitgo;
type RootWalletKeys = utxolib.bitgo.RootWalletKeys;
type Unspent<TNumber extends number | bigint = number> = utxolib.bitgo.Unspent<TNumber>;
type WalletUnspent<TNumber extends number | bigint = number> = utxolib.bitgo.WalletUnspent<TNumber>;
type ChainCode = utxolib.bitgo.ChainCode;
import { getSeed } from '@bitgo/sdk-test';
import { getReplayProtectionAddresses } from '@bitgo/abstract-utxo';
export type InputScriptType = utxolib.bitgo.outputScripts.ScriptType2Of3 | 'replayProtection';
const defaultChain: ChainCode = getExternalChainCode(chainCodesP2sh);
export function getOutputScript(
walletKeys: RootWalletKeys,
chain = defaultChain,
index = 0
): utxolib.bitgo.outputScripts.SpendableScript {
return utxolib.bitgo.outputScripts.createOutputScript2of3(
walletKeys.deriveForChainAndIndex(chain, index).publicKeys,
scriptTypeForChain(chain)
);
}
export function getWalletAddress(
network: utxolib.Network,
walletKeys: RootWalletKeys,
chain = defaultChain,
index = 0
): string {
return utxolib.address.fromOutputScript(getOutputScript(walletKeys, chain, index).scriptPubKey, network);
}
function mockOutputIdForAddress(address: string) {
return getSeed(address).toString('hex') + ':1';
}
export function mockWalletUnspent<TNumber extends number | bigint = number>(
network: utxolib.Network,
walletKeys: RootWalletKeys,
{ id, chain = defaultChain, index = 0, value, address }: Partial<WalletUnspent<TNumber>>
): WalletUnspent<TNumber> {
if (value === undefined) {
throw new Error(`unspent value must be set`);
}
if (chain === undefined) {
throw new Error(`unspent chain must be set`);
}
const derived = getOutputScript(walletKeys, chain, index);
const deriveAddress = utxolib.address.fromOutputScript(derived.scriptPubKey, network);
if (address) {
if (address !== deriveAddress) {
throw new Error(`derivedAddress mismatch: ${address} derived=${deriveAddress}`);
}
} else {
address = deriveAddress;
}
if (!id) {
id = mockOutputIdForAddress(address);
}
return {
id,
address,
chain,
index,
value,
};
}
export function mockUnspentReplayProtection<TNumber extends number | bigint = number>(
network: utxolib.Network,
value: TNumber
): Unspent<TNumber> {
const addresses = getReplayProtectionAddresses(network);
if (addresses.length) {
const address = addresses[0];
return {
id: mockOutputIdForAddress(address),
address,
value,
};
}
throw new Error(`${utxolib.getNetworkName(network)} has no replay protection unspetns`);
}
export function mockUnspent<TNumber extends number | bigint = number>(
network: utxolib.Network,
walletKeys: RootWalletKeys,
chain: ChainCode | InputScriptType,
index: number,
value: TNumber
): Unspent<TNumber> {
if (chain === 'replayProtection') {
return mockUnspentReplayProtection(network, (typeof value === 'bigint' ? BigInt(1000) : 1000) as TNumber);
} else {
return mockWalletUnspent(network, walletKeys, { chain: getInternalChainCode(chain), value, index });
}
}
Выполнить команду
Для локальной разработки. Не используйте в интернете!