Skip to content

Commit 4b812ec

Browse files
author
0xalpha0123
committed
fixed supply bug
1 parent c99b817 commit 4b812ec

File tree

5 files changed

+278
-72
lines changed

5 files changed

+278
-72
lines changed

packages/frontend/features/position/SupplyCoin.tsx

Lines changed: 139 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,73 +1,163 @@
1+
import { dedgeHelpers } from "../../../smart-contracts/dist/helpers";
12
import { ethers } from "ethers";
3+
import { legos } from "money-legos/dist";
24

35
import { Button, Loader, Box, Flex, Field, Input } from "rimble-ui";
46

57
import CompoundPositions from "../../containers/CompoundPositions";
68
import ContractsContainer from "../../containers/Contracts";
9+
import ConnectionContainer from "../../containers/Connection";
710
import DACProxyContainer from "../../containers/DACProxy";
811

9-
import { useState } from "react";
10-
11-
import { dedgeHelpers } from "../../../smart-contracts/dist/helpers";
12+
import { useState, useEffect } from "react";
1213

1314
const SupplyCoin = ({ coin }) => {
1415
const { getBalances } = CompoundPositions.useContainer();
1516
const { contracts } = ContractsContainer.useContainer();
16-
const { proxy } = DACProxyContainer.useContainer();
17+
const { signer, address } = ConnectionContainer.useContainer();
18+
const { hasProxy, proxy, proxyAddress } = DACProxyContainer.useContainer();
1719
const [loading, setLoading] = useState(false);
1820
const [amount, setAmount] = useState("");
1921

22+
const [transferLoading, setTransferLoading] = useState(false);
23+
const [canTransfer, setCanTransfer] = useState(null);
24+
25+
const getCanTransfer = async () => {
26+
if (coin.symbol === "ETH") {
27+
setCanTransfer(true);
28+
return;
29+
}
30+
31+
const tokenContract = new ethers.Contract(
32+
coin.address,
33+
legos.erc20.abi,
34+
signer
35+
);
36+
37+
const allowance = await tokenContract.allowance(address, proxyAddress);
38+
39+
if (allowance.toString() === "0") {
40+
setCanTransfer(false);
41+
return;
42+
}
43+
44+
setCanTransfer(true);
45+
};
46+
47+
useEffect(() => {
48+
if (hasProxy) {
49+
getCanTransfer();
50+
}
51+
}, [proxy]);
52+
2053
return (
2154
<Box>
2255
{/* <Heading.h5 mb="2">Supply {coin.symbol}</Heading.h5> */}
2356
<Box mb="1">
24-
<Field label={`Amount of ${coin.symbol} to supply`}>
25-
<Input
26-
type="number"
27-
required={true}
28-
placeholder="1337"
29-
value={amount}
30-
onChange={(e) => setAmount(e.target.value.toString())}
31-
/>
57+
<Field required={true} label={`Amount of ${coin.symbol} to supply`}>
58+
{canTransfer === false || canTransfer === null ? (
59+
<Input required={true} type="hidden" />
60+
) : (
61+
<Input
62+
type="number"
63+
required={true}
64+
placeholder="1337"
65+
value={amount}
66+
onChange={(e) => setAmount(e.target.value.toString())}
67+
/>
68+
)}
3269
</Field>
3370
</Box>
34-
<Button
35-
ml={3}
36-
disabled={loading}
37-
onClick={async () => {
38-
setLoading(true);
39-
40-
const { dedgeCompoundManager } = contracts;
41-
const tx = await dedgeHelpers.compound.supplyThroughProxy(
42-
proxy,
43-
dedgeCompoundManager.address,
44-
coin.cTokenEquilaventAddress,
45-
ethers.utils.parseUnits(amount, coin.symbol === "USDC" ? 6 : 18)
46-
);
47-
window.toastProvider.addMessage(`Supplying ${coin.symbol}...`, {
48-
secondaryMessage: "Check progress on Etherscan",
49-
actionHref: `https://etherscan.io/tx/${tx.hash}`,
50-
actionText: "Check",
51-
variant: "processing",
52-
});
53-
await tx.wait()
54-
55-
window.toastProvider.addMessage(`Successfully supplied ${coin.symbol}!`, {
56-
variant: "success",
57-
});
58-
59-
setLoading(false);
60-
getBalances();
61-
}}
62-
>
63-
{loading ? (
64-
<Flex alignItems="center">
65-
<span>Supplying...</span> <Loader color="white" ml="2" />
66-
</Flex>
67-
) : (
68-
"Supply"
69-
)}
70-
</Button>
71+
{canTransfer === false || canTransfer === null ? (
72+
<Button
73+
ml={3}
74+
disabled={canTransfer || canTransfer === null}
75+
onClick={async () => {
76+
const maxUINT =
77+
"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";
78+
setTransferLoading(true);
79+
80+
const tokenContract = new ethers.Contract(
81+
coin.address,
82+
legos.erc20.abi,
83+
signer
84+
);
85+
86+
const tx = await tokenContract.approve(proxyAddress, maxUINT);
87+
window.toastProvider.addMessage(`Approving ${coin.symbol}...`, {
88+
secondaryMessage: "Check progress on Etherscan",
89+
actionHref: `https://etherscan.io/tx/${tx.hash}`,
90+
actionText: "Check",
91+
variant: "processing",
92+
});
93+
await tx.wait();
94+
95+
window.toastProvider.addMessage(
96+
`Successfully approved ${coin.symbol}!`,
97+
{
98+
variant: "success",
99+
}
100+
);
101+
102+
setTransferLoading(false);
103+
104+
getCanTransfer();
105+
}}
106+
>
107+
{canTransfer === null ? (
108+
<Flex alignItems="center">
109+
<span>Checking...</span> <Loader color="white" ml="2" />
110+
</Flex>
111+
) : transferLoading ? (
112+
<Flex alignItems="center">
113+
<span>Approving...</span> <Loader color="white" ml="2" />
114+
</Flex>
115+
) : (
116+
"Approve Transfer"
117+
)}
118+
</Button>
119+
) : (
120+
<Button
121+
ml={3}
122+
disabled={loading || !canTransfer}
123+
onClick={async () => {
124+
setLoading(true);
125+
126+
const { dedgeCompoundManager } = contracts;
127+
const tx = await dedgeHelpers.compound.supplyThroughProxy(
128+
proxy,
129+
dedgeCompoundManager.address,
130+
coin.cTokenEquilaventAddress,
131+
ethers.utils.parseUnits(amount, coin.symbol === "USDC" ? 6 : 18)
132+
);
133+
window.toastProvider.addMessage(`Supplying ${coin.symbol}...`, {
134+
secondaryMessage: "Check progress on Etherscan",
135+
actionHref: `https://etherscan.io/tx/${tx.hash}`,
136+
actionText: "Check",
137+
variant: "processing",
138+
});
139+
await tx.wait();
140+
141+
window.toastProvider.addMessage(
142+
`Successfully supplied ${coin.symbol}!`,
143+
{
144+
variant: "success",
145+
}
146+
);
147+
148+
setLoading(false);
149+
getBalances();
150+
}}
151+
>
152+
{loading ? (
153+
<Flex alignItems="center">
154+
<span>Supplying...</span> <Loader color="white" ml="2" />
155+
</Flex>
156+
) : (
157+
"Supply"
158+
)}
159+
</Button>
160+
)}
71161
</Box>
72162
);
73163
};

