Long Tail contracts
Long Tail is Arbitrum's cheapest and most rewarding AMM.
Deployments
Superposition Testnet
AMM contract deployments
Deployment name | Deployment address |
---|---|
Long Tail AMM | 0x839c5cf32d9Bc2CD46027691d2941410251ED557 |
Long Tail NFT manager | 0xC96F6A050382d4aA73fd91f7A4D02aB8E5654338 |
Useful testing token deployments
Deployment name | Deployment address |
---|---|
fUSDC | 0xA8EA92c819463EFbEdDFB670FEfC881A480f0115 |
WETH | 0xde104342B32BCa03ec995f999181f7Cf1fFc04d7 |
USDC | 0x6437fdc89cED41941b97A9f1f8992D88718C81c5 |
WSPN | 0x22b9fa698b68bBA071B513959794E9a47d19214c |
Access graph
A publicly available graph for Superposition Testnet is available. It includes documentation. https://testnet-graph.long.so.
Errors
Currently, to save on space, errors generated by the contract are terse. Decode the hex to the appropriate error in this table:
No | Hex | Explanation |
---|---|---|
0 | 0x00 | Denominator is 0 |
1 | 0x01 | Result is U256::MAX |
2 | 0x02 | Sqrt price is 0 |
3 | 0x03 | Sqrt price is less than or equal to quotient |
4 | 0x04 | Can not get most significant bit or least significant bit on zero value |
5 | 0x05 | Liquidity is 0 |
6 | 0x06 | require((product = amount * sqrtPX96) / amount == sqrtPX96 && numerator1 > product); |
7 | 0x07 | Denominator is less than or equal to prod_1 |
8 | 0x08 | Liquidity Sub |
9 | 0x09 | Liquidity Add |
10 | 0x0a | The given tick must be less than, or equal to, the maximum tick |
11 | 0x0b | Second inequality must be < because the price can never reach the price at the max tick |
12 | 0x0c | Overflow when casting to U160 |
13 | 0x0d | Liquidity higher than max |
14 | 0x0e | Fee growth sub overflow |
15 | 0x0f | ERC20 call reverted |
16 | 0x10 | ERC20 call reverted with no data |
17 | 0x11 | Pool is already initialised |
18 | 0x12 | Contract is already initialised |
19 | 0x13 | Price limit too high |
20 | 0x14 | Price limit too low |
21 | 0x15 | Checked abs called on an unexpected positive number |
22 | 0x16 | Checked abs called on an unexpected negative number |
23 | 0x17 | Checked abs called on uint.min |
24 | 0x18 | Fee result too high |
25 | 0x19 | Swap result too high |
26 | 0x1a | Internal swap amounts not matched |
27 | 0x1b | Internal swap result was positive |
28 | 0x1c | Minimum out not reached |
29 | 0x1d | Only the position owner can use this |
30 | 0x1e | Only the NFT manager can use this |
31 | 0x1f | Only the Seawater admin can use this |
32 | 0x20 | Operation unavailable when the pool is disabled |
If more bytes are in the error, then the issue was produced by the ERC20 token. Convert any error types to their keccak form to see. For example, an allowance error might be hard to unpack, and it'll be several bytes.g
Security
Contributors
Building
Superposition AMM is a diamond-like contract, with the frontend to access the Stylus diamond facets implemented in Solidity. So, Stylus is needed with Rust for the implementation contracts, and Foundry is needed to compile the contract.
To save on contract size, and to reduce gas overhead, this contract stores the addresses of the swap router, and the admin address, at compile-time.
So these variables must set at compile-time, like so:
Build variables
Name | Description |
---|---|
FLU_SEAWATER_PERMIT2_ADDR | Uniswap Permit2 router |
FLU_SEAWATER_FUSDC_ADDR | USDC Super Asset to route every trade through |
Build dependencies
Name | Source |
---|---|
Rust (nightly version) | Installer |
Cargo Stylus subcommand | Repo |
Foundry | Installer |
Make | build-essentials if you're on Linux |
Build process
make build
Testing
Testing is done either on-chain with the live Ethers-powered environment (at the time of writing, there is no native on-chain testing with a forking suite), or via a hosted test using cargo features with the testing flag.
Testing dependencies
Testing the local environment using Ethers is the process of:
- Deploying a local Stylus testnode.
- Running the ethers test suite.
Running the Ethers test suite is as simple as running ./tests.sh
,
which will also run tests on the host environment with stubbed out ERC20.
Running a local testnode
- Clone the Nitro repo with submodules
on the
stylus
branch. - Run the testing script
./test-node.bash --init
. This will run the Stylus suite using Docker Compose, and make it available locally.
Testing process
./tests.sh
Cargo test tracing
Some of the cargo tests have optional logging, which might help with debugging. To see
these logs, enable the testing-dbg-<test>
feature and run the tests without capturing stdout, ie cargo test --features=testing,testing-dbg-erc20 -- --nocapture
.
Testing tools are available with the with_storage
macro, which lets you set slots and
maximum balances for ERC20 transfers. Reproducing on-chain transactions is possible by
using a tracer on the chain the transaciton took place, then examining the storage slots
that were accessed (perhaps by looking at SLOAD
s), and setting it explicitly with the
macro.
Deployment
You can deploy the contracts using the deploy.sh
script.
Test deployments
Deployments on a local node can be done with ./test-deploy.sh
for simplicity.
Deployment variables
Name | Description |
---|---|
SEAWATER_PROXY_ADMIN | Address that's permitted to administrate the code, including deploying updates, and creating pools. |
STYLUS_ENDPOINT | URL to access the Stylus node. |
STYLUS_PRIVATE_KEY | Private key to use for deployment. |
FLU_SEAWATER_FUSDC_ADDR | Super USDC address to use as the base asset for each pool. |