Closed BlinkyStitt closed 5 years ago
If I try to truffle debug $tx
, I get an error. Probably because the uniswap truffle artifacts only have the bytecode and nothing else in them.
Gathering transaction data...
TypeError: Cannot read property 'id' of undefined
at newScope.variables.concat.filter.variable (/usr/src/app/node_modules/truffle/build/webpack:/packages/truffle-debugger/dist/debugger.js:1738:1)
at Array.filter (<anonymous>)
at map (/usr/src/app/node_modules/truffle/build/webpack:/packages/truffle-debugger/dist/debugger.js:1735:1)
at Array.map (<anonymous>)
at data.info.scopes._ (/usr/src/app/node_modules/truffle/build/webpack:/packages/truffle-debugger/dist/debugger.js:1720:125)
at /usr/src/app/node_modules/truffle/build/webpack:/~/reselect/lib/index.js:76:1
at /usr/src/app/node_modules/truffle/build/webpack:/~/reselect/lib/index.js:36:1
at /usr/src/app/node_modules/truffle/build/webpack:/~/reselect/lib/index.js:90:1
at Function._ (/usr/src/app/node_modules/truffle/build/webpack:/~/reselect/lib/index.js:36:1)
at args (/usr/src/app/node_modules/truffle/build/webpack:/~/reselect-tree/index.js:209:1)
at /usr/src/app/node_modules/truffle/build/webpack:/~/reselect/lib/index.js:86:1
at Function._ (/usr/src/app/node_modules/truffle/build/webpack:/~/reselect/lib/index.js:36:1)
at args (/usr/src/app/node_modules/truffle/build/webpack:/~/reselect-tree/index.js:209:1)
at /usr/src/app/node_modules/truffle/build/webpack:/~/reselect/lib/index.js:86:1
at /usr/src/app/node_modules/truffle/build/webpack:/~/reselect/lib/index.js:36:1
at runSelectEffect (/usr/src/app/node_modules/truffle/build/webpack:/~/@redux-saga/core/dist/redux-saga-core.esm.js:723:1)
at runEffect (/usr/src/app/node_modules/truffle/build/webpack:/~/@redux-saga/core/dist/redux-saga-core.esm.js:1191:1)
at digestEffect (/usr/src/app/node_modules/truffle/build/webpack:/~/@redux-saga/core/dist/redux-saga-core.esm.js:1258:1)
at next (/usr/src/app/node_modules/truffle/build/webpack:/~/@redux-saga/core/dist/redux-saga-core.esm.js:1148:1)
at currCb (/usr/src/app/node_modules/truffle/build/webpack:/~/@redux-saga/core/dist/redux-saga-core.esm.js:1238:1)
at checkEnd (/usr/src/app/node_modules/truffle/build/webpack:/~/@redux-saga/core/dist/chunk-585b854f.js:154:1)
at chCbAtKey (/usr/src/app/node_modules/truffle/build/webpack:/~/@redux-saga/core/dist/chunk-585b854f.js:170:1)
at Object.currCb [as cont] (/usr/src/app/node_modules/truffle/build/webpack:/~/@redux-saga/core/dist/redux-saga-core.esm.js:1238:1)
at end (/usr/src/app/node_modules/truffle/build/webpack:/~/@redux-saga/core/dist/redux-saga-core.esm.js:1001:1)
at Object.task.cont (/usr/src/app/node_modules/truffle/build/webpack:/~/@redux-saga/core/dist/redux-saga-core.esm.js:829:1)
at next (/usr/src/app/node_modules/truffle/build/webpack:/~/@redux-saga/core/dist/redux-saga-core.esm.js:1157:1)
at Object.currCb [as cont] (/usr/src/app/node_modules/truffle/build/webpack:/~/@redux-saga/core/dist/redux-saga-core.esm.js:1238:1)
at end (/usr/src/app/node_modules/truffle/build/webpack:/~/@redux-saga/core/dist/redux-saga-core.esm.js:1001:1)
The above error occurred in task session.saga
Tasks cancelled due to error:
controller.saga
data.saga
evm.saga
solidity.saga
trace.saga
web3.saga
What happens if you set minLiquidity to 1?
Also if your eth balance and token balance are both 1000, maybe send less than 1000 (like 500 of each).
Also the abi is likely giving you issues b/c of vyper unit types that solidity doesnt have.
Similar but not exactly the same error with minLiquidity of 1:
Error: Returned error: VM Exception while processing transaction: invalid JUMP at 377780708130f00ef852fcc086eded95c7eb0e896d0eb49c8c2fd4879bfdf303/014e15cbb300f9408e2886949053208fc5e07cd5:39
The eth and token balances far exceed 1000, so that isn’t the issue, but I will change the test to check for headroom.
I think I can get by using the abi of my solidity interface instead of the abi that is checked into the repo. My interface has worked for all the tests except addLiquidity so it’s at least mostly right. Am I doing the contract initialization correctly?
I’ve had to track down reverts in other code, but haven’t had to debut a JUMP before. What does the error even mean?
Your deploy order seems to be good.
The JUMP error is a Vyper bug. Basically Uniswap uses Vypers create_with_code_of()
which was created before the REVERT opcode was added. It sets up a new contract with a delegatecall pattern to a library contract.
Unfortunately when REVERT was added, create_with_code_of()
fell through the cracks so if a call fails on a proxy delegatecall contract created with this function, it throws by doing an invalid jump.
But yeah something is causing the addLiquidity function to fail.
Try calling tutorialTokenUniswapInstance.factoryAddress()
and tutorialTokenUniswapInstance.tokenAddress()
and make sure it outputs the expected addresses.
Do you have any tests for the tutorial token to make sure thats working?
I do call factoryAddress
and tokenAddress
in the should have a pool for TutorialToken
test and it passes.
I have some tests on TutorialToken, but I’ll add some more. I’m using open zeppelin, so that stuff should all be up to standards.
On Feb 23, 2019, at 1:09 PM, Hayden Adams notifications@github.com wrote:
Your deploy order seems to be good.
The JUMP error is a Vyper bug. Basically Uniswap uses Vypers create_with_code_of() which was created before the REVERT opcode was added. It sets up a new contract with a delegatecall pattern to a library contract.
Unfortunately when REVERT was added, create_with_code_of() fell through the cracks so if a call fails on a proxy delegatecall contract created with this function, it throws by doing an invalid jump.
But yeah something is causing the addLiquidity function to fail.
Try calling tutorialTokenUniswapInstance.factoryAddress() and tutorialTokenUniswapInstance.tokenAddress() and make sure it outputs the expected addresses.
Do you have any tests for the tutorial token to make sure thats working?
— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub, or mute the thread.
This is my TutorialToken.sol. It is pretty simple so I doubt I've added any bugs here.
pragma solidity 0.5.4;
import "openzeppelin-solidity/contracts/token/ERC20/ERC20.sol";
contract TutorialToken is ERC20 {
string public name = "TutorialToken";
string public symbol = "TT";
uint8 public decimals = 18;
uint public INITIAL_SUPPLY = 1000000000000;
constructor() public {
_mint(msg.sender, INITIAL_SUPPLY);
}
}
@WyseNynja I figured it out.
https://github.com/Uniswap/contracts-vyper/blob/master/contracts/uniswap_exchange.vy#L65
First liquidity provider needs to add at least 1000000000 wei to the contract.
Thank you!! Will change that when I get home and test it out
On Feb 24, 2019, at 11:10 AM, Hayden Adams notifications@github.com wrote:
@WyseNynja I figured it out.
https://github.com/Uniswap/contracts-vyper/blob/master/contracts/uniswap_exchange.vy#L65
First liquidity provider needs to add at least 1000000000 wei to the contract.
— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub, or mute the thread.
Fo sho lmk if there are still issues
New test:
it("... should add some TutorialToken to the Uniswap pool", async () => {
await UniswapExchange.deployed();
await UniswapFactory.deployed();
const uniswapFactoryInstance = await IUniswapFactory.at(UniswapFactory.address);
const tutorialTokenInstance = await TutorialToken.deployed();
const tutorialTokenUniswapAddress = await uniswapFactoryInstance.getExchange(TutorialToken.address);
await tutorialTokenInstance.approve(tutorialTokenUniswapAddress, 1500000000);
const tutorialTokenUniswapInstance = await IUniswapExchange.at(tutorialTokenUniswapAddress);
const balanceETH = web3.utils.toBN(await web3.eth.getBalance(accounts[0]));
assert(balanceETH.gt(1500000000));
const balanceTT = await tutorialTokenInstance.balanceOf(accounts[0]);
assert.isAtLeast(balanceTT.toNumber(), 1500000000);
const current_block = await web3.eth.getBlock(await web3.eth.getBlockNumber());
await tutorialTokenUniswapInstance.addLiquidity(1000000000, 1000000000, current_block.timestamp + 300, {value: 1000000000});
});
Sweet success:
Contract: uniswap_factory
✓ ... should be initializable through the interface (356200 gas)
✓ ... should have a pool for TutorialToken (250727 gas)
✓ ... should add some TutorialToken to the Uniswap pool (155332 gas)
@haydenadams any reason why 1000000000 wei was chosen? Out of pure curiosity :)
Thanks a lot @WyseNynja @haydenadams , this saved my day!
I'm trying to interact with uniswap through a truffle contract written in solidity 0.5.4. I have
truffle migrate
able to deploy the contract bytecode that is checked into the repo. The abi is giving me issues, but I've worked around that for now (https://github.com/trufflesuite/truffle/issues/1623). I have a test that AFAICT is successfully initializing the contract and setting up an exchange for a test ERC20 token. However, when I try to add liquidity, I get "invalid JUMP".To ease debugging this, I should probably just push my whole repo up to GitHub, but I wasn't wanting to open source it just yet.
Here are some relevant pieces:
IUniswapExchange.sol
IUniswapFactory.sol
test/uniswap.js
: