From 7ebd2c40cc7d493b0f28f77a7c2e8e7f5401800c Mon Sep 17 00:00:00 2001 From: mj Date: Wed, 4 Sep 2024 11:34:51 -0700 Subject: [PATCH] Add NFT Marketplace Tests (#1829) * test * test * add more setup * add to path * githubpath * seid path * dapp tests * try artifacts * ditch setup step * deps * test workflow * set keyring * without * keys add * add to sh * nobackend * no script * test * keyring * no sh * test * fix flakiness * cleanup * move seid config command * only if docker * test without * if isdocker * printf mnemonic * try escape path * try single quotes * try modifying execute * no path * backend * try without keyring * move keyring * path * basedir * try pwd * config reset * seid config * redeclare * print * docker path * dynamic path * config for all * full * lint issue * backend * cleanup * seaport starter * working locally * working on all chains * add readme * keyring * stray argument in unit test * cleanup * reduce costs * scripts --- contracts/test/CW721toERC721PointerTest.js | 2 +- contracts/test/lib.js | 7 +- integration_test/dapp_tests/README.md | 48 +++++ .../dapp_tests/contracts/MockERC20.sol | 2 +- .../dapp_tests/contracts/MockERC721.sol | 54 ++++++ .../dapp_tests/contracts/NftMarketplace.sol | 163 ++++++++++++++++ integration_test/dapp_tests/dapp_tests.sh | 35 +++- .../dapp_tests/nftMarketplace/cw721_base.wasm | Bin 0 -> 377539 bytes .../nftMarketplace/nftMarketplaceTests.js | 178 ++++++++++++++++++ integration_test/dapp_tests/package-lock.json | 46 ++--- integration_test/dapp_tests/package.json | 2 +- .../dapp_tests/uniswap/uniswapTest.js | 65 +++---- integration_test/dapp_tests/utils.js | 124 +++++++----- 13 files changed, 599 insertions(+), 127 deletions(-) create mode 100644 integration_test/dapp_tests/README.md create mode 100644 integration_test/dapp_tests/contracts/MockERC721.sol create mode 100644 integration_test/dapp_tests/contracts/NftMarketplace.sol create mode 100755 integration_test/dapp_tests/nftMarketplace/cw721_base.wasm create mode 100644 integration_test/dapp_tests/nftMarketplace/nftMarketplaceTests.js diff --git a/contracts/test/CW721toERC721PointerTest.js b/contracts/test/CW721toERC721PointerTest.js index 3bfa394f14..999eb8d067 100644 --- a/contracts/test/CW721toERC721PointerTest.js +++ b/contracts/test/CW721toERC721PointerTest.js @@ -27,7 +27,7 @@ describe("CW721 to ERC721 Pointer", function () { describe("validation", function(){ it("should not allow a pointer to the pointer", async function(){ try { - await deployErc721PointerForCw721(hre.ethers.provider, pointer, 5) + await deployErc721PointerForCw721(hre.ethers.provider, pointer) expect.fail(`Expected to be prevented from creating a pointer`); } catch(e){ expect(e.message).to.include("contract deployment failed"); diff --git a/contracts/test/lib.js b/contracts/test/lib.js index 3c5fbf6333..f69d2dcff8 100644 --- a/contracts/test/lib.js +++ b/contracts/test/lib.js @@ -252,8 +252,11 @@ async function deployErc20PointerNative(provider, name, from=adminKeyName, evmRp throw new Error("contract deployment failed") } -async function deployErc721PointerForCw721(provider, cw721Address) { - const command = `seid tx evm register-evm-pointer CW721 ${cw721Address} --from=admin -b block` +async function deployErc721PointerForCw721(provider, cw721Address, from=adminKeyName, evmRpc="") { + let command = `seid tx evm register-evm-pointer CW721 ${cw721Address} --from=${from} -b block` + if (evmRpc) { + command = command + ` --evm-rpc=${evmRpc}` + } const output = await execute(command); const txHash = output.replace(/.*0x/, "0x").trim() let attempt = 0; diff --git a/integration_test/dapp_tests/README.md b/integration_test/dapp_tests/README.md new file mode 100644 index 0000000000..65fa2c4398 --- /dev/null +++ b/integration_test/dapp_tests/README.md @@ -0,0 +1,48 @@ +# dApp Tests + +This directory contains integration tests that simulate simple use cases on the chain by deploying and running common dApp contracts. +The focus here is mainly on testing common interop scenarios (interactions with associated/unassociated accounts, pointer contracts etc.) +In each test scenario, we deploy the dapp contracts, fund wallets, then go through common end to end scenarios. + +## Setup +To run the dapp tests, simply run the script at `/integration_test/dapp_tests/dapp_tests.sh ` + +3 chain types are supported, `seilocal`, `devnet` (arctic-1) and `testnet` (atlantic-2). The configs for each chain are stored in `./hardhat.config.js`. + +If running on `seilocal`, the script assumes that a local instance of the chain is running by running `/scripts/initialize_local_chain.sh`. +A well funded `admin` account must be available on the local keyring. + +If running on the live chains, the tests rely on a `deployer` account, which has to have sufficient funds on the chain the test is running on. +The deployer mnemonic must be stored as an environment variable: DAPP_TESTS_MNEMONIC. +On the test pipelines, the account used is: +- Deployer Sei address: `sei1rtpakm7w9egh0n7xngzm6vrln0szv6yeva6hhn` +- Deployer EVM address: `0x4D952b770C3a0B096e739399B40263D0b516d406` + +## Tests + +### Uniswap (EVM DEX) +This test deploys a small set of UniswapV3 contracts to the EVM and tests swapping and creation of uniswap pools. +- Test that associated accounts are able to swap erc20 tokens +- Test that associated accounts are able to swap native tokens via pointer +- Test that associated accounts are able to swap cw20 tokens via pointer +- Test that unassociated accounts are able to receive erc20 tokens +- Test that unassociated accounts are able to receive native tokens via pointer +- Unassociated EVM accounts are not able to receive cw20 tokens via pointer +- Test that unassociated accounts can still deploy and supply erc20-erc20pointer liquidity pools. + +### Steak (CW Liquid Staking) +This test deploys a set of WASM liquid staking contracts, then tests bonding and unbonding. +- Test that associated accounts are able to bond, then unbond tokens. +- Test that unassociated accounts are able to bond, then unbond tokens. + +### NFT Marketplace (EVM NFT Marketplace) +This test deploys a simple NFT Marketplace contract, then tests listing and buying NFTs. +- Test that associated accounts are able to list and buy erc721 tokens +- Test that unassociated accounts are able to list and buy erc721 tokens +- Test that associated accounts are able to buy cw721 tokens via pointers +- Unassociated EVM accounts are currently unable to own or receive cw721 tokens via pointers + +### To Be Added +The following is a list of testcases/scenarios that we should add to verify completeness +- CosmWasm DEX tests - test that ERC20 tokens are tradeable via pointer contracts. +- CosmWasm NFT Marketplace tests - test that ERC721 tokens are tradeable via pointer contracts. \ No newline at end of file diff --git a/integration_test/dapp_tests/contracts/MockERC20.sol b/integration_test/dapp_tests/contracts/MockERC20.sol index 58989ad895..e089db9e33 100644 --- a/integration_test/dapp_tests/contracts/MockERC20.sol +++ b/integration_test/dapp_tests/contracts/MockERC20.sol @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MIT +// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; diff --git a/integration_test/dapp_tests/contracts/MockERC721.sol b/integration_test/dapp_tests/contracts/MockERC721.sol new file mode 100644 index 0000000000..50ea9b9050 --- /dev/null +++ b/integration_test/dapp_tests/contracts/MockERC721.sol @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; +import "@openzeppelin/contracts/access/Ownable.sol"; +import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol"; + +contract MockERC721 is ERC721, ERC721Enumerable, Ownable { + uint256 private _currentTokenId = 0; + + constructor(string memory name, string memory symbol) ERC721(name, symbol) Ownable(msg.sender) {} + + function mint(address to) public onlyOwner { + _currentTokenId++; + _mint(to, _currentTokenId); + } + + function batchMint(address to, uint256 amount) public onlyOwner { + for (uint256 i = 0; i < amount; i++) { + _currentTokenId++; + _mint(to, _currentTokenId); + } + } + + function burn(uint256 tokenId) public { + _burn(tokenId); + } + + // The following functions are overrides required by Solidity. + + function _update(address to, uint256 tokenId, address auth) + internal + override(ERC721, ERC721Enumerable) + returns (address) + { + return super._update(to, tokenId, auth); + } + + function _increaseBalance(address account, uint128 value) + internal + override(ERC721, ERC721Enumerable) + { + super._increaseBalance(account, value); + } + + function supportsInterface(bytes4 interfaceId) + public + view + override(ERC721, ERC721Enumerable) + returns (bool) + { + return super.supportsInterface(interfaceId); + } +} \ No newline at end of file diff --git a/integration_test/dapp_tests/contracts/NftMarketplace.sol b/integration_test/dapp_tests/contracts/NftMarketplace.sol new file mode 100644 index 0000000000..a23e6042ff --- /dev/null +++ b/integration_test/dapp_tests/contracts/NftMarketplace.sol @@ -0,0 +1,163 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.20; + +import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol"; + +/* + * @title NftMarketplace + * @auth Patrick Collins + * @notice This contract allows users to list NFTs for sale + * @notice This is the reference + */ +contract NftMarketplace { + error NftMarketplace__PriceNotMet(address nftAddress, uint256 tokenId, uint256 price); + error NftMarketplace__NotListed(address nftAddress, uint256 tokenId); + error NftMarketplace__NoProceeds(); + error NftMarketplace__NotOwner(); + error NftMarketplace__PriceMustBeAboveZero(); + error NftMarketplace__TransferFailed(); + + event ItemListed(address indexed seller, address indexed nftAddress, uint256 indexed tokenId, uint256 price); + event ItemUpdated(address indexed seller, address indexed nftAddress, uint256 indexed tokenId, uint256 price); + event ItemCanceled(address indexed seller, address indexed nftAddress, uint256 indexed tokenId); + event ItemBought(address indexed buyer, address indexed nftAddress, uint256 indexed tokenId, uint256 price); + + mapping(address nftAddress => mapping(uint256 tokenId => Listing)) private s_listings; + mapping(address seller => uint256 proceedAmount) private s_proceeds; + + struct Listing { + uint256 price; + address seller; + } + + /*////////////////////////////////////////////////////////////// + FUNCTIONS + //////////////////////////////////////////////////////////////*/ + /* + * @notice Method for listing NFT + * @param nftAddress Address of NFT contract + * @param tokenId Token ID of NFT + * @param price sale price for each item + */ + function listItem(address nftAddress, uint256 tokenId, uint256 price) external { + // Checks + if (price <= 0) { + revert NftMarketplace__PriceMustBeAboveZero(); + } + + // Effects (Internal) + s_listings[nftAddress][tokenId] = Listing(price, msg.sender); + emit ItemListed(msg.sender, nftAddress, tokenId, price); + + // Interactions (External) + IERC721(nftAddress).safeTransferFrom(msg.sender, address(this), tokenId); + } + + /* + * @notice Method for cancelling listing + * @param nftAddress Address of NFT contract + * @param tokenId Token ID of NFT + * + * @audit-known seller can front-run a bought NFT and cancel the listing + */ + function cancelListing(address nftAddress, uint256 tokenId) external { + // Checks + if (msg.sender != s_listings[nftAddress][tokenId].seller) { + revert NftMarketplace__NotOwner(); + } + + // Effects (Internal) + delete s_listings[nftAddress][tokenId]; + emit ItemCanceled(msg.sender, nftAddress, tokenId); + + // Interactions (External) + IERC721(nftAddress).safeTransferFrom(address(this), msg.sender, tokenId); + } + + /* + * @notice Method for buying listing + * @notice The owner of an NFT could unapprove the marketplace, + * @param nftAddress Address of NFT contract + * @param tokenId Token ID of NFT + */ + function buyItem(address nftAddress, uint256 tokenId) external payable { + Listing memory listedItem = s_listings[nftAddress][tokenId]; + // Checks + if (listedItem.seller == address(0)) { + revert NftMarketplace__NotListed(nftAddress, tokenId); + } + if (msg.value < listedItem.price) { + revert NftMarketplace__PriceNotMet(nftAddress, tokenId, listedItem.price); + } + + // Effects (Internal) + s_proceeds[listedItem.seller] += msg.value; + delete s_listings[nftAddress][tokenId]; + emit ItemBought(msg.sender, nftAddress, tokenId, listedItem.price); + + // Interactions (External) + IERC721(nftAddress).safeTransferFrom(address(this), msg.sender, tokenId); + } + + /* + * @notice Method for updating listing + * @param nftAddress Address of NFT contract + * @param tokenId Token ID of NFT + * @param newPrice Price in Wei of the item + * + * @audit-known seller can front-run a bought NFT and update the listing + */ + function updateListing(address nftAddress, uint256 tokenId, uint256 newPrice) external { + // Checks + if (newPrice <= 0) { + revert NftMarketplace__PriceMustBeAboveZero(); + } + if (msg.sender != s_listings[nftAddress][tokenId].seller) { + revert NftMarketplace__NotOwner(); + } + + // Effects (Internal) + s_listings[nftAddress][tokenId].price = newPrice; + emit ItemUpdated(msg.sender, nftAddress, tokenId, newPrice); + } + + /* + * @notice Method for withdrawing proceeds from sales + * + * @audit-known, we should emit an event for withdrawing proceeds + */ + function withdrawProceeds() external { + uint256 proceeds = s_proceeds[msg.sender]; + // Checks + if (proceeds <= 0) { + revert NftMarketplace__NoProceeds(); + } + // Effects (Internal) + s_proceeds[msg.sender] = 0; + + // Interactions (External) + (bool success,) = payable(msg.sender).call{value: proceeds}(""); + if (!success) { + revert NftMarketplace__TransferFailed(); + } + } + + function onERC721Received(address, /*operator*/ address, /*from*/ uint256, /*tokenId*/ bytes calldata /*data*/ ) + external + pure + returns (bytes4) + { + return this.onERC721Received.selector; + } + + /*////////////////////////////////////////////////////////////// + VIEW/PURE FUNCTIONS + //////////////////////////////////////////////////////////////*/ + function getListing(address nftAddress, uint256 tokenId) external view returns (Listing memory) { + return s_listings[nftAddress][tokenId]; + } + + function getProceeds(address seller) external view returns (uint256) { + return s_proceeds[seller]; + } +} \ No newline at end of file diff --git a/integration_test/dapp_tests/dapp_tests.sh b/integration_test/dapp_tests/dapp_tests.sh index a889b3d2b2..0549381e41 100755 --- a/integration_test/dapp_tests/dapp_tests.sh +++ b/integration_test/dapp_tests/dapp_tests.sh @@ -8,7 +8,12 @@ fi set -e -# Build contacts repo first since we rely on that for lib.js +# Define the paths to the test files +uniswap_test="uniswap/uniswapTest.js" +steak_test="steak/SteakTests.js" +nft_test="nftMarketplace/nftMarketplaceTests.js" + +# Build contracts repo first since we rely on that for lib.js cd contracts npm ci @@ -20,5 +25,29 @@ npx hardhat compile # Set the CONFIG environment variable export DAPP_TEST_ENV=$1 -npx hardhat test --network $1 uniswap/uniswapTest.js -npx hardhat test --network $1 steak/SteakTests.js +# Determine which tests to run +if [ -z "$2" ]; then + tests=("$uniswap_test" "$steak_test" "$nft_test") +else + case $2 in + uniswap) + tests=("$uniswap_test") + ;; + steak) + tests=("$steak_test") + ;; + nft) + tests=("$nft_test") + ;; + *) + echo "Invalid test specified. Please choose either 'uniswap', 'steak', or 'nft'." + exit 1 + ;; + esac +fi + +# Run the selected tests +for test in "${tests[@]}"; do + npx hardhat test --network $1 $test +done + diff --git a/integration_test/dapp_tests/nftMarketplace/cw721_base.wasm b/integration_test/dapp_tests/nftMarketplace/cw721_base.wasm new file mode 100755 index 0000000000000000000000000000000000000000..09c700df88f5cd62d3727d16ce98ad2ec58bdc6e GIT binary patch literal 377539 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

k>-QUQ-^w>vmoWI!t-kDg#_Yx2CNn2_{e&^Y)Yn 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ν;Yr)`^ssx0Wzjpa1QbYy1n}jC$?OM0t%`An| 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≤p@ekjV_$L%2 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 literal 0 HcmV?d00001 diff --git a/integration_test/dapp_tests/nftMarketplace/nftMarketplaceTests.js b/integration_test/dapp_tests/nftMarketplace/nftMarketplaceTests.js new file mode 100644 index 0000000000..3b1fde0df4 --- /dev/null +++ b/integration_test/dapp_tests/nftMarketplace/nftMarketplaceTests.js @@ -0,0 +1,178 @@ +const { expect } = require("chai"); +const hre = require("hardhat"); + +const {sendFunds, deployEthersContract, estimateAndCall, deployCw721WithPointer, setupAccountWithMnemonic, + mintCw721 +} = require("../utils"); +const { fundAddress, getSeiAddress, execute } = require("../../../contracts/test/lib.js"); +const {evmRpcUrls, chainIds, rpcUrls} = require("../constants"); + +const testChain = process.env.DAPP_TEST_ENV; +console.log("testChain", testChain); +describe("NFT Marketplace", function () { + + let marketplace, deployer, erc721token, erc721PointerToken, cw721Address, originalSeidConfig; + + before(async function () { + const accounts = hre.config.networks[testChain].accounts + const deployerWallet = hre.ethers.Wallet.fromMnemonic(accounts.mnemonic, accounts.path); + deployer = deployerWallet.connect(hre.ethers.provider); + + const seidConfig = await execute('seid config'); + originalSeidConfig = JSON.parse(seidConfig); + + if (testChain === 'seilocal') { + await fundAddress(deployer.address, amount="2000000000000000000000"); + } else { + // Set default seid config to the specified rpc url. + await execute(`seid config chain-id ${chainIds[testChain]}`) + await execute(`seid config node ${rpcUrls[testChain]}`) + } + + await execute(`seid config keyring-backend test`) + + await sendFunds('0.01', deployer.address, deployer) + await setupAccountWithMnemonic("dapptest", accounts.mnemonic, deployer); + + // Deploy MockNFT + const erc721ContractArtifact = await hre.artifacts.readArtifact("MockERC721"); + erc721token = await deployEthersContract("MockERC721", erc721ContractArtifact.abi, erc721ContractArtifact.bytecode, deployer, ["MockERC721", "MKTNFT"]) + + const numNftsToMint = 50 + await estimateAndCall(erc721token, "batchMint", [deployer.address, numNftsToMint]); + + // Deploy CW721 token with ERC721 pointer + const time = Date.now().toString(); + const deployerSeiAddr = await getSeiAddress(deployer.address); + const cw721Details = await deployCw721WithPointer(deployerSeiAddr, deployer, time, evmRpcUrls[testChain]) + erc721PointerToken = cw721Details.pointerContract; + cw721Address = cw721Details.cw721Address; + console.log("CW721 Address", cw721Address); + const numCwNftsToMint = 2; + for (let i = 1; i <= numCwNftsToMint; i++) { + await mintCw721(cw721Address, deployerSeiAddr, i) + } + const cwbal = await erc721PointerToken.balanceOf(deployer.address); + expect(cwbal).to.equal(numCwNftsToMint) + + const nftMarketplaceArtifact = await hre.artifacts.readArtifact("NftMarketplace"); + marketplace = await deployEthersContract("NftMarketplace", nftMarketplaceArtifact.abi, nftMarketplaceArtifact.bytecode, deployer) + }) + + describe("Orders", function () { + async function testNFTMarketplaceOrder(buyer, seller, nftContract, nftId="", expectTransferFail=false) { + let tokenId; + // If nftId is manually supplied (for pointer contract), ensure that deployer owns that token. + if (nftId) { + const nftOwner = await nftContract.ownerOf(nftId); + expect(nftOwner).to.equal(deployer.address); + tokenId = nftId; + } else { + // Refers to the first token owned by the deployer. + tokenId = await nftContract.tokenOfOwnerByIndex(deployer.address, 0); + } + + if (seller.address !== deployer.address) { + if (expectTransferFail) { + // Transfer to unassociated address should fail if seller is not associated. + expect(nftContract.transferFrom(deployer.address, seller.address, tokenId)).to.be.reverted; + + // Associate the seller from here. + await sendFunds("0.01", seller.address, seller); + } + + // Send one NFT to the seller so they can list it. + await estimateAndCall(nftContract, "transferFrom", [deployer.address, seller.address, tokenId]); + + let nftOwner = await nftContract.ownerOf(tokenId); + + // Seller should have the token here + expect(nftOwner).to.equal(seller.address, "NFT should have been transferred to the seller"); + } + + const sellerNftbalance = await nftContract.balanceOf(seller.address); + // Deployer should have at least one token here. + expect(Number(sellerNftbalance)).to.be.greaterThanOrEqual(1, "Seller must have at least 1 NFT remaining") + + // List the NFT on the marketplace contract. + const nftPrice = hre.ethers.utils.parseEther("0.1"); + await estimateAndCall(nftContract.connect(seller), "setApprovalForAll", [marketplace.address, true]) + await estimateAndCall(marketplace.connect(seller), "listItem", [nftContract.address, tokenId, nftPrice]) + + // Confirm that the NFT was listed. + const listing = await marketplace.getListing(nftContract.address, tokenId); + expect(listing.price).to.equal(nftPrice, "Listing price should be correct"); + expect(listing.seller).to.equal(seller.address, "Listing seller should be correct"); + + // Buyer purchases the NFT from the marketplace contract. + if (expectTransferFail) { + // We expect a revert here if the buyer address is not associated, since pointer tokens cant be transferred to buyer. + expect(marketplace.connect(buyer).buyItem(nftContract.address, tokenId, {value: nftPrice})).to.be.reverted; + + // Associate buyer here. + await sendFunds('0.01', buyer.address, buyer); + } + await estimateAndCall(marketplace.connect(buyer), "buyItem", [nftContract.address, tokenId], nftPrice); + + const newSellerNftbalance = await nftContract.balanceOf(seller.address); + expect(Number(newSellerNftbalance)).to.be.lessThan(Number(sellerNftbalance), "NFT should have been transferred from the seller.") + + nftOwner = await nftContract.ownerOf(tokenId); + expect(nftOwner).to.equal(buyer.address, "NFT should have been transferred to the buyer."); + } + + it("Should allow listing and buying erc721 by associated users", async function () { + // Create and fund buyer account + const buyerWallet = hre.ethers.Wallet.createRandom(); + const buyer = buyerWallet.connect(hre.ethers.provider); + await sendFunds("0.5", buyer.address, deployer) + + await testNFTMarketplaceOrder(buyer, deployer, erc721token) + }); + + it("Should allow listing and buying erc721 by unassociated users", async function () { + // Create and fund seller account + const sellerWallet = hre.ethers.Wallet.createRandom(); + const seller = sellerWallet.connect(hre.ethers.provider); + await sendFunds("0.5", seller.address, deployer) + + // Create and fund buyer account + const buyerWallet = hre.ethers.Wallet.createRandom(); + const buyer = buyerWallet.connect(hre.ethers.provider); + await sendFunds("0.5", buyer.address, deployer) + + await testNFTMarketplaceOrder(buyer, seller, erc721token); + }); + + it("Should allow listing and buying erc721 pointer by associated users", async function () { + // Create and fund buyer account + const buyerWallet = hre.ethers.Wallet.createRandom(); + const buyer = buyerWallet.connect(hre.ethers.provider); + await sendFunds("0.5", buyer.address, deployer) + await sendFunds('0.01', buyer.address, buyer) + await testNFTMarketplaceOrder(buyer, deployer, erc721PointerToken, '1'); + }); + + it("Currently does not allow listing or buying erc721 pointer by unassociated users", async function () { + // Create and fund seller account + const sellerWallet = hre.ethers.Wallet.createRandom(); + const seller = sellerWallet.connect(hre.ethers.provider); + await sendFunds("0.5", seller.address, deployer) + + // Create and fund buyer account + const buyerWallet = hre.ethers.Wallet.createRandom(); + const buyer = buyerWallet.connect(hre.ethers.provider); + await sendFunds("0.5", buyer.address, deployer) + + await testNFTMarketplaceOrder(buyer, seller, erc721PointerToken, '2', true); + }); + }) + + after(async function () { + // Set the chain back to regular state + console.log("Resetting") + await execute(`seid config chain-id ${originalSeidConfig["chain-id"]}`) + await execute(`seid config node ${originalSeidConfig["node"]}`) + await execute(`seid config keyring-backend ${originalSeidConfig["keyring-backend"]}`) + }) +}) diff --git a/integration_test/dapp_tests/package-lock.json b/integration_test/dapp_tests/package-lock.json index c1617b5c5d..5aa2af6c14 100644 --- a/integration_test/dapp_tests/package-lock.json +++ b/integration_test/dapp_tests/package-lock.json @@ -288,6 +288,23 @@ "typechain": "^8.0.0" } }, + "node_modules/@ethereum-waffle/compiler/node_modules/@typechain/ethers-v5": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-10.2.1.tgz", + "integrity": "sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A==", + "peer": true, + "dependencies": { + "lodash": "^4.17.15", + "ts-essentials": "^7.0.1" + }, + "peerDependencies": { + "@ethersproject/abi": "^5.0.0", + "@ethersproject/providers": "^5.0.0", + "ethers": "^5.1.3", + "typechain": "^8.1.1", + "typescript": ">=4.3.0" + } + }, "node_modules/@ethereum-waffle/ens": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/@ethereum-waffle/ens/-/ens-4.0.3.tgz", @@ -886,7 +903,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/abi": "^5.7.0", "@ethersproject/abstract-provider": "^5.7.0", @@ -941,7 +957,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/basex": "^5.7.0", @@ -971,7 +986,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", @@ -1057,7 +1071,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/sha2": "^5.7.0" @@ -1267,7 +1280,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -1339,7 +1351,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/constants": "^5.7.0", @@ -1360,7 +1371,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", @@ -1416,7 +1426,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/hash": "^5.7.0", @@ -1965,8 +1974,7 @@ "node_modules/@openzeppelin/contracts": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-5.0.2.tgz", - "integrity": "sha512-ytPc6eLGcHHnapAZ9S+5qsdomhjo6QBHTDRRBFfTxXIpsicMhVPouPgmUPebZZZGX7vt9USA+Z+0M0dSVtSUEA==", - "license": "MIT" + "integrity": "sha512-ytPc6eLGcHHnapAZ9S+5qsdomhjo6QBHTDRRBFfTxXIpsicMhVPouPgmUPebZZZGX7vt9USA+Z+0M0dSVtSUEA==" }, "node_modules/@openzeppelin/test-helpers": { "version": "0.5.16", @@ -3512,23 +3520,6 @@ "node": ">=4" } }, - "node_modules/@typechain/ethers-v5": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-10.2.1.tgz", - "integrity": "sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A==", - "peer": true, - "dependencies": { - "lodash": "^4.17.15", - "ts-essentials": "^7.0.1" - }, - "peerDependencies": { - "@ethersproject/abi": "^5.0.0", - "@ethersproject/providers": "^5.0.0", - "ethers": "^5.1.3", - "typechain": "^8.1.1", - "typescript": ">=4.3.0" - } - }, "node_modules/@types/abstract-leveldown": { "version": "7.2.5", "resolved": "https://registry.npmjs.org/@types/abstract-leveldown/-/abstract-leveldown-7.2.5.tgz", @@ -5731,7 +5722,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/abstract-provider": "5.7.0", diff --git a/integration_test/dapp_tests/package.json b/integration_test/dapp_tests/package.json index bd6d8ef522..d580918981 100644 --- a/integration_test/dapp_tests/package.json +++ b/integration_test/dapp_tests/package.json @@ -17,8 +17,8 @@ "ethers": "^5.7.2" }, "devDependencies": { - "it-each": "^0.5.0", "hardhat": "^2.22.6", + "it-each": "^0.5.0", "uuid": "^10.0.0" } } diff --git a/integration_test/dapp_tests/uniswap/uniswapTest.js b/integration_test/dapp_tests/uniswap/uniswapTest.js index 9347abe076..347bb62f05 100755 --- a/integration_test/dapp_tests/uniswap/uniswapTest.js +++ b/integration_test/dapp_tests/uniswap/uniswapTest.js @@ -7,7 +7,7 @@ const { abi: MANAGER_ABI, bytecode: MANAGER_BYTECODE } = require("@uniswap/v3-pe const { abi: SWAP_ROUTER_ABI, bytecode: SWAP_ROUTER_BYTECODE } = require("@uniswap/v3-periphery/artifacts/contracts/SwapRouter.sol/SwapRouter.json"); const {exec} = require("child_process"); const { fundAddress, createTokenFactoryTokenAndMint, deployErc20PointerNative, execute, getSeiAddress, queryWasm, getSeiBalance, isDocker, ABI } = require("../../../contracts/test/lib.js"); -const { deployTokenPool, supplyLiquidity, deployCw20WithPointer, deployEthersContract, sendFunds, pollBalance, setupAccountWithMnemonic } = require("../utils.js") +const { deployTokenPool, supplyLiquidity, deployCw20WithPointer, deployEthersContract, sendFunds, pollBalance, setupAccountWithMnemonic, estimateAndCall } = require("../utils") const { rpcUrls, chainIds, evmRpcUrls} = require("../constants") const { expect } = require("chai"); @@ -53,7 +53,7 @@ describe("Uniswap Test", function () { const userWallet = hre.ethers.Wallet.createRandom(); user = userWallet.connect(hre.ethers.provider); - await sendFunds("5", user.address, deployer) + await sendFunds("1", user.address, deployer) const deployerSeiAddr = await getSeiAddress(deployer.address); @@ -94,7 +94,7 @@ describe("Uniswap Test", function () { // Deploy SwapRouter router = await deployEthersContract("SwapRouter", SWAP_ROUTER_ABI, SWAP_ROUTER_BYTECODE, deployer, deployParams=[factory.address, weth9.address]); - const amountETH = hre.ethers.utils.parseEther("30") + const amountETH = hre.ethers.utils.parseEther("3") // Gets the amount of WETH9 required to instantiate pools by depositing Sei to the contract let gasEstimate = await weth9.estimateGas.deposit({ value: amountETH }) @@ -109,9 +109,9 @@ describe("Uniswap Test", function () { await deployTokenPool(manager, weth9.address, erc20cw20.address) // Add Liquidity to pools - await supplyLiquidity(manager, deployer.address, weth9, token, hre.ethers.utils.parseEther("10"), hre.ethers.utils.parseEther("10")) - await supplyLiquidity(manager, deployer.address, weth9, erc20TokenFactory, hre.ethers.utils.parseEther("10"), hre.ethers.utils.parseEther("10")) - await supplyLiquidity(manager, deployer.address, weth9, erc20cw20, hre.ethers.utils.parseEther("10"), hre.ethers.utils.parseEther("10")) + await supplyLiquidity(manager, deployer.address, weth9, token, hre.ethers.utils.parseEther("1"), hre.ethers.utils.parseEther("1")) + await supplyLiquidity(manager, deployer.address, weth9, erc20TokenFactory, hre.ethers.utils.parseEther("1"), hre.ethers.utils.parseEther("1")) + await supplyLiquidity(manager, deployer.address, weth9, erc20cw20, hre.ethers.utils.parseEther("1"), hre.ethers.utils.parseEther("1")) }) describe("Swaps", function () { @@ -120,20 +120,18 @@ describe("Uniswap Test", function () { const fee = 3000; // Fee tier (0.3%) // Perform a Swap - const amountIn = hre.ethers.utils.parseEther("1"); + const amountIn = hre.ethers.utils.parseEther("0.1"); const amountOutMin = hre.ethers.utils.parseEther("0"); // Minimum amount of MockToken expected - const gasLimit = hre.ethers.utils.hexlify(1000000); // Example gas limit - const gasPrice = await hre.ethers.provider.getGasPrice(); + // const gasLimit = hre.ethers.utils.hexlify(1000000); // Example gas limit + // const gasPrice = await hre.ethers.provider.getGasPrice(); - const deposit = await token1.connect(user).deposit({ value: amountIn, gasLimit, gasPrice }); - await deposit.wait(); + await estimateAndCall(token1.connect(user), "deposit", [], amountIn) const token1balance = await token1.connect(user).balanceOf(user.address); expect(token1balance).to.equal(amountIn.toString(), "token1 balance should be equal to value passed in") - const approval = await token1.connect(user).approve(router.address, amountIn, {gasLimit, gasPrice}); - await approval.wait(); + await estimateAndCall(token1.connect(user), "approve", [router.address, amountIn]) const allowance = await token1.allowance(user.address, router.address); // Change to expect @@ -151,7 +149,7 @@ describe("Uniswap Test", function () { sqrtPriceLimitX96: 0 }, {gasLimit, gasPrice})).to.be.reverted; } else { - const tx = await router.connect(user).exactInputSingle({ + await estimateAndCall(router.connect(user), "exactInputSingle", [{ tokenIn: token1.address, tokenOut: token2.address, fee, @@ -160,12 +158,10 @@ describe("Uniswap Test", function () { amountIn, amountOutMinimum: amountOutMin, sqrtPriceLimitX96: 0 - }, {gasLimit, gasPrice}); - - await tx.wait(); + }]) // Check User's MockToken Balance - const balance = BigInt(await token2.balanceOf(user.address)); + const balance = await token2.balanceOf(user.address); // Check that it's more than 0 (no specified amount since there might be slippage) expect(Number(balance)).to.greaterThan(0, "Token2 should have been swapped successfully.") } @@ -181,22 +177,17 @@ describe("Uniswap Test", function () { const fee = 3000; // Fee tier (0.3%) // Perform a Swap - const amountIn = hre.ethers.utils.parseEther("1"); + const amountIn = hre.ethers.utils.parseEther("0.1"); const amountOutMin = hre.ethers.utils.parseEther("0"); // Minimum amount of MockToken expected - let gasPrice = await deployer.getGasPrice(); - let gasLimit = token1.estimateGas.deposit({ value: amountIn }); - const deposit = await token1.deposit({ value: amountIn, gasPrice, gasLimit }); - await deposit.wait(); + await estimateAndCall(token1, "deposit", [], amountIn) const token1balance = await token1.balanceOf(deployer.address); // Check that deployer has amountIn amount of token1 expect(Number(token1balance)).to.greaterThanOrEqual(Number(amountIn), "token1 balance should be received by user") - gasLimit = token1.estimateGas.approve(router.address, amountIn); - const approval = await token1.approve(router.address, amountIn, {gasPrice, gasLimit}); - await approval.wait(); + await estimateAndCall(token1, "approve", [router.address, amountIn]) const allowance = await token1.allowance(deployer.address, router.address); // Check that deployer has approved amountIn amount of token1 to be used by router @@ -212,15 +203,12 @@ describe("Uniswap Test", function () { amountOutMinimum: amountOutMin, sqrtPriceLimitX96: 0 } - gasLimit = router.estimateGas.exactInputSingle(txParams); if (expectSwapFail) { - expect(router.exactInputSingle(txParams, {gasPrice, gasLimit})).to.be.reverted; + expect(router.exactInputSingle(txParams)).to.be.reverted; } else { // Perform the swap, with recipient being the unassociated account. - const tx = await router.exactInputSingle(txParams, {gasPrice, gasLimit}); - - await tx.wait(); + await estimateAndCall(router, "exactInputSingle", [txParams]) // Check User's MockToken Balance const balance = await pollBalance(token2, unassocUser.address, function(bal) {return bal === 0}); @@ -281,7 +269,7 @@ describe("Uniswap Test", function () { const unassocUser = unassocUserWallet.connect(hre.ethers.provider); // Fund the user account. Creating pools is a expensive operation so we supply more funds here for gas. - await sendFunds("5", unassocUser.address, deployer) + await sendFunds("0.5", unassocUser.address, deployer) await deployTokenPool(manager.connect(unassocUser), erc20TokenFactory.address, token.address) }) @@ -291,18 +279,15 @@ describe("Uniswap Test", function () { const unassocUser = unassocUserWallet.connect(hre.ethers.provider); // Fund the user account - await sendFunds("2", unassocUser.address, deployer) + await sendFunds("0.5", unassocUser.address, deployer) const erc20TokenFactoryAmount = "100000" - let gasPrice = deployer.getGasPrice(); - let gasLimit = erc20TokenFactory.estimateGas.transfer(unassocUser.address, erc20TokenFactoryAmount); - const tx = await erc20TokenFactory.transfer(unassocUser.address, erc20TokenFactoryAmount, {gasPrice, gasLimit}); - await tx.wait(); + + await estimateAndCall(erc20TokenFactory, "transfer", [unassocUser.address, erc20TokenFactoryAmount]) const mockTokenAmount = "100000" - gasLimit = token.estimateGas.transfer(unassocUser.address, mockTokenAmount); - const tx2 = await token.transfer(unassocUser.address, mockTokenAmount, {gasPrice, gasLimit}); - await tx2.wait(); + await estimateAndCall(token, "transfer", [unassocUser.address, mockTokenAmount]) + const managerConnected = manager.connect(unassocUser); const erc20TokenFactoryConnected = erc20TokenFactory.connect(unassocUser); const mockTokenConnected = token.connect(unassocUser); diff --git a/integration_test/dapp_tests/utils.js b/integration_test/dapp_tests/utils.js index 31a22a7f9b..9c66a92a0b 100644 --- a/integration_test/dapp_tests/utils.js +++ b/integration_test/dapp_tests/utils.js @@ -1,31 +1,15 @@ const {v4: uuidv4} = require("uuid"); const hre = require("hardhat"); -const { ABI, deployErc20PointerForCw20, getSeiAddress, deployWasm, execute, delay, isDocker } = require("../../contracts/test/lib.js"); +const { ABI, deployErc20PointerForCw20, deployErc721PointerForCw721, getSeiAddress, deployWasm, execute, delay, isDocker } = require("../../contracts/test/lib.js"); const path = require('path') async function deployTokenPool(managerContract, firstTokenAddr, secondTokenAddr, swapRatio=1, fee=3000) { const sqrtPriceX96 = BigInt(Math.sqrt(swapRatio) * (2 ** 96)); // Initial price (1:1) - const gasPrice = await hre.ethers.provider.getGasPrice(); const [token0, token1] = tokenOrder(firstTokenAddr, secondTokenAddr); - let gasLimit = await managerContract.estimateGas.createAndInitializePoolIfNecessary( - token0.address, - token1.address, - fee, - sqrtPriceX96, - ); - - gasLimit = gasLimit.mul(12).div(10) + await estimateAndCall(managerContract, "createAndInitializePoolIfNecessary", [token0.address, token1.address, fee, sqrtPriceX96]) // token0 addr must be < token1 addr - const poolTx = await managerContract.createAndInitializePoolIfNecessary( - token0.address, - token1.address, - fee, - sqrtPriceX96, - {gasLimit, gasPrice} - ); - await poolTx.wait(); console.log("Pool created and initialized"); } @@ -34,45 +18,18 @@ async function supplyLiquidity(managerContract, recipientAddr, firstTokenContrac // Define the amount of tokens to be approved and added as liquidity console.log("Supplying liquidity to pool") const [token0, token1] = tokenOrder(firstTokenContract.address, secondTokenContract.address, firstTokenAmt, secondTokenAmt); - const gasPrice = await hre.ethers.provider.getGasPrice(); - - let gasLimit = await firstTokenContract.estimateGas.approve(managerContract.address, firstTokenAmt); - gasLimit = gasLimit.mul(12).div(10) // Approve the NonfungiblePositionManager to spend the specified amount of firstToken - const approveFirstTokenTx = await firstTokenContract.approve(managerContract.address, firstTokenAmt, {gasLimit, gasPrice}); - await approveFirstTokenTx.wait(); + await estimateAndCall(firstTokenContract, "approve", [managerContract.address, firstTokenAmt]); let allowance = await firstTokenContract.allowance(recipientAddr, managerContract.address); let balance = await firstTokenContract.balanceOf(recipientAddr); - gasLimit = await secondTokenContract.estimateGas.approve(managerContract.address, secondTokenAmt); - gasLimit = gasLimit.mul(12).div(10) // Approve the NonfungiblePositionManager to spend the specified amount of secondToken - const approveSecondTokenTx = await secondTokenContract.approve(managerContract.address, secondTokenAmt, {gasLimit, gasPrice}); - await approveSecondTokenTx.wait(); - - allowance = await secondTokenContract.allowance(recipientAddr, managerContract.address); - balance = await secondTokenContract.balanceOf(recipientAddr); - - gasLimit = await managerContract.estimateGas.mint({ - token0: token0.address, - token1: token1.address, - fee: 3000, // Fee tier (0.3%) - tickLower: -887220, - tickUpper: 887220, - amount0Desired: token0.amount, - amount1Desired: token1.amount, - amount0Min: 0, - amount1Min: 0, - recipient: recipientAddr, - deadline: Math.floor(Date.now() / 1000) + 60 * 10, // 10 minutes from now - }) - - gasLimit = gasLimit.mul(12).div(10) + await estimateAndCall(secondTokenContract, "approve", [managerContract.address, secondTokenAmt]) // Add liquidity to the pool - const liquidityTx = await managerContract.mint({ + await estimateAndCall(managerContract, "mint", [{ token0: token0.address, token1: token1.address, fee: 3000, // Fee tier (0.3%) @@ -84,9 +41,8 @@ async function supplyLiquidity(managerContract, recipientAddr, firstTokenContrac amount1Min: 0, recipient: recipientAddr, deadline: Math.floor(Date.now() / 1000) + 60 * 10, // 10 minutes from now - }, {gasLimit, gasPrice}); + }]); - await liquidityTx.wait(); console.log("Liquidity added"); } @@ -122,6 +78,19 @@ async function deployCw20WithPointer(deployerSeiAddr, signer, time, evmRpc="") { return {"pointerContract": pointerContract, "cw20Address": cw20Address} } +async function deployCw721WithPointer(deployerSeiAddr, signer, time, evmRpc="") { + const CW721_BASE_PATH = (await isDocker()) ? '../integration_test/dapp_tests/nftMarketplace/cw721_base.wasm' : path.resolve(__dirname, '../dapp_tests/nftMarketplace/cw721_base.wasm') + const cw721Address = await deployWasm(CW721_BASE_PATH, deployerSeiAddr, "cw721", { + "name": `testCw721${time}`, + "symbol": "TESTNFT", + "minter": deployerSeiAddr, + "withdraw_address": deployerSeiAddr, + }, deployerSeiAddr); + const pointerAddr = await deployErc721PointerForCw721(hre.ethers.provider, cw721Address, deployerSeiAddr, evmRpc); + const pointerContract = new hre.ethers.Contract(pointerAddr, ABI.ERC721, signer); + return {"pointerContract": pointerContract, "cw721Address": cw721Address} +} + async function deployEthersContract(name, abi, bytecode, deployer, deployParams=[]) { const contract = new hre.ethers.ContractFactory(abi, bytecode, deployer); const deployTx = contract.getDeployTransaction(...deployParams); @@ -141,6 +110,12 @@ async function doesTokenFactoryDenomExist(denom) { } async function sendFunds(amountSei, recipient, signer) { + + const bal = await signer.getBalance(); + if (bal.lt(hre.ethers.utils.parseEther(amountSei))) { + throw new Error(`Signer has insufficient balance. Want ${hre.ethers.utils.parseEther(amountSei)}, has ${bal}`); + } + const gasLimit = await signer.estimateGas({ to: recipient, value: hre.ethers.utils.parseEther(amountSei) @@ -159,6 +134,50 @@ async function sendFunds(amountSei, recipient, signer) { await fundUser.wait(); } +async function estimateAndCall(contract, method, args=[], value=0) { + let gasLimit; + try { + if (value) { + gasLimit = await contract.estimateGas[method](...args, {value: value}); + } else { + gasLimit = await contract.estimateGas[method](...args); + } + } catch (error) { + if (error.data) { + console.error("Transaction revert reason:", hre.ethers.utils.toUtf8String(error.data)); + } else { + console.error("Error fulfilling order:", error); + } + } + const gasPrice = await contract.signer.getGasPrice(); + let output; + if (value) { + output = await contract[method](...args, {gasPrice, gasLimit, value}) + } else { + output = await contract[method](...args, {gasPrice, gasLimit}) + } + await output.wait(); + return output; +} + +const mintCw721 = async (contractAddress, address, id) => { + const msg = { + mint: { + token_id: `${id}`, + owner: `${address}`, + token_uri:"" + }, + }; + const jsonString = JSON.stringify(msg).replace(/"/g, '\\"'); + const command = `seid tx wasm execute ${contractAddress} "${jsonString}" --from=${address} --gas=500000 --gas-prices=0.1usei --broadcast-mode=block -y --output=json`; + const output = await execute(command); + const response = JSON.parse(output); + if (response.code !== 0) { + throw new Error(response.raw_log); + } + return response; +}; + async function pollBalance(erc20Contract, address, criteria, maxAttempts=3) { let bal = 0; let attempt = 1; @@ -355,14 +374,17 @@ module.exports = { harvest, queryTokenBalance, addAccount, + estimateAndCall, addDeployerAccount, setupAccountWithMnemonic, transferTokens, deployTokenPool, supplyLiquidity, deployCw20WithPointer, + deployCw721WithPointer, deployEthersContract, doesTokenFactoryDenomExist, pollBalance, - sendFunds + sendFunds, + mintCw721 }; \ No newline at end of file