Forkchoice Ethereum Mainnet

Address Contract Verified

Address 0x897E227dbABC69d088b123a227EAAB0f96B10b17
Balance 0 ETH
Nonce 2
Code Size 8786 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

8786 bytes
0x60806040526004361061023f5760003560e01c8063736a83a11161012e578063c8b35c7a116100ab578063f2fde38b1161006f578063f2fde38b1461071c578063f42938901461073c578063f708a64f14610751578063f887ea4014610771578063fabb0b4f1461079157600080fd5b8063c8b35c7a14610657578063d12a76881461068b578063d1633649146106a1578063dd62ed3e146106c1578063f0fc6bca1461070757600080fd5b806395d89b41116100f257806395d89b4114610592578063a8aa1b31146105bd578063a9059cbb146105dd578063b1a4e0dc146105fd578063bffb691d1461063657600080fd5b8063736a83a11461050a57806375f0a8741461051f578063764ca5121461053f578063893d20e8146105545780638ecc37fb1461057257600080fd5b8063342aa8b5116101bc5780635d098b38116101805780635d098b3814610475578063658d4b7f1461049557806367ee5f09146104b557806369fe0e2d146104ca57806370a08231146104ea57600080fd5b8063342aa8b5146103c85780633e07ce5b146103e85780634626402b146103fd578063571ac8b0146104355780635cc33f741461045557600080fd5b806323b872dd1161020357806323b872dd1461032857806329e04b4a146103485780632b112e49146103685780632f54bf6e1461037d578063313ce567146103ac57600080fd5b806306fdde031461024b578063095ea7b31461029757806315f7e05e146102c757806318160ddd146102e957806323b635851461030857600080fd5b3661024657005b600080fd5b34801561025757600080fd5b506040805180820190915260118152702130b730b73090283630b73a30ba34b7b760791b60208201525b60405161028e9190611f34565b60405180910390f35b3480156102a357600080fd5b506102b76102b2366004611fa1565b6107a7565b604051901515815260200161028e565b3480156102d357600080fd5b506102e76102e2366004611fcd565b610814565b005b3480156102f557600080fd5b506004545b60405190815260200161028e565b34801561031457600080fd5b506102b7610323366004611fea565b6108a9565b34801561033457600080fd5b506102b7610343366004612003565b6108ec565b34801561035457600080fd5b506102e7610363366004611fea565b6109ae565b34801561037457600080fd5b506102fa610a3b565b34801561038957600080fd5b506102b7610398366004611fcd565b6000546001600160a01b0391821691161490565b3480156103b857600080fd5b506040516009815260200161028e565b3480156103d457600080fd5b506102e76103e3366004612052565b610a84565b3480156103f457600080fd5b506102e7610ae0565b34801561040957600080fd5b50600e5461041d906001600160a01b031681565b6040516001600160a01b03909116815260200161028e565b34801561044157600080fd5b506102b7610450366004611fcd565b610b17565b34801561046157600080fd5b506102fa610470366004611fcd565b610b25565b34801561048157600080fd5b506102e7610490366004611fcd565b610b95565b3480156104a157600080fd5b506102e76104b0366004612052565b610be1565b3480156104c157600080fd5b506102fa610c36565b3480156104d657600080fd5b506102e76104e5366004611fea565b610ca4565b3480156104f657600080fd5b506102fa610505366004611fcd565b610d1a565b34801561051657600080fd5b506102fa610d35565b34801561052b57600080fd5b50600d5461041d906001600160a01b031681565b34801561054b57600080fd5b506102e7610d7f565b34801561056057600080fd5b506000546001600160a01b031661041d565b34801561057e57600080fd5b506102fa61058d366004611fcd565b610e18565b34801561059e57600080fd5b50604080518082019091526002815261042560f41b6020820152610281565b3480156105c957600080fd5b5060105461041d906001600160a01b031681565b3480156105e957600080fd5b506102b76105f8366004611fa1565b610e4b565b34801561060957600080fd5b506102b7610618366004611fcd565b6001600160a01b031660009081526009602052604090205460ff1690565b34801561064257600080fd5b50601a546102b790600160a01b900460ff1681565b34801561066357600080fd5b5061041d7f00000000000000000000000038e68a37e401f7271568cecaac63c6b1e19130b481565b34801561069757600080fd5b506102fa60195481565b3480156106ad57600080fd5b506102e76106bc366004611fea565b610e58565b3480156106cd57600080fd5b506102fa6106dc36600461208b565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b34801561071357600080fd5b506102e7610e9c565b34801561072857600080fd5b506102e7610737366004611fcd565b610efb565b34801561074857600080fd5b506102e7610f79565b34801561075d57600080fd5b506102e761076c366004612052565b610fdd565b34801561077d57600080fd5b50600f5461041d906001600160a01b031681565b34801561079d57600080fd5b506102fa60135481565b3360008181526006602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906108029086815260200190565b60405180910390a35060015b92915050565b6000546001600160a01b031633146108475760405162461bcd60e51b815260040161083e906120b9565b60405180910390fd5b601a54604051630afbf02f60e11b81526001600160a01b038381166004830152909116906315f7e05e90602401600060405180830381600087803b15801561088e57600080fd5b505af11580156108a2573d6000803e3d6000fd5b5050505050565b600080546001600160a01b031633146108d45760405162461bcd60e51b815260040161083e906120b9565b60025461080e9030906001600160a01b031684611011565b6001600160a01b038316600090815260066020908152604080832033845290915281205460001914610999576040805180820182526016815275496e73756666696369656e7420416c6c6f77616e636560501b6020808301919091526001600160a01b03871660009081526006825283812033825290915291909120546109749184906110f7565b6001600160a01b03851660009081526006602090815260408083203384529091529020555b6109a4848484611131565b90505b9392505050565b6000546001600160a01b031633146109d85760405162461bcd60e51b815260040161083e906120b9565b6004546109e690606461167b565b811115610a275760405162461bcd60e51b815260206004820152600f60248201526e63616e27742065786365656420312560881b604482015260640161083e565b610a3581633b9aca006120ef565b60195550565b600354600090610a7f90610a57906001600160a01b0316610d1a565b600254610a7990610a70906001600160a01b0316610d1a565b600454906116bd565b906116bd565b905090565b6000546001600160a01b03163314610aae5760405162461bcd60e51b815260040161083e906120b9565b6001600160a01b0382166000908152600960205260409020805460ff1916821515179055610adc82826116ff565b5050565b6000546001600160a01b03163314610b0a5760405162461bcd60e51b815260040161083e906120b9565b6014805461ff0019169055565b600061080e826000196107a7565b601a54604051631730cfdd60e21b81526001600160a01b0383811660048301526000921690635cc33f74906024015b602060405180830381865afa158015610b71573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061080e919061210e565b6000546001600160a01b03163314610bbf5760405162461bcd60e51b815260040161083e906120b9565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610c0b5760405162461bcd60e51b815260040161083e906120b9565b6001600160a01b03919091166000908152600760205260409020805460ff1916911515919091179055565b601a546040805163997664d760e01b815290516000926001600160a01b03169163997664d79160048083019260209291908290030181865afa158015610c80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7f919061210e565b6000546001600160a01b03163314610cce5760405162461bcd60e51b815260040161083e906120b9565b6009811115610d155760405162461bcd60e51b81526020600482015260136024820152724665652063616e27742065786365656420392560681b604482015260640161083e565b600b55565b6001600160a01b031660009081526005602052604090205490565b601a546040805163d54ad2a160e01b815290516000926001600160a01b03169163d54ad2a19160048083019260209291908290030181865afa158015610c80573d6000803e3d6000fd5b6000546001600160a01b03163314610da95760405162461bcd60e51b815260040161083e906120b9565b601a54600160a01b900460ff1615610e035760405162461bcd60e51b815260206004820152601760248201527f63616e206f6e6c792062652063616c6c6564206f6e6365000000000000000000604482015260640161083e565b601a805460ff60a01b1916600160a01b179055565b601a54604051638ecc37fb60e01b81526001600160a01b0383811660048301526000921690638ecc37fb90602401610b54565b60006109a7338484611131565b6000546001600160a01b03163314610e825760405162461bcd60e51b815260040161083e906120b9565b436011556014805460ff1916600117905560135542601255565b601a54604051630afbf02f60e11b81523360048201526001600160a01b03909116906315f7e05e90602401600060405180830381600087803b158015610ee157600080fd5b505af1158015610ef5573d6000803e3d6000fd5b50505050565b6000546001600160a01b03163314610f255760405162461bcd60e51b815260040161083e906120b9565b600080546001600160a01b0319166001600160a01b0383169081179091556040519081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc6861639060200160405180910390a150565b6000546001600160a01b03163314610fa35760405162461bcd60e51b815260040161083e906120b9565b600d5460405147916001600160a01b03169082156108fc029083906000818181858888f19350505050158015610adc573d6000803e3d6000fd5b6000546001600160a01b031633146110075760405162461bcd60e51b815260040161083e906120b9565b610adc82826116ff565b6040805180820182526014815273496e73756666696369656e742042616c616e636560601b6020808301919091526001600160a01b03861660009081526005909152918220546110629184906110f7565b6001600160a01b0380861660009081526005602052604080822093909355908516815220546110919083611810565b6001600160a01b0380851660008181526005602052604090819020939093559151908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906110e59086815260200190565b60405180910390a35060019392505050565b6000818484111561111b5760405162461bcd60e51b815260040161083e9190611f34565b5060006111288486612127565b95945050505050565b600080546001600160a01b0385811691161480159061115e57506000546001600160a01b03848116911614155b156111b55760145460ff166111b55760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c65642e0000000000000000604482015260640161083e565b601a54600160a01b900460ff161561123e576001600160a01b03841660009081526009602052604090205460ff1615801561120957506001600160a01b03831660009081526009602052604090205460ff16155b61123e5760405162461bcd60e51b815260040161083e90602080825260049082015263426f742160e01b604082015260600190565b601454610100900460ff16801561126357506000546001600160a01b03858116911614155b801561127d57506000546001600160a01b03848116911614155b15611384576015548211156112c35760405162461bcd60e51b815260206004820152600c60248201526b2a37b79036bab1b41039b4b960a11b604482015260640161083e565b601654826112d085610d1a565b6112da919061213e565b11156113175760405162461bcd60e51b815260206004820152600c60248201526b2a37b79036bab1b41039b4b960a11b604482015260640161083e565b43601354601154611328919061213e565b10611337576063600b55611384565b601354601154611347919061213e565b43118015611362575060115461135e90600a61213e565b4311155b1561137d576017546015556018546016556028600b55611384565b600a54600b555b601a54600160a81b900460ff16156113a8576113a1848484611011565b90506109a7565b60006113b330610d1a565b90506000601954821015905060008180156113db57506010546001600160a01b038781169116145b80156113ef575060006113ed30610d1a565b115b905080156113ff576113ff61186f565b6040805180820182526014815273496e73756666696369656e742042616c616e636560601b6020808301919091526001600160a01b038a166000908152600590915291909120546114519187906110f7565b6001600160a01b0388166000908152600560205260408120919091556114778888611bbd565b611481578561148b565b61148b8887611c32565b6001600160a01b0388166000908152600560205260409020549091506114b19082611810565b6001600160a01b038089166000908152600560205260409020919091556010548982169116148015906114fd57506001600160a01b03881660009081526008602052604090205460ff16155b1561157357601a546001600160a01b0389811660008181526005602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401600060405180830381600087803b15801561156057600080fd5b505af1925050508015611571575060015b505b6010546001600160a01b038881169116148015906115aa57506001600160a01b03871660009081526008602052604090205460ff16155b1561162057601a546001600160a01b0388811660008181526005602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401600060405180830381600087803b15801561160d57600080fd5b505af192505050801561161e575060015b505b866001600160a01b0316886001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161166591815260200190565b60405180910390a3506001979650505050505050565b60006109a783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611cd8565b60006109a783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506110f7565b6001600160a01b038216301480159061172657506010546001600160a01b03838116911614155b61172f57600080fd5b6001600160a01b0382166000908152600860205260409020805460ff191682158015919091179091556117c757601a54604051630a5b654b60e11b81526001600160a01b03848116600483015260006024830152909116906314b6ca96906044015b600060405180830381600087803b1580156117ab57600080fd5b505af11580156117bf573d6000803e3d6000fd5b505050505050565b601a546001600160a01b0383811660008181526005602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401611791565b60008061181d838561213e565b9050838110156109a75760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161083e565b601a805460ff60a81b1916600160a81b1790556000611898600561189230610d1a565b9061167b565b90506118a381611d06565b6118b46118af30610d1a565b611db1565b6040516370a0823160e01b8152306004820152600090611946906002906001600160a01b037f00000000000000000000000038e68a37e401f7271568cecaac63c6b1e19130b416906370a0823190602401602060405180830381865afa158015611922573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611892919061210e565b600e5460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529192507f00000000000000000000000038e68a37e401f7271568cecaac63c6b1e19130b4169063a9059cbb906044016020604051808303816000875af11580156119bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119df9190612156565b506040516370a0823160e01b81523060048201526000907f00000000000000000000000038e68a37e401f7271568cecaac63c6b1e19130b46001600160a01b0316906370a0823190602401602060405180830381865afa158015611a47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6b919061210e565b601a5460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529192506000917f00000000000000000000000038e68a37e401f7271568cecaac63c6b1e19130b49091169063a9059cbb906044016020604051808303816000875af1158015611ae5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b099190612156565b90508015611b7057601a5460405163b6b55f2560e01b8152600481018490526001600160a01b039091169063b6b55f2590602401600060405180830381600087803b158015611b5757600080fd5b505af1158015611b6b573d6000803e3d6000fd5b505050505b600d546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015611ba9573d6000803e3d6000fd5b5050601a805460ff60a81b19169055505050565b6001600160a01b03821660009081526007602052604081205460ff1680611bfc57506001600160a01b03821660009081526007602052604090205460ff165b1580156109a757506010546001600160a01b03848116911614806109a75750506010546001600160a01b03908116911614919050565b600080611c50600c54611892600b5486611eb290919063ffffffff16565b30600090815260056020526040902054909150611c6d9082611810565b30600081815260056020526040908190209290925590516001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611cbe9085815260200190565b60405180910390a3611cd083826116bd565b949350505050565b60008183611cf95760405162461bcd60e51b815260040161083e9190611f34565b5060006111288486612173565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611d3b57611d3b612195565b6001600160a01b0392831660209182029290920101526001805483519216918391908110611d6b57611d6b612195565b6001600160a01b039283166020918202929092010152600f5460405163791ac94760e01b815291169063791ac947906117919085906000908690309042906004016121ab565b60408051600380825260808201909252600091602082016060803683370190505090503081600081518110611de857611de8612195565b6001600160a01b0392831660209182029290920101526001805483519216918391908110611e1857611e18612195565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000038e68a37e401f7271568cecaac63c6b1e19130b481600281518110611e6c57611e6c612195565b6001600160a01b039283166020918202929092010152600f54604051635c11d79560e01b8152911690635c11d795906117919085906000908690309042906004016121ab565b600082600003611ec45750600061080e565b6000611ed083856120ef565b905082611edd8583612173565b146109a75760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161083e565b600060208083528351808285015260005b81811015611f6157858101830151858201604001528201611f45565b81811115611f73576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114611f9e57600080fd5b50565b60008060408385031215611fb457600080fd5b8235611fbf81611f89565b946020939093013593505050565b600060208284031215611fdf57600080fd5b81356109a781611f89565b600060208284031215611ffc57600080fd5b5035919050565b60008060006060848603121561201857600080fd5b833561202381611f89565b9250602084013561203381611f89565b929592945050506040919091013590565b8015158114611f9e57600080fd5b6000806040838503121561206557600080fd5b823561207081611f89565b9150602083013561208081612044565b809150509250929050565b6000806040838503121561209e57600080fd5b82356120a981611f89565b9150602083013561208081611f89565b60208082526006908201526510a7bbb732b960d11b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615612109576121096120d9565b500290565b60006020828403121561212057600080fd5b5051919050565b600082821015612139576121396120d9565b500390565b60008219821115612151576121516120d9565b500190565b60006020828403121561216857600080fd5b81516109a781612044565b60008261219057634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156121fb5784516001600160a01b0316835293830193918301916001016121d6565b50506001600160a01b0396909616606085015250505060800152939250505056fea264697066735822122080484f08bdf8cbf64211b5fb477372dda88316897c5f5e9697fab4493b1fc63264736f6c634300080d0033

