# 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

<br/>
> 4. 添加一個功能並且傳送 n 個數量 ERC721 Token 給二號(ex. 0x977e01DDd064e404227eea9E30a5a36ABFDeF93D)地址
功能內容:添加一個function 可以轉 token 數量給某個錢包,例:購買Token、mintToken
利用 myToken721.changeHands 並設定 (address from, address to, number n ) 即可從 from 轉移到 to n 個數量的ERC721 (根據取得的順序給 _ownerTokenMapping)

<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

> 4. 添加一個功能並且傳送 n 個數量 ERC20 Token 給二號(ex. 0x977e01DDd064e404227eea9E30a5a36ABFDeF93D)地址
功能內容:添加一個function 可以轉 token 數量給某個錢包,例:購買Token、mintToken
利用 payComission,並且設定 *to* = 0xAb84...cb2 與 *amount* = 5000,即可轉移自己錢包中的 5000 個token 給 0xAb84...cb2,並可以使用 alanceOf查看數量有正常轉移

> 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 
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 
- 轉入帳戶餘額:10,000 
<br/><br/>
程式碼 Gist 連結:
https://gist.github.com/BeardYing/630120a740e36bcd76b68d44e75d46b1
Verify 開源的智能合約地址:
https://goerli.etherscan.io/address/0x2220eba5ac966d5a5e929f9268e095ce58880c5f#code
###### tags: `Solidity 工程師實戰營第 4 期`