
Security News
Risky Biz Podcast: Making Reachability Analysis Work in Real-World Codebases
This episode explores the hard problem of reachability analysis, from static analysis limits to handling dynamic languages and massive dependency trees.
@dhedge/v2-sdk
Advanced tools
🛠 A complete implementation for building applications on top of dHEDGE V2
Features:
npm install @dhedge/v2-sdk
yarn add @dhedge/v2-sdk
If you want to use 1Inch to trade pool assets you need to apply for an API key at 1Inch Dev Portal. Then you need to copy .env.example file to .env and set your API key there.
ONEINCH_API_KEY=YOUR_API_KEY_FROM_1INCH
Initialize the sdk with an ethers wallet and the network.
import { Dhedge, Dapp, Network, ethers } from "@dhedge/v2-sdk";
const privateKey = "YOUR_PRIVATE_KEY";
const providerUrl = "https://polygon-mainnet.infura.io/v3/{YOUR_PROJECT_ID}"
const provider = new ethers.providers.JsonRpcProvider(providerUrl);
const walletWithProvider = new ethers.Wallet(privateKey, provider);
const dhedge = new Dhedge(walletWithProvider, Network.POLYGON);
USDC and DAI enabled assets, but only USDC available for deposit.
const usdcTokenAddress = "USDC_TOKEN_ADDRESS"
const daiTokenAddress = "DAI_TOKEN_ADDRESS"
const pool = await dhedge.createPool(
"Day Ralio",
"Awesome Fund",
"DRAF",
[
[usdcTokenAddress, true],
[daiTokenAddress, false],
],
10
)
console.log("created pool with address", pool.address)
const poolAddress = "YOUR_POOL_ADDRESS"
const pool = await dhedge.loadPool(poolAddress)
const composition = await pool.getComposition();
Change pool assets to allow DAI for deposits. Also enable WETH as an asset, but shouldn't be allowed as deposit.
const enabledAssets = [
{ asset: "USDC_TOKEN_ADDRESS", isDeposit: true },
{ asset: "DAI_TOKEN_ADDRESS", isDeposit: true },
{ asset: "WETH_TOKEN_ADDRESS", isDeposit: false },
]
const tx = await pool.changeAssets(enabledAssets)
Set an account with trading permissions
const tx = await pool.setTrader("TRADER_ACCOUNT_ADDRESS")
Before depositing an asset into a Pool, it needs to be approved.
Approve unlimited amount of USDC to deposit into Pool.
const tx = await pool.approveDeposit("USDC_TOKEN_ADDRESS", ethers.constants.MaxUint256);
Deposit 1 USDC into Pool
const usdcDepositAmount = "100000"
const tx = await pool.deposit("USDC_TOKEN_ADDRESS", usdcDepositAmount);
Withdraw 1.00002975 pool tokens. Note that this cannot be called if set as Trader account
const poolTokensWithdrawAmount = "1000029750000000000"
const tx = await pool.withdraw(poolTokensWithdrawAmount);
Before trading an asset on platforms like Sushiswap it needs to be approved.
Approve unlimited amount of USDC to trade on Sushiswap
const tx = await pool.approve(
Dapp.SUSHISWAP,
"USDC_TOKEN_ADDRESS",
ethers.constants.MaxInt256
)
Trade 1 USDC into DAI on Sushiswap (other options: TOROS, QUICKSWAP, BALANCER, or ONEINCH)
const amountIn = "1000000"
const slippage = 0.5
const tx = await pool.trade(
Dapp.SUSHISWAP,
"USDC_TOKEN_ADDRESS",
"DAI_TOKEN_ADDRESS",
amountIn,
slippage
)
Due to the upgrade of our contract, trading out of a Toros token now involves a second step. Please follow the updated process below:
const tx = await pool.trade(
Dapp.TOROS,
"TOROS_TOKEN_ADDRESS",
"USDC_TOKEN_ADDRESS",
'100000000',
slippage
)
const tx = await pool.completeTorosWithdrawal(
"USDC_TOKEN_ADDRESS",
slippage
)
For Uniswap-v2 like protocols, such as sushiswap, we use addLiquidity
, removeLiquidity
, stake
, and unstake
, and harvestRewards
const amountUsdc = "1000000"
const amountDai = "997085"
const tx = await pool.addLiquidity(
Dapp.SUSHISWAP,
"USDC_TOKEN_ADDRESS",
"DAI_TOKEN_ADDRESS",
amountUsdc,
amountDai
)
const amountSlpUsdcDai = "1000000000000000000"
const tx = await pool.removeLiquidity(
Dapp.SUSHISWAP,
"USDC_TOKEN_ADDRESS",
"DAI_TOKEN_ADDRESS",
amountSlpUsdcDai
)
const tx = await pool.approveStaking(
Dapp.SUSHISWAP,
"SLP_USDC_DAI_TOKEN_ADDRESS",
ethers.constants.MaxInt256
)
const amountSlpUsdcDai = "1000000000000000000"
const tx = await pool.stake(
Dapp.SUSHISWAP,
"SLP_USDC_DAI_TOKEN_ADDRESS",
amountSlpUsdcDai
)
const amountSlpUsdcDai = "1000000000000000000"
const tx = await pool.unstake(
Dapp.SUSHISWAP,
"SLP_USDC_DAI_TOKEN_ADDRESS",
amountSlpUsdcDai
)
const tx = await pool.harvestRewards(
Dapp.SUSHISWAP,
"SLP_USDC_DAI_TOKEN_ADDRESS"
)
For Balancer, we use joinBalancerPool
, exitBalancerPool
, and harvestBalancerRewards
const balancerPoolId = "0x03cd191f589d12b0582a99808cf19851e468e6b500010000000000000000000a"
const assets = [WBTC_TOKEN_ADDRESS, USDC_TOKEN_ADDRESS, WETH_TOKEN_ADDRESS];
const amounts = ["2000", "1000000", "200000000000000"];
const tx = await pool.joinBalancerPool(balancerPoolId, assets, amounts)
const amount = await dhedge.utils.getBalance(BALANCER_LP_TOKEN_ADDRESS, pool.address)
const tx = await pool.exitBalancerPool(balancerPoolId, assets, amount)
const tx = await pool.harvestBalancerRewards()
For Arrakis, we use increaseLiquidity
to stake or increase lp, and decreaseLiquidity
, and claimFees
. see example in the arrakis test
For Uniswap v3, we use approveUniswapV3Liquidity
, addLiquidityUniswapV3
, decreaseLiquidity
, increaseLiquidity
, and claimFees
.
await pool.approveUniswapV3Liquidity(
USDC_ADDRESS,
ethers.constants.MaxInt256
);
await pool.approveUniswapV3Liquidity(
WETH_ADDRESS,
ethers.constants.MaxInt256
);
const tx = await pool.addLiquidityUniswapV3(
WETH_ADDRESS
USDC_ADDRESS,
'430000000000000', // wethBalance
'100000000', // usdcBalance
2000,
3000,
null,
null,
FeeAmount.MEDIUM,
)
tokenId = await nonfungiblePositionManager.tokenOfOwnerByIndex(pool.address,0).toString();
const tx = await pool.decreaseLiquidity(
Dapp.UNISWAPV3,
tokenId,
50 // precent
);
Removing 100% will burn the NFT position.
Burning a Ramses CL NFT position won't claim rewards, so getRewards
needs to be called before.
const result = await pool.increaseLiquidity(
Dapp.UNISWAPV3,
tokenId,
new BigNumber(3000).times(1e6).toFixed(0), // usdc
new BigNumber(1).times(1e18).toFixed(0) // eth
);
const tx = await pool.claimFees(Dapp.UNISWAPV3, tokenId);
const tx = await pool.getRewards(Dapp.RAMSESCL, tokenId, [RAM_ADDRESS]);
For VelodromeV2 / Ramses / Aerodrome , we use addLiquidityV2
, stakeInGauge
, unstakeFromGauge
, removeLiquidityV2
, and claimFees
.
Add liquidity of 100 USDC and 0.00043 WETH to USDC/WETH Ramses pool (for Velodrome just use Dapp.VELODROMEV2, for Aerodrome Dapp.AERODROME). see example in the arrakis test, velodromeV2 test and aerdodrome test
const tx = await pool.addLiquidityV2(
Dapp.RAMSES,
USDC_ADDRESS,
WETH_ADDRESS,
'10000000',
'430000000000000',
false
)
For Aave, we use lend
, withdrawDeposit
, borrow
and repay
const tx = await pool.lend(Dapp.AAVE, USDC_TOKEN_ADDRESS, "1000000")
const tx = await pool.withdrawDeposit(Dapp.AAVE, USDC_TOKEN_ADDRESS, "1000000")
const tx = await pool.borrow(Dapp.AAVE, WETH_TOKEN_ADDRESS, "100000000000000");
const tx = await pool.repay(Dapp.AAVE, WETH_TOKEN_ADDRESS, "100000000000000");
const depositAmount = new BigNumber(1).times(1e18).toString();
const tx = await pool.mintUnitViaFlatMoney(
depositAmount,
0.5, // slippage, 0.5%
5, // maxKeeperFeeInUsd, $5
);
const withdrawAmount = new BigNumber(1).times(1e18).toString();
const tx = await pool.redeemUnitViaFlatMoney(
withdrawAmount,
0.5, // slippage, 0.5%
5, // maxKeeperFeeInUsd, $5
);
await pool.cancelOrderViaFlatMoney();
FAQs
🛠 An SDK for building applications on top of dHEDGE V2
The npm package @dhedge/v2-sdk receives a total of 196 weekly downloads. As such, @dhedge/v2-sdk popularity was classified as not popular.
We found that @dhedge/v2-sdk demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 7 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
This episode explores the hard problem of reachability analysis, from static analysis limits to handling dynamic languages and massive dependency trees.
Security News
/Research
Malicious Nx npm versions stole secrets and wallet info using AI CLI tools; Socket’s AI scanner detected the supply chain attack and flagged the malware.
Security News
CISA’s 2025 draft SBOM guidance adds new fields like hashes, licenses, and tool metadata to make software inventories more actionable.