Verified Source Code Full Match

Compiler: v0.8.13+commit.abaa5c0e EVM: london Optimization: Yes (200 runs)
bananaplant.sol 626 lines
/**
    A plantation that prints $Banana (0x38E68A37E401F7271568CecaAc63c6B1e19130B4), like chiquita but onchain.
    Twitter: https://twitter.com/NanaPlantation
    Website: https://bananaplantation.xyz/
    Telegram: https://t.me/nanaplantportal
**/

// SPDX-License-Identifier: Unlicensed

pragma solidity 0.8.13;

/**
 * Standard SafeMath, stripped down to just add/sub/mul/div
 */
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) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }
}

/**
 * ERC20 standard interface.
 */
interface IERC20 {
    function totalSupply() external view returns (uint256);
    function decimals() external view returns (uint8);
    function symbol() external view returns (string memory);
    function name() external view returns (string memory);
    function getOwner() external view returns (address);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address _owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

/**
 * Allows for contract ownership along with multi-address authorization
 */
abstract contract Auth {
    address internal owner;

    constructor(address _owner) {
        owner = _owner;
    }

    /**
     * Function modifier to require caller to be contract deployer
     */
    modifier onlyOwner() {
        require(isOwner(msg.sender), "!Owner"); _;
    }

    /**
     * Check if address is owner
     */
    function isOwner(address account) public view returns (bool) {
        return account == owner;
    }

    /**
     * Transfer ownership to new address. Caller must be deployer. Leaves old deployer authorized
     */
    function transferOwnership(address payable adr) public onlyOwner {
        owner = adr;
        emit OwnershipTransferred(adr);
    }

    event OwnershipTransferred(address owner);
}

interface IDEXFactory {
    function createPair(address tokenA, address tokenB) external returns (address pair);
}

interface IDEXRouter {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);

    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

interface IDividendDistributor {
    function setShare(address shareholder, uint256 amount) external;
    function deposit(uint256 amount) external;
    function claimDividend(address shareholder) external;
    function getDividendsClaimedOf (address shareholder) external returns (uint256);
}

contract DividendDistributor is IDividendDistributor {
    using SafeMath for uint256;

    address public _token;
    address public _owner;

    address public immutable BANANA = address(0x38E68A37E401F7271568CecaAc63c6B1e19130B4); //BANANA


    struct Share {
        uint256 amount;
        uint256 totalExcluded;
        uint256 totalClaimed;
    }

    address[] private shareholders;
    mapping (address => uint256) private shareholderIndexes;

    mapping (address => Share) public shares;

    uint256 public totalShares;
    uint256 public totalDividends;
    uint256 public totalClaimed;
    uint256 public dividendsPerShare;
    uint256 private dividendsPerShareAccuracyFactor = 10 ** 36;

    modifier onlyToken() {
        require(msg.sender == _token); _;
    }
    
    modifier onlyOwner() {
        require(msg.sender == _owner); _;
    }

    constructor (address owner) {
        _token = msg.sender;
        _owner = owner;
    }

    receive() external payable { }

    function setShare(address shareholder, uint256 amount) external override onlyToken {
        if(shares[shareholder].amount > 0){
            distributeDividend(shareholder);
        }

        if(amount > 0 && shares[shareholder].amount == 0){
            addShareholder(shareholder);
        }else if(amount == 0 && shares[shareholder].amount > 0){
            removeShareholder(shareholder);
        }

        totalShares = totalShares.sub(shares[shareholder].amount).add(amount);
        shares[shareholder].amount = amount;
        shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount);
    }

