PHP WebShell
Текущая директория: /usr/lib/node_modules/bitgo/node_modules/@vechain/sdk-core/src/vcdm/abi
Просмотр файла: ABIFunction.ts
import {
InvalidAbiDataToEncodeOrDecode,
InvalidAbiItem
} from '@vechain/sdk-errors';
import {
type AbiFunction,
type ContractFunctionName,
decodeFunctionData,
type DecodeFunctionDataReturnType,
decodeFunctionResult,
type DecodeFunctionResultReturnType,
encodeFunctionData,
type Abi as ViemABI,
type Hex as ViemHex
} from 'viem';
import { Hex } from '../Hex';
import { ABIItem } from './ABIItem';
/**
* Represents a function call in the Function ABI.
* @extends ABIItem
*/
class ABIFunction<
TAbi extends ViemABI = ViemABI,
TFunctionName extends
ContractFunctionName<TAbi> = ContractFunctionName<TAbi>
> extends ABIItem {
private readonly abiFunction: AbiFunction;
public constructor(signature: string);
public constructor(signature: AbiFunction);
public constructor(signature: string | AbiFunction) {
try {
super(signature);
this.abiFunction = this.signature as AbiFunction;
} catch (error) {
throw new InvalidAbiItem(
'ABIFunction constructor',
'Initialization failed: Cannot create Function ABI. Function format is invalid.',
{
type: 'function',
value: signature
},
error
);
}
}
/**
* Get the function selector.
* @returns {string} The function selector.
* @override {@link ABIItem#signatureHash}
*/
public get signatureHash(): string {
return super.signatureHash.substring(0, 10);
}
/**
* Decode data using the function's ABI.
*
* @param {Hex} data - Data to decode.
* @returns Decoding results.
* @throws {InvalidAbiDataToEncodeOrDecode}
*/
public decodeData(
data: Hex
): DecodeFunctionDataReturnType<TAbi, TFunctionName> {
try {
return decodeFunctionData({
abi: [this.abiFunction],
data: data.toString() as ViemHex
});
} catch (error) {
throw new InvalidAbiDataToEncodeOrDecode(
'ABIFunction.decodeData',
'Decoding failed: Data must be a valid hex string encoding a compliant ABI type.',
{ data },
error
);
}
}
/**
* Encode data using the function's ABI.
*
* @param dataToEncode - Data to encode.
* @returns {Hex} Encoded data.
* @throws {InvalidAbiDataToEncodeOrDecode}
*/
public encodeData<TValue>(dataToEncode?: TValue[]): Hex {
try {
return Hex.of(
encodeFunctionData({
abi: [this.abiFunction],
args: dataToEncode
})
);
} catch (e) {
throw new InvalidAbiDataToEncodeOrDecode(
'ABIFunction.encodeData',
'Encoding failed: Data format is invalid. Function data does not match the expected format for ABI type encoding.',
{ dataToEncode },
e
);
}
}
/**
* Decodes the output data from a transaction based on ABI (Application Binary Interface) specifications.
* This method attempts to decode the given hex-like data into a readable format using the contract's interface.
*
* @param {Hex} data - The data to be decoded, typically representing the output of a contract function call.
* @returns {DecodeFunctionResultReturnType} An object containing the decoded data.
* @throws {InvalidAbiDataToEncodeOrDecode}
*
* @example
* ```typescript
* const decoded = abiFunctionInstance.decodeResult(rawTransactionOutput);
* console.log('Decoded Output:', decoded);
* ```
*/
public decodeResult(
data: Hex
): DecodeFunctionResultReturnType<TAbi, TFunctionName> {
try {
const result = decodeFunctionResult({
abi: [this.abiFunction],
data: data.toString() as ViemHex
});
return result as DecodeFunctionResultReturnType<
TAbi,
TFunctionName
>;
} catch (error) {
throw new InvalidAbiDataToEncodeOrDecode(
'ABIFunction.decodeResult',
'Decoding failed: Data must be a valid hex string encoding a compliant ABI type.',
{ data },
error
);
}
}
/**
* Decodes a function output returning an array of values.
* @param {Hex} data The data to be decoded
* @returns {unknown[]} The decoded data as array of values
*/
public decodeOutputAsArray(data: Hex): unknown[] {
const resultDecoded = this.decodeResult(data);
if (this.abiFunction.outputs.length > 1) {
return this.parseObjectValues(resultDecoded as object);
} else if (
this.abiFunction.outputs.length === 1 &&
this.abiFunction.outputs[0].type === 'tuple'
) {
return [this.parseObjectValues(resultDecoded as object)];
}
return [resultDecoded];
}
}
export { ABIFunction };
Выполнить команду
Для локальной разработки. Не используйте в интернете!