Skip to content

Instantly share code, notes, and snippets.

@voith
Created March 19, 2025 21:23
Show Gist options
  • Save voith/a205d89854bdbb148097d510ddf6267e to your computer and use it in GitHub Desktop.
Save voith/a205d89854bdbb148097d510ddf6267e to your computer and use it in GitHub Desktop.
ODOS aggregator integration
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.26;
import "forge-std/Test.sol";
import "forge-std/console.sol";
import {IERC20} from "@openzeppelin-contracts-5/contracts/token/ERC20/IERC20.sol";
//POST: https://api.odos.xyz/sor/quote/v2
//{
// "chainId": 42161,
// "compact": true,
// "inputTokens": [
// {
// "amount": "100000000000",
// "tokenAddress": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831"
// }
// ],
// "outputTokens": [
// {
// "proportion": 1,
// "tokenAddress": "0x6694340fc020c5E6B96567843da2df01b2CE1eb6"
// }
// ],
// "userAddr": "0xcafA84d24F613f68c158376f50571A75e2A78a26"
//}
//https://api.odos.xyz/sor/assemble
//{
// "pathId": "39c90f02239feae50de5041f26a974ff",
// "simulate": false,
// "userAddr": "0xcafA84d24F613f68c158376f50571A75e2A78a26"
//}
contract TestODOS is Test {
IERC20 usdc = IERC20(0xaf88d065e77c8cC2239327C5EDb3A432268e5831);
IERC20 stargate = IERC20(0x6694340fc020c5E6B96567843da2df01b2CE1eb6);
address osdosRouter = 0xa669e7A0d4b3e4Fa48af2dE86BD4CD7126Be4e13;
address user = 0xcafA84d24F613f68c158376f50571A75e2A78a26;
bytes data = hex"83bd37f9000a003105174876e8000a54d4cdf914945400000000c49b000114ADf53c57Aeb3BB4A665f37Ba0B80EAC428F49500000001cafA84d24F613f68c158376f50571A75e2A78a26000000001308031201114a63ab2801000102010c73c3b60b010003010001086d4ddb0b0100040100010b1ac5200b01000501000107ac78390b0100060100010954b1680b010007010001090804d70b010008010001039e00a70702000109423a1323c871abc9d89eb06855bf5347048fc4a50000000000000000000004960175c206520b02000a010101b28f013f0b02000b010101618011ca0b02000c0101011712edb0130200010d0101016d568674100200010e010900480200010904070001090f3a4c6d2404b5eb14915041e01f63200a82f4a34300020000000000000000006503066752da030001011002001e020b0001110200ff00000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e583182af49447d8a07e3bd95bd0d56f35241523fbab1b1026b8e7276e7ac75410f1fcbbe21796e8f7526c473e2aee3441bf9240be85eb122abb059a3b57cc6962004f452be9203591991d15f6b388e09e8d06f38e884725a116c9c7fbf208e79fe8828a2595ff3eb87c1f6020982173c908e7eb31aa66c1f02967fcdc35463e3770c2fb992716cd070b63540b947ff970a61a04b1ca14834a43f5de4533ebddb5cc8c86eb7b85807020b4548ee05b54bfc956eebbfcd8e295789c9465487074a65b1ae9ce0351172393fe8bb56ee968333bf18f9cbbe8eeef350540f9607c1ad239594c165bd4d8847d281232172a4520818489ee077994b6658eafa855c308275ead8097c4a6694340fc020c5e6b96567843da2df01b2ce1eb647888c34e9aa879363e94e5302681e763b18d39ea8bd646f72ea828ccbc40fa2976866884f883409000000000000000000000000";
uint256 arbitrumMainnetForkId;
function setUp() external {
string memory ARBITRUM_MAINNET_RPC_URL = vm.envString("ARBITRUM_URL");
arbitrumMainnetForkId = vm.createFork(ARBITRUM_MAINNET_RPC_URL);
vm.selectFork(arbitrumMainnetForkId);
}
function test() external {
vm.selectFork(arbitrumMainnetForkId);
deal({token: address(usdc), to: user, give: 500000e6});
vm.startPrank(user);
usdc.approve(osdosRouter, 100000e6);
console2.log(stargate.balanceOf(user));
(bool success, ) = osdosRouter.call(data);
require(success, 'odos router call failed');
console2.log(stargate.balanceOf(user));
vm.stopPrank();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment