import static org.assertj.core.api.Assertions.assertThat;

import com.esaulpaugh.headlong.abi.Address;
import com.google.errorprone.annotations.Var;
import com.hedera.hashgraph.sdk.ContractCallQuery;
import com.hedera.hashgraph.sdk.ContractCreateTransaction;
import com.hedera.hashgraph.sdk.ContractDeleteTransaction;
import com.hedera.hashgraph.sdk.ContractFunctionParameters;
import com.hedera.hashgraph.sdk.ContractId;
import com.hedera.hashgraph.sdk.FileAppendTransaction;
import com.hedera.hashgraph.sdk.FileCreateTransaction;
import com.hedera.hashgraph.sdk.FileDeleteTransaction;
import com.hedera.hashgraph.sdk.FileId;
import com.hedera.hashgraph.sdk.Hbar;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.Objects;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

public class ContractFunctionParametersIntegrationTest {
    private static final String SMART_CONTRACT_BYTECODE = "60806040523480156200001157600080fd5b5060408051608081018252600491810191825263082d8caf60e31b6060820152818152600160208201529060009081906200004d908262000106565b5060208201518160010155905050620001d2565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200008c57607f821691505b602082108103620000ad57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200010157600081815260208120601f850160051c81016020861015620000dc5750805b601f850160051c820191505b81811015620000fd57828155600101620000e8565b5050505b505050565b81516001600160401b0381111562000122576200012262000061565b6200013a8162000133845462000077565b84620000b3565b602080601f831160018114620001725760008415620001595750858301515b600019600386901b1c1916600185901b178555620000fd565b600085815260208120601f198616915b82811015620001a35788860151825594840194600190910190840162000182565b5085821015620001c25787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b615dfe80620001e26000396000f3fe608060405234801561001057600080fd5b50600436106108355760003560e01c80637f8082f711610437578063c5882dbb11610236578063e2a345291161013b578063f6e877f4116100c3578063fafc3b9911610092578063fafc3b9914611857578063fba1bc4c14611872578063febe099714611887578063ff5f54dd146118a2578063ffb80501146118bd57600080fd5b8063f6e877f4146117d9578063f8293f6e146117ff578063f914c4d214611821578063f962326a1461183c57600080fd5b8063eceda56a1161010a578063eceda56a1461174c578063ef65066114611767578063f0ebb92214611782578063f4e490f51461179d578063f680c24a146117be57600080fd5b8063e2a34529146116d8578063e4b90944146116f3578063e713cda81461170e578063ea945d301461173157600080fd5b8063d79d4d40116101be578063e05e91e01161018d578063e05e91e014611630578063e066de5014611656578063e0cddc551461167c578063e0f53e2414611697578063e1dbb318146116bd57600080fd5b8063d79d4d4014611592578063dade0c0b146115b8578063dbb04ed9146115da578063de9fb4841461160357600080fd5b8063cbd2e6a511610205578063cbd2e6a514611511578063cdb9e4e814611536578063cf7c3dfc1461155c578063d1b10ad714610ada578063d33c57501461157757600080fd5b8063c5882dbb1461148b578063c6c18a1c146114a6578063c7d8b87e146114d0578063cb47cdae146114f657600080fd5b8063a1bda1221161033c578063b5abe7df116102c4578063ba945bdb11610293578063ba945bdb146113dc578063bb6b524314611402578063bd90536a14611428578063be63d0b814611450578063c503772d1461146b57600080fd5b8063b5abe7df14611359578063b834bfe914611374578063b8da8d1614611395578063b989c7ee146113bb57600080fd5b8063aa016e681161030b578063aa016e68146112dc578063aa80ca2e14610c6b578063b2325c35146112f7578063b2db404a14611312578063b4e3e7b11461133357600080fd5b8063a1bda12214611259578063a401d60d1461127a578063a57ebf10146112a0578063a75761f1146112bb57600080fd5b80638f2805e0116103bf57806394cd7c801161038e57806394cd7c80146111b557806398508ba3146111d65780639b1794ae146111f7578063a08b9f671461121d578063a19962341461123e57600080fd5b80638f2805e0146111435780638ff4cfee1461115e578063909c5b2414611179578063923f5edf1461119457600080fd5b806386aba5a71161040657806386aba5a7146110ab578063881c8fb7146110c657806388b1dd37146110ec57806388b7e6f5146111075780638d7f60151461112857600080fd5b80637f8082f714610c6b578063817b24541461107557806381dbe13e14611090578063827147ce1461099a57600080fd5b806338fa6658116106435780635a8fd3b51161054857806370a5cb81116104d05780637ba844771161049f5780637ba8447714610fe25780637d0dc26214610ffd5780637d906c551461101e5780637e281630146110395780637ec32d841461105457600080fd5b806370a5cb8114610f5a57806372a06b4d14610f80578063737b801614610fa1578063796a27ea14610fbc57600080fd5b806369cbe0561161051757806369cbe05614610ecd5780636a54715c14610ee85780636a75c12f14610f095780636a9929db14610f245780636ee8f39c14610f3f57600080fd5b80635a8fd3b514610e4f578063628bc3ef14610e6a57806364e008c114610e8b57806368ef446614610eac57600080fd5b80634bbc9a67116105cb578063545e21131161059a578063545e211314610dd157806355f232a414610dfe57806357890ba914610e1957806357d9c08b14610e3457806359adb2df14610ada57600080fd5b80634bbc9a6714610d655780634e96247314610d80578063501297c214610d9b57806350370d8514610db657600080fd5b80633f396e67116106125780633f396e6714610ce3578063407b899b14610d0b578063435a33a814610d2c57806344e7b03714610af657806348d848d014610d4757600080fd5b806338fa665814610c6b5780633a73007714610c865780633b45e6e014610ca15780633e1a277114610cc257600080fd5b80631e9aa70f116107495780632ef16e8e116106d15780633135d681116106a05780633135d68114610beb57806333520ec314610c0657806333edb89614610c275780633729a2da14610c42578063382d087314610c5057600080fd5b80632ef16e8e14610b6d5780632f47a40d14610b8e5780632f6c1bb414610baf578063309f9ac914610bd057600080fd5b806322937ea91161071857806322937ea914610ada5780632421101f14610af657806324c3c3d214610b1c57806328a30eb714610b375780632a3082ce14610b5257600080fd5b80631e9aa70f14610a6e578063203ae83a14610a8957806321d1730b14610aa45780632234ea0214610abf57600080fd5b8063118b8415116107cc57806312b932a71161079b57806312b932a7146109db57806312cd95a1146109f657806315832ae414610a17578063189cea8e14610a325780631d11456214610a5357600080fd5b8063118b84151461095857806311ec6c9014610979578063126bc8151461099a578063129ed5da146109b557600080fd5b806306ac6fe11161080857806306ac6fe1146108ca57806308123e09146108f05780630a958dc81461091657806310d545531461093757600080fd5b8063017fa10b1461083a578063021d88ab14610868578063037454301461088e5780630577a846146108af575b600080fd5b61084b610848366004611a34565b90565b6040516001600160801b0390911681526020015b60405180910390f35b610876610848366004611a6d565b6040516001600160601b03909116815260200161085f565b61089c610848366004611a9a565b604051600c9190910b815260200161085f565b6108bd610848366004611b35565b60405161085f9190611bd1565b6108d8610848366004611c35565b6040516001600160781b03909116815260200161085f565b6108fe610848366004611c67565b60405166ffffffffffffff909116815260200161085f565b610924610848366004611c94565b60405160049190910b815260200161085f565b610945610848366004611cc1565b60405160119190910b815260200161085f565b610966610848366004611cee565b604051601e9190910b815260200161085f565b610987610848366004611d1b565b60405160139190910b815260200161085f565b6109a8610848366004611da5565b60405161085f9190611e27565b6109c3610848366004611e51565b6040516001600160981b03909116815260200161085f565b6109e9610848366004611e7e565b60405161085f9190611f0a565b610a04610848366004611f57565b60405160129190910b815260200161085f565b610a25610848366004611f83565b60405161085f919061200f565b610a4061084836600461205c565b60405160169190910b815260200161085f565b610a6161084836600461208f565b60405161085f919061211d565b610a7c610848366004612170565b60405161085f91906121fc565b610a97610848366004612237565b60405161085f91906122c3565b610ab261084836600461231b565b60405161085f91906123a7565b610acd6108483660046123fa565b60405161085f9190612486565b610ae86108483660046124c1565b60405190815260200161085f565b610b046108483660046124da565b6040516001600160a01b03909116815260200161085f565b610b2a61084836600461250e565b60405161085f919061259a565b610b456108483660046125db565b60405161085f9190612667565b610b606108483660046126b4565b60405161085f9190612740565b610b7b61084836600461278d565b604051601d9190910b815260200161085f565b610b9c6108483660046127a8565b604051600a9190910b815260200161085f565b610bbd6108483660046127d5565b60405160199190910b815260200161085f565b610bde610848366004612807565b60405161085f9190612893565b610bf96108483660046128eb565b60405161085f9190612977565b610c146108483660046129ca565b604051601a9190910b815260200161085f565b610c356108483660046129f7565b60405161085f9190612a83565b610a61610848366004612abe565b610c5e610848366004612b5e565b60405161085f9190612bea565b610c79610848366004612c25565b60405161085f9190612caa565b610c94610848366004612cfd565b60405161085f9190612d89565b610caf610848366004612de0565b60405160109190910b815260200161085f565b610cd0610848366004612e0d565b604051601c9190910b815260200161085f565b610cf1610848366004612e41565b60405168ffffffffffffffffff909116815260200161085f565b610d19610848366004612e6e565b60405160079190910b815260200161085f565b610d3a610848366004612e89565b60405161085f9190612f15565b610d55610848366004612f60565b604051901515815260200161085f565b610d73610848366004612f7b565b60405161085f9190613007565b610d8e610848366004613058565b60405161085f91906130e4565b610da9610848366004613137565b60405161085f91906131c3565b610dc4610848366004613215565b60405161085f91906132a1565b610de4610ddf3660046132f4565b6118e1565b60408051600093840b81529190920b60208201520161085f565b610e0c61084836600461330f565b60405161085f919061339b565b610e276108483660046133d6565b60405161085f9190613462565b610e426108483660046134b3565b60405161085f919061353f565b610e5d610848366004613593565b60405161085f919061361f565b610e7861084836600461366f565b60405160099190910b815260200161085f565b610e9961084836600461369c565b60405160179190910b815260200161085f565b610eba6108483660046136b7565b60405160149190910b815260200161085f565b610edb6108483660046136e4565b60405161085f9190613770565b610ef66108483660046137ab565b60405160069190910b815260200161085f565b610f176108483660046137d8565b60405161085f9190613864565b610f3261084836600461389f565b60405161085f919061392b565b610f4d610848366004613980565b60405161085f9190613a0c565b610f68610848366004613a67565b6040516001600160681b03909116815260200161085f565b610f8e6108483660046132f4565b60405160009190910b815260200161085f565b610faf610848366004613a99565b60405161085f9190613b25565b610fca610848366004613b66565b6040516001600160d81b03909116815260200161085f565b610ff0610848366004613b96565b60405161085f9190613c22565b61100b610848366004613c73565b604051601b9190910b815260200161085f565b61102c610848366004613ca1565b60405161085f9190613d2d565b611047610848366004613d7c565b60405161085f9190613e08565b611062610848366004613e56565b60405160029190910b815260200161085f565b611083610848366004613e88565b60405161085f9190613f14565b61109e610848366004613f55565b60405161085f9190614005565b6110b9610848366004614067565b60405161085f91906140f3565b6110d461084836600461414b565b6040516001600160b01b03909116815260200161085f565b6110fa610848366004614166565b60405161085f91906141f2565b61111561084836600461422d565b604051600f9190910b815260200161085f565b611136610848366004614248565b60405161085f91906142d4565b611151610848366004614326565b60405161085f91906143b2565b61116c6108483660046143f3565b60405161085f919061447f565b6111876108483660046144ba565b60405161085f919061455d565b6111a26108483660046145b2565b60405160159190910b815260200161085f565b6111c36108483660046145df565b60405160189190910b815260200161085f565b6111e46108483660046145fa565b604051600d9190910b815260200161085f565b61120561084836600461462c565b6040516001600160b81b03909116815260200161085f565b61122b610848366004614647565b604051600b9190910b815260200161085f565b61124c610848366004614662565b60405161085f91906146ee565b61126761084836600461472f565b60405160019190910b815260200161085f565b61128861084836600461474a565b6040516001600160f01b03909116815260200161085f565b6112ae610848366004614765565b60405161085f91906147f1565b6112c961084836600461482c565b60405161ffff909116815260200161085f565b6112ea610848366004614847565b60405161085f91906148d3565b611305610848366004614928565b60405161085f91906149b4565b611320610848366004614a01565b60405160059190910b815260200161085f565b611341610848366004614a1c565b6040516001600160701b03909116815260200161085f565b611367610848366004614a37565b60405161085f9190614ac3565b611382610848366004614b04565b604051600e9190910b815260200161085f565b6113a3610848366004614b1f565b6040516001600160a81b03909116815260200161085f565b6113c9610848366004614b3a565b60405160039190910b815260200161085f565b6113ea610848366004614b55565b6040516001600160881b03909116815260200161085f565b611410610848366004614b70565b6040516001600160c81b03909116815260200161085f565b61143b6114363660046124c1565b6118f9565b6040805192835260208301919091520161085f565b61145e610848366004614b8b565b60405161085f9190614c17565b611479610848366004614c52565b60405160ff909116815260200161085f565b611499610848366004614c6d565b60405161085f9190614cf9565b6114b4610848366004614d34565b6040516affffffffffffffffffffff909116815260200161085f565b6114de610848366004614d4f565b6040516001600160f81b03909116815260200161085f565b611504610848366004614d6a565b60405161085f9190614df6565b61151f610848366004614e31565b60405165ffffffffffff909116815260200161085f565b611544610848366004614e63565b6040516001600160e01b03909116815260200161085f565b61156a610848366004614e7e565b60405161085f9190614f0a565b611585610848366004614f45565b60405161085f9190614fd1565b6115a0610848366004615029565b6040516001600160d01b03909116815260200161085f565b6115cb6115c6366004615044565b611908565b60405161085f9392919061505f565b6115e8610848366004615096565b60405169ffffffffffffffffffff909116815260200161085f565b611616611611366004611c94565b611946565b60408051600493840b81529190920b60208201520161085f565b61163e6108483660046150b1565b6040516001600160401b03909116815260200161085f565b6116646108483660046150e3565b6040516001600160e81b03909116815260200161085f565b61168a6108483660046150fe565b60405161085f919061518a565b6116a56108483660046151c5565b6040516001600160c01b03909116815260200161085f565b6116cb6108483660046151f2565b60405161085f919061527e565b6116e66108483660046152b9565b60405161085f9190615345565b61170161084836600461538d565b60405161085f9190615419565b61171c610848366004615044565b60405163ffffffff909116815260200161085f565b61173f610848366004615454565b60405161085f91906154e0565b61175a61084836600461551b565b60405161085f91906155a7565b6117756108483660046155e2565b60405161085f919061566e565b6117906108483660046156af565b60405161085f919061573b565b6117ab610848366004615776565b60405160089190910b815260200161085f565b6117cc610848366004615791565b60405161085f919061581d565b6117e7610848366004615858565b6040516001600160901b03909116815260200161085f565b61180d610848366004615873565b60405162ffffff909116815260200161085f565b61182f61084836600461588e565b60405161085f919061591a565b61184a61084836600461595b565b60405161085f91906159e7565b611865610848366004615a28565b60405161085f9190615ab4565b61187a611955565b60405161085f9190615af5565b611895610848366004615b27565b60405161085f9190615bb3565b6118b0610848366004615bf4565b60405161085f9190615c80565b6118cb610848366004615cc1565b60405164ffffffffff909116815260200161085f565b600080826118f0816014615cf2565b91509150915091565b600080826118f0816001615d19565b600080606083611919600182615d41565b6040805180820190915260028152614f4b60f01b602082015291945063ffffffff16925090509193909250565b600080826118f0816001615d65565b604080518082019091526060815260006020820152600060405180604001604052908160008201805461198790615d8e565b80601f01602080910402602001604051908101604052809291908181526020018280546119b390615d8e565b8015611a005780601f106119d557610100808354040283529160200191611a00565b820191906000526020600020905b8154815290600101906020018083116119e357829003601f168201915b50505050508152602001600182015481525050905090565b80356001600160801b0381168114611a2f57600080fd5b919050565b600060208284031215611a4657600080fd5b611a4f82611a18565b9392505050565b80356001600160601b0381168114611a2f57600080fd5b600060208284031215611a7f57600080fd5b611a4f82611a56565b8035600c81900b8114611a2f57600080fd5b600060208284031215611aac57600080fd5b611a4f82611a88565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611af357611af3611ab5565b604052919050565b60006001600160401b03821115611b1457611b14611ab5565b5060051b60200190565b80356001600160f01b0381168114611a2f57600080fd5b60006020808385031215611b4857600080fd5b82356001600160401b03811115611b5e57600080fd5b8301601f81018513611b6f57600080fd5b8035611b82611b7d82611afb565b611acb565b81815260059190911b82018301908381019087831115611ba157600080fd5b928401925b82841015611bc657611bb784611b1e565b82529284019290840190611ba6565b979650505050505050565b6020808252825182820181905260009190848201906040850190845b81811015611c125783516001600160f01b031683529284019291840191600101611bed565b50909695505050505050565b80356001600160781b0381168114611a2f57600080fd5b600060208284031215611c4757600080fd5b611a4f82611c1e565b803566ffffffffffffff81168114611a2f57600080fd5b600060208284031215611c7957600080fd5b611a4f82611c50565b8035600481900b8114611a2f57600080fd5b600060208284031215611ca657600080fd5b611a4f82611c82565b8035601181900b8114611a2f57600080fd5b600060208284031215611cd357600080fd5b611a4f82611caf565b8035601e81900b8114611a2f57600080fd5b600060208284031215611d0057600080fd5b611a4f82611cdc565b8035601381900b8114611a2f57600080fd5b600060208284031215611d2d57600080fd5b611a4f82611d09565b600082601f830112611d4757600080fd5b81356001600160401b03811115611d6057611d60611ab5565b611d73601f8201601f1916602001611acb565b818152846020838601011115611d8857600080fd5b816020850160208301376000918101602001919091529392505050565b600060208284031215611db757600080fd5b81356001600160401b03811115611dcd57600080fd5b611dd984828501611d36565b949350505050565b6000815180845260005b81811015611e0757602081850181015186830182015201611deb565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000611a4f6020830184611de1565b80356001600160981b0381168114611a2f57600080fd5b600060208284031215611e6357600080fd5b611a4f82611e3a565b8035600381900b8114611a2f57600080fd5b60006020808385031215611e9157600080fd5b82356001600160401b03811115611ea757600080fd5b8301601f81018513611eb857600080fd5b8035611ec6611b7d82611afb565b81815260059190911b82018301908381019087831115611ee557600080fd5b928401925b82841015611bc657611efb84611e6c565b82529284019290840190611eea565b6020808252825182820181905260009190848201906040850190845b81811015611c1257835160030b83529284019291840191600101611f26565b8035601281900b8114611a2f57600080fd5b600060208284031215611f6957600080fd5b611a4f82611f45565b803560ff81168114611a2f57600080fd5b60006020808385031215611f9657600080fd5b82356001600160401b03811115611fac57600080fd5b8301601f81018513611fbd57600080fd5b8035611fcb611b7d82611afb565b81815260059190911b82018301908381019087831115611fea57600080fd5b928401925b82841015611bc65761200084611f72565b82529284019290840190611fef565b6020808252825182820181905260009190848201906040850190845b81811015611c1257835160ff168352928401929184019160010161202b565b8035601681900b8114611a2f57600080fd5b60006020828403121561206e57600080fd5b611a4f8261204a565b6001600160a01b038116811461208c57600080fd5b50565b600060208083850312156120a257600080fd5b82356001600160401b038111156120b857600080fd5b8301601f810185136120c957600080fd5b80356120d7611b7d82611afb565b81815260059190911b820183019083810190878311156120f657600080fd5b928401925b82841015611bc657833561210e81612077565b825292840192908401906120fb565b6020808252825182820181905260009190848201906040850190845b81811015611c125783516001600160a01b031683529284019291840191600101612139565b8035601481900b8114611a2f57600080fd5b6000602080838503121561218357600080fd5b82356001600160401b0381111561219957600080fd5b8301601f810185136121aa57600080fd5b80356121b8611b7d82611afb565b81815260059190911b820183019083810190878311156121d757600080fd5b928401925b82841015611bc6576121ed8461215e565b825292840192908401906121dc565b6020808252825182820181905260009190848201906040850190845b81811015611c1257835160140b83529284019291840191600101612218565b6000602080838503121561224a57600080fd5b82356001600160401b0381111561226057600080fd5b8301601f8101851361227157600080fd5b803561227f611b7d82611afb565b81815260059190911b8201830190838101908783111561229e57600080fd5b928401925b82841015611bc6576122b484611c50565b825292840192908401906122a3565b6020808252825182820181905260009190848201906040850190845b81811015611c1257835166ffffffffffffff16835292840192918401916001016122df565b80356001600160f81b0381168114611a2f57600080fd5b6000602080838503121561232e57600080fd5b82356001600160401b0381111561234457600080fd5b8301601f8101851361235557600080fd5b8035612363611b7d82611afb565b81815260059190911b8201830190838101908783111561238257600080fd5b928401925b82841015611bc65761239884612304565b82529284019290840190612387565b6020808252825182820181905260009190848201906040850190845b81811015611c125783516001600160f81b0316835292840192918401916001016123c3565b8035600a81900b8114611a2f57600080fd5b6000602080838503121561240d57600080fd5b82356001600160401b0381111561242357600080fd5b8301601f8101851361243457600080fd5b8035612442611b7d82611afb565b81815260059190911b8201830190838101908783111561246157600080fd5b928401925b82841015611bc657612477846123e8565b82529284019290840190612466565b6020808252825182820181905260009190848201906040850190845b81811015611c12578351600a0b835292840192918401916001016124a2565b6000602082840312156124d357600080fd5b5035919050565b6000602082840312156124ec57600080fd5b8135611a4f81612077565b80356001600160c81b0381168114611a2f57600080fd5b6000602080838503121561252157600080fd5b82356001600160401b0381111561253757600080fd5b8301601f8101851361254857600080fd5b8035612556611b7d82611afb565b81815260059190911b8201830190838101908783111561257557600080fd5b928401925b82841015611bc65761258b846124f7565b8252928401929084019061257a565b6020808252825182820181905260009190848201906040850190845b81811015611c125783516001600160c81b0316835292840192918401916001016125b6565b600060208083850312156125ee57600080fd5b82356001600160401b0381111561260457600080fd5b8301601f8101851361261557600080fd5b8035612623611b7d82611afb565b81815260059190911b8201830190838101908783111561264257600080fd5b928401925b82841015611bc65761265884611d09565b82529284019290840190612647565b6020808252825182820181905260009190848201906040850190845b81811015611c1257835160130b83529284019291840191600101612683565b8035600b81900b8114611a2f57600080fd5b600060208083850312156126c757600080fd5b82356001600160401b038111156126dd57600080fd5b8301601f810185136126ee57600080fd5b80356126fc611b7d82611afb565b81815260059190911b8201830190838101908783111561271b57600080fd5b928401925b82841015611bc657612731846126a2565b82529284019290840190612720565b6020808252825182820181905260009190848201906040850190845b81811015611c12578351600b0b8352928401929184019160010161275c565b8035601d81900b8114611a2f57600080fd5b60006020828403121561279f57600080fd5b611a4f8261277b565b6000602082840312156127ba57600080fd5b611a4f826123e8565b8035601981900b8114611a2f57600080fd5b6000602082840312156127e757600080fd5b611a4f826127c3565b80356001600160c01b0381168114611a2f57600080fd5b6000602080838503121561281a57600080fd5b82356001600160401b0381111561283057600080fd5b8301601f8101851361284157600080fd5b803561284f611b7d82611afb565b81815260059190911b8201830190838101908783111561286e57600080fd5b928401925b82841015611bc657612884846127f0565b82529284019290840190612873565b6020808252825182820181905260009190848201906040850190845b81811015611c125783516001600160c01b0316835292840192918401916001016128af565b80356001600160401b0381168114611a2f57600080fd5b600060208083850312156128fe57600080fd5b82356001600160401b0381111561291457600080fd5b8301601f8101851361292557600080fd5b8035612933611b7d82611afb565b81815260059190911b8201830190838101908783111561295257600080fd5b928401925b82841015611bc657612968846128d4565b82529284019290840190612957565b6020808252825182820181905260009190848201906040850190845b81811015611c125783516001600160401b031683529284019291840191600101612993565b8035601a81900b8114611a2f57600080fd5b6000602082840312156129dc57600080fd5b611a4f826129b8565b8035600d81900b8114611a2f57600080fd5b60006020808385031215612a0a57600080fd5b82356001600160401b03811115612a2057600080fd5b8301601f81018513612a3157600080fd5b8035612a3f611b7d82611afb565b81815260059190911b82018301908381019087831115612a5e57600080fd5b928401925b82841015611bc657612a74846129e5565b82529284019290840190612a63565b6020808252825182820181905260009190848201906040850190845b81811015611c12578351600d0b83529284019291840191600101612a9f565b60006020808385031215612ad157600080fd5b82356001600160401b03811115612ae757600080fd5b8301601f81018513612af857600080fd5b8035612b06611b7d82611afb565b81815260059190911b82018301908381019087831115612b2557600080fd5b928401925b82841015611bc6578335612b3d81612077565b82529284019290840190612b2a565b8035600181900b8114611a2f57600080fd5b60006020808385031215612b7157600080fd5b82356001600160401b03811115612b8757600080fd5b8301601f81018513612b9857600080fd5b8035612ba6611b7d82611afb565b81815260059190911b82018301908381019087831115612bc557600080fd5b928401925b82841015611bc657612bdb84612b4c565b82529284019290840190612bca565b6020808252825182820181905260009190848201906040850190845b81811015611c12578351600190810b8452938501939285019201612c06565b60006020808385031215612c3857600080fd5b82356001600160401b03811115612c4e57600080fd5b8301601f81018513612c5f57600080fd5b8035612c6d611b7d82611afb565b81815260059190911b82018301908381019087831115612c8c57600080fd5b928401925b82841015611bc657833582529284019290840190612c91565b6020808252825182820181905260009190848201906040850190845b81811015611c1257835183529284019291840191600101612cc6565b80356affffffffffffffffffffff81168114611a2f57600080fd5b60006020808385031215612d1057600080fd5b82356001600160401b03811115612d2657600080fd5b8301601f81018513612d3757600080fd5b8035612d45611b7d82611afb565b81815260059190911b82018301908381019087831115612d6457600080fd5b928401925b82841015611bc657612d7a84612ce2565b82529284019290840190612d69565b6020808252825182820181905260009190848201906040850190845b81811015611c125783516affffffffffffffffffffff1683529284019291840191600101612da5565b8035601081900b8114611a2f57600080fd5b600060208284031215612df257600080fd5b611a4f82612dce565b8035601c81900b8114611a2f57600080fd5b600060208284031215612e1f57600080fd5b611a4f82612dfb565b803568ffffffffffffffffff81168114611a2f57600080fd5b600060208284031215612e5357600080fd5b611a4f82612e28565b8035600781900b8114611a2f57600080fd5b600060208284031215612e8057600080fd5b611a4f82612e5c565b60006020808385031215612e9c57600080fd5b82356001600160401b03811115612eb257600080fd5b8301601f81018513612ec357600080fd5b8035612ed1611b7d82611afb565b81815260059190911b82018301908381019087831115612ef057600080fd5b928401925b82841015611bc657612f06846129b8565b82529284019290840190612ef5565b6020808252825182820181905260009190848201906040850190845b81811015611c12578351601a0b83529284019291840191600101612f31565b80358015158114611a2f57600080fd5b600060208284031215612f7257600080fd5b611a4f82612f50565b60006020808385031215612f8e57600080fd5b82356001600160401b03811115612fa457600080fd5b8301601f81018513612fb557600080fd5b8035612fc3611b7d82611afb565b81815260059190911b82018301908381019087831115612fe257600080fd5b928401925b82841015611bc657612ff884612f50565b82529284019290840190612fe7565b6020808252825182820181905260009190848201906040850190845b81811015611c12578351151583529284019291840191600101613023565b80356001600160d81b0381168114611a2f57600080fd5b6000602080838503121561306b57600080fd5b82356001600160401b0381111561308157600080fd5b8301601f8101851361309257600080fd5b80356130a0611b7d82611afb565b81815260059190911b820183019083810190878311156130bf57600080fd5b928401925b82841015611bc6576130d584613041565b825292840192908401906130c4565b6020808252825182820181905260009190848201906040850190845b81811015611c125783516001600160d81b031683529284019291840191600101613100565b8035601581900b8114611a2f57600080fd5b6000602080838503121561314a57600080fd5b82356001600160401b0381111561316057600080fd5b8301601f8101851361317157600080fd5b803561317f611b7d82611afb565b81815260059190911b8201830190838101908783111561319e57600080fd5b928401925b82841015611bc6576131b484613125565b825292840192908401906131a3565b6020808252825182820181905260009190848201906040850190845b81811015611c1257835160150b835292840192918401916001016131df565b80356001600160a81b0381168114611a2f57600080fd5b6000602080838503121561322857600080fd5b82356001600160401b0381111561323e57600080fd5b8301601f8101851361324f57600080fd5b803561325d611b7d82611afb565b81815260059190911b8201830190838101908783111561327c57600080fd5b928401925b82841015611bc657613292846131fe565b82529284019290840190613281565b6020808252825182820181905260009190848201906040850190845b81811015611c125783516001600160a81b0316835292840192918401916001016132bd565b8035600081900b8114611a2f57600080fd5b60006020828403121561330657600080fd5b611a4f826132e2565b6000602080838503121561332257600080fd5b82356001600160401b0381111561333857600080fd5b8301601f8101851361334957600080fd5b8035613357611b7d82611afb565b81815260059190911b8201830190838101908783111561337657600080fd5b928401925b82841015611bc65761338c84611caf565b8252928401929084019061337b565b6020808252825182820181905260009190848201906040850190845b81811015611c1257835160110b835292840192918401916001016133b7565b600060208083850312156133e957600080fd5b82356001600160401b038111156133ff57600080fd5b8301601f8101851361341057600080fd5b803561341e611b7d82611afb565b81815260059190911b8201830190838101908783111561343d57600080fd5b928401925b82841015611bc6576134538461204a565b82529284019290840190613442565b6020808252825182820181905260009190848201906040850190845b81811015611c1257835160160b8352928401929184019160010161347e565b803565ffffffffffff81168114611a2f57600080fd5b600060208083850312156134c657600080fd5b82356001600160401b038111156134dc57600080fd5b8301601f810185136134ed57600080fd5b80356134fb611b7d82611afb565b81815260059190911b8201830190838101908783111561351a57600080fd5b928401925b82841015611bc6576135308461349d565b8252928401929084019061351f565b6020808252825182820181905260009190848201906040850190845b81811015611c1257835165ffffffffffff168352928401929184019160010161355b565b803563ffffffff81168114611a2f57600080fd5b600060208083850312156135a657600080fd5b82356001600160401b038111156135bc57600080fd5b8301601f810185136135cd57600080fd5b80356135db611b7d82611afb565b81815260059190911b820183019083810190878311156135fa57600080fd5b928401925b82841015611bc6576136108461357f565b825292840192908401906135ff565b6020808252825182820181905260009190848201906040850190845b81811015611c1257835163ffffffff168352928401929184019160010161363b565b8035600981900b8114611a2f57600080fd5b60006020828403121561368157600080fd5b611a4f8261365d565b8035601781900b8114611a2f57600080fd5b6000602082840312156136ae57600080fd5b611a4f8261368a565b6000602082840312156136c957600080fd5b611a4f8261215e565b8035600681900b8114611a2f57600080fd5b600060208083850312156136f757600080fd5b82356001600160401b0381111561370d57600080fd5b8301601f8101851361371e57600080fd5b803561372c611b7d82611afb565b81815260059190911b8201830190838101908783111561374b57600080fd5b928401925b82841015611bc657613761846136d2565b82529284019290840190613750565b6020808252825182820181905260009190848201906040850190845b81811015611c1257835160060b8352928401929184019160010161378c565b6000602082840312156137bd57600080fd5b611a4f826136d2565b8035600f81900b8114611a2f57600080fd5b600060208083850312156137eb57600080fd5b82356001600160401b0381111561380157600080fd5b8301601f8101851361381257600080fd5b8035613820611b7d82611afb565b81815260059190911b8201830190838101908783111561383f57600080fd5b928401925b82841015611bc657613855846137c6565b82529284019290840190613844565b6020808252825182820181905260009190848201906040850190845b81811015611c12578351600f0b83529284019291840191600101613880565b600060208083850312156138b257600080fd5b82356001600160401b038111156138c857600080fd5b8301601f810185136138d957600080fd5b80356138e7611b7d82611afb565b81815260059190911b8201830190838101908783111561390657600080fd5b928401925b82841015611bc65761391c84611cdc565b8252928401929084019061390b565b6020808252825182820181905260009190848201906040850190845b81811015611c12578351601e0b83529284019291840191600101613947565b803569ffffffffffffffffffff81168114611a2f57600080fd5b6000602080838503121561399357600080fd5b82356001600160401b038111156139a957600080fd5b8301601f810185136139ba57600080fd5b80356139c8611b7d82611afb565b81815260059190911b820183019083810190878311156139e757600080fd5b928401925b82841015611bc6576139fd84613966565b825292840192908401906139ec565b6020808252825182820181905260009190848201906040850190845b81811015611c1257835169ffffffffffffffffffff1683529284019291840191600101613a28565b80356001600160681b0381168114611a2f57600080fd5b600060208284031215613a7957600080fd5b611a4f82613a50565b80356001600160701b0381168114611a2f57600080fd5b60006020808385031215613aac57600080fd5b82356001600160401b03811115613ac257600080fd5b8301601f81018513613ad357600080fd5b8035613ae1611b7d82611afb565b81815260059190911b82018301908381019087831115613b0057600080fd5b928401925b82841015611bc657613b1684613a82565b82529284019290840190613b05565b6020808252825182820181905260009190848201906040850190845b81811015611c125783516001600160701b031683529284019291840191600101613b41565b600060208284031215613b7857600080fd5b611a4f82613041565b803564ffffffffff81168114611a2f57600080fd5b60006020808385031215613ba957600080fd5b82356001600160401b03811115613bbf57600080fd5b8301601f81018513613bd057600080fd5b8035613bde611b7d82611afb565b81815260059190911b82018301908381019087831115613bfd57600080fd5b928401925b82841015611bc657613c1384613b81565b82529284019290840190613c02565b6020808252825182820181905260009190848201906040850190845b81811015611c1257835164ffffffffff1683529284019291840191600101613c3e565b8035601b81900b8114611a2f57600080fd5b600060208284031215613c8557600080fd5b611a4f82613c61565b803562ffffff81168114611a2f57600080fd5b60006020808385031215613cb457600080fd5b82356001600160401b03811115613cca57600080fd5b8301601f81018513613cdb57600080fd5b8035613ce9611b7d82611afb565b81815260059190911b82018301908381019087831115613d0857600080fd5b928401925b82841015611bc657613d1e84613c8e565b82529284019290840190613d0d565b6020808252825182820181905260009190848201906040850190845b81811015611c1257835162ffffff1683529284019291840191600101613d49565b803561ffff81168114611a2f57600080fd5b60006020808385031215613d8f57600080fd5b82356001600160401b03811115613da557600080fd5b8301601f81018513613db657600080fd5b8035613dc4611b7d82611afb565b81815260059190911b82018301908381019087831115613de357600080fd5b928401925b82841015611bc657613df984613d6a565b82529284019290840190613de8565b6020808252825182820181905260009190848201906040850190845b81811015611c1257835161ffff1683529284019291840191600101613e24565b8035600281900b8114611a2f57600080fd5b600060208284031215613e6857600080fd5b611a4f82613e44565b80356001600160901b0381168114611a2f57600080fd5b60006020808385031215613e9b57600080fd5b82356001600160401b03811115613eb157600080fd5b8301601f81018513613ec257600080fd5b8035613ed0611b7d82611afb565b81815260059190911b82018301908381019087831115613eef57600080fd5b928401925b82841015611bc657613f0584613e71565b82529284019290840190613ef4565b6020808252825182820181905260009190848201906040850190845b81811015611c125783516001600160901b031683529284019291840191600101613f30565b60006020808385031215613f6857600080fd5b82356001600160401b0380821115613f7f57600080fd5b818501915085601f830112613f9357600080fd5b8135613fa1611b7d82611afb565b81815260059190911b83018401908481019088831115613fc057600080fd5b8585015b83811015613ff857803585811115613fdc5760008081fd5b613fea8b89838a0101611d36565b845250918601918601613fc4565b5098975050505050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561405a57603f19888603018452614048858351611de1565b9450928501929085019060010161402c565b5092979650505050505050565b6000602080838503121561407a57600080fd5b82356001600160401b0381111561409057600080fd5b8301601f810185136140a157600080fd5b80356140af611b7d82611afb565b81815260059190911b820183019083810190878311156140ce57600080fd5b928401925b82841015611bc6576140e484611e3a565b825292840192908401906140d3565b6020808252825182820181905260009190848201906040850190845b81811015611c125783516001600160981b03168352928401929184019160010161410f565b80356001600160b01b0381168114611a2f57600080fd5b60006020828403121561415d57600080fd5b611a4f82614134565b6000602080838503121561417957600080fd5b82356001600160401b0381111561418f57600080fd5b8301601f810185136141a057600080fd5b80356141ae611b7d82611afb565b81815260059190911b820183019083810190878311156141cd57600080fd5b928401925b82841015611bc6576141e384612dce565b825292840192908401906141d2565b6020808252825182820181905260009190848201906040850190845b81811015611c1257835160100b8352928401929184019160010161420e565b60006020828403121561423f57600080fd5b611a4f826137c6565b6000602080838503121561425b57600080fd5b82356001600160401b0381111561427157600080fd5b8301601f8101851361428257600080fd5b8035614290611b7d82611afb565b81815260059190911b820183019083810190878311156142af57600080fd5b928401925b82841015611bc6576142c5846127c3565b825292840192908401906142b4565b6020808252825182820181905260009190848201906040850190845b81811015611c1257835160190b835292840192918401916001016142f0565b80356001600160881b0381168114611a2f57600080fd5b6000602080838503121561433957600080fd5b82356001600160401b0381111561434f57600080fd5b8301601f8101851361436057600080fd5b803561436e611b7d82611afb565b81815260059190911b8201830190838101908783111561438d57600080fd5b928401925b82841015611bc6576143a38461430f565b82529284019290840190614392565b6020808252825182820181905260009190848201906040850190845b81811015611c125783516001600160881b0316835292840192918401916001016143ce565b6000602080838503121561440657600080fd5b82356001600160401b0381111561441c57600080fd5b8301601f8101851361442d57600080fd5b803561443b611b7d82611afb565b81815260059190911b8201830190838101908783111561445a57600080fd5b928401925b82841015611bc65761447084613c61565b8252928401929084019061445f565b6020808252825182820181905260009190848201906040850190845b81811015611c12578351601b0b8352928401929184019160010161449b565b600060208083850312156144cd57600080fd5b82356001600160401b03808211156144e457600080fd5b818501915085601f8301126144f857600080fd5b8135614506611b7d82611afb565b81815260059190911b8301840190848101908883111561452557600080fd5b8585015b83811015613ff8578035858111156145415760008081fd5b61454f8b89838a0101611d36565b845250918601918601614529565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561405a57603f198886030184526145a0858351611de1565b94509285019290850190600101614584565b6000602082840312156145c457600080fd5b611a4f82613125565b8035601881900b8114611a2f57600080fd5b6000602082840312156145f157600080fd5b611a4f826145cd565b60006020828403121561460c57600080fd5b611a4f826129e5565b80356001600160b81b0381168114611a2f57600080fd5b60006020828403121561463e57600080fd5b611a4f82614615565b60006020828403121561465957600080fd5b611a4f826126a2565b6000602080838503121561467557600080fd5b82356001600160401b0381111561468b57600080fd5b8301601f8101851361469c57600080fd5b80356146aa611b7d82611afb565b81815260059190911b820183019083810190878311156146c957600080fd5b928401925b82841015611bc6576146df84614134565b825292840192908401906146ce565b6020808252825182820181905260009190848201906040850190845b81811015611c125783516001600160b01b03168352928401929184019160010161470a565b60006020828403121561474157600080fd5b611a4f82612b4c565b60006020828403121561475c57600080fd5b611a4f82611b1e565b6000602080838503121561477857600080fd5b82356001600160401b0381111561478e57600080fd5b8301601f8101851361479f57600080fd5b80356147ad611b7d82611afb565b81815260059190911b820183019083810190878311156147cc57600080fd5b928401925b82841015611bc6576147e284611a88565b825292840192908401906147d1565b6020808252825182820181905260009190848201906040850190845b81811015611c12578351600c0b8352928401929184019160010161480d565b60006020828403121561483e57600080fd5b611a4f82613d6a565b6000602080838503121561485a57600080fd5b82356001600160401b0381111561487057600080fd5b8301601f8101851361488157600080fd5b803561488f611b7d82611afb565b81815260059190911b820183019083810190878311156148ae57600080fd5b928401925b82841015611bc6576148c484612e28565b825292840192908401906148b3565b6020808252825182820181905260009190848201906040850190845b81811015611c1257835168ffffffffffffffffff16835292840192918401916001016148ef565b8035600e81900b8114611a2f57600080fd5b6000602080838503121561493b57600080fd5b82356001600160401b0381111561495157600080fd5b8301601f8101851361496257600080fd5b8035614970611b7d82611afb565b81815260059190911b8201830190838101908783111561498f57600080fd5b928401925b82841015611bc6576149a584614916565b82529284019290840190614994565b6020808252825182820181905260009190848201906040850190845b81811015611c12578351600e0b835292840192918401916001016149d0565b8035600581900b8114611a2f57600080fd5b600060208284031215614a1357600080fd5b611a4f826149ef565b600060208284031215614a2e57600080fd5b611a4f82613a82565b60006020808385031215614a4a57600080fd5b82356001600160401b03811115614a6057600080fd5b8301601f81018513614a7157600080fd5b8035614a7f611b7d82611afb565b81815260059190911b82018301908381019087831115614a9e57600080fd5b928401925b82841015611bc657614ab484613a50565b82529284019290840190614aa3565b6020808252825182820181905260009190848201906040850190845b81811015611c125783516001600160681b031683529284019291840191600101614adf565b600060208284031215614b1657600080fd5b611a4f82614916565b600060208284031215614b3157600080fd5b611a4f826131fe565b600060208284031215614b4c57600080fd5b611a4f82611e6c565b600060208284031215614b6757600080fd5b611a4f8261430f565b600060208284031215614b8257600080fd5b611a4f826124f7565b60006020808385031215614b9e57600080fd5b82356001600160401b03811115614bb457600080fd5b8301601f81018513614bc557600080fd5b8035614bd3611b7d82611afb565b81815260059190911b82018301908381019087831115614bf257600080fd5b928401925b82841015611bc657614c08846149ef565b82529284019290840190614bf7565b6020808252825182820181905260009190848201906040850190845b81811015611c1257835160050b83529284019291840191600101614c33565b600060208284031215614c6457600080fd5b611a4f82611f72565b60006020808385031215614c8057600080fd5b82356001600160401b03811115614c9657600080fd5b8301601f81018513614ca757600080fd5b8035614cb5611b7d82611afb565b81815260059190911b82018301908381019087831115614cd457600080fd5b928401925b82841015611bc657614cea84611f45565b82529284019290840190614cd9565b6020808252825182820181905260009190848201906040850190845b81811015611c1257835160120b83529284019291840191600101614d15565b600060208284031215614d4657600080fd5b611a4f82612ce2565b600060208284031215614d6157600080fd5b611a4f82612304565b60006020808385031215614d7d57600080fd5b82356001600160401b03811115614d9357600080fd5b8301601f81018513614da457600080fd5b8035614db2611b7d82611afb565b81815260059190911b82018301908381019087831115614dd157600080fd5b928401925b82841015611bc657614de7846145cd565b82529284019290840190614dd6565b6020808252825182820181905260009190848201906040850190845b81811015611c1257835160180b83529284019291840191600101614e12565b600060208284031215614e4357600080fd5b611a4f8261349d565b80356001600160e01b0381168114611a2f57600080fd5b600060208284031215614e7557600080fd5b611a4f82614e4c565b60006020808385031215614e9157600080fd5b82356001600160401b03811115614ea757600080fd5b8301601f81018513614eb857600080fd5b8035614ec6611b7d82611afb565b81815260059190911b82018301908381019087831115614ee557600080fd5b928401925b82841015611bc657614efb8461365d565b82529284019290840190614eea565b6020808252825182820181905260009190848201906040850190845b81811015611c1257835160090b83529284019291840191600101614f26565b60006020808385031215614f5857600080fd5b82356001600160401b03811115614f6e57600080fd5b8301601f81018513614f7f57600080fd5b8035614f8d611b7d82611afb565b81815260059190911b82018301908381019087831115614fac57600080fd5b928401925b82841015611bc657614fc284614e4c565b82529284019290840190614fb1565b6020808252825182820181905260009190848201906040850190845b81811015611c125783516001600160e01b031683529284019291840191600101614fed565b80356001600160d01b0381168114611a2f57600080fd5b60006020828403121561503b57600080fd5b611a4f82615012565b60006020828403121561505657600080fd5b611a4f8261357f565b63ffffffff841681526001600160401b038316602082015260606040820152600061508d6060830184611de1565b95945050505050565b6000602082840312156150a857600080fd5b611a4f82613966565b6000602082840312156150c357600080fd5b611a4f826128d4565b80356001600160e81b0381168114611a2f57600080fd5b6000602082840312156150f557600080fd5b611a4f826150cc565b6000602080838503121561511157600080fd5b82356001600160401b0381111561512757600080fd5b8301601f8101851361513857600080fd5b8035615146611b7d82611afb565b81815260059190911b8201830190838101908783111561516557600080fd5b928401925b82841015611bc65761517b84612dfb565b8252928401929084019061516a565b6020808252825182820181905260009190848201906040850190845b81811015611c12578351601c0b835292840192918401916001016151a6565b6000602082840312156151d757600080fd5b611a4f826127f0565b8035600881900b8114611a2f57600080fd5b6000602080838503121561520557600080fd5b82356001600160401b0381111561521b57600080fd5b8301601f8101851361522c57600080fd5b803561523a611b7d82611afb565b81815260059190911b8201830190838101908783111561525957600080fd5b928401925b82841015611bc65761526f846151e0565b8252928401929084019061525e565b6020808252825182820181905260009190848201906040850190845b81811015611c1257835160080b8352928401929184019160010161529a565b600060208083850312156152cc57600080fd5b82356001600160401b038111156152e257600080fd5b8301601f810185136152f357600080fd5b8035615301611b7d82611afb565b81815260059190911b8201830190838101908783111561532057600080fd5b928401925b82841015611bc657615336846132e2565b82529284019290840190615325565b602080825282518282018190526000919084820190604085019084805b82811015615380578451820b84529385019392850192600101615362565b5091979650505050505050565b600060208083850312156153a057600080fd5b82356001600160401b038111156153b657600080fd5b8301601f810185136153c757600080fd5b80356153d5611b7d82611afb565b81815260059190911b820183019083810190878311156153f457600080fd5b928401925b82841015611bc65761540a8461277b565b825292840192908401906153f9565b6020808252825182820181905260009190848201906040850190845b81811015611c12578351601d0b83529284019291840191600101615435565b6000602080838503121561546757600080fd5b82356001600160401b0381111561547d57600080fd5b8301601f8101851361548e57600080fd5b803561549c611b7d82611afb565b81815260059190911b820183019083810190878311156154bb57600080fd5b928401925b82841015611bc6576154d184611c82565b825292840192908401906154c0565b6020808252825182820181905260009190848201906040850190845b81811015611c1257835160040b835292840192918401916001016154fc565b6000602080838503121561552e57600080fd5b82356001600160401b0381111561554457600080fd5b8301601f8101851361555557600080fd5b8035615563611b7d82611afb565b81815260059190911b8201830190838101908783111561558257600080fd5b928401925b82841015611bc65761559884613e44565b82529284019290840190615587565b6020808252825182820181905260009190848201906040850190845b81811015611c1257835160020b835292840192918401916001016155c3565b600060208083850312156155f557600080fd5b82356001600160401b0381111561560b57600080fd5b8301601f8101851361561c57600080fd5b803561562a611b7d82611afb565b81815260059190911b8201830190838101908783111561564957600080fd5b928401925b82841015611bc65761565f846150cc565b8252928401929084019061564e565b6020808252825182820181905260009190848201906040850190845b81811015611c125783516001600160e81b03168352928401929184019160010161568a565b600060208083850312156156c257600080fd5b82356001600160401b038111156156d857600080fd5b8301601f810185136156e957600080fd5b80356156f7611b7d82611afb565b81815260059190911b8201830190838101908783111561571657600080fd5b928401925b82841015611bc65761572c8461368a565b8252928401929084019061571b565b6020808252825182820181905260009190848201906040850190845b81811015611c1257835160170b83529284019291840191600101615757565b60006020828403121561578857600080fd5b611a4f826151e0565b600060208083850312156157a457600080fd5b82356001600160401b038111156157ba57600080fd5b8301601f810185136157cb57600080fd5b80356157d9611b7d82611afb565b81815260059190911b820183019083810190878311156157f857600080fd5b928401925b82841015611bc65761580e84612e5c565b825292840192908401906157fd565b6020808252825182820181905260009190848201906040850190845b81811015611c1257835160070b83529284019291840191600101615839565b60006020828403121561586a57600080fd5b611a4f82613e71565b60006020828403121561588557600080fd5b611a4f82613c8e565b600060208083850312156158a157600080fd5b82356001600160401b038111156158b757600080fd5b8301601f810185136158c857600080fd5b80356158d6611b7d82611afb565b81815260059190911b820183019083810190878311156158f557600080fd5b928401925b82841015611bc65761590b84611a18565b825292840192908401906158fa565b6020808252825182820181905260009190848201906040850190845b81811015611c125783516001600160801b031683529284019291840191600101615936565b6000602080838503121561596e57600080fd5b82356001600160401b0381111561598457600080fd5b8301601f8101851361599557600080fd5b80356159a3611b7d82611afb565b81815260059190911b820183019083810190878311156159c257600080fd5b928401925b82841015611bc6576159d884615012565b825292840192908401906159c7565b6020808252825182820181905260009190848201906040850190845b81811015611c125783516001600160d01b031683529284019291840191600101615a03565b60006020808385031215615a3b57600080fd5b82356001600160401b03811115615a5157600080fd5b8301601f81018513615a6257600080fd5b8035615a70611b7d82611afb565b81815260059190911b82018301908381019087831115615a8f57600080fd5b928401925b82841015611bc657615aa584614615565b82529284019290840190615a94565b6020808252825182820181905260009190848201906040850190845b81811015611c125783516001600160b81b031683529284019291840191600101615ad0565b602081526000825160406020840152615b116060840182611de1565b9050602084015160408401528091505092915050565b60006020808385031215615b3a57600080fd5b82356001600160401b03811115615b5057600080fd5b8301601f81018513615b6157600080fd5b8035615b6f611b7d82611afb565b81815260059190911b82018301908381019087831115615b8e57600080fd5b928401925b82841015611bc657615ba484611c1e565b82529284019290840190615b93565b6020808252825182820181905260009190848201906040850190845b81811015611c125783516001600160781b031683529284019291840191600101615bcf565b60006020808385031215615c0757600080fd5b82356001600160401b03811115615c1d57600080fd5b8301601f81018513615c2e57600080fd5b8035615c3c611b7d82611afb565b81815260059190911b82018301908381019087831115615c5b57600080fd5b928401925b82841015611bc657615c7184611a56565b82529284019290840190615c60565b6020808252825182820181905260009190848201906040850190845b81811015611c125783516001600160601b031683529284019291840191600101615c9c565b600060208284031215615cd357600080fd5b611a4f82613b81565b634e487b7160e01b600052601160045260246000fd5b600081810b9083900b01607f8113607f1982121715615d1357615d13615cdc565b92915050565b8082018281126000831280158216821582161715615d3957615d39615cdc565b505092915050565b63ffffffff828116828216039080821115615d5e57615d5e615cdc565b5092915050565b600481810b9083900b01647fffffffff8113647fffffffff1982121715615d1357615d13615cdc565b600181811c90821680615da257607f821691505b602082108103615dc257634e487b7160e01b600052602260045260246000fd5b5091905056fea2646970667358221220a5b87b6881e1a012e4a59d55c230cfcf3a2342b83efdbfb3c5f5cfa532fc854864736f6c63430008120033";
    private static IntegrationTestEnv testEnv;
    private static FileId fileId;
    private static ContractId contractId;

    @BeforeAll
    public static void beforeAll() throws Exception {
        testEnv = new IntegrationTestEnv(1);

        @Var var response = new FileCreateTransaction().setKeys(testEnv.operatorKey).execute(testEnv.client);

        fileId = Objects.requireNonNull(response.getReceipt(testEnv.client).fileId);

        new FileAppendTransaction().setFileId(fileId).setContents(SMART_CONTRACT_BYTECODE).setMaxChunks(31)
            .execute(testEnv.client);

        response = new ContractCreateTransaction().setAdminKey(testEnv.operatorKey).setGas(1500000)
            .setConstructorParameters(new ContractFunctionParameters()).setBytecodeFileId(fileId)
            .execute(testEnv.client);

        contractId = Objects.requireNonNull(response.getReceipt(testEnv.client).contractId);
    }

    @AfterAll
    public static void afterAll() throws Exception {
        new ContractDeleteTransaction().setTransferAccountId(testEnv.operatorId).setContractId(contractId)
            .execute(testEnv.client).getReceipt(testEnv.client);

        new FileDeleteTransaction().setFileId(fileId).execute(testEnv.client).getReceipt(testEnv.client);

        testEnv.close();
    }

    // so we don't get "network is busy" error
    @AfterEach
    public void afterEach() throws InterruptedException {
        Thread.sleep(150);
    }

    @Test
    @DisplayName("Can receive uint8 min value from contract call")
    void canCallContractFunctionUint8Min() throws Exception {
        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint8", new ContractFunctionParameters().addUint8((byte) 0x0))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint8(0)).isEqualTo((byte) 0x0);
    }

    @Test
    @DisplayName("Can receive uint8 max value from contract call")
    void canCallContractFunctionUint8Max() throws Exception {
        int uint8Max = 255;
        byte uint8MaxByte = (byte) uint8Max;

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint8", new ContractFunctionParameters().addUint8(uint8MaxByte))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var uint8MaxFromResponse = Byte.toUnsignedInt(response.getUint8(0));

        assertThat(uint8MaxFromResponse).isEqualTo(uint8Max);
    }

    @Test
    @DisplayName("Can receive uint8 array value from contract call")
    void canCallContractFunctionUint8Array() throws Exception {
        byte uint8MinByte = (byte) 0x0;
        int uint8Max = 255;
        byte uint8MaxByte = (byte) uint8Max;
        byte[] uint8Array = {uint8MinByte, uint8MaxByte};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint8Arr", new ContractFunctionParameters().addUint8Array(uint8Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (int[]) response.getResult("(uint8[])").get(0);

        assertThat(responseResult[0]).isEqualTo(uint8MinByte);
        assertThat(responseResult[1]).isEqualTo(uint8Max);
    }

    @Test
    @DisplayName("Can receive uint16 min value from contract call")
    void canCallContractFunctionUint16Min() throws Exception {
        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint16", new ContractFunctionParameters().addUint16(0)).setQueryPayment(new Hbar(10))
            .execute(testEnv.client);

        assertThat(response.getUint32(0)).isEqualTo(0);
    }

    @Test
    @DisplayName("Can receive uint16 max value from contract call")
    void canCallContractFunctionUint16Max() throws Exception {
        var uint16Max = "65535";
        int uint16MaxInt = Integer.parseUnsignedInt(uint16Max);

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint16", new ContractFunctionParameters().addUint16(uint16MaxInt))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var uint16MaxIntFromResponse = Integer.toUnsignedString(response.getUint32(0));

        assertThat(uint16MaxIntFromResponse).isEqualTo(uint16Max);
    }

    @Test
    @DisplayName("Can receive uint16 array value from contract call")
    void canCallContractFunctionUint16Array() throws Exception {
        int uint16MinInt = 0;
        var uint16Max = "65535";
        int uint16MaxInt = Integer.parseUnsignedInt(uint16Max);
        int[] uint16Array = {uint16MinInt, uint16MaxInt};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint16Arr", new ContractFunctionParameters().addUint16Array(uint16Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (int[]) response.getResult("(uint16[])").get(0);

        assertThat(responseResult).isEqualTo(uint16Array);
    }

    @Test
    @DisplayName("Can receive uint24 min value from contract call")
    void canCallContractFunctionUint24Min() throws Exception {
        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint24", new ContractFunctionParameters().addUint24(0)).setQueryPayment(new Hbar(10))
            .execute(testEnv.client);

        assertThat(response.getUint32(0)).isEqualTo(0);
    }

    @Test
    @DisplayName("Can receive uint24 max value from contract call")
    void canCallContractFunctionUint24Max() throws Exception {
        var uint24Max = "16777215";
        int uint24MaxInt = Integer.parseUnsignedInt(uint24Max);

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint24", new ContractFunctionParameters().addUint24(uint24MaxInt))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var uint24MaxIntFromResponse = Integer.toUnsignedString(response.getUint32(0));

        assertThat(uint24MaxIntFromResponse).isEqualTo(uint24Max);
    }

    @Test
    @DisplayName("Can receive uint24 array value from contract call")
    void canCallContractFunctionUint24Array() throws Exception {
        int uint24MinInt = 0;
        var uint24Max = "16777215";
        int uint24MaxInt = Integer.parseUnsignedInt(uint24Max);
        int[] uint24Array = {uint24MinInt, uint24MaxInt};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint24Arr", new ContractFunctionParameters().addUint24Array(uint24Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (int[]) response.getResult("(uint24[])").get(0);

        assertThat(responseResult).isEqualTo(uint24Array);
    }

    @Test
    @DisplayName("Can receive uint32 min value from contract call")
    void canCallContractFunctionUint32Min() throws Exception {
        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint32", new ContractFunctionParameters().addUint32(0)).setQueryPayment(new Hbar(10))
            .execute(testEnv.client);

        assertThat(response.getUint32(0)).isEqualTo(0);
    }

    @Test
    @DisplayName("Can receive uint32 max value from contract call")
    void canCallContractFunctionUint32Max() throws Exception {
        var uint32Max = "4294967295";
        int uint32MaxInt = Integer.parseUnsignedInt(uint32Max);

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint32", new ContractFunctionParameters().addUint32(uint32MaxInt))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var uint32MaxIntFromResponse = Integer.toUnsignedString(response.getUint32(0));

        assertThat(uint32MaxIntFromResponse).isEqualTo(uint32Max);
    }

    @Test
    @DisplayName("Can receive uint32 array value from contract call")
    void canCallContractFunctionUint32Array() throws Exception {
        int uint32MinInt = 0;
        var uint32Max = "4294967295";
        int uint32MaxInt = Integer.parseUnsignedInt(uint32Max);
        int[] uint32Array = {uint32MinInt, uint32MaxInt};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint32Arr", new ContractFunctionParameters().addUint32Array(uint32Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (long[]) response.getResult("(uint32[])").get(0);

        assertThat(responseResult[0]).isEqualTo(uint32MinInt);
        assertThat(responseResult[1]).isEqualTo(Long.parseUnsignedLong(uint32Max));
    }

    @Test
    @DisplayName("Can receive uint40 min value from contract call")
    void canCallContractFunctionUint40Min() throws Exception {
        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint40", new ContractFunctionParameters().addUint40(0)).setQueryPayment(new Hbar(10))
            .execute(testEnv.client);

        assertThat(response.getUint64(0)).isEqualTo(0);
    }

    @Test
    @DisplayName("Can receive uint40 max value from contract call")
    void canCallContractFunctionUint40Max() throws Exception {
        var uint40Max = "109951162777";
        long uint40MaxLong = Long.parseUnsignedLong(uint40Max);

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint40", new ContractFunctionParameters().addUint40(uint40MaxLong))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var uint64MaxLongFromResponse = Long.toUnsignedString(response.getUint64(0));

        assertThat(uint64MaxLongFromResponse).isEqualTo(uint40Max);
    }

    @Test
    @DisplayName("Can receive uint40 array value from contract call")
    void canCallContractFunctionUint40Array() throws Exception {
        long uint40MinLong = 0;
        var uint40Max = "109951162777";
        long uint40MaxLong = Long.parseUnsignedLong(uint40Max);
        long[] uint40Array = {uint40MinLong, uint40MaxLong};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint40Arr", new ContractFunctionParameters().addUint40Array(uint40Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (long[]) response.getResult("(uint40[])").get(0);

        assertThat(responseResult).isEqualTo(uint40Array);
    }

    @Test
    @DisplayName("Can receive uint48 min value from contract call")
    void canCallContractFunctionUint48Min() throws Exception {
        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint48", new ContractFunctionParameters().addUint48(0)).setQueryPayment(new Hbar(10))
            .execute(testEnv.client);

        assertThat(response.getUint64(0)).isEqualTo(0);
    }

    @Test
    @DisplayName("Can receive uint48 max value from contract call")
    void canCallContractFunctionUint48Max() throws Exception {
        var uint48Max = "281474976710655";
        long uint48MaxLong = Long.parseUnsignedLong(uint48Max);

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint48", new ContractFunctionParameters().addUint48(uint48MaxLong))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var uint64MaxLongFromResponse = Long.toUnsignedString(response.getUint64(0));

        assertThat(uint64MaxLongFromResponse).isEqualTo(uint48Max);
    }

    @Test
    @DisplayName("Can receive uint48 array value from contract call")
    void canCallContractFunctionUint48Array() throws Exception {
        long uint48MinLong = 0;
        var uint48Max = "281474976710655";
        long uint48MaxLong = Long.parseUnsignedLong(uint48Max);
        long[] uint48Array = {uint48MinLong, uint48MaxLong};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint48Arr", new ContractFunctionParameters().addUint48Array(uint48Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (long[]) response.getResult("(uint48[])").get(0);

        assertThat(responseResult).isEqualTo(uint48Array);
    }

    @Test
    @DisplayName("Can receive uint56 min value from contract call")
    void canCallContractFunctionUint56Min() throws Exception {
        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint56", new ContractFunctionParameters().addUint56(0)).setQueryPayment(new Hbar(10))
            .execute(testEnv.client);

        assertThat(response.getUint64(0)).isEqualTo(0);
    }

    @Test
    @DisplayName("Can receive uint56 max value from contract call")
    void canCallContractFunctionUint56Max() throws Exception {
        var uint56Max = "72057594037927935";
        long uint56MaxLong = Long.parseUnsignedLong(uint56Max);

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint56", new ContractFunctionParameters().addUint56(uint56MaxLong))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var uint64MaxLongFromResponse = Long.toUnsignedString(response.getUint64(0));

        assertThat(uint64MaxLongFromResponse).isEqualTo(uint56Max);
    }

    @Test
    @DisplayName("Can receive uint56 array value from contract call")
    void canCallContractFunctionUint56Array() throws Exception {
        long uint56MinLong = 0;
        var uint56Max = "72057594037927935";
        long uint56MaxLong = Long.parseUnsignedLong(uint56Max);
        long[] uint56Array = {uint56MinLong, uint56MaxLong};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint56Arr", new ContractFunctionParameters().addUint56Array(uint56Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (long[]) response.getResult("(uint56[])").get(0);

        assertThat(responseResult).isEqualTo(uint56Array);
    }

    @Test
    @DisplayName("Can receive uint64 min value from contract call")
    void canCallContractFunctionUint64Min() throws Exception {
        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint64", new ContractFunctionParameters().addUint64(0)).setQueryPayment(new Hbar(10))
            .execute(testEnv.client);

        assertThat(response.getUint64(0)).isEqualTo(0);
    }

    @Test
    @DisplayName("Can receive uint64 max value from contract call")
    void canCallContractFunctionUint64Max() throws Exception {
        var uint64Max = "9223372036854775807";
        long uint64MaxLong = Long.parseUnsignedLong(uint64Max);

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint64", new ContractFunctionParameters().addUint64(uint64MaxLong))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var uint64MaxLongFromResponse = Long.toUnsignedString(response.getUint64(0));

        assertThat(uint64MaxLongFromResponse).isEqualTo(uint64Max);
    }

    @Test
    @DisplayName("Can receive uint64 array value from contract call")
    void canCallContractFunctionUint64Array() throws Exception {
        long uint64MinLong = 0;
        var uint64Max = "9223372036854775807";
        long uint64MaxLong = Long.parseUnsignedLong(uint64Max);
        long[] uint64Array = {uint64MinLong, uint64MaxLong};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint64Arr", new ContractFunctionParameters().addUint64Array(uint64Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(uint64[])").get(0);

        assertThat(responseResult[0]).isEqualTo(uint64MinLong);
        assertThat(responseResult[1]).isEqualTo(Long.parseUnsignedLong(uint64Max));
    }

    @Test
    @DisplayName("Can receive uint72 min value from contract call")
    void canCallContractFunctionUint72Min() throws Exception {
        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint72", new ContractFunctionParameters().addUint72(BigInteger.ZERO))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(BigInteger.ZERO);
    }

    @Test
    @DisplayName("Can receive uint72 max value from contract call")
    void canCallContractFunctionUint72Max() throws Exception {
        BigInteger uint72Max = new BigInteger("4722366482869645213695");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint72", new ContractFunctionParameters().addUint72(uint72Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(uint72Max);
    }

    @Test
    @DisplayName("Can receive uint72 array value from contract call")
    void canCallContractFunctionUint72Array() throws Exception {
        BigInteger uint72Min = BigInteger.ZERO;
        BigInteger uint72Max = new BigInteger("4722366482869645213695");
        BigInteger[] uint72Array = {uint72Min, uint72Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint72Arr", new ContractFunctionParameters().addUint72Array(uint72Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(uint72[])").get(0);

        assertThat(responseResult).isEqualTo(uint72Array);
    }

    @Test
    @DisplayName("Can receive uint80 min value from contract call")
    void canCallContractFunctionUint80Min() throws Exception {
        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint80", new ContractFunctionParameters().addUint80(BigInteger.ZERO))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(BigInteger.ZERO);
    }

    @Test
    @DisplayName("Can receive uint80 max value from contract call")
    void canCallContractFunctionUint80Max() throws Exception {
        BigInteger uint80Max = new BigInteger("1208925819614629174706175");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint80", new ContractFunctionParameters().addUint80(uint80Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(uint80Max);
    }

    @Test
    @DisplayName("Can receive uint80 array value from contract call")
    void canCallContractFunctionUint80Array() throws Exception {
        BigInteger uint80Min = BigInteger.ZERO;
        BigInteger uint80Max = new BigInteger("1208925819614629174706175");
        BigInteger[] uint80Array = {uint80Min, uint80Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint80Arr", new ContractFunctionParameters().addUint80Array(uint80Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(uint80[])").get(0);

        assertThat(responseResult).isEqualTo(uint80Array);
    }

    @Test
    @DisplayName("Can receive uint88 min value from contract call")
    void canCallContractFunctionUint88Min() throws Exception {
        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint88", new ContractFunctionParameters().addUint88(BigInteger.ZERO))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(BigInteger.ZERO);
    }

    @Test
    @DisplayName("Can receive uint88 max value from contract call")
    void canCallContractFunctionUint88Max() throws Exception {
        BigInteger uint88Max = new BigInteger("309485009821345068724781055");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint88", new ContractFunctionParameters().addUint88(uint88Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(uint88Max);
    }

    @Test
    @DisplayName("Can receive uint88 array value from contract call")
    void canCallContractFunctionUint88Array() throws Exception {
        BigInteger uint88Min = BigInteger.ZERO;
        BigInteger uint88Max = new BigInteger("309485009821345068724781055");
        BigInteger[] uint88Array = {uint88Min, uint88Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint88Arr", new ContractFunctionParameters().addUint88Array(uint88Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(uint88[])").get(0);

        assertThat(responseResult).isEqualTo(uint88Array);
    }

    @Test
    @DisplayName("Can receive uint96 min value from contract call")
    void canCallContractFunctionUint96Min() throws Exception {
        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint96", new ContractFunctionParameters().addUint96(BigInteger.ZERO))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(BigInteger.ZERO);
    }

    @Test
    @DisplayName("Can receive uint96 max value from contract call")
    void canCallContractFunctionUint96Max() throws Exception {
        BigInteger uint96Max = new BigInteger("79228162514264337593543950335");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint96", new ContractFunctionParameters().addUint96(uint96Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(uint96Max);
    }

    @Test
    @DisplayName("Can receive uint96 array value from contract call")
    void canCallContractFunctionUint96Array() throws Exception {
        BigInteger uint96Min = BigInteger.ZERO;
        BigInteger uint96Max = new BigInteger("79228162514264337593543950335");
        BigInteger[] uint96Array = {uint96Min, uint96Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint96Arr", new ContractFunctionParameters().addUint96Array(uint96Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(uint96[])").get(0);

        assertThat(responseResult).isEqualTo(uint96Array);
    }

    @Test
    @DisplayName("Can receive uint104 min value from contract call")
    void canCallContractFunctionUint104Min() throws Exception {
        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint104", new ContractFunctionParameters().addUint104(BigInteger.ZERO))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(BigInteger.ZERO);
    }

    @Test
    @DisplayName("Can receive uint104 max value from contract call")
    void canCallContractFunctionUint104Max() throws Exception {
        BigInteger uint104Max = new BigInteger("20282409603651670423947251286015");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint104", new ContractFunctionParameters().addUint104(uint104Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(uint104Max);
    }

    @Test
    @DisplayName("Can receive uint104 array value from contract call")
    void canCallContractFunctionUint104Array() throws Exception {
        BigInteger uint104Min = BigInteger.ZERO;
        BigInteger uint104Max = new BigInteger("20282409603651670423947251286015");
        BigInteger[] uint104Array = {uint104Min, uint104Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint104Arr", new ContractFunctionParameters().addUint104Array(uint104Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(uint104[])").get(0);

        assertThat(responseResult).isEqualTo(uint104Array);
    }

    @Test
    @DisplayName("Can receive uint112 min value from contract call")
    void canCallContractFunctionUint112Min() throws Exception {
        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint112", new ContractFunctionParameters().addUint112(BigInteger.ZERO))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(BigInteger.ZERO);
    }

    @Test
    @DisplayName("Can receive uint112 max value from contract call")
    void canCallContractFunctionUint112Max() throws Exception {
        BigInteger uint112Max = new BigInteger("5192296858534827628530496329220095");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint112", new ContractFunctionParameters().addUint112(uint112Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(uint112Max);
    }

    @Test
    @DisplayName("Can receive uint112 array value from contract call")
    void canCallContractFunctionUint112Array() throws Exception {
        BigInteger uint112Min = BigInteger.ZERO;
        BigInteger uint112Max = new BigInteger("5192296858534827628530496329220095");
        BigInteger[] uint112Array = {uint112Min, uint112Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint112Arr", new ContractFunctionParameters().addUint112Array(uint112Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(uint112[])").get(0);

        assertThat(responseResult).isEqualTo(uint112Array);
    }

    @Test
    @DisplayName("Can receive uint120 min value from contract call")
    void canCallContractFunctionUint120Min() throws Exception {
        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint120", new ContractFunctionParameters().addUint120(BigInteger.ZERO))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(BigInteger.ZERO);
    }

    @Test
    @DisplayName("Can receive uint120 max value from contract call")
    void canCallContractFunctionUint120Max() throws Exception {
        BigInteger uint120Max = new BigInteger("1329227995784915872903807060280344575");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint120", new ContractFunctionParameters().addUint120(uint120Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(uint120Max);
    }

    @Test
    @DisplayName("Can receive uint120 array value from contract call")
    void canCallContractFunctionUint120Array() throws Exception {
        BigInteger uint120Min = BigInteger.ZERO;
        BigInteger uint120Max = new BigInteger("1329227995784915872903807060280344575");
        BigInteger[] uint120Array = {uint120Min, uint120Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint120Arr", new ContractFunctionParameters().addUint120Array(uint120Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(uint120[])").get(0);

        assertThat(responseResult).isEqualTo(uint120Array);
    }

    @Test
    @DisplayName("Can receive uint128 min value from contract call")
    void canCallContractFunctionUint128Min() throws Exception {
        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint128", new ContractFunctionParameters().addUint128(BigInteger.ZERO))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(BigInteger.ZERO);
    }

    @Test
    @DisplayName("Can receive uint128 max value from contract call")
    void canCallContractFunctionUint128Max() throws Exception {
        BigInteger uint128Max = new BigInteger("340282366920938463463374607431768211455");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint128", new ContractFunctionParameters().addUint128(uint128Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(uint128Max);
    }

    @Test
    @DisplayName("Can receive uint128 array value from contract call")
    void canCallContractFunctionUint128Array() throws Exception {
        BigInteger uint128Min = BigInteger.ZERO;
        BigInteger uint128Max = new BigInteger("340282366920938463463374607431768211455");
        BigInteger[] uint128Array = {uint128Min, uint128Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint128Arr", new ContractFunctionParameters().addUint128Array(uint128Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(uint128[])").get(0);

        assertThat(responseResult).isEqualTo(uint128Array);
    }

    @Test
    @DisplayName("Can receive uint136 min value from contract call")
    void canCallContractFunctionUint136Min() throws Exception {
        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint136", new ContractFunctionParameters().addUint136(BigInteger.ZERO))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(BigInteger.ZERO);
    }

    @Test
    @DisplayName("Can receive uint136 max value from contract call")
    void canCallContractFunctionUint136Max() throws Exception {
        BigInteger uint136Max = new BigInteger("87112285931760246646623899502532662132735");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint136", new ContractFunctionParameters().addUint136(uint136Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(uint136Max);
    }

    @Test
    @DisplayName("Can receive uint136 array value from contract call")
    void canCallContractFunctionUint136Array() throws Exception {
        BigInteger uint136Min = BigInteger.ZERO;
        BigInteger uint136Max = new BigInteger("87112285931760246646623899502532662132735");
        BigInteger[] uint136Array = {uint136Min, uint136Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint136Arr", new ContractFunctionParameters().addUint136Array(uint136Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(uint136[])").get(0);

        assertThat(responseResult).isEqualTo(uint136Array);
    }

    @Test
    @DisplayName("Can receive uint144 min value from contract call")
    void canCallContractFunctionUint144Min() throws Exception {
        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint144", new ContractFunctionParameters().addUint144(BigInteger.ZERO))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(BigInteger.ZERO);
    }

    @Test
    @DisplayName("Can receive uint144 max value from contract call")
    void canCallContractFunctionUint144Max() throws Exception {
        BigInteger uint144Max = new BigInteger("22300745198530623141535718272648361505980415");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint144", new ContractFunctionParameters().addUint144(uint144Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(uint144Max);
    }

    @Test
    @DisplayName("Can receive uint144 array value from contract call")
    void canCallContractFunctionUint144Array() throws Exception {
        BigInteger uint144Min = BigInteger.ZERO;
        BigInteger uint144Max = new BigInteger("22300745198530623141535718272648361505980415");
        BigInteger[] uint144Array = {uint144Min, uint144Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint144Arr", new ContractFunctionParameters().addUint144Array(uint144Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(uint144[])").get(0);

        assertThat(responseResult).isEqualTo(uint144Array);
    }

    @Test
    @DisplayName("Can receive uint152 min value from contract call")
    void canCallContractFunctionUint152Min() throws Exception {
        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint152", new ContractFunctionParameters().addUint152(BigInteger.ZERO))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(BigInteger.ZERO);
    }

    @Test
    @DisplayName("Can receive uint152 max value from contract call")
    void canCallContractFunctionUint152Max() throws Exception {
        BigInteger uint152Max = new BigInteger("5708990770823839524233143877797980545530986495");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint152", new ContractFunctionParameters().addUint152(uint152Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(uint152Max);
    }

    @Test
    @DisplayName("Can receive uint152 array value from contract call")
    void canCallContractFunctionUint152Array() throws Exception {
        BigInteger uint152Min = BigInteger.ZERO;
        BigInteger uint152Max = new BigInteger("5708990770823839524233143877797980545530986495");
        BigInteger[] uint152Array = {uint152Min, uint152Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint152Arr", new ContractFunctionParameters().addUint152Array(uint152Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(uint152[])").get(0);

        assertThat(responseResult).isEqualTo(uint152Array);
    }

    @Test
    @DisplayName("Can receive uint160 min value from contract call")
    void canCallContractFunctionUint160Min() throws Exception {
        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint160", new ContractFunctionParameters().addUint160(BigInteger.ZERO))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(BigInteger.ZERO);
    }

    @Test
    @DisplayName("Can receive uint160 max value from contract call")
    void canCallContractFunctionUint160Max() throws Exception {
        BigInteger uint160Max = new BigInteger("1461501637330902918203684832716283019655932542975");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint160", new ContractFunctionParameters().addUint160(uint160Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(uint160Max);
    }

    @Test
    @DisplayName("Can receive uint160 array value from contract call")
    void canCallContractFunctionUint160Array() throws Exception {
        BigInteger uint160Min = BigInteger.ZERO;
        BigInteger uint160Max = new BigInteger("1461501637330902918203684832716283019655932542975");
        BigInteger[] uint160Array = {uint160Min, uint160Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint160Arr", new ContractFunctionParameters().addUint160Array(uint160Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(uint160[])").get(0);

        assertThat(responseResult).isEqualTo(uint160Array);
    }

    @Test
    @DisplayName("Can receive uint168 min value from contract call")
    void canCallContractFunctionUint168Min() throws Exception {
        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint168", new ContractFunctionParameters().addUint168(BigInteger.ZERO))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(BigInteger.ZERO);
    }

    @Test
    @DisplayName("Can receive uint168 max value from contract call")
    void canCallContractFunctionUint168Max() throws Exception {
        BigInteger uint168Max = new BigInteger("374144419156711147060143317175368453031918731001855");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint168", new ContractFunctionParameters().addUint168(uint168Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(uint168Max);
    }

    @Test
    @DisplayName("Can receive uint168 array value from contract call")
    void canCallContractFunctionUint168Array() throws Exception {
        BigInteger uint168Min = BigInteger.ZERO;
        BigInteger uint168Max = new BigInteger("374144419156711147060143317175368453031918731001855");
        BigInteger[] uint168Array = {uint168Min, uint168Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint168Arr", new ContractFunctionParameters().addUint168Array(uint168Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(uint168[])").get(0);

        assertThat(responseResult).isEqualTo(uint168Array);
    }

    @Test
    @DisplayName("Can receive uint176 min value from contract call")
    void canCallContractFunctionUint176Min() throws Exception {
        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint176", new ContractFunctionParameters().addUint176(BigInteger.ZERO))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(BigInteger.ZERO);
    }

    @Test
    @DisplayName("Can receive uint176 max value from contract call")
    void canCallContractFunctionUint176Max() throws Exception {
        BigInteger uint176Max = new BigInteger("95780971304118053647396689196894323976171195136475135");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint176", new ContractFunctionParameters().addUint176(uint176Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(uint176Max);
    }

    @Test
    @DisplayName("Can receive uint176 array value from contract call")
    void canCallContractFunctionUint176Array() throws Exception {
        BigInteger uint176Min = BigInteger.ZERO;
        BigInteger uint176Max = new BigInteger("95780971304118053647396689196894323976171195136475135");
        BigInteger[] uint176Array = {uint176Min, uint176Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint176Arr", new ContractFunctionParameters().addUint176Array(uint176Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(uint176[])").get(0);

        assertThat(responseResult).isEqualTo(uint176Array);
    }

    @Test
    @DisplayName("Can receive uint184 min value from contract call")
    void canCallContractFunctionUint184Min() throws Exception {
        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint184", new ContractFunctionParameters().addUint184(BigInteger.ZERO))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(BigInteger.ZERO);
    }

    @Test
    @DisplayName("Can receive uint184 max value from contract call")
    void canCallContractFunctionUint184Max() throws Exception {
        BigInteger uint184Max = new BigInteger("24519928653854221733733552434404946937899825954937634815");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint184", new ContractFunctionParameters().addUint184(uint184Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(uint184Max);
    }

    @Test
    @DisplayName("Can receive uint184 array value from contract call")
    void canCallContractFunctionUint184Array() throws Exception {
        BigInteger uint184Min = BigInteger.ZERO;
        BigInteger uint184Max = new BigInteger("24519928653854221733733552434404946937899825954937634815");
        BigInteger[] uint184Array = {uint184Min, uint184Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint184Arr", new ContractFunctionParameters().addUint184Array(uint184Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(uint184[])").get(0);

        assertThat(responseResult).isEqualTo(uint184Array);
    }

    @Test
    @DisplayName("Can receive uint192 min value from contract call")
    void canCallContractFunctionUint192Min() throws Exception {
        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint192", new ContractFunctionParameters().addUint192(BigInteger.ZERO))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(BigInteger.ZERO);
    }

    @Test
    @DisplayName("Can receive uint192 max value from contract call")
    void canCallContractFunctionUint192Max() throws Exception {
        BigInteger uint192Max = new BigInteger("6277101735386680763835789423207666416102355444464034512895");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint192", new ContractFunctionParameters().addUint192(uint192Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(uint192Max);
    }

    @Test
    @DisplayName("Can receive uint192 array value from contract call")
    void canCallContractFunctionUint192Array() throws Exception {
        BigInteger uint192Min = BigInteger.ZERO;
        BigInteger uint192Max = new BigInteger("6277101735386680763835789423207666416102355444464034512895");
        BigInteger[] uint192Array = {uint192Min, uint192Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint192Arr", new ContractFunctionParameters().addUint192Array(uint192Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(uint192[])").get(0);

        assertThat(responseResult).isEqualTo(uint192Array);
    }

    @Test
    @DisplayName("Can receive uint200 min value from contract call")
    void canCallContractFunctionUint200Min() throws Exception {
        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint200", new ContractFunctionParameters().addUint200(BigInteger.ZERO))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(BigInteger.ZERO);
    }

    @Test
    @DisplayName("Can receive uint200 max value from contract call")
    void canCallContractFunctionUint200Max() throws Exception {
        BigInteger uint200Max = new BigInteger("1606938044258990275541962092341162602522202993782792835301375");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint200", new ContractFunctionParameters().addUint200(uint200Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(uint200Max);
    }

    @Test
    @DisplayName("Can receive uint200 array value from contract call")
    void canCallContractFunctionUint200Array() throws Exception {
        BigInteger uint200Min = BigInteger.ZERO;
        BigInteger uint200Max = new BigInteger("1606938044258990275541962092341162602522202993782792835301375");
        BigInteger[] uint200Array = {uint200Min, uint200Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint200Arr", new ContractFunctionParameters().addUint200Array(uint200Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(uint200[])").get(0);

        assertThat(responseResult).isEqualTo(uint200Array);
    }

    @Test
    @DisplayName("Can receive uint208 min value from contract call")
    void canCallContractFunctionUint208Min() throws Exception {
        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint208", new ContractFunctionParameters().addUint208(BigInteger.ZERO))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(BigInteger.ZERO);
    }

    @Test
    @DisplayName("Can receive uint208 max value from contract call")
    void canCallContractFunctionUint208Max() throws Exception {
        BigInteger uint208Max = new BigInteger("411376139330301510538742295639337626245683966408394965837152255");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint208", new ContractFunctionParameters().addUint208(uint208Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(uint208Max);
    }

    @Test
    @DisplayName("Can receive uint208 array value from contract call")
    void canCallContractFunctionUint208Array() throws Exception {
        BigInteger uint208Min = BigInteger.ZERO;
        BigInteger uint208Max = new BigInteger("411376139330301510538742295639337626245683966408394965837152255");
        BigInteger[] uint208Array = {uint208Min, uint208Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint208Arr", new ContractFunctionParameters().addUint208Array(uint208Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(uint208[])").get(0);

        assertThat(responseResult).isEqualTo(uint208Array);
    }

    @Test
    @DisplayName("Can receive uint216 min value from contract call")
    void canCallContractFunctionUint216Min() throws Exception {
        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint216", new ContractFunctionParameters().addUint216(BigInteger.ZERO))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(BigInteger.ZERO);
    }

    @Test
    @DisplayName("Can receive uint216 max value from contract call")
    void canCallContractFunctionUint216Max() throws Exception {
        BigInteger uint216Max = new BigInteger("105312291668557186697918027683670432318895095400549111254310977535");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint216", new ContractFunctionParameters().addUint216(uint216Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(uint216Max);
    }

    @Test
    @DisplayName("Can receive uint216 array value from contract call")
    void canCallContractFunctionUint216Array() throws Exception {
        BigInteger uint216Min = BigInteger.ZERO;
        BigInteger uint216Max = new BigInteger("105312291668557186697918027683670432318895095400549111254310977535");
        BigInteger[] uint216Array = {uint216Min, uint216Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint216Arr", new ContractFunctionParameters().addUint216Array(uint216Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(uint216[])").get(0);

        assertThat(responseResult).isEqualTo(uint216Array);
    }

    @Test
    @DisplayName("Can receive uint224 min value from contract call")
    void canCallContractFunctionUint224Min() throws Exception {
        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint224", new ContractFunctionParameters().addUint224(BigInteger.ZERO))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(BigInteger.ZERO);
    }

    @Test
    @DisplayName("Can receive uint224 max value from contract call")
    void canCallContractFunctionUint224Max() throws Exception {
        BigInteger uint224Max = new BigInteger("26959946667150639794667015087019630673637144422540572481103610249215");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint224", new ContractFunctionParameters().addUint224(uint224Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(uint224Max);
    }

    @Test
    @DisplayName("Can receive uint224 array value from contract call")
    void canCallContractFunctionUint224Array() throws Exception {
        BigInteger uint224Min = BigInteger.ZERO;
        BigInteger uint224Max = new BigInteger("26959946667150639794667015087019630673637144422540572481103610249215");
        BigInteger[] uint224Array = {uint224Min, uint224Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint224Arr", new ContractFunctionParameters().addUint224Array(uint224Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(uint224[])").get(0);

        assertThat(responseResult).isEqualTo(uint224Array);
    }

    @Test
    @DisplayName("Can receive uint232 min value from contract call")
    void canCallContractFunctionUint232Min() throws Exception {
        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint232", new ContractFunctionParameters().addUint232(BigInteger.ZERO))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(BigInteger.ZERO);
    }

    @Test
    @DisplayName("Can receive uint232 max value from contract call")
    void canCallContractFunctionUint232Max() throws Exception {
        BigInteger uint232Max = new BigInteger(
            "6901746346790563787434755862277025452451108972170386555162524223799295");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint232", new ContractFunctionParameters().addUint232(uint232Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(uint232Max);
    }

    @Test
    @DisplayName("Can receive uint232 array value from contract call")
    void canCallContractFunctionUint232Array() throws Exception {
        BigInteger uint232Min = BigInteger.ZERO;
        BigInteger uint232Max = new BigInteger(
            "6901746346790563787434755862277025452451108972170386555162524223799295");
        BigInteger[] uint232Array = {uint232Min, uint232Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint232Arr", new ContractFunctionParameters().addUint232Array(uint232Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(uint232[])").get(0);

        assertThat(responseResult).isEqualTo(uint232Array);
    }

    @Test
    @DisplayName("Can receive uint240 min value from contract call")
    void canCallContractFunctionUint240Min() throws Exception {
        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint240", new ContractFunctionParameters().addUint240(BigInteger.ZERO))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(BigInteger.ZERO);
    }

    @Test
    @DisplayName("Can receive uint240 max value from contract call")
    void canCallContractFunctionUint240Max() throws Exception {
        BigInteger uint240Max = new BigInteger(
            "1766847064778384329583297500742918515827483896875618958121606201292619775");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint240", new ContractFunctionParameters().addUint240(uint240Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(uint240Max);
    }

    @Test
    @DisplayName("Can receive uint240 array value from contract call")
    void canCallContractFunctionUint240Array() throws Exception {
        BigInteger uint240Min = BigInteger.ZERO;
        BigInteger uint240Max = new BigInteger(
            "1766847064778384329583297500742918515827483896875618958121606201292619775");
        BigInteger[] uint240Array = {uint240Min, uint240Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint240Arr", new ContractFunctionParameters().addUint240Array(uint240Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(uint240[])").get(0);

        assertThat(responseResult).isEqualTo(uint240Array);
    }

    @Test
    @DisplayName("Can receive uint248 min value from contract call")
    void canCallContractFunctionUint248Min() throws Exception {
        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint248", new ContractFunctionParameters().addUint248(BigInteger.ZERO))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(BigInteger.ZERO);
    }

    @Test
    @DisplayName("Can receive uint248 max value from contract call")
    void canCallContractFunctionUint248Max() throws Exception {
        BigInteger uint248Max = new BigInteger(
            "452312848583266388373324160190187140051835877600158453279131187530910662655");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint248", new ContractFunctionParameters().addUint248(uint248Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(uint248Max);
    }

    @Test
    @DisplayName("Can receive uint248 array value from contract call")
    void canCallContractFunctionUint248Array() throws Exception {
        BigInteger uint248Min = BigInteger.ZERO;
        BigInteger uint248Max = new BigInteger(
            "452312848583266388373324160190187140051835877600158453279131187530910662655");
        BigInteger[] uint248Array = {uint248Min, uint248Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint248Arr", new ContractFunctionParameters().addUint248Array(uint248Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(uint248[])").get(0);

        assertThat(responseResult).isEqualTo(uint248Array);
    }

    @Test
    @DisplayName("Can receive uint256 min value from contract call")
    void canCallContractFunctionUint256Min() throws Exception {
        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint256", new ContractFunctionParameters().addUint256(BigInteger.ZERO))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(BigInteger.ZERO);
    }

    @Test
    @DisplayName("Can receive uint256 max value from contract call")
    void canCallContractFunctionUint256Max() throws Exception {
        BigInteger uint256Max = new BigInteger("2").pow(256).subtract(BigInteger.ONE);

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint256", new ContractFunctionParameters().addUint256(uint256Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint256(0)).isEqualTo(uint256Max);
    }

    @Test
    @DisplayName("Can receive uint256 array value from contract call")
    void canCallContractFunctionUint256Array() throws Exception {
        BigInteger uint256Min = BigInteger.ZERO;
        BigInteger uint256Max = new BigInteger("2").pow(256).subtract(BigInteger.ONE);
        BigInteger[] uint256Array = {uint256Min, uint256Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint256Arr", new ContractFunctionParameters().addUint256Array(uint256Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(uint256[])").get(0);

        assertThat(responseResult).isEqualTo(uint256Array);
    }

    @Test
    @DisplayName("Can receive int8 min value from contract call")
    void canCallContractFunctionInt8Min() throws Exception {
        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt8", new ContractFunctionParameters().addInt8(Byte.MIN_VALUE))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt8(0)).isEqualTo(Byte.MIN_VALUE);
    }

    @Test
    @DisplayName("Can receive int8 max value from contract call")
    void canCallContractFunctionInt8Max() throws Exception {
        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt8", new ContractFunctionParameters().addInt8(Byte.MAX_VALUE))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt8(0)).isEqualTo(Byte.MAX_VALUE);
    }

    @Test
    @DisplayName("Can receive int8 array value from contract call")
    void canCallContractFunctionInt8Array() throws Exception {
        byte[] int8Array = {Byte.MIN_VALUE, Byte.MAX_VALUE};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt8Arr", new ContractFunctionParameters().addInt8Array(int8Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (int[]) response.getResult("(int8[])").get(0);

        assertThat(responseResult[0]).isEqualTo(int8Array[0]);
        assertThat(responseResult[1]).isEqualTo(int8Array[1]);
    }

    @Test
    @DisplayName("Can receive int16 min value from contract call")
    void canCallContractFunctionInt16Min() throws Exception {
        int int16Min = -32768;

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt16", new ContractFunctionParameters().addInt16(int16Min))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt32(0)).isEqualTo(int16Min);
    }

    @Test
    @DisplayName("Can receive int16 max value from contract call")
    void canCallContractFunctionInt16Max() throws Exception {
        int int16Max = 32767;

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt16", new ContractFunctionParameters().addInt16(int16Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt32(0)).isEqualTo(int16Max);
    }

    @Test
    @DisplayName("Can receive int16 array value from contract call")
    void canCallContractFunctionInt16Array() throws Exception {
        int int16Min = -32768;
        int int16Max = 32767;
        int[] int16Array = {int16Min, int16Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt16Arr", new ContractFunctionParameters().addInt16Array(int16Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (int[]) response.getResult("(int16[])").get(0);

        assertThat(responseResult).isEqualTo(int16Array);
    }

    @Test
    @DisplayName("Can receive int24 min value from contract call")
    void canCallContractFunctionInt24Min() throws Exception {
        int int24Min = -8388608;

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt24", new ContractFunctionParameters().addInt24(int24Min))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt32(0)).isEqualTo(int24Min);
    }

    @Test
    @DisplayName("Can receive int24 max value from contract call")
    void canCallContractFunctionInt24Max() throws Exception {
        int int24Max = 8388607;

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt24", new ContractFunctionParameters().addInt24(int24Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt32(0)).isEqualTo(int24Max);
    }

    @Test
    @DisplayName("Can receive int24 array value from contract call")
    void canCallContractFunctionInt24Array() throws Exception {
        int int24Min = -8388608;
        int int24Max = 8388607;
        int[] int24Array = {int24Min, int24Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt24Arr", new ContractFunctionParameters().addInt24Array(int24Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (int[]) response.getResult("(int24[])").get(0);

        assertThat(responseResult).isEqualTo(int24Array);
    }

    @Test
    @DisplayName("Can receive int32 min value from contract call")
    void canCallContractFunctionInt32Min() throws Exception {
        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt32", new ContractFunctionParameters().addInt32(Integer.MIN_VALUE))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt32(0)).isEqualTo(Integer.MIN_VALUE);
    }

    @Test
    @DisplayName("Can receive int32 max value from contract call")
    void canCallContractFunctionInt32Max() throws Exception {
        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt32", new ContractFunctionParameters().addInt32(Integer.MAX_VALUE))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt32(0)).isEqualTo(Integer.MAX_VALUE);
    }

    @Test
    @DisplayName("Can receive int32 array value from contract call")
    void canCallContractFunctionInt32Array() throws Exception {
        int int32Min = Integer.MIN_VALUE;
        int int32Max = Integer.MAX_VALUE;
        int[] int32Array = {int32Min, int32Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt32Arr", new ContractFunctionParameters().addInt32Array(int32Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (int[]) response.getResult("(int32[])").get(0);

        assertThat(responseResult).isEqualTo(int32Array);
    }

    @Test
    @DisplayName("Can receive int40 min value from contract call")
    void canCallContractFunctionInt40Min() throws Exception {
        long int40Min = -549755813888L;

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt40", new ContractFunctionParameters().addInt40(int40Min))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt64(0)).isEqualTo(int40Min);
    }

    @Test
    @DisplayName("Can receive int40 max value from contract call")
    void canCallContractFunctionInt40Max() throws Exception {
        long int40Max = 549755813887L;

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt40", new ContractFunctionParameters().addInt40(int40Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt64(0)).isEqualTo(int40Max);
    }

    @Test
    @DisplayName("Can receive int40 array value from contract call")
    void canCallContractFunctionInt40Array() throws Exception {
        long int40Min = -549755813888L;
        long int40Max = 549755813887L;
        long[] int40Array = {int40Min, int40Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt40Arr", new ContractFunctionParameters().addInt40Array(int40Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (long[]) response.getResult("(int40[])").get(0);

        assertThat(responseResult).isEqualTo(int40Array);
    }

    @Test
    @DisplayName("Can receive int48 min value from contract call")
    void canCallContractFunctionInt48Min() throws Exception {
        long int48Min = -140737488355328L;

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt48", new ContractFunctionParameters().addInt48(int48Min))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt64(0)).isEqualTo(int48Min);
    }

    @Test
    @DisplayName("Can receive int48 max value from contract call")
    void canCallContractFunctionInt48Max() throws Exception {
        long int48Max = 140737488355327L;

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt48", new ContractFunctionParameters().addInt48(int48Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt64(0)).isEqualTo(int48Max);
    }

    @Test
    @DisplayName("Can receive int48 array value from contract call")
    void canCallContractFunctionInt48Array() throws Exception {
        long int48Min = -140737488355328L;
        long int48Max = 140737488355327L;
        long[] int48Array = {int48Min, int48Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt48Arr", new ContractFunctionParameters().addInt48Array(int48Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (long[]) response.getResult("(int48[])").get(0);

        assertThat(responseResult).isEqualTo(int48Array);
    }

    @Test
    @DisplayName("Can receive int56 min value from contract call")
    void canCallContractFunctionInt56Min() throws Exception {
        long int56Min = -36028797018963968L;

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt56", new ContractFunctionParameters().addInt56(int56Min))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt64(0)).isEqualTo(int56Min);
    }

    @Test
    @DisplayName("Can receive int56 max value from contract call")
    void canCallContractFunctionInt56Max() throws Exception {
        long int56Max = 36028797018963967L;

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt56", new ContractFunctionParameters().addInt56(int56Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt64(0)).isEqualTo(int56Max);
    }

    @Test
    @DisplayName("Can receive int56 array value from contract call")
    void canCallContractFunctionInt56Array() throws Exception {
        long int56Min = -36028797018963968L;
        long int56Max = 36028797018963967L;
        long[] int56Array = {int56Min, int56Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt56Arr", new ContractFunctionParameters().addInt56Array(int56Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (long[]) response.getResult("(int56[])").get(0);

        assertThat(responseResult).isEqualTo(int56Array);
    }

    @Test
    @DisplayName("Can receive int64 min value from contract call")
    void canCallContractFunctionInt64Min() throws Exception {
        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt64", new ContractFunctionParameters().addInt64(Long.MIN_VALUE))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint64(0)).isEqualTo(Long.MIN_VALUE);
    }

    @Test
    @DisplayName("Can receive int64 max value from contract call")
    void canCallContractFunctionInt64Max() throws Exception {
        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnUint64", new ContractFunctionParameters().addUint64(Long.MAX_VALUE))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getUint64(0)).isEqualTo(Long.MAX_VALUE);
    }

    @Test
    @DisplayName("Can receive int64 array value from contract call")
    void canCallContractFunctionInt64Array() throws Exception {
        long int64Min = Long.MIN_VALUE;
        long int64Max = Long.MAX_VALUE;
        long[] int64Array = {int64Min, int64Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt64Arr", new ContractFunctionParameters().addInt64Array(int64Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (long[]) response.getResult("(int64[])").get(0);

        assertThat(responseResult).isEqualTo(int64Array);
    }

    @Test
    @DisplayName("Can receive int72 min value from contract call")
    void canCallContractFunctionInt72Min() throws Exception {
        BigInteger int72Min = new BigInteger("-2361183241434822606848");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt72", new ContractFunctionParameters().addInt72(int72Min))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int72Min);
    }

    @Test
    @DisplayName("Can receive int72 max value from contract call")
    void canCallContractFunctionInt72Max() throws Exception {
        BigInteger int72Max = new BigInteger("2361183241434822606847");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt72", new ContractFunctionParameters().addInt72(int72Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int72Max);
    }

    @Test
    @DisplayName("Can receive int72 array value from contract call")
    void canCallContractFunctionInt72Array() throws Exception {
        BigInteger int72Min = new BigInteger("-2361183241434822606848");
        BigInteger int72Max = new BigInteger("2361183241434822606847");
        BigInteger[] int72Array = {int72Min, int72Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt72Arr", new ContractFunctionParameters().addInt72Array(int72Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(int72[])").get(0);

        assertThat(responseResult).isEqualTo(int72Array);
    }

    @Test
    @DisplayName("Can receive int80 min value from contract call")
    void canCallContractFunctionInt80Min() throws Exception {
        BigInteger int80Min = new BigInteger("-604462909807314587353088");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt80", new ContractFunctionParameters().addInt80(int80Min))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int80Min);
    }

    @Test
    @DisplayName("Can receive int80 max value from contract call")
    void canCallContractFunctionInt80Max() throws Exception {
        BigInteger int80Max = new BigInteger("604462909807314587353087");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt80", new ContractFunctionParameters().addInt80(int80Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int80Max);
    }

    @Test
    @DisplayName("Can receive int80 array value from contract call")
    void canCallContractFunctionInt80Array() throws Exception {
        BigInteger int80Min = new BigInteger("-604462909807314587353088");
        BigInteger int80Max = new BigInteger("604462909807314587353087");
        BigInteger[] int80Array = {int80Min, int80Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt80Arr", new ContractFunctionParameters().addInt80Array(int80Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(int80[])").get(0);

        assertThat(responseResult).isEqualTo(int80Array);
    }

    @Test
    @DisplayName("Can receive int88 min value from contract call")
    void canCallContractFunctionInt88Min() throws Exception {
        BigInteger int88Min = new BigInteger("-154742504910672534362390528");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt88", new ContractFunctionParameters().addInt88(int88Min))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int88Min);
    }

    @Test
    @DisplayName("Can receive int88 max value from contract call")
    void canCallContractFunctionInt88Max() throws Exception {
        BigInteger int88Max = new BigInteger("154742504910672534362390527");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt88", new ContractFunctionParameters().addInt88(int88Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int88Max);
    }

    @Test
    @DisplayName("Can receive int88 array value from contract call")
    void canCallContractFunctionInt88Array() throws Exception {
        BigInteger int88Min = new BigInteger("-154742504910672534362390528");
        BigInteger int88Max = new BigInteger("154742504910672534362390527");
        BigInteger[] int88Array = {int88Min, int88Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt88Arr", new ContractFunctionParameters().addInt88Array(int88Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(int88[])").get(0);

        assertThat(responseResult).isEqualTo(int88Array);
    }

    @Test
    @DisplayName("Can receive int96 min value from contract call")
    void canCallContractFunctionInt96Min() throws Exception {
        BigInteger int96Min = new BigInteger("-39614081257132168796771975168");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt96", new ContractFunctionParameters().addInt96(int96Min))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int96Min);
    }

    @Test
    @DisplayName("Can receive int96 max value from contract call")
    void canCallContractFunctionInt96Max() throws Exception {
        BigInteger int96Max = new BigInteger("39614081257132168796771975167");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt96", new ContractFunctionParameters().addInt96(int96Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int96Max);
    }

    @Test
    @DisplayName("Can receive int96 array value from contract call")
    void canCallContractFunctionInt96Array() throws Exception {
        BigInteger int96Min = new BigInteger("-39614081257132168796771975168");
        BigInteger int96Max = new BigInteger("39614081257132168796771975167");
        BigInteger[] int96Array = {int96Min, int96Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt96Arr", new ContractFunctionParameters().addInt96Array(int96Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(int96[])").get(0);

        assertThat(responseResult).isEqualTo(int96Array);
    }

    @Test
    @DisplayName("Can receive int104 min value from contract call")
    void canCallContractFunctionInt104Min() throws Exception {
        BigInteger int104Min = new BigInteger("-10141204801825835211973625643008");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt104", new ContractFunctionParameters().addInt104(int104Min))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int104Min);
    }

    @Test
    @DisplayName("Can receive int104 max value from contract call")
    void canCallContractFunctionInt104Max() throws Exception {
        BigInteger int104Max = new BigInteger("10141204801825835211973625643007");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt104", new ContractFunctionParameters().addInt104(int104Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int104Max);
    }

    @Test
    @DisplayName("Can receive int104 array value from contract call")
    void canCallContractFunctionInt104Array() throws Exception {
        BigInteger int104Min = new BigInteger("-10141204801825835211973625643008");
        BigInteger int104Max = new BigInteger("10141204801825835211973625643007");
        BigInteger[] int104Array = {int104Min, int104Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt104Arr", new ContractFunctionParameters().addInt104Array(int104Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(int104[])").get(0);

        assertThat(responseResult).isEqualTo(int104Array);
    }

    @Test
    @DisplayName("Can receive int112 min value from contract call")
    void canCallContractFunctionInt112Min() throws Exception {
        BigInteger int112Min = new BigInteger("-2596148429267413814265248164610048");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt112", new ContractFunctionParameters().addInt112(int112Min))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int112Min);
    }

    @Test
    @DisplayName("Can receive int112 max value from contract call")
    void canCallContractFunctionInt112Max() throws Exception {
        BigInteger int112Max = new BigInteger("2596148429267413814265248164610047");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt112", new ContractFunctionParameters().addInt112(int112Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int112Max);
    }

    @Test
    @DisplayName("Can receive int112 array value from contract call")
    void canCallContractFunctionInt112Array() throws Exception {
        BigInteger int112Min = new BigInteger("-2596148429267413814265248164610048");
        BigInteger int112Max = new BigInteger("2596148429267413814265248164610047");
        BigInteger[] int112Array = {int112Min, int112Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt112Arr", new ContractFunctionParameters().addInt112Array(int112Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(int112[])").get(0);

        assertThat(responseResult).isEqualTo(int112Array);
    }

    @Test
    @DisplayName("Can receive int120 min value from contract call")
    void canCallContractFunctionInt120Min() throws Exception {
        BigInteger int120Min = new BigInteger("-664613997892457936451903530140172288");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt120", new ContractFunctionParameters().addInt120(int120Min))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int120Min);
    }

    @Test
    @DisplayName("Can receive int120 max value from contract call")
    void canCallContractFunctionInt120Max() throws Exception {
        BigInteger int120Max = new BigInteger("664613997892457936451903530140172287");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt120", new ContractFunctionParameters().addInt120(int120Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int120Max);
    }

    @Test
    @DisplayName("Can receive int120 array value from contract call")
    void canCallContractFunctionInt120Array() throws Exception {
        BigInteger int120Min = new BigInteger("-664613997892457936451903530140172288");
        BigInteger int120Max = new BigInteger("664613997892457936451903530140172287");
        BigInteger[] int120Array = {int120Min, int120Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt120Arr", new ContractFunctionParameters().addInt120Array(int120Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(int120[])").get(0);

        assertThat(responseResult).isEqualTo(int120Array);
    }

    @Test
    @DisplayName("Can receive int128 min value from contract call")
    void canCallContractFunctionInt128Min() throws Exception {
        BigInteger int128Min = new BigInteger("-170141183460469231731687303715884105728");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt128", new ContractFunctionParameters().addInt128(int128Min))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int128Min);
    }

    @Test
    @DisplayName("Can receive int128 max value from contract call")
    void canCallContractFunctionInt128Max() throws Exception {
        BigInteger int128Max = new BigInteger("170141183460469231731687303715884105727");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt128", new ContractFunctionParameters().addInt128(int128Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int128Max);
    }

    @Test
    @DisplayName("Can receive int128 array value from contract call")
    void canCallContractFunctionInt128Array() throws Exception {
        BigInteger int128Min = new BigInteger("-170141183460469231731687303715884105728");
        BigInteger int128Max = new BigInteger("170141183460469231731687303715884105727");
        BigInteger[] int128Array = {int128Min, int128Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt128Arr", new ContractFunctionParameters().addInt128Array(int128Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(int128[])").get(0);

        assertThat(responseResult).isEqualTo(int128Array);
    }

    @Test
    @DisplayName("Can receive int136 min value from contract call")
    void canCallContractFunctionInt136Min() throws Exception {
        BigInteger int136Min = new BigInteger("-43556142965880123323311949751266331066368");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt136", new ContractFunctionParameters().addInt136(int136Min))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int136Min);
    }

    @Test
    @DisplayName("Can receive int136 max value from contract call")
    void canCallContractFunctionInt136Max() throws Exception {
        BigInteger int136Max = new BigInteger("43556142965880123323311949751266331066367");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt136", new ContractFunctionParameters().addInt136(int136Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int136Max);
    }

    @Test
    @DisplayName("Can receive int136 array value from contract call")
    void canCallContractFunctionInt136Array() throws Exception {
        BigInteger int136Min = new BigInteger("-43556142965880123323311949751266331066368");
        BigInteger int136Max = new BigInteger("43556142965880123323311949751266331066367");
        BigInteger[] int136Array = {int136Min, int136Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt136Arr", new ContractFunctionParameters().addInt136Array(int136Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(int136[])").get(0);

        assertThat(responseResult).isEqualTo(int136Array);
    }

    @Test
    @DisplayName("Can receive int144 min value from contract call")
    void canCallContractFunctionInt144Min() throws Exception {
        BigInteger int144Min = new BigInteger("-11150372599265311570767859136324180752990208");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt144", new ContractFunctionParameters().addInt144(int144Min))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int144Min);
    }

    @Test
    @DisplayName("Can receive int144 max value from contract call")
    void canCallContractFunctionInt144Max() throws Exception {
        BigInteger int144Max = new BigInteger("11150372599265311570767859136324180752990207");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt144", new ContractFunctionParameters().addInt144(int144Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int144Max);
    }

    @Test
    @DisplayName("Can receive int144 array value from contract call")
    void canCallContractFunctionInt144Array() throws Exception {
        BigInteger int144Min = new BigInteger("-11150372599265311570767859136324180752990208");
        BigInteger int144Max = new BigInteger("11150372599265311570767859136324180752990207");
        BigInteger[] int144Array = {int144Min, int144Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt144Arr", new ContractFunctionParameters().addInt144Array(int144Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(int144[])").get(0);

        assertThat(responseResult).isEqualTo(int144Array);
    }

    @Test
    @DisplayName("Can receive int152 min value from contract call")
    void canCallContractFunctionInt152Min() throws Exception {
        BigInteger int152Min = new BigInteger("-2854495385411919762116571938898990272765493248");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt152", new ContractFunctionParameters().addInt152(int152Min))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int152Min);
    }

    @Test
    @DisplayName("Can receive int152 max value from contract call")
    void canCallContractFunctionInt152Max() throws Exception {
        BigInteger int152Max = new BigInteger("2854495385411919762116571938898990272765493247");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt152", new ContractFunctionParameters().addInt152(int152Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int152Max);
    }

    @Test
    @DisplayName("Can receive int152 array value from contract call")
    void canCallContractFunctionInt152Array() throws Exception {
        BigInteger int152Min = new BigInteger("-2854495385411919762116571938898990272765493248");
        BigInteger int152Max = new BigInteger("2854495385411919762116571938898990272765493247");
        BigInteger[] int152Array = {int152Min, int152Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt152Arr", new ContractFunctionParameters().addInt152Array(int152Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(int152[])").get(0);

        assertThat(responseResult).isEqualTo(int152Array);
    }

    @Test
    @DisplayName("Can receive int160 min value from contract call")
    void canCallContractFunctionInt160Min() throws Exception {
        BigInteger int160Min = new BigInteger("-730750818665451459101842416358141509827966271488");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt160", new ContractFunctionParameters().addInt160(int160Min))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int160Min);
    }

    @Test
    @DisplayName("Can receive int160 max value from contract call")
    void canCallContractFunctionInt160Max() throws Exception {
        BigInteger int160Max = new BigInteger("730750818665451459101842416358141509827966271487");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt160", new ContractFunctionParameters().addInt160(int160Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int160Max);
    }

    @Test
    @DisplayName("Can receive int160 array value from contract call")
    void canCallContractFunctionInt160Array() throws Exception {
        BigInteger int160Min = new BigInteger("-730750818665451459101842416358141509827966271488");
        BigInteger int160Max = new BigInteger("730750818665451459101842416358141509827966271487");
        BigInteger[] int160Array = {int160Min, int160Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt160Arr", new ContractFunctionParameters().addInt160Array(int160Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(int160[])").get(0);

        assertThat(responseResult).isEqualTo(int160Array);
    }

    @Test
    @DisplayName("Can receive int168 min value from contract call")
    void canCallContractFunctionInt168Min() throws Exception {
        BigInteger int168Min = new BigInteger("-187072209578355573530071658587684226515959365500928");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt168", new ContractFunctionParameters().addInt168(int168Min))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int168Min);
    }

    @Test
    @DisplayName("Can receive int168 max value from contract call")
    void canCallContractFunctionInt168Max() throws Exception {
        BigInteger int168Max = new BigInteger("187072209578355573530071658587684226515959365500927");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt168", new ContractFunctionParameters().addInt168(int168Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int168Max);
    }

    @Test
    @DisplayName("Can receive int168 array value from contract call")
    void canCallContractFunctionInt168Array() throws Exception {
        BigInteger int168Min = new BigInteger("-187072209578355573530071658587684226515959365500928");
        BigInteger int168Max = new BigInteger("187072209578355573530071658587684226515959365500927");
        BigInteger[] int168Array = {int168Min, int168Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt168Arr", new ContractFunctionParameters().addInt168Array(int168Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(int168[])").get(0);

        assertThat(responseResult).isEqualTo(int168Array);
    }

    @Test
    @DisplayName("Can receive int176 min value from contract call")
    void canCallContractFunctionInt176Min() throws Exception {
        BigInteger int176Min = new BigInteger("-47890485652059026823698344598447161988085597568237568");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt176", new ContractFunctionParameters().addInt176(int176Min))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int176Min);
    }

    @Test
    @DisplayName("Can receive int176 max value from contract call")
    void canCallContractFunctionInt176Max() throws Exception {
        BigInteger int176Max = new BigInteger("47890485652059026823698344598447161988085597568237567");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt176", new ContractFunctionParameters().addInt176(int176Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int176Max);
    }

    @Test
    @DisplayName("Can receive int176 array value from contract call")
    void canCallContractFunctionInt176Array() throws Exception {
        BigInteger int176Min = new BigInteger("-47890485652059026823698344598447161988085597568237568");
        BigInteger int176Max = new BigInteger("47890485652059026823698344598447161988085597568237567");
        BigInteger[] int176Array = {int176Min, int176Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt176Arr", new ContractFunctionParameters().addInt176Array(int176Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(int176[])").get(0);

        assertThat(responseResult).isEqualTo(int176Array);
    }

    @Test
    @DisplayName("Can receive int184 min value from contract call")
    void canCallContractFunctionInt184Min() throws Exception {
        BigInteger int184Min = new BigInteger("-12259964326927110866866776217202473468949912977468817408");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt184", new ContractFunctionParameters().addInt184(int184Min))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int184Min);
    }

    @Test
    @DisplayName("Can receive int184 max value from contract call")
    void canCallContractFunctionInt184Max() throws Exception {
        BigInteger int184Max = new BigInteger("12259964326927110866866776217202473468949912977468817407");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt184", new ContractFunctionParameters().addInt184(int184Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int184Max);
    }

    @Test
    @DisplayName("Can receive int184 array value from contract call")
    void canCallContractFunctionInt184Array() throws Exception {
        BigInteger int184Min = new BigInteger("-12259964326927110866866776217202473468949912977468817408");
        BigInteger int184Max = new BigInteger("12259964326927110866866776217202473468949912977468817407");
        BigInteger[] int184Array = {int184Min, int184Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt184Arr", new ContractFunctionParameters().addInt184Array(int184Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(int184[])").get(0);

        assertThat(responseResult).isEqualTo(int184Array);
    }

    @Test
    @DisplayName("Can receive int192 min value from contract call")
    void canCallContractFunctionInt192Min() throws Exception {
        BigInteger int192Min = new BigInteger("-3138550867693340381917894711603833208051177722232017256448");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt192", new ContractFunctionParameters().addInt192(int192Min))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int192Min);
    }

    @Test
    @DisplayName("Can receive int192 max value from contract call")
    void canCallContractFunctionInt192Max() throws Exception {
        BigInteger int192Max = new BigInteger("3138550867693340381917894711603833208051177722232017256447");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt192", new ContractFunctionParameters().addInt192(int192Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int192Max);
    }

    @Test
    @DisplayName("Can receive int192 array value from contract call")
    void canCallContractFunctionInt192Array() throws Exception {
        BigInteger int192Min = new BigInteger("-3138550867693340381917894711603833208051177722232017256448");
        BigInteger int192Max = new BigInteger("3138550867693340381917894711603833208051177722232017256447");
        BigInteger[] int192Array = {int192Min, int192Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt192Arr", new ContractFunctionParameters().addInt192Array(int192Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(int192[])").get(0);

        assertThat(responseResult).isEqualTo(int192Array);
    }

    @Test
    @DisplayName("Can receive int200 min value from contract call")
    void canCallContractFunctionInt200Min() throws Exception {
        BigInteger int200Min = new BigInteger("-803469022129495137770981046170581301261101496891396417650688");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt200", new ContractFunctionParameters().addInt200(int200Min))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int200Min);
    }

    @Test
    @DisplayName("Can receive int200 max value from contract call")
    void canCallContractFunctionInt200Max() throws Exception {
        BigInteger int200Max = new BigInteger("803469022129495137770981046170581301261101496891396417650687");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt200", new ContractFunctionParameters().addInt200(int200Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int200Max);
    }

    @Test
    @DisplayName("Can receive int200 array value from contract call")
    void canCallContractFunctionInt200Array() throws Exception {
        BigInteger int200Min = new BigInteger("-803469022129495137770981046170581301261101496891396417650688");
        BigInteger int200Max = new BigInteger("803469022129495137770981046170581301261101496891396417650687");
        BigInteger[] int200Array = {int200Min, int200Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt200Arr", new ContractFunctionParameters().addInt200Array(int200Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(int200[])").get(0);

        assertThat(responseResult).isEqualTo(int200Array);
    }

    @Test
    @DisplayName("Can receive int208 min value from contract call")
    void canCallContractFunctionInt208Min() throws Exception {
        BigInteger int208Min = new BigInteger("-205688069665150755269371147819668813122841983204197482918576128");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt208", new ContractFunctionParameters().addInt208(int208Min))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int208Min);
    }

    @Test
    @DisplayName("Can receive int208 max value from contract call")
    void canCallContractFunctionInt208Max() throws Exception {
        BigInteger int208Max = new BigInteger("205688069665150755269371147819668813122841983204197482918576127");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt208", new ContractFunctionParameters().addInt208(int208Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int208Max);
    }

    @Test
    @DisplayName("Can receive int208 array value from contract call")
    void canCallContractFunctionInt208Array() throws Exception {
        BigInteger int208Min = new BigInteger("-205688069665150755269371147819668813122841983204197482918576128");
        BigInteger int208Max = new BigInteger("205688069665150755269371147819668813122841983204197482918576127");
        BigInteger[] int208Array = {int208Min, int208Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt208Arr", new ContractFunctionParameters().addInt208Array(int208Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(int208[])").get(0);

        assertThat(responseResult).isEqualTo(int208Array);
    }

    @Test
    @DisplayName("Can receive int216 min value from contract call")
    void canCallContractFunctionInt216Min() throws Exception {
        BigInteger int216Min = new BigInteger("-52656145834278593348959013841835216159447547700274555627155488768");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt216", new ContractFunctionParameters().addInt216(int216Min))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int216Min);
    }

    @Test
    @DisplayName("Can receive int216 max value from contract call")
    void canCallContractFunctionInt216Max() throws Exception {
        BigInteger int216Max = new BigInteger("52656145834278593348959013841835216159447547700274555627155488767");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt216", new ContractFunctionParameters().addInt216(int216Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int216Max);
    }

    @Test
    @DisplayName("Can receive int216 array value from contract call")
    void canCallContractFunctionInt216Array() throws Exception {
        BigInteger int216Min = new BigInteger("-52656145834278593348959013841835216159447547700274555627155488768");
        BigInteger int216Max = new BigInteger("52656145834278593348959013841835216159447547700274555627155488767");
        BigInteger[] int216Array = {int216Min, int216Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt216Arr", new ContractFunctionParameters().addInt216Array(int216Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(int216[])").get(0);

        assertThat(responseResult).isEqualTo(int216Array);
    }

    @Test
    @DisplayName("Can receive int224 min value from contract call")
    void canCallContractFunctionInt224Min() throws Exception {
        BigInteger int224Min = new BigInteger("-13479973333575319897333507543509815336818572211270286240551805124608");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt224", new ContractFunctionParameters().addInt224(int224Min))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int224Min);
    }

    @Test
    @DisplayName("Can receive int224 max value from contract call")
    void canCallContractFunctionInt224Max() throws Exception {
        BigInteger int224Max = new BigInteger("13479973333575319897333507543509815336818572211270286240551805124607");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt224", new ContractFunctionParameters().addInt224(int224Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int224Max);
    }

    @Test
    @DisplayName("Can receive int224 array value from contract call")
    void canCallContractFunctionInt224Array() throws Exception {
        BigInteger int224Min = new BigInteger("-13479973333575319897333507543509815336818572211270286240551805124608");
        BigInteger int224Max = new BigInteger("13479973333575319897333507543509815336818572211270286240551805124607");
        BigInteger[] int224Array = {int224Min, int224Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt224Arr", new ContractFunctionParameters().addInt224Array(int224Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(int224[])").get(0);

        assertThat(responseResult).isEqualTo(int224Array);
    }

    @Test
    @DisplayName("Can receive int232 min value from contract call")
    void canCallContractFunctionInt232Min() throws Exception {
        BigInteger int232Min = new BigInteger(
            "-3450873173395281893717377931138512726225554486085193277581262111899648");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt232", new ContractFunctionParameters().addInt232(int232Min))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int232Min);
    }

    @Test
    @DisplayName("Can receive int232 max value from contract call")
    void canCallContractFunctionInt232Max() throws Exception {
        BigInteger int232Max = new BigInteger("3450873173395281893717377931138512726225554486085193277581262111899647");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt232", new ContractFunctionParameters().addInt232(int232Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int232Max);
    }

    @Test
    @DisplayName("Can receive int232 array value from contract call")
    void canCallContractFunctionInt232Array() throws Exception {
        BigInteger int232Min = new BigInteger(
            "-3450873173395281893717377931138512726225554486085193277581262111899648");
        BigInteger int232Max = new BigInteger("3450873173395281893717377931138512726225554486085193277581262111899647");
        BigInteger[] int232Array = {int232Min, int232Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt232Arr", new ContractFunctionParameters().addInt232Array(int232Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(int232[])").get(0);

        assertThat(responseResult).isEqualTo(int232Array);
    }

    @Test
    @DisplayName("Can receive int240 min value from contract call")
    void canCallContractFunctionInt240Min() throws Exception {
        BigInteger int240Min = new BigInteger(
            "-883423532389192164791648750371459257913741948437809479060803100646309888");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt240", new ContractFunctionParameters().addInt240(int240Min))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int240Min);
    }

    @Test
    @DisplayName("Can receive int240 max value from contract call")
    void canCallContractFunctionInt240Max() throws Exception {
        BigInteger int240Max = new BigInteger(
            "883423532389192164791648750371459257913741948437809479060803100646309887");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt240", new ContractFunctionParameters().addInt240(int240Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int240Max);
    }

    @Test
    @DisplayName("Can receive int240 array value from contract call")
    void canCallContractFunctionInt240Array() throws Exception {
        BigInteger int240Min = new BigInteger(
            "-883423532389192164791648750371459257913741948437809479060803100646309888");
        BigInteger int240Max = new BigInteger(
            "883423532389192164791648750371459257913741948437809479060803100646309887");
        BigInteger[] int240Array = {int240Min, int240Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt240Arr", new ContractFunctionParameters().addInt240Array(int240Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(int240[])").get(0);

        assertThat(responseResult).isEqualTo(int240Array);
    }

    @Test
    @DisplayName("Can receive int248 min value from contract call")
    void canCallContractFunctionInt248Min() throws Exception {
        BigInteger int248Min = new BigInteger(
            "-226156424291633194186662080095093570025917938800079226639565593765455331328");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt248", new ContractFunctionParameters().addInt248(int248Min))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int248Min);
    }

    @Test
    @DisplayName("Can receive int248 max value from contract call")
    void canCallContractFunctionInt248Max() throws Exception {
        BigInteger int248Max = new BigInteger(
            "226156424291633194186662080095093570025917938800079226639565593765455331327");

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt248", new ContractFunctionParameters().addInt248(int248Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int248Max);
    }

    @Test
    @DisplayName("Can receive int248 array value from contract call")
    void canCallContractFunctionInt248Array() throws Exception {
        BigInteger int248Min = new BigInteger(
            "-226156424291633194186662080095093570025917938800079226639565593765455331328");
        BigInteger int248Max = new BigInteger(
            "226156424291633194186662080095093570025917938800079226639565593765455331327");
        BigInteger[] int248Array = {int248Min, int248Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt248Arr", new ContractFunctionParameters().addInt248Array(int248Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(int248[])").get(0);

        assertThat(responseResult).isEqualTo(int248Array);
    }

    @Test
    @DisplayName("Can receive int256 min value from contract call")
    void canCallContractFunctionInt256Min() throws Exception {
        BigInteger int256Min = new BigInteger("2").pow(256).divide(BigInteger.TWO).negate();

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt256", new ContractFunctionParameters().addInt256(int256Min))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int256Min);
    }

    @Test
    @DisplayName("Can receive int256 max value from contract call")
    void canCallContractFunctionInt256Max() throws Exception {
        BigInteger int256Max = new BigInteger("2").pow(256).subtract(BigInteger.ONE).divide(BigInteger.TWO);

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt256", new ContractFunctionParameters().addInt256(int256Max))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int256Max);
    }

    @Test
    @DisplayName("Can receive int256 array value from contract call")
    void canCallContractFunctionInt256Array() throws Exception {
        BigInteger int256Min = new BigInteger("2").pow(256).divide(BigInteger.TWO).negate();
        BigInteger int256Max = new BigInteger("2").pow(256).subtract(BigInteger.ONE).divide(BigInteger.TWO);
        BigInteger[] int256Array = {int256Min, int256Max};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt256Arr", new ContractFunctionParameters().addInt256Array(int256Array))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (BigInteger[]) response.getResult("(int256[])").get(0);

        assertThat(responseResult).isEqualTo(int256Array);
    }

    @Test
    @DisplayName("Can receive multiple int8 values from contract call")
    void canCallContractFunctionMultipleInt8() throws Exception {
        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnInt8Multiple", new ContractFunctionParameters().addInt8(Byte.MIN_VALUE))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt8(0)).isEqualTo(Byte.MIN_VALUE);
        assertThat(response.getInt8(1)).isEqualTo((byte) -108);
    }

    @Test
    @DisplayName("Can receive multiple int40 values from contract call")
    void canCallContractFunctionMultipleInt40() throws Exception {
        long int40 = 549755813885L;

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnMultipleInt40", new ContractFunctionParameters().addInt40(int40))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt64(0)).isEqualTo(int40);
        assertThat(response.getInt64(1)).isEqualTo(int40 + 1);
    }

    @Test
    @DisplayName("Can receive multiple int256 values from contract call")
    void canCallContractFunctionMultipleInt256() throws Exception {
        BigInteger int256Min = new BigInteger("2").pow(256).divide(BigInteger.TWO).negate();

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnMultipleInt256", new ContractFunctionParameters().addInt256(int256Min))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getInt256(0)).isEqualTo(int256Min);
        assertThat(response.getInt256(1)).isEqualTo(int256Min.add(BigInteger.ONE));
    }

    @Test
    @DisplayName("Can receive multiple types of values from contract call")
    void canCallContractFunctionMultipleTypes() throws Exception {
        var uint32Max = "4294967295";
        int uint32MaxInt = Integer.parseUnsignedInt(uint32Max);

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnMultipleTypeParams", new ContractFunctionParameters().addUint32(uint32MaxInt))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(Integer.toUnsignedString(response.getUint32(0))).isEqualTo(uint32Max);
        assertThat(response.getUint64(1)).isEqualTo(Long.parseUnsignedLong(uint32Max) - 1);
        assertThat(response.getString(2)).isEqualTo("OK");
    }

    @Test
    @DisplayName("Can receive string value from contract call")
    void canCallContractFunctionStringType() throws Exception {
        var testString = "test";

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnString", new ContractFunctionParameters().addString(testString))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getString(0)).isEqualTo(testString);
    }

    @Test
    @DisplayName("Can receive string array value from contract call")
    void canCallContractFunctionStringArrayType() throws Exception {
        var testStringArray = new String[]{"Test1", "Test2"};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnStringArr", new ContractFunctionParameters().addStringArray(testStringArray))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getStringArray(0).get(0)).isEqualTo(testStringArray[0]);
        assertThat(response.getStringArray(0).get(1)).isEqualTo(testStringArray[1]);
    }

    @Test
    @DisplayName("Can receive string array value from contract call with getResult function")
    void canCallContractFunctionStringArrayType_getResult() throws Exception {
        var testStringArray = new String[]{"Test1", "Test2"};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnStringArr", new ContractFunctionParameters().addStringArray(testStringArray))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (String[]) response.getResult("(string[])").get(0);
        assertThat(responseResult).isEqualTo(testStringArray);
    }

    @Test
    @DisplayName("Can receive address value from contract call")
    void canCallContractFunctionAddressType() throws Exception {
        var testAddress = "1234567890123456789012345678901234567890";

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnAddress", new ContractFunctionParameters().addAddress(testAddress))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getAddress(0)).isEqualTo(testAddress);
    }

    @Test
    @DisplayName("Can receive address array value from contract call")
    void canCallContractFunctionAddressArrayType() throws Exception {
        var testAddressArray = new String[]{"1234567890123456789012345678901234567890",
            "1234567890123456789012345678901234567891"};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnAddressArr", new ContractFunctionParameters().addAddressArray(testAddressArray))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (Address[]) response.getResult("(address[])").get(0);

        Address[] testAddressArray_Address = Arrays.stream(testAddressArray).map(addressStr -> "0x" + addressStr)
            .map(Address::wrap).toArray(Address[]::new);

        assertThat(responseResult).isEqualTo(testAddressArray_Address);
    }

    @Test
    @DisplayName("Can receive boolean value from contract call")
    void canCallContractFunctionBooleanType() throws Exception {
        var testBoolean = true;

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnBoolean", new ContractFunctionParameters().addBool(testBoolean))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getBool(0)).isEqualTo(testBoolean);
    }

    @Test
    @DisplayName("Can receive boolean array value from contract call")
    void canCallContractFunctionBooleanArrayType() throws Exception {
        var testBooleanArray = new boolean[]{true, false};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnBooleanArr", new ContractFunctionParameters().addBoolArray(testBooleanArray))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (boolean[]) response.getResult("(bool[])").get(0);

        assertThat(responseResult).isEqualTo(testBooleanArray);
    }

    @Test
    @DisplayName("Can receive bytes value from contract call")
    void canCallContractFunctionBytesType() throws Exception {
        var testBytes = "Test".getBytes();

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnBytes", new ContractFunctionParameters().addBytes(testBytes))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getBytes(0)).isEqualTo(testBytes);
    }

    @Test
    @DisplayName("Can receive bytes array value from contract call")
    void canCallContractFunctionBytesArrayType() throws Exception {
        byte[][] testBytes = new byte[][]{"Test1".getBytes(), "Test2".getBytes()};

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnBytesArr", new ContractFunctionParameters().addBytesArray(testBytes))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (byte[][]) response.getResult("(bytes[])").get(0);

        assertThat(responseResult).isEqualTo(testBytes);
    }

    @Test
    @DisplayName("Can receive bytes32 value from contract call")
    void canCallContractFunctionBytes32Type() throws Exception {
        byte[] testBytes = "Test".getBytes();
        byte[] testBytesLen32 = new byte[32];
        System.arraycopy(testBytes, 0, testBytesLen32, 0, testBytes.length);

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnBytes32", new ContractFunctionParameters().addBytes32(testBytesLen32))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        assertThat(response.getBytes32(0)).isEqualTo(testBytesLen32);
    }

    @Test
    @DisplayName("Can receive bytes32 array value from contract call")
    void canCallContractFunctionBytes32ArrayType() throws Exception {
        byte[] testBytes = "Test".getBytes();
        byte[] testBytes2 = "Test2".getBytes();
        byte[][] testBytesLen32 = new byte[2][32];
        System.arraycopy(testBytes, 0, testBytesLen32[0], 0, testBytes.length);
        System.arraycopy(testBytes2, 0, testBytesLen32[1], 0, testBytes2.length);

        var response = new ContractCallQuery().setContractId(contractId).setGas(1500000)
            .setFunction("returnBytes32Arr", new ContractFunctionParameters().addBytes32Array(testBytesLen32))
            .setQueryPayment(new Hbar(10)).execute(testEnv.client);

        var responseResult = (byte[][]) response.getResult("(bytes32[])").get(0);

        assertThat(responseResult).isEqualTo(testBytesLen32);
    }
}
