SCW takaslarının çözümlenmesi

Akıllı sözleşme cüzdanları (SCW'ler) ile takaslar, geleneksel Ethereum/EVM cüzdanlarından çok farklı bir yol izler. Bir şey ters gittiğinde bu fark kafa karıştırıcı olabilir. Ancak akıştaki kilit oyuncuları — ve uygulamada ve gezginde adım adım neler olduğunu nasıl okuyacağınızı — anladığınızda her şey mantıklı gelmeye başlar.

Bunun üzerinden birlikte geçelim.


Tek bir dokunuştan zincir üzeri yürütmeye: gerçekte neler oluyor

Uygulamada “Swap”a dokunduğunuzda tek bir eylem gibi gelir. Gerçekte, Ethereum'un hesap soyutlaması (ERC-4337) üzerine kurulu çok katmanlı bir süreci başlatıyorsunuz. İşleminiz normal bir cüzdandaki gibi doğrudan blok zincirine gitmez. Bunun yerine bir sapma yapar:

  1. Rotayı biz oluşturuyoruz. Yönlendirme motorundan (ör. 1inch) takasınız için en iyi yolu bulmasını istiyoruz ve bunun çalıştığını doğrulamak için simüle ediyoruz. Gazı tahmin ediyoruz, tokenlara sahip olup olmadığınızı doğruluyoruz ve talimatları özel bir formata paketliyoruz: UserOperation.

  2. Bir bundler devreye girer. Bu, UserOperation'ları blok zincirine göndermekten sorumlu zincir dışı bir aktördür. Operasyonunuzu kontrol eder, geçerli olduğundan emin olur ve sizin için gazı ön öder (daha sonra geri ödenir).

  3. UserOp'unuz EntryPoint akıllı sözleşmesi aracılığıyla blok zincirine girer. EntryPoint'i tüm SCW işlemlerinin geçtiği tek bir kapı olarak düşünün. EntryPoint son kontrolleri yapar ve her şey yolundaysa…

  4. EntryPoint, Smart Contract Wallet'ınızdan (SCW) takası yürütmesini ister. SCW'niz yönlendiriciyi (ör. 1inch) çağırır, yönlendirici havuzları çağırır, tokenlar hareket eder ve çıktı tekrar cüzdanınıza düşer.

Özetle: swap'a dokunursunuz → biz simüle ederiz → bundler gönderir → EntryPoint doğrular → SCW'niz yürütür.


Gerçek bir örneğe bakalım

Yüksek seviyeli akışı anladığımıza göre, bunun gerçek bir takasta nasıl oynandığına bakalım: önce uygulamada, sonra zincir üzerinde:

Gördüklerimiz şunlar:

  • 1 USDC'yi 0.765 KTA ile takas ettik.

  • Takas Base üzerinde gerçekleştirildi (madeni paraların sembollerindeki Base ikonuna bakın).

  • Aşağıdakileri ödedik:

    • 0,03 $ gaz (ETH cinsinden)

    • %0,22 takas ücreti goodcryptoX'e

    • %0,05 yönlendirici ücreti 1inch'e

  • Rota basitti: %100 bir Uniswap v4 havuzu üzerinden.

  • Bundler: Alchemy (özet için yukarıdaki Adım 2'ye bakın)

  • İşlem blok zincirine ulaşmış ve blokta kaydedilmişse gezinici bağlantıları görünür (başarısız olsa bile)

Şimdiye kadar her şey iyi. Sonraki olarak bu işlemin zincir üzerinde nasıl göründüğünü görmek için BaseScan bağlantısına tıklayalım:

Gezgin bağlantıları notu: En son uygulama sürümlerinde gezgin bağlantıları zaten AA İşleminizi (UserOp) açar. Eğer gördüğünüz şey buysa ("From" alanı cüzdan adresinizi gösteriyorsa), doğrudan şu adıma atlayabilirsiniz Adım 5 – AA İşlem ayrıntıları sayfası. Önceki adımlar yalnızca bağlantınız dış bundler işlemine işaret ediyorsa geçerlidir (burada "From" cüzdanınız DEĞİLDİR). Yine de, SCW işlemlerinin nasıl çalıştığını daha iyi anlamak için okunması faydalıdır

Kimden: bu sizin cüzdanınız değil — bu Alchemy'nin bundler'ı. Bundler işlemi gönderdiği için bu beklenen bir durum.

Kime: EntryPoint (v0.6.0). Yine beklenen — tüm SCW işlemleri buradan geçer.

İç İşlemler: işlem içindeki yerel token akışlarını gösterir (Base üzerinde ETH). İşte gördüklerimiz:

  • Cüzdanımız (...0A5) gaz ücreti için EntryPoint'e ETH gönderdi.

  • EntryPoint, bundler'ı gerçek gaz maliyeti ile geri ödedi (bundler sizin adınıza gazı ön ödediği için; yukarıdaki Adım 2'ye bakın). Kalan ETH, gelecekteki işlemleriniz için depozito olarak EntryPoint'te kaldı.

ERC-20 Transferleri: gerçek token hareketlerini gösterir:

Cüzdanımız USDC'yi doğrudan göndermedi. Bunun yerine USDC token sözleşmesi (...2A8) transferleri işledi ve gönderdi. Bu normaldir: EVM zincirlerinde token transferleri, akıllı sözleşme cüzdanınızdan gelen talimatı aldıktan sonra token sözleşmesi tarafından gerçekleştirilir.

  1. USDC sözleşmesi 1 USDC'mizi üç transfere böldü:

    • 0,0022 USDC protokolümüzün ücret cüzdanına (...608A)

    • 0,0005 USDC 1inch'in ücret cüzdanına (...1DE5)

    • Kalan 0,9973 USDC Uniswap v4 yönlendiricisine (...Universal Router)

  2. Uniswap v4 yönlendiricisi bunu Uniswap v4 Havuz Yöneticisine (tüm v4 havuzlarını yöneten tek sözleşme) iletti.

  3. Havuz Yöneticisi takası yürüttü: USDC girdi → KTA çıktı.

  4. KTA, 1inch'in Toplama Yönlendiricisi üzerinden yönlendirildi ve cüzdanımıza (...0A5) iletildi.


🧩 Başarısız bir SCW işlemi nasıl çözülür

Artık akıllı sözleşme cüzdanı (SCW) takaslarının nasıl çalıştığını anladığımıza göre — ve başarılı bir işlemi incelediğimize göre — aynı araçları kullanarak başarısız bir olanı da çözümleyelim.

Başka bir gerçek vakayı kullanacağız: EntryPoint sözleşmesi içinde başarısız olan, takas ve gaz ücretini karşılayacak yeterli ETH olmaması nedeniyle başarısız olmuş bir ETH → token takası (Ethereum üzerinde).

Tamam, uygulamada takas durumunuz olarak "Error" görüyorsunuz veya takasınızın başarısız olduğunu bildiren bir anlık bildirim alıyorsunuz. Ne yaparsınız?


Adım 1 — goodcryptoX'te sipariş detaylarını kontrol edin

Bu durumda gördüğünüz şunlar:

Daha önce geliştirdiğimiz çerçeveyi kullanarak hızla fark ediyorsunuz ki:

  • Takas durumu Error (başarısız?)

  • Hiçbir hata mesajı gösterilmiyor (bu alışılmadık)

  • Gaz ücreti var (blok zincirine ulaştı mı?)

  • Bir rota gösteriliyor (simülasyon düzgün geçti mi?)

  • Blok zinciri gezginlerine bağlantılar var (işlemi blok zincirinde kontrol edebilirim!).

Sezgilerinizi kontrol edelim:

  • Bu Error durum takasın başarısız olduğunu gösterir

  • Hem insan tarafından okunabilir bir hata mesajı (hamdan çevrilmiş) hem de ham hata olmalı. Hata mesajının olmaması kesinlikle alışılmadık bir şeyin olduğunu gösterir

  • Gaz ücreti olması gerçekten işlemin blok zincirine ulaştığını ve bazı zincir içi aktivitelerin (gaz tüketen) gerçekleştiğini gösterir

  • Rota, işlem simülasyonunun geçtiğini ve yürütme için açık bir yol sağladığını doğrular

  • Gezgin bağlantıları işlemin blok zincirine ulaştığını doğrular — başarısız olsa bile. Kesinlikle bunlardan birini açıp daha fazla araştırmalıyız


Adım 2 – İşlemi blok zinciri gezgininde açın

Gezgin bağlantıları notu: En son uygulama sürümlerinde gezgin bağlantıları zaten AA İşleminizi (UserOp) açar. Eğer gördüğünüz şey buysa ("From" alanı cüzdan adresinizi gösteriyorsa), doğrudan şu adıma atlayabilirsiniz Adım 5 – AA İşlem ayrıntıları sayfası. Önceki adımlar yalnızca bağlantınız dış bundler işlemine işaret ediyorsa geçerlidir (burada "From" cüzdanınız DEĞİLDİR). Yine de, SCW işlemlerinin nasıl çalıştığını daha iyi anlamak için okunması faydalıdır

Ne olduğunu görmek için Etherscan bağlantısına dokunuyorsunuz:

İlk bakışta işler daha da kafa karıştırıcı hale geliyor:

  • Durum ✅ Success diyor — bekleyin, ne?!

  • Ama biz zaten takasın gerçekleşmediğini biliyoruz

  • “To” alanının (EntryPoint) altında küçük sarı bir mesaj var:

    Bir veya daha fazla hata oluştu [execution reverted] Contract Execution Completed

Peki gerçekte ne oluyor?

Daha önce ele aldığımız SCW işlem akışını hatırlayın:

  • bundler takasınızı bir UserOperation (takas mantığınızla birlikte bir veri paketi)

  • paketler ve bunu EntryPoint akıllı sözleşmesine gönderir

  • EntryPoint bunu doğrular (bakiyenizi, imzanızı ve nonce'u kontrol ederek)

  • her şey yolundaysa niyetinizi yürütür — yönlendiricileri, havuzları çağırır ve tokenları hareket ettirir.

Ancak blok zincirinin perspektifinden bakıldığında, bütün bu olay sadece "bundler veriyi EntryPoint'e gönderdi" gibi görünür.

SCW terimleriyle bu adıma dış işlem denir.

Ve o işlem başarılı oldu: veri teslim edildi ve EntryPoint iç mantığını çalıştırmaya başladı. Bu yüzden üstte ✅ Success görünüyor.


Ama gezgin, nazik davranıp yine de bir şeylerin içeride EntryPoint içinde başarısız olduğunu o küçük sarı notla bildiriyor. Gezgin için o içsel başarısızlık işlemi başarısız olarak işaretlemek için yeterli değil.

Şimdi, Genel Bakış sekmesinde başka bir detay göze çarpıyor:

  • Yaklaşık $6 değerinde ETH cüzdanınızdan EntryPoint'e gönderildi (gaz ön ödemesi).

  • Sadece $2.3 değerinde ETH bundler'a geri ödendi.

  • Ve üstte gösterilen işlem ücreti ise daha da düşük — yaklaşık $2.15.

İlk bakışta bu rakamlar tutarlı görünmüyor. Araştırmaya devam etmeden önce bunu açalım


Adım 3 – Gaz farkını anlama

İşte dökümü:

  • SCW → EntryPoint (~$6): Bu gaz ön ödemesidir. EntryPoint, UserOp'unuzun çalışabilmesi için her zaman gerektiğinden daha fazlasını toplar.

  • EntryPoint → Bundler (~$2.3): Bu gerçek gaz geri ödemesidir. Bu, bu başarısız deneme için sizin ödediğiniz gerçek tutardır. İşlem Ücreti

  • (~$2.15): Bu, bundler'ın UserOp'unuzu EntryPoint'e göndermek için harcadığı miktardır. Daha düşük çünkü EntryPoint doğrulama ve bundler'ı geri ödeme sırasında ekstra gaz kullandı — bu ekstra maliyet size yansıtıldı. Kural olarak:

👉 Gerçek gaz maliyetiniz her zaman EntryPoint ➜ Bundler geri ödemesidir (üstte gösterilen “İşlem Ücreti” değil)

Ve ön ödediğiniz miktar ($6) ile geri ödenen miktar ($2.3) arasındaki fark kaybolmadı. Bir depozito olarak EntryPoint'te kaldı ve otomatik olarak bir sonraki işleminize uygulanacak.

Adım 4 – AA Transactions sekmesini kontrol edin


Gezgin üzerinde bir

AA Transactions sekmesi (AA = Account Abstraction) görürsünüz. SCW etkinliği burada bulunur, çünkü SCW'ler Hesap Soyutlama (ERC-4337) üzerinde çalışır. Genel Bakış'tan o sekmeye geçelim:

Burada sonunda UserOperation'ımızı bundler'ın dış işlemi içinde ayrı bir giriş olarak listelenmiş olarak görüyorsunuz:

"From" alanı şimdi

  • cüzdan adresimizi gösteriyor, bunun bizim operasyonumuz olduğunu doğruluyor.Ayrı bir AA Txn Hash var, dış işlem hash'inden farklı. Neden?

  • Dış Txn Hash, UserOp'unuzu içeren Bundler->EntryPoint işlemine aittir (ve bu işlem çeşitli kullanıcılardan birden fazla UserOp içerebilirdi).

    • AA Txn Hash ise o paketin içindeki

    • sizin UserOperation'ınızın benzersiz tanımlayıcısıdır. Bu bundling'in ana fikridir:

Bir bundler birçok UserOp'u tek bir işleme paketleyebilir.

  • Her UserOp kendi AA Txn Hash'ini alır, böylece paket içinde ayrı ayrı izlenebilir.

  • Bizim örneğimizde, çünkü bu daha eski bir işlem (400+ gün önce), SCW'ler hâlâ nadirdi ve paket yalnızca bizim UserOp'ımızı içeriyordu — bu yüzden sekmede “AA Transactions (1)” görünüyor. Daha yeni işlemlerde genellikle birden çok UserOp'un tek bir pakette toplandığını görürsünüz.

  • Bu görünümde ayrıca AA Txn Hash'inizin yanında takasınızın yürütülmediğinin onayı olan

kırmızı (!) Sonraki adım AA Txn Hash'e tıklamaktır. Bu, dedicated UserOperation sayfasını açar ve burada takas denemenizin tüm detaylarını — ücret, transferler ve nerede başarısız olduğu — görürsünüz.

Adım 5 – AA İşlem detayları sayfasını açın


AA Txn Hash'e tıklamak sizi UserOperation'ınız için ayrılmış detay sayfasına götürür:

Burada sonunda gerçek takas denemenizi net bir şekilde görebilirsiniz:

Durum:

  • x Fail (bu sefer belirsizlik yok) Kimden: akıllı sözleşme cüzdanı adresiniz

  • AA İşlem Ücreti: ~0.00231 ETH (2,31 $). Bu, ödediğiniz gerçek gaz maliyetidir — bundler'a gönderilen geri ödemedir.

  • İç işlem: SCW'nizden EntryPoint'e ~0.00145 ETH (~6,36 $) tutarında bir transfer = gaz ön ödemesi. Başarılı oldu. Başka transfer gerçekleşmedi, bu da takasın kendisinin hiç yürütülmediğini doğrular.

  • Bundle Txn Hash: dış bundler işlemine bağlanan şekilde gösterilir.

  • Bu sayfa nihayet sezgilerinizle uyuşuyor: bu gerçek işlemdir — takas girişiminizi temsil eden UserOperation.

Araştırmamız neredeyse burada bitiyor. Ama buraya kadar geldiğimize göre, ayrıca

Internal Txns seçeneğine de tıklayalım.


Adım 6 – İç İşlemler sekmesini kontrol edin

AA İşlem görünümünde İç İşlemler sekmesine geçin:

Burada EntryPoint'in sizin adınıza gerçekleştirmeye çalıştığı adım adım eylemleri görürsünüz:

  1. ✅ SCW'nizden EntryPoint'e transfer (~0.00145 ETH, ~6,36 $) = gaz ön ödemesi. Bu başarılı oldu.

  2. ❌ SCW'nizden Uniswap Universal Router'a yürütme (~0.002 ETH) = denenen takas. Bu başarısız oldu.

Bu döküm başarısızlığı açıklıyor:

  • Gaz ön ödemesi olarak EntryPoint'e ETH göndermeyi başarıyla gerçekleştirdiniz.

  • Ancak EntryPoint, takas için Uniswap'a ETH iletmeye çalıştığında, deneme başarısız oldu.

En ayrıntılı döküm için Logs sekmesini açın.


Adım 7 – Logs sekmesini inceleyin

Logs (3)'e tıklayın:

Burada üç ana etkinlik bulacaksınız:

  • Deposited → gaz ön ödemenizin EntryPoint tarafından alındığını doğrular.

  • BeforeExecution → EntryPoint'in UserOperation'ınızı işlemeye başladığını gösterir.

  • UserOperationEvent success: False — UserOp'unuzun başarısız olduğunu gösteren resmi zincir üzeri kayıttır.


Gerçekte ne oldu (hepsi bir araya getirildiğinde)

Bu tür bir başarısızlık, girişin yerel token (ETH, BNB, MATIC…) olduğu SCW takaslarına özgüdür.

  • Fark: ne bundler ne de EntryPoint, gaz ön ödemesi ile takası birlikte karşılayacak kadar yeterli yerel token sahibinizin olup olmadığını kontrol ederler. Onları yalnızca ayrı ayrı kontrol ederler — “gaz için yeterli mi?” ve “takas için yeterli mi?”. Bu yüzden simülasyon geçti.

  • Uygulamada bu durumlar için bir güvenlik önlemi oluşturduk, arayüzde gazın yetersiz olabileceği konusunda sizi uyardık. Ancak simülasyon iyi görünüyorsa yine de ilerleyebilirdiniz.

  • Onayladığınızda bundler UserOperation'ınızı EntryPoint'e gönderdi.

  • EntryPoint, ön ödeme olarak yaklaşık 6 $ değerinde ETH çekti.

  • Takası yürütmeye çalıştığında, takası ve ön ödemeyi aynı anda karşılayacak kadar yeterli ETH kalmamıştı.

  • Takas çağrısı EntryPoint içinde revert oldu.

  • Yine de yaklaşık 2,3 $ gaz ödediniz (bundler'a yapılan geri ödeme).

  • Kullanılmayan ~3,7 $ EntryPoint'te depozito olarak kaldı ve bir sonraki işleminizde otomatik olarak kullanılacak.

Last updated