Cryo Explorer Ethereum Mainnet

Address Contract Verified

Address 0xFEb6d5238Ed8F1d59DCaB2db381AA948e625966D
Balance 0 ETH
Nonce 2
Code Size 15349 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

15349 bytes
0x6080604052600436106103fe5760003560e01c80637d1db4a511610213578063ca33e64c11610123578063f0b37c04116100ab578063f84ba65d1161007a578063f84ba65d14610cce578063f887ea4014610cee578063fe33b30214610d0e578063fe9fbb8014610d3e578063ffcc1fa814610d5e57600080fd5b8063f0b37c0414610c58578063f1366d9a14610c78578063f2fde38b14610c98578063f5676f8f14610cb857600080fd5b8063dd62ed3e116100f2578063dd62ed3e14610b92578063df20fd4914610bd8578063e405be2914610bf8578063e96fada214610c18578063ee8969c514610c3857600080fd5b8063ca33e64c14610b11578063d90ec3a714610b31578063daa09bf814610b51578063dbc993db14610b7157600080fd5b8063a4b45c00116101a6578063a9059cbb11610175578063a9059cbb14610a7b578063af6c9c1d14610a9b578063b00755df14610abb578063b6a5d7de14610adb578063bf56b37114610afb57600080fd5b8063a4b45c0014610a06578063a633423114610a26578063a7ccabdf14610a3b578063a8aa1b3114610a5b57600080fd5b80639215a2a4116101e25780639215a2a41461097b57806395d89b411461099e57806398118cb4146109cc578063a41d40e1146109e657600080fd5b80637d1db4a5146108a057806381530a92146108b6578063893d20e8146108d65780638f3184cd146108f457600080fd5b80633ab045de1161030e578063683c3063116102a15780636f2a4914116102705780636f2a4914146107f557806370a082311461080a578063715b1c3b14610840578063759f62a6146108605780637bdd90f01461088057600080fd5b8063683c30631461077f5780636b67c4df146107a05780636bad6a6a146107bf5780636ddd1713146107d457600080fd5b8063571ac8b0116102dd578063571ac8b0146106ff5780635c85974f1461071f578063658d4b7f1461073f57806366bb5dd31461075f57600080fd5b80633ab045de1461066a578063413f60921461069f57806342c7a6f7146106bf5780634fcd2446146106df57600080fd5b806321d13a66116103915780632f05205c116103605780632f05205c146105ca5780632f54bf6e146105eb578063313ce5671461061a57806331e02e0b1461062e57806332406b351461065057600080fd5b806321d13a661461055257806323b872dd146105745780632b112e49146105945780632b36a6d2146105a957600080fd5b806318160ddd116103cd57806318160ddd146104cf5780631936d368146104e45780631df4ccfc1461051c5780631fc9efa11461053c57600080fd5b80630445b6671461040a57806306fdde0314610433578063095ea7b31461046c5780631720513f1461049c57600080fd5b3661040557005b600080fd5b34801561041657600080fd5b5061042060075481565b6040519081526020015b60405180910390f35b34801561043f57600080fd5b506040805180820190915260078152662237b3b296aa2b60c91b60208201525b60405161042a919061391c565b34801561047857600080fd5b5061048c61048736600461356e565b610d8f565b604051901515815260200161042a565b3480156104a857600080fd5b506002546104bd90600160301b900460ff1681565b60405160ff909116815260200161042a565b3480156104db57600080fd5b50600454610420565b3480156104f057600080fd5b506105046104ff36600461370f565b610dfc565b6040516001600160a01b03909116815260200161042a565b34801561052857600080fd5b506002546104bd9062010000900460ff1681565b34801561054857600080fd5b5061042060065481565b34801561055e57600080fd5b5061057261056d366004613834565b610e26565b005b34801561058057600080fd5b5061048c61058f3660046134ff565b610e8c565b3480156105a057600080fd5b50610420610f50565b3480156105b557600080fd5b506002546104bd906301000000900460ff1681565b3480156105d657600080fd5b5060025461048c90600160581b900460ff1681565b3480156105f757600080fd5b5061048c61060636600461348c565b6000546001600160a01b0391821691161490565b34801561062657600080fd5b5060126104bd565b34801561063a57600080fd5b506002546104bd90640100000000900460ff1681565b34801561065c57600080fd5b50601b5461048c9060ff1681565b34801561067657600080fd5b5060025461068c90600160481b900461ffff1681565b60405161ffff909116815260200161042a565b3480156106ab57600080fd5b50601754610504906001600160a01b031681565b3480156106cb57600080fd5b506105726106da366004613834565b610fa2565b3480156106eb57600080fd5b506105726106fa366004613834565b61104b565b34801561070b57600080fd5b5061048c61071a36600461348c565b611187565b34801561072b57600080fd5b5061057261073a36600461370f565b611195565b34801561074b57600080fd5b5061057261075a366004613540565b611282565b34801561076b57600080fd5b5061057261077a36600461348c565b6112d2565b34801561078b57600080fd5b506002546104bd90600160381b900460ff1681565b3480156107ac57600080fd5b506002546104bd90610100900460ff1681565b3480156107cb57600080fd5b50601954610420565b3480156107e057600080fd5b5060175461048c90600160a01b900460ff1681565b34801561080157600080fd5b50610572611435565b34801561081657600080fd5b5061042061082536600461348c565b6001600160a01b03166000908152600e602052604090205490565b34801561084c57600080fd5b5061057261085b36600461370f565b611466565b34801561086c57600080fd5b5061057261087b366004613540565b61150f565b34801561088c57600080fd5b5061048c61089b36600461370f565b61155f565b3480156108ac57600080fd5b5061042060055481565b3480156108c257600080fd5b5061048c6108d1366004613741565b6115c8565b3480156108e257600080fd5b506000546001600160a01b0316610504565b34801561090057600080fd5b5061094a61090f36600461348c565b601560205260009081526040902080546001820154600283015460038401546004909401549293919290919060ff8082169161010090041686565b60408051968752602087019590955293850192909252606084015215156080830152151560a082015260c00161042a565b34801561098757600080fd5b506002546104bd9065010000000000900460ff1681565b3480156109aa57600080fd5b50604080518082019091526005815264122223aa2b60d91b602082015261045f565b3480156109d857600080fd5b506002546104bd9060ff1681565b3480156109f257600080fd5b50610572610a0136600461348c565b611619565b348015610a1257600080fd5b50610572610a213660046134c6565b61167a565b348015610a3257600080fd5b506105726116cd565b348015610a4757600080fd5b50610572610a5636600461348c565b611707565b348015610a6757600080fd5b50600d54610504906001600160a01b031681565b348015610a8757600080fd5b5061048c610a9636600461356e565b61174e565b348015610aa757600080fd5b50610572610ab636600461348c565b61175b565b348015610ac757600080fd5b5061048c610ad6366004613741565b6117b6565b348015610ae757600080fd5b50610572610af636600461348c565b611cfe565b348015610b0757600080fd5b5061042060035481565b348015610b1d57600080fd5b50600b54610504906001600160a01b031681565b348015610b3d57600080fd5b50610572610b4c366004613791565b611d4f565b348015610b5d57600080fd5b50610572610b6c366004613834565b611e71565b348015610b7d57600080fd5b506002546104bd90600160401b900460ff1681565b348015610b9e57600080fd5b50610420610bad3660046134c6565b6001600160a01b039182166000908152600f6020908152604080832093909416825291909152205490565b348015610be457600080fd5b50610572610bf33660046136f1565b611ed0565b348015610c0457600080fd5b50610572610c1336600461359a565b611f17565b348015610c2457600080fd5b50600c54610504906001600160a01b031681565b348015610c4457600080fd5b50610420610c5336600461370f565b611fb3565b348015610c6457600080fd5b50610572610c7336600461348c565b612181565b348015610c8457600080fd5b50610572610c9336600461370f565b6121cc565b348015610ca457600080fd5b50610572610cb336600461348c565b612256565b348015610cc457600080fd5b50610420601a5481565b348015610cda57600080fd5b50610572610ce9366004613540565b6122ec565b348015610cfa57600080fd5b50601654610504906001600160a01b031681565b348015610d1a57600080fd5b5061048c610d2936600461348c565b60106020526000908152604090205460ff1681565b348015610d4a57600080fd5b5061048c610d5936600461348c565b61233c565b348015610d6a57600080fd5b50610d7e610d7936600461370f565b61235a565b60405161042a9594939291906139c9565b336000818152600f602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610dea9086815260200190565b60405180910390a35060015b92915050565b60198181548110610e0c57600080fd5b6000918252602090912001546001600160a01b0316905081565b610e2f3361233c565b610e545760405162461bcd60e51b8152600401610e4b9061394f565b60405180910390fd5b6002805466ffff000000000019166501000000000060ff9384160266ff000000000000191617600160301b9390921692909202179055565b6004546001600160a01b0384166000908152600f60209081526040808320338452909152812054909114610f3b576040805180820182526016815275496e73756666696369656e7420416c6c6f77616e636560501b6020808301919091526001600160a01b0387166000908152600f82528381203382529091529190912054610f16918490612416565b6001600160a01b0385166000908152600f602090815260408083203384529091529020555b610f46848484612450565b90505b9392505050565b600a546001600160a01b03166000908152600e6020526040812054610f9d906009546001600160a01b03166000908152600e6020526040902054610f979060045490612ad1565b90612ad1565b905090565b610fab3361233c565b610fc75760405162461bcd60e51b8152600401610e4b9061394f565b60025460ff8084166401000000009092041610610ffd576002805464ff00000000191664010000000060ff851602179055611008565b601b805460ff191690555b60025460ff8083166301000000909204161061103c576002805460ff831663010000000263ff000000199091161790555050565b601b805460ff191690555b5050565b6110543361233c565b6110705760405162461bcd60e51b8152600401610e4b9061394f565b605061107c8284613a1a565b60ff1611156110cd5760405162461bcd60e51b815260206004820181905260248201527f446f676554562074617865732063616e206e65766572206578636565642038256044820152606401610e4b565b60025462010000900460ff166110e38284613a1a565b60ff1611156111455760405162461bcd60e51b815260206004820152602860248201527f446f676574762c2074617865732063616e206f6e6c792065766572206368616e604482015267676520726174696f60c01b6064820152608401610e4b565b6002805460ff8381166101000261ffff199092169085161717905561116a8183613a1a565b6002806101000a81548160ff021916908360ff1602179055505050565b6000610df682600454610d8f565b61119e3361233c565b6111ba5760405162461bcd60e51b8152600401610e4b9061394f565b60c86004546111c99190613a3f565b8110156112185760405162461bcd60e51b815260206004820181905260248201527f446f676554562c206d75737420626520686967686572207468616e20302e35256044820152606401610e4b565b600554811161127d5760405162461bcd60e51b815260206004820152602b60248201527f446f676554562c2063616e206f6e6c79206576657220696e637265617365207460448201526a1a19481d1e081b1a5b5a5d60aa1b6064820152608401610e4b565b600555565b61128b3361233c565b6112a75760405162461bcd60e51b8152600401610e4b9061394f565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b6112db3361233c565b6112f75760405162461bcd60e51b8152600401610e4b9061394f565b600c546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015611330573d6000803e3d6000fd5b50600c546040516370a0823160e01b81523060048201526001600160a01b038381169263a9059cbb9291169083906370a082319060240160206040518083038186803b15801561137f57600080fd5b505afa158015611393573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113b79190613728565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156113fd57600080fd5b505af1158015611411573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104791906136d4565b61143e3361233c565b61145a5760405162461bcd60e51b8152600401610e4b9061394f565b601b805460ff19169055565b61146f3361233c565b61148b5760405162461bcd60e51b8152600401610e4b9061394f565b60058110156114ee5760405162461bcd60e51b815260206004820152602960248201527f446f676554562c206d617820686f6c642063616e6e6f74206265206c657373206044820152687468616e20302e352560b81b6064820152608401610e4b565b6103e8816004546114ff9190613a75565b6115099190613a3f565b60065550565b6115183361233c565b6115345760405162461bcd60e51b8152600401610e4b9061394f565b6001600160a01b03919091166000908152601460205260409020805460ff1916911515919091179055565b600061156a3361233c565b6115865760405162461bcd60e51b8152600401610e4b9061394f565b60008281526018602052604081208181556001810182905560028101829055906115b360038301826133a5565b50600401805460ff191690555060015b919050565b60006115d33361233c565b6115ef5760405162461bcd60e51b8152600401610e4b9061394f565b61160182670de0b6b3a7640000613a75565b60008481526018602052604090205550600192915050565b6116223361233c565b61163e5760405162461bcd60e51b8152600401610e4b9061394f565b6001600160a01b031660009081526010602090815260408083208054600160ff1991821681179092556013909352922080549091169091179055565b6116833361233c565b61169f5760405162461bcd60e51b8152600401610e4b9061394f565b600b80546001600160a01b039384166001600160a01b031991821617909155600c8054929093169116179055565b6116d63361233c565b6116f25760405162461bcd60e51b8152600401610e4b9061394f565b6002805460ff60581b1916600160581b179055565b6117103361233c565b61172c5760405162461bcd60e51b8152600401610e4b9061394f565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b6000610f49338484612450565b6117643361233c565b6117805760405162461bcd60e51b8152600401610e4b9061394f565b6001600160a01b03166000908152601060209081526040808320805460ff19908116909155601390925290912080549091169055565b6000806117c284612b13565b905060006117d38260000151611fb3565b336000908152600e60205260409020549091508111156118495760405162461bcd60e51b815260206004820152602b60248201527f446f676554562c20596f7520646f6e74206861766520656e6f75676820746f6b60448201526a656e20666f72207468697360a81b6064820152608401610e4b565b600454336000908152600e6020526040812054600192829182919061186f90600a613a75565b6118799190613a3f565b611884906064613a75565b600254909150600160401b900460ff1681108015906118af5750600254600160381b900460ff168111155b156118bd5760029350600191505b600254600160301b900460ff168111156118d657600192505b85608001511561196857826119685760405162461bcd60e51b815260206004820152604c60248201527f446f676554563a2074686973207061636b616765206973206e6f74206176616960448201527f6c61626c6520746f20616e796f6e65206e6f7420686f6c64696e67207468652060648201526b726571756972656d656e747360a01b608482015260a401610e4b565b6119728486613a3f565b94506119b16040518060c00160405280600081526020016000815260200160008152602001600081526020016000151581526020016000151581525090565b83611bc557866080015115611a2e5760405162461bcd60e51b815260206004820152603760248201527f4454562c206f6e6c7920686967682070657263656e7461676520686f6c64657260448201527f732063616e20686176652074686973207061636b6167650000000000000000006064820152608401610e4b565b336000908152600e602052604081208054889290611a4d908490613a94565b90915550611a5e9050600287613a3f565b6009546001600160a01b03166000908152600e602052604081208054909190611a88908490613a02565b90915550506009546001600160a01b031633600080516020613ba0833981519152611ab460028a613a3f565b60405190815260200160405180910390a3611ad0600287613a3f565b6017546001600160a01b03166000908152600e602052604081208054909190611afa908490613a02565b90915550506017546001600160a01b0316634d6ce1e5611b1b600289613a3f565b6040518263ffffffff1660e01b8152600401611b3991815260200190565b602060405180830381600087803b158015611b5357600080fd5b505af1158015611b67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8b91906136d4565b506017546001600160a01b031633600080516020613ba0833981519152611bb360028a613a3f565b60405190815260200160405180910390a35b60408088015190820152821515608082015283151560a0820152428152606081018990526020870151611bfb9062015180613a75565b611c059042613a02565b602082015260608701516040517f39dc1b34ded6b839d48dab8499d0500ef59a8747e57b4c3216747b22ede5a25191611c40913391906138f8565b60405180910390a133600081815260156020908152604080832085518155918501516001808401919091559085015160028301556060850151600383015560808501516004909201805460a09096015161ffff1990961692151561ff001916929092176101009515159590950294909417905560198054808501825591527f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c96950180546001600160a01b03191690911790559998505050505050505050565b6000546001600160a01b03163314611d285760405162461bcd60e51b8152600401610e4b9061392f565b6001600160a01b03166000908152600160208190526040909120805460ff19169091179055565b611d583361233c565b611d745760405162461bcd60e51b8152600401610e4b9061394f565b611da86040518060a00160405280600081526020016000815260200160008152602001606081526020016000151581525090565b602080820186905260408083018990528051601f86018390048302810183019091528481529085908590819084018382808284376000920191909152505050506060820152611dff86670de0b6b3a7640000613a75565b815281151560808201526000878152601860209081526040918290208351815581840151600182015591830151600283015560608301518051849392611e4c9260038501929101906133e2565b50608091909101516004909101805460ff191691151591909117905550505050505050565b611e7a3361233c565b611e965760405162461bcd60e51b8152600401610e4b9061394f565b6002805468ffff000000000000001916600160381b60ff9384160268ff0000000000000000191617600160401b9390921692909202179055565b611ed93361233c565b611ef55760405162461bcd60e51b8152600401610e4b9061394f565b60178054921515600160a01b0260ff60a01b1990931692909217909155600755565b611f203361233c565b611f3c5760405162461bcd60e51b8152600401610e4b9061394f565b60005b81811015611fae57600160146000858585818110611f5f57611f5f613b50565b9050602002016020810190611f74919061348c565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611fa681613b09565b915050611f3f565b505050565b6040805160038082526080820190925260009182919060208201606080368337505060085482519293506001600160a01b031691839150600090611ff957611ff9613b50565b6001600160a01b03928316602091820292909201810191909152601654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561204d57600080fd5b505afa158015612061573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208591906134a9565b8160018151811061209857612098613b50565b60200260200101906001600160a01b031690816001600160a01b03168152505030816002815181106120cc576120cc613b50565b6001600160a01b03928316602091820292909201015260165460405163d06ca61f60e01b815291169063d06ca61f9061210b9086908590600401613974565b60006040518083038186803b15801561212357600080fd5b505afa158015612137573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261215f919081019061360f565b60028151811061217157612171613b50565b6020026020010151915050919050565b6000546001600160a01b031633146121ab5760405162461bcd60e51b8152600401610e4b9061392f565b6001600160a01b03166000908152600160205260409020805460ff19169055565b6121d53361233c565b6121f15760405162461bcd60e51b8152600401610e4b9061394f565b60648110156122425760405162461bcd60e51b815260206004820152601e60248201527f446f676554563a206d61782073656c6c2070657263656e7420697320312500006044820152606401610e4b565b806004546122509190613a3f565b60075550565b6000546001600160a01b031633146122805760405162461bcd60e51b8152600401610e4b9061392f565b600080546001600160a01b0319166001600160a01b038316908117825580825260016020818152604093849020805460ff191690921790915591519081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc686163910160405180910390a150565b6122f53361233c565b6123115760405162461bcd60e51b8152600401610e4b9061394f565b6001600160a01b03919091166000908152601260205260409020805460ff1916911515919091179055565b6001600160a01b031660009081526001602052604090205460ff1690565b60186020526000908152604090208054600182015460028301546003840180549394929391929161238a90613ace565b80601f01602080910402602001604051908101604052809291908181526020018280546123b690613ace565b80156124035780601f106123d857610100808354040283529160200191612403565b820191906000526020600020905b8154815290600101906020018083116123e657829003601f168201915b5050506004909301549192505060ff1685565b6000818484111561243a5760405162461bcd60e51b8152600401610e4b919061391c565b5060006124478486613a94565b95945050505050565b600254600090600160581b900460ff166124e7576000546001600160a01b038581169116146124e75760405162461bcd60e51b815260206004820152603860248201527f446f676554562c204f6e6c79206f776e6572206f722070726573616c6520436f60448201527f6e747261637420616c6c6f77656420746f20616464204c5000000000000000006064820152608401610e4b565b6000546001600160a01b0385811691161480159061251357506000546001600160a01b03848116911614155b156125f3576001600160a01b03831660009081526010602052604090205460ff1615801561255a57506001600160a01b03831660009081526013602052604090205460ff16155b156125f35760065482612582856001600160a01b03166000908152600e602052604090205490565b61258c9190613a02565b11156125f35760405162461bcd60e51b815260206004820152603060248201527f446f676554562c2063616e7420686f6c64206d6f7265207468616e206d61782060448201526f686f6c6420647564652c20736f72727960801b6064820152608401610e4b565b6125fe848484612c2c565b6001600160a01b03841660009081526014602052604090205460ff1615801561264057506001600160a01b03831660009081526014602052604090205460ff16155b6126985760405162461bcd60e51b8152602060048201526024808201527f446f676554562c20536f7272792062726f2c20796f75726520626c61636b6c696044820152631cdd195960e21b6064820152608401610e4b565b6003541580156126c057506001600160a01b03831660009081526010602052604090205460ff165b156126f0576001600160a01b0384166000908152600e60205260409020546126e757600080fd5b6126f042600355565b601754600160a81b900460ff16156127145761270d848484612cc6565b9050610f49565b604080518082018252601c81527f446f676554562c20496e73756666696369656e742042616c616e6365000000006020808301919091526001600160a01b0387166000908152600e909152919091205461276f918490612416565b6001600160a01b038086166000908152600e602090815260408083209490945591861681526010909152205460ff16156129c9576001600160a01b03841660009081526015602052604090206004015460ff80821691610100900416801561288a576002546001600160a01b0387166000908152600e6020526040902054600160301b90910460ff169060649061280790600a613a75565b6128119190613a3f565b101561288a576001600160a01b0386166000818152601560209081526040808320838155600181018490556002810184905560038101939093556004909201805461ffff1916905590519182527f4bb63b43e31da369bd81d81e679aa662904e90c88dee0dd4bed8876ab83a18bc910160405180910390a15b81156129c6576002546001600160a01b0387166000908152600e6020526040902054600160401b90910460ff16906064906128c690600a613a75565b6128d09190613a3f565b10156129c6576001600160a01b0386166000908152601560205260409020805460019091015460029161290291613a94565b61290c9190613a3f565b6001600160a01b03871660009081526015602052604090205461292f9190613a02565b6001600160a01b038716600090815260156020526040902060010181905542116129c6576001600160a01b0386166000818152601560209081526040808320838155600181018490556002810184905560038101939093556004909201805461ffff1916905590519182527f4bb63b43e31da369bd81d81e679aa662904e90c88dee0dd4bed8876ab83a18bc910160405180910390a15b50505b6001600160a01b03841660009081526011602052604081205460ff16151580612a0c57506001600160a01b03841660009081526011602052604090205460ff1615155b15612a18575081612a43565b6001600160a01b03851660009081526010602052604090205460ff16612a3f868286612d9a565b9150505b612a4c84612e76565b15612a5957612a59612ee2565b6001600160a01b0384166000908152600e6020526040902054612a7c908261325c565b6001600160a01b038086166000818152600e60205260409081902093909355915190871690600080516020613ba083398151915290612abe9085815260200190565b60405180910390a3506001949350505050565b6000610f4983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612416565b612b476040518060a00160405280600081526020016000815260200160008152602001606081526020016000151581525090565b601860008381526020019081526020016000206040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382018054612b9390613ace565b80601f0160208091040260200160405190810160405280929190818152602001828054612bbf90613ace565b8015612c0c5780601f10612be157610100808354040283529160200191612c0c565b820191906000526020600020905b815481529060010190602001808311612bef57829003601f168201915b50505091835250506004919091015460ff16151560209091015292915050565b6000546001600160a01b03848116911614801590612c5857506000546001600160a01b03838116911614155b15611fae5760055481111580612c8657506001600160a01b03831660009081526012602052604090205460ff165b611fae5760405162461bcd60e51b8152602060048201526011602482015270151608131a5b5a5d08115e18d959591959607a1b6044820152606401610e4b565b6040805180820182526014815273496e73756666696369656e742042616c616e636560601b6020808301919091526001600160a01b0386166000908152600e90915291822054612d17918490612416565b6001600160a01b038086166000908152600e60205260408082209390935590851681522054612d46908361325c565b6001600160a01b038085166000818152600e60205260409081902093909355915190861690600080516020613ba083398151915290612d889086815260200190565b60405180910390a35060019392505050565b600254601b5460009160ff620100009091048116911615612dd957506002546301000000900460ff168315612dd95750600254640100000000900460ff165b600254600090612dfe90600160481b900461ffff16612df886856132bb565b9061333a565b306000908152600e6020526040902054909150612e1b908261325c565b306000818152600e6020526040908190209290925590516001600160a01b03881690600080516020613ba083398151915290612e5a9085815260200190565b60405180910390a3612e6c8482612ad1565b9695505050505050565b601754600090600160a81b900460ff16158015612e9c5750601754600160a01b900460ff165b8015612ec057506001600160a01b03821660009081526010602052604090205460ff165b8015610df65750600754306000908152600e6020526040902054101592915050565b6017805460ff60a81b1916600160a81b17905560025460009060ff1615612f2a5760028054600754612f279291612df89160ff620100008304811692849291166132bb565b90505b600754600090612f3a9083612ad1565b60408051600280825260608201835292935060009290916020830190803683370190505090503081600081518110612f7457612f74613b50565b6001600160a01b03928316602091820292909201810191909152601654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015612fc857600080fd5b505afa158015612fdc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061300091906134a9565b8160018151811061301357613013613b50565b6001600160a01b03928316602091820292909201015260165447911663791ac9478460008530613044426064613a02565b6040518663ffffffff1660e01b815260040161306495949392919061398d565b600060405180830381600087803b15801561307e57600080fd5b505af1158015613092573d6000803e3d6000fd5b5050505060006130ab8247612ad190919063ffffffff16565b600280549192506000916130c2919060ff16613a53565b6002546130d8919062010000900460ff16613aab565b60ff169050801561324757600254600090610100900460ff161561314f57600254613112908390612df8908690610100900460ff166132bb565b600c546040519192506001600160a01b03169082156108fc029083906000818181858888f1935050505015801561314d573d6000803e3d6000fd5b505b86156132455760006131618285613a94565b601654600b5460405163f305d71960e01b8152306004820152602481018c905260006044820181905260648201526001600160a01b0391821660848201524260a4820152929350169063f305d71990839060c4016060604051808303818588803b1580156131ce57600080fd5b505af11580156131e2573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906132079190613763565b505060408051838152602081018b90527f424db2872186fa7e7afa7a5e902ed3b49a2ef19c2f5431e672462495dd6b450692500160405180910390a1505b505b50506017805460ff60a81b1916905550505050565b6000806132698385613a02565b905083811015610f495760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610e4b565b6000826132ca57506000610df6565b60006132d68385613a75565b9050826132e38583613a3f565b14610f495760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610e4b565b6000610f4983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250600081836133985760405162461bcd60e51b8152600401610e4b919061391c565b5060006124478486613a3f565b5080546133b190613ace565b6000825580601f106133c1575050565b601f0160209004906000526020600020908101906133df9190613466565b50565b8280546133ee90613ace565b90600052602060002090601f0160209004810192826134105760008555613456565b82601f1061342957805160ff1916838001178555613456565b82800160010185558215613456579182015b8281111561345657825182559160200191906001019061343b565b50613462929150613466565b5090565b5b808211156134625760008155600101613467565b803560ff811681146115c357600080fd5b60006020828403121561349e57600080fd5b8135610f4981613b7c565b6000602082840312156134bb57600080fd5b8151610f4981613b7c565b600080604083850312156134d957600080fd5b82356134e481613b7c565b915060208301356134f481613b7c565b809150509250929050565b60008060006060848603121561351457600080fd5b833561351f81613b7c565b9250602084013561352f81613b7c565b929592945050506040919091013590565b6000806040838503121561355357600080fd5b823561355e81613b7c565b915060208301356134f481613b91565b6000806040838503121561358157600080fd5b823561358c81613b7c565b946020939093013593505050565b600080602083850312156135ad57600080fd5b823567ffffffffffffffff808211156135c557600080fd5b818501915085601f8301126135d957600080fd5b8135818111156135e857600080fd5b8660208260051b85010111156135fd57600080fd5b60209290920196919550909350505050565b6000602080838503121561362257600080fd5b825167ffffffffffffffff8082111561363a57600080fd5b818501915085601f83011261364e57600080fd5b81518181111561366057613660613b66565b8060051b604051601f19603f8301168101818110858211171561368557613685613b66565b604052828152858101935084860182860187018a10156136a457600080fd5b600095505b838610156136c75780518552600195909501949386019386016136a9565b5098975050505050505050565b6000602082840312156136e657600080fd5b8151610f4981613b91565b6000806040838503121561370457600080fd5b823561358c81613b91565b60006020828403121561372157600080fd5b5035919050565b60006020828403121561373a57600080fd5b5051919050565b6000806040838503121561375457600080fd5b50508035926020909101359150565b60008060006060848603121561377857600080fd5b8351925060208401519150604084015190509250925092565b60008060008060008060a087890312156137aa57600080fd5b863595506020870135945060408701359350606087013567ffffffffffffffff808211156137d757600080fd5b818901915089601f8301126137eb57600080fd5b8135818111156137fa57600080fd5b8a602082850101111561380c57600080fd5b602083019550809450505050608087013561382681613b91565b809150509295509295509295565b6000806040838503121561384757600080fd5b6138508361347b565b915061385e6020840161347b565b90509250929050565b600081518084526020808501945080840160005b838110156138a05781516001600160a01b03168752958201959082019060010161387b565b509495945050505050565b6000815180845260005b818110156138d1576020818501810151868301820152016138b5565b818111156138e3576000602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0383168152604060208201819052600090610f46908301846138ab565b602081526000610f4960208301846138ab565b60208082526006908201526510a7aba722a960d11b604082015260600190565b6020808252600b908201526a085055551213d49256915160aa1b604082015260600190565b828152604060208201526000610f466040830184613867565b85815284602082015260a0604082015260006139ac60a0830186613867565b6001600160a01b0394909416606083015250608001529392505050565b85815284602082015283604082015260a0606082015260006139ee60a08301856138ab565b905082151560808301529695505050505050565b60008219821115613a1557613a15613b24565b500190565b600060ff821660ff84168060ff03821115613a3757613a37613b24565b019392505050565b600082613a4e57613a4e613b3a565b500490565b600060ff831680613a6657613a66613b3a565b8060ff84160491505092915050565b6000816000190483118215151615613a8f57613a8f613b24565b500290565b600082821015613aa657613aa6613b24565b500390565b600060ff821660ff841680821015613ac557613ac5613b24565b90039392505050565b600181811c90821680613ae257607f821691505b60208210811415613b0357634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613b1d57613b1d613b24565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146133df57600080fd5b80151581146133df57600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220308b5a7910be6eb522cf0fdea430079b289eab6b56c0ae2021716b529e5bd4b164736f6c63430008070033

Verified Source Code Full Match

Compiler: v0.8.7+commit.e28d00a7 EVM: london Optimization: Yes (200 runs)
DogeTV.sol 740 lines
pragma solidity ^0.8.7;
//SPDX-License-Identifier: UNLICENCED
/*
    DogeTV
    8% tax on buy and sell, 8% tax on transfers
    starting taxes: 20/25%
    contract dev: @CryptoBatmanBSC
    Telegram:
    https://t.me/dogetvofficial
    Website: 
    https://Dogetv.app 
*/

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;
    }
}

interface INFTREWARDS {
    function Deposit(uint256 amount) external returns (bool success);
}

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);
}

abstract contract Auth {
    address internal owner;
    mapping (address => bool) internal authorizations;

    constructor(address _owner) {
        owner = _owner;
        authorizations[_owner] = true;
    }

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

    /**
     * Function modifier to require caller to be authorized
     */
    modifier authorized() {
        require(isAuthorized(msg.sender), "!AUTHORIZED"); _;
    }

    /**
     * Authorize address. Owner only
     */
    function authorize(address adr) public onlyOwner {
        authorizations[adr] = true;
    }

    /**
     * Remove address' authorization. Owner only
     */
    function unauthorize(address adr) public onlyOwner {
        authorizations[adr] = false;
    }

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

    /**
     * Return address' authorization status
     */
    function isAuthorized(address adr) public view returns (bool) {
        return authorizations[adr];
    }

    /**
     * Transfer ownership to new address. Caller must be owner. Leaves old owner authorized
     */
    function transferOwnership(address payable adr) public onlyOwner {
        owner = adr;
        authorizations[adr] = true;
        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;
    
    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}


contract DogeTV is IERC20, Auth {

    struct DogeTvPackage{
        uint256 price;
        uint256 durationDays;
        uint256 packageID;
        string name;
        bool isOnlySpecial;
    }

    struct SubbedTvPackage{
        uint256 subbedTime;
        uint256 expiration_time;
        uint256 packageID;
        uint256 packageVariant;
        bool wasDiscounted;
        bool isSpecial;
    }

    using SafeMath for uint256;
    // fees. all uint8 for gas efficiency and storage.
    /* @dev   
        all fees are set with 1 decimal places added, please remember this when setting fees.
    */
    uint8 public liquidityFee = 20;
    uint8 public marketingFee = 60;
    uint8 public totalFee = 80;

    uint8 public initialSellFee = 250;
    uint8 public initialBuyFee = 200;

    /*
    @dev:
        these are multipled by 10 so that you can have fractional percents
    */
    uint8 public specialPercentHigh = 20;
    uint8 public specialPercentLow = 16;

    uint8 public discountPercentHigh = 15;
    uint8 public discountPercentLow = 10;


    // denominator. uint 16 for storage efficiency - makes the above fees all to 1 dp.
    uint16 public AllfeeDenominator = 1000;
    
    // trading control;
    bool public canTrade = false;
    uint256 public launchedAt;
    
    
    // tokenomics - uint256 BN but located here fro storage efficiency
    uint256 _totalSupply = 1 * 10**7 * (10 **_decimals); //10 mil
    uint256 public _maxTxAmount = _totalSupply / 100; // 1%
    uint256 public _maxHoldAmount = _totalSupply / 50; // 2%
    uint256 public swapThreshold = _totalSupply / 500; // 0.2%

    //Important addresses    
    address USDT = 0xdAC17F958D2ee523a2206206994597C13D831ec7; // mainnet tether, used to get price;
    //address USDT = 0xF99a0CbEa2799f8d4b51709024454F74eD63a86D;
    address DEAD = 0x000000000000000000000000000000000000dEaD;
    address ZERO = 0x0000000000000000000000000000000000000000;

    address public autoLiquidityReceiver;
    address public marketingFeeReceiver;

    address public pair;

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

    mapping (address => bool) public pairs;

    mapping (address => bool) isFeeExempt;
    mapping (address => bool) isTxLimitExempt;
    mapping (address => bool) isMaxHoldExempt;
    mapping (address => bool) isBlacklisted;

    mapping (address => SubbedTvPackage) public userSubs;

    IDEXRouter public router;
    INFTREWARDS public NftStakingContract;


    bool public swapEnabled = true;
    bool inSwap;
    mapping(uint =>  DogeTvPackage) public DtvPackages;
    //DogeTvPackage[] public DtvPackages;
    address[] public subbedUsers;
    uint public totalSubs;
    modifier swapping() { inSwap = true; _; inSwap = false; }

    string constant _name = "Doge-TV";
    string constant _symbol = "$DGTV";
    uint8 constant _decimals = 18;

    bool public initialTaxesEnabled = true;

    constructor (address tokenOwner) Auth(tokenOwner) {
        router = IDEXRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); //Mainnet Uniswap
        pair = IDEXFactory(router.factory()).createPair(router.WETH(), address(this)); // ETH pair
        pairs[pair] = true;
        _allowances[address(this)][address(router)] = _totalSupply;
        isMaxHoldExempt[pair] = true;
        isMaxHoldExempt[DEAD] = true;
        isMaxHoldExempt[ZERO] = true;
        
        owner = tokenOwner;
        DummyNFT nftctrct = new DummyNFT(address(this), owner);
        NftStakingContract = INFTREWARDS(nftctrct);
        isTxLimitExempt[owner] = true;
        isFeeExempt[owner] = true;
        authorizations[owner] = true;
        isMaxHoldExempt[owner] = true;
        autoLiquidityReceiver = owner;
        marketingFeeReceiver = owner;

        _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 getEstimatedTokenForUSDT(uint USDTAmount) public view returns (uint) {
            address[] memory path = new address[](3);
                path[0] = USDT;
                path[1] = router.WETH();
                path[2] = address(this);
            return router.getAmountsOut(USDTAmount, path)[2];
    }
    
    function setBlacklistedStatus(address walletToBlacklist, bool isBlacklistedBool)external authorized{
        isBlacklisted[walletToBlacklist] = isBlacklistedBool;
    }

    function setBlacklistArray(address[] calldata walletToBlacklistArray)external authorized{
        for(uint i = 0; i < walletToBlacklistArray.length; i++){
            isBlacklisted[walletToBlacklistArray[i]] = true;
        }
    }

    function getPackageWithId(uint ID) internal view returns (DogeTvPackage memory package){
                return DtvPackages[ID];
    }

    function subToPackage(uint _packageID, uint durationVariant)external returns(bool success){
            /*
             struct SubbedTvPackage{
                uint256 expiration_time;
                uint256 packageID;
                bool wasDiscounted;
                bool isSpecial;
            }
            */
            DogeTvPackage memory pack = getPackageWithId(_packageID);
            // get the price in token
            uint256 tokenPrice = getEstimatedTokenForUSDT(pack.price);
            
            require(_balances[msg.sender] >= tokenPrice, "DogeTV, You dont have enough token for this");
            uint divisor = 1;
            bool isfree = false;
            bool isDiscounted = false;
            uint256 percentageHeld = ((_balances[msg.sender]*10) / _totalSupply) * 100;
            if(percentageHeld >= discountPercentLow && percentageHeld <= discountPercentHigh){
                divisor = 2;
                isDiscounted = true;
            }
            if(percentageHeld > specialPercentLow){
                isfree = true;
            }
            if(pack.isOnlySpecial){
                require(isfree, "DogeTV: this package is not available to anyone not holding the requirements");
            }
            tokenPrice = tokenPrice / divisor;
            SubbedTvPackage memory packageSubbed;
            if(!isfree){
                require(!pack.isOnlySpecial, "DTV, only high percentage holders can have this package");
                _balances[msg.sender] -= tokenPrice;
                _balances[DEAD] += tokenPrice /2;
                emit Transfer(msg.sender, DEAD, tokenPrice/2);
                _balances[address(NftStakingContract)]+= tokenPrice/2;
                NftStakingContract.Deposit(tokenPrice/2);
                emit Transfer(msg.sender, address(NftStakingContract), tokenPrice/2);
            }
            
            packageSubbed.packageID =  pack.packageID;
            packageSubbed.wasDiscounted = isDiscounted;
            packageSubbed.isSpecial = isfree;
            packageSubbed.subbedTime = block.timestamp;
            packageSubbed.packageVariant = durationVariant;
            packageSubbed.expiration_time = block.timestamp + pack.durationDays * 86400;
            emit PackageSubbed(msg.sender, pack.name);
            userSubs[msg.sender] = packageSubbed;
            subbedUsers.push(msg.sender);
            return true;
    }

    function checkSubs(address user)internal view returns (bool wasdiscounted, bool isSpecial){
        return (userSubs[user].wasDiscounted,userSubs[user].isSpecial );
    }

    function getSubbedUsersLength()external view returns (uint SubbedUsersLength){
        return subbedUsers.length;
    }

    function setNFTContract(INFTREWARDS ctrct)external authorized{
        NftStakingContract = ctrct;
    }

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

    function setSwapThresholdDivisor(uint divisor)external authorized {
        require(divisor >= 100, "DogeTV: max sell percent is 1%");
        swapThreshold = _totalSupply / divisor;
    }
    
    function approveMax(address spender) external returns (bool) {
        return approve(spender, _totalSupply);
    }
    
    function setmaxholdpercentage(uint256 percentageMul10) external authorized {
        require(percentageMul10 >= 5, "DogeTV, max hold cannot be less than 0.5%"); // cant change percentage below 0.5%, so everyone can hold the percentage
        _maxHoldAmount = _totalSupply * percentageMul10 / 1000; // percentage based on amount
    }
    
    function allowtrading()external authorized {
        canTrade = true;
    }
    
    function addNewPair(address newPair)external authorized{
        pairs[newPair] = true;
        isMaxHoldExempt[newPair] = true;
    }
    
    function removePair(address pairToRemove)external authorized{
        pairs[pairToRemove] = false;
        isMaxHoldExempt[pairToRemove] = false;
    }

    function addTVPackage( uint256 ppvID, uint256 _USDTPriceNoDecimals, uint256 _durationDays, string calldata packName, bool onlyTopHolders) external authorized {
        DogeTvPackage memory packageToAdd;
        packageToAdd.durationDays = _durationDays;
        packageToAdd.packageID = ppvID;
        packageToAdd.name = packName;
        packageToAdd.price = _USDTPriceNoDecimals * 10 ** 18;
        packageToAdd.isOnlySpecial = onlyTopHolders;
        DtvPackages[ppvID] = packageToAdd;
    }

    function changeTvPackagePrice(uint256 _ID, uint256 newPrice) external authorized returns(bool success){
                DtvPackages[_ID].price = newPrice * 10 ** 18;
                return true;
    }

    function removeTvPackage(uint256 _ID) external authorized returns(bool success){
                delete DtvPackages[_ID];
                return true;
    }
    
    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] != uint256(_totalSupply)){
            _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(!canTrade){
            require(sender == owner, "DogeTV, Only owner or presale Contract allowed to add LP"); // only owner allowed to trade or add liquidity
        }
        if(sender != owner && recipient != owner){
            if(!pairs[recipient] && !isMaxHoldExempt[recipient]){
                require (balanceOf(recipient) + amount <= _maxHoldAmount, "DogeTV, cant hold more than max hold dude, sorry");
            }
        }
        
        checkTxLimit(sender, recipient, amount);
        require(!isBlacklisted[sender] && !isBlacklisted[recipient], "DogeTV, Sorry bro, youre blacklisted");
        if(!launched() && pairs[recipient]){ require(_balances[sender] > 0); launch(); }
        if(inSwap){ return _basicTransfer(sender, recipient, amount); }
        
        _balances[sender] = _balances[sender].sub(amount, "DogeTV, Insufficient Balance");

        if(pairs[recipient]){
            // its a sell
            /*
                struct SubbedTvPackage{
                    uint256 subbedTime;
                    uint256 expiration_time;
                    uint256 packageID;
                    uint256 packageVariant;
                    bool wasDiscounted;
                    bool isSpecial;
                }
            */
            (bool discounted, bool special) = checkSubs(sender);
            if(special){
                if((_balances[sender] * 10 /100) < specialPercentLow){ // theyve crossed the threshold
                    delete userSubs[sender];
                    emit SubWithdrawn(sender);
                }
            }
            if(discounted){
                 if((_balances[sender] * 10 /100) < discountPercentLow){ // theyve crossed the threshold
                     userSubs[sender].expiration_time = userSubs[sender].subbedTime + ((userSubs[sender].expiration_time - userSubs[sender].subbedTime) / 2);
                     if(userSubs[sender].expiration_time >= block.timestamp){
                        delete userSubs[sender];
                        emit SubWithdrawn(sender);
                     }
                }
            }
        }

        uint256 amountReceived = 0;
        if(!shouldTakeFee(sender) || !shouldTakeFee(recipient)){
            amountReceived = amount;
        }else{
            bool isbuy = pairs[sender];
            amountReceived = takeFee(sender, isbuy, amount);
        }

        if(shouldSwapBack(recipient)){ swapBack(); }

        _balances[recipient] = _balances[recipient].add(amountReceived);

        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 checkTxLimit(address sender, address reciever, uint256 amount) internal view {
        if(sender != owner && reciever != owner){
            require(amount <= _maxTxAmount || isTxLimitExempt[sender], "TX Limit Exceeded");
        }
    }

    function shouldTakeFee(address endpt) internal view returns (bool) {
        
        return !isFeeExempt[endpt];
    }

    function takeFee(address sender, bool isBuy, uint256 amount) internal returns (uint256) {
        uint fee = totalFee;
        if(initialTaxesEnabled){
            fee = initialSellFee;
            if(isBuy){
                fee = initialBuyFee;
            }
        }

        uint256 feeAmount = amount.mul(fee).div(AllfeeDenominator);
        
        _balances[address(this)] = _balances[address(this)].add(feeAmount);
        emit Transfer(sender, address(this), feeAmount);

        return amount.sub(feeAmount);
    }

    function setInitialfees(uint8 _initialBuyFeePercentMul10, uint8 _initialSellFeePercentMul10) external authorized {
        if(initialBuyFee >= _initialBuyFeePercentMul10){initialBuyFee = _initialBuyFeePercentMul10;}else{initialTaxesEnabled = false;}
        if(initialSellFee >= _initialSellFeePercentMul10){initialSellFee = _initialSellFeePercentMul10;}else{initialTaxesEnabled = false;}
    }

    // returns any mis-sent tokens to the marketing wallet
    function claimtokensback(IERC20 tokenAddress) external authorized {
        payable(marketingFeeReceiver).transfer(address(this).balance);
        tokenAddress.transfer(marketingFeeReceiver, tokenAddress.balanceOf(address(this)));
    }

    function launched() internal view returns (bool) {
        return launchedAt != 0;
    }

    function launch() internal {
        launchedAt = block.timestamp;
    }

    function stopInitialTax()external authorized{
        // this can only ever be called once
        initialTaxesEnabled = false;
    }

    function setTxLimit(uint256 amount) external authorized {
        require(amount >= _totalSupply / 200, "DogeTV, must be higher than 0.5%");
        require(amount > _maxTxAmount, "DogeTV, can only ever increase the tx limit");
        _maxTxAmount = amount;
    }

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


    function setIsTxLimitExempt(address holder, bool exempt) external authorized {
        isTxLimitExempt[holder] = exempt;
    }
    /*
    Dev sets the individual buy fees
    */
    function setFees(uint8 _liquidityFeeMul10, uint8 _marketingFeeMul10) external authorized {
        require(_liquidityFeeMul10 + _marketingFeeMul10 <= 80, "DogeTV taxes can never exceed 8%");
        require(_liquidityFeeMul10 + _marketingFeeMul10 <= totalFee, "Dogetv, taxes can only ever change ratio");
        liquidityFee = _liquidityFeeMul10;
        marketingFee = _marketingFeeMul10;
       
        totalFee = _liquidityFeeMul10 + (_marketingFeeMul10) ;
    }

    function setSpecialPackPercentages(uint8 percentLowerMul10, uint8 percentHigherMul10) external authorized {
        
        specialPercentHigh = percentHigherMul10;
        specialPercentLow = percentLowerMul10;
       
    }

    function setDiscountPackPercentages(uint8 percentLowerMul10, uint8 percentHigherMul10) external authorized {
        
        discountPercentHigh = percentHigherMul10;
        discountPercentLow = percentLowerMul10;
       
    }
    
    function swapBack() internal swapping {
        uint256 amountToLiquify = 0;
        if(liquidityFee > 0){
            amountToLiquify = swapThreshold.mul(liquidityFee).div(totalFee).div(2); // leave some tokens for liquidity addition
        }
        
        uint256 amountToSwap = swapThreshold.sub(amountToLiquify); // swap everything bar the liquidity tokens. we need to add a pair

        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = router.WETH();
        uint256 balanceBefore = address(this).balance;
        
        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amountToSwap,
            0,
            path,
            address(this),
            block.timestamp + 100
        );

        uint256 amountETH = address(this).balance.sub(balanceBefore);
        
        uint256 totalETHFee = totalFee - (liquidityFee /2);
        if(totalETHFee > 0){
            uint256 amountETHMarketing = 0;
            if(marketingFee > 0){
                amountETHMarketing = amountETH.mul(marketingFee).div(totalETHFee);
                payable(marketingFeeReceiver).transfer(amountETHMarketing);
            }
            if(amountToLiquify > 0){
                
                uint256 amountETHLiquidity = amountETH - amountETHMarketing;
                router.addLiquidityETH{value: amountETHLiquidity}(
                    address(this),
                    amountToLiquify,
                    0,
                    0,
                    autoLiquidityReceiver,
                    block.timestamp
                );
                emit AutoLiquify(amountETHLiquidity, amountToLiquify);
            }
        }
    }

    function setFeeReceivers(address _autoLiquidityReceiver, address _marketingFeeReceiver) external authorized {
        autoLiquidityReceiver = _autoLiquidityReceiver;
        marketingFeeReceiver = _marketingFeeReceiver;
    }

    function setSwapBackSettings(bool _enabled, uint256 _amount) external authorized {
        swapEnabled = _enabled;
        swapThreshold = _amount;
    }
    
    function shouldSwapBack(address recipient) internal view returns (bool) {
        return !inSwap
        && swapEnabled
        && pairs[recipient]
        && _balances[address(this)] >= swapThreshold;
    }
    
    function getCirculatingSupply() public view returns (uint256) {
        return _totalSupply.sub(balanceOf(DEAD)).sub(balanceOf(ZERO));
    }

    event AutoLiquify(uint256 amountPairToken, uint256 amountToken);
    event PackageSubbed(address user,string packName);
    event SubWithdrawn(address user);

}

