title: Why is .call() necessary when I want to see returned values from a smart contract function?
body: <p>In my contract I have this function (solc 0.8.4):</p>
  <pre><code>   function makeDecision(address person) external returns (string memory name, bool approved) {
         require(msg.sender == loanOfficer, &quot;Only the loan officer can initiate a decision.&quot;);
         require(bytes(applicants[person].name).length != 0, &quot;That person is not in the pool of applicants.&quot;);
  
         if (applicants[person].credScore &gt; 650 &amp;&amp; applicants[person].credAge &gt; 5) {
            applicants[person].approved = true;
         }
  
         return (applicants[person].name, applicants[person].approved);
      }
  </code></pre>
  <p>When I go into my truffle console and call my function this way <code>loanContract.makeDecision(accounts[1])</code> everything works fine, but I get a tx receipt as the response.</p>
  <p>When I call my function this way via truffle console <code>loanContract.makeDecision.call(accounts[1])</code> I get the expected response from my function. I am wanting an explanation that tells me why this difference in response occurs so that I understand what is going on on a deeper level. I hate using things without understanding why they work.</p>
  <p>If it helps, my contract (which is named <code>LoanDisbursement</code>) was initialized in the console like so: <code>let loanContract = await LoanDisbursement.deployed()</code> and my accounts variable: <code>let accounts = await web3.eth.getAccounts()</code></p>
  <p>any tips would help since I am still learning and diving into this ecosystem. I've not been able to find any decent documentation on this functionality as of yet. Thanks.</p>