已公佈實作參考解答
第三次讀書會實作主題是 DeFi ,共分為「建立一個銀行 Bank」的基本題及進階題 Ethernaut 讓大家練習
繳交作業必須完成 Bank 基本題,其餘兩題可做可不做,請在 12/2 (五) 23:59前繳交
在 Web3 世界人人都可以當銀行家!我們想開張一間去中心化金融中心,簡易小而美的銀行
部署二個合約,
部署一個 Staking Token ERC20 的智能合約
提示:可透過 Openzeppelin Wizard 快速產生 ERC20
部署一個 Bank 銀行合約,並擁有以下功能
部署方式:Remix JavaScript VM 部署合約
StakingToken.sol
BankBasic.sol
利息計算時,免不了要進行浮點數的運算,Solidity 為了維持小數的精度所以沒有 float, double 這類的資料型別,皆是以整數來表示小數點。
查看 token 的基礎單位(Openzeppelin的 ERC20合約),預設是
若想要發 1,000,000,000 () 個 token,在 mint
時的數量要寫成 10 ** (18 + 9)
實際看到的發行總量並不會是 而是
https://docs.openzeppelin.com/contracts/4.x/api/token/erc20#IERC20
新增結構體陣列,記錄每筆定存的資訊
approve
:Token的擁有者,可以將權限委託給 Bank,允許他們從所有者的餘額中花費特定金額transferFrom
:允許Token擁有者,將控制權委託給另一個地址。它通常用於給合約來分配Token、Staking等使用transferFrom
通常與 approve
結合使用進階題可不做,但需繳交基本作業
部署兩個 ERC20 Token 的智能合約,分別是 StakingToken、RewardsToken
部署 AdvanceBank 智能合約,並擁有以下功能
合約部署在 Goerli Network,並開源 Verify
StakingTokenAndRewardToken.sol
BankAdvanced.sol
參考版為
有興趣者可以試著挑戰前 10 題
fallback.sol
的內容,會發現有兩個地方可以拿到 owner 權限
receive()
是用來接收 ETH,一個合約只能有唯一一個 receive
,它也走特例,不需要 function
關鍵字,但必須有 external
, payable
仔細看 receive 可以得知
呼叫 contributions 讓 contributions[msg.sender]>0,傳送 0.00001 ether
接著使用 Metamask 轉一筆錢到合約地址就會觸發 receive(),獲得 owner 權限
交易完成後,便可以 Submit 提交答案囉,成功後會看到控制台出現下面訊息,表示通過