{"id":20200793,"url":"https://github.com/dapp-learning-dao/dapp-learning-watermargin","last_synced_at":"2025-04-10T11:21:13.011Z","repository":{"id":40353765,"uuid":"433663687","full_name":"Dapp-Learning-DAO/Dapp-Learning-WaterMargin","owner":"Dapp-Learning-DAO","description":"Dapp-Learning-WaterMargin","archived":false,"fork":false,"pushed_at":"2022-05-13T09:22:59.000Z","size":9621,"stargazers_count":2,"open_issues_count":0,"forks_count":3,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-03-24T10:06:49.543Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Dapp-Learning-DAO.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-12-01T03:01:19.000Z","updated_at":"2023-05-22T09:52:10.000Z","dependencies_parsed_at":"2022-08-09T18:01:24.891Z","dependency_job_id":null,"html_url":"https://github.com/Dapp-Learning-DAO/Dapp-Learning-WaterMargin","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Dapp-Learning-DAO%2FDapp-Learning-WaterMargin","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Dapp-Learning-DAO%2FDapp-Learning-WaterMargin/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Dapp-Learning-DAO%2FDapp-Learning-WaterMargin/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Dapp-Learning-DAO%2FDapp-Learning-WaterMargin/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Dapp-Learning-DAO","download_url":"https://codeload.github.com/Dapp-Learning-DAO/Dapp-Learning-WaterMargin/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248208603,"owners_count":21065203,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-14T04:45:41.867Z","updated_at":"2025-04-10T11:21:12.983Z","avatar_url":"https://github.com/Dapp-Learning-DAO.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"## 简介    \n本项目为 Dapp Learning 项目实战产品  \n\n## 操作流程  \n- 安装依赖  \n```shell\ncd Dapp-Learning-WaterMargin\nyarn\n```\n\n- 配置环境变量  \n```shell\ncd packages/hardhat\ncp .env.example .env\n\n## 修改 .env 内容，在其中填入 private_key, Infura ipfs 的 PROJECT_ID 和 PROJECT_SECRET\nPRIVATE_KEY=xxxxxxxxxxxxxxxx\nPROJECT_ID=yyyy\nPROJECT_SECRET=ZZZZ\n```\n\n- 上传图片到 IPFS \n```shell\ncd Dapp-Learning-WaterMargin\nyarn upload\n```\n\n- 设置 MerkleList  \n因为 DappLearningCollectible 使用了 Merkle 空投方式, 在部署前需要设置空投的地址, 以便后续进行测试使用.  \n修改 packages/hardhat/scripts/addressList.json 文件, 在其中设置需要空投的地址\n\n- 部署合约  \n目前主合约为 DappLearningCollectible, 拍卖合约使用 AuctionFixedPrice.  \n执行部署命令后, 合约自动部署在 matic 测试网路上, 并发布 ABI 到 react-app/src/contracts 下面. 如果需要部署到其他的测试网路, 需要需改 hardhat/hardhat.config.js 中的 defaultNetwork.  packages/hardhat/test/MerkleDrop.test.js 为 Merkle 空投的测试脚本\n```shell\ncd Dapp-Learning-WaterMargin\nyarn deploy \n```\n\n- 替换 WETH 地址和 addressList.json\n当前竞拍的所使用的标的资产是 ERC20, 为了方便, 同时能适配其他的网络, 需要进行 WETH 地址的替换.  \n执行如下 replace 命令, 即可替换 react-app/src/contracts/WETH.address.js 中 WETH  的地址, 以及 react-app/src/utils/addressList.json 文件\n```shell\ncd Dapp-Learning-WaterMargin\nyarn replace \n```\n\n- 部署 subgraph  \n通过 thegraph 部署的 subgrpah 只能部署在主网 和 rinkeby 网络, 如果需要使用其他的网络, 则需要自己搭建 graph 服务. 下面讲解下如何通过 thegraph 部署 subgraph\n    - 创建 subgraph   \n    在 thegraph 官网上创建一个 subgraph, 假设 subgraph 名字为 DappLearningCollectible\n\n    - 安装 graph-cli \n    ```shell\n    yarn global add @graphprotocol/graph-cli\n    ```\n\n    - 初始化 subgraph\n    ```shell\n    graph init --studio DappLearningCollectible\n\n    ## 在选择网络的时候选择 rinkeby\n    ```\n\n    - subgraph 认证  \n    ```shell\n    ## 根据官网上 subgraph 操作的具体提示进行修改\n    graph auth  --studio fc72b2●●●●●●●●476024\n    ```\n\n    - 复制并修改配置文件  \n    复制 dapp-learning-test/src/mapping.ts , dapp-learning-test/schema.graphql , dapp-learning-test/subgraph.yaml 到对应的目录下, 同时修改如下配置 \n    ```shell\n    ## subgraph.yaml 中的 address 和 startBlock\n    source:\n      address: \"0xe1f5CCe0e39E6F3Fec75D29BCb32821A98d8b432\"\n      abi: DappLearningCollectible\n      startBlock: 9737148\n\n    ## mappting.ts 中的 auctionAddr\n    const auctionAddr = Address.fromHexString(\n        \"0xAE8FF5372fE7beb7eBC515ebe19670afd9045bf0\"\n    );\n    ```\n\n    - 编译文件 \n    ```shell\n    cd DappLearningCollectible\n    graph codegen \u0026\u0026 graph build\n    ```\n\n    - 部署文件 \n    ```shell\n    graph deploy --studio DappLearningCollectible\n    ```\n\n- 获取 graph URL  \ngraph 部署成功后, 可以得到如下的信息.  \n```shell\nSubgraph endpoints:\nQueries (HTTP):     https://api.studio.thegraph.com/query/1542/dapp-learning-test/v0.1.0\nSubscriptions (WS): https://api.studio.thegraph.com/query/1542/dapp-learning-test/v0.1.0\n```\n\n- 复制环境变量文件  \n```shell\ncd react\ncp .env.example .env\n\n## 然后在其中配置 REACT_APP_PROVIDER 和 REACT_APP_GRAPHQL, 其中 REACT_APP_GRAPHQL 值为上一步 graph 部署成功后显示的值\nREACT_APP_PROVIDER\nREACT_APP_GRAPHQL\n```\n\n- 启动 react   \n```\nyarn start\n```\n\n- Mint NFT \n只有在 packages/hardhat/scripts/addressList.json 文件中的账户地址才能进行 Mint 操作.\n\n\n- 拍卖  \n查看 Auction 合约中的 createTokenAuction 方法, 即拍卖方法, 可以发现其中调用了 IERC721(_nft).safeTransferFrom(owner, address(this), _tokenId), 即用户在执行拍卖前需要对 Auction 合约进行  NFT 的 approve 授权\n```\nfunction createTokenAuction(\n        address _nft,\n        uint256 _tokenId,\n        address _tokenAddress,\n        uint256 _price,\n        uint256 _duration\n    ) external {\n        require(msg.sender != address(0));\n        require(_nft != address(0));\n        require(_price \u003e 0);\n        require(_duration \u003e 0);\n        auctionDetails memory _auction = auctionDetails({\n        seller: msg.sender,\n        price: _price,\n        duration: _duration,\n        tokenAddress: _tokenAddress,\n        isActive: true\n        });\n        address owner = msg.sender;\n        IERC721(_nft).safeTransferFrom(owner, address(this), _tokenId);\n        tokenToAuction[_nft][_tokenId] = _auction;\n\n        emit StartAuction(owner, _tokenId, _price, _duration);\n    }\n```\n\n- 购买  \n同理在 purchaseNFTToken 接口, 即购买接口中, 会调用 IERC20(auction.tokenAddress).transferFrom(msg.sender,seller,price) , 即用户需要对 Auction 合约进行 ERC20 的 approve 授权, 这里是调用 WETH 的 approve 对 Auction 合约进行授权 \n```\nfunction purchaseNFTToken(address _nft, uint256 _tokenId) external {\n        auctionDetails storage auction = tokenToAuction[_nft][_tokenId];\n        require(auction.duration \u003e block.timestamp, \"Deadline already passed\");\n        //require(auction.seller == msg.sender);\n        require(auction.isActive);\n        auction.isActive = false;\n        address seller = auction.seller;\n        uint price = auction.price;\n        require(IERC20(auction.tokenAddress).transferFrom(msg.sender,seller,price), \"erc 20 transfer failed!\");\n\n        IERC721(_nft).safeTransferFrom(address(this),msg.sender , _tokenId);\n\n        emit AuctionEnd(seller, msg.sender, _tokenId, price, auction.duration);\n    }\n```\n\n## deploy address\n\npolygon mainnet\n\n- Auction 0x9089F4F3a19bdF13816e7c940d9376De32CFE2Fd\n- NFT 0xFD5f96fcFB68E80AcfEDd89841d9A354B93f53af\n- WMATIC 0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdapp-learning-dao%2Fdapp-learning-watermargin","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdapp-learning-dao%2Fdapp-learning-watermargin","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdapp-learning-dao%2Fdapp-learning-watermargin/lists"}