UNPKG

@hiero-ledger/sdk

Version:
1,361 lines (1,205 loc) 31.2 kB
// SPDX-License-Identifier: Apache-2.0 import { keccak256 } from "../cryptography/keccak.js"; import * as hex from "../encoding/hex.js"; import * as utf8 from "../encoding/utf8.js"; /** * @enum {number} */ export const ArgumentType = { uint8: 0, int8: 1, uint16: 2, int16: 3, uint24: 4, int24: 5, uint32: 6, int32: 7, uint40: 8, int40: 9, uint48: 10, int48: 11, uint56: 12, int56: 13, uint64: 14, int64: 15, uint72: 16, int72: 17, uint80: 18, int80: 19, uint88: 20, int88: 21, uint96: 22, int96: 23, uint104: 24, int104: 25, uint112: 26, int112: 27, uint120: 28, int120: 29, uint128: 30, int128: 31, uint136: 32, int136: 33, uint144: 34, int144: 35, uint152: 36, int152: 37, uint160: 38, int160: 39, uint168: 40, int168: 41, uint176: 42, int176: 43, uint184: 44, int184: 45, uint192: 46, int192: 47, uint200: 48, int200: 49, uint208: 50, int208: 51, uint216: 52, int216: 53, uint224: 54, int224: 55, uint232: 56, int232: 57, uint240: 58, int240: 59, uint248: 60, int248: 61, uint256: 62, int256: 63, string: 64, bool: 65, bytes: 66, bytes32: 67, address: 68, func: 69, }; /** * @typedef {object} Argument * @property {boolean} dynamic * @property {Uint8Array} value */ /** * @typedef {object} SolidityType * @property {ArgumentType} ty * @property {boolean} array */ /** * Class to help construct function selectors for Hedera smart contract function calls. * Function selectors are the first 4 bytes of the Keccak-256 hash of the function's signature. * * This class provides methods to build function signatures by adding parameters of various Solidity types. * It supports all standard Solidity parameter types and their array variants. */ export default class ContractFunctionSelector { /** * @param {string} [name] */ constructor(name) { /** * @type {?string} */ this.name = null; /** * @type {string} */ this._params = ""; /** * @type {SolidityType[]} */ this._paramTypes = []; if (name != null) { this._name = name; } } /** * @returns {ContractFunctionSelector} */ addString() { return this._addParam({ ty: ArgumentType.string, array: false }); } /** * @returns {ContractFunctionSelector} */ addStringArray() { return this._addParam({ ty: ArgumentType.string, array: true }); } /** * @returns {ContractFunctionSelector} */ addBytes() { return this._addParam({ ty: ArgumentType.bytes, array: false }); } /** * @returns {ContractFunctionSelector} */ addBytes32() { return this._addParam({ ty: ArgumentType.bytes32, array: false }); } /** * @returns {ContractFunctionSelector} */ addBytesArray() { return this._addParam({ ty: ArgumentType.bytes, array: true }); } /** * @returns {ContractFunctionSelector} */ addBytes32Array() { return this._addParam({ ty: ArgumentType.bytes32, array: true }); } /** * @returns {ContractFunctionSelector} */ addInt8() { return this._addParam({ ty: ArgumentType.int8, array: false }); } /** * @returns {ContractFunctionSelector} */ addUint8() { return this._addParam({ ty: ArgumentType.uint8, array: false }); } /** * @returns {ContractFunctionSelector} */ addInt16() { return this._addParam({ ty: ArgumentType.int16, array: false }); } /** * @returns {ContractFunctionSelector} */ addUint16() { return this._addParam({ ty: ArgumentType.uint16, array: false }); } /** * @returns {ContractFunctionSelector} */ addInt24() { return this._addParam({ ty: ArgumentType.int24, array: false }); } /** * @returns {ContractFunctionSelector} */ addUint24() { return this._addParam({ ty: ArgumentType.uint24, array: false }); } /** * @returns {ContractFunctionSelector} */ addInt32() { return this._addParam({ ty: ArgumentType.int32, array: false }); } /** * @returns {ContractFunctionSelector} */ addUint32() { return this._addParam({ ty: ArgumentType.uint32, array: false }); } /** * @returns {ContractFunctionSelector} */ addInt40() { return this._addParam({ ty: ArgumentType.int40, array: false }); } /** * @returns {ContractFunctionSelector} */ addUint40() { return this._addParam({ ty: ArgumentType.uint40, array: false }); } /** * @returns {ContractFunctionSelector} */ addInt48() { return this._addParam({ ty: ArgumentType.int48, array: false }); } /** * @returns {ContractFunctionSelector} */ addUint48() { return this._addParam({ ty: ArgumentType.uint48, array: false }); } /** * @returns {ContractFunctionSelector} */ addInt56() { return this._addParam({ ty: ArgumentType.int56, array: false }); } /** * @returns {ContractFunctionSelector} */ addUint56() { return this._addParam({ ty: ArgumentType.uint56, array: false }); } /** * @returns {ContractFunctionSelector} */ addInt64() { return this._addParam({ ty: ArgumentType.int64, array: false }); } /** * @returns {ContractFunctionSelector} */ addUint64() { return this._addParam({ ty: ArgumentType.uint64, array: false }); } /** * @returns {ContractFunctionSelector} */ addInt72() { return this._addParam({ ty: ArgumentType.int72, array: false }); } /** * @returns {ContractFunctionSelector} */ addUint72() { return this._addParam({ ty: ArgumentType.uint72, array: false }); } /** * @returns {ContractFunctionSelector} */ addInt80() { return this._addParam({ ty: ArgumentType.int80, array: false }); } /** * @returns {ContractFunctionSelector} */ addUint80() { return this._addParam({ ty: ArgumentType.uint80, array: false }); } /** * @returns {ContractFunctionSelector} */ addInt88() { return this._addParam({ ty: ArgumentType.int88, array: false }); } /** * @returns {ContractFunctionSelector} */ addUint88() { return this._addParam({ ty: ArgumentType.uint88, array: false }); } /** * @returns {ContractFunctionSelector} */ addInt96() { return this._addParam({ ty: ArgumentType.int96, array: false }); } /** * @returns {ContractFunctionSelector} */ addUint96() { return this._addParam({ ty: ArgumentType.uint96, array: false }); } /** * @returns {ContractFunctionSelector} */ addInt104() { return this._addParam({ ty: ArgumentType.int104, array: false }); } /** * @returns {ContractFunctionSelector} */ addUint104() { return this._addParam({ ty: ArgumentType.uint104, array: false }); } /** * @returns {ContractFunctionSelector} */ addInt112() { return this._addParam({ ty: ArgumentType.int112, array: false }); } /** * @returns {ContractFunctionSelector} */ addUint112() { return this._addParam({ ty: ArgumentType.uint112, array: false }); } /** * @returns {ContractFunctionSelector} */ addInt120() { return this._addParam({ ty: ArgumentType.int120, array: false }); } /** * @returns {ContractFunctionSelector} */ addUint120() { return this._addParam({ ty: ArgumentType.uint120, array: false }); } /** * @returns {ContractFunctionSelector} */ addInt128() { return this._addParam({ ty: ArgumentType.int128, array: false }); } /** * @returns {ContractFunctionSelector} */ addUint128() { return this._addParam({ ty: ArgumentType.uint128, array: false }); } /** * @returns {ContractFunctionSelector} */ addInt136() { return this._addParam({ ty: ArgumentType.int136, array: false }); } /** * @returns {ContractFunctionSelector} */ addUint136() { return this._addParam({ ty: ArgumentType.uint136, array: false }); } /** * @returns {ContractFunctionSelector} */ addInt144() { return this._addParam({ ty: ArgumentType.int144, array: false }); } /** * @returns {ContractFunctionSelector} */ addUint144() { return this._addParam({ ty: ArgumentType.uint144, array: false }); } /** * @returns {ContractFunctionSelector} */ addInt152() { return this._addParam({ ty: ArgumentType.int152, array: false }); } /** * @returns {ContractFunctionSelector} */ addUint152() { return this._addParam({ ty: ArgumentType.uint152, array: false }); } /** * @returns {ContractFunctionSelector} */ addInt160() { return this._addParam({ ty: ArgumentType.int160, array: false }); } /** * @returns {ContractFunctionSelector} */ addUint160() { return this._addParam({ ty: ArgumentType.uint160, array: false }); } /** * @returns {ContractFunctionSelector} */ addInt168() { return this._addParam({ ty: ArgumentType.int168, array: false }); } /** * @returns {ContractFunctionSelector} */ addUint168() { return this._addParam({ ty: ArgumentType.uint168, array: false }); } /** * @returns {ContractFunctionSelector} */ addInt176() { return this._addParam({ ty: ArgumentType.int176, array: false }); } /** * @returns {ContractFunctionSelector} */ addUint176() { return this._addParam({ ty: ArgumentType.uint176, array: false }); } /** * @returns {ContractFunctionSelector} */ addInt184() { return this._addParam({ ty: ArgumentType.int184, array: false }); } /** * @returns {ContractFunctionSelector} */ addUint184() { return this._addParam({ ty: ArgumentType.uint184, array: false }); } /** * @returns {ContractFunctionSelector} */ addInt192() { return this._addParam({ ty: ArgumentType.int192, array: false }); } /** * @returns {ContractFunctionSelector} */ addUint192() { return this._addParam({ ty: ArgumentType.uint192, array: false }); } /** * @returns {ContractFunctionSelector} */ addInt200() { return this._addParam({ ty: ArgumentType.int200, array: false }); } /** * @returns {ContractFunctionSelector} */ addUint200() { return this._addParam({ ty: ArgumentType.uint200, array: false }); } /** * @returns {ContractFunctionSelector} */ addInt208() { return this._addParam({ ty: ArgumentType.int208, array: false }); } /** * @returns {ContractFunctionSelector} */ addUint208() { return this._addParam({ ty: ArgumentType.uint208, array: false }); } /** * @returns {ContractFunctionSelector} */ addInt216() { return this._addParam({ ty: ArgumentType.int216, array: false }); } /** * @returns {ContractFunctionSelector} */ addUint216() { return this._addParam({ ty: ArgumentType.uint216, array: false }); } /** * @returns {ContractFunctionSelector} */ addInt224() { return this._addParam({ ty: ArgumentType.int224, array: false }); } /** * @returns {ContractFunctionSelector} */ addUint224() { return this._addParam({ ty: ArgumentType.uint224, array: false }); } /** * @returns {ContractFunctionSelector} */ addInt232() { return this._addParam({ ty: ArgumentType.int232, array: false }); } /** * @returns {ContractFunctionSelector} */ addUint232() { return this._addParam({ ty: ArgumentType.uint232, array: false }); } /** * @returns {ContractFunctionSelector} */ addInt240() { return this._addParam({ ty: ArgumentType.int240, array: false }); } /** * @returns {ContractFunctionSelector} */ addUint240() { return this._addParam({ ty: ArgumentType.uint240, array: false }); } /** * @returns {ContractFunctionSelector} */ addInt248() { return this._addParam({ ty: ArgumentType.int248, array: false }); } /** * @returns {ContractFunctionSelector} */ addUint248() { return this._addParam({ ty: ArgumentType.uint248, array: false }); } /** * @returns {ContractFunctionSelector} */ addInt256() { return this._addParam({ ty: ArgumentType.int256, array: false }); } /** * @returns {ContractFunctionSelector} */ addUint256() { return this._addParam({ ty: ArgumentType.uint256, array: false }); } /** * @returns {ContractFunctionSelector} */ addInt8Array() { return this._addParam({ ty: ArgumentType.int8, array: true }); } /** * @returns {ContractFunctionSelector} */ addUint8Array() { return this._addParam({ ty: ArgumentType.uint8, array: true }); } /** * @returns {ContractFunctionSelector} */ addInt16Array() { return this._addParam({ ty: ArgumentType.int16, array: true }); } /** * @returns {ContractFunctionSelector} */ addUint16Array() { return this._addParam({ ty: ArgumentType.uint16, array: true }); } /** * @returns {ContractFunctionSelector} */ addInt24Array() { return this._addParam({ ty: ArgumentType.int24, array: true }); } /** * @returns {ContractFunctionSelector} */ addUint24Array() { return this._addParam({ ty: ArgumentType.uint24, array: true }); } /** * @returns {ContractFunctionSelector} */ addInt32Array() { return this._addParam({ ty: ArgumentType.int32, array: true }); } /** * @returns {ContractFunctionSelector} */ addUint32Array() { return this._addParam({ ty: ArgumentType.uint32, array: true }); } /** * @returns {ContractFunctionSelector} */ addInt40Array() { return this._addParam({ ty: ArgumentType.int40, array: true }); } /** * @returns {ContractFunctionSelector} */ addUint40Array() { return this._addParam({ ty: ArgumentType.uint40, array: true }); } /** * @returns {ContractFunctionSelector} */ addInt48Array() { return this._addParam({ ty: ArgumentType.int48, array: true }); } /** * @returns {ContractFunctionSelector} */ addUint48Array() { return this._addParam({ ty: ArgumentType.uint48, array: true }); } /** * @returns {ContractFunctionSelector} */ addInt56Array() { return this._addParam({ ty: ArgumentType.int56, array: true }); } /** * @returns {ContractFunctionSelector} */ addUint56Array() { return this._addParam({ ty: ArgumentType.uint56, array: true }); } /** * @returns {ContractFunctionSelector} */ addInt64Array() { return this._addParam({ ty: ArgumentType.int64, array: true }); } /** * @returns {ContractFunctionSelector} */ addUint64Array() { return this._addParam({ ty: ArgumentType.uint64, array: true }); } /** * @returns {ContractFunctionSelector} */ addInt72Array() { return this._addParam({ ty: ArgumentType.int72, array: true }); } /** * @returns {ContractFunctionSelector} */ addUint72Array() { return this._addParam({ ty: ArgumentType.uint72, array: true }); } /** * @returns {ContractFunctionSelector} */ addInt80Array() { return this._addParam({ ty: ArgumentType.int80, array: true }); } /** * @returns {ContractFunctionSelector} */ addUint80Array() { return this._addParam({ ty: ArgumentType.uint80, array: true }); } /** * @returns {ContractFunctionSelector} */ addInt88Array() { return this._addParam({ ty: ArgumentType.int88, array: true }); } /** * @returns {ContractFunctionSelector} */ addUint88Array() { return this._addParam({ ty: ArgumentType.uint88, array: true }); } /** * @returns {ContractFunctionSelector} */ addInt96Array() { return this._addParam({ ty: ArgumentType.int96, array: true }); } /** * @returns {ContractFunctionSelector} */ addUint96Array() { return this._addParam({ ty: ArgumentType.uint96, array: true }); } /** * @returns {ContractFunctionSelector} */ addInt104Array() { return this._addParam({ ty: ArgumentType.int104, array: true }); } /** * @returns {ContractFunctionSelector} */ addUint104Array() { return this._addParam({ ty: ArgumentType.uint104, array: true }); } /** * @returns {ContractFunctionSelector} */ addInt112Array() { return this._addParam({ ty: ArgumentType.int112, array: true }); } /** * @returns {ContractFunctionSelector} */ addUint112Array() { return this._addParam({ ty: ArgumentType.uint112, array: true }); } /** * @returns {ContractFunctionSelector} */ addInt120Array() { return this._addParam({ ty: ArgumentType.int120, array: true }); } /** * @returns {ContractFunctionSelector} */ addUint120Array() { return this._addParam({ ty: ArgumentType.uint120, array: true }); } /** * @returns {ContractFunctionSelector} */ addInt128Array() { return this._addParam({ ty: ArgumentType.int128, array: true }); } /** * @returns {ContractFunctionSelector} */ addUint128Array() { return this._addParam({ ty: ArgumentType.uint128, array: true }); } /** * @returns {ContractFunctionSelector} */ addInt136Array() { return this._addParam({ ty: ArgumentType.int136, array: true }); } /** * @returns {ContractFunctionSelector} */ addUint136Array() { return this._addParam({ ty: ArgumentType.uint136, array: true }); } /** * @returns {ContractFunctionSelector} */ addInt144Array() { return this._addParam({ ty: ArgumentType.int144, array: true }); } /** * @returns {ContractFunctionSelector} */ addUint144Array() { return this._addParam({ ty: ArgumentType.uint144, array: true }); } /** * @returns {ContractFunctionSelector} */ addInt152Array() { return this._addParam({ ty: ArgumentType.int152, array: true }); } /** * @returns {ContractFunctionSelector} */ addUint152Array() { return this._addParam({ ty: ArgumentType.uint152, array: true }); } /** * @returns {ContractFunctionSelector} */ addInt160Array() { return this._addParam({ ty: ArgumentType.int160, array: true }); } /** * @returns {ContractFunctionSelector} */ addUint160Array() { return this._addParam({ ty: ArgumentType.uint160, array: true }); } /** * @returns {ContractFunctionSelector} */ addInt168Array() { return this._addParam({ ty: ArgumentType.int168, array: true }); } /** * @returns {ContractFunctionSelector} */ addUint168Array() { return this._addParam({ ty: ArgumentType.uint168, array: true }); } /** * @returns {ContractFunctionSelector} */ addInt176Array() { return this._addParam({ ty: ArgumentType.int176, array: true }); } /** * @returns {ContractFunctionSelector} */ addUint176Array() { return this._addParam({ ty: ArgumentType.uint176, array: true }); } /** * @returns {ContractFunctionSelector} */ addInt184Array() { return this._addParam({ ty: ArgumentType.int184, array: true }); } /** * @returns {ContractFunctionSelector} */ addUint184Array() { return this._addParam({ ty: ArgumentType.uint184, array: true }); } /** * @returns {ContractFunctionSelector} */ addInt192Array() { return this._addParam({ ty: ArgumentType.int192, array: true }); } /** * @returns {ContractFunctionSelector} */ addUint192Array() { return this._addParam({ ty: ArgumentType.uint192, array: true }); } /** * @returns {ContractFunctionSelector} */ addInt200Array() { return this._addParam({ ty: ArgumentType.int200, array: true }); } /** * @returns {ContractFunctionSelector} */ addUint200Array() { return this._addParam({ ty: ArgumentType.uint200, array: true }); } /** * @returns {ContractFunctionSelector} */ addInt208Array() { return this._addParam({ ty: ArgumentType.int208, array: true }); } /** * @returns {ContractFunctionSelector} */ addUint208Array() { return this._addParam({ ty: ArgumentType.uint208, array: true }); } /** * @returns {ContractFunctionSelector} */ addInt216Array() { return this._addParam({ ty: ArgumentType.int216, array: true }); } /** * @returns {ContractFunctionSelector} */ addUint216Array() { return this._addParam({ ty: ArgumentType.uint216, array: true }); } /** * @returns {ContractFunctionSelector} */ addInt224Array() { return this._addParam({ ty: ArgumentType.int224, array: true }); } /** * @returns {ContractFunctionSelector} */ addUint224Array() { return this._addParam({ ty: ArgumentType.uint224, array: true }); } /** * @returns {ContractFunctionSelector} */ addInt232Array() { return this._addParam({ ty: ArgumentType.int232, array: true }); } /** * @returns {ContractFunctionSelector} */ addUint232Array() { return this._addParam({ ty: ArgumentType.uint232, array: true }); } /** * @returns {ContractFunctionSelector} */ addInt240Array() { return this._addParam({ ty: ArgumentType.int240, array: true }); } /** * @returns {ContractFunctionSelector} */ addUint240Array() { return this._addParam({ ty: ArgumentType.uint240, array: true }); } /** * @returns {ContractFunctionSelector} */ addInt248Array() { return this._addParam({ ty: ArgumentType.int248, array: true }); } /** * @returns {ContractFunctionSelector} */ addUint248Array() { return this._addParam({ ty: ArgumentType.uint248, array: true }); } /** * @returns {ContractFunctionSelector} */ addInt256Array() { return this._addParam({ ty: ArgumentType.int256, array: true }); } /** * @returns {ContractFunctionSelector} */ addUint256Array() { return this._addParam({ ty: ArgumentType.uint256, array: true }); } /** * @returns {ContractFunctionSelector} */ addBool() { return this._addParam({ ty: ArgumentType.bool, array: false }); } /** * @returns {ContractFunctionSelector} */ addAddress() { return this._addParam({ ty: ArgumentType.address, array: false }); } /** * @returns {ContractFunctionSelector} */ addAddressArray() { return this._addParam({ ty: ArgumentType.address, array: true }); } /** * @returns {ContractFunctionSelector} */ addFunction() { return this._addParam({ ty: ArgumentType.func, array: false }); } /** * @param {SolidityType} ty * @returns {ContractFunctionSelector} */ _addParam(ty) { if (this._paramTypes.length > 0) { this._params += ","; } this._params += solidityTypeToString(ty); this._paramTypes.push(ty); return this; } /** * @param {string} [name] * @returns {Uint8Array} */ _build(name) { if (name != null) { this._name = name; } else if (this._name == null) { throw new Error("`name` required for ContractFunctionSelector"); } const func = hex.encode(utf8.encode(this.toString())); return hex.decode(keccak256(`0x${func}`)).slice(0, 4); } /** * @returns {string} */ toString() { return `${this._name != null ? this._name.toString() : ""}(${ this._params })`; } } /** * @param {SolidityType} ty * @returns {string} */ export function solidityTypeToString(ty) { let s = ""; switch (ty.ty) { case ArgumentType.uint8: s = "uint8"; break; case ArgumentType.int8: s = "int8"; break; case ArgumentType.uint16: s = "uint16"; break; case ArgumentType.int16: s = "int16"; break; case ArgumentType.uint24: s = "uint24"; break; case ArgumentType.int24: s = "int24"; break; case ArgumentType.uint32: s = "uint32"; break; case ArgumentType.int32: s = "int32"; break; case ArgumentType.uint40: s = "uint40"; break; case ArgumentType.int40: s = "int40"; break; case ArgumentType.uint48: s = "uint48"; break; case ArgumentType.int48: s = "int48"; break; case ArgumentType.uint56: s = "uint56"; break; case ArgumentType.int56: s = "int56"; break; case ArgumentType.uint64: s = "uint64"; break; case ArgumentType.int64: s = "int64"; break; case ArgumentType.uint72: s = "uint72"; break; case ArgumentType.int72: s = "int72"; break; case ArgumentType.uint80: s = "uint80"; break; case ArgumentType.int80: s = "int80"; break; case ArgumentType.uint88: s = "uint88"; break; case ArgumentType.int88: s = "int88"; break; case ArgumentType.uint96: s = "uint96"; break; case ArgumentType.int96: s = "int96"; break; case ArgumentType.uint104: s = "uint104"; break; case ArgumentType.int104: s = "int104"; break; case ArgumentType.uint112: s = "uint112"; break; case ArgumentType.int112: s = "int112"; break; case ArgumentType.uint120: s = "uint120"; break; case ArgumentType.int120: s = "int120"; break; case ArgumentType.uint128: s = "uint128"; break; case ArgumentType.int128: s = "int128"; break; case ArgumentType.uint136: s = "uint136"; break; case ArgumentType.int136: s = "int136"; break; case ArgumentType.uint144: s = "uint144"; break; case ArgumentType.int144: s = "int144"; break; case ArgumentType.uint152: s = "uint152"; break; case ArgumentType.int152: s = "int152"; break; case ArgumentType.uint160: s = "uint160"; break; case ArgumentType.int160: s = "int160"; break; case ArgumentType.uint168: s = "uint168"; break; case ArgumentType.int168: s = "int168"; break; case ArgumentType.uint176: s = "uint176"; break; case ArgumentType.int176: s = "int176"; break; case ArgumentType.uint184: s = "uint184"; break; case ArgumentType.int184: s = "int184"; break; case ArgumentType.uint192: s = "uint192"; break; case ArgumentType.int192: s = "int192"; break; case ArgumentType.uint200: s = "uint200"; break; case ArgumentType.int200: s = "int200"; break; case ArgumentType.uint208: s = "uint208"; break; case ArgumentType.int208: s = "int208"; break; case ArgumentType.uint216: s = "uint216"; break; case ArgumentType.int216: s = "int216"; break; case ArgumentType.uint224: s = "uint224"; break; case ArgumentType.int224: s = "int224"; break; case ArgumentType.uint232: s = "uint232"; break; case ArgumentType.int232: s = "int232"; break; case ArgumentType.uint240: s = "uint240"; break; case ArgumentType.int240: s = "int240"; break; case ArgumentType.uint248: s = "uint248"; break; case ArgumentType.int248: s = "int248"; break; case ArgumentType.uint256: s = "uint256"; break; case ArgumentType.int256: s = "int256"; break; case ArgumentType.string: s = "string"; break; case ArgumentType.bool: s = "bool"; break; case ArgumentType.bytes: s = "bytes"; break; case ArgumentType.bytes32: s = "bytes32"; break; case ArgumentType.address: s = "address"; break; case ArgumentType.func: s = "function"; break; default: s = ""; break; } if (ty.array) { s += "[]"; } return s; }