    function deposit(uint256 amount) external override onlyToken {
        
        if (amount > 0) {        
            totalDividends = totalDividends.add(amount);
            dividendsPerShare = dividendsPerShare.add(dividendsPerShareAccuracyFactor.mul(amount).div(totalShares));
        }
    }

    function distributeDividend(address shareholder) internal {
        if(shares[shareholder].amount == 0){ return; }

        uint256 amount = getClaimableDividendOf(shareholder);
        if(amount > 0){
            totalClaimed = totalClaimed.add(amount);
            shares[shareholder].totalClaimed = shares[shareholder].totalClaimed.add(amount);
            shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount);
            IERC20(BANANA).transfer(shareholder, amount);
        }
    }

    function claimDividend(address shareholder) external override onlyToken {
        distributeDividend(shareholder);
    }

    function getClaimableDividendOf(address shareholder) public view returns (uint256) {
        if(shares[shareholder].amount == 0){ return 0; }

        uint256 shareholderTotalDividends = getCumulativeDividends(shares[shareholder].amount);
        uint256 shareholderTotalExcluded = shares[shareholder].totalExcluded;

        if(shareholderTotalDividends <= shareholderTotalExcluded){ return 0; }

        return shareholderTotalDividends.sub(shareholderTotalExcluded);
    }

    function getCumulativeDividends(uint256 share) internal view returns (uint256) {
        return share.mul(dividendsPerShare).div(dividendsPerShareAccuracyFactor);
    }

    function addShareholder(address shareholder) internal {
        shareholderIndexes[shareholder] = shareholders.length;
        shareholders.push(shareholder);
    }

    function removeShareholder(address shareholder) internal {
        shareholders[shareholderIndexes[shareholder]] = shareholders[shareholders.length-1];
        shareholderIndexes[shareholders[shareholders.length-1]] = shareholderIndexes[shareholder];
        shareholders.pop();
    }
    
    function manualSend(uint256 amount, address holder) external onlyOwner {
        uint256 contractETHBalance = address(this).balance;
        payable(holder).transfer(amount > 0 ? amount : contractETHBalance);
    }


    function getDividendsClaimedOf (address shareholder) external view returns (uint256) {
        require (shares[shareholder].amount > 0, "You're not a shareholder!");
        return shares[shareholder].totalClaimed;
    }

    }

