📜 [專欄新文章] 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.
👏 歡迎轉載分享鼓掌
「查詢不到此內容請重新輸入translate」的推薦目錄:
- 關於查詢不到此內容請重新輸入translate 在 Taipei Ethereum Meetup Facebook 的最讚貼文
- 關於查詢不到此內容請重新輸入translate 在 茜茜 育兒生活好好玩 Facebook 的最佳解答
- 關於查詢不到此內容請重新輸入translate 在 LIVE王 - Live is life Facebook 的精選貼文
- 關於查詢不到此內容請重新輸入translate 在 virtaal/zh_TW.po at master · translate/virtaal - GitHub 的評價
- 關於查詢不到此內容請重新輸入translate 在 我接受不到咯- 请去www.translate.google.com ,输入agar 看它 ... 的評價
查詢不到此內容請重新輸入translate 在 茜茜 育兒生活好好玩 Facebook 的最佳解答
#非常重要的一份公告 #關於巧虎團茜茜有話想說 😢
今天終於等到巧虎把付款搞定、系統搞定,還有每個人的付款狀況與禮物排序都弄好,這幾天真的是很難熬啊...(廠商下午已經同步將此份官方公告圖與每個人獲得的禮物發送簡訊&MAIL,請看完此份公告之後,再前往查看確認)
巧虎開團第一天40分鐘破1000張訂單,茜茜超替大家開心,因為每個人除了跟團禮以外,還能拿到茜茜自掏腰包的加碼禮,總共三樣禮物‼️結果因為系統的不穩定,造成各種狀況,在這裡茜茜想要特別謝謝這幾天給我鼓勵與體諒的粉絲們,你們懂我是絕對會為大家的權利爭取到底,不可能默不做聲的,謝謝你們💕
這幾天的壓力山大,除了不斷的跟廠商溝通,包括爭取禮物(超過1000名仍享有替代禮物)、禮物排序、系統問題等,雖然我沒有任何決定權,但我並沒有因此就放棄反應與建議,仍是無時無刻跟巧虎溝通再溝通。
每天我都只睡3-4個小時(瑪麗姆姆也都加班到很晚,回到家都晚上11-12點),只為了能夠回到每一個人訊息。我為什麼懷孕了還要不顧身體、不睡覺,拼命地回訊息到天亮,撐不下去才稍微睡一下,因為我對於跟我反應的人的無奈、抱怨、生氣都能感同身受,所以我就算少睡也要讓你們覺得有人回應,如果我正常睡,可能有數百人要2-3天才能收到回應...
【#想知道禮物排序是以下單或付款順序?】
我也曾經拿幾個粉絲傳給我的例子去問巧虎,巧虎回覆:「是以系統付款時間為準,而每個人付款時間有快有慢,也有人動作更快。」若是對於付款時間與禮物排序有任何問題或想查詢的,巧虎說 #請大家統一詢問巧虎客服。
這幾天仍有部分客服搞不清楚狀況,說:「要問茜茜」或是「茜茜才能決定禮物順序」這讓我不明白,為什麼有的客服處理得很快、有的推給我?我只能無奈的說,我的建議沒有被採納,也沒有決定權,更無法查詢任何資料,推來推去的行為讓我很火大,因為這一直都不是茜茜的做事風格,我不希望被剛認識我的粉絲誤會。
如果你收到這樣錯誤的回答,請直接了當的告訴他:「公告寫得很清楚,因為個資的關係,只有巧虎可以查詢和決定禮物順序,請不要再推託,好好的解決處理我的問題。」
【#填錯禮物代碼會重新排序】
狀況是,某位媽咪詢問了另一位媽咪後,認為自己比較早下單,為什麼那位媽咪有拿到禮物AorB,但他禮物排序是D?後來查了紀錄發現,原來是因為禮物代碼填錯,依照規則需要重新排序,而禮物A~C在開團後沒多久就已經送完,所以才會變成是禮物D。雖然有跟客服聯繫說打錯了要改正,但巧虎為了公平,填錯的訂單都是安排重新排隊,所以才會排在禮物D。
【#茜茜能給予的協助】
若幾經考量,還是比較喜歡別人獲得的團購禮物,茜茜特別開放大家收到團購禮後,可以在茜茜的「茜茜揪團瘋好物」社團約媽咪私下交換。其實不管是哪個禮物質感都很好,對於孩子的學習都很有幫助的。
【#最後茜茜想說】
最後我想說,茜茜認真寫文,認真開直播說明,還讓大家能有多的好康~自掏腰包加碼多送兩樣禮物,雖然獨家禮物開團沒多久就送完了,更是不遺餘力的爭取大家都要拿到‼️
我的本意是,巧虎幫助了我的育兒生活,所以我非常認真的分享巧虎這樣的好教材,每個月的學習主題都能寶寶們開心的唱歌跳舞,又學習到很多生活常規、知識,為了讓爸鼻媽咪可以輕鬆育兒,增進親子關係。能夠感受並看見孩子的成長,這絕對是最值得開心的事。
真沒想過會因為大家熱情支持我,而發生這樣的狀況...雖然很多粉絲安慰我說不是我的錯,也看見我的努力與無奈,但一直都希望大家開開心心買到好物的我,這幾天比誰都難受。
巧虎團購還沒結束,但已經有不少跟茜茜團訂巧虎的媽咪們,開心地收到巧虎的月刊,寶寶愛到不行,很期待地問我什麼時候收到獨家禮物?團購主文上有說明茜茜獨家團購禮&茜茜獨家抽獎禮是5/20陸續寄出,所以最近會陸續收到超級澎湃的巧虎大軍(這個說法實在可愛)😆
我看到以後安慰不少,即使這幾天因為回客服回到睡眠不足又承受不少負能量,但這就是我希望爸鼻媽咪跟團後,真正所獲得的快樂與對孩子的成長能有所幫助。
再次感謝相信我的人,以及因為巧虎而認識我的粉絲,我比你們想像的還要在乎你們‼️如果之後使用巧虎教材玩具上有任何問題,都很歡迎私訊我,我會無私的分享我的經驗與方法😊
#官網看不懂客服說不清都不用擔心
#因為你們有茜茜我當你們的後盾
#也謝謝你們給予的耐心等候
/
【#現在下單會得到茜茜的獨家禮物嗎】
非常多人問我這個,所以茜茜這裡再跟大家說一次好消息~有的喔!
前1000名有部分禮物已經送完,本來巧虎是說送完為止,不打算再送。但茜茜有很努力去拜託,爭取到繼續加碼送!現在下單一樣可以拿到 #茜茜獨家巧虎三好禮
【茜茜獨家團購禮】
甜甜圈派對組(日本款)在禮物欄位會顯示Dount。
【訂單破200加碼禮】
❶ 可愛巧虎方巾1組2入
❷ 寶寶搖搖樂
因為巧虎量多的自制商品(非賣品)都被茜搶搜刮了,所以這批數量有限,送完為止喔!
訂購【寶寶開始號 15期】會拿到:
茜茜獨家巧虎禮物X3(上方有說明)、巧虎手偶、Do Re Mi巧虎小樂手、寶寶歡樂探索屋 or IC語彙100、寶寶推推樂、水清淨抗菌液等多達8樣禮物,還可以參加萬元育兒刮刮金活動,是我接觸巧虎4年來第一次看到!
另外要特別說,只有訂購15期,才會拿到13-15期的教具:巧虎IC聲音如廁學習機、顏色形狀積木、顏色娃娃扮演遊戲組;還有15期加碼禮-寶寶推推樂。(只訂12期沒有這些玩具哦)
💜月月都有遊戲書_玩具_影音內容orAPP_育兒誌
💜寶寶開始號內容全新與日本同步開發
#想看其它版本會拿到的禮物請看心得文或團購主文
▶巧虎團購主文:https://ababa.tw/OAcHs/bf0424
❣️和巧虎在家防疫安心學❣️
【巧連智月刊】茜茜團購獨家優惠3樣巧虎好禮
✅優惠團購:https://ababa.tw/gX1gZ/bf0424 (4/28結團)
※請點《茜茜》專屬連結,才能享有獨家優惠唷!直接從官網訂購沒有喔!
✅心得文:https://ababa.tw/qPsiX/bf0424
✅看直播:https://ababa.tw/9DCWf/bf0424 (抽好禮)
✅下單方式:
❶確認訂單名稱”茜茜團購” (一定要看清楚才下單喔!)
❷團購禮:第一波禮物已全數秒殺送完,現在下單都是送『日本版甜甜圈派對組』(表單顯示Dount)與達標加碼禮『巧虎小方巾2入+巧虎搖搖樂』
❸輸入小朋友生日,會出現建議訂閱版本&選擇其他版本(只會有上下2個範圍的版本可選)
❹訂購教材”一年12期、15期”才會有禮物 (選半年6期是不會有任何禮物的,請不要點錯囉!)
❺付款後7天內出貨(預約除外)
❌巧虎開團40分鐘,已突破1000張訂單,但因為禮物有限,最多只能接到2000張訂單,超過就會不受理了,所以想要跟上難得優惠茜茜獨家團,請加緊腳步。(目前付款、系統都已正常,沒有問題,請安心下單)
❌準時關單,不會延期、不給加單,無法補付款,請務必注意結團與付款時間。
❌只有訂12期、15期才會送茜茜獨家禮、新訂戶禮,如果選訂6期(半年),就算有填禮物代碼也是拿不到的喔!系統會自動排除!請特別注意!
❌跟團資格一切以巧連智系統紀錄和巧連智判斷為主!
/
【以下是巧虎官方公告的文字檔,與圖片相同內容】
親愛的家長:
感謝大家的熱烈支持巧連智月刊,本次團購超出預期,系統設備與相關服務不穩,對茜茜和客戶們造成困擾,我們深感抱歉。公司已漏夜盡快修復,並盡最大的努力溝通調貨,也會用嚴謹謹慎的態度,人工仔細核對千筆的訂閱資料,在此感謝大家的體諒。
每位家長的留言、建議,我們都有認真看完,我們會虛心檢討並努力改進,未來提供給大家更優質的客戶體驗。希望大家收到教材後會喜歡,讓巧虎陪伴您的孩子快樂成長。
►團購禮物內容詢問
禮物寄送順序以巧連智系統「付款時間」為準,由於訂單件數較多,我們努力核對完所有的付款資料。
針對開團期間4/21(二)到4/23(四)下午3點為止已付款的訂單,預計今天4/24(五)下午陸續發送簡訊和E-mail通知【團購禮物內容】。若未收到簡訊或E-mail,但已付清款項的話代表都是D組合「甜甜圈派對組(日本款)+巧虎方巾+寶寶搖搖樂」。由於禮物庫存有限,本團滿2000件訂單結團。這次訂單數量衝得超快超出預期,公司動員緊急調度更多禮物,並請茜茜公告禮物調整。(請見圖一)
►付款時間說明:
巧連智系統是以「刷卡銀行」所提供的資料為準,ATM、超商繳款則是依每日的作業時間。刷卡銀行所提供的付款資料,原則上與家長當日收到的銀行通知時間相近。由於系統不穩,導致客服當下無法查到付款資料,並造成較晚發出付款簡訊、E-mail通知,不過禮物排序皆是依照付款時間,碰到上述情況也不會影響實際的禮物排序。
►為保護家長的個人資料,針對訂單內容、付款等相關作業,只能由巧連智客服協助,如有問題請洽巧連智客服詢問。
►客服聯絡資訊:
巧連智Line ID:@benesse_tw (週一~週五 09:00-16:30,例假日休息)
客服電話:0800-000-405/行動請改撥:(02)2312-0405 (週一至週五09:00-18:00,例假日休息)
針對未來活動規畫,我們會再虛心檢討,努力做得更好!
再次感謝家長的支持與愛護。敬祝您和孩子 健康快樂
查詢不到此內容請重新輸入translate 在 LIVE王 - Live is life Facebook 的精選貼文
【HIGHLIGHT LIVE 2017 CAN YOU FEEL IT ? TOUR IN TAIPEI】- 售票公告
※演出日期:2017 / 09 / 16 (六) 19:00 開演。
(實際演出時間,需以演出方時間為準。)
※演出地點:新莊體育館(新北市新莊區中華路一段75號)
禁止攜帶飲食/(攝、錄影音及相機)等器材入場,主辦單位有權立即請違反者離開現場自行另覓處所寄物(現場無法另提供寄物區,請自行處理)。
※售票日期:2017 / 06 / 24 (六) 上午11:00 整點開始。
※售票方式:https://tixcraft.com/activity/detail/Highlight
※購票流程: https://goo.gl/wpMDou
※售票相關Q&A: https://goo.gl/sGv5rm
※ 購票頁面:
※票價:$5,200 (搖滾區) / $4,600 / $3,600 / $2,600
(全場均為電子票卡)。
‧搖滾區全皆為站位- 演出當天依票面上的序號整隊入場。
‧2樓座位區 - 對號入座。
※請注意:2樓座位區每區最前方皆有欄杆(場館固定之安全設施),若在意欄杆影響視線,請三思確認後再購票,謝謝。
※ 提醒:2樓座位區為單雙號分開的座位 (號碼從中間往兩旁),
選位時同區塊同排數需"單號連號"或是"雙號連號"才是隔壁連號座位。
※身心障礙優惠票價:2,300
※身心障礙票購票表格網址:https://goo.gl/e1rs8M
◆請注意!印製姓名經填寫或留白送出後,不得更改。指定姓名僅限「繁體中文」與「英文」,中文請小於7個字,英文小寫請小於25個字母,英文大小寫混合或中英混合系統將自動判定長度。1個空格等於英文小寫1個字母,請勿使用特殊符號與字元。
◆客製化印製時間,如下:
◆2017/06/24訂購之訂單,票卡可印製指定姓名。
◆2017/06/25(含)後訂購之訂單,票卡不提供印製指定姓名。
◆2017/06/25(含)後訂購之訂單,以透明貼紙印製座位資訊黏貼於票卡。
◆2017/08/26(含)後訂購之訂單,一律現場取票。
※ 視線遮蔽區:東B區、西B區,上述2個區塊部份座位太靠近舞台及舞台架設角度問題,因此2個區塊將觀賞不到:
◎『主舞台』的LED 螢幕。
◎ 藝人於『主舞台』中後端表演會無法觀賞,此時主舞台表演實況,只能觀賞舞台兩側的投影螢幕。
◎ 視線遮蔽區不影響主舞台以外的視線,如:中央舞台及花道區塊。
*請注意!視線不良區因位置較為斜邊,會有部分視線受阻的情況,請務必三思後再購買,謝謝。
◆現場舞台視線若有不良(在未公告的視線不良區域外),必須在開演10分鐘內向現場工作人員提出。經工作人員判定如確認為視線不良座位者,將視情況調整座位;若無座位可以更換,消費者得辦理全額退票。若無提出者,視同同意該座位安排。
【購票前請詳閱,以下注意事項】:
1.僅限「Facebook帳號」登入購票(支援行動裝置購票),每人每場限購3張,購票時可選擇【電腦配位】加速購票流程。
2.付款方式:僅提供【ATM虛擬帳號轉帳】,請依訂單顯示之『轉帳金額』&『繳費截止期限』內完成付款,逾期繳費者此訂單取消,不予保留。
3.帳號中若有未完成付款的訂單,該帳號之購票額度需等待系統自動清除訂單後才會釋出,並請重新訂購。
4.ATM虛擬帳號轉帳僅限於台灣金融機構開戶所核發之提款卡,包括郵局、農漁會信用合作社),並且已開通「非約定帳戶轉帳」功能皆可使用。請注意所使用之金融提款卡,轉帳交易未超過原發卡銀行所提供每日或每月之轉帳、繳費上限。
5.請注意!!銀行會自動扣除跨行轉帳手續費$15元(請勿自行額外加在系統指示之轉帳金額中)。
6.每筆訂單交易收取服務費$80元。
7.禁止攜帶食物(水除外)及攝、錄影音及相機等器材、自拍神器、LED燈牌、板凳類自行加高裝置等影響節目進行及其它觀眾觀賞權益均視為違禁品,若遭沒收將不發還 (應援物尺寸不得超過40x40cm)。
8.入場票卡為無記名有價票券,如發生遺失、燒毀、破損等情形,一概不予重新開票。
9.一人一票,憑票入場,票卡限使用一次,勿隨意購買來路不明的票卡,以免自身權益受損。
10.場內嚴格禁止拍照、攝影,錄音及手機直播,不得攜帶相機、攝影機入場,如經查獲,現場工作人員有權立即刪除拍攝內容,若履勸不聽者,主辦單位有權請您離場,並保留法律追訴權。
11.各表演場館各有其入場規定,請持票觀眾務必遵守主辦單位及場館各項規定,如有干擾演出秩序之行為,主辦單位有權將請其離場。
12.購買各種優惠票劵者,需於購票與使用時依規定出示相關證明文件。
13.為維護表演人相關品牌形象權益,未經演出及主辦單位同意,不得將本門票用於任何商業促銷活動。
14.相關規定以活動官網及現場公告為主,主辦單位保留修改或終止本活動之權力。
【取票提醒】:
1.票卡於購票後採物流配送,物流配送範圍僅限國內(含台.澎.金.馬),恕不提供海外寄送服務。
2.選擇現場取票者可於演唱會當日,憑訂單編號與身分證明文件至現場取票,請於配送方式選擇『現場取票』(若購票時於配送方式勾選現場取票,於演出當日憑"該筆訂單 訂購會員"之含照片且有效證件正本領取,一旦選了現場取票,則系統不提供更改配送到會員地址。)
3.指定姓名僅限「繁體中文」與「英文」,中文請小於7個字,英文小寫請小於25個字母,英文大小寫混合或中英混合系統將自動判定長度,資料經填寫或留白送出後即不可更改。
4.物流配送服務:2017/08/25(含)前訂購之訂單,每筆訂單僅配送一個地址。
5.購票流程中請務必於收件人填寫『完整且正確』之收件人中文姓名與白天有人簽收之地址,若有『地址缺漏』或『收件人中文姓名不全』或『英文或它國語言暱稱』導致物流配送困難退件,該筆訂單經物流退回拓元售票系統後,將自動轉為現場取票。
6.如收件地為公司行號,請務必確認該收發單位能確保將您的信件確實轉達給您本人(例如:註明公司及部門名稱與分機號碼),若因該收發處人為疏失導致門票遺失或如因個人疏失資料填寫錯誤,恕無法提任何補救措施。
7.為了讓消費者能盡快收到配送之訂單及避免盜用帳號詐騙行為,系統不提供事後申請地址更換!物流配送地址是依消費者『訂單送出時』當下自行輸入之內容進行配送。(請務必提早且於購票前至會員資料內確認會員地址)
8.預計配送時間:待票卡經製作完成後預計於8月下旬之後配送。
9.訂單配送會以E-mail通知,屆時請留意信件。收到E-mail通知後5個工作天內未收到票券,請務必於上班時間來電02-8772-9815查詢(週一~週五 10:00-12:30 13:30-18:00)。
10. 2017/08/26(含)後的訂單皆為現場取票。
★現場取票地點:新莊體育館售票服務台取票。
★現場取票時間:2017/09/16當日請於14:00~19:00之間取票。
現場取票提醒:
當天現場「該筆訂單購票會員本人」現場取票時,請務必一併出示以下資料:
A.訂單編號。
B.該筆訂單之購票會員有照片的有效身份證件正本。
(僅限正本:身份證、健保卡、駕照或護照擇一)
(證件影本、證件截圖、證件掃描檔,對話視窗截圖...等,恕不受理。)
當天現場該筆訂單「非購票會員本人」領取票時,請務必一併出示以下資料:
A.訂單編號。
B.該筆訂單之「購票會員本人」及「受託代領人」有照片的有效身份證件正本及影本 (驗正本收影本,證件為身份證、健保卡、駕照或護照擇一,上開證件影本僅供核對購票資訊使用,不做其他商業用途)。
C.委託書正本1份 (需有本人及代領人簽名)
D.委託書下載網址: https://goo.gl/7X18LG
請注意!該筆訂單之購票會員有照片的有效身份證件正本「姓名與證件號碼」須與該筆訂單成立當下之訂購會員資料完全相符。
《資料不齊全者、無法核對購票會員身份者,將無法領取!》
【退票手續費及期限說明】:
1. 退票需酌收10% 手續費。
2. 每場演出(不含演出日)前十日起即不受理退票。
◆ 09月16日之票券:9月06日(三) 截止收件;9月07日(四)起,即不再收件。
3. 退票截止收件日以郵件送達本公司日期為準。
(非以郵戳或寄件日期為準,請自行計算寄達時間,逾期送達恕不受理,請勿親送,收件地址現場無法受理(為避免爭議,必須透過掛號或快遞等第三方郵寄系統)。
4. 每人每場退票總張數,不得超出該次演唱會公告之限購張數,分次寄送者亦同。
5. 退款流程需約10~14 個工作天(以收到退票申請日起算),銀行收取的電匯費用30元,由退票方負擔,直接由退款中扣除。
6. 若有任何形式非供自用而加價轉售(無論加價名目為代購費、交通費、補貼等均包含在內)之情事經查屬實者,本公司得不予退票,並得依社會秩序維護法第64條第2款逕向警方檢舉。
7. 詐騙猖獗,請勿購買任何非本公司公告通路所販售之票劵,以免權益受損。
【退票郵寄方式說明】:
(1)票券正本
(2)可供匯款之存摺影本 (需有清楚的銀行名、分行名、戶名及帳號,以台灣本地開戶的銀行或郵局為限)並於空白處寫上
(3)退票人姓名
(4)連絡電話,以掛號或快遞依下列規定寄回:
◆ 收件地址:10058台北市八德路一段 23 號 3 樓;
◆ 收 件 者:「超級圓頂娛樂製作有限公司票務組收」;
寄件人地址:請務必載明寄件人地址,郵件或快遞未載明寄件人地址,本公司得不予收件,以避免爭議;
信封正面請註明演唱會名稱及場次(範例:「xx演唱會xx年x月x日場」)。
請勿親送,收件地址現場無法受理(為避免爭議,必須透過掛號或快遞等第三方郵寄系統)。
如有違反本退票規則經查屬實,本公司得不予退票,並直接退件或以掛號郵件將票券寄回原址。
購買票券前,請先了解並同意以上規範,如不同意請勿購買,以免產生不必要之糾紛及損害;當進行購票及退票作業時,將視同您已瞭解並同意遵守以上全部事項。
註:在有退票釋出座位之前提下,本公司得於退票截止日後陸續將該座位釋出並重新上架販售。
超級圓頂工作人員 2017.06.21
查詢不到此內容請重新輸入translate 在 我接受不到咯- 请去www.translate.google.com ,输入agar 看它 ... 的推薦與評價
Google Translate. Google's free online language translation service instantly translates text and web pages. This translator supports: English, Afrikaans, ... ... <看更多>
查詢不到此內容請重新輸入translate 在 virtaal/zh_TW.po at master · translate/virtaal - GitHub 的推薦與評價
Contribute to translate/virtaal development by creating an account on GitHub. ... msgstr "請輸入您的電子郵件地址" ... msgstr "文件沒有可供翻譯的內容". ... <看更多>