雖然這篇幣安閃兌手續費鄉民發文沒有被收入到精華區:在幣安閃兌手續費這個話題中,我們另外找到其它相關的精選爆讚文章
在 幣安閃兌手續費產品中有4篇Facebook貼文,粉絲數超過2,602的網紅恩斯旅書 NS Travel Book,也在其Facebook貼文中提到, #IHG快閃賣點 #萬豪才開賣 #更常賣的IHG慣例也一起快閃促銷 即日起至11月27日止 購買1萬分以上,加贈100%獎勵點數! 以台幣目前強勢 以29 來計算 平均每點價值0.145元 (不含刷卡手續費) 也就是一萬點積分成本1450元! #台幣強一樣造成史上最低 #今年最多可買25萬分 ...
幣安閃兌手續費 在 恩斯旅書 NS Travel Book Facebook 的最佳解答
#IHG快閃賣點
#萬豪才開賣 #更常賣的IHG慣例也一起快閃促銷
即日起至11月27日止
購買1萬分以上,加贈100%獎勵點數!
以台幣目前強勢 以29 來計算
平均每點價值0.145元 (不含刷卡手續費)
也就是一萬點積分成本1450元!
#台幣強一樣造成史上最低
#今年最多可買25萬分
#官網買分由此去
https://bit.ly/3q3onyf
[NS推薦點數兌換旅館]
#台北晶華酒店
#大安金普頓
#大直英迪格
#新竹英迪格
#台南大員皇冠假日酒店
幣安閃兌手續費 在 龔成 Facebook 的精選貼文
【龔成問答信箱】(Q16961-Q16980)
Q16961:
龔成老師你好!
1)我想問下睇完一本投資書可以點樣應用去現實生活?
2)同埋我想知點樣可以睇書睇得快啲?
龔成老師:
1)當然是應用啦,將現金,有效轉到股票,令財富增值!
以《股票勝經》及《年報勝經》來說,睇完後,你就可以在全港的上市公司裡,選一些有質素的企業,可以跟據中的指標去分析。
銷定一些初步有質素的股票後,就可以分析年報,了解企業的質素,以決定是否買入,買入多少,咩價買入。當你做這個過程多,你的「等待買入名單股票」就會多,當大市回落時,就睇那一隻較有值博率,然後作出投資。
2)可以學下速讀。
又或選一些較有用的書,例如巴菲特已講明技術分析無用,如果你再睇技術分析的書,就是浪費時間。
------------------------------------------------
Q16962:
老師你好,之前一直有睇你啲文章,
已經開始做緊每月供盈富基金3000
有個長遠計劃想問問老師,本人32歲,月入48000左右,無乜投資經驗,與家人同住,其實開支都比較大,每月可以淨到8000蚊,但有3000已經供緊盈富。
如果想喺6-7年後 可以儲到錢買樓 (600-700萬)你覺得有無可能?或者我應該如何分配才可以達標?
龔成老師:
如果6、7年時間,每月儲$8000,一年約$10萬,6、7年連投資回報約有$100萬,你可以作為首期買樓,但要睇到時是否供到,自己的收入及負擔情況。
如果想穩陣D,你一定要加大儲蓄力度,每月要自己儲到$10000-$12000。
月供盈富(2800)加到$4000,再加上其他股去月供,加2隻(每隻$2000):銀娛(0027)、恆基(0012)、中銀(2388)、港鐵(0066)、煤氣(0003)、粵海(0270)、領展(0823)、港交所(0388)、希慎(0014)、太古地產(1972)等,你可以了解下這些股票,然後從中選股。
如果你不懂股,就集中供盈富$8000。
同時,你要留有一定的現金,這會成為你成敗的關鍵。
以你的年齡,財富仍有一定的增值力,建議你多增加投資知識,在選股、企業估值、投資時機上落功夫,對你長遠財富有好大影響。
現時大市處合理區,可以一邊投資一邊留現金,而餘下現金的運用,就是等大跌市時出手,如果你能在這段時間學好選股等技巧,到大跌市時就能把握機會,財富增值會更明顯。
------------------------------------------------
Q16963:
請老師分析一下9923移卡前景
龔成老師:
移卡(9923)是有風險,有潛力的類別。
首先,佢的業務為一站式支付服務,包括基於應用程序的支付服務及傳統支付服務,並支持逾500款發卡機構的移動應用程序,以支付為基礎的科技平台。
其中包括微信支付、支付寶或雲閃付,涵蓋了中國大多數的電子錢包。
另外,佢業務亦有科技賦能商業服務,即是提供商戶SaaS產品(包括實時庫存管理、消費者關係管理、智能訂單管理及全方位僱員管理)、營銷服務(包括量身定製的精準營銷及客戶忠誠度計劃電子工具),以及金融科技服務(包括助貸服務、委託貸款及保險轉介服務)等增值服務。
睇翻佢的財務數據,增長快速,但業務變數大,行業有不確定性,估值上比較難,這一定會令股價上落大,這刻仍唔平,投資值博率只是一般。
你預佢有潛力,同時有風險,如果控制注碼,都可以小注投資。
------------------------------------------------
Q16964:
本人43歲有2名小朋友8 &10 歲,想用月供$5000 盈富,去儲蓄教學基金,另配合恆指市盈率高低來高沽低買策略,是否合適呢?
龔成老師:
如果你每月月供$5000盈富(2800),同時有現金剩,是可以的。
這是一個較為平衡的策略,部分資金長期供盈富,同時間,你手持又一定的現金,當大市較平或較貴時,適當買賣,不過,記得要長期進行,唔好太著重中短期的市況波動。
------------------------------------------------
Q16965:
龔sir,恒基如果嗰年有10送1紅股,咁佢嗰年除淨日就會調整返送紅股後嘅股價,連帶以往嘅歷史股價都會自動調整。
所以我如果想計佢某一年嘅股息率,將佢嗰年嘅每股股息除以平均股價就得,因為個歷史股價已經調整咗之後送紅股嘅影響,所以我唔駛再做調整,唔知我咁理解有無錯。
龔成老師:
股價圖會因應派息及派紅股而調整的,例如10送1紅股,就是由10股變11股,而企業價值不會因此而改變,所以,每股的股價,就會自然地下跌,即是要將股價÷(1+10%)。
其實在計算上,有兩個方法。第一,如果你想計佢的股息率,你其實要找翻當年的股息,除以當年的股價數(唔好用股價圖所顯示的)。
第二,如果你用股價圖顯示的(因為已調整),就要用翻已經調整左,一般財網站已調整的股息數據就得。
------------------------------------------------
Q16966:
成哥我經常睇你發表嘅意見
我今年43歲. 結咗婚, 有兩個小朋友6歲同2歲.
都算高薪, 大概由2018年下半年開始每月用8萬蚊月供股票如下.
盈富基金 - 4 萬
地鐵 - 1萬
領展 - 1萬
煤氣 - 1萬
中銀 - 1萬
會唔會太保守? 應不應該改變下月供一啲atm嗎?
多謝你嘅意見
龔成老師:
你43歲,財富仍有增長的能力,你上述投資的,都是平穩增長股,可以保持,不過,的確可以增加一些新經濟類股,提高整個組合的增長力。
你可以考慮加入阿里(9989)或騰訊(0700),都是優質,有增長力的,每隻加$5000都可以。
當然,你最好在每月月供同時,有現金剩,這是最穩健的方法。
------------------------------------------------
Q16967:
龔sir,小弟最近鬼迷心竅,俾左48,888做XXX嘅代理
但係諗深一層,好似做直銷咁層壓式,過唔到自己心理果關,我應該如何自處好?
龔成老師:
你最緊要分析,佢所銷售的產品,有無實際用途,是否真正受歡迎,你問自己心底,是否連自己都想買?另外,就是睇翻佢的價格,是否真的較平?
如果你發現佢的產品根本無用,大家都是為賣而賣,同時大家的目的都是尋找更多下線,幫自己賣貨,而不是真心認為貨品幫到人,這樣便有問題。
如果你仔細分析,發現有問題,就要停止,盡量想方法減少損失。這也是無辦法,但卻是最理智的方法。
------------------------------------------------
Q16968:
老師、聽從你的建議開始動用100万分注買入,組合如下:盈富,金沙,銀河,阿里爸爸,中生1177,福壽園。
這個組合可以嗎?
龔成老師:
這個組合可以。
盈富(2800)會佔較大部分,另外要留意當中有2隻賭業股,比例不宜過多。
至於另外的3隻股,都是有潛力的,但現價都唔平,你這刻買入,只能小注,等佢回落先正式分注,這樣會比較好。
------------------------------------------------
Q16969:
以下是我的買入價和數量
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
0823是因為去年以500股一手
被迫買比較多的
佔港股比例最多
達30-40%
1177是看完
你的50隻值搏潛力股之後
去年找低位買的
股價回報最高的一間香港上市公司
我最初想法是
看見0823當時股價只有$56
股息率如果達5%
考慮可否
賣出0435/178/1881
再買入500股0823
並拖低平均買入價
但現在已經上升左
我還是以不變應萬變了
龔成老師:
上述的都是有質素的股票,但在比例上,可以調整得更加好。第一,地產相關股的比例太多,要慢慢調整翻。
領展(0823)比例太多,應該減少至15%,你唔需要一次過減,因為這股始終有質素,你慢慢睇市況,長遠調整就得。
唔好比「買入價」影響左你,最重要是組合的配置。
只外,建議你加入盈富(2800),令組合更加平衡。
------------------------------------------------
Q16970:
老師,我之前買了01610,共1.5萬股數@$1.5,現在升了,@$2.X, 請問這股票潛力如何,我應該繼續長遠持有嗎?感謝幫忙
龔成老師:
中糧肉食(1610)質素中等,唔算差,但又唔算好好,持有價值都有。由於現價仍不貴,你如果持貨不過多,可持有,再升多D先賣出,如果持貨較多,就這刻賣部分。
------------------------------------------------
Q16971:
龔sir,你好,由上年問完你問題後,我六月開始左月供股票,盈富同友邦各月供$1000,不過今年個市唔好,都蝕緊
而盈富派息又少左,加上有消息指黎緊應該買有中資成份既港股,係咪應該將個組合轉一轉丫?
如是,買中電同香港電訊可以嗎?
謝謝
定或是轉買金沙,長建,中銀?
龔成老師:
首先,你唔需要太著重中短期的情況,月供是一個長期的策略,你現時月供的,都是有質素的股票,你可以保持進行,唔需要有任何改變。
如果月供要有最大的效果,最好就是股市「先跌後升」,你就能保持買平貨然,然後長期有好回報。
至於你上述的股,都是有質素的,你可以儲多少少現金,之後先慢慢買入。
------------------------------------------------
Q16972:
您好,請問9988阿里爸爸在業務上,是不是大致上同700騰訊差不多一樣?謝謝
另外,買賣股票是不是不建議在證券行到買賣?我剩係知道證券行手續費係超平,雖然係超平,但我都不會考慮使用,我買股票都係中銀做買賣
龔成老師:
業務不同的,但都可以講話是同行類別。騰訊(0700)以通訊平台起家,從中建立了一個很大的系統,當中已擁有了大量的客戶,以及大數據。至於阿里(9988),則提供一個商業平台,例如淘寶,並延伸發展很多項目。同時,佢亦進行很多新項目的發展。
如果你想買賣股票,銀行與證券行都得,銀行較方便及穩健,證券行就較平,你自己喜歡就得,其實香港的監管不差的。
------------------------------------------------
Q16973:
老師,你好,我有保誠(100元入)及阿里爸爸(187元入),是否值得長線下去呢?
龔成老師:
這兩股都是有質素的,可以持有。
你買入價合理,無問題,加上這兩股仍有發展,長遠正面,只要你不是過度集中,你可以長線持有的。
------------------------------------------------
Q16974:
龔老師你好,我是在大陸出糧,在大陸工作的人士,之前都是出糧之後,把人民幣換成港幣,然後月供股票。可是現在由於人民幣的貶值
每一次兌換港幣就已經是直接虧損了百分之十幾。而且聽說人民幣還會繼續貶值,如果這樣的話,我是不是暫時停止月供股票?
或者我是不是應該直接在大陸分段買入大陸的A股,這樣就不需遭受人民幣貶值的害處? 大陸的A股,有沒有什麼推薦?敬請指點。
龔成老師:
你其實仍可以轉成港幣,但可以同時將部分人民幣,投資國內股票,兩邊並行都得。
雖然近期人民幣貶值,令你換到數港幣少左,但以長期平均的角度分析,你並沒有「蝕」,只是無之前換得這麼多港幣。
由於好難推將中短期人民幣的走勢,所以你只要長期保持這樣做,繼續將人民幣轉成港幣並買股票,是無問題的。
當然,你同時將部分資金,以人民幣買國內股是可以,最簡單就是投資一些指數基金。
------------------------------------------------
Q16975:
您好!請教一下,請問你會建議在投資落保險公司的儲蓄計劃嗎?你有何看法?
龔成老師:
這類保險公司的儲蓄計劃,都有投資的價值,最重要是配合你自身的情況。
我地進行理財,要攻守兼備,做好防守後就要進攻,而這類產品,是防守部分的,回報不高,但風險不大,在財富分配上,可以投入部分,但就不用太過多,因為應善用餘下資金作投資增值。
另外,對於不懂投資的人,與其亂投資,不如買這類儲蓄計劃。
------------------------------------------------
Q16976:
龔爺
你好 人生交叉點
應該用幾多成人工供樓呢
樓價未來半年或否暴跌爆升呢 中美貿易、國安法等等
是否睇定d比較好呢
龔成老師:
我相信香港經濟會轉弱,樓市會受壓,在1、2年內,不過不是大跌,只是小回。長遠來說,香港樓仍是供不應求,因此會向上,你要睇下能否把握到機會買樓。
至於供樓金額,如果可以的話,是人工的3成以下較穩健,但如果無訪辦法,勉強就是5成以下。
------------------------------------------------
Q16977:
老師,你好!我有投資問題想請教。若每月可以儲3萬,手上只有50幾萬,想5年後退休,可以點分配投資組合?
我想係泰國曼谷買樓,租比人收租,值得做嗎?
先謝謝你的指導
龔成老師:
泰國樓,要睇你地的熟識程度,只要是市區,租金回報率不差,而你又對當地的發展及租務市場有了解,都可以考慮。
曼谷是大城市,物業都有一定的價值,但你都要同時睇當中的情況,區份等因素。
其實海外樓,不少回報都比香港樓高,投資價值是有的,但當中一個關鍵位,就是「你熟識程度」,因此當地的法例、租務市場等因素,都與香港不同,你要先了解好,才可進行。
你可以先加強了解,如果投資,都建議你唔好用盡資金,最好部分資金投資泰國樓,部分就在香港持有優質股票,建立一個平衡的組合。
------------------------------------------------
Q16978:
龔sir, 想請教下
我今年26,月入25k, 資產約90k
由於想30歲前結婚,如果想做個3-5年的中線投資 可以有咩部署?
另外女朋友資產同我差唔多,會唔會有啲穩陣長遠既股票適合現價入市?
現時揸緊
友邦 $70.5@1手
美團 $155@1手
其餘現金
想問下需唔需要轉持其他股
拜托晒
龔成老師:
3-5年,都可以算是一個中長線投資,財富都能有一定的增值。
你地可以投資「平穩增長股」為主,再加少少潛力股。
友邦(1299)是平穩增長股,你可以持有。美團(3690)是潛力股,但這股業務變化大,因此唔建議持有太多,小注就可以。
另外,當你地不斷儲到現金時,都可以投資平穩增長股,盈富(2800)、銀娛(0027)、恆基(0012)、中銀(2388)、港鐵(0066)、煤氣(0003)、粵海(0270)、領展(0823)、港交所(0388)、希慎(0014)、太古地產(1972)等,你可以了解下這些股票,然後從中選股。
另外,建議你多增加投資知識,在選股、企業估值、投資時機上落功夫,對你長遠財富有好大影響。
現時大市處合理區,可以一邊投資一邊留現金,而餘下現金的運用,就是等大跌市時出手,如果你能在這段時間學好選股等技巧,到大跌市時就能把握機會,財富增值會更明顯。
------------------------------------------------
Q16979:
其實我覺得 佢呢個諗法好值得鼓勵 尤其是係喺書冇太大壓力嗰陣, 我今年廿六啦, 我都上過你嗰個班今年月頭嗰班,成日遲到行入嚟嗰個唔知你仲記唔記得
我係由寮屋上公屋, 我老豆係做小販嘅, 我自己嗰陣公開試失敗, 讀番書嗰陣都覺得 畀咗屋企好大壓力 而且我讀番我想讀嘅嘢嗰陣同年嘅同學都出嚟社會做嘢起跑線落後咗好多
但最後 啱啱做生意嗰陣都係得幾千蚊 一邊讀緊書, 我自己都冇所謂嘅人脈資金
但係 而家讀緊書輸得起 冇屋企人畀你太大壓力 而且可以試下自己嘅能力
去到畢業嗰陣你可能已經領先緊你嘅同屆同學, 到最後我讀番書 2015年開始創業 去到17年賺咗第一個一百萬 再到200萬再到上年三百萬
一次過追番以前落後咗嘅嘢
嗰陣最後一堂你話你細細個覺得點解人哋屋企咁大咁靚我以前都係咁樣覺得點解人哋個大堂咁靚間屋咁大可以望住個海可以年年去旅行
比個目標自己, 每個人都話而家 呢個社會 好難生存 好難有機會, 我覺得係冇錯嘅
只不過係機會 隱藏得更深 你需要用更大嘅努力 更多嘅時間 去搵到成功嘅機會 少啲埋怨少啲恐懼 做咗先 條路就會越行越闊
龔成老師:
你26歲,可以有好大發展,你現時的牌面已不錯,只要你保持正面心態,保持進步,我相信可以更上一層樓!
無人知自己的極限係邊,一般人唔會試,但成功者就是不斷推自己去極限,從而不斷進步!
過去的環境差,正正做成今天的成功,這是動力的來源,我是這樣,相信你都是這樣。
你思維及方向好正確,我相信長遠會有好大作為,加油呀!
------------------------------------------------
Q16980:
當計算資產比例時,物業是以買入價計算抑或已供咗嘅價錢計算?另外車位是否起碼有3%以上收租回報才投資?
長期好難諗 都唔知下個禮拜會點 haha
希望呢個世界多啲好似你咁+ve 嘅人
龔成老師:
物業以現時的市價計。
如果你有填個人的資產負債表你就明,資產項是計算這刻的市場價值,同時表中會考慮負債,以及自己資本的權益。
當我地考慮會否好集中在某一類的資產時,就要考慮這刻價值的價格及其波動性,所以在計算上,就是「市價」,去計算比例。
車位,3%、4%較是較基本要求,但這刻的確未必找到。
----------------------------------------------
若你有問題想向本人發問,可在龔成的fb專頁中(www.facebook.com/80shing)inbox龔成,但要注意如無特別聲明,有可能將問答放上網,當然,會將發問者的身份,以及有關個人資料的部分刪去。
另外,我所給予的各種意見,只是供大家參考,當中無任何銷售及推介,不涉及任何利益,其實大家應該要有獨立分析的能力,我只是給予一些方向及純參考模式。
由於提問人數眾多,見諒無法即日回覆,如果是普通的提問,預起碼要7天以上才能回覆,若然是較複雜的提問,起碼要10天才能回覆,希望各位能諒解。
幣安閃兌手續費 在 Taipei Ethereum Meetup Facebook 的最佳貼文
📜 [專欄新文章] Uniswap v2 實作 : 從創建交易對到Ether 換 Dai 投入 Compound
✍️ 田少谷 Shao
📥 歡迎投稿: https://medium.com/taipei-ethereum-meetup #徵技術分享文 #使用心得 #教學文 #medium
Uniswap v2 實作 : 從創建交易對到Ether 換 Dai 投入 Compound
V̶y̶p̶e̶r̶ Solidity coding time!
Image source: https://uniswap.org/
Outline
一. 前言二. 程式碼結構 1. Wrapped Ether(WETH)? 2. Impermanent Loss三. 創建交易對 - 準備 Interfaces四. 注入資金 - 注意事項五. 兌換虛擬貨幣六. 取得報價作為預言機七. 自行兌換 WETH八. 結語
一. 前言
暨上一篇解釋了 Uniswap 的演算法後,由於個人有使用 Uniswap v2 的需求,因此整理後寫成本篇,希望能幫助到其他也需要用 Uniswap 的讀者!(不熟 Uniswap 的人也可以參考區塊勢 許明恩 Astro Hsu 寫的介紹文:點我)
Uniswap 解析:恆定乘積做市商模型 Constant Product Market Maker Model 的 Vyper 實作
本文希望透過實際操作 Uniswap 我個人會用到、我認為大家比較常會用到的功能,來讓不熟悉的讀者快速了解其程式架構(v2 相較 v1 繁複)、熟悉實作方法,無法顧及全部還請見諒。
以下實作的測試環境為 Rinkeby 測試網,由於只是要講解使用方法,因此選擇在 Remix 上操作。
而 Uniswap v2 跟 v1 的差異,個人沒有很認真研究,大致列舉以下幾點,本文只會就其中幾點在後方進行較詳細的解釋:
使用 Wrapped Ether, WETH (於 二. 程式碼結構 解釋),讓 ERC20 交易對不再需要透過 Ether ,降低 gas 的消耗,但還是可以用 Ether 支付
加入時間權重的預言機,降低被操縱價格的風險,於 六. 取得報價作為預言機 中舉例說明,有興趣者可以看看 白皮書 有詳細介紹
閃電貸
使用 Solidity 而非 Vyper,因為 Solidity 功能上較齊全,於 五. 兌換虛擬貨幣 中舉例說明原因
在開始之前,本文超長,播個背景音樂吧:
二. 程式碼結構
本段落簡單描述 Uniswap 程式碼各部分的功能。若讀者要自己實作,可以參考此處得知該去哪一份程式碼找相應的功能:
Factory / UniswapV2Factory.sol : 創建交易對、查詢交易對的地址與總數;查詢、指定交易對手續費的收款地址
Pair(ERC-20) / UniswapV2ERC20.sol : Uniswap 流動性代幣 ERC20 的部分
Pair / UniswapV2Pair.sol : Uniswap 流動性代幣的其他部分;查詢交易對資訊
Router / UniswapV2Router01.sol : 注入、取出流動性/資金;兌換虛擬貨幣。此合約看似最複雜,其實只是因為收付款的單位可以是 Ether 或是 ERC20,所以有很多重複的函式
ExampleOracleSimple.sol, ExampleSlidingWindowOracle.sol : 預言機的範例程式碼
Library / UniswapV2OracleLibrary.sol : 供預言機調用的函式
Library / UniswapV2Library.sol : 供內部調用的函式
除了描述程式碼結構,為了以下的實作我們還需要知道 Wrapped Ether 是什麼,順便了解其使用原因:
1. Wrapped Ether (WETH) ?
從字面上來解釋,Wrapped Ether 是被包起來的 Ether。那為什麼好好的 Ether 不用還要創造出另一版本,嫌這小小世界的術語不夠多嗎 (ETH, WETH, Dai, aDai, cDai, sDai…)?xD
wETH | ERC20 tradable version of ETH
主因有兩個:廣泛地說,Ether 是以太坊上的原生虛擬貨幣,但它與廣為使用的 ERC20 標準並不相容( ERC20 有 approve(), transfer() 等等功能);而針對 Uniswap 的場景來說,v1 的交易對都一定有 Ether,而使用 Ether 可能會造成 Impermanent Loss,於下方解釋。
因此,就以上兩點的解決方法個別是:
部署一 ERC20 <-> Ether 的兌換合約:使用者將 Ether 付給 Wrapped Ether (ERC20) 的智能合約,合約就會給使用者同等數目的 WETH;拿回 Ether 則有點不太一樣,方法是告訴 WETH 的合約使用者要 withdraw(),WETH 的合約就會把使用者 WETH 擁有的額度設回 0 (或減少) 並返還 Ether,於 五. 兌換虛擬貨幣 中舉例說明
v2 交易對的建立不再只能是 (Ether, ERC20),可以是 (ERC20, ERC20)
2. Impermanent Loss
Impermanent loss 在 DeFi 指的是像 Uniswap 這類用演算法的去中心化交易所,如果交易對是兩幣價不相干的虛擬貨幣,例如:穩定幣 (Dai, USDC, etc) 和 Ether,流動性提供者 liquidity provider 會因為幣價的相對波動而比起直接持有兩幣還損失了一筆。
容我舉個例解釋清楚點,可以搭配我上一篇所寫的 Uniswap 的演算法 來理解:假設一開始 1 Ether 幣價為 100 Dai,只有一流動性提供者 LP 投入了 1 Ether 及 100 Dai (1 * 100 = 100 = k,k值要維持不變),總價值為 200 Dai。當 Ether 的幣價來到 200 Dai,眼尖者會發現資金池中的 Ether 價格低、有利可圖,因此會進行套利,例如:拿 33 Dai 約可以換到 0.25 Ether (0.75 * 133 ≒ 100),比起市場上要用 50 Dai 才能換到 0.25 Ether,套利者賺到了。此時,流動性提供者若將自己的資金提出,0.75 Ether 和 133 Dai 此時的總價值是 283 Dai,看似比當初的 200 Dai 還多,但其實將兩幣放著不動 1 Ether + 100 Dai 在此時就已經是 300 Dai 的價值了。於是,impermanent loss 就變成了 permanent loss :(
三. 創建交易對
- 準備 Interfaces
在開始之前,由於使用到的合約不少,所以我將全部所需整理在此:點我。其中,UniswapImplementation.sol 是本文實作的檔案。
若讀者在自己調用 Interface 時遇到版本問題,就依照 compiler 提供的指示稍作修改即可。我所整理的合約都修正過版本的差異、以下的實作也測試了可行,因此可以安心使用。
進入正題
通常大家使用的 Uniswap 資金池都是已經存在的,而如果想要上架自己的虛擬貨幣就要自己創建一組新的交易對,有兩種方式:在 Uniswap 官網上執行或是透過呼叫 Uniswap 的合約來建立,本文使用合約的方式。
首先,我們需要決定資金池為哪兩種虛擬貨幣,那就很普通地選 ETH 和 Dai 吧。雖然選了 ETH,但如同上方所述實際上必須使用 WETH,於是記下其在 Rinkeby 上的位置 。Dai 就使用 Compound 部署在 Rinkeby 上的版本,位置在 0x5592EC0cfb4dbc12D3aB100b257153436a1f0FEa。
接著,打開 IUniswapVFactory.sol,依照官方文件的指示將此合約部署在 Rinkeby 上的 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f。以下會有許多由 Uniswap 文件得知的合約地址及其他資訊等等,就不再一一附上來源或畫面截圖!
如上圖黑框所示,輸入了地址後按下藍色按鍵就完成部署了。接著,如下圖將 Dai 的地址 及 WETH 的地址輸入 createPair():
由於這個交易對我已經部署過了,因此讀者若想嘗試就麻煩去找別的 Rinkeby 上的測試幣了、或自己發一個! 完成後可以用 getPair() 輸入兩幣地址來確認交易對被建立成功:
如果想要進一步核對,可以先呼叫下圖紅框中的 allPairsLength(),得知當前總共有幾組交易對,再將 (交易對數 - 1) 輸入 allPairs(),就能得到和上圖一樣的地址。需要減 1 是因為陣列的 index 從 0 開始。
allPairsLength 的值會因為其他人的使用而增加,故日後可能會和本圖產出的 9 不同
四. 注入資金
看到標題的讀者可能會想:為何要把注入資金/流動性和上方的創建交易對分開呢?因為注入流動性這個功能被放在了 UniswapV2Router01.sol 中,所以就分開解釋。
雖然上一節只需要複製貼上按按鍵,但接下來要探討的注入資金 addLiquidity() 及虛擬貨幣的交換 swap()比起創建交易對 createPair() 是較有可能被融入到其他 DeFi 服務的功能(應該不太會有人會一直需要創建新的交易對),因此打開 UniswapImplementation.sol、要開始 Solidity coding!
如果不熟悉為何別的 DeFi 會需要在自己的服務中使用 Uniswap,可以搜尋 DeFi Money Lego/ DeFi 樂高,顧名思義就是在一個 DeFi 服務上使用另一個 DeFi 服務。實際的例子有:Aave 的新功能是可以拿往 Uniswap 注入流動性後得到的流動性代幣再投入 Aave 來賺取利息,以及下一節兌換虛擬貨幣的功能可以在 Pelith 的輕鬆貸 EasyDai、一站式 DeFi 組合工具 Furucombo 等場景中看到他們如何將 Uniswap 銜接上其他的 DeFi 服務。
回歸正題
在開始之前,先簡單提及一下有哪些變數、instance 需要初始化:
我們要呼叫 Uniswap 合約的 instance 來進行互動: IUniswapV2Router01
不只需要 Dai 的 instance,也需要 Dai 和 WETH 的地址;DaiAmount 和 ETHAmount 是為了稍後注入流動性所設置的,本文假設第一筆流動性我們使用 200 Dai + 1 Ether
immutable 是版本 0.6.5 加入的,用途是讓變數只能被讀取 read-only,但不同於 constant 的是能夠在 constructor() 中賦值。之所以各 instance 的地址不一起加上 immutable ,是因為若加上了,這些地址就不能在 constructor() 中被使用
p.s. 由於 gist 沒有 Solidity 的 syntax highlighting,所以隨便用了 .js 請忽略
看完了初始設定後,由於我們目前鎖定的資金池是 Dai 及 ETH,因此使用如下的 addLiquidityETH() 此函式,可以直接匯入 ETH 及 Dai。
本處我使用長度為 3 的陣列 addLiquidityResult 來記錄注入資金後的返回值:注入 Ether 的數量、Dai 的數量及返回的 Uniswap 流動性代幣的數量。實際上應該要依照不同使用者記錄的他們執行 addLiquidity() 後各自的返還值
第五行中的 approve() 是為了讓 UniswapV2Router01 的合約能夠從我們部署的合約 UniswapImplementation 取得 200 Dai 的使用權
於第六行 addLiquidityETH() 後方的大括號 {value: ETHAmount},這是 Solidity 0.6.0 後版本如果要在呼叫 function 的同時送入 Ether 的標準寫法,以前的寫法 .value() 目前也還能用但 compiler 會給提示
addLiquidityETH() 的第三、四個參數為最少要成功注入的數量。使用者能夠成功注入的數量取決於資金池中兩虛擬貨幣當下的數量,而本處直接給 0 比較方便
這邊非常重要的是上述程式碼還欠缺了一個無法被寫在合約內的步驟:使用者要同意這個被部署的合約 UniswapImplementation 可以從自己的帳戶中轉出 200 Dai。因此,將 ERC20 (Dai) 部署在 Rinkeby 上的位置,也就是0x5592EC0cfb4dbc12D3aB100b257153436a1f0FEa,接著輸入被部署合約的地址以及 200 Dai = 200000000000000000000、按下 approve() 後準備作業完成,如下圖。
終於可以呼叫 addLiquidity() 了! 如下圖,在紅框中以 1 Ether 呼叫黑框中的 addLiquidity() 後,就能成功將資金注入到 liquidity pool 了! 由於本文寫在測試後,因此沒有留下第一次 addLiquidity() 的結果 :(
此處被部署的合約位置跟上方截圖不同,因為其中測試了一些東西所以重新部署qq
接著,可以拿出 IUniswapV2Pair.sol,將其部署在 三. 創建交易對 中成功部署的位置 0x03E6c12eF405AC3F642B9184eDed8E1322de1a9e,使用黑框中的 getReserves() 就可以看到資金池中確實有匯入的資金! (本處依然沒有第一次使用後的截圖,因此截圖只是為了讓讀者看到 getReserves() 的結果)
此圖黑框中的值代表:在資金池中,Dai的數量、Ether的數量及上一次匯入資金的時間戳記
- 注意事項
使用 addLiquidity() 時需要小心的地方是:除了第一筆注入的資金可以自行決定兩虛擬貨幣的數量,第二筆開始就會依照其演算法算出兩幣可以投入的各自數量,因此使用者放入的兩幣中可能會有部分的其中一幣被 Uniswap 返回。
上方的程式碼只是為了第一筆流動性所寫,如果不是第一筆的情況就需要用成功注入流動性後的返回值(例如筆者的作法是用一陣列 addLiquidityResult 來存結果)來把沒有成功注入的資金返回給使用者。
五. 兌換虛擬貨幣
本節使用的兌換功能依舊是來自 IUniswapV2Router01.sol。
由於兌換虛擬貨幣實際上只有五行不到的程式碼,那麼就來把兌換 Ether 而得到的 Dai… 投到 Compound 來賺取放款利息吧! (雖然只是在測試網) 如果覺得這個場景似曾相識,沒錯,這就是上面提到的 輕鬆貸 EasyDai 的不專業版本!
首先將 Ether 和 Dai 互換的邏輯完成:
Ether 換 Dai : 使用 swapExactETHForTokens(),給某數量的 Ether 能換多少 Dai 是多少
Dai 換 Ether : 使用 swapExactTokensForETH(),作法只差在要把 Dai 轉到當前合約,再同意 UniswapV2Router01 可以從當前合約把 Dai 轉走
兩個做法的第二個參數都是可以自行指定兌換的路徑,此處就直接給 WETH 和 Dai 的地址即可(順序有差)。需要注意的是這個路徑要是動態陣列 dynamic array,而這就是 Vyper 所不支援的功能! 動態陣列跟靜態陣列宣告方式的差別我有註解在程式碼中
此處就先來試試 Dai 換 Ether 吧!和上方一樣,在使用時也要先 approve() 當前合約,當前合約才能轉走使用者的 Dai。
由上方的截圖可以很清楚的看到 Dai 換 Ether 這個動作牽涉到的資金轉移路徑:
Dai: 我的帳戶→當前合約→交易對所在合約
WETH: 交易對所在合約→UniswapV2Router01
Ether: WETH 合約→UniswapV2Router01→我的帳戶
以上的路徑有些人稍微思考後可能會納悶:為什麼上方沒有一筆 WETH 從 UniswapV2Router01 再轉到 WETH 合約的動作呢? 這就是在 Wrapped Ether (WETH) ? 中提到的案例。原因是:把 WETH 還回 WETH 的合約時實際上使用的函示是 withdraw() 而非 transfer(),而在 WETH 合約中發生的只是把使用者 WETH 擁有的額度歸零或減少而已。
接下來就是把 Dai 轉到 Compound 的部分。由於 Compound 不是本文重點,此處只求功能正常,因此比起真正的實作方法當然是簡化許多。
一如往常初始化 Compound 合約的 instance
ETH 換 Dai 後放入 Compound : 將用 ETH 換得的 Dai 的數量,也就是 swapExactETHForTokens() 返回的第二個值,approve() Compound 的合約後就可以用 mint() 匯入了! 要注意的是,ETH 換成 Dai 後的收款地址(第四個參數)是當前合約,才能從此合約轉 Dai 到 Compound
還款給使用者: 用 redeem() 取出 Dai,一如往常同意 UniswapV2Router01 使用 Dai 的權力
之所以說這個程式碼不能真的拿來用是因為:cDai 轉給使用者、讓使用者自己持有是比較安全的作法;即使選擇把 cDai 留在當前合約,以上程式碼檢查 cDai 數量是用當前合約 address(this) 去檢查,實際上應該要去記錄每個使用者所擁有的 cDai 數量
最後附上截圖,可以看一下資金的轉移路徑:
ETH -> WETH -> Dai -> cDai (Compound)
cDai -> Dai -> WETH -> ETH
六. 取得報價作為預言機
若使用 Uniswap v1的報價作為預言機,攻擊者可以利用其演算法造成的滑點來操控價格。為此,Uniswap v2 提供了兩個加入時間權重的合約範例:
ExampleOracleSimple.sol : 簡單版
ExampleSlidingWindowOracle.sol : 複雜版;Sliding Window 在此場景是指透過改變擷取資料(歷史價格)的片段,用該特定期間的價格來做成時間權重,讓使用上更靈活!
本處以簡單版為例。打開 ExampleOracleSimple.sol,由於一些匯入檔案的問題我將 UniswapV2OracleLibrary 也放在這份檔案中。
做法非常簡單:將 UniswapV2Factory、Dai 及 WETH 所在的地址作為部署合約 ExampleOracleSimple 時的輸入值就完成了。部署成功後會有個 24 小時的鎖 Time lock,因為這個預言機是有時間權重的,所以並不是一部署完就能立刻使用。若要體驗更新價格此功能可以使用我部署的兩個,其位置我寫在註解中。
將 WETH 或是 Dai 的地址和要查詢的數量輸入 consult() 就能查到兩虛擬貨幣的價格:
1 ETH 價格約為 97 Dai
1 Dai 價格約為 0.01 ETH
然而,在測試網上我們沒辦法拿著預言機查到的價格套入演算法來核對,因為測試網上的 Uniswap 沒有啟用收費機制,而 k 值要在收費機制啟動時才能被計算,欲知詳情者就麻煩去看官方文件了!
七. 自行兌換 WETH
上方雖然有提到 WETH 在 Uniswap 中的使用原因及場合,但或許有人想試著自己動手將 Ether 換成 WETH、把 WETH 換回 Ether。方法非常簡單,將 WETH.sol 部署到 0xc778417E063141139Fce010982780140Aa0cD5Ab 就能使用,如下圖:
按下綠框中的 At Address 後,使用下方黑框中的 deposit 搭配在中間的黑框輸入所要兌換 Ether 的量,就能成功換到 WETH。同理,圖中未顯示的 withdraw 功能就是讓人輸入 WETH 來換回等量的 Ether。
稍微提一下,如果是第一次兌換,將 WETH 所在的地址輸入 Metamask 就能在錢包中看到自己擁有的 WETH 的數量,如下兩圖:
Voila!
八. 結語
呼,雖然上述操作及程式碼的撰寫其實還蠻簡單的,但畢竟 Uniswap 的功能不少、我個人也希望能將小細節解釋清楚些,因此長度遠超過預期...有看到結尾處的讀者,辛苦了xD 希望大家現在對於 Uniswap v2 的內容跟實作方法都很清楚了!
最後,如果本文有任何錯誤,請不吝提出,我會盡快做修正;而如果我的文章有幫助到你,可以看看我的其他文章,歡迎一起交流 :)
田少谷 Shao - Medium
Uniswap v2 實作 : 從創建交易對到Ether 換 Dai 投入 Compound was originally published in Taipei Ethereum Meetup on Medium, where people are continuing the conversation by highlighting and responding to this story.
👏 歡迎轉載分享鼓掌