contract DummyNFT is INFTREWARDS {

    address public owner;
    IERC20 public rewardToken;
    uint256 oldBalance;

    function Deposit(uint amount) external override returns (bool success) {
        require(oldBalance + amount == rewardToken.balanceOf(address(this)));
        // reflect the amount here
        oldBalance = rewardToken.balanceOf(address(this));
        return true;

    }

    function claimTokensBack()external {
        require(msg.sender == owner);
        rewardToken.transfer(msg.sender, rewardToken.balanceOf(address(this)));
        oldBalance = rewardToken.balanceOf(address(this));
    }

     constructor (address rewardsToken, address _owner){
         owner = _owner;
         rewardToken = IERC20(rewardsToken);
     }

}

Read Contract

AllfeeDenominator 0x3ab045de → uint16
DtvPackages 0xffcc1fa8 → uint256, uint256, uint256, string, bool
NftStakingContract 0x413f6092 → address
_maxHoldAmount 0x1fc9efa1 → uint256
_maxTxAmount 0x7d1db4a5 → uint256
allowance 0xdd62ed3e → uint256
autoLiquidityReceiver 0xca33e64c → address
balanceOf 0x70a08231 → uint256
canTrade 0x2f05205c → bool
decimals 0x313ce567 → uint8
discountPercentHigh 0x683c3063 → uint8
discountPercentLow 0xdbc993db → uint8
getCirculatingSupply 0x2b112e49 → uint256
getEstimatedTokenForUSDT 0xee8969c5 → uint256
getOwner 0x893d20e8 → address
getSubbedUsersLength 0x6bad6a6a → uint256
initialBuyFee 0x31e02e0b → uint8
initialSellFee 0x2b36a6d2 → uint8
initialTaxesEnabled 0x32406b35 → bool
isAuthorized 0xfe9fbb80 → bool
isOwner 0x2f54bf6e → bool
launchedAt 0xbf56b371 → uint256
liquidityFee 0x98118cb4 → uint8
marketingFee 0x6b67c4df → uint8
marketingFeeReceiver 0xe96fada2 → address
name 0x06fdde03 → string
pair 0xa8aa1b31 → address
pairs 0xfe33b302 → bool
router 0xf887ea40 → address
specialPercentHigh 0x9215a2a4 → uint8
specialPercentLow 0x1720513f → uint8
subbedUsers 0x1936d368 → address
swapEnabled 0x6ddd1713 → bool
swapThreshold 0x0445b667 → uint256
symbol 0x95d89b41 → string
totalFee 0x1df4ccfc → uint8
totalSubs 0xf5676f8f → uint256
totalSupply 0x18160ddd → uint256
userSubs 0x8f3184cd → uint256, uint256, uint256, uint256, bool, bool

