Address Contract Verified
Address
0xc75d41E691A24F8f7161791cd375174069455BDc
Balance
0 ETH
Nonce
1
Code Size
8475 bytes
Creator
0xaCe5dB64...0197 at tx 0x9a06f1e5...95096a
Indexed Transactions
0
Contract Bytecode
8475 bytes
0x608060405234801561001057600080fd5b50600436106101005760003560e01c80637ecebe0011610097578063d505accf11610066578063d505accf146102d7578063dd62ed3e146102f3578063e367bb7014610323578063fc4727181461033f57610100565b80637ecebe001461023d57806395d89b411461026d5780639cd441da1461028b578063a9059cbb146102a757610100565b8063313ce567116100d3578063313ce567146101a15780633644e515146101bf5780633e617f66146101dd57806370a082311461020d57610100565b806306fdde0314610105578063095ea7b31461012357806318160ddd1461015357806323b872dd14610171575b600080fd5b61010d61035d565b60405161011a9190611479565b60405180910390f35b61013d60048036038101906101389190611539565b6103eb565b60405161014a9190611594565b60405180910390f35b61015b6104dd565b60405161016891906115be565b60405180910390f35b61018b600480360381019061018691906115d9565b6104e3565b6040516101989190611594565b60405180910390f35b6101a961072d565b6040516101b69190611648565b60405180910390f35b6101c7610751565b6040516101d4919061167c565b60405180910390f35b6101f760048036038101906101f29190611697565b6107ae565b6040516102049190611594565b60405180910390f35b610227600480360381019061022291906116c4565b6107ce565b60405161023491906115be565b60405180910390f35b610257600480360381019061025291906116c4565b6107e6565b60405161026491906115be565b60405180910390f35b6102756107fe565b6040516102829190611479565b60405180910390f35b6102a560048036038101906102a091906116f1565b61088c565b005b6102c160048036038101906102bc9190611539565b610be5565b6040516102ce9190611594565b60405180910390f35b6102f160048036038101906102ec9190611789565b610cf9565b005b61030d6004803603810190610308919061182b565b610ff2565b60405161031a91906115be565b60405180910390f35b61033d600480360381019061033891906118d0565b611017565b005b610347611269565b60405161035491906115be565b60405180910390f35b6000805461036a9061194c565b80601f01602080910402602001604051908101604052809291908181526020018280546103969061194c565b80156103e35780601f106103b8576101008083540402835291602001916103e3565b820191906000526020600020905b8154815290600101906020018083116103c657829003601f168201915b505050505081565b600081600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516104cb91906115be565b60405180910390a36001905092915050565b60025481565b600080600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461061957828161059891906119ac565b600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b82600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461066891906119ac565b9250508190555082600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161071991906115be565b60405180910390a360019150509392505050565b7f000000000000000000000000000000000000000000000000000000000000001281565b60007f000000000000000000000000000000000000000000000000000000000000000146146107875761078261128d565b6107a9565b7fbb0daa1cfb34f43601f8338fdf8af4ff06a5c0c6c0b19bfab94b5842878f292b5b905090565b60076020528060005260406000206000915054906101000a900460ff1681565b60036020528060005260406000206000915090505481565b60056020528060005260406000206000915090505481565b6001805461080b9061194c565b80601f01602080910402602001604051908101604052809291908181526020018280546108379061194c565b80156108845780601f1061085957610100808354040283529160200191610884565b820191906000526020600020905b81548152906001019060200180831161086757829003601f168201915b505050505081565b6108973330846104e3565b5081600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71982308560008030426040518863ffffffff1660e01b81526004016109a296959493929190611a34565b60606040518083038185885af11580156109c0573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906109e59190611aaa565b5050506000600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610b34576000600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610b5a90611b2e565b60006040518083038185875af1925050503d8060008114610b97576040519150601f19603f3d011682016040523d82523d6000602084013e610b9c565b606091505b5050905080610be0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd790611b8f565b60405180910390fd5b505050565b600081600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c3691906119ac565b9250508190555081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610ce791906115be565b60405180910390a36001905092915050565b42841015610d3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3390611bfb565b60405180910390fd5b60006001610d48610751565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a600560008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600101919050558b604051602001610dd096959493929190611c1b565b60405160208183030381529060405280519060200120604051602001610df7929190611cf4565b6040516020818303038152906040528051906020012085858560405160008152602001604052604051610e2d9493929190611d2b565b6020604051602081039080840390855afa158015610e4f573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015610ec357508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610f02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef990611dbc565b60405180910390fd5b85600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92587604051610fe191906115be565b60405180910390a350505050505050565b6004602052816000526040600020602052806000526040600020600091509150505481565b620151807f000000000000000000000000000000000000000000000000000000006454425b6110469190611ddc565b421061105157600080fd5b60005b82829050811015611243573373ffffffffffffffffffffffffffffffffffffffff1673026224a2940bfe258d0dbe947919b62fe321f04273ffffffffffffffffffffffffffffffffffffffff16636352211e8585858181106110b9576110b8611e10565b5b905060200201356040518263ffffffff1660e01b81526004016110dc91906115be565b602060405180830381865afa1580156110f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111d9190611e54565b73ffffffffffffffffffffffffffffffffffffffff1614611173576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116a90611ecd565b60405180910390fd5b6007600084848481811061118a57611189611e10565b5b90506020020135815260200190815260200160002060009054906101000a900460ff16156111ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e490611f39565b60405180910390fd5b60016007600085858581811061120657611205611e10565b5b90506020020135815260200190815260200160002060006101000a81548160ff0219169083151502179055508061123c90611f59565b9050611054565b5061126533683635c9adc5dea00000848490506112609190611fa1565b611319565b5050565b7f000000000000000000000000000000000000000000000000000000006454425b81565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516112bf919061207b565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc646306040516020016112fe959493929190612092565b60405160208183030381529060405280519060200120905090565b806002600082825461132b9190611ddc565b9250508190555080600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516113dd91906115be565b60405180910390a35050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611423578082015181840152602081019050611408565b60008484015250505050565b6000601f19601f8301169050919050565b600061144b826113e9565b61145581856113f4565b9350611465818560208601611405565b61146e8161142f565b840191505092915050565b600060208201905081810360008301526114938184611440565b905092915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006114d0826114a5565b9050919050565b6114e0816114c5565b81146114eb57600080fd5b50565b6000813590506114fd816114d7565b92915050565b6000819050919050565b61151681611503565b811461152157600080fd5b50565b6000813590506115338161150d565b92915050565b600080604083850312156115505761154f61149b565b5b600061155e858286016114ee565b925050602061156f85828601611524565b9150509250929050565b60008115159050919050565b61158e81611579565b82525050565b60006020820190506115a96000830184611585565b92915050565b6115b881611503565b82525050565b60006020820190506115d360008301846115af565b92915050565b6000806000606084860312156115f2576115f161149b565b5b6000611600868287016114ee565b9350506020611611868287016114ee565b925050604061162286828701611524565b9150509250925092565b600060ff82169050919050565b6116428161162c565b82525050565b600060208201905061165d6000830184611639565b92915050565b6000819050919050565b61167681611663565b82525050565b6000602082019050611691600083018461166d565b92915050565b6000602082840312156116ad576116ac61149b565b5b60006116bb84828501611524565b91505092915050565b6000602082840312156116da576116d961149b565b5b60006116e8848285016114ee565b91505092915050565b600080604083850312156117085761170761149b565b5b600061171685828601611524565b925050602061172785828601611524565b9150509250929050565b61173a8161162c565b811461174557600080fd5b50565b60008135905061175781611731565b92915050565b61176681611663565b811461177157600080fd5b50565b6000813590506117838161175d565b92915050565b600080600080600080600060e0888a0312156117a8576117a761149b565b5b60006117b68a828b016114ee565b97505060206117c78a828b016114ee565b96505060406117d88a828b01611524565b95505060606117e98a828b01611524565b94505060806117fa8a828b01611748565b93505060a061180b8a828b01611774565b92505060c061181c8a828b01611774565b91505092959891949750929550565b600080604083850312156118425761184161149b565b5b6000611850858286016114ee565b9250506020611861858286016114ee565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f8401126118905761188f61186b565b5b8235905067ffffffffffffffff8111156118ad576118ac611870565b5b6020830191508360208202830111156118c9576118c8611875565b5b9250929050565b600080602083850312156118e7576118e661149b565b5b600083013567ffffffffffffffff811115611905576119046114a0565b5b6119118582860161187a565b92509250509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061196457607f821691505b6020821081036119775761197661191d565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006119b782611503565b91506119c283611503565b92508282039050818111156119da576119d961197d565b5b92915050565b6119e9816114c5565b82525050565b6000819050919050565b6000819050919050565b6000611a1e611a19611a14846119ef565b6119f9565b611503565b9050919050565b611a2e81611a03565b82525050565b600060c082019050611a4960008301896119e0565b611a5660208301886115af565b611a636040830187611a25565b611a706060830186611a25565b611a7d60808301856119e0565b611a8a60a08301846115af565b979650505050505050565b600081519050611aa48161150d565b92915050565b600080600060608486031215611ac357611ac261149b565b5b6000611ad186828701611a95565b9350506020611ae286828701611a95565b9250506040611af386828701611a95565b9150509250925092565b600081905092915050565b50565b6000611b18600083611afd565b9150611b2382611b08565b600082019050919050565b6000611b3982611b0b565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b6000611b796010836113f4565b9150611b8482611b43565b602082019050919050565b60006020820190508181036000830152611ba881611b6c565b9050919050565b7f5045524d49545f444541444c494e455f45585049524544000000000000000000600082015250565b6000611be56017836113f4565b9150611bf082611baf565b602082019050919050565b60006020820190508181036000830152611c1481611bd8565b9050919050565b600060c082019050611c30600083018961166d565b611c3d60208301886119e0565b611c4a60408301876119e0565b611c5760608301866115af565b611c6460808301856115af565b611c7160a08301846115af565b979650505050505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000611cbd600283611c7c565b9150611cc882611c87565b600282019050919050565b6000819050919050565b611cee611ce982611663565b611cd3565b82525050565b6000611cff82611cb0565b9150611d0b8285611cdd565b602082019150611d1b8284611cdd565b6020820191508190509392505050565b6000608082019050611d40600083018761166d565b611d4d6020830186611639565b611d5a604083018561166d565b611d67606083018461166d565b95945050505050565b7f494e56414c49445f5349474e4552000000000000000000000000000000000000600082015250565b6000611da6600e836113f4565b9150611db182611d70565b602082019050919050565b60006020820190508181036000830152611dd581611d99565b9050919050565b6000611de782611503565b9150611df283611503565b9250828201905080821115611e0a57611e0961197d565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050611e4e816114d7565b92915050565b600060208284031215611e6a57611e6961149b565b5b6000611e7884828501611e3f565b91505092915050565b7f4e6f7420796f7572206c6f627321000000000000000000000000000000000000600082015250565b6000611eb7600e836113f4565b9150611ec282611e81565b602082019050919050565b60006020820190508181036000830152611ee681611eaa565b9050919050565b7f416c726561647920627574746572656421000000000000000000000000000000600082015250565b6000611f236011836113f4565b9150611f2e82611eed565b602082019050919050565b60006020820190508181036000830152611f5281611f16565b9050919050565b6000611f6482611503565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611f9657611f9561197d565b5b600182019050919050565b6000611fac82611503565b9150611fb783611503565b9250828202611fc581611503565b91508282048414831517611fdc57611fdb61197d565b5b5092915050565b60008190508160005260206000209050919050565b600081546120058161194c565b61200f8186611afd565b9450600182166000811461202a576001811461203f57612072565b60ff1983168652811515820286019350612072565b61204885611fe3565b60005b8381101561206a5781548189015260018201915060208101905061204b565b838801955050505b50505092915050565b60006120878284611ff8565b915081905092915050565b600060a0820190506120a7600083018861166d565b6120b4602083018761166d565b6120c1604083018661166d565b6120ce60608301856115af565b6120db60808301846119e0565b969550505050505056fea264697066735822122000c40586ec8ff9ba41efd27712b10c048df2d2dcfdada31f285391ae1a9ae18564736f6c63430008120033
Verified Source Code Full Match
Compiler: v0.8.18+commit.87f61d96
EVM: paris
Optimization: No
Shrimp.sol 435 lines
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;
/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol)
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.
abstract contract ERC20 {
/*//////////////////////////////////////////////////////////////
EVENTS
//////////////////////////////////////////////////////////////*/
event Transfer(address indexed from, address indexed to, uint256 amount);
event Approval(address indexed owner, address indexed spender, uint256 amount);
/*//////////////////////////////////////////////////////////////
METADATA STORAGE
//////////////////////////////////////////////////////////////*/
string public name;
string public symbol;
uint8 public immutable decimals;
/*//////////////////////////////////////////////////////////////
ERC20 STORAGE
//////////////////////////////////////////////////////////////*/
uint256 public totalSupply;
mapping(address => uint256) public balanceOf;
mapping(address => mapping(address => uint256)) public allowance;
/*//////////////////////////////////////////////////////////////
EIP-2612 STORAGE
//////////////////////////////////////////////////////////////*/
uint256 internal immutable INITIAL_CHAIN_ID;
bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;
mapping(address => uint256) public nonces;
/*//////////////////////////////////////////////////////////////
CONSTRUCTOR
//////////////////////////////////////////////////////////////*/
constructor(
string memory _name,
string memory _symbol,
uint8 _decimals
) {
name = _name;
symbol = _symbol;
decimals = _decimals;
INITIAL_CHAIN_ID = block.chainid;
INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
}
/*//////////////////////////////////////////////////////////////
ERC20 LOGIC
//////////////////////////////////////////////////////////////*/
function approve(address spender, uint256 amount) public virtual returns (bool) {
allowance[msg.sender][spender] = amount;
emit Approval(msg.sender, spender, amount);
return true;
}
function transfer(address to, uint256 amount) public virtual returns (bool) {
balanceOf[msg.sender] -= amount;
// Cannot overflow because the sum of all user
// balances can't exceed the max uint256 value.
unchecked {
balanceOf[to] += amount;
}
emit Transfer(msg.sender, to, amount);
return true;
}
function transferFrom(
address from,
address to,
uint256 amount
) public virtual returns (bool) {
uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.
if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;
balanceOf[from] -= amount;
// Cannot overflow because the sum of all user
// balances can't exceed the max uint256 value.
unchecked {
balanceOf[to] += amount;
}
emit Transfer(from, to, amount);
return true;
}
/*//////////////////////////////////////////////////////////////
EIP-2612 LOGIC
//////////////////////////////////////////////////////////////*/
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) public virtual {
require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");
// Unchecked because the only math done is incrementing
// the owner's nonce which cannot realistically overflow.
unchecked {
address recoveredAddress = ecrecover(
keccak256(
abi.encodePacked(
"\x19\x01",
DOMAIN_SEPARATOR(),
keccak256(
abi.encode(
keccak256(
"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
),
owner,
spender,
value,
nonces[owner]++,
deadline
)
)
)
),
v,
r,
s
);
require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER");
allowance[recoveredAddress][spender] = value;
}
emit Approval(owner, spender, value);
}
function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
}
function computeDomainSeparator() internal view virtual returns (bytes32) {
return
keccak256(
abi.encode(
keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
keccak256(bytes(name)),
keccak256("1"),
block.chainid,
address(this)
)
);
}
/*//////////////////////////////////////////////////////////////
INTERNAL MINT/BURN LOGIC
//////////////////////////////////////////////////////////////*/
function _mint(address to, uint256 amount) internal virtual {
totalSupply += amount;
// Cannot overflow because the sum of all user
// balances can't exceed the max uint256 value.
unchecked {
balanceOf[to] += amount;
}
emit Transfer(address(0), to, amount);
}
function _burn(address from, uint256 amount) internal virtual {
balanceOf[from] -= amount;
// Cannot underflow because a user's balance
// will never be larger than the total supply.
unchecked {
totalSupply -= amount;
}
emit Transfer(from, address(0), amount);
}
}
interface ERC721 {
function ownerOf(uint256 id) external view returns (address owner);
}
interface IUniswapV2Factory {
event PairCreated(address indexed token0, address indexed token1, address pair, uint);
function feeTo() external view returns (address);
function feeToSetter() external view returns (address);
function getPair(address tokenA, address tokenB) external view returns (address pair);
function allPairs(uint) external view returns (address pair);
function allPairsLength() external view returns (uint);
function createPair(address tokenA, address tokenB) external returns (address pair);
function setFeeTo(address) external;
function setFeeToSetter(address) external;
}
interface IUniswapV2Router01 {
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 removeLiquidity(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB);
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH);
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountA, uint amountB);
function removeLiquidityETHWithPermit(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountToken, uint amountETH);
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapTokensForExactTokens(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
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);
}
// pragma solidity >=0.6.2;
interface IUniswapV2Router02 is IUniswapV2Router01 {
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountETH);
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountETH);
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;
}
///@author 0xmons
///@author RobAnon
contract Shrimp is ERC20 {
address constant private LOBS = 0x026224A2940bFE258D0dbE947919B62fE321F042;
address constant private IVAN = 0xA7D5DDc1b8557914F158076b228AA91eF613f1D5;
address constant private DEVS = 0xd9D455A8b8B9AEda2dA66c52B80c90ef423409df;
address constant private MULTI = 0x0A51F0009980F6AacE317BF9d9592117302cD117;
uint immutable public LUNCH_DATE;
uint constant private CLAM_PERIOD = 24 hours;
IUniswapV2Router02 private uniswapV2Router;
mapping(uint256 => bool) public hasBeenDippedInButter;
constructor() ERC20("Butter", "$BUTTER", 18) {
_mint(DEVS, 10000 ether);
_mint(MULTI, 6_900_000 ether);
_mint(IVAN, 10000 ether);
IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
// Create a uniswap pair for this new token
IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
// set the rest of the contract variables
uniswapV2Router = _uniswapV2Router;
LUNCH_DATE = block.timestamp;
}
function butterMe(uint256[] calldata ids) external {
require(block.timestamp < LUNCH_DATE + CLAM_PERIOD);
for (uint i; i < ids.length; ++i) {
require(ERC721(LOBS).ownerOf(ids[i]) == msg.sender, "Not your lobs!");
require(!hasBeenDippedInButter[ids[i]], "Already buttered!");
hasBeenDippedInButter[ids[i]] = true;
}
_mint(msg.sender, ids.length * (1000 ether));
}
function addLiquidity(uint256 tokenAmount, uint256 ethAmount) public {
// Move tokens in
transferFrom(msg.sender, address(this), tokenAmount);
// approve token transfer to cover all possible scenarios
allowance[address(this)][address(uniswapV2Router)] = tokenAmount;
// add the liquidity
uniswapV2Router.addLiquidityETH{value: ethAmount}(
address(this),
tokenAmount,
0, // slippage is unavoidable
0, // slippage is unavoidable
address(this),
block.timestamp
);
// Zero out any approval that didn't get set back to zero
if(allowance[address(this)][address(uniswapV2Router)] > 0) {
allowance[address(this)][address(uniswapV2Router)] = 0;
}
// Refund any extra ETH
(bool success, ) = msg.sender.call{value:address(this).balance}("");
require(success, "Transfer failed.");
}
}
Read Contract
DOMAIN_SEPARATOR 0x3644e515 → bytes32
LUNCH_DATE 0xfc472718 → uint256
allowance 0xdd62ed3e → uint256
balanceOf 0x70a08231 → uint256
decimals 0x313ce567 → uint8
hasBeenDippedInButter 0x3e617f66 → bool
name 0x06fdde03 → string
nonces 0x7ecebe00 → uint256
symbol 0x95d89b41 → string
totalSupply 0x18160ddd → uint256
Write Contract 6 functions
These functions modify contract state and require a wallet transaction to execute.
addLiquidity 0x9cd441da
uint256 tokenAmount
uint256 ethAmount
approve 0x095ea7b3
address spender
uint256 amount
returns: bool
butterMe 0xe367bb70
uint256[] ids
permit 0xd505accf
address owner
address spender
uint256 value
uint256 deadline
uint8 v
bytes32 r
bytes32 s
transfer 0xa9059cbb
address to
uint256 amount
returns: bool
transferFrom 0x23b872dd
address from
address to
uint256 amount
returns: bool
Recent Transactions
No transactions found for this address