packages/scripts/supply.ts

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
import { getLegos, networkIds } from "money-legos";
2+
import {
3+
wallet,
4+
newERC20Contract,
5+
getTokenFromUniswapAndApproveProxyTransfer,
6+
} from "dedge-smart-contracts/test/common";
7+
import { dedgeHelpers } from "dedge-smart-contracts/helpers";
8+
import { ethers } from "ethers";
9+
10+
import {
11+
dacProxyFactoryAddress,
12+
dedgeCompoundManagerAddress,
13+
} from "dedge-smart-contracts/build/DeployedAddresses.json";
14+
15+
import dacProxyDef from "dedge-smart-contracts/build/DACProxy.json";
16+
import dacProxyFactoryDef from "dedge-smart-contracts/build/DACProxyFactory.json";
17+
18+
const legos = getLegos(networkIds.mainnet);
19+
const erc20Tokens = Object.keys(legos.erc20).filter((x) => x !== "abi");
20+
const cTokens = Object.keys(legos.compound).filter(
21+
(x) => x !== "cTokenAbi" && x !== "comptroller" && x[0] === "c"
22+
);
23+
24+
if (process.argv.length !== 5) {
25+
console.log(
26+
`ts-node supply.ts [${erc20Tokens.join("|")}] <amount> [${cTokens.join(
27+
"|"
28+
)}]`
29+
);
30+
process.exit(1);
31+
}
32+
33+
if (!erc20Tokens.includes(process.argv[2])) {
34+
console.log(
35+
`ts-node supply.ts ${erc20Tokens.join("|")}] <amount> [${cTokens.join(
36+
"|"
37+
)}]`
38+
);
39+
process.exit(1);
40+
}
41+
42+
if (!cTokens.includes(process.argv[4])) {
43+
console.log(
44+
`ts-node supply.ts ${erc20Tokens.join("|")}] <amount> [${cTokens.join(
45+
"|"
46+
)}]`
47+
);
48+
process.exit(1);
49+
}
50+
51+
const token = process.argv[2];
52+
const ctoken = process.argv[4];
53+
const amount = process.argv[3];
54+
const tokenAddress = legos.erc20[token].address;
55+
const cTokenEquilavent = legos.compound[ctoken].address;
56+
57+
const dacProxyFactoryContract = new ethers.Contract(
58+
dacProxyFactoryAddress,
59+
dacProxyFactoryDef.abi,
60+
wallet
61+
);
62+
63+
const main = async () => {
64+
console.log("Supplying....");
65+
let dacProxyAddress = await dacProxyFactoryContract.proxies(wallet.address);
66+
if (dacProxyAddress === "0x0000000000000000000000000000000000000000") {
67+
const cTokensToEnter = [
68+
legos.compound.cEther.address,
69+
legos.compound.cSAI.address,
70+
legos.compound.cDAI.address,
71+
legos.compound.cREP.address,
72+
legos.compound.cUSDC.address,
73+
legos.compound.cBAT.address,
74+
legos.compound.cZRX.address,
75+
legos.compound.cWBTC.address,
76+
];
77+
78+
console.log("Creating proxy address and entering market....");
79+
await dedgeHelpers.proxyFactory.buildAndEnterMarkets(
80+
dacProxyFactoryContract,
81+
dedgeCompoundManagerAddress,
82+
cTokensToEnter
83+
);
84+
dacProxyAddress = await dacProxyFactoryContract.proxies(wallet.address);
85+
}
86+
const dacProxyContract = new ethers.Contract(
87+
dacProxyAddress,
88+
dacProxyDef.abi,
89+
wallet
90+
);
91+
console.log("Getting tokens from uniswap");
92+
await getTokenFromUniswapAndApproveProxyTransfer(
93+
dacProxyAddress,
94+
tokenAddress,
95+
1
96+
);
97+
const amountWei = ethers.utils.parseUnits(amount, token === "usdc" ? 6 : 18);
98+
console.log("Approving erc20 transferFrom....");
99+
await newERC20Contract(tokenAddress).approve(
100+
dacProxyAddress,
101+
amountWei.toString(),
102+
{
103+
gasLimit: 4000000,
104+
}
105+
);
106+
console.log("supplying...");
107+
await dedgeHelpers.compound.supplyThroughProxy(
108+
dacProxyContract,
109+
dedgeCompoundManagerAddress,
110+
cTokenEquilavent,
111+
amountWei.toString()
112+
);
113+
};
114+
115+
main();

