📜 [專欄新文章] Optimistic Rollup 就這樣用(2)
✍️ Juin Chiu
📥 歡迎投稿: https://medium.com/taipei-ethereum-meetup #徵技術分享文 #使用心得 #教學文 #medium
ERC721 的儲值、轉移與提領
TL;DR
本文會跳過 Optimistic Rollup 的介紹而直接實際演示,關於 Optimistic Rollup 的概念與設計原理筆者將在日後另撰文說明,有興趣的讀者可以先參考下列三篇文章(由淺入深):1. OVM Deep Dive 2. (Almost) Everything you need to know about Optimistic Rollup 3. How does Optimism’s Rollup really work?
本文將演示一個 Optimism Rollup 的 ERC721 範例,程式碼在這裡。
本演示大量參考了以下範例:Optimistic Rollup Example: ERC20。
本演示所使用的 ERC721 Gateway 合約來自這個提案,目前尚未成為官方標準。
環境設置
Git
Node.js
Yarn
Docker
Docker-compose
筆者沒有碰到環境相容問題,但是建議都升到最新版本, Node.js 使用 v16.1.0 或以上版本
Optimism 服務啟動
有關 Optimisim 的所有服務,都包裝在 Optimism 這個超大專案當中了,直接使用原始碼進行組建:
$ git clone git@github.com:ethereum-optimism/optimism.git$ cd optimism$ yarn$ yarn build
組建完成後,就可以在本機啟動服務了:
$ cd ops$ docker-compose build$ docker-compose up
這個指令會啟動數個服務,包括:
L1 Ethereum Node (EVM)
L2 Ethereum Node (OVM)
Batch Submitter
Data Transport Layer
Deployer
Relayer
Verifier
Deployer 服務中的一個參數要特別注意: FRAUD_PROOF_WINDOW_SECONDS,這個就是 OPtimistic Rollup 的挑戰期,代表使用者出金(Withdraw)需等候的時長。在本篇演示中預設為 0 秒。
如果有需要重啟,記得把整個 Docker Volume 也清乾淨,例如: docker-compose down -v
Optimism 整合測試
在繼續接下來的演示之前,我們需要先確認 Optimism 是否有順利啟動,特別是 Relayer 是否運作正常,因此我們需要先進行整合測試:
$ cd optimism/integration-tests$ yarn build:integration$ yarn test:integration
確保 L1 <--> L2 Communication 相關測試通過後再繼續執行接下來的演示內容。
啟動服務及部署合約需要花費一些時間,運行一段時間(約 120 秒)之後再執行測試,如果測試結果全部皆為 Fail,可能是 Optimism 尚未啟動完成,再等待一段時間即可。
ERC721 合約部署
Optimism 啟動成功並且完成整合測試後,接下來進行 ERC721 合約的部署。筆者已將合約及部署腳本放在 optimistic-rollup-example-erc721 這個專案中:
$ git clone git@github.com:ethereum-optimism/optimistic-rollup-example-erc721.git$ cd optimistic-rollup-example-erc721$ yarn install$ yarn compile
接下來我們需要部署以下合約:
ERC721,部署於 L1
L2DepositedEERC721,部署於 L2
OVM_L1ERC721Gateway,部署於 L1
OVM_L1ERC721Gateway 只部署在 L1 上,顧名思義它就是 L1 <=> L2 的「門戶」,提供 Deposit / Withdraw 兩個基本功能,使用者必須透過這個合約來進出 L2。
雖然 OVM_L1ERC20Gateway 是 Optimistic Rollup 官方提供的合約。但是開發者也可以依需求自行設計自己的「門戶」。
OVM_L1ERC20Gateway 目前沒有 Optimism 的官方實作,本演示所使用的 ERC721 Gateway 合約來自這個提案,目前尚未成為官方標準。
接下來,我們直接用腳本進行部署:
$ node ./deploy.jsDeploying L1 ERC721...L1 ERC2721 Contract Address: 0xFD471836031dc5108809D173A067e8486B9047A3Deploying L2 ERC721...L2 ERC721 Contract Address: 0x09635F643e140090A9A8Dcd712eD6285858ceBefDeploying L1 ERC721 Gateway...L1 ERC721 Gateway Contract Address: 0xcbEAF3BDe82155F56486Fb5a1072cb8baAf547ccInitializing L2 ERC721...
ERC721 鑄造、儲值、轉移與提領
鑄造(L1)
初始狀態如下,所有帳戶皆尚未持有任何代幣:
接下來,我們將鑄造 2 個代幣以進行接下來的演示。首先,進入 ETH(L1) 的 Console:
$ npx hardhat console --network ethWelcome to Node.js v16.1.0.Type ".help" for more information.>
取得 Deployer / User 帳戶:
// In Hardhat ETH Console
> let accounts = await ethers.getSigners()
> let deployer = accounts[0]
> let user = accounts[1]
取得 ERC721 及 OVM_L1ERC721Gateway 合約物件,合約地址可以從部署訊息中取得:
// In Hardhat ETH Console
> let ERC721_abi = await artifacts.readArtifact("ExampleToken").then(c => c.abi)
> let ERC721 = new ethers.Contract("0xFD471836031dc5108809D173A067e8486B9047A3", ERC721_abi)
> let Gateway_abi = await artifacts.readArtifact("OVM_L1ERC721Gateway").then(c => c.abi)
> let Gateway = new ethers.Contract("0xcbEAF3BDe82155F56486Fb5a1072cb8baAf547cc", Gateway_abi)
鑄造兩個 ERC721 代幣:
// In Hardhat ETH Console
> await ERC721.connect(deployer).mintToken(deployer.address, "foo")
{ hash: "...", ...}
> await ERC721.connect(deployer).mintToken(deployer.address, "bar")
{ hash: "...", ...}
只有合約的 Owner(deployer) 可以進行鑄造的操作。
確認 Deployer 餘額:
> await ERC721.connect(deployer).balanceOf(deployer.address)
BigNumber { _hex: '0x02', _isBigNumber: true } // 2
確認代幣的 TokenID 與 Owner:
> await ERC721.connect(deployer).ownerOf(1)
'0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266' // deployer
> await ERC721.connect(deployer).ownerOf(2)
'0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266' // deployer
儲值(L1 => L2)
完成以上步驟後,目前的狀態如下:
接下來,授權 OVM_L1ERC721Gateway使用 TokenID 為 2 的代幣:
// In Hardhat ETH Console
> await ERC721.connect(deployer).approve("0xcbEAF3BDe82155F56486Fb5a1072cb8baAf547cc", 2)
{ hash: "...", ...}
在 OVM_L1ERC721Gateway 合約呼叫 Deposit,儲值 TokenID 為 2 的代幣:
// In Hardhat ETH Console
> await Gateway.connect(deployer).deposit(2)
{ hash: "...", ...}
我們可以到 Optimism (L2) 的 Console 確認入金是否成功:
$ npx hardhat console --network optimismWelcome to Node.js v16.1.0.Type ".help" for more information.>
取得 Deployer / User 帳戶:
// In Hardhat Optimism Console
> let accounts = await ethers.getSigners()
> let deployer = accounts[0]
> let user = accounts[1]
取得 L2DepositedERC721 合約物件,合約地址可以從部署訊息中取得:
// In Hardhat Optimism Console
> let L2ERC721_abi = await artifacts.readArtifact("OVM_L2DepositedERC721").then(c => c.abi)
> let L2DepositedERC721 = new ethers.Contract("0x09635F643e140090A9A8Dcd712eD6285858ceBef", L2ERC721_abi)
確認入金是否成功:
// In Hardhat Optimism Console
> await L2DepositedERC721.connect(deployer).balanceOf(deployer.address)
BigNumber { _hex: '0x01', _isBigNumber: true } // 1
> await L2DepositedERC721.connect(deployer).ownerOf(2)
'0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266' // deployer
ERC721 轉移(L2 <=> L2)
完成以上步驟後,目前的狀態如下:
接下來,我們在 L2 從 Deployer 轉移代幣給 User:
// In Hardhat Optimism Console
> await L2DepositedERC721.connect(user).balanceOf(user.address)
BigNumber { _hex: '0x00', _isBigNumber: true } // 0
> await L2DepositedERC721.connect(deployer).transferFrom(depoyer.address, user.address, 2)
{ hash: "..." ...}
> await L2DepositedERC721.connect(user).balanceOf(user.address)
BigNumber { _hex: '0x01', _isBigNumber: true } // 1
> await L2DepositedERC721.connect(user).ownerOf(2)
'0x70997970C51812dc3A010C7d01b50e0d17dc79C8' // user
ERC721 提領(L2 => L1)
完成以上步驟後,目前的狀態如下:
接下來,我們用 User 帳戶提領資金,在 L2DepositedERC721 合約呼叫 Withdraw:
// In Hardhat Optimism Console
> await L2DepositedERC721.connect(user).withdraw(2)
{ hash: "..." ...}
> await L2DepositedERC721.connect(user).balanceOf(user.address)
BigNumber { _hex: '0x00', _isBigNumber: true }
最後,檢查在 L1 是否提領成功:
// In Hardhat ETH Console
> await ERC721.connect(user).balanceOf(user.address)
BigNumber { _hex: '0x01', _isBigNumber: true } // 1
> await ERC721.connect(deployer).balanceOf(deployer.address)
BigNumber { _hex: '0x01', _isBigNumber: true } // 1
> await ERC721.connect(user).ownerOf(2)
'0x70997970C51812dc3A010C7d01b50e0d17dc79C8' // user
由於挑戰期為 0 秒,因此提領幾乎無需等待時間,頂多只需數秒鐘
做完上述所有操作,最終狀態應該如下:
總結
本文演示了:
Optimistic Rollup 相關服務的本機部署
ERC721 L1 => L2 的儲值(Deposit)
ERC721 L2 帳戶之間轉移(Transfer)
ERC721 L2 => L1 的提領(Withdraw)
筆者未來將繼續擴充此系列的教學內容,例如支援其他標準的合約如 ERC1155,以及如何運行 Optimistic Rollup 生態系中最重要的驗證者(Verifier),敬請期待。
參考資料
OVM Deep Dive
(Almost) Everything you need to know about Optimistic Rollup
How does Optimism’s Rollup really work?
Optimistic Rollup Official Documentation
Ethers Documentation (v5)
Optimistic Rollup Example: ERC20(Github)
Optimism (Github)
optimism-tutorial (Github)
l1-l2-deposit-withdrawal (Github)
Proof-of-concept ERC721 Bridge Implementation (Github)
Optimistic Rollup 就這樣用(2) was originally published in Taipei Ethereum Meetup on Medium, where people are continuing the conversation by highlighting and responding to this story.
👏 歡迎轉載分享鼓掌
同時也有19部Youtube影片,追蹤數超過47萬的網紅Hapa 英会話,也在其Youtube影片中提到,今回は日常会話で使われる、Neatの意味と使い方について説明します。 📝今日のレッスンのまとめ📝 =================================== 1. Neat「きちんとした / 整った」 0:39 ・Wow! Your house is beautiful. Everyt...
「bar conversation」的推薦目錄:
bar conversation 在 Hapa Eikaiwa Facebook 的最佳貼文
☆ネイティブの生の会話からリアルな英語を学ぶ☆
=================================
1) On the same wavelength(波長が合う)
=================================
wavelengthは「波長」を意味することから、on the same wavelengthは互いの考え方や感性がよく通じていることを表し、日本語の「波長が合う」に相当します。相手と波長が合う場合は「We’re on the same wavelength.」、波長が合わない場合は「We’re not on the same wavelength.」または「We’re on different wavelengths.」と表します。
<例文>
We all get along with each other. We’re all on the same wavelength.
(私たちはみんな波長が合うので仲がいいです。)
Lisa and I hit it off right away. It felt like we were both on the same wavelength.
(リサと私はすぐに意気投合しました。私たちは互いに波長が合うと感じました。)
Tim and I are on different wavelengths and I find it hard to keep a conversation going with him.
(私はティムとは波長が合わないので、彼と会話を続けるのは大変です。)
=================================
2) Kickback(少人数のパーティー)
=================================
kick backは本来、「リラックスする」や「くつろぐ」を意味することから、名詞のkickbackは少人数のまったりとした集まりを表します。kickbackはホームパーティーのように一般的に誰かの家で行われますが、基本的に仲の良い友人同士のこじんまりとしたパーティーを指します。パーティーではお酒を飲んだり、映画を見たり、ゲームをしたりしながらリラックスした時間を過ごします。「少人数のパーティー」の意味で使う場合はkickbackのように1語で表し、「リラックスする」の意味で使う場合はkick backのように2語に分けて表現します。
<例文>
Are you free tonight? I’m going to have a kickback at my house.
(今夜って空いてる?うちでこじんまりとしたパーティーをするんだ。)
Tony’s having a kickback tonight. We should swing by later.
(トニーが今夜ちょっとしたパーティーをするよ。あとで立ち寄ろう。)
I have no plans today. I’m just going to kick back and chill at home.
(今日は特に予定はありません。自宅でゆっくりくつろぎます。)
=================================
3) Have someone over(〜を家に呼ぶ)
=================================
have someone overは友達や同僚など、ゲストを「自分の家に招く・呼ぶ」という意味の口語的な言い方です。例えば、「今日は友達をうちに呼んでいます」と言いたい場合は「I’m having friends over today.」と表現します。
<例文>
We’re having a few people over for dinner tonight.
(今夜は何人か家に招いて食事をします。)
My wife is having some of her coworkers over for lunch today.
(今日は、妻が何人かの同僚を自宅に招いてランチをします。)
Is it ok if I have my friends over this weekend?
(今週末、友達を家に呼んでもいい?)
=================================
4) Get caught up in(巻き込まれる)
=================================
get caught up inは何かに巻き込まれたり、夢中になったり、とらわれたりなど、ある出来事に深く関わることを表す日常表現です。例えば、「渋滞に巻き込まれる」はget caught up in traffic、「仕事に夢中になる」はget caught up in one’s workのように表現します。
<例文>
Sorry I’m late. I got caught up in some traffic.
(遅れてごめん。渋滞に巻き込まれちゃって。)
I got caught up in my work and completely lost track of time.
(仕事に夢中になってしまい、時間が経つのをすっかり忘れてしまいました。)
I got caught up in the heat of the moment and said some things I shouldn’t have.
(その場の感情にとらわれて、言ってはいけないことを言ってしまった。)
=================================
5) Dead(人けのない)
=================================
deadは「死ぬ」を意味する単語ですが、お店やレストランなどにほとんど人がいなかったり、街に活気がない様子を表すときの「人けのない」という意味で使うことができる口語表現です。緊急事態宣言が出たため、普段は賑やかな街に人がほとんどいなかったり、レストランやバーにお客さんがほとんどいないような状況でこの単語が使われます。
<例文>
There’s nobody here today. It’s dead. Let’s look for another bar.
(今日は誰もここにいない。活気がないね。他のバーを探そう。)
When California first went on lock down, LA was dead. There was nobody on the streets.
(カリフォルニア州が初めてロックダウンになった時、ロスには人けがありませんでした。街に誰もいませんでした。)
This area is usually dead during the week but it picks up on the weekends.
(この辺は平日は大抵静かですが、週末になると賑やかになります。)
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
本日ご紹介したフレーズは、iTunes Japanの「ベストポッドキャスト」に2017から4年連続選出されたHapa英会話の人気コンテンツPodcast第340回「大学のパーティー文化」の内容の一部です。Podcastの全内容をご覧になりたい方は、Hapa英会話のブログをチェック!会話の全文、会話の要約、ピックアップしたフレーズ、ポッドキャストでは説明できなかった表現や言い回しが掲載されています。
https://hapaeikaiwa.com/podcast340
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
bar conversation 在 Minami Yusui Facebook 的最讚貼文
【Sushi with Cicely Tyson】#repost from my hubby✨🍣👇🏻
On February 29th, 2012, my wife Minami was set to join the second national tour of Mary Poppins. This was her first Equity Production contract which is a big milestone for any actor. We decided to celebrate with a nice sushi dinner on Manhattan's East Side.
Seated at the sushi bar, there was only one other person a few seats away. It became apparent that the woman at the end of sushi bar was a regular of the restaurant and had known the sushi chef for decades, but there was a language barrier. Gradually, Minami started to translate allowing these old friends to communicate more fully.
Soon, we were ordering a la carte and sharing sushi recommendations. Asked if she'd like sushi or sashimi, it was always sashimi. "Rice makes you fat!" She said emphatically.
As we dined, she mentioned coming back from the west coast and how concerned she was about Bobby-Kristina after the death of Whitney Houston among other polite conversation.
As the evening was coming to a natural conclusion, we shared that Minami was heading on the road and I was playing trumpet for the broadway run of Porgy and Bess. She said, "My husband was a trumpet player."
"Oh really?" I replied. Still not realizing to whom I was speaking, I said, "You know, it's a small world. What was his name? Perhaps I have heard of him."
"Miles Davis." She said with a little smile.
My mind started to race through the pages of the Miles Davis autobiography I read in college. This was Cicely Tyson I shockingly realized. Her west coast trip was for the awards season for the movie "The Help." Her concern about Whitney's daughter wasn't because she was a fan, she was family.
I did my best to try to regain my composure even admitting to her "There are a thousand things I'd like to ask you, but I'm trying to be cool."
Minami and I grabbed a cab back to our apartment while I replayed the dinner back in my head to make sure I hadn't said anything completely stupid.This was truly an "only in New York" type of story. I like to think that Ms. Tyson enjoyed having a conversation with us as regular people before revealing that she was royalty.
#rip #cicelytyson
bar conversation 在 Hapa 英会話 Youtube 的精選貼文
今回は日常会話で使われる、Neatの意味と使い方について説明します。
📝今日のレッスンのまとめ📝
===================================
1. Neat「きちんとした / 整った」 0:39
・Wow! Your house is beautiful. Everything is nice and neat!(すごい!素敵な家だね。全てがきっちり整理整頓されていてる)
・Sean's suit is always neat and clean.(ショーンさんはいつもきちんとしたスーツを着てるんだよね)
・That's a neat trick. How did you do that?(巧妙なやり方だね。どうやってやったの?)
2. That's neat 「いいね / 面白いね」 1:53
・That's a neat shirt. Where did you get that?(面白いシャツだね。どこで買ったの?)
・I went to a really neat bar yesterday. It's like a library inside. You should check it out. (昨日、面白いバーに行ったよ。中が図書館みたいなんだ。行ってみるといいよ)
・I went to Asakusa and rode a rickshaw. It was a pretty neat experience.(浅草に行って人力車に乗りました。面白い体験でした)
実はネイティブはあまり口にしない「That’s so nice(すごいね)!」
「凄い」や「素晴らしい」を “That’s so nice!”と言う日本人をよく目にします。決して間違いではないのですが、実はネイティブ同士の会話ではあまり使われない表現なんです。もちろん「すごい」や「素晴らしい」を表すフレーズは沢山ありますが、その中でもネイティブの会話で頻繁に使われている定番の3フレーズをご紹介します。https://youtu.be/ZHZYFctfZzU
===================================
☆【Hapa Buddies】Hapa英会話オンラインコミュニティ
英語が好きな仲間と一緒に楽しく英語を学びませんか?
https://hapaeikaiwa.com/buddies/
☆インスタやツイッターでも日常会話で使える実践的なフレーズを毎日投稿しています!
・インスタ: https://www.instagram.com/hapaeikaiwa
・ツイッター:https://twitter.com/hapaeikaiwa
☆ Spotifyオリジナル番組「English Mindset」
英語力ゼロで海外に飛び出したアスリートやクリエーター、留学経験なしの経営者などをゲストに迎え、インタビューを通して英語習得のカギとなった彼らの思考ロジックに迫る番組。 http://spoti.fi/HapaENGLISHMINDSET
☆【Hapa英会話Podcast】生の英語を楽しく学べる
毎週金曜日、台本を一切使わないアメリカ人のリアルな日常英会話を配信。
http://hapaeikaiwa.com/podcast/
☆【Hapa英会話メルマガ】1日1フレーズ!生英語
通勤中ちょとした合間を利用して無理なく英語が学べるメルマガ『1日1フレーズ!生英語』平日の毎朝6時に配信。http://hapaeikaiwa.com/mailmagazine/
#Hapa英会話
#日常英会話
#ロサンゼルス