Write Contract 30 functions

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

addNewPair 0xa41d40e1
address newPair
addTVPackage 0xd90ec3a7
uint256 ppvID
uint256 _USDTPriceNoDecimals
uint256 _durationDays
string packName
bool onlyTopHolders
allowtrading 0xa6334231
No parameters
approve 0x095ea7b3
address spender
uint256 amount
returns: bool
approveMax 0x571ac8b0
address spender
returns: bool
authorize 0xb6a5d7de
address adr
changeTvPackagePrice 0x81530a92
uint256 _ID
uint256 newPrice
returns: bool
claimtokensback 0x66bb5dd3
address tokenAddress
removePair 0xaf6c9c1d
address pairToRemove
removeTvPackage 0x7bdd90f0
uint256 _ID
returns: bool
setBlacklistArray 0xe405be29
address[] walletToBlacklistArray
setBlacklistedStatus 0x759f62a6
address walletToBlacklist
bool isBlacklistedBool
setDiscountPackPercentages 0xdaa09bf8
uint8 percentLowerMul10
uint8 percentHigherMul10
setFeeReceivers 0xa4b45c00
address _autoLiquidityReceiver
address _marketingFeeReceiver
setFees 0x4fcd2446
uint8 _liquidityFeeMul10
uint8 _marketingFeeMul10
setInitialfees 0x42c7a6f7
uint8 _initialBuyFeePercentMul10
uint8 _initialSellFeePercentMul10
setIsFeeExempt 0x658d4b7f
address holder
bool exempt
setIsTxLimitExempt 0xf84ba65d
address holder
bool exempt
setNFTContract 0xa7ccabdf
address ctrct
setSpecialPackPercentages 0x21d13a66
uint8 percentLowerMul10
uint8 percentHigherMul10
setSwapBackSettings 0xdf20fd49
bool _enabled
uint256 _amount
setSwapThresholdDivisor 0xf1366d9a
uint256 divisor
setTxLimit 0x5c85974f
uint256 amount
setmaxholdpercentage 0x715b1c3b
uint256 percentageMul10
stopInitialTax 0x6f2a4914
No parameters
subToPackage 0xb00755df
uint256 _packageID
uint256 durationVariant
returns: bool
transfer 0xa9059cbb
address recipient
uint256 amount
returns: bool
transferFrom 0x23b872dd
address sender
address recipient
uint256 amount
returns: bool
transferOwnership 0xf2fde38b
address adr
unauthorize 0xf0b37c04
address adr

Recent Transactions

No transactions found for this address