@hashgraph/sdk
Version:
845 lines (753 loc) • 25.9 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _ContractLogInfo = _interopRequireDefault(require("./ContractLogInfo.cjs"));
var _ContractId = _interopRequireDefault(require("./ContractId.cjs"));
var _AccountId = _interopRequireDefault(require("../account/AccountId.cjs"));
var _bignumber = _interopRequireDefault(require("bignumber.js"));
var hex = _interopRequireWildcard(require("../encoding/hex.cjs"));
var utf8 = _interopRequireWildcard(require("../encoding/utf8.cjs"));
var util = _interopRequireWildcard(require("../util.cjs"));
var _abi = require("@ethersproject/abi");
var _long = _interopRequireDefault(require("long"));
var _ContractNonceInfo = _interopRequireDefault(require("./ContractNonceInfo.cjs"));
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
// SPDX-License-Identifier: Apache-2.0
// eslint-disable-next-line @typescript-eslint/no-unused-vars
/**
* @typedef {import("./ContractStateChange.js").default} ContractStateChange
*/
/**
* @namespace proto
* @typedef {import("@hashgraph/proto").proto.IContractFunctionResult} HieroProto.proto.IContractFunctionResult
* @typedef {import("@hashgraph/proto").proto.IContractID} HieroProto.proto.IContractID
*/
/**
* The result returned by a call to a smart contract function. This is part of the response to
* a ContractCallLocal query, and is in the record for a ContractCall or ContractCreateInstance
* transaction. The ContractCreateInstance transaction record has the results of the call to
* the constructor.
*/
class ContractFunctionResult {
/**
* Constructor isn't part of the stable API
*
* @param {object} result
* @param {boolean} result._createResult
* @param {?ContractId} result.contractId
* @param {?string} result.errorMessage
* @param {Uint8Array} result.bloom
* @param {Long} result.gasUsed
* @param {ContractLogInfo[]} result.logs
* @param {ContractId[]} result.createdContractIds
* @param {Uint8Array | null} result.evmAddress
* @param {Uint8Array} result.bytes
* @param {Long} result.gas
* @param {Long} result.amount
* @param {Uint8Array} result.functionParameters
* @param {?AccountId} result.senderAccountId
* @param {ContractStateChange[]} result.stateChanges
* @param {ContractNonceInfo[]} result.contractNonces
* @param {Long | null} result.signerNonce
*/
constructor(result) {
/**
* Determines if this result came from `record.contractCreateResult` if true
* or `record.contractCallResult` if false
*/
this._createResult = result._createResult;
/**
* The smart contract instance whose function was called.
*/
this.contractId = result.contractId;
this.bytes = result.bytes;
/**
* Message In case there was an error during smart contract execution.
*/
this.errorMessage = result.errorMessage;
/**
* Bloom filter for record
*/
this.bloom = result.bloom;
/**
* Units of gas used to execute contract.
*/
this.gasUsed = result.gasUsed;
/**
* The log info for events returned by the function.
*/
this.logs = result.logs;
/**
* @deprecated the list of smart contracts that were created by the function call.
*
* The created ids will now _also_ be externalized through internal transaction
* records, where each record has its alias field populated with the new contract's
* EVM address. (This is needed for contracts created with CREATE2, since
* there is no longer a simple relationship between the new contract's 0.0.X id
* and its Solidity address.)
*/
// eslint-disable-next-line deprecation/deprecation
this.createdContractIds = result.createdContractIds;
this.evmAddress = result.evmAddress;
/**
* @deprecated - Use mirror node for contract traceability instead
*/
// eslint-disable-next-line deprecation/deprecation
this.stateChanges = result.stateChanges;
/**
* The amount of gas available for the call, aka the gasLimit.
*/
this.gas = result.gas;
/**
* Number of tinybars sent (the function must be payable if this is nonzero).
*/
this.amount = result.amount;
/**
* The parameters passed into the contract call.
*/
this.functionParameters = result.functionParameters;
/**
* The account that is the "sender." If not present it is the accountId from the transactionId.
*
* This field should only be populated when the paired TransactionBody in the record stream is not a
* ContractCreateTransactionBody or a ContractCallTransactionBody.
*/
this.senderAccountId = result.senderAccountId;
/**
* A list of updated contract account nonces containing the new nonce value for each contract account.
* This is always empty in a ContractCallLocalResponse#ContractFunctionResult message, since no internal creations can happen in a static EVM call.
*/
this.contractNonces = result.contractNonces;
/**
* If not null this field specifies what the value of the signer account nonce is post transaction execution.
* For transactions that don't update the signer nonce (like HAPI ContractCall and ContractCreate transactions) this field should be null.
*/
this.signerNonce = result.signerNonce;
}
/**
* @param {HieroProto.proto.IContractFunctionResult} result
* @param {boolean} _createResult
* @returns {ContractFunctionResult}
*/
static _fromProtobuf(result, _createResult) {
const contractId = /** @type {HieroProto.proto.IContractID | null} */
result.contractID;
const gasUsed = /** @type {Long} */result.gasUsed;
const gas = /** @type {Long} */result.gas ? result.gas : -1;
const amount = /** @type {Long} */result.amount ? result.amount : -1;
return new ContractFunctionResult({
_createResult,
bytes: (/** @type {Uint8Array} */result.contractCallResult),
contractId: contractId != null ? _ContractId.default._fromProtobuf(contractId) : null,
errorMessage: result.errorMessage != null ? result.errorMessage : null,
bloom: (/** @type {Uint8Array} */result.bloom),
gasUsed: gasUsed instanceof _long.default ? gasUsed : _long.default.fromValue(gasUsed),
logs: (result.logInfo != null ? result.logInfo : []).map(info => _ContractLogInfo.default._fromProtobuf(info)),
createdContractIds: (result.createdContractIDs != null ? result.createdContractIDs : []).map(contractId => _ContractId.default._fromProtobuf(contractId)),
evmAddress: result.evmAddress != null && Object.hasOwn(result.evmAddress, "value") && result.evmAddress.value != null ? result.evmAddress.value : null,
stateChanges: [],
gas: gas instanceof _long.default ? gas : _long.default.fromValue(gas),
amount: amount instanceof _long.default ? amount : _long.default.fromValue(amount),
functionParameters: (/** @type {Uint8Array} */
result.functionParameters),
senderAccountId: result.senderId != null ? _AccountId.default._fromProtobuf(result.senderId) : null,
contractNonces: (result.contractNonces != null ? result.contractNonces : []).map(contractNonce => _ContractNonceInfo.default._fromProtobuf(contractNonce)),
signerNonce: result.signerNonce != null ? Object.hasOwn(result.signerNonce, "value") ? result.signerNonce.value || null : null : null
});
}
/**
* @returns {Uint8Array}
*/
asBytes() {
return this.bytes;
}
/**
* @param {number} [index]
* @returns {string}
*/
getString(index) {
return utf8.decode(this.getBytes(index));
}
/**
* @private
* @param {number} [index]
* @returns {Uint8Array}
*/
getBytes(index) {
// Len should never be larger than Number.MAX
// index * 32 is the position of the lenth
// (index + 1) * 32 onward to (index + 1) * 32 + len will be the elements of the array
// Arrays in solidity cannot be longer than 1024:
// https://solidity.readthedocs.io/en/v0.4.21/introduction-to-smart-contracts.html
const offset = this.getInt32(index);
const len = util.safeView(this.bytes).getInt32(offset + 28);
return this.bytes.subarray(offset + 32, offset + 32 + len);
}
/**
* @param {number} [index]
* @returns {Uint8Array}
*/
getBytes32(index) {
return this.bytes.subarray((index != null ? index : 0) * 32, (index != null ? index : 0) * 32 + 32);
}
/**
* @param {number} [index]
* @returns {boolean}
*/
getBool(index) {
return this.bytes[(index != null ? index : 0) * 32 + 31] !== 0;
}
/**
* @param {number} [index]
* @returns {number}
*/
getInt8(index) {
const position = (index != null ? index : 0) * 32 + 31;
return util.safeView(this.bytes).getInt8(position);
}
/**
* @param {number} [index]
* @returns {number}
*/
getUint8(index) {
return this.bytes[(index != null ? index : 0) * 32 + 31];
}
/**
* @param {number} [index]
* @returns {number}
*/
getInt16(index) {
// .getInt32() interprets as big-endian
// Using DataView instead of Uint32Array because the latter interprets
// using platform endianness which is little-endian on x86
const position = (index != null ? index : 0) * 32 + 28;
return util.safeView(this.bytes).getInt32(position);
}
/**
* @param {number} [index]
* @returns {number}
*/
getUint16(index) {
// .getUint32() interprets as big-endian
// Using DataView instead of Uint32Array because the latter interprets
// using platform endianness which is little-endian on x86
const position = (index != null ? index : 0) * 32 + 28;
return util.safeView(this.bytes).getUint32(position);
}
/**
* @param {number} [index]
* @returns {number}
*/
getInt24(index) {
// .getInt32() interprets as big-endian
// Using DataView instead of Uint32Array because the latter interprets
// using platform endianness which is little-endian on x86
const position = (index != null ? index : 0) * 32 + 28;
return util.safeView(this.bytes).getInt32(position);
}
/**
* @param {number} [index]
* @returns {number}
*/
getUint24(index) {
// .getUint32() interprets as big-endian
// Using DataView instead of Uint32Array because the latter interprets
// using platform endianness which is little-endian on x86
const position = (index != null ? index : 0) * 32 + 28;
return util.safeView(this.bytes).getUint32(position);
}
/**
* @param {number} [index]
* @returns {number}
*/
getInt32(index) {
// .getInt32() interprets as big-endian
// Using DataView instead of Uint32Array because the latter interprets
// using platform endianness which is little-endian on x86
const position = (index != null ? index : 0) * 32 + 28;
return util.safeView(this.bytes).getInt32(position);
}
/**
* @param {number} [index]
* @returns {number}
*/
getUint32(index) {
// .getUint32() interprets as big-endian
// Using DataView instead of Uint32Array because the latter interprets
// using platform endianness which is little-endian on x86
const position = (index != null ? index : 0) * 32 + 28;
return util.safeView(this.bytes).getUint32(position);
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getInt40(index) {
const result = _abi.defaultAbiCoder.decode(["int40"], this._getBytes32(index != null ? index : 0));
return new _bignumber.default(result.toString());
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getUint40(index) {
return new _bignumber.default(hex.encode(this._getBytes32(index).subarray(27, 32)), 16);
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getInt48(index) {
const result = _abi.defaultAbiCoder.decode(["int48"], this._getBytes32(index != null ? index : 0));
return new _bignumber.default(result.toString());
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getUint48(index) {
return new _bignumber.default(hex.encode(this._getBytes32(index).subarray(26, 32)), 16);
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getInt56(index) {
const result = _abi.defaultAbiCoder.decode(["int56"], this._getBytes32(index != null ? index : 0));
return new _bignumber.default(result.toString());
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getUint56(index) {
return new _bignumber.default(hex.encode(this._getBytes32(index).subarray(25, 32)), 16);
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getInt64(index) {
const result = _abi.defaultAbiCoder.decode(["int64"], this._getBytes32(index != null ? index : 0));
return new _bignumber.default(result.toString());
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getUint64(index) {
return new _bignumber.default(hex.encode(this._getBytes32(index).subarray(24, 32)), 16);
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getInt72(index) {
const result = _abi.defaultAbiCoder.decode(["int72"], this._getBytes32(index != null ? index : 0));
return new _bignumber.default(result.toString());
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getUint72(index) {
return new _bignumber.default(hex.encode(this._getBytes32(index).subarray(23, 32)), 16);
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getInt80(index) {
const result = _abi.defaultAbiCoder.decode(["int80"], this._getBytes32(index != null ? index : 0));
return new _bignumber.default(result.toString());
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getUint80(index) {
return new _bignumber.default(hex.encode(this._getBytes32(index).subarray(22, 32)), 16);
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getInt88(index) {
const result = _abi.defaultAbiCoder.decode(["int88"], this._getBytes32(index != null ? index : 0));
return new _bignumber.default(result.toString());
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getUint88(index) {
return new _bignumber.default(hex.encode(this._getBytes32(index).subarray(21, 32)), 16);
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getInt96(index) {
const result = _abi.defaultAbiCoder.decode(["int96"], this._getBytes32(index != null ? index : 0));
return new _bignumber.default(result.toString());
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getUint96(index) {
return new _bignumber.default(hex.encode(this._getBytes32(index).subarray(20, 32)), 16);
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getInt104(index) {
const result = _abi.defaultAbiCoder.decode(["int104"], this._getBytes32(index != null ? index : 0));
return new _bignumber.default(result.toString());
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getUint104(index) {
return new _bignumber.default(hex.encode(this._getBytes32(index).subarray(19, 32)), 16);
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getInt112(index) {
const result = _abi.defaultAbiCoder.decode(["int112"], this._getBytes32(index != null ? index : 0));
return new _bignumber.default(result.toString());
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getUint112(index) {
return new _bignumber.default(hex.encode(this._getBytes32(index).subarray(18, 32)), 16);
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getInt120(index) {
const result = _abi.defaultAbiCoder.decode(["int120"], this._getBytes32(index != null ? index : 0));
return new _bignumber.default(result.toString());
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getUint120(index) {
return new _bignumber.default(hex.encode(this._getBytes32(index).subarray(17, 32)), 16);
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getInt128(index) {
const result = _abi.defaultAbiCoder.decode(["int128"], this._getBytes32(index != null ? index : 0));
return new _bignumber.default(result.toString());
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getUint128(index) {
return new _bignumber.default(hex.encode(this._getBytes32(index).subarray(16, 32)), 16);
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getInt136(index) {
const result = _abi.defaultAbiCoder.decode(["int136"], this._getBytes32(index != null ? index : 0));
return new _bignumber.default(result.toString());
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getUint136(index) {
return new _bignumber.default(hex.encode(this._getBytes32(index).subarray(15, 32)), 16);
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getInt144(index) {
const result = _abi.defaultAbiCoder.decode(["int144"], this._getBytes32(index != null ? index : 0));
return new _bignumber.default(result.toString());
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getUint144(index) {
return new _bignumber.default(hex.encode(this._getBytes32(index).subarray(14, 32)), 16);
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getInt152(index) {
const result = _abi.defaultAbiCoder.decode(["int152"], this._getBytes32(index != null ? index : 0));
return new _bignumber.default(result.toString());
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getUint152(index) {
return new _bignumber.default(hex.encode(this._getBytes32(index).subarray(13, 32)), 16);
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getInt160(index) {
const result = _abi.defaultAbiCoder.decode(["int160"], this._getBytes32(index != null ? index : 0));
return new _bignumber.default(result.toString());
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getUint160(index) {
return new _bignumber.default(hex.encode(this._getBytes32(index).subarray(12, 32)), 16);
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getInt168(index) {
const result = _abi.defaultAbiCoder.decode(["int168"], this._getBytes32(index != null ? index : 0));
return new _bignumber.default(result.toString());
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getUint168(index) {
return new _bignumber.default(hex.encode(this._getBytes32(index).subarray(11, 32)), 16);
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getInt176(index) {
const result = _abi.defaultAbiCoder.decode(["int176"], this._getBytes32(index != null ? index : 0));
return new _bignumber.default(result.toString());
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getUint176(index) {
return new _bignumber.default(hex.encode(this._getBytes32(index).subarray(10, 32)), 16);
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getInt184(index) {
const result = _abi.defaultAbiCoder.decode(["int184"], this._getBytes32(index != null ? index : 0));
return new _bignumber.default(result.toString());
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getUint184(index) {
return new _bignumber.default(hex.encode(this._getBytes32(index).subarray(9, 32)), 16);
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getInt192(index) {
const result = _abi.defaultAbiCoder.decode(["int192"], this._getBytes32(index != null ? index : 0));
return new _bignumber.default(result.toString());
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getUint192(index) {
return new _bignumber.default(hex.encode(this._getBytes32(index).subarray(8, 32)), 16);
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getInt200(index) {
const result = _abi.defaultAbiCoder.decode(["int200"], this._getBytes32(index != null ? index : 0));
return new _bignumber.default(result.toString());
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getUint200(index) {
return new _bignumber.default(hex.encode(this._getBytes32(index).subarray(7, 32)), 16);
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getInt208(index) {
const result = _abi.defaultAbiCoder.decode(["int208"], this._getBytes32(index != null ? index : 0));
return new _bignumber.default(result.toString());
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getUint208(index) {
return new _bignumber.default(hex.encode(this._getBytes32(index).subarray(6, 32)), 16);
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getInt216(index) {
const result = _abi.defaultAbiCoder.decode(["int216"], this._getBytes32(index != null ? index : 0));
return new _bignumber.default(result.toString());
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getUint216(index) {
return new _bignumber.default(hex.encode(this._getBytes32(index).subarray(5, 32)), 16);
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getInt224(index) {
const result = _abi.defaultAbiCoder.decode(["int224"], this._getBytes32(index != null ? index : 0));
return new _bignumber.default(result.toString());
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getUint224(index) {
return new _bignumber.default(hex.encode(this._getBytes32(index).subarray(4, 32)), 16);
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getInt232(index) {
const result = _abi.defaultAbiCoder.decode(["int232"], this._getBytes32(index != null ? index : 0));
return new _bignumber.default(result.toString());
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getUint232(index) {
return new _bignumber.default(hex.encode(this._getBytes32(index).subarray(3, 32)), 16);
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getInt240(index) {
const result = _abi.defaultAbiCoder.decode(["int240"], this._getBytes32(index != null ? index : 0));
return new _bignumber.default(result.toString());
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getUint240(index) {
return new _bignumber.default(hex.encode(this._getBytes32(index).subarray(2, 32)), 16);
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getInt248(index) {
const result = _abi.defaultAbiCoder.decode(["int248"], this._getBytes32(index != null ? index : 0));
return new _bignumber.default(result.toString());
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getUint248(index) {
return new _bignumber.default(hex.encode(this._getBytes32(index).subarray(1, 32)), 16);
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getInt256(index) {
const result = _abi.defaultAbiCoder.decode(["int256"], this._getBytes32(index != null ? index : 0));
return new _bignumber.default(result.toString());
}
/**
* @param {number} [index]
* @returns {BigNumber}
*/
getUint256(index) {
return new _bignumber.default(hex.encode(this._getBytes32(index)), 16);
}
/**
* @param {number} [index]
* @returns {string}
*/
getAddress(index) {
return hex.encode(this.bytes.subarray((index != null ? index : 0) * 32 + 12, (index != null ? index : 0) * 32 + 32));
}
/**
* @description Decode the data according to the array of types, each of which may be a string or ParamType.
* @param {Array<string | ParamType>} types
* @returns {string | any}
*/
getResult(types) {
return _abi.defaultAbiCoder.decode(types, this.bytes);
}
/**
* @param {number} [index]
* @returns {Uint8Array}
*/
_getBytes32(index) {
return this.bytes.subarray((index != null ? index : 0) * 32, (index != null ? index : 0) * 32 + 32);
}
/**
* @returns {HieroProto.proto.IContractFunctionResult}
*/
_toProtobuf() {
return {
contractID: this.contractId != null ? this.contractId._toProtobuf() : null,
contractCallResult: this.bytes,
errorMessage: this.errorMessage,
bloom: this.bloom,
gasUsed: this.gasUsed,
logInfo: this.logs.map(log => log._toProtobuf()),
// eslint-disable-next-line deprecation/deprecation
createdContractIDs: this.createdContractIds.map(id => id._toProtobuf()),
evmAddress: this.evmAddress != null ? {
value: this.evmAddress
} : null,
gas: this.gas,
amount: this.amount,
functionParameters: this.functionParameters,
senderId: this.senderAccountId != null ? this.senderAccountId._toProtobuf() : null,
contractNonces: this.contractNonces.map(contractNonce => contractNonce._toProtobuf()),
signerNonce: this.signerNonce != null ? {
value: this.signerNonce
} : null
};
}
}
exports.default = ContractFunctionResult;