contract BP is IERC20, Auth {
    using SafeMath for uint256;

    address private WETH;
    address private DEAD = 0x000000000000000000000000000000000000dEaD;
    address private ZERO = 0x0000000000000000000000000000000000000000;

    address public immutable BANANA = address(0x38E68A37E401F7271568CecaAc63c6B1e19130B4); //BANANA

    string private constant  _name = "Banana Plantation";
    string private constant _symbol = "BP";
    uint8 private constant _decimals = 9;

    uint256 private _totalSupply = 69696969 * (10 ** _decimals);
    

    mapping (address => uint256) private _balances;
    mapping (address => mapping (address => uint256)) private _allowances;

    mapping (address => bool) private isFeeExempt;
    mapping (address => bool) private isDividendExempt;
    mapping (address => bool) private isBot;
            
    uint256 private _totalFee = 5;            
    uint256 private totalFee = _totalFee;
    uint256 private feeDenominator = 100;

    address payable public marketingWallet = payable(0x7630B9Ade82D0742dF6cd3A947DF02792a88592c);
    address payable public treasuryWallet = payable(0x0C3a164212823d63b488c744B2c6e27F8cE81228);

    IDEXRouter public router;
    address public pair;

    uint256 private launchedAt;
    uint256 private launchedTime;
    uint256 public deadBlocks;
    bool private tradingOpen = false;
    bool private buyLimit = true;
    uint256 private maxBuy = _totalSupply;
    uint256 private maxWallet = _totalSupply;
    uint256 private _maxBuy = _totalSupply / 200; // 0.5%
    uint256 private _maxWallet = _totalSupply / 50; // 2%
    uint256 public numTokensSellToAddToLiquidity = _totalSupply / 200;

    DividendDistributor private distributor;    
    
    bool public blacklistEnabled = false;
    bool private inSwap;
    modifier swapping() { inSwap = true; _; inSwap = false; }

    constructor (
        address _owner        
    ) Auth(_owner) {
        router = IDEXRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
            
        WETH = router.WETH();
        
        pair = IDEXFactory(router.factory()).createPair(WETH, address(this));
        
        _allowances[address(this)][address(router)] = type(uint256).max;

        distributor = new DividendDistributor(_owner);

        isFeeExempt[_owner] = true;
        isFeeExempt[marketingWallet] = true;             
              
        isDividendExempt[pair] = true;
        isDividendExempt[address(this)] = true;
        isDividendExempt[DEAD] = true;        

        _balances[_owner] = _totalSupply;
    
        emit Transfer(address(0), _owner, _totalSupply);
    }

    receive() external payable { }

    function totalSupply() external view override returns (uint256) { return _totalSupply; }
    function decimals() external pure override returns (uint8) { return _decimals; }
    function symbol() external pure override returns (string memory) { return _symbol; }
    function name() external pure override returns (string memory) { return _name; }
    function getOwner() external view override returns (address) { return owner; }
    function balanceOf(address account) public view override returns (uint256) { return _balances[account]; }
    function allowance(address holder, address spender) external view override returns (uint256) { return _allowances[holder][spender]; }

    function approve(address spender, uint256 amount) public override returns (bool) {
        _allowances[msg.sender][spender] = amount;
        emit Approval(msg.sender, spender, amount);
        return true;
    }

    function approveMax(address spender) external returns (bool) {
        return approve(spender, type(uint256).max);
    }

    function transfer(address recipient, uint256 amount) external override returns (bool) {
        return _transferFrom(msg.sender, recipient, amount);
    }

    function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {
        if(_allowances[sender][msg.sender] != type(uint256).max){
            _allowances[sender][msg.sender] = _allowances[sender][msg.sender].sub(amount, "Insufficient Allowance");
        }

        return _transferFrom(sender, recipient, amount);
    }

    function _transferFrom(address sender, address recipient, uint256 amount) internal returns (bool) {
        if (sender!= owner && recipient!= owner) require(tradingOpen, "Trading not yet enabled."); //transfers disabled before openTrading
        if (blacklistEnabled) {
            require (!isBot[sender] && !isBot[recipient], "Bot!");
        }
        if (buyLimit && sender!=owner && recipient!= owner) { 
            require (amount<=maxBuy, "Too much sir");
            require (balanceOf(recipient) + amount <= maxWallet, "Too much sir");
            if((launchedAt + deadBlocks) >= block.number)
            {
                totalFee = 99;
            } else if(block.number > (launchedAt + deadBlocks) && block.number <= launchedAt + 10)
            {
                maxBuy = _maxBuy;
                maxWallet = _maxWallet;
                totalFee = 40;
            } else 
            {
                totalFee = _totalFee;
            }
        }
       
        if(inSwap){ return _basicTransfer(sender, recipient, amount); }      

        uint256 contractTokenBalance = balanceOf(address(this));

        bool overMinTokenBalance = contractTokenBalance >= numTokensSellToAddToLiquidity;
    
        bool shouldSwapBack = (overMinTokenBalance && recipient==pair && balanceOf(address(this)) > 0);
        if(shouldSwapBack){ swapBack(); }

        _balances[sender] = _balances[sender].sub(amount, "Insufficient Balance");

        uint256 amountReceived = shouldTakeFee(sender, recipient) ? takeFee(sender, amount) : amount;
        
        _balances[recipient] = _balances[recipient].add(amountReceived);

        if(sender != pair && !isDividendExempt[sender]){ try distributor.setShare(sender, _balances[sender]) {} catch {} }
        if(recipient != pair && !isDividendExempt[recipient]){ try distributor.setShare(recipient, _balances[recipient]) {} catch {} }

        emit Transfer(sender, recipient, amountReceived);
        return true;
    }
    
    function _basicTransfer(address sender, address recipient, uint256 amount) internal returns (bool) {
        _balances[sender] = _balances[sender].sub(amount, "Insufficient Balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
        return true;
    }

 
    function shouldTakeFee(address sender, address recipient) internal view returns (bool) {
        return ( !(isFeeExempt[sender] || isFeeExempt[recipient]) &&  (sender == pair || recipient == pair) );
   }

    function takeFee(address sender, uint256 amount) internal returns (uint256) {
        uint256 feeAmount;
        feeAmount = amount.mul(totalFee).div(feeDenominator);
        _balances[address(this)] = _balances[address(this)].add(feeAmount);
        emit Transfer(sender, address(this), feeAmount);   

        return amount.sub(feeAmount);
    }

   
    function swapBack() internal swapping {

        uint256 amountToMarketing = balanceOf(address(this)).div(5);

        swapTokensForEth(amountToMarketing);
        swapTokensForBANANA(balanceOf(address(this)));

        uint256 amountToTreasury = IERC20(BANANA).balanceOf(address(this)).div(2);

        IERC20(BANANA).transfer(treasuryWallet, amountToTreasury);

        uint256 dividends = IERC20(BANANA).balanceOf(address(this));

        bool success = IERC20(BANANA).transfer(address(distributor), dividends);

        if (success) {
            distributor.deposit(dividends);            
        }
             
        payable(marketingWallet).transfer(address(this).balance);        
    }
    

    function swapTokensForBANANA(uint256 tokenAmount) private {

        address[] memory path = new address[](3);
        path[0] = address(this);
        path[1] = WETH;
        path[2] = BANANA;

        // make the swap
        router.swapExactTokensForTokensSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function swapTokensForEth(uint256 tokenAmount) private {

        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = WETH;

        // make the swap
        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        
        // add the liquidity
        router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            owner,
            block.timestamp
        );
    }

    
    function openTrading(uint256 _deadBlocks) external onlyOwner {
        launchedAt = block.number;
        tradingOpen = true;
        deadBlocks = _deadBlocks;
        launchedTime = block.timestamp;
    }    
  
    
    function setBot(address _address, bool toggle) external onlyOwner {
        isBot[_address] = toggle;
        _setIsDividendExempt(_address, toggle);
    }
    
    
    function _setIsDividendExempt(address holder, bool exempt) internal {
        require(holder != address(this) && holder != pair);
        isDividendExempt[holder] = exempt;
        if(exempt){
            distributor.setShare(holder, 0);
        }else{
            distributor.setShare(holder, _balances[holder]);
        }
    }

    function setIsDividendExempt(address holder, bool exempt) external onlyOwner {
        _setIsDividendExempt(holder, exempt);
    }

    function setIsFeeExempt(address holder, bool exempt) external onlyOwner {
        isFeeExempt[holder] = exempt;
    }

    function setFee (uint256 _fee) external onlyOwner {
        require (_fee <= 9, "Fee can't exceed 9%");
        totalFee = _fee;
    }
  
    function manualSend() external onlyOwner {
        uint256 contractETHBalance = address(this).balance;
        payable(marketingWallet).transfer(contractETHBalance);
    }

    function claimDividend() external {
        distributor.claimDividend(msg.sender);
    }
    
    function claimDividend(address holder) external onlyOwner {
        distributor.claimDividend(holder);
    }
    
    function getClaimableDividendOf(address shareholder) public view returns (uint256) {
        return distributor.getClaimableDividendOf(shareholder);
    }
    
    function manualBurn(uint256 amount) external onlyOwner returns (bool) {
        return _basicTransfer(address(this), DEAD, amount);
    }
    
    function getCirculatingSupply() public view returns (uint256) {
        return _totalSupply.sub(balanceOf(DEAD)).sub(balanceOf(ZERO));
    }

    function setMarketingWallet(address _marketingWallet) external onlyOwner {
        marketingWallet = payable(_marketingWallet);
    } 

    function getTotalDividends() external view returns (uint256) {
        return distributor.totalDividends();
    }    

    function getTotalClaimed() external view returns (uint256) {
        return distributor.totalClaimed();
    }

     function getDividendsClaimedOf (address shareholder) external view returns (uint256) {
        return distributor.getDividendsClaimedOf(shareholder);
    }

    function removeBuyLimit() external onlyOwner {
        buyLimit = false;
    }

    function checkBot(address account) public view returns (bool) {
        return isBot[account];
    }

    function setBlacklistEnabled() external onlyOwner {
        require (blacklistEnabled == false, "can only be called once");
        blacklistEnabled = true;
    }

    function setSwapThresholdAmount (uint256 amount) external onlyOwner {
        require (amount <= _totalSupply.div(100), "can't exceed 1%");
        numTokensSellToAddToLiquidity = amount * 10 ** 9;
    } 
   
}

Read Contract

BANANA 0xc8b35c7a → address
allowance 0xdd62ed3e → uint256
balanceOf 0x70a08231 → uint256
blacklistEnabled 0xbffb691d → bool
checkBot 0xb1a4e0dc → bool
deadBlocks 0xfabb0b4f → uint256
decimals 0x313ce567 → uint8
getCirculatingSupply 0x2b112e49 → uint256
getClaimableDividendOf 0x8ecc37fb → uint256
getDividendsClaimedOf 0x5cc33f74 → uint256
getOwner 0x893d20e8 → address
getTotalClaimed 0x736a83a1 → uint256
getTotalDividends 0x67ee5f09 → uint256
isOwner 0x2f54bf6e → bool
marketingWallet 0x75f0a874 → address
name 0x06fdde03 → string
numTokensSellToAddToLiquidity 0xd12a7688 → uint256
pair 0xa8aa1b31 → address
router 0xf887ea40 → address
symbol 0x95d89b41 → string
totalSupply 0x18160ddd → uint256
treasuryWallet 0x4626402b → address

Write Contract 18 functions

These functions modify contract state and require a wallet transaction to execute.

approve 0x095ea7b3
address spender
uint256 amount
returns: bool
approveMax 0x571ac8b0
address spender
returns: bool
claimDividend 0x15f7e05e
address holder
claimDividend 0xf0fc6bca
No parameters
manualBurn 0x23b63585
uint256 amount
returns: bool
manualSend 0xf4293890
No parameters
openTrading 0xd1633649
uint256 _deadBlocks
removeBuyLimit 0x3e07ce5b
No parameters
setBlacklistEnabled 0x764ca512
No parameters
setBot 0x342aa8b5
address _address
bool toggle
setFee 0x69fe0e2d
uint256 _fee
setIsDividendExempt 0xf708a64f
address holder
bool exempt
setIsFeeExempt 0x658d4b7f
address holder
bool exempt
setMarketingWallet 0x5d098b38
address _marketingWallet
setSwapThresholdAmount 0x29e04b4a
uint256 amount
transfer 0xa9059cbb
address recipient
uint256 amount
returns: bool
transferFrom 0x23b872dd
address sender
address recipient
uint256 amount
returns: bool
transferOwnership 0xf2fde38b
address adr

Recent Transactions

No transactions found for this address