Intent-based applicationsの概要と考察〜UniswapX, CowSwap, 1inch Fusion〜
AAの文脈でIntentがよく話に出てくるようになってきました。またMEVの観点からもIntentは非常に重要な概念になってきています。
本記事ではIntent specific applicationsであるUniswapX、CowSwap、1inch fusionの概要とその現状について書きます。
Intentとは
Paradigmの記事では下記のようにIntentが説明されており、とてもわかりやすい解釈でした。
If a transaction explicitly refers to “how” an action should be performed, an intent refers to “what” the desired outcome of that action should be. If a transaction says “do A then B, pay exactly C to get X back”, an intent says “I want X and I’m willing to pay up to C”.
https://www.paradigm.xyz/2023/06/intents
これまでのトランザクションでは「どのように実行するか」という"how"まで指定していましたが、intentでは"how"を第三者に委任し「なにをするか」という"what"だけを定義することになります。
例えば、100USDCをDAIに交換したい場合、Intentを使わない場合は、例えばUniswapV2の"swapExactTokenForToken"関数を使って100USDCを交換する"というところまで定義する必要がありました。
ですが、intentでは"100USDCをDAIに交換する"という”what”のみを定義し、どのように交換するかという”how”は第三者に委任することができます。
このように、intentを活用することで、利用者は多数あるDEXから最適なレートを探し出しトークンを交換する煩わしさから解放されたり、ガス代を持ってなくてもトークンを交換できたりすることになります。
AA(Account Abstraction)がアカウントの概念を抽象化とすると、
"IntentはTransaction Abstraction" = "トランザクションの抽象化" と捉えるとわかりやすいかもしれません。
各プロダクトの概要
Intentを活用したプロダクトは、Intent-based applicationsと呼ばれており、代表格であるUniswapX, CowSwap, 1inch fusionの仕組みを調べました。
各プロダクトの細かい仕組みは違いますが、各サービスで共通しているものとして
「今までは一つのトランザクションでトークンをswapしていたが、"トークンをswapしたいというorderの提出"と"第三者によるそのorderの実行"の2つに分割して最適なレートを提供しようとしている」
ということが挙げられます。
各プロジェクトの概要は箇条書きでまとめました。
Uniswap X
- 概要
- better price, gas free, MEV Protection, No cost for failed tx, optimistic cross chain swap
- 関係者
- Swapper : swapしたい人。署名だけを行いtxを実行しない = Gasを保有していなくてもSwapできる。
- Filler : Swapperのorderを実行すること。Swapする際に手数料をもらう。
- Order Reactors(コントラクト) : Orderをfillするときに実行されるコントラクト。
- 価格はDutch ordersで決定
- Dutch auctionとほぼ同じ
- orderが出された時はSwapperにとっていいレートに設定し、時間の経過とともにレートを悪くしてfillerに競わせる
- 例) 例えば市場か価格が1ETH=1000USDCの場合、オークションは1ETH=1005UCDCで始まる
- その後、ETHあたりのレートが悪くなる
- Fillerが利益が出ると確信した場合、orderを受け取る。(例えば1ETH = 995USDCの時)
- Fillerは利益が出たらすぐにorderをfillするインセンティブがあり、Swapperにとってもいいレートになる可能性がある
- トランザクションの流れ
- SwapperがOrder(Swapしたい)情報に署名し,API経由でorderを提出する
- Fillerは自身の戦略のもとにorderをfillする。fillには2パターンある。
- Direct Filler : Fillerは保有しているtokenとSwapperがswapしたいtokenを交換する
- Sophisticated Filler : IReactorCallback interface を実装した独自の戦略ロジックを持ったコントラクト経由でfillする
- orderの作成方法
- APIとSDKで作成。これは他のdex aggregatorと似ている。
- https://github.com/Uniswap/UniswapX-sdk/#usage
import { DutchOrder, NonceManager } from '@uniswap/uniswapx-sdk';
import { ethers } from 'ethers';
const provider = new ethers.providers.JsonRpcProvider(RPC_URL);
const account = await provider.getSigner().getAddress();
const nonceMgr = new NonceManager(provider, 1);
const nonce = await nonceMgr.useNonce(account);
const chainId = 1;
const builder = new DutchOrderBuilder(chainId);
const order = builder
.deadline(deadline)
.decayEndTime(deadline)
.decayStartTime(deadline - 100)
.nonce(nonce)
.input({
token: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',
amount: BigNumber.from('1000000'),
})
.output({
token: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',
startAmount: BigNumber.from('1000000000000000000'),
endAmount: BigNumber.from('900000000000000000'),
recipient: '0x0000000000000000000000000000000000000000',
})
.build();
// Sign the built order
const { domain, types, values } = order.permitData();
const signature = wallet._signTypedData(domain, types, values);
const serializedOrder = order.serialize();
// submit serializedOrder and signature to order pool
- etherscan見てみると現状はdirect fillがほとんど
追加調査
- 誰がorderがfillされたかをオンチェーン/オフチェーンどちらで管理しているのか気になった
- 例えばオンチェーンで管理している場合、オンチェーンのconfirmにラグがあるので、API経由で投げられたorderをfillする関数を同時に投げてしまった場合failすること可能性がある
- 逆に、オフチェーンで管理している場合、orderをとるだけとってオンチェーンでfillしないなどの攻撃ができる可能性がある
- OrderReactors周りのコントラクトで管理はしてそう
CoW Swap
- 概要
- Batch AuctionとCoincidence of Wantsを利用して最適な価格でswapを提供する
- Batch Auction
- 利用者があるトークンを交換したい場合、まずorderをCowProtocolに送る。
- ある程度Orderが溜まると、orderを実行するSolverがorderの順番も考慮して最適な取引を見つけ出し、orderを実行する
- つまり、orderを投げた時と、実際にorderが実行されるまでには時間差があることに注意
- Coincidence of Wants
- 二つ以上の取引で他方が欲しい資産を保有している場合、他のプロトコルを介さずに直接交換すること
- CoWの中でも関係者間で資産が循環する場合はRing tradesと呼ばれる
- *Signed order
- orderはオンチェーンで管理されており、swapしたい場合はトランザクションを実行する必要がある。だが、Signed orderを使えば署名のみでトランザクションを実行せずともorderを提出することができる。
- https://docs.cow.fi/overview/signed-orders
- UIからは出来なさそうだった
- Solver
- 役割によってSolverは分割されている
- Baseline solver : 単一のswapを組み合わせてマッチさせる(オンチェーン情報のみ)
- DEX Aggregator Solvers : DEX Aggregatorも活用ししてマッチさせる
- Balancer SOR (Smart Order Routing) solver : Balancerの仕組みを使ってマッチさせる
- Native Solver : 単一の流動性プールでマッチさせる
- CowDexAg solver : 複数のAggregator(ParaSwap, 0x)を組み合わせてマッチさせる
- MIP solver : 複数のAMM'sに対してオーダーをマッチさせる
- Quasimodo solver : quasi-linearを使ってモデル化しマッチさせる
- これらの他にも追加されてるみたい、今はotexがtx数は多い
https://twitter.com/CoWSwap/status/1529128574338334722?lang=ja
- これらの他にも追加されてるみたい、今はotexがtx数は多い
- Solverの管理
- allow-list authenticator contractで管理されている
- Vault relayer
- solverを外部コントラクトを実行する際に、userがapproveしている資産を悪用しないように保護する
追加調査
- Vault relayerは、Balancer External Balances, Balancer Internal Balances, Fallback ERC20 Allowancesの三つの機能を利用して実装してるらしい
- 後ほど詳しいコントラクトを見てみる
1inch fusion
- 概要
- userが署名でorderを提出し、resolverが最適なレートでorderを実行してくれる
- Resolvers (takers)
- 1INCHをステークするとresolverになれる
- top 10のstakerはresolverとしてfusionを実行できる優先権を得ることができる
- resolverの透明性を高めるためにKYC/KYBをしている
- orderはdutch auction形式
- 仕組みはUniswapXで説明した,Dutch orderを参照
- resolverがtakeした時、設定したslippageを下回った時、設定した有効期限を過ぎた時orderは失効する
- ただし、利用者は署名しただけなので失効したとしてもガス代を支払う必要はない
- 実際のtx
オンチェーン情報
各サービスの概要を理解したところで、UniswapX, CowSwap, 1inch fucion、それぞれのオンチェーン情報をみてみます。
今回は下記duneを利用しています
- UniswapX
- CowSwap solver
- 1inch fusion
各プロダクトのデータまとめ
- Uniswapx
- 約100件/dayのorder
- まだローンチしたばかりでそこまで情報が溜まっていない
- CowSwap
- 1000件/day程度のbatch
- orderがたまると価値を発揮するが、batch sizeの平均が1~1.2を推移していたのであまり価値を発揮できていなさそう
- 最適なレートでtradeしてくれるなら利用者が増えそうだけど、利用者数が少ない(batchが集まらない)のは下記あたりだと推測
1- swapまでのラグがあるため- Uniswapのswapに比べうると、solverをtrustする必要があるため
- 1inch fusion
- Fusionのtotal txはLegacyのtxの1/58ほどになっている
- LegacyとFusionの24hのvolumeを比較すると1/7、tx数は1/12ほどになっている
- Fusionのtx数、volumeがLegacyにすごいスピードで追いついてきている
考察
オンチェーンの情報だけみても、それぞれのサービスを使ったトレードが利用者にとって最適なレートになっているのかの判断は難しかったです。理由として、トランザクションが発生した時のレートを後から評価することは難しく、レートも使うDEXによって変わるためです。
また、filler/resolver/solverの収益の情報もまだ少なかったです。例えば現状だと、filler/resolver/solverが儲けすぎていて利用者にとって適正な価格になっているか、filler/resolver/solverとして参入するのにはメリットがあるのか、などが可視化されておらず、ある種、filler/resolver/solverをトラストする形になっています。
この辺の情報がより可視化されると、情報の非対称性がなくなり、これらのサービスがより普及しそうだと感じました。
ただ、1inch fusionのトランザクション数が劇的に伸びております。
実際に自分も1inch fusionをよく利用するのですが、ガスレスで実行でき、レートもそこまで気にすることなく取引でき、とても便利でした。
使いやすさの観点からもこれらのサービスが普及するのは間違いないと感じました。
Intent系のサービスの今後としては、各サービスでintentを持つのではなく、共通の規格を作ってintentを共有するとさらに体験が良くなりそうだと感じました。今後はIntent Aggregatorのような存在も出てくるかもしれません。
また、Flashbotは収益性の観点からprivate order flowを獲得することが重視されていますが、intent系のサービスはすでにprivate order flowを獲得できている点は、intentとFlashbotの対比としては面白さを感じました。
Intent単体で見るのではなく、Flashbotなどを使ってblockに取り込まれるまでのorder flowまで俯瞰して考えると、より市場が広がり、そこがUniswapXや1inch fusionが見ている未来だと思います。
参考
Intent
UniswapX
CowSwap
1inch fusion
Discussion