packages/smart-contracts/artifacts/DedgeCompoundManager.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20401,8 +20401,8 @@
2040120401
"1": {
2040220402
"events": {},
2040320403
"links": {},
20404-
"address": "0x16493dfB0281bA27C8B712f6Eb8eC32bcc50EAEc",
20405-
"transactionHash": "0x98046a27999965dfff9390719dec08d335b3f480fafa14249a17956afb392b36"
20404+
"address": "0xd219e1cad8cde8c46f2d923ace35a8e5b729a683",
20405+
"transactionHash": "0xfcdabce2ffc0b4b892e7338140eff3da4e6575bdfd2e8375f7064434767cedd4"
2040620406
}
2040720407
},
2040820408
"schemaVersion": "3.0.23",

packages/smart-contracts/artifacts/DeployedAddresses.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"dacProxyFactoryAddress": "0x572bfabaeb0f7F5d65EEa04D85595010756Ba986",
3-
"dedgeCompoundManagerAddress": "0x16493dfB0281bA27C8B712f6Eb8eC32bcc50EAEc",
3+
"dedgeCompoundManagerAddress": "0xd219e1cad8cde8c46f2d923ace35a8e5b729a683",
44
"dedgeMakerManagerAddress": "0x1C9c3ED6De13F423a4457aCCfa4e09bc436D5e89",
55
"dedgeExitManagerAddress": "0x81BFDCF729B5cAC3c4f1F906b63F26E5865b615B",
66
"dedgeGeneralManagerAddress": "0x40b4C8B5EE1FDd5259E40907E257f11819681b3d",

0 commit comments

Comments
 (0)