3つの一般的な間違いでuniswap
7782 ワード
あなたがおそらくこの記事の向こう側にUNISWAPの単純な交換のワーキング・サンプルを探しているので、コードの他に何も興味がないので、すぐにそれを提供します.しかし、もし私がいくつかの一般的な間違いを克服しているか、自分でいくつかの問題に苦しんでいる方法についての詳細を知りたい場合は、私はあなたが最後までこのポストを読むことをお勧めします.
また、Kovanネットワーク上で展開された契約を見つけてテストすることもできますthis アドレス.
今日は日です.あなたは、長い間それについて考えました.あなたは過去数日間、ブロック、EthereumとSolilityについて読んでいる.コーディングを開始する時間です!たくさんのドキュメンテーションを持っているものから始めましょう.UNISWAPは最大の交換であるので、彼らを通して読もうdocs . ああ!彼らにもexample of a simple swap ! それをコピーして、それが働くかどうかチェックしましょう.
数分後、契約が展開されます.EtherScanに行ってスワップ機能を使ってトランザクションを書きます.動作しません.それが多分失敗するトランザクションに署名する前に、Metamaskさえ警告します.何を待ちますか.なぜ?どうやって?公式ドキュメントからコピーしました.なぜ失敗したのか.
あなたは助けを捜し始めます、しかし、驚くほど、多くの答えがありません.あなたのものに似たような質問をする人もいます.
心配しないで!久しぶりに全く同じ状況だった.あなたが私のコードをチェックするならば、あなたはそれがUNISWAPドキュメントからのものとほとんど同一であるのを見ます.彼らはとてもよく準備した.彼らはいくつかの小さなものを省いたり、必要ないくつかの追加のステップを十分に強調しなかった.また、私は2つのほとんど同じ機能を持っていることに気づくことができます.あなたが読んでいる理由に興味があるならば.
私は、最も一般的な間違いはトークンの間違ったアドレスを使用していると思います.あなたがスワップしたいすべてのトークンも展開された契約であることに留意してください.異なるネットワークでは、異なるアドレスで契約を展開できます.それらの例のUNISWAPは、DaiとWethのいくつかのハードコードされたものを持っていますが、この例ではどのネットワークが動作するかについては触れません.
あなたが異なるネットワーク上でwethのアドレスを検索しようとする場合は、簡単にそれを見つける.他のトークンのために、それはそれほど単純でないかもしれません.
どうやってそれを克服したの?私はuniswapスワップ機能をテストしたいので、インタフェースを使っているトークンを交換し、トランザクションの詳細をチェックします.
そのような取引を確認できますhere . 内部では、我々はWisthとDaiトークンを見ることができます.それらをクリックした後、あなたはスワップしたいトークンである契約を見つけます.だからちょうどあなたのコードとET Vil ilでアドレスを使用してください!
あなたを助けるために、私はコードでKovanとRinkebyネットワークのためにダイとwethトークンアドレスを提供しました.おかしいことは、このメソッドが私にこのポストで言及される3つ目の間違いをさせたということです.
あなたは実際にUNISWAPのドキュメントを読んでいるか、あなただけのコードと希望のベストをコピーしましたか?あなたは?目で私を見て、あなたが本当にそれを読んだと私に話してください.心配するな.私もそうしなかった.私がそれをチェックしていたとき、私はトークンの使用を承認することについていくつかの部分を思い出しました、しかし、コードでは、そこにあります
それで、我々がコードで持っている承認は、第2の部分です.我々は契約からトークンを使用するiSouwapルータを承認します.しかし、その前に、我々は我々の契約から我々の財布からトークンを撤回することを承認しなければなりません.もしそうしなければ、トランザクションに署名しようとすると、メタメークはおそらく失敗します.
そして、とにかく試みた後に、トランザクションはエラーで戻されます:
トークンを取り消すことを承認するために、あなたがEtherScan(我々のケースでは)でスワッピングされそうであるトークンの契約を見つけてください
トランザクションが承認された後、あなたの契約スワップ機能を正常に使用する必要があります.できませんか.まあ次に、おそらくあなたも3番目のミスを犯した!
そのドキュメントのuniswapは、
私の考えは、どのルータUNISWAPインターフェイスを使用して、それを使用してみましょう.最初の間違いからUNISWAPのトークンを交換するトランザクションでは、このトランザクションが使用したルータアドレスを見ることができます.わかった
残念ながら、それは正しくなかった.このルータを使用した契約を展開した後、私は再びMetamask警告と同様の問題を抱えており、トランザクションは失敗しました.今回はエラーが何か役に立ちませんでした.
最後に、実際には両方のルータが機能を必要としており、それらは両方ともparamsに類似の構造を使用しているが、それは同じではないことが分かった. 我々も密接にチェックするならば
私のコードでは、両方のルータのために働く機能を残しました.
によって、Androidの開発者Bright Inventions
また、Kovanネットワーク上で展開された契約を見つけてテストすることもできますthis アドレス.
//SPDX-License-Identifier: Unlicense
pragma solidity >=0.7.5;
pragma abicoder v2;
import "@uniswap/v3-periphery/contracts/interfaces/ISwapRouter.sol";
import "@uniswap/lib/contracts/libraries/TransferHelper.sol";
import "@uniswap/swap-router-contracts/contracts/interfaces/IV3SwapRouter.sol";
contract Swap {
address private constant SWAP_ROUTER =
0xE592427A0AEce92De3Edee1F18E0157C05861564;
address private constant SWAP_ROUTER_02 =
0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45;
address private constant WETH = 0xd0A1E359811322d97991E03f863a0C30C2cF029C; //kovan
// address private constant WETH = 0xc778417E063141139Fce010982780140Aa0cD5Ab; // rinkeby
address public constant DAI = 0x4F96Fe3b7A6Cf9725f59d353F723c1bDb64CA6Aa; //kovan
//address public constant DAI = 0xc7AD46e0b8a400Bb3C915120d284AafbA8fc4735; // rinkeby
ISwapRouter public immutable swapRouter = ISwapRouter(SWAP_ROUTER);
IV3SwapRouter public immutable swapRouter02 = IV3SwapRouter(SWAP_ROUTER_02);
function safeTransferWithApprove(uint256 amountIn, address routerAddress)
internal
{
TransferHelper.safeTransferFrom(
DAI,
msg.sender,
address(this),
amountIn
);
TransferHelper.safeApprove(DAI, routerAddress, amountIn);
}
function swapExactInputSingle(uint256 amountIn)
external
returns (uint256 amountOut)
{
safeTransferWithApprove(amountIn, address(swapRouter));
ISwapRouter.ExactInputSingleParams memory params = ISwapRouter
.ExactInputSingleParams({
tokenIn: DAI,
tokenOut: WETH,
fee: 3000,
recipient: msg.sender,
deadline: block.timestamp,
amountIn: amountIn,
amountOutMinimum: 0,
sqrtPriceLimitX96: 0
});
amountOut = swapRouter.exactInputSingle(params);
}
function swapExactInputSingle02(uint256 amountIn)
external
returns (uint256 amountOut)
{
safeTransferWithApprove(amountIn, address(swapRouter02));
IV3SwapRouter.ExactInputSingleParams memory params = IV3SwapRouter
.ExactInputSingleParams({
tokenIn: DAI,
tokenOut: WETH,
fee: 3000,
recipient: msg.sender,
amountIn: amountIn,
amountOutMinimum: 0,
sqrtPriceLimitX96: 0
});
amountOut = swapRouter02.exactInputSingle(params);
}
}
どのようにすべて開始
今日は日です.あなたは、長い間それについて考えました.あなたは過去数日間、ブロック、EthereumとSolilityについて読んでいる.コーディングを開始する時間です!たくさんのドキュメンテーションを持っているものから始めましょう.UNISWAPは最大の交換であるので、彼らを通して読もうdocs . ああ!彼らにもexample of a simple swap ! それをコピーして、それが働くかどうかチェックしましょう.
数分後、契約が展開されます.EtherScanに行ってスワップ機能を使ってトランザクションを書きます.動作しません.それが多分失敗するトランザクションに署名する前に、Metamaskさえ警告します.何を待ちますか.なぜ?どうやって?公式ドキュメントからコピーしました.なぜ失敗したのか.
あなたは助けを捜し始めます、しかし、驚くほど、多くの答えがありません.あなたのものに似たような質問をする人もいます.
3一般的な間違い
心配しないで!久しぶりに全く同じ状況だった.あなたが私のコードをチェックするならば、あなたはそれがUNISWAPドキュメントからのものとほとんど同一であるのを見ます.彼らはとてもよく準備した.彼らはいくつかの小さなものを省いたり、必要ないくつかの追加のステップを十分に強調しなかった.また、私は2つのほとんど同じ機能を持っていることに気づくことができます.あなたが読んでいる理由に興味があるならば.
間違ったトークンアドレス
私は、最も一般的な間違いはトークンの間違ったアドレスを使用していると思います.あなたがスワップしたいすべてのトークンも展開された契約であることに留意してください.異なるネットワークでは、異なるアドレスで契約を展開できます.それらの例のUNISWAPは、DaiとWethのいくつかのハードコードされたものを持っていますが、この例ではどのネットワークが動作するかについては触れません.
あなたが異なるネットワーク上でwethのアドレスを検索しようとする場合は、簡単にそれを見つける.他のトークンのために、それはそれほど単純でないかもしれません.
どうやってそれを克服したの?私はuniswapスワップ機能をテストしたいので、インタフェースを使っているトークンを交換し、トランザクションの詳細をチェックします.
そのような取引を確認できますhere . 内部では、我々はWisthとDaiトークンを見ることができます.それらをクリックした後、あなたはスワップしたいトークンである契約を見つけます.だからちょうどあなたのコードとET Vil ilでアドレスを使用してください!
あなたを助けるために、私はコードでKovanとRinkebyネットワークのためにダイとwethトークンアドレスを提供しました.おかしいことは、このメソッドが私にこのポストで言及される3つ目の間違いをさせたということです.
契約撤収契約の承認
あなたは実際にUNISWAPのドキュメントを読んでいるか、あなただけのコードと希望のベストをコピーしましたか?あなたは?目で私を見て、あなたが本当にそれを読んだと私に話してください.心配するな.私もそうしなかった.私がそれをチェックしていたとき、私はトークンの使用を承認することについていくつかの部分を思い出しました、しかし、コードでは、そこにあります
TransferHelper.safeApprove()
だから私はそれだと思った!まあ残念ながらそれはありません.我々がドキュメンテーションに戻って、慎重にそれを読むならば、彼らははっきりと述べます.The caller must approve the contract to withdraw the tokens from the calling address's account to execute a swap. Remember that because our contract is a contract itself and not an extension of the caller (us); we must also approve the Uniswap protocol router contract to use the tokens that our contract will be in possession of after they have been withdrawn from the calling address (us).
それで、我々がコードで持っている承認は、第2の部分です.我々は契約からトークンを使用するiSouwapルータを承認します.しかし、その前に、我々は我々の契約から我々の財布からトークンを撤回することを承認しなければなりません.もしそうしなければ、トランザクションに署名しようとすると、メタメークはおそらく失敗します.
そして、とにかく試みた後に、トランザクションはエラーで戻されます:
TransferHelper::transferFrom: transferFrom failed
.トークンを取り消すことを承認するために、あなたがEtherScan(我々のケースでは)でスワッピングされそうであるトークンの契約を見つけてください
approve
あなたの契約アドレスとあなたが承認しやすいコインの量を提供している機能.トランザクションが承認された後、あなたの契約スワップ機能を正常に使用する必要があります.できませんか.まあ次に、おそらくあなたも3番目のミスを犯した!
間違ったswaprouterの使用
そのドキュメントのuniswapは、
swapRouter
. スワップルータの契約アドレスを使用して行うことができます.しかし、最初のミスに似て.どこからこの住所を取るべきですか.アゲインインザdocs , UNISWAPは、すべての契約のアドレスを提供します.さらに、それらはそれらのアドレスがすべてのネットワークのために同じであることをはっきりと述べる.それはすばらしいです.テーブルの2つのswaprouters契約を見ることができます.どちらを使うべきですか.私の考えは、どのルータUNISWAPインターフェイスを使用して、それを使用してみましょう.最初の間違いからUNISWAPのトークンを交換するトランザクションでは、このトランザクションが使用したルータアドレスを見ることができます.わかった
SwapRouter02
. EtherScanの上で、私はこのルータもあることを確かめましたexactInputSingle
受け入れる関数ExactInputSingleParams
.残念ながら、それは正しくなかった.このルータを使用した契約を展開した後、私は再びMetamask警告と同様の問題を抱えており、トランザクションは失敗しました.今回はエラーが何か役に立ちませんでした.
最後に、実際には両方のルータが機能を必要としており、それらは両方ともparamsに類似の構造を使用しているが、それは同じではないことが分かった.
SwapRouter
から継承するISwapRouter
SwapRouter02
から継承するV3SwapRouter
ExactInputSingleParams
両方の契約が使用するStruct、我々は2010年にそのバージョンを見ることができますV3SwapRouter
がないdelay
パラメータだから非常に似て見えるにもかかわらず、それらは2つの完全に異なるものです.私のコードでは、両方のルータのために働く機能を残しました.
によって、Androidの開発者Bright Inventions
Reference
この問題について(3つの一般的な間違いでuniswap), 我々は、より多くの情報をここで見つけました https://dev.to/brightdevs/single-swap-on-uniswap-v3-with-3-common-mistakes-p62テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol