RemixIDE 中的 uint256 输入

uint256 input in RemixIDE

我正在尝试学习开发我的第一个智能合约,以便在 aave 上使用闪贷。我对交易输入的金额有疑问。

我有一个函数询问我需要的令牌数量,类型是 uint256。当我输入 10 时,我只收到 0.00000000000000001 的闪贷。为什么?也许这是一个愚蠢的问题,但我不明白哪里出了问题。

// SPDX-License-Identifier: agpl-3.0
pragma solidity 0.6.12;

import { FlashLoanReceiverBase } from "./FlashLoanReceiverBase.sol";
import { ILendingPool, ILendingPoolAddressesProvider, IERC20 } from "./Interfaces.sol";
import { SafeMath } from "./Libraries.sol";
import "./Ownable.sol";

/*
* A contract that executes the following logic in a single atomic transaction:
*
*
*/
contract BatchFlashDemo is FlashLoanReceiverBase, Ownable {
    
    ILendingPoolAddressesProvider provider;
    using SafeMath for uint256;
    uint256 flashDaiAmt0;
    address lendingPoolAddr;
    
    // mumbai reserve asset addresses
    address mumbaiDai = 0x001B3B4d0F3714Ca98ba10F6042DaEbF0B1B7b6F;

    
    // intantiate lending pool addresses provider and get lending pool address
    constructor(ILendingPoolAddressesProvider _addressProvider) FlashLoanReceiverBase(_addressProvider) public {
        provider = _addressProvider;
        lendingPoolAddr = provider.getLendingPool();
    }

    /**
        This function is called after your contract has received the flash loaned amount
     */
    function executeOperation(
        address[] calldata assets,
        uint256[] calldata amounts,
        uint256[] calldata premiums,
        address initiator,
        bytes calldata params
    )
        external
        override
        returns (bool)
    {
        
        /*
        *
        *
        */

        // Approve the LendingPool contract allowance to *pull* the owed amount
        // i.e. AAVE V2's way of repaying the flash loan
        for (uint i = 0; i < assets.length; i++) {
            uint amountOwing = amounts[i].add(premiums[i]);
            IERC20(assets[i]).approve(address(_lendingPool), amountOwing);
        }

        return true;
    }

    
    
    /*
    * This function is manually called to commence the flash loans sequence
    */
    function executeFlashLoans(uint256 _flashDaiAmt0) public onlyOwner {
        address receiverAddress = address(this);

        // the various assets to be flashed
        address[] memory assets = new address[](1);
        assets[0] = mumbaiDai; 

        
        // the amount to be flashed for each asset
        uint256[] memory amounts = new uint256[](1);
        amounts[0] = _flashDaiAmt0;

        flashDaiAmt0 = _flashDaiAmt0;

        // 0 = no debt, 1 = stable, 2 = variable
        uint256[] memory modes = new uint256[](1);
        modes[0] = 0;

        address onBehalfOf = address(this);
        bytes memory params = "";
        uint16 referralCode = 0;

        _lendingPool.flashLoan(
            receiverAddress,
            assets,
            amounts,
            modes,
            onBehalfOf,
            params,
            referralCode
        );
    }
    
        
    /*
    * Rugpull all ERC20 tokens from the contract
    */
    function rugPull() public payable onlyOwner {
        
        // withdraw all ETH
        msg.sender.call{ value: address(this).balance }("");
        
        // withdraw all x ERC20 tokens
        IERC20(mumbaiDai).transfer(msg.sender, IERC20(mumbaiDai).balanceOf(address(this)));
    }
    
}

我部署时将此地址作为参数传递: 0x178113104fEcbcD7fF8669a0150721e231F0FD4B 它是取自此处的借出池地址提供商合同:https://docs.aave.com/developers/v/2.0/deployed-contracts/matic-polygon-market.

当我尝试请求超过 1000 个代币时,出现错误。希望这有助于重现。

EVM 不支持十进制数。所以一种常见的做法是在合约中声明一些小数,然后将它们与存储的值一起包含。

示例: 当合约使用 2 位小数时,1 的值存储为 100。

Aave 协议与 ERC20 令牌一起使用,其中标准定义了一个名为 decimals() 的函数到 return 小数位。