MetaMask Snaps, MetaMask'ı dünyanın en genişletilebilir cüzdanı haline getirme yol haritasıdır. Geliştirici olarak, özelliklerinizi ve API'lerinizi tamamen yeni yollarla MetaMask'a entegre edebilirsiniz. Web3 geliştiricileri bu büyümenin temel taşlarıdır ve bu seri, bugün inşa edilen yenilikçi MetaMask Snaps'leri tanıtmayı amaçlamaktadır.
Ethereum blok zincirindeki gas fiyatlarını tahmin etmek gerçekten çok zor olabilir ve bu durum ödeme yaparken ciddi bir engel oluşturur. Kullanıcılar ödeme yapmaya çalışırken gereğinden çok daha fazla ödeme yapabilir. Blok zincirindeki kısa süreli yoğun trafik, gas fiyatlarını büyük ölçüde etkileyebilir. L2'ler gas fiyatlarını düşürmek amacıyla geliştirilmiş olsa da, işlem amaçlı L2 kullanmaktan daha genel ve kolay bir çözüme zaman zaman ihtiyaç duyulmaktadır. Kullanıcıların geçmiş verilere ve mevcut trendlere dayanarak gelecekteki gas fiyatlarını tahmin edebilen bir uygulamaya sahip olmasının faydalı olacağını düşündük.
Teknik uygulamayı bize anlatabilir misiniz?
EtherEyes dört bölümden oluşmaktadır: Gas fiyatı sunucusu, snap, SARIMA Modeli ve web ön yüzü. Gas fiyatı sunucusu, geçmiş ve güncel gas fiyatlarına ilişkin veriler sağlar. Web sitesi, snap'i barındırır ve snap API yöntemlerini çağırarak snap'i yüklemek ve etkileşime geçmek için bir arayüz sunar. Gas fiyatlarını tahmin etmek amacıyla Mevsimsel Otoregresif Entegre Hareketli Ortalama (SARIMA) modelini kullandık.
Gas Fiyatı Sunucusu
Owlracle API aracılığıyla yaklaşık 200 mum grafiği (her mum grafiği, son 30 dakikalık verinin bir özetidir) listesi şeklinde canlı gas fiyatı verilerini topluyoruz. Bu sayede son 100 saatlik gas fiyatlarının zaman serisi verilerine ulaşıyoruz.
Snap
Snap için, gerçek zamanlı gas fiyatı tahminleri sunmak amacıyla işlem içgörüleri API'sini kullandık. Snap'in akışı şu şekildedir:
İlk olarak, kullanıcı bir işlem başlattığında, onTransactionHandler kullanılarak uygulanan işlem içgörüleri onay sayfasında görünür. Burada kullanıcıya önümüzdeki 30 ve 60 dakika için tahminleri gösteriyoruz. Uyguladığımızın basitleştirilmiş bir versiyonu aşağıda verilmiştir:
exportconstonTransaction:OnTransactionHandler=async({ transaction })=>{letstate:{notifToggle: boolean; urgency: number; lowEth: number };
state =(await wallet.request({method:'snap_manageState',params:['get'],}))as{notifToggle: boolean; urgency: number; lowEth: number };if(!state){
state ={
notifToggle,
urgency,
lowEth,};}letinsights: any ={type:'Gas Fee estimation',};if(!isObject(transaction)||!hasProperty(transaction,'data')||typeof transaction.data !=='string'){
console.warn('unknown transaction type');return{ insights };}const response =awaitfetch(`${MODEL_API_ENDPOINT}`,{method:'get',headers:{'Content-Type':'application/json',},});const currentData =awaitfetch(CURRENT_DATA_ENDPOINT,{method:'get',headers:{'Content-Type':'application/json',},});if(!response.ok){thrownewError('API request failed');}const data =await response.json();const current =await currentData.json();
state.lowEth = Math.min(data.low_30_minutes, data.low_60_minutes);await wallet.request({method:'snap_manageState',params:['update', state],});
insights ={'Average Gas Limit':`Current value: ${current.avgGas}`,'Estimated current gas price':`Current value (Base + Priority): ${
current.speeds[0].baseFee + current.speeds[0].maxPriorityFeePerGas
} GWei; Base Fee: ${current.speeds[0].baseFee} GWei`,'Forecasted Avg Gas price (for the next 30 mins)':`
Gas price within 30 minutes is expected to get as low as: ${data.low_30_minutes} GWei`,'Forecasted Avg Gas price (for the next 60 mins)':`Gas price within 60 minutes is expected to get as low as: ${Math.min(
data.low_30_minutes,
data.low_60_minutes,)} GWei`,'Expected savings in 30 mins (For average gas limit)':`${
current.avgGas *(current.speeds[0].baseFee +
current.speeds[0].maxPriorityFeePerGas -
data.low_30_minutes)} GWei`,'Expected savings in 60 mins (For average gas limit)':`${
current.avgGas *(current.speeds[0].baseFee +
current.speeds[0].maxPriorityFeePerGas -
Math.min(data.low_30_minutes, data.low_60_minutes))} GWei
`,};return{ insights };};
Kopyala
Kullanıcı beklemeye karar verirse, bekleyebilir ve web sitesinden onCronjob işleyicisi aracılığıyla snap ile etkileşime giren ve her üç dakikada bir gas fiyatlarını yerel tarayıcı bildirimleri olarak gönderen bir bildirim sistemi başlatabilir. Fiyatlar tahmine çok yaklaştığında, kullanıcıdan işlemi tamamlaması istenir.
exportconstonCronjob:OnCronjobHandler=async({ request })=>{switch(request.method){case'exampleMethodOne':{// get data from state whenever snap is invoked as snaps executions are ephemeralletstate:{notifToggle: boolean; urgency: number; lowEth: number };
state =(await wallet.request({method:'snap_manageState',params:['get'],}))as{notifToggle: boolean; urgency: number; lowEth: number };if(!state){
state ={
notifToggle,
urgency,
lowEth,};}
notifToggle = state.notifToggle;
urgency = state.urgency;
lowEth = state.lowEth;await wallet.request({method:'snap_manageState',params:['update', state],});
console.log({ notifToggle });if(notifToggle){const currentData =awaitfetch(CURRENT_DATA_ENDPOINT,{method:'get',headers:{'Content-Type':'application/json',},});const current =await currentData.json();if(Math.abs(current.speeds[0].baseFee - lowEth)< urgency /38){return wallet.request({method:'snap_notify',params:[{type:'native',message:`Gasfee is low! Pay now at ${current.speeds[0].baseFee} Gwei`,},],});}return wallet.request({method:'snap_notify',params:[{type:'native',message:`Current gasfee is ${current.speeds[0].baseFee} Gwei`,},],});}return0;// basically do nothing}default:thrownewError('Method not found.');}};
Kopyala
İlgili cronjob ayarları (snap.manifest.json dosyasında) şu şekildedir:
Ayrıca işlemin aciliyetini belirleyen bir aciliyet özelliği de bulunmaktadır (teknik olarak, tahmin ile mevcut gas fiyatları arasındaki maksimum farkın ne olması gerektiğini belirleyen parametre; bu farka göre kullanıcının işleme devam etmesi gerekir). Aciliyetin değiştirilmesi bu eşiği etkiler. Aciliyet ayarını snap'in onRpcRequest yöntemi kullanılarak uyguladık.
exportconstonRpcRequest: OnRpcRequestHandler =async({// eslint-disable-next-line @typescript-eslint/no-unused-vars
origin,
request,})=>{switch(request.method){// Other RPC methods herecase'set_urgency_35':{
urgency =35;letstate:{notifToggle: boolean; urgency: number; lowEth: number };
state =(await wallet.request({method:'snap_manageState',params:['get'],}))as{notifToggle: boolean; urgency: number; lowEth: number };if(!state){
state ={
notifToggle,urgency:35,
lowEth,};}
state.urgency =35;await wallet.request({method:'snap_manageState',params:['update', state],});return urgency;}case'set_urgency_60':{
urgency =60;letstate:{notifToggle: boolean; urgency: number; lowEth: number };
state =(await wallet.request({method:'snap_manageState',params:['get'],}))as{notifToggle: boolean; urgency: number; lowEth: number };if(!state){
state ={
notifToggle,urgency:60,
lowEth,};}
state.urgency =60;await wallet.request({method:'snap_manageState',params:['update', state],});return urgency;}case'set_urgency_90':{
urgency =90;letstate:{notifToggle: boolean; urgency: number; lowEth: number };
state =(await wallet.request({method:'snap_manageState',params:['get'],}))as{notifToggle: boolean; urgency: number; lowEth: number };if(!state){
state ={
notifToggle,urgency:90,
lowEth,};}
state.urgency =90;await wallet.request({method:'snap_manageState',params:['update', state],});return urgency;}case'set_urgency_100':{
urgency =100;letstate:{notifToggle: boolean; urgency: number; lowEth: number };
state =(await wallet.request({method:'snap_manageState',params:['get'],}))as{notifToggle: boolean; urgency: number; lowEth: number };if(!state){
state ={
notifToggle,urgency:100,
lowEth,};}
state.urgency =100;await wallet.request({method:'snap_manageState',params:['update', state],});return urgency;}case'call_api':{// get data from state whenever snap is invoked as snaps executions are ephemeralletstate:{notifToggle: boolean; urgency: number; lowEth: number };
state =(await wallet.request({method:'snap_manageState',params:['get'],}))as{notifToggle: boolean; urgency: number; lowEth: number };if(!state){
state ={
notifToggle,
urgency,
lowEth,};}
notifToggle = state.notifToggle;
urgency = state.urgency;
lowEth = state.lowEth;await wallet.request({method:'snap_manageState',params:['update', state],});
console.log(`Called inside custom api call: notifToggle = ${notifToggle} and urgency = ${urgency}`,);const currentData =awaitfetch(CURRENT_DATA_ENDPOINT,{method:'get',headers:{'Content-Type':'application/json',},});const current =await currentData.json();if(Math.abs(current.speeds[0].baseFee - lowEth)< urgency /38){return wallet.request({method:'snap_notify',params:[{type:'native',message:`Gasfee is low! Pay now at ${current.speeds[0].baseFee} Gwei`,},],});}return wallet.request({method:'snap_notify',params:[{type:'native',message:`Current gasfee is ${current.speeds[0].baseFee} Gwei`,},],});}default:{thrownewError('Method not found.');}}};
Kopyala
Eşiği hesaplamak için aciliyet ayarını 38'e böldük. Farklı değerlerle yapılan ampirik testlerin ardından 38'in çoğu durumda en iyi sonucu verdiği görüldü. Daha dinamik bir performans için yakın gelecekte bu değerin ince ayarının yapılması ve geliştirilmesi planlanmaktadır.
if(Math.abs(current.speeds[0].baseFee - lowEth)< urgency /38){return wallet.request({method:'snap_notify',params:[{type:'native',message:`Gasfee is low! Pay now at ${current.speeds[0].baseFee} Gwei`,},],});}
Kopyala
Snap durumları geçici olduğundan, durum bilgilerini (bildirim açık/kapalı, kullanıcı tarafından belirlenen aciliyet gibi) snap depolama API'sini kullanarak depolamaya kaydetmemiz gerekiyordu.
exportconstonRpcRequest: OnRpcRequestHandler =async({// eslint-disable-next-line @typescript-eslint/no-unused-vars
origin,
request,})=>{switch(request.method){case'notif_toggle_true':{
console.log('Notification toggled to true');
notifToggle =true;// toggle the notification
console.log({ notifToggle });letstate:{notifToggle: boolean; urgency: number; lowEth: number };
state =(await wallet.request({method:'snap_manageState',params:['get'],}))as{notifToggle: boolean; urgency: number; lowEth: number };if(!state){
state ={notifToggle:true,
urgency,
lowEth,};}
state.notifToggle =true;await wallet.request({method:'snap_manageState',params:['update', state],});return notifToggle;}case'notif_toggle_false':{
console.log('Notification toggled to false');
notifToggle =false;// toggle the notification
console.log({ notifToggle });letstate:{notifToggle: boolean; urgency: number; lowEth: number };
state =(await wallet.request({method:'snap_manageState',params:['get'],}))as{notifToggle: boolean; urgency: number; lowEth: number };if(!state){
state ={notifToggle:false,
urgency,
lowEth,};}
state.notifToggle =false;await wallet.request({method:'snap_manageState',params:['update', state],});return notifToggle;}default:{thrownewError('Method not found.');}}};
Kopyala
Model
Ardından, zaman serisi verilerinde önümüzdeki bir saat içinde beklenen en düşük gas fiyatını tahmin etmek için statsforecast paketinden SARIMA veya Mevsimsel ARIMA adlı popüler bir zaman serisi tahmin modeli kullanıyoruz.
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
import requests
import numpy as np
from statsforecast.models import AutoARIMA
import json
def get_timeseries():withopen('key.json')asf:
data = json.load(f)print(data)
key = data['key']
history_data = requests.get('https://api.owlracle.info/v3/eth/history?apikey={}&candles=100&txfee=true'.format(key))
history_data = history_data.json()
low =[]for obj inhistory_data:
low.append(obj['gasPrice']['low'])
low.reverse()return np.array(low)
def get_prediction():
values =get_timeseries()
model =AutoARIMA()
predictions = model.forecast(values,2)print("Pred: ", predictions)
prediction_json ={'low_30_minutes': predictions['mean'][0],'low_60_minutes': predictions['mean'][1]}return prediction_json
app =FastAPI()
origins =["*",]
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],)
@app.get("/")async def root():
pred =get_prediction()return pred
Kopyala
Neden SARIMA?
Farklı alanlarda zaman serisi tahmini için SARIMA üzerine yapılan pek çok çalışma, SARIMA'nın iyi performans sergilediğini ortaya koymuştur. Ayrıca SARIMA kullanan ve umut verici sonuçlar elde eden bir Ethereum gas fiyatı istatistikleri çalışmasına da başvurduk.
Bir alternatif, genellikle daha büyük modeller içeren ve yeniden eğitim için daha fazla zaman gerektiren derin öğrenme teknikleri olabilir; bu durum, akış verileri için daha az ideal hale getirir.
Başvurduğumuz bazı kaynaklar: - Tayvan'daki makine sektörünün üretim değerlerinin tahmininde hibrit SARIMA ve destek vektör makineleri. Expert Systems with Applications, 32(1), 254-264. https://doi.org/10.1016/j.eswa.2005.11.027
Dinamik doğrusal model ve SARIMA: epidemiyolojide tahmin performanslarının karşılaştırılması. https://doi.org/10.1002/sim.963
Amerika Birleşik Devletleri'nde SARIMA ve ARIMA modelleri kullanılarak uzun vadeli akış çalışması. https://doi.org/10.1002/met.1491
Carl, David ve Ewerhart, Christian, Ethereum Gas Fiyatı İstatistikleri (22 Aralık 2020). Zürih Üniversitesi, Ekonomi Bölümü, Çalışma Belgesi No. 373, 2020, Erişim adresi: https://dx.doi.org/10.2139/ssrn.3754217
Web Ön Yüzü
Web ön yüz arayüzü olarak basit bir React uygulaması kullandık. Snap yükleme, sahte işlem gönderme, kullanıcı aciliyeti ayarlama, gas fiyatı bildirimlerini açıp kapatma ve karanlık mod geçişi için düğmeler içermektedir. Her kullanıcı için son derece basit ve kullanımı kolaydır.
Bunu uygulamak istiyorsanız sonraki adımlar nelerdir?
Yapılabilecek çok şey var; öğrenme algoritmasını ince ayarlayarak daha sağlam tahminler üretmek için modeli daha güvenilir hale getirmekle başlayabiliriz. İyileştirilmesi gereken bir diğer alan ise aciliyet eşiğidir; burada piyasa profilinin, kullanıcı aciliyetinin ve işlem gas tasarruflarının geniş varyasyonlarını aynı anda ele alacak ve kullanıcının ödeme yapması gereken neredeyse optimal noktaya hızla ulaşacak daha dinamik bir ifade geliştirmemiz gerekmektedir. Ayrıca web arayüzünü biraz daha kullanıcı dostu hale getirmemiz ve nadiren ortaya çıkabilecek bazı uç durumlarda genel hata yönetimi eklememiz gerekmektedir.
Kendiniz ve ekibiniz hakkında biraz bilgi verebilir misiniz?
IIT Patna'da BTech mühendislik öğrencilerinden oluşan sekiz kişilik bir ekibiz. Ekibi, Consensys'in bir MetaMask Snaps problem bildirimi sunduğu Inter IIT Tech Meet 11'e (2023) katılmak için oluşturduk.
Vaishakh: IIT Patna'da son sınıf Bilgisayar Bilimi öğrencisiyim ve alanımı çok seviyorum. Son zamanlarda hackathon'lara katılıyorum ve bu deneyimin tadını çıkarıyorum. Bilgisayar Bilimi'nin geniş olanaklarını keşfetmeyi ve bunların beni gelecekte nereye götüreceğini görmeyi sabırsızlıkla bekliyorum.
Aritra B.: Aritra, Hindistan Teknoloji Enstitüsü Patna'da Yapay Zeka ve Veri Bilimi alanında BTech ikinci sınıf öğrencisidir; Blockchain ve gerçek dünyada kitlesel uygulamalarına büyük ilgi duymaktadır. Daha önce çeşitli küçük blockchain projelerinde çalışmış olup bu, alanı öğrenmek ve keşfetmek için temel oluşturmuştur. Makine öğrenimi gibi bilgisayar biliminin diğer alanlarını kullanarak yeni yenilikler yaratmak amacıyla akıllı blockchain çözümleri geliştirmeyi hedeflemektedir. 2019 yılında prestijli Hindistan Bilim Enstitüsü (IISC) tarafından KVPY bursiyer olarak seçilmiş olup şu anda ZK EVM'ler ve bu alandaki benzersiz uygulama alanları üzerine çalışmaktadır.
Padmaksh: Hindistan Teknoloji Enstitüsü Patna'da Bilgisayar Bilimi ve Mühendisliği alanında BTech eğitimi almakta olup siber güvenliğe büyük ilgi duymaktadır. Aynı zamanda problem çözme ve algoritmik bulmacalara da çok ilgi duymaktadır. Blockchain mimarisini incelemeye ve diğer alanları keşfetmeye devam etmektedir.
Kartikay: IIT Patna'da Makine Mühendisliği alanında B.Tech yapan ve müfredatının 3. yılında olan bir lisans öğrencisidir. Web geliştirme ve rekabetçi programlamaya büyük ilgi duymaktadır. Birçok üniversite kulübü ve festivali için çeşitli web siteleri tasarlayıp geliştirmiştir. Veri Bilimi ve Web3 konularında temel bilgiye sahiptir.
Harsh: IIT Patna'da Kimya Mühendisliği okuyan ikinci sınıf bir lisans öğrencisiyim. Ağırlıklı olarak vaka çalışmaları ve problem çözmeyle ilgileniyorum.
Dhushyanth: IIT Patna'da son sınıf Elektrik Mühendisliği öğrencisiyim; teknoloji ve geliştirmeye büyük ilgi duyuyorum. Rust'ta CRDT sunucu uygulamasından Silikon Fotonik'te Perceptron tasarımına kadar çeşitli alanlarda çalıştım. Hakkında fikir beyan edebildiğim her konuda hararetli tartışmalar yapmayı seviyorum ve bundan büyük keyif alıyorum!
Vishwas S: Vishwas, IIT Patna'da birinci sınıf Bilgisayar Bilimi öğrencisidir; alanına tutkuyla bağlı olup keşfetmek için fırsatlar aramaktadır. Son zamanlarda blockchain teknolojisine büyük ilgi geliştirmiş ve bu alanda çalışmaktadır.
Ankur: IIT Patna'da Elektrik ve Elektronik Mühendisliği okuyan ikinci sınıf bir lisans öğrencisiyim. Yakın zamanda IIT Patna için birkaç web sitesi geliştirdim ve problem çözmekten keyif alıyorum. Son zamanlarda ön yüze yatkınlığımla birlikte UI ve UX'e ilgi duymaya başladım. İnsan psikolojisini incelemeyi ve çeşitli sorunlara çözümler üretmeye çalışmayı seviyorum.
MetaMask Snaps ile ilk ne zaman tanıştınız ve deneyiminiz nasıldı?
MetaMask Snaps ile ilk kez Inter IIT Tech Meet 2023'te tanıştık. MetaMask'a gerçekten özgün ve ilgi çekici bir eklenti olan Snaps, cüzdanda sonsuz özelleştirme imkânı sunmak için kullanılabilir. Geliştirme süreci de oldukça anlaşılır; daha az belge ve tartışma forumu içeriği mevcut olmasına rağmen geliştirme aşamasında büyük engellerle karşılaşmadık. Her ne kadar hâlâ geliştirme aşamasında olup şu an için bazı önemli özelliklerden yoksun olsa da, önümüzdeki yıllarda taşıyabileceği büyük potansiyeli şimdiden görebiliyoruz.
MetaMask Snaps'i diğer cüzdanlardan farklı kılan nedir?
MetaMask Snaps, bir web tarayıcısındaki uzantıya benzer. MetaMask'ın işlevselliğini genişletmek için kullanılır. Snap'ler, yükleme sırasında kullanıcı tarafından verilen izinlerle belirlenen sınırlı bir yetenek kümesine erişimin bulunduğu izole bir ortamda çalıştırıldığından güvenlidir. Cüzdan deneyiminizi özelleştirmenin harika ve güvenli bir yoludur.
MetaMask Snaps geliştirme deneyimi sizin ve ekibiniz için nasıl?
Bu, farklı bilgisayar bilimi alanlarının bir araya gelerek bir zorluğu nasıl çözebileceğine tanıklık etmemizi sağlayan projelerden biriydi. Ekibim ve ben için bu snap'i geliştirmek, harika bir öğrenme fırsatı oldu. Fikrimizi etkili biçimde hayata geçirmeyi ve blockchain üzerindeki bir sorunu çözmek için makine öğrenimini nasıl kullanacağımızı öğrendik. Bu süreçte birkaç yeni bağlantı da kurduk. Öte yandan, diğer cüzdanlar geliştiriciler için oldukça kısıtlayıcı hissettiriyor.
MetaMask Snaps sizin için ne ifade ediyor?
MetaMask Snaps, bir kripto cüzdanına uzantı özelliklerini ekler. Gerçekten yenilikçi bir yapıya sahip olup kripto paranın kitlesel benimsenmesini artırmak için pek çok kritik kullanım senaryosunda kullanılabilir.
MetaMask Snaps ile Web3 alanında ne gibi fırsatlar ve olanaklar görüyorsunuz?
MetaMask Snaps, basit bir Ethereum cüzdanını web3 deneyimimizi özelleştirebileceğimiz ve geliştirebileceğimiz eksiksiz bir web3 yönetim aracına dönüştürdüğü için web3 ekosisteminde gerçek bir atılım olabilir.
MetaMask Snaps'i denemek isteyen geliştiricilere vermek istediğiniz tavsiyeler nelerdir?Belgeleri okumaya başlayın. Son derece açıklayıcı olup sahip olunabilecek kullanım senaryolarının büyük bölümünü ele almaktadır. Çözümü açık olmayan herhangi bir sorun için, bu amaç doğrultusunda özel bir forum bulunan Consensys Discord kanalında soru sormanızı öneririz.
Size yakın bir yerdeki bir sonraki hackathon'da ekibimizi takip edin! Mutlu BUIDLing ⚒️
Sorumluluk Reddi: MetaMask Snaps, genel olarak Consensys Software dışındaki üçüncü taraflarca geliştirilmektedir. Üçüncü taraflarca geliştirilen MetaMask Snaps'lerin kullanımı tamamen sizin takdirinize ve riskinize bağlıdır; bu tür faaliyetlerden kaynaklanabilecek herhangi bir kayıp veya zarardan yalnızca sizin sorumlu olacağınızı kabul etmiş sayılırsınız. Consensys, üçüncü taraflarca geliştirilen MetaMask Snaps için sözlü veya yazılı hiçbir açık ya da zımni garanti vermez ve üçüncü taraflarca geliştirilen Snaps'ler için tüm sorumluluğu reddeder. Blockchain tabanlı yazılımların kullanımı riskler barındırır ve MetaMask Snaps'i kullanarak bu riskleri tamamen üstlenmiş olursunuz.
Alpha’ya abone olun, piyasa alfası doğrudan e-posta kutunuza gelsin
Yapay zeka tarafından çevrildi. Hatalar içerebilir. Lütfen her zaman bilgileri doğrulayın.
Çeviriyi değerlendir
Bu makalenin yazarı:
MetaMask
MetaMask, eski adıyla Consensys Software Inc, dünyada yaklaşık 190 ülkede kullanıcılara ulaşarak insanlara hem kripto hem de geleneksel varlıklar genelinde paralarını tutma, harcama, biriktirme ve büyütme imkânı sunan, dünyanın en büyük self-custodial finansal platformudur. Şirket, ödemeleri, tasarrufları, yatırımları ve dijital varlıkları tek ve kesintisiz bir deneyimde bir araya getiren tüketici platformunu inşa etmektedir. Dünyanın en yaygın kullanılan self-custodial cüzdanından büyüyen MetaMask, kullanıcılara para ve varlıkları üzerinde doğrudan kontrol imkânı tanımaktadır. MetaMask, 2016'dan bu yana Ethereum'un büyümesinde temel bir rol üstlenmiştir. Bugün MetaMask, blokzincir ekonomisinin merkezinde yer alarak Açık Para için işletim sistemini inşa etmekte ve insanları finansal yaşamları üzerinde tam anlamıyla söz sahibi kılmaktadır.