bar conversation 在 translation Youtube 的最讚貼文
#シーズウェアが発売した、98用ADV('95年)からのSS移植版。
家庭用機ながらレイティングは18歳以上推奨である。
主な変更点としては、キャラクターに声が追加(小次郎編の小次郎・まりな編のまりなを除く)、サイトチェンジが必要なシーンで効果音とアイコン点滅が通知してくれるガイド機能追加、既読テキストをある程度遡れるデータログ機能の追加、年代表記が「9x」に統一、演出面・テキストでの卑猥な要素が削減、ほぼ全てのCGをアニメ絵風に統一、OP・戦闘シーン等のアニメーションを追加、銃器の使用シーンを新規に作成、ED順の変更などが挙げられる。
出荷本数は約2~30万本で、1作目を題材にしたタイトル中で最大の売り上げを達成した。
お茶の間の一般プレイヤーにEVEシリーズを知らしめた作品であり、今もなお根強い人気に支えられている。
BGMは非公開のスタッフによる編曲で、原曲を元にEVEの世界をCD音源でまとめあげた。
Manufacture: 1997.01.24 C's ware
computer: SEGA SATURN
Sound: CD-DA
-----------------------------------------------------------------------------------------------
00:00 01.Main (Noon) for Woman
04:24 02.Main (Night) for Woman
09:34 03.Amagi Detective Office (あまぎ探偵事務所)
13:29 04.Before Tristan Departure (トリスタン号)
15:18 05.Tranquility 1 (安らぎ I)
18:38 06.Main (Noon) for Man
24:27 07.Yale International School (Noon) (イール外国人学校/Noon)
26:49 08.Main (Night) for Man
30:11 09.Shot Bar
33:03 10.Yale International School (Night) (イール外国人学校/Night)
36:35 11.Middle-aged Dandy (甲野本部長)
39:28 12.Marina's Room (まりな自室)
44:30 13.Reasoning (Theme of Eve I) (推理 Theme I/Common)
46:05 14.Dream (Theme of Eve II) (夢 Theme II)
47:27 15.Escape (Theme of Eve III) (脱走 Theme III)
50:45 16.Rest (憩い)
53:40 17.Tranquility 2 (安らぎ II)
57:11 18.Aboard Tristan (トリスタン号乗船)
59:59 19.Confidence (信頼)
01:03:48 20.Confidence A (信頼 ver.A)
01:06:49 21.Confidence B (信頼 ver.B)
01:09:41 22.Terror (Theme of Eve IV) (恐怖 Theme IV)
01:11:59 23.Conversation (会話)
01:14:46 24.Opening Bridge
01:15:13 25.Prisia (プリシア)
01:18:52 26.Premonition of Death (死臭)
01:20:50 27.Eldia (エルディア)
01:22:56 28.Suspicion (疑惑)
01:25:00 29.Crisis (Theme of Eve V) (ピンチ Theme V)
01:27:47 30.Ruling Family (血族)
01:32:01 31.Daily Opening (日付変更)
01:32:12 32.Determination (決意)
01:37:24 33.Drifting (漂流)
01:41:30 34.Diary 1 (日記 I)
01:46:39 35.Diary 2 (日記 II)
01:51:11 36.mu-101 (μ-1)
01:57:04 37.Ending 1 (エンディング I)
02:02:42 38.Ending 2 ( エンディング II)
02:07:30 39.Expectation
02:08:45 40.Uninvited Guest
02:11:36 41.Jealousy
02:14:28 42.Yayoi
02:17:40 43.Madness
02:20:13 44.Everyday
02:25:05 45.Hacker
02:26:41 46.Confusion
----------------------------------------------------------------------------------------------

