【專訪】人生就求九敗一勝!麻吉大哥黃立成跌倒再起,這次要用區塊鏈新項目CREAM勇闖DeFi世界
採訪:楊方儒、張詠晴/撰文:張詠晴
2020-10-29 16:15
「我覺得這就是我特色,可以跌倒,也可以繼續!」前人失敗的例子很多,面對瞬息萬變的市場,仆街了怎麼辦?該怎麼覆盤?黃立成坐直了說道,他當然想過會有再次失敗的可能,可即便CREAM可能會再度招來失望,他依舊無所畏懼,「因為要把理想變成現實,It's never easy!可是我不想要讓它阻擋我做新的事情。」
時代的洪流滾滾向前,90後世代可能不見得知道「麻吉大哥」黃立成,不曉得在1990年代海歸,把嘻哈音樂、饒舌、街舞元素帶進台灣音樂界的嘻哈先驅L.A. BOYZ是何方神聖。但總都聽過將素人變身網紅的「17直播」,知道有著台灣之光稱號,曾奪下電競《英雄聯盟》PCS職業聯賽冠軍的台灣電競團隊「Machi e-Sports」。
而這些都出自黃立成手筆,作為這些項目幕後的一大資金推手,他還曾經營過夜店及潮牌店、製作過國片、當過藝人經紀,更是一名台灣移動互聯網的先行者,先後推出過約會、交友、麻吉衣櫥等至少5款APP,這位大哥的事業很斜槓,斜槓到分不清楚哪個是他的主業。
但其實創業期間的起落,黃立成從沒少體驗過。
開夜店、拍電影、直播公司,還有幾個乏人問津的APP,以及近年來雷聲大雨點小,漸漸沒有了聲音的加密貨幣項目,都讓幾度慘賠的黃立成收斂起爽朗笑容,從中英台三國語言交雜的模式,轉換到中文模式,溫吞地說道,「那些失敗的沒有什麼人知道啦!就很像你寫一首很爛的歌、拍很爛的電影,但沒有人知道你失敗,因為沒人聽過、看過。」
談起這些失敗的項目,黃立成像談起自己一個個含辛茹苦拉拔長大,卻不成材的孩子。可他卻也沒因此停止嘗試,做十次新的嘗試,總會有九次失敗,但一次的成功往往是無數失敗的累積。
所以要讓失敗停止他向前?黃立成絕不接受!在接受《幣特財經》採訪這天,黃立成還興奮地說道,自己預備在M17賣出交友軟體Paktor之後,再瞄準疫情之後的「視訊約會」風潮,推出2個主打MVP推薦制、高端交友、夜間視訊、可添加濾鏡的新約會軟體,甚至考慮未來在其中加入虛擬貨幣元素,「我一直覺得Dating APP是一個還有很多空間進步的市場,畢竟現在有太多詐騙案件。」
從嘻哈藝人轉型成創業家的路上,黃立成一直和年輕人走得很近,也願意給年輕人足夠空間發揮,延攬人才不遺餘力,公司裡養著不少出自台大理工科的「台大底迪」。
「可以說大哥真的有放一些信任在我身上!」數位資產管理代辦平台Steaker創辦人Wilson如此說道。
Wilson從畢了業,就開始協助黃立成在區塊鏈世界中打天下,一手包辦了黃立成至今推出的三個區塊鏈項目產品設計、規劃與顧問角色。在他口中的「大哥」很願意聽年輕人說話,也常常親力親為參與產品的討論,當初甚至還是黃立成建議Wilson,可以放膽做想做的事,自己另外開一間新公司Steaker。
就像當年灑脫祝福直播APP《17》共同創辦人陳泰元有更好發展一樣,黃立成很開心Wilson可以在外闖出一番事業,也大手一揮,入主成為Steaker第二大股東,讓Steaker在成立初期就有豐厚資本。
黃立成之所以有「大哥」之稱其來有自,即便淡出演藝圈多年,他仍舊不改挺身為所愛的產業、為藝人出頭的大哥性格。從當年編寫饒舌歌曲《報應》捍衛台灣著作權法,到近日為挺藝人表演自由,不惜在臉書和網友開戰,先不論孰是孰非,黃立成態度始終不變,他依舊是那個富有正義感的街頭戰士,堅持做自己認為對的事,還是那一句「象來龍港款!來輸贏!」
不過自出道以來近30個年頭過去,黃立成不再將憤青個性,還有日常所思所想,融入歌詞創作並針貶時事,但他卻在這些年歲裡,把當年帶他走上舞台,這份無所畏懼、有話直說、盡情盡興做自己的嘻哈精神,帶到了新創領域,也在此將其發揮得淋漓盡致。
除了一邊打造年營收10億的17直播王國之外,2018年,黃立成也縱身躍進了區塊鏈領域,創立區塊鏈新創公司秘銀(Mithril),開發社交軟體App「Lit」,讓使用者可以用社交互動模式來挖礦,藉此獲得「秘銀幣(MITH)」作為獎勵。接著為打破如今音樂版權分潤不均的現況,黃立成也在去年,推出虛擬版權交易平台Machi X,讓粉絲可以透過虛擬貨幣或信用卡支持創作者。
不過黃立成後來發現,大家進來玩虛擬貨幣的原因,大部分都是希望可以藉此做投機生意,因此只會進行買賣交易,其實不太會利用MITH做支付。另外他也漸漸察覺,台灣民眾在乎版權的程度不高,其實不太願意為版權付費。
於是在今年8月份,黃立成跟上今年加密貨幣圈裡最夯的話題「去中心化金融(Decentralized Finance,DeFi)」,號召國內工程團隊,在以太坊上推出了去中心化借貸協議CREAM Finance。目前將資金放入CREAM的資金總額(TVL)為195,147,067美元,而平台上的月活躍用戶數(MAU)則達到23,015,CREAM也曾一度在數據網站DeFi Pulse上,名列全球鎖倉量第10大DeFi協議。
DeFi是什麼?Cream又在幹嘛?
早在幾年前,長期關注社群網路生態的黃立成,就曾多次抨擊Facebook和Instagram不尊重使用者的權益,他也在採訪中指出,抖音同樣有侵害創作者權益的問題,因為用戶上傳影片、獲得觀看數等作為,會讓這些App賺到廣告收益,但卻不會將這些錢,回饋給使用者甚至是創作詞曲的音樂人,「但在加密世界中,卻有這樣的觀念存在。」
「我認為Governance Token(治理代幣)的概念很酷!」黃立成強調,其實DeFi之所以能崛起,根本原因在於它「還權於民」,把用戶放多少幣、裡面有多少資金流動、賺多少收益的權利,從銀行這樣的中心化金融機構,轉移到了每一個持幣者身上。
正是因為被DeFi背後邏輯吸引,黃立成創立了CREAM Finance,這個貌似跟鮮奶油有些關係的項目名稱,靈感其實來自於美國嘻哈團武當幫(Wu-Tang Clan)的經典金曲《C.R.E.A.M.》,歌詞裡Cream指的是「金錢」。而黃立成則是把CREAM再多賦予了一層意義,即為「CRYPTO RULES EVERYTHING AROUND ME」的縮寫。
用嘻哈精神玩DeFi?
在嘻哈世界裡,鮮少有獨行的猛獸,更多的是成群結黨的好朋友,是各路人馬大顯神通,是為同一個目標,甘願一頭向前衝的純粹及熱血。而CREAM正是這樣一個一群人一起做,才能造出的成果。
原本黃立成想直接把CREAM建在主打高速交易、低成本的幣安智能合約鏈(BSC)上,而不是以太坊,但考量到BSC在9月才上線,可是由去中心化借貸平台Compound帶起的流動性挖礦風潮已經異常火熱,「還要等兩個禮拜欸!這樣我們等不了,所以決定先從以太坊版本開始做!」
決定上以太坊後,黃立成很快地先用Compound的程式碼進行分叉,推出CREAM,也在和Compound創辦人Robert Leshner相談甚歡後,決定給予彼此互惠條件,此後Compound順利成為CREAM的技術顧問跟資安夥伴。
「我弟弟聽到覺得不可思議,wait a minute,你複製他,但他還幫你備份?」黃立成笑著說道,其實大家都是秉持著「感恩的心」在做事,像是建立在以太坊上的Compound,原本想要把一部分的幣回饋給以太坊,CREAM同樣也是用這樣的心意在做項目,也因此得到了YFI創辦人Andre Cronje的背書及幫助,順利推出了全新AMM(自動做市商)CreamY。目前除了針對一般穩定資產提供低滑價、低費用creamY v1之外,也在creamY v2加入動態增減資產功能,以支援更多高收益穩定資產。
黃立成自信說道,「別人說我們就是double fork,no!我們是knife,一刀切,要走在最前面!」
而這樣的底氣也讓CREAM最終得償所願上了BSC主網,不過「CREAM以太坊版本」仍舊存在,用戶可以使用同一個Metamask地址錢包,透過轉換使用鏈別,CREAM的頁面上,就會自動顯示出符合各鏈別的使用畫面,未來CREAM也將開發讓用戶一鍵轉換鏈別的功能。
而由於CREAM的智慧合約歷經Compound備份及審核,並已通過雙方的無數測試,所以黃立成說自己對於資安機制有一定信心,不太擔心CREAM有被駭客攻擊的風險。
「不過半夜接到工程師打電話給我,還是會很挫!心裡想著不要是駭客拜託,有4億美金放在我們這裡欸!」黃立成說,現如今CREAM資金池內有不少資金,雖然不是自己的錢,都是投資人的錢,但對他而言,創立一個項目畢竟還是對投資人有責任,得要小心對待。
擔不擔心再失敗?
即便對於CREAM的各項發展充滿信心,但現在乘著DeFi熱潮向上攀升的項目越來越多,誰也不能預測,今天出現的新項目,究竟是產業中的領頭羊,還是只是另一個巨型泡泡,黃立成在推出CREAM之前,難道就沒想過失敗的可能性?
「我覺得這就是我特色,可以跌倒,也可以繼續!」前人失敗的例子很多,面對瞬息萬變的市場,仆街了怎麼辦?該怎麼覆盤?黃立成坐直了說道,他當然想過會有再次失敗的可能,可即便CREAM可能會再度招來失望,他依舊無所畏懼,「因為要把理想變成現實,Its never easy!可是我不想要讓它阻擋我做新的事情。」
一路走來,黃立成從不擔心自己的創業項目,會讓他付出多少資本,只擔心自己不夠快,沒跟上趨勢。
「我的態度是先打先贏,不要做你自己過不了的事情就好。」黃立成說,現在還沒有聽到監管部門要監管DeFi的聲音,那他就先做,要是未來有技術問題、法規問題,再來一個個解決。目標是吸納更多想進入DeFi世界的國際用戶,讓CREAM在這一年內達到十億TVL!
不過黃立成的終極目標還要更大些,他希望藉CREAM的成功,打響台灣優質工程人才的名號,「我們給人的印象,就是我們為了要做好事情都是不睡覺的,有那種要跟韓國、日本、美國,跟全世界打架的氣勢,我們一定可以打出一個地位!」
遙望未來,這個舉手投足間,都流露出悠然自在嘻哈魂的頑童笑著說道,或許一年後他就在好萊塢拍電影,不在虛擬貨幣圈了,不過只要他還站在這,就還是會不怕失敗也不放棄,持續追尋新趨勢,也會繼續招攬更多夥伴一起玩創新!
同時也有8部Youtube影片,追蹤數超過2萬的網紅阿藤,也在其Youtube影片中提到,本頻道主要以有趣方式 所呈獻出來的影片 如喜歡可以按訂閱 也可以分享你身邊的朋友呦 如有任何問題我有看到都會回答 聯絡信箱 : [email protected] 今天是中秋連假的第一天 只要登入就有三天試玩 最慢到9月19號早上10點前登入領取 而這台測下來的話 起步跟國服剛出一樣起步只有1...
「世界v1有問題」的推薦目錄:
- 關於世界v1有問題 在 台灣物聯網實驗室 IOT Labs Facebook 的最佳解答
- 關於世界v1有問題 在 Taipei Ethereum Meetup Facebook 的精選貼文
- 關於世界v1有問題 在 小薛 (kaworu) Facebook 的最佳貼文
- 關於世界v1有問題 在 阿藤 Youtube 的最佳解答
- 關於世界v1有問題 在 阿藤 Youtube 的精選貼文
- 關於世界v1有問題 在 Hi,I'm 5 Youtube 的最佳貼文
- 關於世界v1有問題 在 中和的新建案【世界V1】 (第22頁) - Mobile01 的評價
- 關於世界v1有問題 在 世界v1建商2022-在Mobile01/PTT/Yahoo上的房地產討論內容 ... 的評價
- 關於世界v1有問題 在 世界v1建商2022-在Mobile01/PTT/Yahoo上的房地產討論內容 ... 的評價
- 關於世界v1有問題 在 世界V1社區| 轉貼鄰居分享的訊息 - Facebook 的評價
- 關於世界v1有問題 在 世界v1工業宅的情報與評價,MOBILE01、PTT、YOUTUBE 的評價
- 關於世界v1有問題 在 世界v1工業宅的情報與評價,MOBILE01、PTT、YOUTUBE 的評價
- 關於世界v1有問題 在 世界v1工業宅的情報與評價,MOBILE01、PTT、YOUTUBE 的評價
- 關於世界v1有問題 在 世界v1風水 :: i郵箱地點查詢網 的評價
- 關於世界v1有問題 在 [請益] 靠近中和中山路二段的二八張溝會臭嗎? | PTT 熱門文章Hito 的評價
- 關於世界v1有問題 在 世界v1有問題 - 新北社區住宅 的評價
- 關於世界v1有問題 在 [請益]新北市中和預售屋世界V1 自住適合嗎? - 看板home-sale 的評價
世界v1有問題 在 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.
👏 歡迎轉載分享鼓掌
世界v1有問題 在 小薛 (kaworu) Facebook 的最佳貼文
【2020小薛MotoGP日本站門票代購】
感謝各位朋友分享,連續數年門票代購都順利完成,
先說明下列事項,加快大家買票效率^^
★代購接到我日幣現金不夠就截止!
截止時間無法預估(過去最快有開招一個月內就滿的),
請儘早預約匯款,感謝喔^^
★現在今年的正式官方報價還沒出來,
目前先用去年的價錢來計算,
如果價錢正式公佈後沒變就沒問題,
但如果有改則多退少補,
假設有差額需補,請各位預約代購的朋友,
在聯絡後三日內補差額,請各位朋友理解喔^^。
★為了精簡代購內容,今年只代購以下票種:
主票:
【自由席/V席(V1~V6)/A席/G席/Z席】
加值票:
【PADDOCK PASS / Pit WALK / 汽機車停車卷】
★無法代購的票種:
【指定席的小孩票,兒童票(自由席可) / 車手應援席】
常見Q&A:
☆MotoGP指定座位的門票都是「三日連票」,
所以不用再問說「我只要決賽的就好」,
沒這種東西喔^0^/
當然你可以買了三日連票,然後只去看決賽就好!
事實上很多朋友因為時間因素,都是這樣看的。
唯一例外是「當日自由席入場卷」,
但現場買單日也差沒多少!不如直接買三日。
能來兩天以上就至少上三日自由席吧!
☆無法代購指定席的小孩票、兒童票。
(自由席的小孩票、兒童票可代購)
因為大家買票如果是複數肯定都要連座,
這方面恕小薛無力負擔規劃兒童票,還請見諒。
☆無法代購車手應援區門票。
原因:「全世界的粉絲都在搶,搶不到正常」
每年開放購票「第一分鐘」就被秒殺,
(假設搶到也不會是照定價賣)ㄑ(認真),
如果只要特定車手應援區就不用敲我了^^,
真心做不來,我決定專心提供穩定的指定席給各位朋友。
另外例如V區,為求穩定提供票卷,
恕無法指定車廠應援。單純以V1~V6為區分。
(盡可能選車廠讓大家可以順手拿東西,但無法保證)
☆什麼位子最好?有沒有遮雨?帶小孩方不方便...etc
其實哪個位子最好都要看個人喜好,
像我要買一定買V4或V5,
因為我覺得眼前有大螢幕最重要!
加上又是衝線+頒獎台,我不考慮別的選擇。
然後各種位子特性?用口語問很難說明,
所以推薦直接去官網看(下面有去年連結),
選你所愛,愛你所選。這部分我就不介入了。^^
然後除了貴到炸的特殊位子或包場區,都沒遮雨!
以上,希望大家購票順利。
======================
代購費用計算如下:
單張票代購費NT$300、第二張起每張NT$100。
代購費包含寄到台灣運費!免加價!
(依照往年慣例,預計8月底前在台灣寄出掛號信)
購票費用示範:
◆V4三日連票x2 + PADDOCK PASS練習x2 + 停車卷
= 6,570 x 2 + 3,060 x 2 + 930 + 300 + 100 x4
= 20,890元
(V4三日連票、
Pit Walk、PADDOCK PASS、
停車卷等等都算一張)
======================
「主門票」台幣換算:
(成人:高中以上)
◆自由席(三日連票)(無劃位)
成人NT$:2,850
中學生 NT$:360
小學生 NT$:180
3歲以上 NT$:90
◆V席,衝線勝利席(三日連票)(預/決賽為劃位)
V1/V4/V5:
成人NT$:6,570
V2/V3:
成人NT$:5,850
V6:
成人NT$:5,970
◆A席 (三日連票)(預/決賽為劃位)
成人NT$:4,290
◆G席(三日連票)(預/決賽為劃位)
成人NT$:3,690
◆Z區(三日連票)(預/決賽為劃位)
(位在羅西區同一區塊)
成人NT$:4,200
======================
「附加票」台幣換算:
(需要持有上述「主門票」才能合併使用)
(無分年紀,一律同價)
◆PADDOCK PASS(PDP)
(要衝簽名請買這個,主要練習、預賽有機會拿簽名)
10/16練習 NT$ 3,060
10/17預賽 NT$ 3,390
10/18正賽 NT$ 3,690
◆Pit Walk(Pit)
NT$ 630
(每日一卷,購買請告知指定日期:10/16~18)
(實際使用時間請以官網公布為主,
每年都會改,但通常不是超早就超晚!
購買者需要自行在官網查詢使用方式,
恕代購無法分享如何使用^^;)
======================
◆汽車停車卷(三日連票)(已無指定停車區)
NT$ 930
◆機車停車卷(三日連票)(已無指定停車區)
NT$ 180
======================
想購買的朋友,請敲小薛LINE,
聯絡票種、張數、確認總價→匯款。
小薛LINE:kaworu8332
小薛LINE@:http://nav.cx/cMQ9Ha2
(點擊就可傳LINE訊息^^)
後請以下列格式聯絡小薛:
◆LINE 名稱:
◆票種、張數:
◆總價:
◆匯款帳號末五碼:
◆郵遞區號:
◆地址:
◆姓名:
◆電話:
(LINE 為了怕名稱改了找不到人,可能的話請加留LINE ID)
(購買日期指定加值票的朋友,務必註明指定日期)
世界v1有問題 在 阿藤 Youtube 的最佳解答
本頻道主要以有趣方式
所呈獻出來的影片
如喜歡可以按訂閱
也可以分享你身邊的朋友呦
如有任何問題我有看到都會回答
聯絡信箱 : q14442678@gmail.com
今天是中秋連假的第一天
只要登入就有三天試玩
最慢到9月19號早上10點前登入領取
而這台測下來的話
起步跟國服剛出一樣起步只有110而已
速度的話,非常快的,但手感偏硬
過彎因車頭長,所以貼彎要重抓一下距離
整體來說是有到賓果車等級
之後就看能不能滿盤了
BGM:
純享:IXFORM羅一舟/THE9安崎/硬糖少女303陳卓璇《自由世界》
https://www.youtube.com/watch?v=jNuRbt-uCdU
世界v1有問題 在 阿藤 Youtube 的精選貼文
本頻道主要以有趣方式
所呈獻出來的影片
如喜歡可以按訂閱
也可以分享你身邊的朋友呦
如有任何問題我有看到都會回答
聯絡信箱 : q14442678@gmail.com
這週活動挺好的
也是能免費獲得黑舒適V1的機會
只要你Beanfun!app裡面四個設施解完就好
包含分享、邀請碼、登入遊戲10天
以及競速或道具各行駛10回,就OK了
邀請碼也歡迎打在留言區分享~
資訊:
https://event.beanfun.com/kartrider/eventad/EventAD.aspx?EventADID=7833
世界v1有問題 在 Hi,I'm 5 Youtube 的最佳貼文
成為這個頻道的會員並獲得獎勵:
https://www.youtube.com/channel/UCNMIUvGvW35xL294jqY3cwg/join
指令包下載:https://www.planetminecraft.com/data-pack/nether-escape-v1-00/
若喜歡其他遊戲,歡迎至舞秋風遊戲頻道https://www.youtube.com/user/MrChesterccjLive
若喜歡生活vlog,歡迎至秋氏夫妻https://www.youtube.com/channel/UCDzhh2mPV1ES88eptkKgJTg
========更多影片========
我是一條魚:https://www.youtube.com/watch?v=2cXHVCyMzjU&list=PLBtVUsNOhEjtxqthDNRbDmbJqtBREy1bf&index=1
========相關連結========
舞秋風直播頻道(直播存檔):https://www.youtube.com/user/MrChesterccjLive
若有任問題,歡迎寫信至秋風信箱
chesterccj305@gmail.com
世界v1有問題 在 世界v1建商2022-在Mobile01/PTT/Yahoo上的房地產討論內容 ... 的推薦與評價
世界v1建商2022-在Mobile01/PTT/Yahoo上的房地產討論內容懶人包,找世界v1缺點,世界v1工業宅,世界v1有問題在YouTube影片與社群(Facebook/IG)熱門討論內容就來房地產 ... ... <看更多>
世界v1有問題 在 世界v1建商2022-在Mobile01/PTT/Yahoo上的房地產討論內容 ... 的推薦與評價
世界v1建商2022-在Mobile01/PTT/Yahoo上的房地產討論內容懶人包,找世界v1缺點,世界v1工業宅,世界v1有問題在YouTube影片與社群(Facebook/IG)熱門討論內容就來房地產 ... ... <看更多>
世界v1有問題 在 中和的新建案【世界V1】 (第22頁) - Mobile01 的推薦與評價
來到人口擁擠的中和中山路,走進位於巷子內的「世界V1」銷售中心。一位女性銷售人員開門見山就說:「我們這裡是工業用地,你們是要買來做辦公室還是住家? ... <看更多>