---
# System prepended metadata

title: Beard | C0041103 - 第 3 週作業
tags: [Solidity 工程師實戰營第 4 期]

---


# Beard | C0041103 - 第 3 週作業
# 基本題一 部署 ERC721

> 部署方式：Remix 部署方式選擇 JavaScript VM（Lodon）
> 1. 找到檔案中的 myToken721.sol
> 2. 嘗試修改 name 與 symbol，取名可以是你喜歡的名字、貨幣

此次合約設定的 name/symbol 為 BeardNFT / BDNFT
<br/>
> 3. 調整 mint 數量，確定能夠拿到 2 個 ERC721 Token

使用 packageMint 並設定 mintNumber = 2 即可得到 2 個 ERC721 token
![](https://i.imgur.com/iJa6iff.png)
<br/>

> 4. 添加一個功能並且傳送 n 個數量 ERC721 Token 給二號（ex. 0x977e01DDd064e404227eea9E30a5a36ABFDeF93D）地址
功能內容：添加一個function 可以轉 token 數量給某個錢包，例：購買Token、mintToken


利用 myToken721.changeHands 並設定 (address from, address to, number n ) 即可從 from 轉移到 to n 個數量的ERC721 (根據取得的順序給 _ownerTokenMapping)
![](https://i.imgur.com/o08xOWT.png)
<br/>



> 5. 貼 程式碼 Gist 連結 & 交易成功的截圖

* 部署 ERC721的 Gist 連結網址：
https://gist.github.com/BeardYing/8a7c548526bbab3cc1993c4dd1664faa





# 基本題二 部署 ERC20
> 部署方式：Remix 部署方式選擇 JavaScript VM（Lodon）
> 1. 找到檔案中的 myToken.sol
> 2. 嘗試修改 name 與 symbol

目前設定為 BeardToken / BT
<br/>
> 3. 調整 mint 數量，確定能夠拿到 10,000 個 ERC20 Token

在deploy時，直接輸入 initial 數量 10000，即可得到 10,000 個 ERC20 Token
![](https://i.imgur.com/6uAKS0z.png)


> 4. 添加一個功能並且傳送 n 個數量 ERC20 Token 給二號（ex. 0x977e01DDd064e404227eea9E30a5a36ABFDeF93D）地址
功能內容：添加一個function 可以轉 token 數量給某個錢包，例：購買Token、mintToken

利用 payComission，並且設定 *to* = 0xAb84...cb2 與 *amount* = 5000，即可轉移自己錢包中的 5000 個token 給 0xAb84...cb2，並可以使用 alanceOf查看數量有正常轉移

![](https://i.imgur.com/sIGkOrt.png)


> 5. 貼 程式碼 Gist 連結 & 交易成功的截圖

* 部署 ERC20 的 Gist 連結網址：
https://gist.github.com/BeardYing/124110f277a153742f7addfaec9a56c4




---
# 進階題一：ERC721 自行添加功能優化
> 部署方式：Remix 部署方式改選使用 Injected Web3（Metamask），部署至 Goerli 測試鏈
>
> 1. 選擇一個測試用的錢包（請新開錢包盡量不要用原本自己在使用的）
> 2. Metamask 中選擇 Goerli 網路進行部署
> 3. 將必要完成作業的合約部署至 Goerli 測試鏈
> 4. 進行呼叫，並且傳送 1 個 ERC721 Token 至（0x977e01DDd064e404227eea9E30a5a36ABFDeF93D）地址

操作流程
- 部署完成後，先利用 packageMint 取得 10 張 ERC721
    - [交易紀錄](https://goerli.etherscan.io/tx/0xee3da396768e1c981fc8fa194001abf7784ea44c6e4edebe3a6d15c90794495b)
- 利用 safeTransferFrom 轉移，將 TokenId = 9 轉到指定位置
    - [交易紀錄](https://goerli.etherscan.io/tx/0x8d7a9eeb05b5041d59e3ef471680f1b2105bf29d0d4ab13f94729d4680903d07)

<br/>

> 5. 自行嘗試是否能新增額外功能，使用最直覺撰寫方式即可，不需要針對燃料費用或程式內容進行優化
    > 例如（燃燒 ERC721 Token、退款 ERC721 Token、鑄造購買時將多餘的金額進行自動退款，或有其他想法也行）。
    自行嘗試功能不一定要非常完整，但至少必須要能夠提出偽代碼，並且說明用途，在實體課程時可以一起討論實作方式。

自行新增的額外功能說明 ( lotteryCombine )：
* 目前實作一個合併特殊token的功能，可以利用三個 tokenId 除以 5 餘數相同的 3 張 ERC721 ，合併成 1 張特殊 ERC721
* 合約初始化時，可以輸入 ERC721 的總供應量 *_maxMintSupply* 張（合約中有設定最大 1,000 張），以及特殊 ERC721 總發行量 *advSupply* 張（合約中有設定最大 3 張）
* 合併過後的 ERC721 禁止轉移，也不可重複使用
* 此功能設定成僅限擁有者可以合併，不可以使用其他錢包 approve 的 ERC721

功能說明：
* lotteryCombine(uint256 tokenId1, uint256 tokenId2, uint256 tokenId3) : 兌換特殊ERC721，輸入 三個 token Id
* isLocked() : 查詢ERC721 是否已經被鎖定（已經合併過）
* specialOwnerOf(uint256 tokenId) : 利用 特殊的 ERC721 的 token id 查詢擁有地址
* burn：開放可以燒毀 ERC721

操作流程（接續Q4操作說明）：
- 再利用 packageMint 取得 10 張 ERC721 ，錢包擁有 tokenId 0~8 與 10~19
    - [交易紀錄](https://goerli.etherscan.io/tx/0x9fbcf19b3c2cfe58844b6e5a53448ce2e04896f2105fa22ad7ee44d23923da6f)

- 準備進行 特殊 ERC721 取得，合併 Token ID [0,5,10] (三項除以 5 餘數皆為 0 ) 
    - [交易紀錄](https://goerli.etherscan.io/tx/0x710f8df11957bc47a6b9c5524de8f1b7678f5c3bc2e812beaa64c1fff7ed4d24)
    - 藉由 specialOwnerOf 查詢 id=0 可以看到已經屬於地址：0xadF8...b19 ![](https://i.imgur.com/he2vTao.png)



Gist：
https://gist.github.com/BeardYing/06d378eec701cb8f2d6a9ad0e4e739eb

Verify 開源的智能合約地址 ：https://goerli.etherscan.io/address/0xa36a71f9096fbd18a3370c7a9cff74ad4ecde813#code



# 進階題二－不引用原有標準 ERC20 檔案，完成部署 ERC20 合約，並將 Token 傳送至指定錢包地址
> - 不透過原有的標準 ERC20 檔案，思考如何用學習到的語法自行撰寫一個可以自訂 name, symbol
> - 該智能合約必須完成 totalSupply, balanceOf 與 transfer 的方法使用。
> - 傳送完成的 ERC20 Token 至（0x977e01DDd064e404227eea9E30a5a36ABFDeF93D）地址
> - 貼 程式碼 Gist 連結或是 Verify 開源的智能合約 & 交易成功的截圖
>     - 不引用原有標準 ERC20 檔案，完成部署 ERC20 合約，並將 Token 傳送至指定錢包地址


- 初始化 token 數量：100,000 顆
- 轉 10,000 顆到出到指定地址
    - [交易紀錄](https://goerli.etherscan.io/tx/0x5aa6d7dcc0199598b111537d413668f0fd314107f175d5fe57a9ed7444410d0f)
    - 轉出帳戶餘額：90,000 ![](https://i.imgur.com/GKHKvJh.png)
    - 轉入帳戶餘額：10,000 ![](https://i.imgur.com/Dk5IhVO.png)
<br/><br/>


程式碼 Gist 連結：
https://gist.github.com/BeardYing/630120a740e36bcd76b68d44e75d46b1

Verify 開源的智能合約地址：
https://goerli.etherscan.io/address/0x2220eba5ac966d5a5e929f9268e095ce58880c5f#code






###### tags: `Solidity 工程師實戰營第 4 期`