bar conversation 在 T H E V Y B E R Youtube 的精選貼文
Day 1- We arrived Melbourne late at night, nothing we could do other than check in to our Airbnb.
Day 2
Breakfast - Shortstop Coffee & Donuts
Luna Park (kinda small, nothing much there)
Grocery shopping
Dinner- Gami Chicken & Beer.
Day 3
Breakfast- Brick Lane Melbourne
Hosier Lane, Flinder Street Station, DFO South Wharf
Dessert- Pidapipo Gelateria CBD
Dinner- Shujinko
Day 4
Breakfast- Home-cook at Airbnb
Brighton Beach Boxes
Lunch- Fish Tank
Moonlit Sanctuary Conservation Park (Koalas and Kangaroos are here)
Penguin Parade
Dinner- Mr Crackles and Joomak
Day 5
Breakfast- Hardware Societe
State Library Victoria
Dessert- Gelateria Primavera and Hopetoun Tea Rooms
Day 6
Great Ocean Road & 12 Apostles 1 day trip from Extragreen Holidays
Dinner- Brunetti
Day 7
Skydiving experience
Lunch- South Melbourne Market
Crown Melbourne
Dinner- Emporio Della Pasta
Day 8
Breakfast- Queen Victoria Market
Rooftop Bar
Lunch- Betty's Burgers & Concrete Co
