Compare commits
1 Commits
f475ea0894
...
precompute
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dc7df27676 |
2
.gitignore
vendored
2
.gitignore
vendored
@@ -5,7 +5,7 @@
|
|||||||
/.env
|
/.env
|
||||||
/.env-*
|
/.env-*
|
||||||
/.idea/
|
/.idea/
|
||||||
package-lock.json
|
|
||||||
/broadcast
|
/broadcast
|
||||||
|
|
||||||
*secret*
|
*secret*
|
||||||
|
|||||||
@@ -1,3 +0,0 @@
|
|||||||
Copyright ©2025 Dexorder LLC. All rights reserved.
|
|
||||||
|
|
||||||
No license is provided. This source code is viewable for verification purposes only.
|
|
||||||
85
README.md
85
README.md
@@ -1,85 +0,0 @@
|
|||||||
# Introduction
|
|
||||||
|
|
||||||
[Liquidity Party](https://liquidity.party) is a new game-theoretic multi-asset AMM based on this research paper:
|
|
||||||
|
|
||||||
[Logarithmic Market Scoring Rules for Modular Combinatorial Information Aggregation](https://mason.gmu.edu/~rhanson/mktscore.pdf) (R. Hanson, 2002)
|
|
||||||
|
|
||||||
Our formulation and implementation is described in the [Liquidity Party whitepaper.](doc/whitepaper.md)
|
|
||||||
|
|
||||||
A Logarithmic Market Scoring Rule (LMSR) is a pricing formula for AMM's that know only their current asset inventories
|
|
||||||
and no other information, naturally supporting multi-asset pools.
|
|
||||||
|
|
||||||
Compared to Constant Product markets, LMSR offers:
|
|
||||||
|
|
||||||
1. Less slippage than Constant Product for small and medium trade sizes
|
|
||||||
2. N-asset pools for trading long-tail pairs in a single hop
|
|
||||||
3. Lower fees (smaller spread)
|
|
||||||
|
|
||||||
|
|
||||||
## Deeper Liquidity
|
|
||||||
|
|
||||||
According to game theory, the initial price slope of a Constant Product AMM is too steep, overcharging takers
|
|
||||||
with too much slippage at small and medium trade sizes. LMSR pools offer less slippage and cheaper
|
|
||||||
liquidity for the small and medium trade sizes used by real traders.
|
|
||||||
|
|
||||||
|
|
||||||
## Multi-asset
|
|
||||||
|
|
||||||
Naturally multi-asset, Liquidity Party altcoin pools provide direct, one-hop swaps on otherwise illiquid multi-hop pairs. Pools will quote any pair combination available in the pool:
|
|
||||||
|
|
||||||
| Assets | Pairs | Swap Gas | Mint Gas |
|
|
||||||
|-------:|------:|---------:|----------:|
|
|
||||||
| 2 | 1 | 131,000 | 143,000 |
|
|
||||||
| 2* | 1 | 118,000 | 143,000 |
|
|
||||||
| 10 | 45 | 142,000 | 412,000 |
|
|
||||||
| 20 | 190 | 157,000 | 749,000 |
|
|
||||||
| 50 | 1225 | 199,000 | 1,760,000 |
|
|
||||||
| 100 | 4950 | 269,000 | 2,684,000 |
|
|
||||||
|
|
||||||
\* Stablecoin pair pool optimization
|
|
||||||
|
|
||||||
Liquidity Party aggregates scarce, low market cap assets into a single pool, providing one-hop liquidity for exotic pairs without fragmenting LP assets. CP pools would need 190x the LP assets to provide the same pairwise liquidity as a single 20-asset Liquidity Party pool, due to asset fragmentation.
|
|
||||||
|
|
||||||
## Lower Fees
|
|
||||||
|
|
||||||
Since market makers offer the option to take either side of the market, they must receive a subsidy or charge a fee (spread) to compensate for adverse selection (impermanent loss). By protecting LP's against common value-extraction scenarios, LMSR pools have a reduced risk premium resulting in lower fees for takers.
|
|
||||||
|
|
||||||
### Minimized Impermanent Loss
|
|
||||||
All AMM's suffer from Impermanent Loss (IL), also known as adverse selection or toxic order flow. Liquidity
|
|
||||||
Party uses game theory to minimize IL for LPs, by charging lower fees to small legitimate traders and
|
|
||||||
higher fees to large adversarial traders during market dislocations. This means a higher effective rate
|
|
||||||
for LP's and cheaper swaps for legitimate small traders.
|
|
||||||
|
|
||||||
Liquidity Party swaps guarantee a bounded maximum loss to LP's of `κ\*S\*ln(N)` where `κ` is
|
|
||||||
the pool's liquidity parameter, `S` is the total size of the pool, and `N` is the
|
|
||||||
number of assets in the pool.
|
|
||||||
|
|
||||||
### No Intra-Pool Arbitrage
|
|
||||||
Other multi-asset systems can provide inconsistent price quotes, allowing arbitragers to
|
|
||||||
extract value from LP's by _trading assets inside the same pool against each other._ With Liquidity
|
|
||||||
Party, no intra-pool arbitrage is possible, because the mathematics guarantee fully consistent price
|
|
||||||
quotes on all pairs in the pool.
|
|
||||||
|
|
||||||
# Installation
|
|
||||||
|
|
||||||
1. Install [Foundry](https://getfoundry.sh/) development framework.
|
|
||||||
2. Update dependencies with `forge install`
|
|
||||||
3. Run `bin/mock` to launch a test environment running under `anvil` on `localhost:8545`. The mock environment will create several example pools along with mock ERC20 tokens that can be minted by anyone in any amount.
|
|
||||||
|
|
||||||
# Integration
|
|
||||||
|
|
||||||
Deployment addresses for each chain may be found in `deployment/liqp-deployments.json`, and the `solc` output including ABI information is stored under `deployment/{chain_id}/v1/...`
|
|
||||||
|
|
||||||
The primary entrypoint for all Liquidity Party actions is the [PartyPlanner](src/IPartyPlanner.sol) contract, which is a singleton per chain. The `PartyPlanner` contract not only deploys new pools but also indexes the pools and their tokens for easy metadata discovery. After a pool is created or discovered using the `PartyPlanner`, it can be used to perform swaps, minting, and other actions according to the [IPartyPool](src/IPartyPlanner.sol) interface. Due to contract size limitations, most view methods for prices and swaps are available from a separate singleton contract, the [PartyPoolViewer](src/IPartyPoolViewer.sol).
|
|
||||||
|
|
||||||
|
|
||||||
# Implementation Notes
|
|
||||||
|
|
||||||
## Non-upgradable Proxy
|
|
||||||
Due to contract size constraints, the `PartyPool` contract uses `DELEGATECALL` to invoke implementations on the singleton [PartyPoolSwapImpl](src/PartyPoolSwapImpl.sol) and [PartyPoolMintImpl](src/PartyPoolMintImpl.sol) contracts. This proxy pattern is NOT upgradable and the implementation contract addresses used by the pool are immutable. Views implemented in `PartyPoolViewer` have no delegation but simply accept the target pool as an argument, calculating prices etc. from public getters.
|
|
||||||
|
|
||||||
## Admin-Only Deployment
|
|
||||||
`PartyPlanner` allows only the admin to deploy new pools. This decision was made because Liquidity Party is a new protocol that does not support non-standard tokens such as fee-on-transfer tokens or rebasing tokens, and the selection of the `kappa` liquidity parameter is not straightforward for an average user. We hope to offer a version of Liquidity Party in the future that allows regular users to create their pools.
|
|
||||||
|
|
||||||
## Killable Contracts
|
|
||||||
PartyPools may be "killed" by their admin, in which case all swaps and mints are disabled, and the only modifying function allowed to be called is `burn()` to allow LP's to safely withdraw their funds. Killing is irreversible and intended to be used as a last-ditch safety measure in case a critical vulnerablility is discovered.
|
|
||||||
29
bin/mock
29
bin/mock
@@ -4,29 +4,25 @@
|
|||||||
# Dev account #4
|
# Dev account #4
|
||||||
PRIVATE_KEY=0x47e179ec197488593b187f80a00eb0da91f1b9d0b13f8733639f19c30a34926a
|
PRIVATE_KEY=0x47e179ec197488593b187f80a00eb0da91f1b9d0b13f8733639f19c30a34926a
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
# Function to cleanup processes
|
# Function to cleanup processes
|
||||||
cleanup() {
|
cleanup() {
|
||||||
if [[ -n "${ANVIL_PID:-}" ]] && kill -0 "$ANVIL_PID" 2>/dev/null; then
|
kill $ANVIL_PID 2>/dev/null
|
||||||
kill "$ANVIL_PID" 2>/dev/null || true
|
|
||||||
sleep 0.2
|
|
||||||
kill -9 "$ANVIL_PID" 2>/dev/null || true
|
|
||||||
fi
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# Ensure cleanup on any exit
|
err() {
|
||||||
|
cleanup
|
||||||
|
exit $1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Set up trap to handle script exit
|
||||||
trap cleanup EXIT
|
trap cleanup EXIT
|
||||||
# On Ctrl-C or TERM: exit immediately (will trigger EXIT trap -> cleanup)
|
|
||||||
trap 'exit 130' INT
|
|
||||||
trap 'exit 143' TERM
|
|
||||||
|
|
||||||
# Create log directory if it doesn't exist
|
# Create log directory if it doesn't exist
|
||||||
mkdir -p log
|
mkdir -p log
|
||||||
|
|
||||||
# Run anvil in background and redirect output to log file
|
# Run anvil in background and redirect output to log file
|
||||||
# shellcheck disable=SC2086
|
# shellcheck disable=SC2086
|
||||||
anvil --disable-block-gas-limit | tee log/anvil.txt &
|
anvil | tee log/anvil.txt &
|
||||||
ANVIL_PID=$!
|
ANVIL_PID=$!
|
||||||
|
|
||||||
# Function to check if string exists in file
|
# Function to check if string exists in file
|
||||||
@@ -47,13 +43,14 @@ while ! check_string "Listening on" "log/anvil.txt"; do
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
forge script --private-key ${PRIVATE_KEY} DeployMock --fork-url http://localhost:8545 --broadcast "$@" || exit 1
|
forge script --private-key ${PRIVATE_KEY} DeployMock --fork-url http://localhost:8545 --broadcast "$@" || err 1
|
||||||
|
|
||||||
if [ "${1:-}" = "slow" ]; then
|
if [ "$1" = "slow" ]; then
|
||||||
echo "SLOW MODE: Setting mining mode to 12-second intervals."
|
echo "SLOW MODE: Setting mining mode to 12-second intervals."
|
||||||
cast rpc evm_setIntervalMining 12
|
cast rpc evm_setIntervalMining 12
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Press Ctrl+C to exit..."
|
echo "Press Ctrl+C to exit..."
|
||||||
# Wait for the anvil process; Ctrl-C will interrupt 'wait' and trigger cleanup via traps
|
while true; do
|
||||||
wait "$ANVIL_PID"
|
sleep 1
|
||||||
|
done
|
||||||
|
|||||||
@@ -3,13 +3,6 @@
|
|||||||
CHAINID=11155111
|
CHAINID=11155111
|
||||||
DEPLOY_SCRIPT=DeploySepolia
|
DEPLOY_SCRIPT=DeploySepolia
|
||||||
|
|
||||||
if [ -f ".env-secret" ]; then
|
|
||||||
echo "Reading environment from .env-secret"
|
|
||||||
set -a
|
|
||||||
source .env-secret
|
|
||||||
set +a
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -z "$SEPOLIA_RPC_URL" ]; then
|
if [ -z "$SEPOLIA_RPC_URL" ]; then
|
||||||
echo "Usage: SEPOLIA_RPC_URL environment variable must be set"
|
echo "Usage: SEPOLIA_RPC_URL environment variable must be set"
|
||||||
exit 1
|
exit 1
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
{"abi":[{"type":"error","name":"AddressEmptyCode","inputs":[{"name":"target","type":"address","internalType":"address"}]}],"bytecode":{"object":"0x6080806040523460175760399081601c823930815050f35b5f80fdfe5f80fdfea2646970667358221220eb0570070fec78251db3fa24b17454c9bec7df5e60c2499d03d66c5c28208ff764736f6c634300081e0033","sourceMap":"282:6520:27:-:0;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x5f80fdfea2646970667358221220eb0570070fec78251db3fa24b17454c9bec7df5e60c2499d03d66c5c28208ff764736f6c634300081e0033","sourceMap":"282:6520:27:-:0;;","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"}],\"devdoc\":{\"details\":\"Collection of functions related to the address type\",\"errors\":{\"AddressEmptyCode(address)\":[{\"details\":\"There's no code at `target` (it is not a contract).\"}]},\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/openzeppelin-contracts/contracts/utils/Address.sol\":\"Address\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"remappings\":[\":@abdk/=lib/abdk-libraries-solidity/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":abdk-libraries-solidity/=lib/abdk-libraries-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/utils/Address.sol\":{\"keccak256\":\"0xd274645d15bb7e4fcb9c833e401b2c5837404f90057f11a49118f25e0af7c76f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d38e0b997bb7aebae26d190b03d0991feb0d204c45f945e60014e1ca9175de69\",\"dweb:/ipfs/QmWzsUHHAZcjMyF8uMDEtNpMTkYZdQrfvdKPobXvwVHKo6\"]},\"lib/openzeppelin-contracts/contracts/utils/Errors.sol\":{\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ba1d02f4847670a1b83dec9f7d37f0b0418d6043447b69f3a29a5f9efc547fcf\",\"dweb:/ipfs/QmQ7iH2keLNUKgq2xSWcRmuBE5eZ3F5whYAkAGzCNNoEWB\"]},\"lib/openzeppelin-contracts/contracts/utils/LowLevelCall.sol\":{\"keccak256\":\"0x50e81a8b089e3f382b6c915aa0166773de64ea4756e8f9479d9943a5f956ddf5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bfeb96a150537222e2191c03887127499a4f21dfb5f9a7211da4d81749b52848\",\"dweb:/ipfs/QmYR75ECbsBuxSiXmGvGfNKJRLoK5MdLUZL1bd8SixzxL4\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"target","type":"address"}],"type":"error","name":"AddressEmptyCode"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@abdk/=lib/abdk-libraries-solidity/","@openzeppelin/=lib/openzeppelin-contracts/","abdk-libraries-solidity/=lib/abdk-libraries-solidity/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":100000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/openzeppelin-contracts/contracts/utils/Address.sol":"Address"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"lib/openzeppelin-contracts/contracts/utils/Address.sol":{"keccak256":"0xd274645d15bb7e4fcb9c833e401b2c5837404f90057f11a49118f25e0af7c76f","urls":["bzz-raw://d38e0b997bb7aebae26d190b03d0991feb0d204c45f945e60014e1ca9175de69","dweb:/ipfs/QmWzsUHHAZcjMyF8uMDEtNpMTkYZdQrfvdKPobXvwVHKo6"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Errors.sol":{"keccak256":"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123","urls":["bzz-raw://ba1d02f4847670a1b83dec9f7d37f0b0418d6043447b69f3a29a5f9efc547fcf","dweb:/ipfs/QmQ7iH2keLNUKgq2xSWcRmuBE5eZ3F5whYAkAGzCNNoEWB"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/LowLevelCall.sol":{"keccak256":"0x50e81a8b089e3f382b6c915aa0166773de64ea4756e8f9479d9943a5f956ddf5","urls":["bzz-raw://bfeb96a150537222e2191c03887127499a4f21dfb5f9a7211da4d81749b52848","dweb:/ipfs/QmYR75ECbsBuxSiXmGvGfNKJRLoK5MdLUZL1bd8SixzxL4"],"license":"MIT"}},"version":1},"id":27}
|
{"abi":[{"type":"error","name":"AddressEmptyCode","inputs":[{"name":"target","type":"address","internalType":"address"}]}],"bytecode":{"object":"0x6080806040523460175760399081601c823930815050f35b5f80fdfe5f80fdfea2646970667358221220eb0570070fec78251db3fa24b17454c9bec7df5e60c2499d03d66c5c28208ff764736f6c634300081e0033","sourceMap":"282:6520:33:-:0;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x5f80fdfea2646970667358221220eb0570070fec78251db3fa24b17454c9bec7df5e60c2499d03d66c5c28208ff764736f6c634300081e0033","sourceMap":"282:6520:33:-:0;;","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"}],\"devdoc\":{\"details\":\"Collection of functions related to the address type\",\"errors\":{\"AddressEmptyCode(address)\":[{\"details\":\"There's no code at `target` (it is not a contract).\"}]},\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/openzeppelin-contracts/contracts/utils/Address.sol\":\"Address\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"remappings\":[\":@abdk/=lib/abdk-libraries-solidity/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":abdk-libraries-solidity/=lib/abdk-libraries-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/utils/Address.sol\":{\"keccak256\":\"0xd274645d15bb7e4fcb9c833e401b2c5837404f90057f11a49118f25e0af7c76f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d38e0b997bb7aebae26d190b03d0991feb0d204c45f945e60014e1ca9175de69\",\"dweb:/ipfs/QmWzsUHHAZcjMyF8uMDEtNpMTkYZdQrfvdKPobXvwVHKo6\"]},\"lib/openzeppelin-contracts/contracts/utils/Errors.sol\":{\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ba1d02f4847670a1b83dec9f7d37f0b0418d6043447b69f3a29a5f9efc547fcf\",\"dweb:/ipfs/QmQ7iH2keLNUKgq2xSWcRmuBE5eZ3F5whYAkAGzCNNoEWB\"]},\"lib/openzeppelin-contracts/contracts/utils/LowLevelCall.sol\":{\"keccak256\":\"0x50e81a8b089e3f382b6c915aa0166773de64ea4756e8f9479d9943a5f956ddf5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bfeb96a150537222e2191c03887127499a4f21dfb5f9a7211da4d81749b52848\",\"dweb:/ipfs/QmYR75ECbsBuxSiXmGvGfNKJRLoK5MdLUZL1bd8SixzxL4\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"target","type":"address"}],"type":"error","name":"AddressEmptyCode"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@abdk/=lib/abdk-libraries-solidity/","@openzeppelin/=lib/openzeppelin-contracts/","abdk-libraries-solidity/=lib/abdk-libraries-solidity/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":100000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/openzeppelin-contracts/contracts/utils/Address.sol":"Address"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"lib/openzeppelin-contracts/contracts/utils/Address.sol":{"keccak256":"0xd274645d15bb7e4fcb9c833e401b2c5837404f90057f11a49118f25e0af7c76f","urls":["bzz-raw://d38e0b997bb7aebae26d190b03d0991feb0d204c45f945e60014e1ca9175de69","dweb:/ipfs/QmWzsUHHAZcjMyF8uMDEtNpMTkYZdQrfvdKPobXvwVHKo6"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Errors.sol":{"keccak256":"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123","urls":["bzz-raw://ba1d02f4847670a1b83dec9f7d37f0b0418d6043447b69f3a29a5f9efc547fcf","dweb:/ipfs/QmQ7iH2keLNUKgq2xSWcRmuBE5eZ3F5whYAkAGzCNNoEWB"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/LowLevelCall.sol":{"keccak256":"0x50e81a8b089e3f382b6c915aa0166773de64ea4756e8f9479d9943a5f956ddf5","urls":["bzz-raw://bfeb96a150537222e2191c03887127499a4f21dfb5f9a7211da4d81749b52848","dweb:/ipfs/QmYR75ECbsBuxSiXmGvGfNKJRLoK5MdLUZL1bd8SixzxL4"],"license":"MIT"}},"version":1},"id":33}
|
||||||
@@ -1 +1 @@
|
|||||||
{"abi":[],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Provides information about the current execution context, including the sender of the transaction and its data. While these are generally available via msg.sender and msg.data, they should not be accessed in such a direct manner, since when dealing with meta-transactions the account sending and paying for execution may not be the actual sender (as far as an application is concerned). This contract is only required for intermediate, library-like contracts.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":\"Context\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"remappings\":[\":@abdk/=lib/abdk-libraries-solidity/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":abdk-libraries-solidity/=lib/abdk-libraries-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@abdk/=lib/abdk-libraries-solidity/","@openzeppelin/=lib/openzeppelin-contracts/","abdk-libraries-solidity/=lib/abdk-libraries-solidity/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":100000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/openzeppelin-contracts/contracts/utils/Context.sol":"Context"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"lib/openzeppelin-contracts/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"],"license":"MIT"}},"version":1},"id":28}
|
{"abi":[],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Provides information about the current execution context, including the sender of the transaction and its data. While these are generally available via msg.sender and msg.data, they should not be accessed in such a direct manner, since when dealing with meta-transactions the account sending and paying for execution may not be the actual sender (as far as an application is concerned). This contract is only required for intermediate, library-like contracts.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":\"Context\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"remappings\":[\":@abdk/=lib/abdk-libraries-solidity/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":abdk-libraries-solidity/=lib/abdk-libraries-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@abdk/=lib/abdk-libraries-solidity/","@openzeppelin/=lib/openzeppelin-contracts/","abdk-libraries-solidity/=lib/abdk-libraries-solidity/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":100000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/openzeppelin-contracts/contracts/utils/Context.sol":"Context"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"lib/openzeppelin-contracts/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"],"license":"MIT"}},"version":1},"id":34}
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
{"abi":[{"type":"error","name":"FailedCall","inputs":[]},{"type":"error","name":"FailedDeployment","inputs":[]},{"type":"error","name":"InsufficientBalance","inputs":[{"name":"balance","type":"uint256","internalType":"uint256"},{"name":"needed","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"MissingPrecompile","inputs":[{"name":"","type":"address","internalType":"address"}]}],"bytecode":{"object":"0x6080806040523460175760399081601c823930815050f35b5f80fdfe5f80fdfea2646970667358221220c9655ed21113d5fdaf6c566485d35a2aaf2bf242b1c753a1cac998424bd77b5d64736f6c634300081e0033","sourceMap":"411:484:29:-:0;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x5f80fdfea2646970667358221220c9655ed21113d5fdaf6c566485d35a2aaf2bf242b1c753a1cac998424bd77b5d64736f6c634300081e0033","sourceMap":"411:484:29:-:0;;","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedDeployment\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"MissingPrecompile\",\"type\":\"error\"}],\"devdoc\":{\"details\":\"Collection of common custom errors used in multiple contracts IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library. It is recommended to avoid relying on the error API for critical functionality. _Available since v5.1._\",\"errors\":{\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"FailedDeployment()\":[{\"details\":\"The deployment failed.\"}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"MissingPrecompile(address)\":[{\"details\":\"A necessary precompile is missing.\"}]},\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/openzeppelin-contracts/contracts/utils/Errors.sol\":\"Errors\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"remappings\":[\":@abdk/=lib/abdk-libraries-solidity/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":abdk-libraries-solidity/=lib/abdk-libraries-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/utils/Errors.sol\":{\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ba1d02f4847670a1b83dec9f7d37f0b0418d6043447b69f3a29a5f9efc547fcf\",\"dweb:/ipfs/QmQ7iH2keLNUKgq2xSWcRmuBE5eZ3F5whYAkAGzCNNoEWB\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[{"inputs":[],"type":"error","name":"FailedCall"},{"inputs":[],"type":"error","name":"FailedDeployment"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"type":"error","name":"InsufficientBalance"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"type":"error","name":"MissingPrecompile"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@abdk/=lib/abdk-libraries-solidity/","@openzeppelin/=lib/openzeppelin-contracts/","abdk-libraries-solidity/=lib/abdk-libraries-solidity/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":100000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/openzeppelin-contracts/contracts/utils/Errors.sol":"Errors"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"lib/openzeppelin-contracts/contracts/utils/Errors.sol":{"keccak256":"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123","urls":["bzz-raw://ba1d02f4847670a1b83dec9f7d37f0b0418d6043447b69f3a29a5f9efc547fcf","dweb:/ipfs/QmQ7iH2keLNUKgq2xSWcRmuBE5eZ3F5whYAkAGzCNNoEWB"],"license":"MIT"}},"version":1},"id":29}
|
{"abi":[{"type":"error","name":"FailedCall","inputs":[]},{"type":"error","name":"FailedDeployment","inputs":[]},{"type":"error","name":"InsufficientBalance","inputs":[{"name":"balance","type":"uint256","internalType":"uint256"},{"name":"needed","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"MissingPrecompile","inputs":[{"name":"","type":"address","internalType":"address"}]}],"bytecode":{"object":"0x6080806040523460175760399081601c823930815050f35b5f80fdfe5f80fdfea2646970667358221220c9655ed21113d5fdaf6c566485d35a2aaf2bf242b1c753a1cac998424bd77b5d64736f6c634300081e0033","sourceMap":"411:484:35:-:0;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x5f80fdfea2646970667358221220c9655ed21113d5fdaf6c566485d35a2aaf2bf242b1c753a1cac998424bd77b5d64736f6c634300081e0033","sourceMap":"411:484:35:-:0;;","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedDeployment\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"MissingPrecompile\",\"type\":\"error\"}],\"devdoc\":{\"details\":\"Collection of common custom errors used in multiple contracts IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library. It is recommended to avoid relying on the error API for critical functionality. _Available since v5.1._\",\"errors\":{\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"FailedDeployment()\":[{\"details\":\"The deployment failed.\"}],\"InsufficientBalance(uint256,uint256)\":[{\"details\":\"The ETH balance of the account is not enough to perform the operation.\"}],\"MissingPrecompile(address)\":[{\"details\":\"A necessary precompile is missing.\"}]},\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/openzeppelin-contracts/contracts/utils/Errors.sol\":\"Errors\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"remappings\":[\":@abdk/=lib/abdk-libraries-solidity/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":abdk-libraries-solidity/=lib/abdk-libraries-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/utils/Errors.sol\":{\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ba1d02f4847670a1b83dec9f7d37f0b0418d6043447b69f3a29a5f9efc547fcf\",\"dweb:/ipfs/QmQ7iH2keLNUKgq2xSWcRmuBE5eZ3F5whYAkAGzCNNoEWB\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[{"inputs":[],"type":"error","name":"FailedCall"},{"inputs":[],"type":"error","name":"FailedDeployment"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"type":"error","name":"InsufficientBalance"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"type":"error","name":"MissingPrecompile"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@abdk/=lib/abdk-libraries-solidity/","@openzeppelin/=lib/openzeppelin-contracts/","abdk-libraries-solidity/=lib/abdk-libraries-solidity/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":100000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/openzeppelin-contracts/contracts/utils/Errors.sol":"Errors"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"lib/openzeppelin-contracts/contracts/utils/Errors.sol":{"keccak256":"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123","urls":["bzz-raw://ba1d02f4847670a1b83dec9f7d37f0b0418d6043447b69f3a29a5f9efc547fcf","dweb:/ipfs/QmQ7iH2keLNUKgq2xSWcRmuBE5eZ3F5whYAkAGzCNNoEWB"],"license":"MIT"}},"version":1},"id":35}
|
||||||
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
{"abi":[{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{"supportsInterface(bytes4)":"01ffc9a7"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Interface of the ERC-165 standard, as defined in the https://eips.ethereum.org/EIPS/eip-165[ERC]. Implementers can declare support of contract interfaces, which can then be queried by others ({ERC165Checker}). For an implementation, see {ERC165}.\",\"kind\":\"dev\",\"methods\":{\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":\"IERC165\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"remappings\":[\":@abdk/=lib/abdk-libraries-solidity/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":abdk-libraries-solidity/=lib/abdk-libraries-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617\",\"dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"stateMutability":"view","type":"function","name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}]}],"devdoc":{"kind":"dev","methods":{"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@abdk/=lib/abdk-libraries-solidity/","@openzeppelin/=lib/openzeppelin-contracts/","abdk-libraries-solidity/=lib/abdk-libraries-solidity/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":100000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":"IERC165"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c","urls":["bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617","dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u"],"license":"MIT"}},"version":1},"id":33}
|
{"abi":[{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{"supportsInterface(bytes4)":"01ffc9a7"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Interface of the ERC-165 standard, as defined in the https://eips.ethereum.org/EIPS/eip-165[ERC]. Implementers can declare support of contract interfaces, which can then be queried by others ({ERC165Checker}). For an implementation, see {ERC165}.\",\"kind\":\"dev\",\"methods\":{\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":\"IERC165\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"remappings\":[\":@abdk/=lib/abdk-libraries-solidity/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":abdk-libraries-solidity/=lib/abdk-libraries-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617\",\"dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"stateMutability":"view","type":"function","name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}]}],"devdoc":{"kind":"dev","methods":{"supportsInterface(bytes4)":{"details":"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] to learn more about how these ids are created. This function call must use less than 30 000 gas."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@abdk/=lib/abdk-libraries-solidity/","@openzeppelin/=lib/openzeppelin-contracts/","abdk-libraries-solidity/=lib/abdk-libraries-solidity/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":100000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":"IERC165"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c","urls":["bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617","dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u"],"license":"MIT"}},"version":1},"id":39}
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
{"abi":[{"type":"function","name":"partyFlashCallback","inputs":[{"name":"loanAmounts","type":"uint256[]","internalType":"uint256[]"},{"name":"repaymentAmounts","type":"uint256[]","internalType":"uint256[]"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{"partyFlashCallback(uint256[],uint256[],bytes)":"f6c10706"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"loanAmounts\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"repaymentAmounts\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"partyFlashCallback\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/IPartyFlashCallback.sol\":\"IPartyFlashCallback\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"remappings\":[\":@abdk/=lib/abdk-libraries-solidity/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":abdk-libraries-solidity/=lib/abdk-libraries-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"src/IPartyFlashCallback.sol\":{\"keccak256\":\"0xff1d473d27c4dc75441a5f0db2d761916cce4a702f660e998467791efd1d9b2e\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://3220d69c62ed8c8106762c92857f24011284e8ddcfa5db4210e506b112fa1870\",\"dweb:/ipfs/QmYoZiGsVwoJvyPMcsSste4tq93wVBgDqCZkwPY7dvyLBJ\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"uint256[]","name":"loanAmounts","type":"uint256[]"},{"internalType":"uint256[]","name":"repaymentAmounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"partyFlashCallback"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@abdk/=lib/abdk-libraries-solidity/","@openzeppelin/=lib/openzeppelin-contracts/","abdk-libraries-solidity/=lib/abdk-libraries-solidity/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":100000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/IPartyFlashCallback.sol":"IPartyFlashCallback"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"src/IPartyFlashCallback.sol":{"keccak256":"0xff1d473d27c4dc75441a5f0db2d761916cce4a702f660e998467791efd1d9b2e","urls":["bzz-raw://3220d69c62ed8c8106762c92857f24011284e8ddcfa5db4210e506b112fa1870","dweb:/ipfs/QmYoZiGsVwoJvyPMcsSste4tq93wVBgDqCZkwPY7dvyLBJ"],"license":"UNLICENSED"}},"version":1},"id":38}
|
{"abi":[{"type":"function","name":"partyFlashCallback","inputs":[{"name":"loanAmounts","type":"uint256[]","internalType":"uint256[]"},{"name":"repaymentAmounts","type":"uint256[]","internalType":"uint256[]"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{"partyFlashCallback(uint256[],uint256[],bytes)":"f6c10706"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"loanAmounts\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"repaymentAmounts\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"partyFlashCallback\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/IPartyFlashCallback.sol\":\"IPartyFlashCallback\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"remappings\":[\":@abdk/=lib/abdk-libraries-solidity/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":abdk-libraries-solidity/=lib/abdk-libraries-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"src/IPartyFlashCallback.sol\":{\"keccak256\":\"0xff1d473d27c4dc75441a5f0db2d761916cce4a702f660e998467791efd1d9b2e\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://3220d69c62ed8c8106762c92857f24011284e8ddcfa5db4210e506b112fa1870\",\"dweb:/ipfs/QmYoZiGsVwoJvyPMcsSste4tq93wVBgDqCZkwPY7dvyLBJ\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"uint256[]","name":"loanAmounts","type":"uint256[]"},{"internalType":"uint256[]","name":"repaymentAmounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"partyFlashCallback"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@abdk/=lib/abdk-libraries-solidity/","@openzeppelin/=lib/openzeppelin-contracts/","abdk-libraries-solidity/=lib/abdk-libraries-solidity/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":100000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/IPartyFlashCallback.sol":"IPartyFlashCallback"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"src/IPartyFlashCallback.sol":{"keccak256":"0xff1d473d27c4dc75441a5f0db2d761916cce4a702f660e998467791efd1d9b2e","urls":["bzz-raw://3220d69c62ed8c8106762c92857f24011284e8ddcfa5db4210e506b112fa1870","dweb:/ipfs/QmYoZiGsVwoJvyPMcsSste4tq93wVBgDqCZkwPY7dvyLBJ"],"license":"UNLICENSED"}},"version":1},"id":45}
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
{"abi":[],"bytecode":{"object":"0x6080806040523460175760399081601c823930815050f35b5f80fdfe5f80fdfea264697066735822122066e35f3ae677f1cfa4ce90bb52d5d25b37cbc5fa99c2ecc24a1a4a8db5ae04a564736f6c634300081e0033","sourceMap":"552:43739:42:-:0;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x5f80fdfea264697066735822122066e35f3ae677f1cfa4ce90bb52d5d25b37cbc5fa99c2ecc24a1a4a8db5ae04a564736f6c634300081e0033","sourceMap":"552:43739:42:-:0;;","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Stabilized LMSR library with incremental exp(z) caching for gas efficiency. - Stores b (64.64), M (shift), Z = sum exp(z_i), z[i] = (q_i / b) - M - Caches e[i] = exp(z[i]) so we avoid recomputing exp() for every asset on each trade. - Provides closed-form \\u0394C on deposit, amount-out for asset->asset, and incremental applyDeposit/applyWithdraw that update e[i] and Z in O(1).\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/LMSRStabilized.sol\":\"LMSRStabilized\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"remappings\":[\":@abdk/=lib/abdk-libraries-solidity/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":abdk-libraries-solidity/=lib/abdk-libraries-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"lib/abdk-libraries-solidity/ABDKMath64x64.sol\":{\"keccak256\":\"0x1364fdc24192b982f647c7fc68dcb2f6fc1b5e201843e773144bd23a76cb3b97\",\"license\":\"BSD-4-Clause\",\"urls\":[\"bzz-raw://490712cc07db32f274899b17aade9c975f06010848c21500b8a5ead6898e09c7\",\"dweb:/ipfs/QmZMPKjDgwCFSGdLWJW6g5E7hDLByA9hNjXzAwJ4GKTZvN\"]},\"src/LMSRStabilized.sol\":{\"keccak256\":\"0xfbb5d611a105095a9ccc71f859908eec12ed7df4573a787e130bbaf9fbaa7935\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://4f37e539fdbedd38488f5c5f0c8a4f579693e8de1ca546b60c580d4d0e12b28b\",\"dweb:/ipfs/QmR6VvQs54XKH67DyWrWdLBf2n6XTYnTjRniY4CFihZAVN\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@abdk/=lib/abdk-libraries-solidity/","@openzeppelin/=lib/openzeppelin-contracts/","abdk-libraries-solidity/=lib/abdk-libraries-solidity/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":100000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/LMSRStabilized.sol":"LMSRStabilized"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"lib/abdk-libraries-solidity/ABDKMath64x64.sol":{"keccak256":"0x1364fdc24192b982f647c7fc68dcb2f6fc1b5e201843e773144bd23a76cb3b97","urls":["bzz-raw://490712cc07db32f274899b17aade9c975f06010848c21500b8a5ead6898e09c7","dweb:/ipfs/QmZMPKjDgwCFSGdLWJW6g5E7hDLByA9hNjXzAwJ4GKTZvN"],"license":"BSD-4-Clause"},"src/LMSRStabilized.sol":{"keccak256":"0xfbb5d611a105095a9ccc71f859908eec12ed7df4573a787e130bbaf9fbaa7935","urls":["bzz-raw://4f37e539fdbedd38488f5c5f0c8a4f579693e8de1ca546b60c580d4d0e12b28b","dweb:/ipfs/QmR6VvQs54XKH67DyWrWdLBf2n6XTYnTjRniY4CFihZAVN"],"license":"UNLICENSED"}},"version":1},"id":42}
|
{"abi":[],"bytecode":{"object":"0x6080806040523460175760399081601c823930815050f35b5f80fdfe5f80fdfea264697066735822122066e35f3ae677f1cfa4ce90bb52d5d25b37cbc5fa99c2ecc24a1a4a8db5ae04a564736f6c634300081e0033","sourceMap":"552:43739:49:-:0;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x5f80fdfea264697066735822122066e35f3ae677f1cfa4ce90bb52d5d25b37cbc5fa99c2ecc24a1a4a8db5ae04a564736f6c634300081e0033","sourceMap":"552:43739:49:-:0;;","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Stabilized LMSR library with incremental exp(z) caching for gas efficiency. - Stores b (64.64), M (shift), Z = sum exp(z_i), z[i] = (q_i / b) - M - Caches e[i] = exp(z[i]) so we avoid recomputing exp() for every asset on each trade. - Provides closed-form \\u0394C on deposit, amount-out for asset->asset, and incremental applyDeposit/applyWithdraw that update e[i] and Z in O(1).\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/LMSRStabilized.sol\":\"LMSRStabilized\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"remappings\":[\":@abdk/=lib/abdk-libraries-solidity/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":abdk-libraries-solidity/=lib/abdk-libraries-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"lib/abdk-libraries-solidity/ABDKMath64x64.sol\":{\"keccak256\":\"0x1364fdc24192b982f647c7fc68dcb2f6fc1b5e201843e773144bd23a76cb3b97\",\"license\":\"BSD-4-Clause\",\"urls\":[\"bzz-raw://490712cc07db32f274899b17aade9c975f06010848c21500b8a5ead6898e09c7\",\"dweb:/ipfs/QmZMPKjDgwCFSGdLWJW6g5E7hDLByA9hNjXzAwJ4GKTZvN\"]},\"src/LMSRStabilized.sol\":{\"keccak256\":\"0xfbb5d611a105095a9ccc71f859908eec12ed7df4573a787e130bbaf9fbaa7935\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://4f37e539fdbedd38488f5c5f0c8a4f579693e8de1ca546b60c580d4d0e12b28b\",\"dweb:/ipfs/QmR6VvQs54XKH67DyWrWdLBf2n6XTYnTjRniY4CFihZAVN\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@abdk/=lib/abdk-libraries-solidity/","@openzeppelin/=lib/openzeppelin-contracts/","abdk-libraries-solidity/=lib/abdk-libraries-solidity/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":100000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/LMSRStabilized.sol":"LMSRStabilized"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"lib/abdk-libraries-solidity/ABDKMath64x64.sol":{"keccak256":"0x1364fdc24192b982f647c7fc68dcb2f6fc1b5e201843e773144bd23a76cb3b97","urls":["bzz-raw://490712cc07db32f274899b17aade9c975f06010848c21500b8a5ead6898e09c7","dweb:/ipfs/QmZMPKjDgwCFSGdLWJW6g5E7hDLByA9hNjXzAwJ4GKTZvN"],"license":"BSD-4-Clause"},"src/LMSRStabilized.sol":{"keccak256":"0xfbb5d611a105095a9ccc71f859908eec12ed7df4573a787e130bbaf9fbaa7935","urls":["bzz-raw://4f37e539fdbedd38488f5c5f0c8a4f579693e8de1ca546b60c580d4d0e12b28b","dweb:/ipfs/QmR6VvQs54XKH67DyWrWdLBf2n6XTYnTjRniY4CFihZAVN"],"license":"UNLICENSED"}},"version":1},"id":49}
|
||||||
@@ -1 +1 @@
|
|||||||
{"abi":[],"bytecode":{"object":"0x6080806040523460175760399081601c823930815050f35b5f80fdfe5f80fdfea2646970667358221220817e13d5a211c83f1cce4a24c79906e9de6370aad890508ad9f08db544c1e07c64736f6c634300081e0033","sourceMap":"265:8548:43:-:0;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x5f80fdfea2646970667358221220817e13d5a211c83f1cce4a24c79906e9de6370aad890508ad9f08db544c1e07c64736f6c634300081e0033","sourceMap":"265:8548:43:-:0;;","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Specialized functions for the 2-asset stablecoin case\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/LMSRStabilizedBalancedPair.sol\":\"LMSRStabilizedBalancedPair\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"remappings\":[\":@abdk/=lib/abdk-libraries-solidity/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":abdk-libraries-solidity/=lib/abdk-libraries-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"lib/abdk-libraries-solidity/ABDKMath64x64.sol\":{\"keccak256\":\"0x1364fdc24192b982f647c7fc68dcb2f6fc1b5e201843e773144bd23a76cb3b97\",\"license\":\"BSD-4-Clause\",\"urls\":[\"bzz-raw://490712cc07db32f274899b17aade9c975f06010848c21500b8a5ead6898e09c7\",\"dweb:/ipfs/QmZMPKjDgwCFSGdLWJW6g5E7hDLByA9hNjXzAwJ4GKTZvN\"]},\"src/LMSRStabilized.sol\":{\"keccak256\":\"0xfbb5d611a105095a9ccc71f859908eec12ed7df4573a787e130bbaf9fbaa7935\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://4f37e539fdbedd38488f5c5f0c8a4f579693e8de1ca546b60c580d4d0e12b28b\",\"dweb:/ipfs/QmR6VvQs54XKH67DyWrWdLBf2n6XTYnTjRniY4CFihZAVN\"]},\"src/LMSRStabilizedBalancedPair.sol\":{\"keccak256\":\"0x65a16365ae6dda4b5041f065aacc80661a9f9ef795e2be8930a7e89ad52d2cb0\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://90fc178c2f8ad02e30ce0da5b5e4e46c4c0be1d00149372bf9c9e89fbf585766\",\"dweb:/ipfs/QmPajJdZiy4CzrU8A8HonpU3WtjFL4BqR3eKVMwej3GQdh\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@abdk/=lib/abdk-libraries-solidity/","@openzeppelin/=lib/openzeppelin-contracts/","abdk-libraries-solidity/=lib/abdk-libraries-solidity/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":100000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/LMSRStabilizedBalancedPair.sol":"LMSRStabilizedBalancedPair"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"lib/abdk-libraries-solidity/ABDKMath64x64.sol":{"keccak256":"0x1364fdc24192b982f647c7fc68dcb2f6fc1b5e201843e773144bd23a76cb3b97","urls":["bzz-raw://490712cc07db32f274899b17aade9c975f06010848c21500b8a5ead6898e09c7","dweb:/ipfs/QmZMPKjDgwCFSGdLWJW6g5E7hDLByA9hNjXzAwJ4GKTZvN"],"license":"BSD-4-Clause"},"src/LMSRStabilized.sol":{"keccak256":"0xfbb5d611a105095a9ccc71f859908eec12ed7df4573a787e130bbaf9fbaa7935","urls":["bzz-raw://4f37e539fdbedd38488f5c5f0c8a4f579693e8de1ca546b60c580d4d0e12b28b","dweb:/ipfs/QmR6VvQs54XKH67DyWrWdLBf2n6XTYnTjRniY4CFihZAVN"],"license":"UNLICENSED"},"src/LMSRStabilizedBalancedPair.sol":{"keccak256":"0x65a16365ae6dda4b5041f065aacc80661a9f9ef795e2be8930a7e89ad52d2cb0","urls":["bzz-raw://90fc178c2f8ad02e30ce0da5b5e4e46c4c0be1d00149372bf9c9e89fbf585766","dweb:/ipfs/QmPajJdZiy4CzrU8A8HonpU3WtjFL4BqR3eKVMwej3GQdh"],"license":"UNLICENSED"}},"version":1},"id":43}
|
{"abi":[],"bytecode":{"object":"0x6080806040523460175760399081601c823930815050f35b5f80fdfe5f80fdfea2646970667358221220817e13d5a211c83f1cce4a24c79906e9de6370aad890508ad9f08db544c1e07c64736f6c634300081e0033","sourceMap":"265:8548:50:-:0;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x5f80fdfea2646970667358221220817e13d5a211c83f1cce4a24c79906e9de6370aad890508ad9f08db544c1e07c64736f6c634300081e0033","sourceMap":"265:8548:50:-:0;;","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Specialized functions for the 2-asset stablecoin case\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/LMSRStabilizedBalancedPair.sol\":\"LMSRStabilizedBalancedPair\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"remappings\":[\":@abdk/=lib/abdk-libraries-solidity/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":abdk-libraries-solidity/=lib/abdk-libraries-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"lib/abdk-libraries-solidity/ABDKMath64x64.sol\":{\"keccak256\":\"0x1364fdc24192b982f647c7fc68dcb2f6fc1b5e201843e773144bd23a76cb3b97\",\"license\":\"BSD-4-Clause\",\"urls\":[\"bzz-raw://490712cc07db32f274899b17aade9c975f06010848c21500b8a5ead6898e09c7\",\"dweb:/ipfs/QmZMPKjDgwCFSGdLWJW6g5E7hDLByA9hNjXzAwJ4GKTZvN\"]},\"src/LMSRStabilized.sol\":{\"keccak256\":\"0xfbb5d611a105095a9ccc71f859908eec12ed7df4573a787e130bbaf9fbaa7935\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://4f37e539fdbedd38488f5c5f0c8a4f579693e8de1ca546b60c580d4d0e12b28b\",\"dweb:/ipfs/QmR6VvQs54XKH67DyWrWdLBf2n6XTYnTjRniY4CFihZAVN\"]},\"src/LMSRStabilizedBalancedPair.sol\":{\"keccak256\":\"0x65a16365ae6dda4b5041f065aacc80661a9f9ef795e2be8930a7e89ad52d2cb0\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://90fc178c2f8ad02e30ce0da5b5e4e46c4c0be1d00149372bf9c9e89fbf585766\",\"dweb:/ipfs/QmPajJdZiy4CzrU8A8HonpU3WtjFL4BqR3eKVMwej3GQdh\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@abdk/=lib/abdk-libraries-solidity/","@openzeppelin/=lib/openzeppelin-contracts/","abdk-libraries-solidity/=lib/abdk-libraries-solidity/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":100000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/LMSRStabilizedBalancedPair.sol":"LMSRStabilizedBalancedPair"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"lib/abdk-libraries-solidity/ABDKMath64x64.sol":{"keccak256":"0x1364fdc24192b982f647c7fc68dcb2f6fc1b5e201843e773144bd23a76cb3b97","urls":["bzz-raw://490712cc07db32f274899b17aade9c975f06010848c21500b8a5ead6898e09c7","dweb:/ipfs/QmZMPKjDgwCFSGdLWJW6g5E7hDLByA9hNjXzAwJ4GKTZvN"],"license":"BSD-4-Clause"},"src/LMSRStabilized.sol":{"keccak256":"0xfbb5d611a105095a9ccc71f859908eec12ed7df4573a787e130bbaf9fbaa7935","urls":["bzz-raw://4f37e539fdbedd38488f5c5f0c8a4f579693e8de1ca546b60c580d4d0e12b28b","dweb:/ipfs/QmR6VvQs54XKH67DyWrWdLBf2n6XTYnTjRniY4CFihZAVN"],"license":"UNLICENSED"},"src/LMSRStabilizedBalancedPair.sol":{"keccak256":"0x65a16365ae6dda4b5041f065aacc80661a9f9ef795e2be8930a7e89ad52d2cb0","urls":["bzz-raw://90fc178c2f8ad02e30ce0da5b5e4e46c4c0be1d00149372bf9c9e89fbf585766","dweb:/ipfs/QmPajJdZiy4CzrU8A8HonpU3WtjFL4BqR3eKVMwej3GQdh"],"license":"UNLICENSED"}},"version":1},"id":50}
|
||||||
@@ -1 +1 @@
|
|||||||
{"abi":[],"bytecode":{"object":"0x6080806040523460175760399081601c823930815050f35b5f80fdfe5f80fdfea2646970667358221220ff1724fa31d9e324ea702ba224919eb915aeafa31fa3c696ca265c0e46de134064736f6c634300081e0033","sourceMap":"348:5083:30:-:0;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x5f80fdfea2646970667358221220ff1724fa31d9e324ea702ba224919eb915aeafa31fa3c696ca265c0e46de134064736f6c634300081e0033","sourceMap":"348:5083:30:-:0;;","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Library of low level call functions that implement different calling strategies to deal with the return data. WARNING: Using this library requires an advanced understanding of Solidity and how the EVM works. It is recommended to use the {Address} library instead.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/openzeppelin-contracts/contracts/utils/LowLevelCall.sol\":\"LowLevelCall\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"remappings\":[\":@abdk/=lib/abdk-libraries-solidity/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":abdk-libraries-solidity/=lib/abdk-libraries-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/utils/LowLevelCall.sol\":{\"keccak256\":\"0x50e81a8b089e3f382b6c915aa0166773de64ea4756e8f9479d9943a5f956ddf5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bfeb96a150537222e2191c03887127499a4f21dfb5f9a7211da4d81749b52848\",\"dweb:/ipfs/QmYR75ECbsBuxSiXmGvGfNKJRLoK5MdLUZL1bd8SixzxL4\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@abdk/=lib/abdk-libraries-solidity/","@openzeppelin/=lib/openzeppelin-contracts/","abdk-libraries-solidity/=lib/abdk-libraries-solidity/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":100000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/openzeppelin-contracts/contracts/utils/LowLevelCall.sol":"LowLevelCall"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"lib/openzeppelin-contracts/contracts/utils/LowLevelCall.sol":{"keccak256":"0x50e81a8b089e3f382b6c915aa0166773de64ea4756e8f9479d9943a5f956ddf5","urls":["bzz-raw://bfeb96a150537222e2191c03887127499a4f21dfb5f9a7211da4d81749b52848","dweb:/ipfs/QmYR75ECbsBuxSiXmGvGfNKJRLoK5MdLUZL1bd8SixzxL4"],"license":"MIT"}},"version":1},"id":30}
|
{"abi":[],"bytecode":{"object":"0x6080806040523460175760399081601c823930815050f35b5f80fdfe5f80fdfea2646970667358221220ff1724fa31d9e324ea702ba224919eb915aeafa31fa3c696ca265c0e46de134064736f6c634300081e0033","sourceMap":"348:5083:36:-:0;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x5f80fdfea2646970667358221220ff1724fa31d9e324ea702ba224919eb915aeafa31fa3c696ca265c0e46de134064736f6c634300081e0033","sourceMap":"348:5083:36:-:0;;","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Library of low level call functions that implement different calling strategies to deal with the return data. WARNING: Using this library requires an advanced understanding of Solidity and how the EVM works. It is recommended to use the {Address} library instead.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/openzeppelin-contracts/contracts/utils/LowLevelCall.sol\":\"LowLevelCall\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"remappings\":[\":@abdk/=lib/abdk-libraries-solidity/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":abdk-libraries-solidity/=lib/abdk-libraries-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/utils/LowLevelCall.sol\":{\"keccak256\":\"0x50e81a8b089e3f382b6c915aa0166773de64ea4756e8f9479d9943a5f956ddf5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bfeb96a150537222e2191c03887127499a4f21dfb5f9a7211da4d81749b52848\",\"dweb:/ipfs/QmYR75ECbsBuxSiXmGvGfNKJRLoK5MdLUZL1bd8SixzxL4\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@abdk/=lib/abdk-libraries-solidity/","@openzeppelin/=lib/openzeppelin-contracts/","abdk-libraries-solidity/=lib/abdk-libraries-solidity/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":100000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/openzeppelin-contracts/contracts/utils/LowLevelCall.sol":"LowLevelCall"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"lib/openzeppelin-contracts/contracts/utils/LowLevelCall.sol":{"keccak256":"0x50e81a8b089e3f382b6c915aa0166773de64ea4756e8f9479d9943a5f956ddf5","urls":["bzz-raw://bfeb96a150537222e2191c03887127499a4f21dfb5f9a7211da4d81749b52848","dweb:/ipfs/QmYR75ECbsBuxSiXmGvGfNKJRLoK5MdLUZL1bd8SixzxL4"],"license":"MIT"}},"version":1},"id":36}
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
{"abi":[],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"OpenZeppelin's Ownable contract, split into internal and external parts.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/OwnableInternal.sol\":\"OwnableInternal\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"remappings\":[\":@abdk/=lib/abdk-libraries-solidity/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":abdk-libraries-solidity/=lib/abdk-libraries-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"src/IOwnable.sol\":{\"keccak256\":\"0x7462267790c0d2312be1cbce077e5565aa86dac0789718c87ad0948174ecb990\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7eca10ffa6a7985d11eb476a351b1c09701056b0bdf8146612173bb19764e3f1\",\"dweb:/ipfs/QmTPF85yFSL3jDt2atZDLT4RV3zs8ch8P3G7YzCUiU8gR9\"]},\"src/OwnableInternal.sol\":{\"keccak256\":\"0x4dd94a81962a9708a07fdeba0f2b63bb5e17ef22f3b7a4d1e6afc5e589f95581\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://efecf80e2ef5afc06fb1f201270a41e15bed831275650d0e47c0d933e7b192ca\",\"dweb:/ipfs/QmNo4q3htXm758T8tKruR671mrDL2K1kkzRJjSKr7BTuiE\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@abdk/=lib/abdk-libraries-solidity/","@openzeppelin/=lib/openzeppelin-contracts/","abdk-libraries-solidity/=lib/abdk-libraries-solidity/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":100000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/OwnableInternal.sol":"OwnableInternal"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"lib/openzeppelin-contracts/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"],"license":"MIT"},"src/IOwnable.sol":{"keccak256":"0x7462267790c0d2312be1cbce077e5565aa86dac0789718c87ad0948174ecb990","urls":["bzz-raw://7eca10ffa6a7985d11eb476a351b1c09701056b0bdf8146612173bb19764e3f1","dweb:/ipfs/QmTPF85yFSL3jDt2atZDLT4RV3zs8ch8P3G7YzCUiU8gR9"],"license":"MIT"},"src/OwnableInternal.sol":{"keccak256":"0x4dd94a81962a9708a07fdeba0f2b63bb5e17ef22f3b7a4d1e6afc5e589f95581","urls":["bzz-raw://efecf80e2ef5afc06fb1f201270a41e15bed831275650d0e47c0d933e7b192ca","dweb:/ipfs/QmNo4q3htXm758T8tKruR671mrDL2K1kkzRJjSKr7BTuiE"],"license":"MIT"}},"version":1},"id":46}
|
{"abi":[],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"OpenZeppelin's Ownable contract, split into internal and external parts.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/OwnableInternal.sol\":\"OwnableInternal\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"remappings\":[\":@abdk/=lib/abdk-libraries-solidity/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":abdk-libraries-solidity/=lib/abdk-libraries-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"src/IOwnable.sol\":{\"keccak256\":\"0x7462267790c0d2312be1cbce077e5565aa86dac0789718c87ad0948174ecb990\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7eca10ffa6a7985d11eb476a351b1c09701056b0bdf8146612173bb19764e3f1\",\"dweb:/ipfs/QmTPF85yFSL3jDt2atZDLT4RV3zs8ch8P3G7YzCUiU8gR9\"]},\"src/OwnableInternal.sol\":{\"keccak256\":\"0x4dd94a81962a9708a07fdeba0f2b63bb5e17ef22f3b7a4d1e6afc5e589f95581\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://efecf80e2ef5afc06fb1f201270a41e15bed831275650d0e47c0d933e7b192ca\",\"dweb:/ipfs/QmNo4q3htXm758T8tKruR671mrDL2K1kkzRJjSKr7BTuiE\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@abdk/=lib/abdk-libraries-solidity/","@openzeppelin/=lib/openzeppelin-contracts/","abdk-libraries-solidity/=lib/abdk-libraries-solidity/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":100000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/OwnableInternal.sol":"OwnableInternal"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"lib/openzeppelin-contracts/contracts/utils/Context.sol":{"keccak256":"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2","urls":["bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12","dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF"],"license":"MIT"},"src/IOwnable.sol":{"keccak256":"0x7462267790c0d2312be1cbce077e5565aa86dac0789718c87ad0948174ecb990","urls":["bzz-raw://7eca10ffa6a7985d11eb476a351b1c09701056b0bdf8146612173bb19764e3f1","dweb:/ipfs/QmTPF85yFSL3jDt2atZDLT4RV3zs8ch8P3G7YzCUiU8gR9"],"license":"MIT"},"src/OwnableInternal.sol":{"keccak256":"0x4dd94a81962a9708a07fdeba0f2b63bb5e17ef22f3b7a4d1e6afc5e589f95581","urls":["bzz-raw://efecf80e2ef5afc06fb1f201270a41e15bed831275650d0e47c0d933e7b192ca","dweb:/ipfs/QmNo4q3htXm758T8tKruR671mrDL2K1kkzRJjSKr7BTuiE"],"license":"MIT"}},"version":1},"id":53}
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
{"abi":[],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/PartyPoolHelpers.sol\":\"PartyPoolHelpers\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"remappings\":[\":@abdk/=lib/abdk-libraries-solidity/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":abdk-libraries-solidity/=lib/abdk-libraries-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"lib/abdk-libraries-solidity/ABDKMath64x64.sol\":{\"keccak256\":\"0x1364fdc24192b982f647c7fc68dcb2f6fc1b5e201843e773144bd23a76cb3b97\",\"license\":\"BSD-4-Clause\",\"urls\":[\"bzz-raw://490712cc07db32f274899b17aade9c975f06010848c21500b8a5ead6898e09c7\",\"dweb:/ipfs/QmZMPKjDgwCFSGdLWJW6g5E7hDLByA9hNjXzAwJ4GKTZvN\"]},\"src/PartyPoolHelpers.sol\":{\"keccak256\":\"0xd43b635d12b6684ae38a685eea4bc5783cebb3696514d8aafe3f4ce34f5e759c\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://832046b365d443c4c1c715f98fe3de224e3ba82c67960053d51e6a79847c4af5\",\"dweb:/ipfs/QmZ4nWMwyYQzaBGF7rBE73GYTs4z3DRNYL1ZrGAsxN6RfP\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@abdk/=lib/abdk-libraries-solidity/","@openzeppelin/=lib/openzeppelin-contracts/","abdk-libraries-solidity/=lib/abdk-libraries-solidity/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":100000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/PartyPoolHelpers.sol":"PartyPoolHelpers"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"lib/abdk-libraries-solidity/ABDKMath64x64.sol":{"keccak256":"0x1364fdc24192b982f647c7fc68dcb2f6fc1b5e201843e773144bd23a76cb3b97","urls":["bzz-raw://490712cc07db32f274899b17aade9c975f06010848c21500b8a5ead6898e09c7","dweb:/ipfs/QmZMPKjDgwCFSGdLWJW6g5E7hDLByA9hNjXzAwJ4GKTZvN"],"license":"BSD-4-Clause"},"src/PartyPoolHelpers.sol":{"keccak256":"0xd43b635d12b6684ae38a685eea4bc5783cebb3696514d8aafe3f4ce34f5e759c","urls":["bzz-raw://832046b365d443c4c1c715f98fe3de224e3ba82c67960053d51e6a79847c4af5","dweb:/ipfs/QmZ4nWMwyYQzaBGF7rBE73GYTs4z3DRNYL1ZrGAsxN6RfP"],"license":"UNLICENSED"}},"version":1},"id":52}
|
{"abi":[],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/PartyPoolHelpers.sol\":\"PartyPoolHelpers\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"remappings\":[\":@abdk/=lib/abdk-libraries-solidity/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":abdk-libraries-solidity/=lib/abdk-libraries-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"lib/abdk-libraries-solidity/ABDKMath64x64.sol\":{\"keccak256\":\"0x1364fdc24192b982f647c7fc68dcb2f6fc1b5e201843e773144bd23a76cb3b97\",\"license\":\"BSD-4-Clause\",\"urls\":[\"bzz-raw://490712cc07db32f274899b17aade9c975f06010848c21500b8a5ead6898e09c7\",\"dweb:/ipfs/QmZMPKjDgwCFSGdLWJW6g5E7hDLByA9hNjXzAwJ4GKTZvN\"]},\"src/PartyPoolHelpers.sol\":{\"keccak256\":\"0xd43b635d12b6684ae38a685eea4bc5783cebb3696514d8aafe3f4ce34f5e759c\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://832046b365d443c4c1c715f98fe3de224e3ba82c67960053d51e6a79847c4af5\",\"dweb:/ipfs/QmZ4nWMwyYQzaBGF7rBE73GYTs4z3DRNYL1ZrGAsxN6RfP\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@abdk/=lib/abdk-libraries-solidity/","@openzeppelin/=lib/openzeppelin-contracts/","abdk-libraries-solidity/=lib/abdk-libraries-solidity/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":100000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/PartyPoolHelpers.sol":"PartyPoolHelpers"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"lib/abdk-libraries-solidity/ABDKMath64x64.sol":{"keccak256":"0x1364fdc24192b982f647c7fc68dcb2f6fc1b5e201843e773144bd23a76cb3b97","urls":["bzz-raw://490712cc07db32f274899b17aade9c975f06010848c21500b8a5ead6898e09c7","dweb:/ipfs/QmZMPKjDgwCFSGdLWJW6g5E7hDLByA9hNjXzAwJ4GKTZvN"],"license":"BSD-4-Clause"},"src/PartyPoolHelpers.sol":{"keccak256":"0xd43b635d12b6684ae38a685eea4bc5783cebb3696514d8aafe3f4ce34f5e759c","urls":["bzz-raw://832046b365d443c4c1c715f98fe3de224e3ba82c67960053d51e6a79847c4af5","dweb:/ipfs/QmZ4nWMwyYQzaBGF7rBE73GYTs4z3DRNYL1ZrGAsxN6RfP"],"license":"UNLICENSED"}},"version":1},"id":59}
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
{"abi":[{"type":"fallback","stateMutability":"payable"}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"stateMutability\":\"payable\",\"type\":\"fallback\"}],\"devdoc\":{\"details\":\"This abstract contract provides a fallback function that delegates all calls to another contract using the EVM instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to be specified by overriding the virtual {_implementation} function. Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a different contract through the {_delegate} function. The success and return data of the delegated call will be returned back to the caller of the proxy.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/openzeppelin-contracts/contracts/proxy/Proxy.sol\":\"Proxy\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"remappings\":[\":@abdk/=lib/abdk-libraries-solidity/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":abdk-libraries-solidity/=lib/abdk-libraries-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/proxy/Proxy.sol\":{\"keccak256\":\"0x25f9b099413f805b4c4bbad8cc179326c10be237aec00349caf91524f8db0bbc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://dcfb75af07ad33b1f8e966f793db3df8fbcfb14103ed3644c0c634658a8fd099\",\"dweb:/ipfs/QmPWamdkbcKwG3ah2G9TZtKHzQmjnunsWoPWr5KKfbrKNb\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"payable","type":"fallback"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@abdk/=lib/abdk-libraries-solidity/","@openzeppelin/=lib/openzeppelin-contracts/","abdk-libraries-solidity/=lib/abdk-libraries-solidity/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":100000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/openzeppelin-contracts/contracts/proxy/Proxy.sol":"Proxy"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"lib/openzeppelin-contracts/contracts/proxy/Proxy.sol":{"keccak256":"0x25f9b099413f805b4c4bbad8cc179326c10be237aec00349caf91524f8db0bbc","urls":["bzz-raw://dcfb75af07ad33b1f8e966f793db3df8fbcfb14103ed3644c0c634658a8fd099","dweb:/ipfs/QmPWamdkbcKwG3ah2G9TZtKHzQmjnunsWoPWr5KKfbrKNb"],"license":"MIT"}},"version":1},"id":22}
|
{"abi":[{"type":"fallback","stateMutability":"payable"}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"stateMutability\":\"payable\",\"type\":\"fallback\"}],\"devdoc\":{\"details\":\"This abstract contract provides a fallback function that delegates all calls to another contract using the EVM instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to be specified by overriding the virtual {_implementation} function. Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a different contract through the {_delegate} function. The success and return data of the delegated call will be returned back to the caller of the proxy.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/openzeppelin-contracts/contracts/proxy/Proxy.sol\":\"Proxy\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"remappings\":[\":@abdk/=lib/abdk-libraries-solidity/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":abdk-libraries-solidity/=lib/abdk-libraries-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/proxy/Proxy.sol\":{\"keccak256\":\"0x25f9b099413f805b4c4bbad8cc179326c10be237aec00349caf91524f8db0bbc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://dcfb75af07ad33b1f8e966f793db3df8fbcfb14103ed3644c0c634658a8fd099\",\"dweb:/ipfs/QmPWamdkbcKwG3ah2G9TZtKHzQmjnunsWoPWr5KKfbrKNb\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"payable","type":"fallback"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@abdk/=lib/abdk-libraries-solidity/","@openzeppelin/=lib/openzeppelin-contracts/","abdk-libraries-solidity/=lib/abdk-libraries-solidity/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":100000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/openzeppelin-contracts/contracts/proxy/Proxy.sol":"Proxy"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"lib/openzeppelin-contracts/contracts/proxy/Proxy.sol":{"keccak256":"0x25f9b099413f805b4c4bbad8cc179326c10be237aec00349caf91524f8db0bbc","urls":["bzz-raw://dcfb75af07ad33b1f8e966f793db3df8fbcfb14103ed3644c0c634658a8fd099","dweb:/ipfs/QmPWamdkbcKwG3ah2G9TZtKHzQmjnunsWoPWr5KKfbrKNb"],"license":"MIT"}},"version":1},"id":28}
|
||||||
@@ -1 +1 @@
|
|||||||
{"abi":[{"type":"error","name":"ReentrancyGuardReentrantCall","inputs":[]}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"}],\"devdoc\":{\"custom:stateless\":\"\",\"details\":\"Contract module that helps prevent reentrant calls to a function. Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier available, which can be applied to functions to make sure there are no nested (reentrant) calls to them. Note that because there is a single `nonReentrant` guard, functions marked as `nonReentrant` may not call one another. This can be worked around by making those functions `private`, and then adding `external` `nonReentrant` entry points to them. TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at, consider using {ReentrancyGuardTransient} instead. TIP: If you would like to learn more about reentrancy and alternative ways to protect against it, check out our blog post https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. IMPORTANT: Deprecated. This storage-based reentrancy guard will be removed and replaced by the {ReentrancyGuardTransient} variant in v6.0.\",\"errors\":{\"ReentrancyGuardReentrantCall()\":[{\"details\":\"Unauthorized reentrant call.\"}]},\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol\":\"ReentrancyGuard\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"remappings\":[\":@abdk/=lib/abdk-libraries-solidity/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":abdk-libraries-solidity/=lib/abdk-libraries-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol\":{\"keccak256\":\"0x6f9ed073e3dab12233a79cd85153f72c9e0f99c1f5512f6d5b1ef09fb46abbb0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://093d2a804b792a0000883c2215585963ed98ec4341b45bc4224844623387d161\",\"dweb:/ipfs/QmR5shjVosAoxdmY3EfkUWgFNV4CVUcbRNS7tkvbipssPX\"]},\"lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol\":{\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9f660b1f351b757dfe01438e59888f31f33ded3afcf5cb5b0d9bf9aa6f320a8b\",\"dweb:/ipfs/QmarDJ5hZEgBtCmmrVzEZWjub9769eD686jmzb2XpSU1cM\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[{"inputs":[],"type":"error","name":"ReentrancyGuardReentrantCall"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@abdk/=lib/abdk-libraries-solidity/","@openzeppelin/=lib/openzeppelin-contracts/","abdk-libraries-solidity/=lib/abdk-libraries-solidity/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":100000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol":"ReentrancyGuard"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"lib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0x6f9ed073e3dab12233a79cd85153f72c9e0f99c1f5512f6d5b1ef09fb46abbb0","urls":["bzz-raw://093d2a804b792a0000883c2215585963ed98ec4341b45bc4224844623387d161","dweb:/ipfs/QmR5shjVosAoxdmY3EfkUWgFNV4CVUcbRNS7tkvbipssPX"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol":{"keccak256":"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97","urls":["bzz-raw://9f660b1f351b757dfe01438e59888f31f33ded3afcf5cb5b0d9bf9aa6f320a8b","dweb:/ipfs/QmarDJ5hZEgBtCmmrVzEZWjub9769eD686jmzb2XpSU1cM"],"license":"MIT"}},"version":1},"id":31}
|
{"abi":[{"type":"error","name":"ReentrancyGuardReentrantCall","inputs":[]}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"}],\"devdoc\":{\"custom:stateless\":\"\",\"details\":\"Contract module that helps prevent reentrant calls to a function. Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier available, which can be applied to functions to make sure there are no nested (reentrant) calls to them. Note that because there is a single `nonReentrant` guard, functions marked as `nonReentrant` may not call one another. This can be worked around by making those functions `private`, and then adding `external` `nonReentrant` entry points to them. TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at, consider using {ReentrancyGuardTransient} instead. TIP: If you would like to learn more about reentrancy and alternative ways to protect against it, check out our blog post https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. IMPORTANT: Deprecated. This storage-based reentrancy guard will be removed and replaced by the {ReentrancyGuardTransient} variant in v6.0.\",\"errors\":{\"ReentrancyGuardReentrantCall()\":[{\"details\":\"Unauthorized reentrant call.\"}]},\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol\":\"ReentrancyGuard\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"remappings\":[\":@abdk/=lib/abdk-libraries-solidity/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":abdk-libraries-solidity/=lib/abdk-libraries-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol\":{\"keccak256\":\"0x6f9ed073e3dab12233a79cd85153f72c9e0f99c1f5512f6d5b1ef09fb46abbb0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://093d2a804b792a0000883c2215585963ed98ec4341b45bc4224844623387d161\",\"dweb:/ipfs/QmR5shjVosAoxdmY3EfkUWgFNV4CVUcbRNS7tkvbipssPX\"]},\"lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol\":{\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9f660b1f351b757dfe01438e59888f31f33ded3afcf5cb5b0d9bf9aa6f320a8b\",\"dweb:/ipfs/QmarDJ5hZEgBtCmmrVzEZWjub9769eD686jmzb2XpSU1cM\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[{"inputs":[],"type":"error","name":"ReentrancyGuardReentrantCall"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@abdk/=lib/abdk-libraries-solidity/","@openzeppelin/=lib/openzeppelin-contracts/","abdk-libraries-solidity/=lib/abdk-libraries-solidity/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":100000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol":"ReentrancyGuard"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"lib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0x6f9ed073e3dab12233a79cd85153f72c9e0f99c1f5512f6d5b1ef09fb46abbb0","urls":["bzz-raw://093d2a804b792a0000883c2215585963ed98ec4341b45bc4224844623387d161","dweb:/ipfs/QmR5shjVosAoxdmY3EfkUWgFNV4CVUcbRNS7tkvbipssPX"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol":{"keccak256":"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97","urls":["bzz-raw://9f660b1f351b757dfe01438e59888f31f33ded3afcf5cb5b0d9bf9aa6f320a8b","dweb:/ipfs/QmarDJ5hZEgBtCmmrVzEZWjub9769eD686jmzb2XpSU1cM"],"license":"MIT"}},"version":1},"id":37}
|
||||||
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
{"abi":[],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"StdChains provides information about EVM compatible chains that can be used in scripts/tests. For each chain, the chain's name, chain ID, and a default RPC URL are provided. Chains are identified by their alias, which is the same as the alias in the `[rpc_endpoints]` section of the `foundry.toml` file. For best UX, ensure the alias in the `foundry.toml` file match the alias used in this contract, which can be found as the first argument to the `setChainWithDefaultRpcUrl` call in the `initializeStdChains` function. There are two main ways to use this contract: 1. Set a chain with `setChain(string memory chainAlias, ChainData memory chain)` or `setChain(string memory chainAlias, Chain memory chain)` 2. Get a chain with `getChain(string memory chainAlias)` or `getChain(uint256 chainId)`. The first time either of those are used, chains are initialized with the default set of RPC URLs. This is done in `initializeStdChains`, which uses `setChainWithDefaultRpcUrl`. Defaults are recorded in `defaultRpcUrls`. The `setChain` function is straightforward, and it simply saves off the given chain data. The `getChain` methods use `getChainWithUpdatedRpcUrl` to return a chain. For example, let's say we want to retrieve the RPC URL for `mainnet`: - If you have specified data with `setChain`, it will return that. - If you have configured a mainnet RPC URL in `foundry.toml`, it will return the URL, provided it is valid (e.g. a URL is specified, or an environment variable is given and exists). - If neither of the above conditions is met, the default data is returned. Summarizing the above, the prioritization hierarchy is `setChain` -> `foundry.toml` -> environment variable -> defaults.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/forge-std/src/StdChains.sol\":\"StdChains\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"remappings\":[\":@abdk/=lib/abdk-libraries-solidity/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":abdk-libraries-solidity/=lib/abdk-libraries-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"lib/forge-std/src/StdChains.sol\":{\"keccak256\":\"0xb2cbca1a6ffa19926c31bad47393a070305c809fe5d88c52214d5c51ce0733c6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cf20975cfd9733910305fc8e746c7631c2ab210289aab036cec32f3c530335c7\",\"dweb:/ipfs/QmYYvVzvAN1uCt8XtDmWo5x2inSVJBYajFexe92rVWEuMf\"]},\"lib/forge-std/src/Vm.sol\":{\"keccak256\":\"0x9b4df44a3b748593a58be7ba64fa5f420e5dcd7927bfa5173186228bfe61782f\",\"license\":\"MIT OR Apache-2.0\",\"urls\":[\"bzz-raw://b89fcf92ee1d14237cfb0dd949341053389d5b6a043ad77349b65bef80b1d59f\",\"dweb:/ipfs/QmPkia3aNHrqvE4tqxG2AyrdB4W91jTAvcbchgs2wAo6NL\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@abdk/=lib/abdk-libraries-solidity/","@openzeppelin/=lib/openzeppelin-contracts/","abdk-libraries-solidity/=lib/abdk-libraries-solidity/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":100000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/forge-std/src/StdChains.sol":"StdChains"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"lib/forge-std/src/StdChains.sol":{"keccak256":"0xb2cbca1a6ffa19926c31bad47393a070305c809fe5d88c52214d5c51ce0733c6","urls":["bzz-raw://cf20975cfd9733910305fc8e746c7631c2ab210289aab036cec32f3c530335c7","dweb:/ipfs/QmYYvVzvAN1uCt8XtDmWo5x2inSVJBYajFexe92rVWEuMf"],"license":"MIT"},"lib/forge-std/src/Vm.sol":{"keccak256":"0x9b4df44a3b748593a58be7ba64fa5f420e5dcd7927bfa5173186228bfe61782f","urls":["bzz-raw://b89fcf92ee1d14237cfb0dd949341053389d5b6a043ad77349b65bef80b1d59f","dweb:/ipfs/QmPkia3aNHrqvE4tqxG2AyrdB4W91jTAvcbchgs2wAo6NL"],"license":"MIT OR Apache-2.0"}},"version":1},"id":3}
|
{"abi":[],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"StdChains provides information about EVM compatible chains that can be used in scripts/tests. For each chain, the chain's name, chain ID, and a default RPC URL are provided. Chains are identified by their alias, which is the same as the alias in the `[rpc_endpoints]` section of the `foundry.toml` file. For best UX, ensure the alias in the `foundry.toml` file match the alias used in this contract, which can be found as the first argument to the `setChainWithDefaultRpcUrl` call in the `initializeStdChains` function. There are two main ways to use this contract: 1. Set a chain with `setChain(string memory chainAlias, ChainData memory chain)` or `setChain(string memory chainAlias, Chain memory chain)` 2. Get a chain with `getChain(string memory chainAlias)` or `getChain(uint256 chainId)`. The first time either of those are used, chains are initialized with the default set of RPC URLs. This is done in `initializeStdChains`, which uses `setChainWithDefaultRpcUrl`. Defaults are recorded in `defaultRpcUrls`. The `setChain` function is straightforward, and it simply saves off the given chain data. The `getChain` methods use `getChainWithUpdatedRpcUrl` to return a chain. For example, let's say we want to retrieve the RPC URL for `mainnet`: - If you have specified data with `setChain`, it will return that. - If you have configured a mainnet RPC URL in `foundry.toml`, it will return the URL, provided it is valid (e.g. a URL is specified, or an environment variable is given and exists). - If neither of the above conditions is met, the default data is returned. Summarizing the above, the prioritization hierarchy is `setChain` -> `foundry.toml` -> environment variable -> defaults.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/forge-std/src/StdChains.sol\":\"StdChains\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"remappings\":[\":@abdk/=lib/abdk-libraries-solidity/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":abdk-libraries-solidity/=lib/abdk-libraries-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"lib/forge-std/src/StdChains.sol\":{\"keccak256\":\"0xb2cbca1a6ffa19926c31bad47393a070305c809fe5d88c52214d5c51ce0733c6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cf20975cfd9733910305fc8e746c7631c2ab210289aab036cec32f3c530335c7\",\"dweb:/ipfs/QmYYvVzvAN1uCt8XtDmWo5x2inSVJBYajFexe92rVWEuMf\"]},\"lib/forge-std/src/Vm.sol\":{\"keccak256\":\"0x9b4df44a3b748593a58be7ba64fa5f420e5dcd7927bfa5173186228bfe61782f\",\"license\":\"MIT OR Apache-2.0\",\"urls\":[\"bzz-raw://b89fcf92ee1d14237cfb0dd949341053389d5b6a043ad77349b65bef80b1d59f\",\"dweb:/ipfs/QmPkia3aNHrqvE4tqxG2AyrdB4W91jTAvcbchgs2wAo6NL\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@abdk/=lib/abdk-libraries-solidity/","@openzeppelin/=lib/openzeppelin-contracts/","abdk-libraries-solidity/=lib/abdk-libraries-solidity/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":100000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/forge-std/src/StdChains.sol":"StdChains"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"lib/forge-std/src/StdChains.sol":{"keccak256":"0xb2cbca1a6ffa19926c31bad47393a070305c809fe5d88c52214d5c51ce0733c6","urls":["bzz-raw://cf20975cfd9733910305fc8e746c7631c2ab210289aab036cec32f3c530335c7","dweb:/ipfs/QmYYvVzvAN1uCt8XtDmWo5x2inSVJBYajFexe92rVWEuMf"],"license":"MIT"},"lib/forge-std/src/Vm.sol":{"keccak256":"0x9b4df44a3b748593a58be7ba64fa5f420e5dcd7927bfa5173186228bfe61782f","urls":["bzz-raw://b89fcf92ee1d14237cfb0dd949341053389d5b6a043ad77349b65bef80b1d59f","dweb:/ipfs/QmPkia3aNHrqvE4tqxG2AyrdB4W91jTAvcbchgs2wAo6NL"],"license":"MIT OR Apache-2.0"}},"version":1},"id":4}
|
||||||
@@ -1 +1 @@
|
|||||||
{"abi":[],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/forge-std/src/StdCheats.sol\":\"StdCheats\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"remappings\":[\":@abdk/=lib/abdk-libraries-solidity/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":abdk-libraries-solidity/=lib/abdk-libraries-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"lib/forge-std/src/StdCheats.sol\":{\"keccak256\":\"0x0fa6ec03602648b62cce41aab2096e6b7e052f2846075d967b6958dd586db746\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cd84e2ca9c1eaed6b76768cc12bb8c1af8289170ea8b7706f58d516460d79c41\",\"dweb:/ipfs/QmQ7BK7co6DE4eWUqMyv11s5eHYkS1tyx8tDSZGZVtf2aK\"]},\"lib/forge-std/src/StdStorage.sol\":{\"keccak256\":\"0x04102de0a79398e4bdea57b7a4818655b4cc66d6f81d1cff08bf428cd0b384cd\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://53edc6c8f7f67cafc0129f039637c77d979880f7f1947defea31e8f0c05095bc\",\"dweb:/ipfs/QmUKXJd1vFCkxxrkXNLURdXrx2apoyWQFrFb5UqNkjdHVi\"]},\"lib/forge-std/src/Vm.sol\":{\"keccak256\":\"0x9b4df44a3b748593a58be7ba64fa5f420e5dcd7927bfa5173186228bfe61782f\",\"license\":\"MIT OR Apache-2.0\",\"urls\":[\"bzz-raw://b89fcf92ee1d14237cfb0dd949341053389d5b6a043ad77349b65bef80b1d59f\",\"dweb:/ipfs/QmPkia3aNHrqvE4tqxG2AyrdB4W91jTAvcbchgs2wAo6NL\"]},\"lib/forge-std/src/console.sol\":{\"keccak256\":\"0x4bbf47eb762cef93729d6ef15e78789957147039b113e5d4df48e3d3fd16d0f5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://af9e3a7c3d82fb5b10b57ca4d1a82f2acbef80c077f6f6ef0cc0187c7bfd9f57\",\"dweb:/ipfs/QmR9VzmnBDJpgiDP6CHT6truehukF9HpYvuP6kRiJbDwPP\"]},\"lib/forge-std/src/console2.sol\":{\"keccak256\":\"0x3b8fe79f48f065a4e4d35362171304a33784c3a90febae5f2787805a438de12f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://61de63af08803549299e68b6e6e88d40f3c5afac450e4ee0a228c66a61ba003d\",\"dweb:/ipfs/QmWVoQ5rrVxnczD4ZZoPbD4PC9Z3uExJtzjD4awTqd14MZ\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@abdk/=lib/abdk-libraries-solidity/","@openzeppelin/=lib/openzeppelin-contracts/","abdk-libraries-solidity/=lib/abdk-libraries-solidity/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":100000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/forge-std/src/StdCheats.sol":"StdCheats"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"lib/forge-std/src/StdCheats.sol":{"keccak256":"0x0fa6ec03602648b62cce41aab2096e6b7e052f2846075d967b6958dd586db746","urls":["bzz-raw://cd84e2ca9c1eaed6b76768cc12bb8c1af8289170ea8b7706f58d516460d79c41","dweb:/ipfs/QmQ7BK7co6DE4eWUqMyv11s5eHYkS1tyx8tDSZGZVtf2aK"],"license":"MIT"},"lib/forge-std/src/StdStorage.sol":{"keccak256":"0x04102de0a79398e4bdea57b7a4818655b4cc66d6f81d1cff08bf428cd0b384cd","urls":["bzz-raw://53edc6c8f7f67cafc0129f039637c77d979880f7f1947defea31e8f0c05095bc","dweb:/ipfs/QmUKXJd1vFCkxxrkXNLURdXrx2apoyWQFrFb5UqNkjdHVi"],"license":"MIT"},"lib/forge-std/src/Vm.sol":{"keccak256":"0x9b4df44a3b748593a58be7ba64fa5f420e5dcd7927bfa5173186228bfe61782f","urls":["bzz-raw://b89fcf92ee1d14237cfb0dd949341053389d5b6a043ad77349b65bef80b1d59f","dweb:/ipfs/QmPkia3aNHrqvE4tqxG2AyrdB4W91jTAvcbchgs2wAo6NL"],"license":"MIT OR Apache-2.0"},"lib/forge-std/src/console.sol":{"keccak256":"0x4bbf47eb762cef93729d6ef15e78789957147039b113e5d4df48e3d3fd16d0f5","urls":["bzz-raw://af9e3a7c3d82fb5b10b57ca4d1a82f2acbef80c077f6f6ef0cc0187c7bfd9f57","dweb:/ipfs/QmR9VzmnBDJpgiDP6CHT6truehukF9HpYvuP6kRiJbDwPP"],"license":"MIT"},"lib/forge-std/src/console2.sol":{"keccak256":"0x3b8fe79f48f065a4e4d35362171304a33784c3a90febae5f2787805a438de12f","urls":["bzz-raw://61de63af08803549299e68b6e6e88d40f3c5afac450e4ee0a228c66a61ba003d","dweb:/ipfs/QmWVoQ5rrVxnczD4ZZoPbD4PC9Z3uExJtzjD4awTqd14MZ"],"license":"MIT"}},"version":1},"id":4}
|
{"abi":[],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/forge-std/src/StdCheats.sol\":\"StdCheats\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"remappings\":[\":@abdk/=lib/abdk-libraries-solidity/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":abdk-libraries-solidity/=lib/abdk-libraries-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"lib/forge-std/src/StdCheats.sol\":{\"keccak256\":\"0x0fa6ec03602648b62cce41aab2096e6b7e052f2846075d967b6958dd586db746\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cd84e2ca9c1eaed6b76768cc12bb8c1af8289170ea8b7706f58d516460d79c41\",\"dweb:/ipfs/QmQ7BK7co6DE4eWUqMyv11s5eHYkS1tyx8tDSZGZVtf2aK\"]},\"lib/forge-std/src/StdStorage.sol\":{\"keccak256\":\"0x04102de0a79398e4bdea57b7a4818655b4cc66d6f81d1cff08bf428cd0b384cd\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://53edc6c8f7f67cafc0129f039637c77d979880f7f1947defea31e8f0c05095bc\",\"dweb:/ipfs/QmUKXJd1vFCkxxrkXNLURdXrx2apoyWQFrFb5UqNkjdHVi\"]},\"lib/forge-std/src/Vm.sol\":{\"keccak256\":\"0x9b4df44a3b748593a58be7ba64fa5f420e5dcd7927bfa5173186228bfe61782f\",\"license\":\"MIT OR Apache-2.0\",\"urls\":[\"bzz-raw://b89fcf92ee1d14237cfb0dd949341053389d5b6a043ad77349b65bef80b1d59f\",\"dweb:/ipfs/QmPkia3aNHrqvE4tqxG2AyrdB4W91jTAvcbchgs2wAo6NL\"]},\"lib/forge-std/src/console.sol\":{\"keccak256\":\"0x4bbf47eb762cef93729d6ef15e78789957147039b113e5d4df48e3d3fd16d0f5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://af9e3a7c3d82fb5b10b57ca4d1a82f2acbef80c077f6f6ef0cc0187c7bfd9f57\",\"dweb:/ipfs/QmR9VzmnBDJpgiDP6CHT6truehukF9HpYvuP6kRiJbDwPP\"]},\"lib/forge-std/src/console2.sol\":{\"keccak256\":\"0x3b8fe79f48f065a4e4d35362171304a33784c3a90febae5f2787805a438de12f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://61de63af08803549299e68b6e6e88d40f3c5afac450e4ee0a228c66a61ba003d\",\"dweb:/ipfs/QmWVoQ5rrVxnczD4ZZoPbD4PC9Z3uExJtzjD4awTqd14MZ\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@abdk/=lib/abdk-libraries-solidity/","@openzeppelin/=lib/openzeppelin-contracts/","abdk-libraries-solidity/=lib/abdk-libraries-solidity/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":100000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/forge-std/src/StdCheats.sol":"StdCheats"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"lib/forge-std/src/StdCheats.sol":{"keccak256":"0x0fa6ec03602648b62cce41aab2096e6b7e052f2846075d967b6958dd586db746","urls":["bzz-raw://cd84e2ca9c1eaed6b76768cc12bb8c1af8289170ea8b7706f58d516460d79c41","dweb:/ipfs/QmQ7BK7co6DE4eWUqMyv11s5eHYkS1tyx8tDSZGZVtf2aK"],"license":"MIT"},"lib/forge-std/src/StdStorage.sol":{"keccak256":"0x04102de0a79398e4bdea57b7a4818655b4cc66d6f81d1cff08bf428cd0b384cd","urls":["bzz-raw://53edc6c8f7f67cafc0129f039637c77d979880f7f1947defea31e8f0c05095bc","dweb:/ipfs/QmUKXJd1vFCkxxrkXNLURdXrx2apoyWQFrFb5UqNkjdHVi"],"license":"MIT"},"lib/forge-std/src/Vm.sol":{"keccak256":"0x9b4df44a3b748593a58be7ba64fa5f420e5dcd7927bfa5173186228bfe61782f","urls":["bzz-raw://b89fcf92ee1d14237cfb0dd949341053389d5b6a043ad77349b65bef80b1d59f","dweb:/ipfs/QmPkia3aNHrqvE4tqxG2AyrdB4W91jTAvcbchgs2wAo6NL"],"license":"MIT OR Apache-2.0"},"lib/forge-std/src/console.sol":{"keccak256":"0x4bbf47eb762cef93729d6ef15e78789957147039b113e5d4df48e3d3fd16d0f5","urls":["bzz-raw://af9e3a7c3d82fb5b10b57ca4d1a82f2acbef80c077f6f6ef0cc0187c7bfd9f57","dweb:/ipfs/QmR9VzmnBDJpgiDP6CHT6truehukF9HpYvuP6kRiJbDwPP"],"license":"MIT"},"lib/forge-std/src/console2.sol":{"keccak256":"0x3b8fe79f48f065a4e4d35362171304a33784c3a90febae5f2787805a438de12f","urls":["bzz-raw://61de63af08803549299e68b6e6e88d40f3c5afac450e4ee0a228c66a61ba003d","dweb:/ipfs/QmWVoQ5rrVxnczD4ZZoPbD4PC9Z3uExJtzjD4awTqd14MZ"],"license":"MIT"}},"version":1},"id":5}
|
||||||
@@ -1 +1 @@
|
|||||||
{"abi":[],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/forge-std/src/StdCheats.sol\":\"StdCheatsSafe\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"remappings\":[\":@abdk/=lib/abdk-libraries-solidity/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":abdk-libraries-solidity/=lib/abdk-libraries-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"lib/forge-std/src/StdCheats.sol\":{\"keccak256\":\"0x0fa6ec03602648b62cce41aab2096e6b7e052f2846075d967b6958dd586db746\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cd84e2ca9c1eaed6b76768cc12bb8c1af8289170ea8b7706f58d516460d79c41\",\"dweb:/ipfs/QmQ7BK7co6DE4eWUqMyv11s5eHYkS1tyx8tDSZGZVtf2aK\"]},\"lib/forge-std/src/StdStorage.sol\":{\"keccak256\":\"0x04102de0a79398e4bdea57b7a4818655b4cc66d6f81d1cff08bf428cd0b384cd\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://53edc6c8f7f67cafc0129f039637c77d979880f7f1947defea31e8f0c05095bc\",\"dweb:/ipfs/QmUKXJd1vFCkxxrkXNLURdXrx2apoyWQFrFb5UqNkjdHVi\"]},\"lib/forge-std/src/Vm.sol\":{\"keccak256\":\"0x9b4df44a3b748593a58be7ba64fa5f420e5dcd7927bfa5173186228bfe61782f\",\"license\":\"MIT OR Apache-2.0\",\"urls\":[\"bzz-raw://b89fcf92ee1d14237cfb0dd949341053389d5b6a043ad77349b65bef80b1d59f\",\"dweb:/ipfs/QmPkia3aNHrqvE4tqxG2AyrdB4W91jTAvcbchgs2wAo6NL\"]},\"lib/forge-std/src/console.sol\":{\"keccak256\":\"0x4bbf47eb762cef93729d6ef15e78789957147039b113e5d4df48e3d3fd16d0f5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://af9e3a7c3d82fb5b10b57ca4d1a82f2acbef80c077f6f6ef0cc0187c7bfd9f57\",\"dweb:/ipfs/QmR9VzmnBDJpgiDP6CHT6truehukF9HpYvuP6kRiJbDwPP\"]},\"lib/forge-std/src/console2.sol\":{\"keccak256\":\"0x3b8fe79f48f065a4e4d35362171304a33784c3a90febae5f2787805a438de12f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://61de63af08803549299e68b6e6e88d40f3c5afac450e4ee0a228c66a61ba003d\",\"dweb:/ipfs/QmWVoQ5rrVxnczD4ZZoPbD4PC9Z3uExJtzjD4awTqd14MZ\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@abdk/=lib/abdk-libraries-solidity/","@openzeppelin/=lib/openzeppelin-contracts/","abdk-libraries-solidity/=lib/abdk-libraries-solidity/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":100000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/forge-std/src/StdCheats.sol":"StdCheatsSafe"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"lib/forge-std/src/StdCheats.sol":{"keccak256":"0x0fa6ec03602648b62cce41aab2096e6b7e052f2846075d967b6958dd586db746","urls":["bzz-raw://cd84e2ca9c1eaed6b76768cc12bb8c1af8289170ea8b7706f58d516460d79c41","dweb:/ipfs/QmQ7BK7co6DE4eWUqMyv11s5eHYkS1tyx8tDSZGZVtf2aK"],"license":"MIT"},"lib/forge-std/src/StdStorage.sol":{"keccak256":"0x04102de0a79398e4bdea57b7a4818655b4cc66d6f81d1cff08bf428cd0b384cd","urls":["bzz-raw://53edc6c8f7f67cafc0129f039637c77d979880f7f1947defea31e8f0c05095bc","dweb:/ipfs/QmUKXJd1vFCkxxrkXNLURdXrx2apoyWQFrFb5UqNkjdHVi"],"license":"MIT"},"lib/forge-std/src/Vm.sol":{"keccak256":"0x9b4df44a3b748593a58be7ba64fa5f420e5dcd7927bfa5173186228bfe61782f","urls":["bzz-raw://b89fcf92ee1d14237cfb0dd949341053389d5b6a043ad77349b65bef80b1d59f","dweb:/ipfs/QmPkia3aNHrqvE4tqxG2AyrdB4W91jTAvcbchgs2wAo6NL"],"license":"MIT OR Apache-2.0"},"lib/forge-std/src/console.sol":{"keccak256":"0x4bbf47eb762cef93729d6ef15e78789957147039b113e5d4df48e3d3fd16d0f5","urls":["bzz-raw://af9e3a7c3d82fb5b10b57ca4d1a82f2acbef80c077f6f6ef0cc0187c7bfd9f57","dweb:/ipfs/QmR9VzmnBDJpgiDP6CHT6truehukF9HpYvuP6kRiJbDwPP"],"license":"MIT"},"lib/forge-std/src/console2.sol":{"keccak256":"0x3b8fe79f48f065a4e4d35362171304a33784c3a90febae5f2787805a438de12f","urls":["bzz-raw://61de63af08803549299e68b6e6e88d40f3c5afac450e4ee0a228c66a61ba003d","dweb:/ipfs/QmWVoQ5rrVxnczD4ZZoPbD4PC9Z3uExJtzjD4awTqd14MZ"],"license":"MIT"}},"version":1},"id":4}
|
{"abi":[],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/forge-std/src/StdCheats.sol\":\"StdCheatsSafe\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"remappings\":[\":@abdk/=lib/abdk-libraries-solidity/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":abdk-libraries-solidity/=lib/abdk-libraries-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"lib/forge-std/src/StdCheats.sol\":{\"keccak256\":\"0x0fa6ec03602648b62cce41aab2096e6b7e052f2846075d967b6958dd586db746\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cd84e2ca9c1eaed6b76768cc12bb8c1af8289170ea8b7706f58d516460d79c41\",\"dweb:/ipfs/QmQ7BK7co6DE4eWUqMyv11s5eHYkS1tyx8tDSZGZVtf2aK\"]},\"lib/forge-std/src/StdStorage.sol\":{\"keccak256\":\"0x04102de0a79398e4bdea57b7a4818655b4cc66d6f81d1cff08bf428cd0b384cd\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://53edc6c8f7f67cafc0129f039637c77d979880f7f1947defea31e8f0c05095bc\",\"dweb:/ipfs/QmUKXJd1vFCkxxrkXNLURdXrx2apoyWQFrFb5UqNkjdHVi\"]},\"lib/forge-std/src/Vm.sol\":{\"keccak256\":\"0x9b4df44a3b748593a58be7ba64fa5f420e5dcd7927bfa5173186228bfe61782f\",\"license\":\"MIT OR Apache-2.0\",\"urls\":[\"bzz-raw://b89fcf92ee1d14237cfb0dd949341053389d5b6a043ad77349b65bef80b1d59f\",\"dweb:/ipfs/QmPkia3aNHrqvE4tqxG2AyrdB4W91jTAvcbchgs2wAo6NL\"]},\"lib/forge-std/src/console.sol\":{\"keccak256\":\"0x4bbf47eb762cef93729d6ef15e78789957147039b113e5d4df48e3d3fd16d0f5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://af9e3a7c3d82fb5b10b57ca4d1a82f2acbef80c077f6f6ef0cc0187c7bfd9f57\",\"dweb:/ipfs/QmR9VzmnBDJpgiDP6CHT6truehukF9HpYvuP6kRiJbDwPP\"]},\"lib/forge-std/src/console2.sol\":{\"keccak256\":\"0x3b8fe79f48f065a4e4d35362171304a33784c3a90febae5f2787805a438de12f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://61de63af08803549299e68b6e6e88d40f3c5afac450e4ee0a228c66a61ba003d\",\"dweb:/ipfs/QmWVoQ5rrVxnczD4ZZoPbD4PC9Z3uExJtzjD4awTqd14MZ\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@abdk/=lib/abdk-libraries-solidity/","@openzeppelin/=lib/openzeppelin-contracts/","abdk-libraries-solidity/=lib/abdk-libraries-solidity/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":100000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/forge-std/src/StdCheats.sol":"StdCheatsSafe"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"lib/forge-std/src/StdCheats.sol":{"keccak256":"0x0fa6ec03602648b62cce41aab2096e6b7e052f2846075d967b6958dd586db746","urls":["bzz-raw://cd84e2ca9c1eaed6b76768cc12bb8c1af8289170ea8b7706f58d516460d79c41","dweb:/ipfs/QmQ7BK7co6DE4eWUqMyv11s5eHYkS1tyx8tDSZGZVtf2aK"],"license":"MIT"},"lib/forge-std/src/StdStorage.sol":{"keccak256":"0x04102de0a79398e4bdea57b7a4818655b4cc66d6f81d1cff08bf428cd0b384cd","urls":["bzz-raw://53edc6c8f7f67cafc0129f039637c77d979880f7f1947defea31e8f0c05095bc","dweb:/ipfs/QmUKXJd1vFCkxxrkXNLURdXrx2apoyWQFrFb5UqNkjdHVi"],"license":"MIT"},"lib/forge-std/src/Vm.sol":{"keccak256":"0x9b4df44a3b748593a58be7ba64fa5f420e5dcd7927bfa5173186228bfe61782f","urls":["bzz-raw://b89fcf92ee1d14237cfb0dd949341053389d5b6a043ad77349b65bef80b1d59f","dweb:/ipfs/QmPkia3aNHrqvE4tqxG2AyrdB4W91jTAvcbchgs2wAo6NL"],"license":"MIT OR Apache-2.0"},"lib/forge-std/src/console.sol":{"keccak256":"0x4bbf47eb762cef93729d6ef15e78789957147039b113e5d4df48e3d3fd16d0f5","urls":["bzz-raw://af9e3a7c3d82fb5b10b57ca4d1a82f2acbef80c077f6f6ef0cc0187c7bfd9f57","dweb:/ipfs/QmR9VzmnBDJpgiDP6CHT6truehukF9HpYvuP6kRiJbDwPP"],"license":"MIT"},"lib/forge-std/src/console2.sol":{"keccak256":"0x3b8fe79f48f065a4e4d35362171304a33784c3a90febae5f2787805a438de12f","urls":["bzz-raw://61de63af08803549299e68b6e6e88d40f3c5afac450e4ee0a228c66a61ba003d","dweb:/ipfs/QmWVoQ5rrVxnczD4ZZoPbD4PC9Z3uExJtzjD4awTqd14MZ"],"license":"MIT"}},"version":1},"id":5}
|
||||||
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
{"abi":[],"bytecode":{"object":"0x6080806040523460175760399081601c823930815050f35b5f80fdfe5f80fdfea2646970667358221220f305db5938071a82ff12d5cca101765d7bc698c9c34558487d9c37f2ce06498864736f6c634300081e0033","sourceMap":"610:9092:6:-:0;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x5f80fdfea2646970667358221220f305db5938071a82ff12d5cca101765d7bc698c9c34558487d9c37f2ce06498864736f6c634300081e0033","sourceMap":"610:9092:6:-:0;;","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/forge-std/src/StdJson.sol\":\"stdJson\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"remappings\":[\":@abdk/=lib/abdk-libraries-solidity/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":abdk-libraries-solidity/=lib/abdk-libraries-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"lib/forge-std/src/StdJson.sol\":{\"keccak256\":\"0xbc0132abe1c2accc2867c0f03667afffdf92f3e95a581bb03c9557eaa38ea500\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://eb6fab37dc73c219cfbb7b4f4998bcf7677ca5397a867e850f40232192073974\",\"dweb:/ipfs/QmUHsbVdp9SKmgek7ZfPcLTKrpZFXpqaqt4sVejzxGEQL3\"]},\"lib/forge-std/src/Vm.sol\":{\"keccak256\":\"0x9b4df44a3b748593a58be7ba64fa5f420e5dcd7927bfa5173186228bfe61782f\",\"license\":\"MIT OR Apache-2.0\",\"urls\":[\"bzz-raw://b89fcf92ee1d14237cfb0dd949341053389d5b6a043ad77349b65bef80b1d59f\",\"dweb:/ipfs/QmPkia3aNHrqvE4tqxG2AyrdB4W91jTAvcbchgs2wAo6NL\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@abdk/=lib/abdk-libraries-solidity/","@openzeppelin/=lib/openzeppelin-contracts/","abdk-libraries-solidity/=lib/abdk-libraries-solidity/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":100000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/forge-std/src/StdJson.sol":"stdJson"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"lib/forge-std/src/StdJson.sol":{"keccak256":"0xbc0132abe1c2accc2867c0f03667afffdf92f3e95a581bb03c9557eaa38ea500","urls":["bzz-raw://eb6fab37dc73c219cfbb7b4f4998bcf7677ca5397a867e850f40232192073974","dweb:/ipfs/QmUHsbVdp9SKmgek7ZfPcLTKrpZFXpqaqt4sVejzxGEQL3"],"license":"MIT"},"lib/forge-std/src/Vm.sol":{"keccak256":"0x9b4df44a3b748593a58be7ba64fa5f420e5dcd7927bfa5173186228bfe61782f","urls":["bzz-raw://b89fcf92ee1d14237cfb0dd949341053389d5b6a043ad77349b65bef80b1d59f","dweb:/ipfs/QmPkia3aNHrqvE4tqxG2AyrdB4W91jTAvcbchgs2wAo6NL"],"license":"MIT OR Apache-2.0"}},"version":1},"id":6}
|
{"abi":[],"bytecode":{"object":"0x6080806040523460175760399081601c823930815050f35b5f80fdfe5f80fdfea2646970667358221220f305db5938071a82ff12d5cca101765d7bc698c9c34558487d9c37f2ce06498864736f6c634300081e0033","sourceMap":"610:9092:9:-:0;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x5f80fdfea2646970667358221220f305db5938071a82ff12d5cca101765d7bc698c9c34558487d9c37f2ce06498864736f6c634300081e0033","sourceMap":"610:9092:9:-:0;;","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/forge-std/src/StdJson.sol\":\"stdJson\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"remappings\":[\":@abdk/=lib/abdk-libraries-solidity/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":abdk-libraries-solidity/=lib/abdk-libraries-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"lib/forge-std/src/StdJson.sol\":{\"keccak256\":\"0xbc0132abe1c2accc2867c0f03667afffdf92f3e95a581bb03c9557eaa38ea500\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://eb6fab37dc73c219cfbb7b4f4998bcf7677ca5397a867e850f40232192073974\",\"dweb:/ipfs/QmUHsbVdp9SKmgek7ZfPcLTKrpZFXpqaqt4sVejzxGEQL3\"]},\"lib/forge-std/src/Vm.sol\":{\"keccak256\":\"0x9b4df44a3b748593a58be7ba64fa5f420e5dcd7927bfa5173186228bfe61782f\",\"license\":\"MIT OR Apache-2.0\",\"urls\":[\"bzz-raw://b89fcf92ee1d14237cfb0dd949341053389d5b6a043ad77349b65bef80b1d59f\",\"dweb:/ipfs/QmPkia3aNHrqvE4tqxG2AyrdB4W91jTAvcbchgs2wAo6NL\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@abdk/=lib/abdk-libraries-solidity/","@openzeppelin/=lib/openzeppelin-contracts/","abdk-libraries-solidity/=lib/abdk-libraries-solidity/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":100000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/forge-std/src/StdJson.sol":"stdJson"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"lib/forge-std/src/StdJson.sol":{"keccak256":"0xbc0132abe1c2accc2867c0f03667afffdf92f3e95a581bb03c9557eaa38ea500","urls":["bzz-raw://eb6fab37dc73c219cfbb7b4f4998bcf7677ca5397a867e850f40232192073974","dweb:/ipfs/QmUHsbVdp9SKmgek7ZfPcLTKrpZFXpqaqt4sVejzxGEQL3"],"license":"MIT"},"lib/forge-std/src/Vm.sol":{"keccak256":"0x9b4df44a3b748593a58be7ba64fa5f420e5dcd7927bfa5173186228bfe61782f","urls":["bzz-raw://b89fcf92ee1d14237cfb0dd949341053389d5b6a043ad77349b65bef80b1d59f","dweb:/ipfs/QmPkia3aNHrqvE4tqxG2AyrdB4W91jTAvcbchgs2wAo6NL"],"license":"MIT OR Apache-2.0"}},"version":1},"id":9}
|
||||||
@@ -1 +1 @@
|
|||||||
{"abi":[],"bytecode":{"object":"0x6080806040523460175760399081601c823930815050f35b5f80fdfe5f80fdfea2646970667358221220adcf8debe9b04ab23be8899f7649898efd38d0c0661f99c6186f371e6c71255d64736f6c634300081e0033","sourceMap":"65:1533:7:-:0;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x5f80fdfea2646970667358221220adcf8debe9b04ab23be8899f7649898efd38d0c0661f99c6186f371e6c71255d64736f6c634300081e0033","sourceMap":"65:1533:7:-:0;;","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/forge-std/src/StdMath.sol\":\"stdMath\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"remappings\":[\":@abdk/=lib/abdk-libraries-solidity/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":abdk-libraries-solidity/=lib/abdk-libraries-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"lib/forge-std/src/StdMath.sol\":{\"keccak256\":\"0xcb876f5421e5aae334f9a6c5d549131c18ad347f1035d2a1e920f2623f346c85\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://28076e06b01be4095f860fa9b142c284bac34c0813948e0a52d11acc15502db6\",\"dweb:/ipfs/QmVR6XFTmBatJAVvYgkZxN21R5zvYTU4ard4Aow8TmXjy9\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@abdk/=lib/abdk-libraries-solidity/","@openzeppelin/=lib/openzeppelin-contracts/","abdk-libraries-solidity/=lib/abdk-libraries-solidity/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":100000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/forge-std/src/StdMath.sol":"stdMath"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"lib/forge-std/src/StdMath.sol":{"keccak256":"0xcb876f5421e5aae334f9a6c5d549131c18ad347f1035d2a1e920f2623f346c85","urls":["bzz-raw://28076e06b01be4095f860fa9b142c284bac34c0813948e0a52d11acc15502db6","dweb:/ipfs/QmVR6XFTmBatJAVvYgkZxN21R5zvYTU4ard4Aow8TmXjy9"],"license":"MIT"}},"version":1},"id":7}
|
{"abi":[],"bytecode":{"object":"0x6080806040523460175760399081601c823930815050f35b5f80fdfe5f80fdfea2646970667358221220adcf8debe9b04ab23be8899f7649898efd38d0c0661f99c6186f371e6c71255d64736f6c634300081e0033","sourceMap":"65:1533:10:-:0;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x5f80fdfea2646970667358221220adcf8debe9b04ab23be8899f7649898efd38d0c0661f99c6186f371e6c71255d64736f6c634300081e0033","sourceMap":"65:1533:10:-:0;;","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/forge-std/src/StdMath.sol\":\"stdMath\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"remappings\":[\":@abdk/=lib/abdk-libraries-solidity/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":abdk-libraries-solidity/=lib/abdk-libraries-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"lib/forge-std/src/StdMath.sol\":{\"keccak256\":\"0xcb876f5421e5aae334f9a6c5d549131c18ad347f1035d2a1e920f2623f346c85\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://28076e06b01be4095f860fa9b142c284bac34c0813948e0a52d11acc15502db6\",\"dweb:/ipfs/QmVR6XFTmBatJAVvYgkZxN21R5zvYTU4ard4Aow8TmXjy9\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@abdk/=lib/abdk-libraries-solidity/","@openzeppelin/=lib/openzeppelin-contracts/","abdk-libraries-solidity/=lib/abdk-libraries-solidity/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":100000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/forge-std/src/StdMath.sol":"stdMath"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"lib/forge-std/src/StdMath.sol":{"keccak256":"0xcb876f5421e5aae334f9a6c5d549131c18ad347f1035d2a1e920f2623f346c85","urls":["bzz-raw://28076e06b01be4095f860fa9b142c284bac34c0813948e0a52d11acc15502db6","dweb:/ipfs/QmVR6XFTmBatJAVvYgkZxN21R5zvYTU4ard4Aow8TmXjy9"],"license":"MIT"}},"version":1},"id":10}
|
||||||
@@ -1 +1 @@
|
|||||||
{"abi":[],"bytecode":{"object":"0x6080806040523460175760399081601c823930815050f35b5f80fdfe5f80fdfea26469706673582212205da5662f9d842c8ded410a0b709c832567faa4171dcdb71541befdbf20e9a73964736f6c634300081e0033","sourceMap":"12755:5081:8:-:0;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x5f80fdfea26469706673582212205da5662f9d842c8ded410a0b709c832567faa4171dcdb71541befdbf20e9a73964736f6c634300081e0033","sourceMap":"12755:5081:8:-:0;;","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/forge-std/src/StdStorage.sol\":\"stdStorage\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"remappings\":[\":@abdk/=lib/abdk-libraries-solidity/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":abdk-libraries-solidity/=lib/abdk-libraries-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"lib/forge-std/src/StdStorage.sol\":{\"keccak256\":\"0x04102de0a79398e4bdea57b7a4818655b4cc66d6f81d1cff08bf428cd0b384cd\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://53edc6c8f7f67cafc0129f039637c77d979880f7f1947defea31e8f0c05095bc\",\"dweb:/ipfs/QmUKXJd1vFCkxxrkXNLURdXrx2apoyWQFrFb5UqNkjdHVi\"]},\"lib/forge-std/src/Vm.sol\":{\"keccak256\":\"0x9b4df44a3b748593a58be7ba64fa5f420e5dcd7927bfa5173186228bfe61782f\",\"license\":\"MIT OR Apache-2.0\",\"urls\":[\"bzz-raw://b89fcf92ee1d14237cfb0dd949341053389d5b6a043ad77349b65bef80b1d59f\",\"dweb:/ipfs/QmPkia3aNHrqvE4tqxG2AyrdB4W91jTAvcbchgs2wAo6NL\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@abdk/=lib/abdk-libraries-solidity/","@openzeppelin/=lib/openzeppelin-contracts/","abdk-libraries-solidity/=lib/abdk-libraries-solidity/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":100000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/forge-std/src/StdStorage.sol":"stdStorage"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"lib/forge-std/src/StdStorage.sol":{"keccak256":"0x04102de0a79398e4bdea57b7a4818655b4cc66d6f81d1cff08bf428cd0b384cd","urls":["bzz-raw://53edc6c8f7f67cafc0129f039637c77d979880f7f1947defea31e8f0c05095bc","dweb:/ipfs/QmUKXJd1vFCkxxrkXNLURdXrx2apoyWQFrFb5UqNkjdHVi"],"license":"MIT"},"lib/forge-std/src/Vm.sol":{"keccak256":"0x9b4df44a3b748593a58be7ba64fa5f420e5dcd7927bfa5173186228bfe61782f","urls":["bzz-raw://b89fcf92ee1d14237cfb0dd949341053389d5b6a043ad77349b65bef80b1d59f","dweb:/ipfs/QmPkia3aNHrqvE4tqxG2AyrdB4W91jTAvcbchgs2wAo6NL"],"license":"MIT OR Apache-2.0"}},"version":1},"id":8}
|
{"abi":[],"bytecode":{"object":"0x6080806040523460175760399081601c823930815050f35b5f80fdfe5f80fdfea26469706673582212205da5662f9d842c8ded410a0b709c832567faa4171dcdb71541befdbf20e9a73964736f6c634300081e0033","sourceMap":"12755:5081:11:-:0;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x5f80fdfea26469706673582212205da5662f9d842c8ded410a0b709c832567faa4171dcdb71541befdbf20e9a73964736f6c634300081e0033","sourceMap":"12755:5081:11:-:0;;","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/forge-std/src/StdStorage.sol\":\"stdStorage\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"remappings\":[\":@abdk/=lib/abdk-libraries-solidity/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":abdk-libraries-solidity/=lib/abdk-libraries-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"lib/forge-std/src/StdStorage.sol\":{\"keccak256\":\"0x04102de0a79398e4bdea57b7a4818655b4cc66d6f81d1cff08bf428cd0b384cd\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://53edc6c8f7f67cafc0129f039637c77d979880f7f1947defea31e8f0c05095bc\",\"dweb:/ipfs/QmUKXJd1vFCkxxrkXNLURdXrx2apoyWQFrFb5UqNkjdHVi\"]},\"lib/forge-std/src/Vm.sol\":{\"keccak256\":\"0x9b4df44a3b748593a58be7ba64fa5f420e5dcd7927bfa5173186228bfe61782f\",\"license\":\"MIT OR Apache-2.0\",\"urls\":[\"bzz-raw://b89fcf92ee1d14237cfb0dd949341053389d5b6a043ad77349b65bef80b1d59f\",\"dweb:/ipfs/QmPkia3aNHrqvE4tqxG2AyrdB4W91jTAvcbchgs2wAo6NL\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@abdk/=lib/abdk-libraries-solidity/","@openzeppelin/=lib/openzeppelin-contracts/","abdk-libraries-solidity/=lib/abdk-libraries-solidity/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":100000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/forge-std/src/StdStorage.sol":"stdStorage"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"lib/forge-std/src/StdStorage.sol":{"keccak256":"0x04102de0a79398e4bdea57b7a4818655b4cc66d6f81d1cff08bf428cd0b384cd","urls":["bzz-raw://53edc6c8f7f67cafc0129f039637c77d979880f7f1947defea31e8f0c05095bc","dweb:/ipfs/QmUKXJd1vFCkxxrkXNLURdXrx2apoyWQFrFb5UqNkjdHVi"],"license":"MIT"},"lib/forge-std/src/Vm.sol":{"keccak256":"0x9b4df44a3b748593a58be7ba64fa5f420e5dcd7927bfa5173186228bfe61782f","urls":["bzz-raw://b89fcf92ee1d14237cfb0dd949341053389d5b6a043ad77349b65bef80b1d59f","dweb:/ipfs/QmPkia3aNHrqvE4tqxG2AyrdB4W91jTAvcbchgs2wAo6NL"],"license":"MIT OR Apache-2.0"}},"version":1},"id":11}
|
||||||
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
{"abi":[],"bytecode":{"object":"0x6080806040523460175760399081601c823930815050f35b5f80fdfe5f80fdfea26469706673582212200129420999a12c7d2a0dfd6cc82ba6ee0da34a58e359b77d477502f6d9c20a6964736f6c634300081e0033","sourceMap":"100:10361:9:-:0;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x5f80fdfea26469706673582212200129420999a12c7d2a0dfd6cc82ba6ee0da34a58e359b77d477502f6d9c20a6964736f6c634300081e0033","sourceMap":"100:10361:9:-:0;;","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/forge-std/src/StdStyle.sol\":\"StdStyle\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"remappings\":[\":@abdk/=lib/abdk-libraries-solidity/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":abdk-libraries-solidity/=lib/abdk-libraries-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"lib/forge-std/src/StdStyle.sol\":{\"keccak256\":\"0x43e2a8a9b9c2574dabe74f11adf6f782df218f463540e3b5b563609fe108597d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://51363ca97404cf4128e1141428949768c31929e75e014b02c85e887fbbb4f1b8\",\"dweb:/ipfs/QmVhtbQc2fU4rRmbcfBtz34mAgG4BAZBsbna1Ca4SkoPsK\"]},\"lib/forge-std/src/Vm.sol\":{\"keccak256\":\"0x9b4df44a3b748593a58be7ba64fa5f420e5dcd7927bfa5173186228bfe61782f\",\"license\":\"MIT OR Apache-2.0\",\"urls\":[\"bzz-raw://b89fcf92ee1d14237cfb0dd949341053389d5b6a043ad77349b65bef80b1d59f\",\"dweb:/ipfs/QmPkia3aNHrqvE4tqxG2AyrdB4W91jTAvcbchgs2wAo6NL\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@abdk/=lib/abdk-libraries-solidity/","@openzeppelin/=lib/openzeppelin-contracts/","abdk-libraries-solidity/=lib/abdk-libraries-solidity/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":100000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/forge-std/src/StdStyle.sol":"StdStyle"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"lib/forge-std/src/StdStyle.sol":{"keccak256":"0x43e2a8a9b9c2574dabe74f11adf6f782df218f463540e3b5b563609fe108597d","urls":["bzz-raw://51363ca97404cf4128e1141428949768c31929e75e014b02c85e887fbbb4f1b8","dweb:/ipfs/QmVhtbQc2fU4rRmbcfBtz34mAgG4BAZBsbna1Ca4SkoPsK"],"license":"MIT"},"lib/forge-std/src/Vm.sol":{"keccak256":"0x9b4df44a3b748593a58be7ba64fa5f420e5dcd7927bfa5173186228bfe61782f","urls":["bzz-raw://b89fcf92ee1d14237cfb0dd949341053389d5b6a043ad77349b65bef80b1d59f","dweb:/ipfs/QmPkia3aNHrqvE4tqxG2AyrdB4W91jTAvcbchgs2wAo6NL"],"license":"MIT OR Apache-2.0"}},"version":1},"id":9}
|
{"abi":[],"bytecode":{"object":"0x6080806040523460175760399081601c823930815050f35b5f80fdfe5f80fdfea26469706673582212200129420999a12c7d2a0dfd6cc82ba6ee0da34a58e359b77d477502f6d9c20a6964736f6c634300081e0033","sourceMap":"100:10361:12:-:0;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x5f80fdfea26469706673582212200129420999a12c7d2a0dfd6cc82ba6ee0da34a58e359b77d477502f6d9c20a6964736f6c634300081e0033","sourceMap":"100:10361:12:-:0;;","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/forge-std/src/StdStyle.sol\":\"StdStyle\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"remappings\":[\":@abdk/=lib/abdk-libraries-solidity/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":abdk-libraries-solidity/=lib/abdk-libraries-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"lib/forge-std/src/StdStyle.sol\":{\"keccak256\":\"0x43e2a8a9b9c2574dabe74f11adf6f782df218f463540e3b5b563609fe108597d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://51363ca97404cf4128e1141428949768c31929e75e014b02c85e887fbbb4f1b8\",\"dweb:/ipfs/QmVhtbQc2fU4rRmbcfBtz34mAgG4BAZBsbna1Ca4SkoPsK\"]},\"lib/forge-std/src/Vm.sol\":{\"keccak256\":\"0x9b4df44a3b748593a58be7ba64fa5f420e5dcd7927bfa5173186228bfe61782f\",\"license\":\"MIT OR Apache-2.0\",\"urls\":[\"bzz-raw://b89fcf92ee1d14237cfb0dd949341053389d5b6a043ad77349b65bef80b1d59f\",\"dweb:/ipfs/QmPkia3aNHrqvE4tqxG2AyrdB4W91jTAvcbchgs2wAo6NL\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@abdk/=lib/abdk-libraries-solidity/","@openzeppelin/=lib/openzeppelin-contracts/","abdk-libraries-solidity/=lib/abdk-libraries-solidity/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":100000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/forge-std/src/StdStyle.sol":"StdStyle"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"lib/forge-std/src/StdStyle.sol":{"keccak256":"0x43e2a8a9b9c2574dabe74f11adf6f782df218f463540e3b5b563609fe108597d","urls":["bzz-raw://51363ca97404cf4128e1141428949768c31929e75e014b02c85e887fbbb4f1b8","dweb:/ipfs/QmVhtbQc2fU4rRmbcfBtz34mAgG4BAZBsbna1Ca4SkoPsK"],"license":"MIT"},"lib/forge-std/src/Vm.sol":{"keccak256":"0x9b4df44a3b748593a58be7ba64fa5f420e5dcd7927bfa5173186228bfe61782f","urls":["bzz-raw://b89fcf92ee1d14237cfb0dd949341053389d5b6a043ad77349b65bef80b1d59f","dweb:/ipfs/QmPkia3aNHrqvE4tqxG2AyrdB4W91jTAvcbchgs2wAo6NL"],"license":"MIT OR Apache-2.0"}},"version":1},"id":12}
|
||||||
@@ -1 +1 @@
|
|||||||
{"abi":[],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/forge-std/src/StdUtils.sol\":\"StdUtils\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"remappings\":[\":@abdk/=lib/abdk-libraries-solidity/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":abdk-libraries-solidity/=lib/abdk-libraries-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"lib/forge-std/src/StdUtils.sol\":{\"keccak256\":\"0xb2469a902a326074034c4f7081d868113db0edbb7cf48b86528af2d6b07295f8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1430a81c4978be875e2a3b31a8bfa4e1438fecd327f23771b690d64db63c020a\",\"dweb:/ipfs/QmW6aB2u1LNaRgGQFwjV7L7UbxsRg63iJ7AuujPouEa4cT\"]},\"lib/forge-std/src/Vm.sol\":{\"keccak256\":\"0x9b4df44a3b748593a58be7ba64fa5f420e5dcd7927bfa5173186228bfe61782f\",\"license\":\"MIT OR Apache-2.0\",\"urls\":[\"bzz-raw://b89fcf92ee1d14237cfb0dd949341053389d5b6a043ad77349b65bef80b1d59f\",\"dweb:/ipfs/QmPkia3aNHrqvE4tqxG2AyrdB4W91jTAvcbchgs2wAo6NL\"]},\"lib/forge-std/src/interfaces/IMulticall3.sol\":{\"keccak256\":\"0x7aac1389150499a922d1f9ef5749c908cef127cb2075b92fa17e9cb611263d0a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d95ebb7c7c463e08ebc12dab639945752fb2480acfc6e86da32f72732a7fd0c0\",\"dweb:/ipfs/QmNXK8P8oPWwajsQHvAHw3JPyQidPLCGQN3hWu1Lk6PBL2\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@abdk/=lib/abdk-libraries-solidity/","@openzeppelin/=lib/openzeppelin-contracts/","abdk-libraries-solidity/=lib/abdk-libraries-solidity/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":100000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/forge-std/src/StdUtils.sol":"StdUtils"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"lib/forge-std/src/StdUtils.sol":{"keccak256":"0xb2469a902a326074034c4f7081d868113db0edbb7cf48b86528af2d6b07295f8","urls":["bzz-raw://1430a81c4978be875e2a3b31a8bfa4e1438fecd327f23771b690d64db63c020a","dweb:/ipfs/QmW6aB2u1LNaRgGQFwjV7L7UbxsRg63iJ7AuujPouEa4cT"],"license":"MIT"},"lib/forge-std/src/Vm.sol":{"keccak256":"0x9b4df44a3b748593a58be7ba64fa5f420e5dcd7927bfa5173186228bfe61782f","urls":["bzz-raw://b89fcf92ee1d14237cfb0dd949341053389d5b6a043ad77349b65bef80b1d59f","dweb:/ipfs/QmPkia3aNHrqvE4tqxG2AyrdB4W91jTAvcbchgs2wAo6NL"],"license":"MIT OR Apache-2.0"},"lib/forge-std/src/interfaces/IMulticall3.sol":{"keccak256":"0x7aac1389150499a922d1f9ef5749c908cef127cb2075b92fa17e9cb611263d0a","urls":["bzz-raw://d95ebb7c7c463e08ebc12dab639945752fb2480acfc6e86da32f72732a7fd0c0","dweb:/ipfs/QmNXK8P8oPWwajsQHvAHw3JPyQidPLCGQN3hWu1Lk6PBL2"],"license":"MIT"}},"version":1},"id":10}
|
{"abi":[],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/forge-std/src/StdUtils.sol\":\"StdUtils\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"remappings\":[\":@abdk/=lib/abdk-libraries-solidity/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":abdk-libraries-solidity/=lib/abdk-libraries-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"lib/forge-std/src/StdUtils.sol\":{\"keccak256\":\"0xb2469a902a326074034c4f7081d868113db0edbb7cf48b86528af2d6b07295f8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1430a81c4978be875e2a3b31a8bfa4e1438fecd327f23771b690d64db63c020a\",\"dweb:/ipfs/QmW6aB2u1LNaRgGQFwjV7L7UbxsRg63iJ7AuujPouEa4cT\"]},\"lib/forge-std/src/Vm.sol\":{\"keccak256\":\"0x9b4df44a3b748593a58be7ba64fa5f420e5dcd7927bfa5173186228bfe61782f\",\"license\":\"MIT OR Apache-2.0\",\"urls\":[\"bzz-raw://b89fcf92ee1d14237cfb0dd949341053389d5b6a043ad77349b65bef80b1d59f\",\"dweb:/ipfs/QmPkia3aNHrqvE4tqxG2AyrdB4W91jTAvcbchgs2wAo6NL\"]},\"lib/forge-std/src/interfaces/IMulticall3.sol\":{\"keccak256\":\"0x7aac1389150499a922d1f9ef5749c908cef127cb2075b92fa17e9cb611263d0a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d95ebb7c7c463e08ebc12dab639945752fb2480acfc6e86da32f72732a7fd0c0\",\"dweb:/ipfs/QmNXK8P8oPWwajsQHvAHw3JPyQidPLCGQN3hWu1Lk6PBL2\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@abdk/=lib/abdk-libraries-solidity/","@openzeppelin/=lib/openzeppelin-contracts/","abdk-libraries-solidity/=lib/abdk-libraries-solidity/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":100000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/forge-std/src/StdUtils.sol":"StdUtils"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"lib/forge-std/src/StdUtils.sol":{"keccak256":"0xb2469a902a326074034c4f7081d868113db0edbb7cf48b86528af2d6b07295f8","urls":["bzz-raw://1430a81c4978be875e2a3b31a8bfa4e1438fecd327f23771b690d64db63c020a","dweb:/ipfs/QmW6aB2u1LNaRgGQFwjV7L7UbxsRg63iJ7AuujPouEa4cT"],"license":"MIT"},"lib/forge-std/src/Vm.sol":{"keccak256":"0x9b4df44a3b748593a58be7ba64fa5f420e5dcd7927bfa5173186228bfe61782f","urls":["bzz-raw://b89fcf92ee1d14237cfb0dd949341053389d5b6a043ad77349b65bef80b1d59f","dweb:/ipfs/QmPkia3aNHrqvE4tqxG2AyrdB4W91jTAvcbchgs2wAo6NL"],"license":"MIT OR Apache-2.0"},"lib/forge-std/src/interfaces/IMulticall3.sol":{"keccak256":"0x7aac1389150499a922d1f9ef5749c908cef127cb2075b92fa17e9cb611263d0a","urls":["bzz-raw://d95ebb7c7c463e08ebc12dab639945752fb2480acfc6e86da32f72732a7fd0c0","dweb:/ipfs/QmNXK8P8oPWwajsQHvAHw3JPyQidPLCGQN3hWu1Lk6PBL2"],"license":"MIT"}},"version":1},"id":14}
|
||||||
@@ -1 +1 @@
|
|||||||
{"abi":[],"bytecode":{"object":"0x6080806040523460175760399081601c823930815050f35b5f80fdfe5f80fdfea2646970667358221220ea5a41e6dbc6ca08b6521f0969fc2f079cea68e510c192f94e81f843a5e6d3b264736f6c634300081e0033","sourceMap":"1407:2774:32:-:0;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x5f80fdfea2646970667358221220ea5a41e6dbc6ca08b6521f0969fc2f079cea68e510c192f94e81f843a5e6d3b264736f6c634300081e0033","sourceMap":"1407:2774:32:-:0;;","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Library for reading and writing primitive types to specific storage slots. Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. This library helps with reading and writing to such slots without the need for inline assembly. The functions in this library return Slot structs that contain a `value` member that can be used to read or write. Example usage to set ERC-1967 implementation slot: ```solidity contract ERC1967 { // Define the slot. Alternatively, use the SlotDerivation library to derive the slot. bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; function _getImplementation() internal view returns (address) { return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; } function _setImplementation(address newImplementation) internal { require(newImplementation.code.length > 0); StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; } } ``` TIP: Consider using this library along with {SlotDerivation}.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol\":\"StorageSlot\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"remappings\":[\":@abdk/=lib/abdk-libraries-solidity/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":abdk-libraries-solidity/=lib/abdk-libraries-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol\":{\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9f660b1f351b757dfe01438e59888f31f33ded3afcf5cb5b0d9bf9aa6f320a8b\",\"dweb:/ipfs/QmarDJ5hZEgBtCmmrVzEZWjub9769eD686jmzb2XpSU1cM\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@abdk/=lib/abdk-libraries-solidity/","@openzeppelin/=lib/openzeppelin-contracts/","abdk-libraries-solidity/=lib/abdk-libraries-solidity/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":100000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol":"StorageSlot"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol":{"keccak256":"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97","urls":["bzz-raw://9f660b1f351b757dfe01438e59888f31f33ded3afcf5cb5b0d9bf9aa6f320a8b","dweb:/ipfs/QmarDJ5hZEgBtCmmrVzEZWjub9769eD686jmzb2XpSU1cM"],"license":"MIT"}},"version":1},"id":32}
|
{"abi":[],"bytecode":{"object":"0x6080806040523460175760399081601c823930815050f35b5f80fdfe5f80fdfea2646970667358221220ea5a41e6dbc6ca08b6521f0969fc2f079cea68e510c192f94e81f843a5e6d3b264736f6c634300081e0033","sourceMap":"1407:2774:38:-:0;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x5f80fdfea2646970667358221220ea5a41e6dbc6ca08b6521f0969fc2f079cea68e510c192f94e81f843a5e6d3b264736f6c634300081e0033","sourceMap":"1407:2774:38:-:0;;","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Library for reading and writing primitive types to specific storage slots. Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. This library helps with reading and writing to such slots without the need for inline assembly. The functions in this library return Slot structs that contain a `value` member that can be used to read or write. Example usage to set ERC-1967 implementation slot: ```solidity contract ERC1967 { // Define the slot. Alternatively, use the SlotDerivation library to derive the slot. bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; function _getImplementation() internal view returns (address) { return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; } function _setImplementation(address newImplementation) internal { require(newImplementation.code.length > 0); StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; } } ``` TIP: Consider using this library along with {SlotDerivation}.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol\":\"StorageSlot\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"remappings\":[\":@abdk/=lib/abdk-libraries-solidity/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":abdk-libraries-solidity/=lib/abdk-libraries-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol\":{\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9f660b1f351b757dfe01438e59888f31f33ded3afcf5cb5b0d9bf9aa6f320a8b\",\"dweb:/ipfs/QmarDJ5hZEgBtCmmrVzEZWjub9769eD686jmzb2XpSU1cM\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@abdk/=lib/abdk-libraries-solidity/","@openzeppelin/=lib/openzeppelin-contracts/","abdk-libraries-solidity/=lib/abdk-libraries-solidity/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":100000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol":"StorageSlot"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol":{"keccak256":"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97","urls":["bzz-raw://9f660b1f351b757dfe01438e59888f31f33ded3afcf5cb5b0d9bf9aa6f320a8b","dweb:/ipfs/QmarDJ5hZEgBtCmmrVzEZWjub9769eD686jmzb2XpSU1cM"],"license":"MIT"}},"version":1},"id":38}
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
{"abi":[],"bytecode":{"object":"0x6080806040523460175760399081601c823930815050f35b5f80fdfe5f80fdfea2646970667358221220afc188cd5160e43f0d46902109404da8f6c8b1df4eb40d16374d9645b8ecd8c964736f6c634300081e0033","sourceMap":"66:69203:12:-:0;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x5f80fdfea2646970667358221220afc188cd5160e43f0d46902109404da8f6c8b1df4eb40d16374d9645b8ecd8c964736f6c634300081e0033","sourceMap":"66:69203:12:-:0;;","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/forge-std/src/console.sol\":\"console\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"remappings\":[\":@abdk/=lib/abdk-libraries-solidity/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":abdk-libraries-solidity/=lib/abdk-libraries-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"lib/forge-std/src/console.sol\":{\"keccak256\":\"0x4bbf47eb762cef93729d6ef15e78789957147039b113e5d4df48e3d3fd16d0f5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://af9e3a7c3d82fb5b10b57ca4d1a82f2acbef80c077f6f6ef0cc0187c7bfd9f57\",\"dweb:/ipfs/QmR9VzmnBDJpgiDP6CHT6truehukF9HpYvuP6kRiJbDwPP\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@abdk/=lib/abdk-libraries-solidity/","@openzeppelin/=lib/openzeppelin-contracts/","abdk-libraries-solidity/=lib/abdk-libraries-solidity/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":100000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/forge-std/src/console.sol":"console"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"lib/forge-std/src/console.sol":{"keccak256":"0x4bbf47eb762cef93729d6ef15e78789957147039b113e5d4df48e3d3fd16d0f5","urls":["bzz-raw://af9e3a7c3d82fb5b10b57ca4d1a82f2acbef80c077f6f6ef0cc0187c7bfd9f57","dweb:/ipfs/QmR9VzmnBDJpgiDP6CHT6truehukF9HpYvuP6kRiJbDwPP"],"license":"MIT"}},"version":1},"id":12}
|
{"abi":[],"bytecode":{"object":"0x6080806040523460175760399081601c823930815050f35b5f80fdfe5f80fdfea2646970667358221220afc188cd5160e43f0d46902109404da8f6c8b1df4eb40d16374d9645b8ecd8c964736f6c634300081e0033","sourceMap":"66:69203:17:-:0;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x5f80fdfea2646970667358221220afc188cd5160e43f0d46902109404da8f6c8b1df4eb40d16374d9645b8ecd8c964736f6c634300081e0033","sourceMap":"66:69203:17:-:0;;","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/forge-std/src/console.sol\":\"console\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"remappings\":[\":@abdk/=lib/abdk-libraries-solidity/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":abdk-libraries-solidity/=lib/abdk-libraries-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"lib/forge-std/src/console.sol\":{\"keccak256\":\"0x4bbf47eb762cef93729d6ef15e78789957147039b113e5d4df48e3d3fd16d0f5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://af9e3a7c3d82fb5b10b57ca4d1a82f2acbef80c077f6f6ef0cc0187c7bfd9f57\",\"dweb:/ipfs/QmR9VzmnBDJpgiDP6CHT6truehukF9HpYvuP6kRiJbDwPP\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@abdk/=lib/abdk-libraries-solidity/","@openzeppelin/=lib/openzeppelin-contracts/","abdk-libraries-solidity/=lib/abdk-libraries-solidity/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":100000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/forge-std/src/console.sol":"console"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"lib/forge-std/src/console.sol":{"keccak256":"0x4bbf47eb762cef93729d6ef15e78789957147039b113e5d4df48e3d3fd16d0f5","urls":["bzz-raw://af9e3a7c3d82fb5b10b57ca4d1a82f2acbef80c077f6f6ef0cc0187c7bfd9f57","dweb:/ipfs/QmR9VzmnBDJpgiDP6CHT6truehukF9HpYvuP6kRiJbDwPP"],"license":"MIT"}},"version":1},"id":17}
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
{"abi":[],"bytecode":{"object":"0x6080806040523460175760399081601c823930815050f35b5f80fdfe5f80fdfea2646970667358221220709c8134992b5fef4e2bf94b521207862a1126f22dcc0c41899199d76b8ca7c164736f6c634300081e0033","sourceMap":"163:427371:15:-:0;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x5f80fdfea2646970667358221220709c8134992b5fef4e2bf94b521207862a1126f22dcc0c41899199d76b8ca7c164736f6c634300081e0033","sourceMap":"163:427371:15:-:0;;","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"author\":\"philogy <https://github.com/philogy>\",\"details\":\"Code generated automatically by script.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/forge-std/src/safeconsole.sol\":\"safeconsole\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"remappings\":[\":@abdk/=lib/abdk-libraries-solidity/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":abdk-libraries-solidity/=lib/abdk-libraries-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"lib/forge-std/src/safeconsole.sol\":{\"keccak256\":\"0xbef9786cb49d3eade757bad87568c49c8c8f35721f0193c95ffb055d9e466e11\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3bafd2b0b2d28068d329f95ea8a1fbce3719c257fcb863fc01abcbafd8d531ab\",\"dweb:/ipfs/QmUeaFjKWTVDBsHVfSob4mwt6A5hTnKDz22HaUXeZhypa3\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@abdk/=lib/abdk-libraries-solidity/","@openzeppelin/=lib/openzeppelin-contracts/","abdk-libraries-solidity/=lib/abdk-libraries-solidity/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":100000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/forge-std/src/safeconsole.sol":"safeconsole"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"lib/forge-std/src/safeconsole.sol":{"keccak256":"0xbef9786cb49d3eade757bad87568c49c8c8f35721f0193c95ffb055d9e466e11","urls":["bzz-raw://3bafd2b0b2d28068d329f95ea8a1fbce3719c257fcb863fc01abcbafd8d531ab","dweb:/ipfs/QmUeaFjKWTVDBsHVfSob4mwt6A5hTnKDz22HaUXeZhypa3"],"license":"MIT"}},"version":1},"id":15}
|
{"abi":[],"bytecode":{"object":"0x6080806040523460175760399081601c823930815050f35b5f80fdfe5f80fdfea2646970667358221220709c8134992b5fef4e2bf94b521207862a1126f22dcc0c41899199d76b8ca7c164736f6c634300081e0033","sourceMap":"163:427371:20:-:0;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x5f80fdfea2646970667358221220709c8134992b5fef4e2bf94b521207862a1126f22dcc0c41899199d76b8ca7c164736f6c634300081e0033","sourceMap":"163:427371:20:-:0;;","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"author\":\"philogy <https://github.com/philogy>\",\"details\":\"Code generated automatically by script.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/forge-std/src/safeconsole.sol\":\"safeconsole\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"remappings\":[\":@abdk/=lib/abdk-libraries-solidity/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":abdk-libraries-solidity/=lib/abdk-libraries-solidity/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"lib/forge-std/src/safeconsole.sol\":{\"keccak256\":\"0xbef9786cb49d3eade757bad87568c49c8c8f35721f0193c95ffb055d9e466e11\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3bafd2b0b2d28068d329f95ea8a1fbce3719c257fcb863fc01abcbafd8d531ab\",\"dweb:/ipfs/QmUeaFjKWTVDBsHVfSob4mwt6A5hTnKDz22HaUXeZhypa3\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@abdk/=lib/abdk-libraries-solidity/","@openzeppelin/=lib/openzeppelin-contracts/","abdk-libraries-solidity/=lib/abdk-libraries-solidity/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":100000000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/forge-std/src/safeconsole.sol":"safeconsole"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"lib/forge-std/src/safeconsole.sol":{"keccak256":"0xbef9786cb49d3eade757bad87568c49c8c8f35721f0193c95ffb055d9e466e11","urls":["bzz-raw://3bafd2b0b2d28068d329f95ea8a1fbce3719c257fcb863fc01abcbafd8d531ab","dweb:/ipfs/QmUeaFjKWTVDBsHVfSob4mwt6A5hTnKDz22HaUXeZhypa3"],"license":"MIT"}},"version":1},"id":20}
|
||||||
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"11155111": {
|
"11155111": {
|
||||||
"v1": {
|
"v1": {
|
||||||
"PartyPlanner": "0x081aA8AB1984680087c01a5Cd50fC9f49742434D",
|
"PartyPlanner": "0x0ad06C08ab5049e6Fd4d7f5AF457115A1475326b",
|
||||||
"PartyPoolViewer": "0x9Ca11d7D5552a93f691614137e1eA1Ec4BD369dC",
|
"PartyPoolViewer": "0x750d63a39a4ccfCfB69D2f5aFDa065909C717cAB",
|
||||||
"PartyPoolMintImpl": "0xfB6a25060F003793B037411C45408bD1852C2753",
|
"PartyPoolMintImpl": "0x25bb10BA84944F8aAEf1fD247C3B7Fe7271C23F9",
|
||||||
"PartyPoolSwapImpl": "0x9f5d0a1B0B658B06CBF16A6a518162A5ED1D7BF2",
|
"PartyPoolSwapImpl": "0x69b4F102e0747f61F8529b3bbFf2FC4b27438d0F",
|
||||||
"PartyPoolDeployer": "0x18F1B202C85f7d4a02758284d1A2333E5070C3C0",
|
"PartyPoolDeployer": "0x0939F93BAa3c96226853F9F39A95beF48eA8fF04",
|
||||||
"PartyPoolBalancedPairDeployer": "0xc147fa7928d96D9968671d8EC1cB7d49F9d31dC1",
|
"PartyPoolBalancedPairDeployer": "0xfda454fF7876aad9408517Ed2F0d11AA229Ad0a4",
|
||||||
"USXD": "0x8E4D16886b8946dfE463fA172129eaBf4825fb09",
|
"USXD": "0x8E4D16886b8946dfE463fA172129eaBf4825fb09",
|
||||||
"FUSD": "0xdc225280216822CA956738390f589c794129bd53",
|
"FUSD": "0xdc225280216822CA956738390f589c794129bd53",
|
||||||
"DIVE": "0x7ba123e4e7395A361284d069bD0D545F3f820641",
|
"DIVE": "0x7ba123e4e7395A361284d069bD0D545F3f820641",
|
||||||
|
|||||||
47
doc/introduction.md
Normal file
47
doc/introduction.md
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
# Introduction
|
||||||
|
|
||||||
|
[Liquidity Party](https://liquidity.party) is a new game-theoretic multi-asset AMM based on this paper:
|
||||||
|
|
||||||
|
[Logarithmic Market Scoring Rules for Modular Combinatorial Information Aggregation](https://mason.gmu.edu/~rhanson/mktscore.pdf) (R. Hanson, 2002)
|
||||||
|
|
||||||
|
A Logarithmic Market Scoring Rule (LMSR) is a pricing formula for AMM's that know only their current asset inventories and no other information, naturally supporting multi-asset
|
||||||
|
|
||||||
|
Compared to Constant Product (CP) markets, LMSR offers:
|
||||||
|
|
||||||
|
1. Less slippage than CP for small and medium trade sizes
|
||||||
|
2. N-asset pools for trading long-tail pairs in a single hop
|
||||||
|
3. Lower fees (smaller spread)
|
||||||
|
|
||||||
|
|
||||||
|
## Deeper Liquidity
|
||||||
|
|
||||||
|
According to game theory, CP's slope at the current marginal price is too steep, overcharging takers with too much slippage at small and medium trade sizes. LMSR pools offer less slippage and cheaper liquidity for the small and medium trade sizes common for arbitrageurs and aggregators.
|
||||||
|
|
||||||
|
|
||||||
|
## Multi-asset
|
||||||
|
|
||||||
|
Naturally multi-asset, Liquidity Party altcoin pools provide direct, one-hop swaps on otherwise illiquid multi-hop pairs. Pools will quote any pair combination available in the pool:
|
||||||
|
|
||||||
|
| Assets | Pairs | Swap Gas | Mint Gas |
|
||||||
|
|-------:|------:|---------:|----------:|
|
||||||
|
| 2 | 1 | 131,000 | 143,000 |
|
||||||
|
| 2* | 1 | 118,000 | 143,000 |
|
||||||
|
| 10 | 45 | 142,000 | 412,000 |
|
||||||
|
| 20 | 190 | 157,000 | 749,000 |
|
||||||
|
| 50 | 1225 | 199,000 | 1,760,000 |
|
||||||
|
| 100 | 4950 | 269,000 | 2,684,000 |
|
||||||
|
|
||||||
|
\* Stablecoin pair pool optimization
|
||||||
|
|
||||||
|
Liquidity Party aggregates scarce, low market cap assets into a single pool, providing one-hop liquidity for exotic pairs without fragmenting LP assets. CP pools would need 190x the LP assets to provide the same pairwise liquidity as a single 20-asset Liquidity Party pool, due to asset fragmentation.
|
||||||
|
|
||||||
|
## Lower Fees
|
||||||
|
|
||||||
|
Since market makers offer the option to take either side of the market, they must receive a subsidy or charge a fee (spread) to compensate for adverse selection (impermanent loss). By protecting LP's against common value-extraction scenarios, LMSR pools have a reduced risk premium resulting in lower fees for takers.
|
||||||
|
|
||||||
|
### Minimized Impermanent Loss
|
||||||
|
|
||||||
|
### No Intra-Pool Arbitrage
|
||||||
|
|
||||||
|
LMSR
|
||||||
|
This leads to LP's of CP pools demanding higher fees than theoretically necessary. By minimizing impermanent loss for LP's, LMSR pools reduce the risk premium, providing lower fees and higher liquidity for takers.
|
||||||
459
research/get_quotes.js
Normal file
459
research/get_quotes.js
Normal file
@@ -0,0 +1,459 @@
|
|||||||
|
const { ethers } = require('ethers');
|
||||||
|
const { Token } = require('@uniswap/sdk-core');
|
||||||
|
const fs = require('fs');
|
||||||
|
|
||||||
|
// Token definitions
|
||||||
|
const ChainId = {
|
||||||
|
MAINNET: 1
|
||||||
|
};
|
||||||
|
|
||||||
|
const USDC_TOKEN = new Token(
|
||||||
|
ChainId.MAINNET,
|
||||||
|
'0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',
|
||||||
|
6,
|
||||||
|
'USDC',
|
||||||
|
'USDC'
|
||||||
|
);
|
||||||
|
|
||||||
|
const USDT_TOKEN = new Token(
|
||||||
|
ChainId.MAINNET,
|
||||||
|
'0xdAC17F958D2ee523a2206206994597C13D831ec7',
|
||||||
|
6,
|
||||||
|
'USDT',
|
||||||
|
'USDT'
|
||||||
|
);
|
||||||
|
|
||||||
|
// Configuration
|
||||||
|
const QUOTER_ADDRESS = '0x52f0e24d1c21c8a0cb1e5a5dd6198556bd9e1203';
|
||||||
|
const POSITION_MANAGER_ADDRESS = '0xbD216513d74C8cf14cf4747E6AaA6420FF64ee9e';
|
||||||
|
|
||||||
|
// Pool ID to fetch pool key from
|
||||||
|
const POOL_ID = '0x8aa4e11cbdf30eedc92100f4c8a31ff748e201d44712cc8c90d189edaa8e4e47';
|
||||||
|
|
||||||
|
// Providers
|
||||||
|
const anvilProvider = new ethers.providers.JsonRpcProvider('http://127.0.0.1:8545');
|
||||||
|
|
||||||
|
// Quoter contract ABI
|
||||||
|
const QUOTER_ABI = [
|
||||||
|
{
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
components: [
|
||||||
|
{
|
||||||
|
components: [
|
||||||
|
{ name: 'currency0', type: 'address' },
|
||||||
|
{ name: 'currency1', type: 'address' },
|
||||||
|
{ name: 'fee', type: 'uint24' },
|
||||||
|
{ name: 'tickSpacing', type: 'int24' },
|
||||||
|
{ name: 'hooks', type: 'address' }
|
||||||
|
],
|
||||||
|
name: 'poolKey',
|
||||||
|
type: 'tuple'
|
||||||
|
},
|
||||||
|
{ name: 'zeroForOne', type: 'bool' },
|
||||||
|
{ name: 'exactAmount', type: 'uint128' },
|
||||||
|
{ name: 'hookData', type: 'bytes' }
|
||||||
|
],
|
||||||
|
name: 'params',
|
||||||
|
type: 'tuple'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'quoteExactInputSingle',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
components: [
|
||||||
|
{ name: 'amountOut', type: 'uint256' }
|
||||||
|
],
|
||||||
|
name: 'result',
|
||||||
|
type: 'tuple'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
}
|
||||||
|
];
|
||||||
|
// StateView ABI for getSlot0 and getLiquidity
|
||||||
|
const STATE_VIEW_ABI = [
|
||||||
|
{
|
||||||
|
inputs: [
|
||||||
|
// { name: 'manager', type: 'address' },
|
||||||
|
{ name: 'poolId', type: 'bytes32' }
|
||||||
|
],
|
||||||
|
name: 'getSlot0',
|
||||||
|
outputs: [
|
||||||
|
{ name: 'sqrtPriceX96', type: 'uint160' },
|
||||||
|
{ name: 'tick', type: 'int24' },
|
||||||
|
{ name: 'protocolFee', type: 'uint24' },
|
||||||
|
{ name: 'lpFee', type: 'uint24' }
|
||||||
|
],
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
// StateView contract address for reading pool state
|
||||||
|
const STATE_VIEW_ADDRESS = '0x7ffe42c4a5deea5b0fec41c94c136cf115597227';
|
||||||
|
|
||||||
|
// Position Manager ABI
|
||||||
|
const POSITION_MANAGER_ABI = [
|
||||||
|
{
|
||||||
|
inputs: [{ name: 'poolId', type: 'bytes25' }],
|
||||||
|
name: 'poolKeys',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
components: [
|
||||||
|
{ name: 'currency0', type: 'address' },
|
||||||
|
{ name: 'currency1', type: 'address' },
|
||||||
|
{ name: 'fee', type: 'uint24' },
|
||||||
|
{ name: 'tickSpacing', type: 'int24' },
|
||||||
|
{ name: 'hooks', type: 'address' }
|
||||||
|
],
|
||||||
|
name: 'poolKey',
|
||||||
|
type: 'tuple'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
// Function to get pool key from Position Manager (uses mainnet)
|
||||||
|
async function getPoolKey() {
|
||||||
|
try {
|
||||||
|
const positionManager = new ethers.Contract(
|
||||||
|
POSITION_MANAGER_ADDRESS,
|
||||||
|
POSITION_MANAGER_ABI,
|
||||||
|
anvilProvider
|
||||||
|
);
|
||||||
|
|
||||||
|
// Extract first 25 bytes (50 hex chars + 0x prefix = 52 chars)
|
||||||
|
const poolIdBytes25 = POOL_ID.slice(0, 52);
|
||||||
|
|
||||||
|
const poolKey = await positionManager.poolKeys(poolIdBytes25);
|
||||||
|
|
||||||
|
return {
|
||||||
|
currency0: poolKey.currency0,
|
||||||
|
currency1: poolKey.currency1,
|
||||||
|
fee: poolKey.fee,
|
||||||
|
tickSpacing: poolKey.tickSpacing,
|
||||||
|
hooks: poolKey.hooks
|
||||||
|
};
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error fetching pool key:', error.message);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert sqrtPriceX96 to human-readable price
|
||||||
|
function sqrtPriceX96ToPrice(sqrtPriceX96, decimals0, decimals1) {
|
||||||
|
const Q96 = ethers.BigNumber.from(2).pow(96);
|
||||||
|
const sqrtPrice = ethers.BigNumber.from(sqrtPriceX96);
|
||||||
|
|
||||||
|
// Calculate price = (sqrtPriceX96 / 2^96)^2
|
||||||
|
const numerator = sqrtPrice.mul(sqrtPrice);
|
||||||
|
const denominator = Q96.mul(Q96);
|
||||||
|
|
||||||
|
// Adjust for token decimals
|
||||||
|
const decimalAdjustment = ethers.BigNumber.from(10).pow(decimals0 - decimals1);
|
||||||
|
|
||||||
|
// Convert to float for readability
|
||||||
|
return parseFloat(numerator.toString()) / parseFloat(denominator.toString()) * parseFloat(decimalAdjustment.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get pool price using StateView
|
||||||
|
async function getPoolPriceWithSDK(blockNumber) {
|
||||||
|
try {
|
||||||
|
// Create StateView contract with ethers
|
||||||
|
const stateViewContract = new ethers.Contract(
|
||||||
|
STATE_VIEW_ADDRESS,
|
||||||
|
STATE_VIEW_ABI,
|
||||||
|
anvilProvider
|
||||||
|
);
|
||||||
|
|
||||||
|
// Get slot0 data
|
||||||
|
const slot0 = await stateViewContract.getSlot0(POOL_ID, {
|
||||||
|
blockTag: blockNumber
|
||||||
|
});
|
||||||
|
|
||||||
|
// Convert sqrtPriceX96 to human-readable price
|
||||||
|
const price = sqrtPriceX96ToPrice(slot0.sqrtPriceX96, 6, 6); // USDC=6, USDT=6
|
||||||
|
const inversePrice = 1 / price;
|
||||||
|
|
||||||
|
console.log('\n=== Pool State ===');
|
||||||
|
console.log('Block:', blockNumber);
|
||||||
|
console.log('sqrtPriceX96:', slot0.sqrtPriceX96.toString());
|
||||||
|
console.log('Tick:', slot0.tick.toString());
|
||||||
|
console.log('Price (USDT per USDC):', price.toFixed(8));
|
||||||
|
console.log('Price (USDC per USDT):', inversePrice.toFixed(8));
|
||||||
|
console.log('LP Fee:', slot0.lpFee, `(${(slot0.lpFee / 10000).toFixed(2)}%)`);
|
||||||
|
|
||||||
|
return {
|
||||||
|
sqrtPriceX96: slot0.sqrtPriceX96.toString(),
|
||||||
|
tick: slot0.tick.toString(),
|
||||||
|
price: price, // Human-readable price
|
||||||
|
inversePrice: inversePrice,
|
||||||
|
protocolFee: slot0.protocolFee,
|
||||||
|
lpFee: slot0.lpFee
|
||||||
|
};
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error getting pool price:', error.message);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Get quote from historical block (10 blocks back) with multiple amount testing
|
||||||
|
async function getQuoteFromHistoricalBlock(poolKey, targetBlock) {
|
||||||
|
try {
|
||||||
|
|
||||||
|
// Get starting pool price using SDK
|
||||||
|
try {
|
||||||
|
await getPoolPriceWithSDK(targetBlock);
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error getting pool price with SDK:', error.message);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('\n=== Testing Multiple Input Amounts ===');
|
||||||
|
console.log('Testing amounts from 1 USDC, increasing by 30% each iteration (limited to 5 iterations)');
|
||||||
|
console.log('Testing both directions: USDC→USDT and USDT→USDC\n');
|
||||||
|
|
||||||
|
// Create a new provider instance that queries at specific block
|
||||||
|
const quoterContract = new ethers.Contract(QUOTER_ADDRESS, QUOTER_ABI, anvilProvider);
|
||||||
|
|
||||||
|
const resultsForward = []; // USDC→USDT
|
||||||
|
const resultsReverse = []; // USDT→USDC
|
||||||
|
let currentAmount = 1; // Start with 1 token
|
||||||
|
const multiplier = 1.3; // 30% increase
|
||||||
|
const maxIterations = 200; // Limit to 5 iterations for testing
|
||||||
|
|
||||||
|
// Test USDC→USDT (forward direction)
|
||||||
|
console.log('\n=== USDC → USDT (Forward Direction) ===');
|
||||||
|
for (let i = 0; i < maxIterations; i++) {
|
||||||
|
// Check if currentAmount exceeds 10 million
|
||||||
|
if (currentAmount > 10000000) {
|
||||||
|
console.log(`\nReached maximum amount limit of 1 million USDC. Stopping iterations.`);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`\n--- Iteration ${i + 1}: ${currentAmount.toFixed(6)} USDC ---`);
|
||||||
|
|
||||||
|
const amountIn = ethers.utils.parseUnits(currentAmount.toFixed(6), USDC_TOKEN.decimals);
|
||||||
|
|
||||||
|
// Make the call at the specific block using overrides
|
||||||
|
const quotedAmountOut = await quoterContract.callStatic.quoteExactInputSingle({
|
||||||
|
poolKey: poolKey,
|
||||||
|
zeroForOne: true,
|
||||||
|
exactAmount: amountIn.toString(),
|
||||||
|
hookData: '0x00',
|
||||||
|
}, {
|
||||||
|
blockTag: targetBlock // Query at specific historical block
|
||||||
|
});
|
||||||
|
|
||||||
|
const actualAmountOut = ethers.BigNumber.from(quotedAmountOut.amountOut);
|
||||||
|
|
||||||
|
// Calculate ideal amount out (1:1 ratio for stablecoins)
|
||||||
|
const idealAmountOut = amountIn; // Since both USDC and USDT have 6 decimals
|
||||||
|
|
||||||
|
// Calculate the difference from ideal
|
||||||
|
const difference = actualAmountOut.sub(idealAmountOut);
|
||||||
|
const isPositive = difference.gte(0);
|
||||||
|
|
||||||
|
// Calculate slippage in basis points and percentage
|
||||||
|
const slippageBasisPoints = difference.mul(10000).div(idealAmountOut);
|
||||||
|
const slippagePercentage = parseFloat(slippageBasisPoints.toString()) / 100;
|
||||||
|
|
||||||
|
// Calculate effective exchange rate
|
||||||
|
const effectiveRate = parseFloat(ethers.utils.formatUnits(actualAmountOut, USDT_TOKEN.decimals)) / currentAmount;
|
||||||
|
|
||||||
|
// Log results for this amount
|
||||||
|
console.log(`Amount In: ${currentAmount.toFixed(6)} USDC`);
|
||||||
|
console.log(`Amount Out: ${ethers.utils.formatUnits(actualAmountOut, USDT_TOKEN.decimals)} USDT`);
|
||||||
|
console.log(`Effective Rate: ${effectiveRate.toFixed(6)} USDT/USDC`);
|
||||||
|
console.log(`Ideal Rate (1:1): ${currentAmount.toFixed(6)} USDT`);
|
||||||
|
console.log(`Difference: ${isPositive ? '+' : ''}${ethers.utils.formatUnits(difference, USDT_TOKEN.decimals)} USDT`);
|
||||||
|
console.log(`Slippage: ${isPositive ? '+' : ''}${slippagePercentage.toFixed(4)}% (${isPositive ? '+' : ''}${slippageBasisPoints.toString()} basis points)`);
|
||||||
|
|
||||||
|
// Store result
|
||||||
|
resultsForward.push({
|
||||||
|
iteration: i + 1,
|
||||||
|
amountIn: currentAmount,
|
||||||
|
amountInFormatted: currentAmount.toFixed(6) + ' USDC',
|
||||||
|
amountOut: ethers.utils.formatUnits(actualAmountOut, USDT_TOKEN.decimals) + ' USDT',
|
||||||
|
effectiveRate: effectiveRate,
|
||||||
|
slippagePercentage: slippagePercentage,
|
||||||
|
slippageBasisPoints: parseInt(slippageBasisPoints.toString()),
|
||||||
|
isPositive: isPositive
|
||||||
|
});
|
||||||
|
|
||||||
|
// Increase amount by 30% for next iteration
|
||||||
|
currentAmount *= multiplier;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset current amount for reverse direction
|
||||||
|
currentAmount = 1;
|
||||||
|
|
||||||
|
// Test USDT→USDC (reverse direction)
|
||||||
|
console.log('\n\n=== USDT → USDC (Reverse Direction) ===');
|
||||||
|
for (let i = 0; i < maxIterations; i++) {
|
||||||
|
// Check if currentAmount exceeds 1 million
|
||||||
|
if (currentAmount > 10000000) {
|
||||||
|
console.log(`\nReached maximum amount limit of 1 million USDT. Stopping iterations.`);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`\n--- Iteration ${i + 1}: ${currentAmount.toFixed(6)} USDT ---`);
|
||||||
|
|
||||||
|
const amountIn = ethers.utils.parseUnits(currentAmount.toFixed(6), USDT_TOKEN.decimals);
|
||||||
|
|
||||||
|
// Make the call at the specific block using overrides with zeroForOne: false
|
||||||
|
const quotedAmountOut = await quoterContract.callStatic.quoteExactInputSingle({
|
||||||
|
poolKey: poolKey,
|
||||||
|
zeroForOne: false, // false for USDT→USDC
|
||||||
|
exactAmount: amountIn.toString(),
|
||||||
|
hookData: '0x00',
|
||||||
|
}, {
|
||||||
|
blockTag: targetBlock // Query at specific historical block
|
||||||
|
});
|
||||||
|
|
||||||
|
const actualAmountOut = ethers.BigNumber.from(quotedAmountOut.amountOut);
|
||||||
|
|
||||||
|
// Calculate ideal amount out (1:1 ratio for stablecoins)
|
||||||
|
const idealAmountOut = amountIn; // Since both USDC and USDT have 6 decimals
|
||||||
|
|
||||||
|
// Calculate the difference from ideal
|
||||||
|
const difference = actualAmountOut.sub(idealAmountOut);
|
||||||
|
const isPositive = difference.gte(0);
|
||||||
|
|
||||||
|
// Calculate slippage in basis points and percentage
|
||||||
|
const slippageBasisPoints = difference.mul(10000).div(idealAmountOut);
|
||||||
|
const slippagePercentage = parseFloat(slippageBasisPoints.toString()) / 100;
|
||||||
|
|
||||||
|
// Calculate effective exchange rate
|
||||||
|
const effectiveRate = parseFloat(ethers.utils.formatUnits(actualAmountOut, USDC_TOKEN.decimals)) / currentAmount;
|
||||||
|
|
||||||
|
// Log results for this amount
|
||||||
|
console.log(`Amount In: ${currentAmount.toFixed(6)} USDT`);
|
||||||
|
console.log(`Amount Out: ${ethers.utils.formatUnits(actualAmountOut, USDC_TOKEN.decimals)} USDC`);
|
||||||
|
console.log(`Effective Rate: ${effectiveRate.toFixed(6)} USDC/USDT`);
|
||||||
|
console.log(`Ideal Rate (1:1): ${currentAmount.toFixed(6)} USDC`);
|
||||||
|
console.log(`Difference: ${isPositive ? '+' : ''}${ethers.utils.formatUnits(difference, USDC_TOKEN.decimals)} USDC`);
|
||||||
|
console.log(`Slippage: ${isPositive ? '+' : ''}${slippagePercentage.toFixed(4)}% (${isPositive ? '+' : ''}${slippageBasisPoints.toString()} basis points)`);
|
||||||
|
|
||||||
|
// Store result
|
||||||
|
resultsReverse.push({
|
||||||
|
iteration: i + 1,
|
||||||
|
amountIn: currentAmount,
|
||||||
|
amountInFormatted: currentAmount.toFixed(6) + ' USDT',
|
||||||
|
amountOut: ethers.utils.formatUnits(actualAmountOut, USDC_TOKEN.decimals) + ' USDC',
|
||||||
|
effectiveRate: effectiveRate,
|
||||||
|
slippagePercentage: slippagePercentage,
|
||||||
|
slippageBasisPoints: parseInt(slippageBasisPoints.toString()),
|
||||||
|
isPositive: isPositive
|
||||||
|
});
|
||||||
|
|
||||||
|
// Increase amount by 30% for next iteration
|
||||||
|
currentAmount *= multiplier;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Summary
|
||||||
|
console.log('\n\n=== Summary of Results ===');
|
||||||
|
|
||||||
|
console.log('\n--- Forward Direction (USDC → USDT) ---');
|
||||||
|
console.log('\nAmount In → Amount Out (Rate) [Slippage]');
|
||||||
|
resultsForward.forEach(r => {
|
||||||
|
console.log(`${r.amountInFormatted} → ${r.amountOut} (${r.effectiveRate.toFixed(6)}) [${r.isPositive ? '+' : ''}${r.slippagePercentage.toFixed(4)}%]`);
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('\n--- Reverse Direction (USDT → USDC) ---');
|
||||||
|
console.log('\nAmount In → Amount Out (Rate) [Slippage]');
|
||||||
|
resultsReverse.forEach(r => {
|
||||||
|
console.log(`${r.amountInFormatted} → ${r.amountOut} (${r.effectiveRate.toFixed(6)}) [${r.isPositive ? '+' : ''}${r.slippagePercentage.toFixed(4)}%]`);
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
blockNumber: targetBlock,
|
||||||
|
forward: resultsForward,
|
||||||
|
reverse: resultsReverse
|
||||||
|
};
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error getting historical quote:', error.message);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Function to write results to CSV
|
||||||
|
function writeResultsToCSV(blockNumber, priceData, quoteResults) {
|
||||||
|
const filename = `swap_results_block_${blockNumber}.csv`;
|
||||||
|
|
||||||
|
// Create CSV header
|
||||||
|
let csvContent = 'Block Number,USDT per USDC,USDC per USDT,Forward Direction Amount In,Forward Direction Amount Out,Reverse Direction Amount In,Reverse Direction Amount Out\n';
|
||||||
|
|
||||||
|
// Get max number of iterations
|
||||||
|
const maxIterations = Math.max(quoteResults.forward.length, quoteResults.reverse.length);
|
||||||
|
|
||||||
|
// Add data rows
|
||||||
|
for (let i = 0; i < maxIterations; i++) {
|
||||||
|
const forwardResult = quoteResults.forward[i] || { amountIn: '', amountOut: '' };
|
||||||
|
const reverseResult = quoteResults.reverse[i] || { amountIn: '', amountOut: '' };
|
||||||
|
|
||||||
|
// Only include block number and prices in first row
|
||||||
|
if (i === 0) {
|
||||||
|
csvContent += `${blockNumber},${priceData.price.toFixed(8)},${priceData.inversePrice.toFixed(8)},`;
|
||||||
|
} else {
|
||||||
|
csvContent += `,,,`;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Extract just the numbers from the formatted strings
|
||||||
|
const forwardAmountIn = forwardResult.amountIn ? forwardResult.amountIn.toFixed(6) : '';
|
||||||
|
const forwardAmountOut = forwardResult.amountOut ? forwardResult.amountOut.split(' ')[0] : '';
|
||||||
|
const reverseAmountIn = reverseResult.amountIn ? reverseResult.amountIn.toFixed(6) : '';
|
||||||
|
const reverseAmountOut = reverseResult.amountOut ? reverseResult.amountOut.split(' ')[0] : '';
|
||||||
|
|
||||||
|
csvContent += `${forwardAmountIn},${forwardAmountOut},${reverseAmountIn},${reverseAmountOut}\n`;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write to file
|
||||||
|
fs.writeFileSync(filename, csvContent);
|
||||||
|
console.log(`\n✅ Results written to ${filename}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Main function
|
||||||
|
async function main() {
|
||||||
|
console.log('=== Uniswap V4 Quote and Gas Estimation ===\n');
|
||||||
|
// Get current block
|
||||||
|
const currentBlock = await anvilProvider.getBlockNumber();
|
||||||
|
const targetBlock = currentBlock - 10;
|
||||||
|
|
||||||
|
|
||||||
|
// Fetch pool key from Position Manager
|
||||||
|
let poolKey;
|
||||||
|
try {
|
||||||
|
poolKey = await getPoolKey();
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Failed to fetch pool key. Exiting.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get pool price data
|
||||||
|
let poolPriceData;
|
||||||
|
try {
|
||||||
|
poolPriceData = await getPoolPriceWithSDK(targetBlock);
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Failed to get pool price data:', error.message);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get quotes for both directions
|
||||||
|
try {
|
||||||
|
const quoteResults = await getQuoteFromHistoricalBlock(poolKey, targetBlock);
|
||||||
|
console.log('✅ Historical quote successful!');
|
||||||
|
|
||||||
|
// Write results to CSV
|
||||||
|
writeResultsToCSV(targetBlock, poolPriceData, quoteResults);
|
||||||
|
} catch (error) {
|
||||||
|
console.error('❌ Failed to get historical quote:', error.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Run the main function
|
||||||
|
main().catch(console.error);
|
||||||
@@ -7,18 +7,6 @@ import numpy as np
|
|||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
# UNISWAP_GAS=0
|
|
||||||
# LMSR_GAS=0
|
|
||||||
UNISWAP_GAS=115_000
|
|
||||||
LMSR_GAS=150_000
|
|
||||||
ETH_PRICE=4000
|
|
||||||
UNISWAP_GAS_COST=UNISWAP_GAS*ETH_PRICE/1e9
|
|
||||||
LMSR_GAS_COST=LMSR_GAS*ETH_PRICE/1e9
|
|
||||||
|
|
||||||
|
|
||||||
print(f' LMSR gas: ${LMSR_GAS_COST:.2}')
|
|
||||||
print(f'Uniswap gas: ${UNISWAP_GAS_COST:.2}')
|
|
||||||
|
|
||||||
|
|
||||||
def lmsr_swap_amount_out(
|
def lmsr_swap_amount_out(
|
||||||
balances,
|
balances,
|
||||||
@@ -96,9 +84,9 @@ def lmsr_swap_amount_out(
|
|||||||
# No available output to withdraw
|
# No available output to withdraw
|
||||||
return 0.0
|
return 0.0
|
||||||
|
|
||||||
# Compute r0 = exp((q_j - q_i) / b) so small-trade out/in ≈ marginal price p_j/p_i
|
# Compute r0 = exp((q_i - q_j) / b)
|
||||||
try:
|
try:
|
||||||
r0 = math.exp((qj - qi) / b)
|
r0 = math.exp((qi - qj) / b)
|
||||||
except OverflowError:
|
except OverflowError:
|
||||||
raise ArithmeticError("exponential overflow in r0 computation")
|
raise ArithmeticError("exponential overflow in r0 computation")
|
||||||
|
|
||||||
@@ -138,159 +126,37 @@ def lmsr_swap_amount_out(
|
|||||||
|
|
||||||
return float(amount_out)
|
return float(amount_out)
|
||||||
|
|
||||||
def lmsr_marginal_price(balances, base_index, quote_index, kappa):
|
|
||||||
"""
|
|
||||||
Compute the LMSR marginal price ratio p_quote / p_base for the given balances state.
|
|
||||||
|
|
||||||
Formula:
|
def main():
|
||||||
b = kappa * S, where S = sum(balances)
|
balance0 = 1_000_000 # estimated from the production pool
|
||||||
price = exp((q_quote - q_base) / b)
|
balances = [balance0, balance0]
|
||||||
|
X = np.geomspace(1, 10_000_000, 100)
|
||||||
|
Y = [1 -
|
||||||
|
lmsr_swap_amount_out(balances, float(amount_in), 0, 1, 0.000010, 0.8)
|
||||||
|
/ amount_in
|
||||||
|
for amount_in in X]
|
||||||
|
plt.plot(X / balance0, Y, label='LMSR')
|
||||||
|
|
||||||
Parameters:
|
d = pd.read_csv('swap_results_block_23640998.csv')
|
||||||
- balances: iterable of per-token balances (q_i)
|
d.columns = ['block', 'price0', 'price1', 'in0', 'out0', 'in1', 'out1']
|
||||||
- base_index: index of the base token
|
uniswap_slippage = 1 - d.out0 / d.in0 / d.iloc[0].price0
|
||||||
- quote_index: index of the quote token
|
plt.plot(d.in0 / balance0, uniswap_slippage, label='CP')
|
||||||
- kappa: liquidity parameter κ (must be positive)
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
- float: marginal price p_quote / p_base
|
|
||||||
"""
|
|
||||||
try:
|
|
||||||
q = [float(x) for x in balances]
|
|
||||||
k = float(kappa)
|
|
||||||
except (TypeError, ValueError) as e:
|
|
||||||
raise ValueError("Invalid numeric input") from e
|
|
||||||
|
|
||||||
n = len(q)
|
|
||||||
if not (0 <= base_index < n and 0 <= quote_index < n):
|
|
||||||
raise IndexError("token indices out of range")
|
|
||||||
if k <= 0.0:
|
|
||||||
raise ValueError("kappa must be positive")
|
|
||||||
|
|
||||||
S = sum(q)
|
|
||||||
if S <= 0.0:
|
|
||||||
raise ValueError("size metric (sum balances) must be positive")
|
|
||||||
|
|
||||||
b = k * S
|
|
||||||
if b <= 0.0:
|
|
||||||
raise ValueError("computed b must be positive")
|
|
||||||
|
|
||||||
return float(math.exp((q[quote_index] - q[base_index]) / b))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def compare(file, tvl, fee, kappa):
|
|
||||||
d = pd.read_csv(file)
|
|
||||||
d.columns = ['block', 'price0', 'price1', 'in0', 'out0', 'rate']
|
|
||||||
|
|
||||||
# New approach: derive bases from initial external balances (assuming equal-valued deposits)
|
|
||||||
# This matches the Solidity implementation and eliminates the κ·ln(price) constraint
|
|
||||||
p0 = float(d.iloc[0].price0)
|
|
||||||
|
|
||||||
# Set external balances assuming equal values: if token0 = B0 and token1 = B1,
|
|
||||||
# and they have equal value, then B0 * price0 = B1 * price1 = V (value per asset)
|
|
||||||
# For simplicity, choose B0 such that the total value is tvl, then B1 = B0 * price0
|
|
||||||
total_value = float(tvl)
|
|
||||||
# Since B0 * price0 + B1 = total_value and B1 = B0 * price0, we get:
|
|
||||||
# B0 * price0 + B0 * price0 = total_value, so B0 = total_value / (2 * price0)
|
|
||||||
B0 = total_value / (2.0 * p0) # external balance of token 0
|
|
||||||
B1 = B0 * p0 # external balance of token 1 (equal value)
|
|
||||||
|
|
||||||
external_balances = [B0, B1]
|
|
||||||
|
|
||||||
# Derive bases: set base_i = B_i so that q_i = B_i / base_i = 1.0 internally
|
|
||||||
bases = [B0, B1]
|
|
||||||
|
|
||||||
# Internal balances: q_i = external_balance_i / base_i ≈ 1.0
|
|
||||||
q0 = B0 / bases[0] # ≈ 1.0
|
|
||||||
q1 = B1 / bases[1] # ≈ 1.0
|
|
||||||
|
|
||||||
balances = [q0, q1]
|
|
||||||
print(f"External balances: {external_balances}")
|
|
||||||
print(f"Bases: {bases}")
|
|
||||||
print(f"Internal balances: {balances}")
|
|
||||||
# Convert external input amounts to internal for LMSR calculations, then convert results back
|
|
||||||
X = np.geomspace(1, 1_000_000, 100)
|
|
||||||
orig_price = lmsr_marginal_price(balances, 0, 1, kappa)
|
|
||||||
|
|
||||||
# Convert X to internal amounts, compute swap, then convert back to external
|
|
||||||
in_out = []
|
|
||||||
for amount_in_external in X:
|
|
||||||
# Convert external input to internal units
|
|
||||||
amount_in_internal = amount_in_external / bases[0] # input token 0
|
|
||||||
|
|
||||||
# Compute swap in internal units
|
|
||||||
amount_out_internal = lmsr_swap_amount_out(balances, amount_in_internal, 0, 1, fee, kappa)
|
|
||||||
|
|
||||||
# Convert output back to external units
|
|
||||||
amount_out_external = amount_out_internal * bases[1] # output token 1
|
|
||||||
|
|
||||||
in_out.append((float(amount_in_external), float(amount_out_external)))
|
|
||||||
|
|
||||||
print(f"Sample internal/external conversions: {in_out[:3]}")
|
|
||||||
|
|
||||||
# Compute initial marginal price in external units
|
|
||||||
# Internal price is exp((q1 - q0)/b), external price needs conversion by bases[1]/bases[0]
|
|
||||||
orig_price_external = orig_price * (bases[1] / bases[0])
|
|
||||||
|
|
||||||
# Relative execution price deviation from the initial marginal price:
|
|
||||||
# slippage = |(amount_out/amount_in)/orig_price_external - 1|
|
|
||||||
eps = 1e-12
|
|
||||||
Y = [max(eps, abs((amount_out / amount_in) / orig_price_external - 1.0))
|
|
||||||
for amount_in, amount_out in in_out]
|
|
||||||
plt.plot(X, Y, label=f'LMSR {fee:.2%} κ={kappa:.2g}', color='cornflowerblue')
|
|
||||||
|
|
||||||
# Uniswap execution price deviation from its initial quoted price:
|
|
||||||
# slippage = |(out/in)/initial_price - 1|
|
|
||||||
uniswap_exec_price0 = d.out0 / d.in0
|
|
||||||
uniswap_slippage0 = (uniswap_exec_price0 / d.iloc[0].price0 - 1.0).abs().clip(lower=1e-12)
|
|
||||||
uniswap_fee = round(uniswap_slippage0.iloc[0], 6)
|
|
||||||
plt.plot(d.in0, uniswap_slippage0, label=f'Uniswap {uniswap_fee:.2%}', color='hotpink')
|
|
||||||
# uniswap_slippage1 = |(out1/in1)/price1 - 1|
|
|
||||||
# plt.plot(d.in1, (d.out1 / d.in1 / d.iloc[0].price1 - 1.0).abs().clip(lower=1e-12), label='CP1')
|
|
||||||
|
|
||||||
# Interpolate Uniswap slippage to match LMSR x-coordinates
|
# Interpolate Uniswap slippage to match LMSR x-coordinates
|
||||||
interp_uniswap = np.interp(X, d.in0, uniswap_slippage0)
|
interp_uniswap = np.interp(X / balance0, d.in0 / balance0, uniswap_slippage)
|
||||||
mask = Y < interp_uniswap
|
mask = Y < interp_uniswap
|
||||||
plt.fill_between(X, 0, 1, where=mask, alpha=0.2, color='green')
|
plt.fill_between(X / balance0, 0, 1, where=mask, alpha=0.2, color='green')
|
||||||
|
|
||||||
plt.xscale('log')
|
plt.xscale('log')
|
||||||
plt.yscale('log')
|
plt.yscale('log')
|
||||||
plt.gca().xaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: '{:g}'.format(x)))
|
plt.gca().xaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: '{:.2f}'.format(10000*x)))
|
||||||
plt.gca().yaxis.set_major_formatter(plt.FuncFormatter(lambda y, _: '{:.2%}'.format(y)))
|
plt.gca().yaxis.set_major_formatter(plt.FuncFormatter(lambda y, _: '{:.2f}%'.format(y)))
|
||||||
plt.gca().set_ylim(top=.1)
|
plt.xlabel('Input Amount (basis points of initial balance)')
|
||||||
plt.xlabel('Input Amount')
|
|
||||||
plt.ylabel('Slippage')
|
plt.ylabel('Slippage')
|
||||||
plt.title('Pool Slippages')
|
plt.title('Pool Slippages')
|
||||||
plt.grid(True)
|
plt.grid(True)
|
||||||
plt.legend()
|
plt.legend()
|
||||||
plt.show()
|
plt.show()
|
||||||
|
|
||||||
|
|
||||||
def plot_kappa():
|
|
||||||
X = np.geomspace(1, 10_000_000, 100)
|
|
||||||
for kappa in np.geomspace(0.01, 100, 8):
|
|
||||||
balance0 = 1_000_000 # estimated from the production pool
|
|
||||||
balances = [balance0, balance0]
|
|
||||||
Y = [1 -
|
|
||||||
lmsr_swap_amount_out(balances, float(amount_in), 0, 1, 0.000010, kappa)
|
|
||||||
/ amount_in
|
|
||||||
for amount_in in X]
|
|
||||||
plt.plot(X / balance0, Y, label=f'{kappa:f}')
|
|
||||||
plt.xscale('log')
|
|
||||||
plt.yscale('log')
|
|
||||||
plt.gca().xaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: '{:.2f}'.format(10000*x)))
|
|
||||||
plt.gca().yaxis.set_major_formatter(plt.FuncFormatter(lambda y, _: '{:.2%}'.format(y)))
|
|
||||||
plt.xlabel('Input Amount (basis points of initial balance)')
|
|
||||||
plt.ylabel('Slippage')
|
|
||||||
plt.title('Pool Slippages by Kappa')
|
|
||||||
plt.grid(True)
|
|
||||||
plt.legend()
|
|
||||||
plt.show()
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
# compare('uni4_quotes/swap_results_block_23640998.csv')
|
main()
|
||||||
compare('uni4_quotes/ETH-USDC-30.csv', 53_000_000, 0.0025, 0.00025)
|
|
||||||
# compare('uni4_quotes/ETH-USDC-30.csv', 100_000, 0.0025, 0.00025)
|
|
||||||
# plot_kappa()
|
|
||||||
|
|||||||
@@ -1,496 +0,0 @@
|
|||||||
import { ethers } from 'ethers';
|
|
||||||
import { Token } from '@uniswap/sdk-core';
|
|
||||||
import fs from 'fs';
|
|
||||||
|
|
||||||
// Token definitions
|
|
||||||
const ChainId = {
|
|
||||||
MAINNET: 1
|
|
||||||
};
|
|
||||||
|
|
||||||
const USDC_TOKEN = new Token(
|
|
||||||
ChainId.MAINNET,
|
|
||||||
'0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',
|
|
||||||
6,
|
|
||||||
'USDC',
|
|
||||||
'USDC'
|
|
||||||
);
|
|
||||||
|
|
||||||
const WETH_TOKEN = new Token(
|
|
||||||
ChainId.MAINNET,
|
|
||||||
'0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',
|
|
||||||
18,
|
|
||||||
'WETH',
|
|
||||||
'WETH'
|
|
||||||
);
|
|
||||||
|
|
||||||
const USDT_TOKEN= new Token(
|
|
||||||
ChainId.MAINNET,
|
|
||||||
'0xdAC17F958D2ee523a2206206994597C13D831ec7',
|
|
||||||
6,
|
|
||||||
'USDT',
|
|
||||||
'USDT'
|
|
||||||
);
|
|
||||||
|
|
||||||
const tokenA = USDC_TOKEN
|
|
||||||
const tokenB = WETH_TOKEN
|
|
||||||
// Pool ID to fetch pool key from
|
|
||||||
// const POOL_ID = '0x8aa4e11cbdf30eedc92100f4c8a31ff748e201d44712cc8c90d189edaa8e4e47';
|
|
||||||
const POOL_ID = '0xdce6394339af00981949f5f3baf27e3610c76326a700af57e4b3e3ae4977f78d';
|
|
||||||
|
|
||||||
// Configuration
|
|
||||||
const QUOTER_ADDRESS = '0x52f0e24d1c21c8a0cb1e5a5dd6198556bd9e1203';
|
|
||||||
const POSITION_MANAGER_ADDRESS = '0xbD216513d74C8cf14cf4747E6AaA6420FF64ee9e';
|
|
||||||
|
|
||||||
|
|
||||||
// Providers
|
|
||||||
const anvilProvider = new ethers.providers.JsonRpcProvider('http://127.0.0.1:8545');
|
|
||||||
|
|
||||||
// Quoter contract ABI
|
|
||||||
const QUOTER_ABI = [
|
|
||||||
{
|
|
||||||
inputs: [
|
|
||||||
{
|
|
||||||
components: [
|
|
||||||
{
|
|
||||||
components: [
|
|
||||||
{ name: 'currency0', type: 'address' },
|
|
||||||
{ name: 'currency1', type: 'address' },
|
|
||||||
{ name: 'fee', type: 'uint24' },
|
|
||||||
{ name: 'tickSpacing', type: 'int24' },
|
|
||||||
{ name: 'hooks', type: 'address' }
|
|
||||||
],
|
|
||||||
name: 'poolKey',
|
|
||||||
type: 'tuple'
|
|
||||||
},
|
|
||||||
{ name: 'zeroForOne', type: 'bool' },
|
|
||||||
{ name: 'exactAmount', type: 'uint128' },
|
|
||||||
{ name: 'hookData', type: 'bytes' }
|
|
||||||
],
|
|
||||||
name: 'params',
|
|
||||||
type: 'tuple'
|
|
||||||
}
|
|
||||||
],
|
|
||||||
name: 'quoteExactInputSingle',
|
|
||||||
outputs: [
|
|
||||||
{
|
|
||||||
components: [
|
|
||||||
{ name: 'amountOut', type: 'uint256' }
|
|
||||||
],
|
|
||||||
name: 'result',
|
|
||||||
type: 'tuple'
|
|
||||||
}
|
|
||||||
],
|
|
||||||
stateMutability: 'view',
|
|
||||||
type: 'function'
|
|
||||||
}
|
|
||||||
];
|
|
||||||
// StateView ABI for getSlot0 and getLiquidity
|
|
||||||
const STATE_VIEW_ABI = [
|
|
||||||
{
|
|
||||||
inputs: [
|
|
||||||
// { name: 'manager', type: 'address' },
|
|
||||||
{ name: 'poolId', type: 'bytes32' }
|
|
||||||
],
|
|
||||||
name: 'getSlot0',
|
|
||||||
outputs: [
|
|
||||||
{ name: 'sqrtPriceX96', type: 'uint160' },
|
|
||||||
{ name: 'tick', type: 'int24' },
|
|
||||||
{ name: 'protocolFee', type: 'uint24' },
|
|
||||||
{ name: 'lpFee', type: 'uint24' }
|
|
||||||
],
|
|
||||||
stateMutability: 'view',
|
|
||||||
type: 'function'
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
// StateView contract address for reading pool state
|
|
||||||
const STATE_VIEW_ADDRESS = '0x7ffe42c4a5deea5b0fec41c94c136cf115597227';
|
|
||||||
|
|
||||||
// Position Manager ABI
|
|
||||||
const POSITION_MANAGER_ABI = [
|
|
||||||
{
|
|
||||||
inputs: [{ name: 'poolId', type: 'bytes25' }],
|
|
||||||
name: 'poolKeys',
|
|
||||||
outputs: [
|
|
||||||
{
|
|
||||||
components: [
|
|
||||||
{ name: 'currency0', type: 'address' },
|
|
||||||
{ name: 'currency1', type: 'address' },
|
|
||||||
{ name: 'fee', type: 'uint24' },
|
|
||||||
{ name: 'tickSpacing', type: 'int24' },
|
|
||||||
{ name: 'hooks', type: 'address' }
|
|
||||||
],
|
|
||||||
name: 'poolKey',
|
|
||||||
type: 'tuple'
|
|
||||||
}
|
|
||||||
],
|
|
||||||
stateMutability: 'view',
|
|
||||||
type: 'function'
|
|
||||||
}
|
|
||||||
];
|
|
||||||
|
|
||||||
// Function to get pool key from Position Manager (uses mainnet)
|
|
||||||
async function getPoolKey() {
|
|
||||||
try {
|
|
||||||
const positionManager = new ethers.Contract(
|
|
||||||
POSITION_MANAGER_ADDRESS,
|
|
||||||
POSITION_MANAGER_ABI,
|
|
||||||
anvilProvider
|
|
||||||
);
|
|
||||||
|
|
||||||
// Extract first 25 bytes (50 hex chars + 0x prefix = 52 chars)
|
|
||||||
const poolIdBytes25 = POOL_ID.slice(0, 52);
|
|
||||||
|
|
||||||
const poolKey = await positionManager.poolKeys(poolIdBytes25);
|
|
||||||
|
|
||||||
return {
|
|
||||||
currency0: poolKey.currency0,
|
|
||||||
currency1: poolKey.currency1,
|
|
||||||
fee: poolKey.fee,
|
|
||||||
tickSpacing: poolKey.tickSpacing,
|
|
||||||
hooks: poolKey.hooks
|
|
||||||
};
|
|
||||||
} catch (error) {
|
|
||||||
console.error('Error fetching pool key:', error.message);
|
|
||||||
throw error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Helper function to format BigNumber for display (use only for console output)
|
|
||||||
function formatBigNumberForDisplay(bigNumber, decimals) {
|
|
||||||
const formatted = ethers.utils.formatUnits(bigNumber, decimals);
|
|
||||||
return formatted;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Helper function to convert BigNumber to fixed decimal string without scientific notation
|
|
||||||
function bigNumberToFixed(bigNumber, decimals) {
|
|
||||||
const str = ethers.utils.formatUnits(bigNumber, decimals);
|
|
||||||
// Ensure no scientific notation
|
|
||||||
if (str.includes('e')) {
|
|
||||||
const num = parseFloat(str);
|
|
||||||
return num.toFixed(decimals);
|
|
||||||
}
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert sqrtPriceX96 to price as a decimal string (maintains precision)
|
|
||||||
// Returns price representing token1/token0
|
|
||||||
function sqrtPriceX96ToPrice(sqrtPriceX96, decimals0, decimals1) {
|
|
||||||
const sqrtPrice = ethers.BigNumber.from(sqrtPriceX96);
|
|
||||||
|
|
||||||
console.log('DEBUG sqrtPriceX96ToPrice:');
|
|
||||||
console.log(' sqrtPriceX96:', sqrtPriceX96.toString());
|
|
||||||
console.log(' decimals0:', decimals0, 'decimals1:', decimals1);
|
|
||||||
|
|
||||||
if (sqrtPrice.isZero()) {
|
|
||||||
throw new Error('sqrtPriceX96 cannot be zero');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Calculate price = (sqrtPriceX96 / 2^96)^2 * 10^(decimals0 - decimals1)
|
|
||||||
// Using BigNumber arithmetic throughout to maintain precision
|
|
||||||
|
|
||||||
const Q96 = ethers.BigNumber.from(2).pow(96);
|
|
||||||
|
|
||||||
// price = sqrtPrice^2 / 2^192 * 10^(decimals0 - decimals1)
|
|
||||||
// To maintain precision, we need to be careful about the order of operations
|
|
||||||
|
|
||||||
// First square the sqrtPrice
|
|
||||||
const sqrtPriceSquared = sqrtPrice.mul(sqrtPrice);
|
|
||||||
console.log(' sqrtPriceSquared:', sqrtPriceSquared.toString());
|
|
||||||
|
|
||||||
// Calculate 2^192
|
|
||||||
const Q192 = Q96.mul(Q96);
|
|
||||||
console.log(' Q192:', Q192.toString());
|
|
||||||
|
|
||||||
// Adjust for decimals: if decimals0 > decimals1, we multiply, else divide
|
|
||||||
const decimalDiff = decimals0 - decimals1;
|
|
||||||
console.log(' decimalDiff:', decimalDiff);
|
|
||||||
|
|
||||||
// We need to calculate: sqrtPriceSquared * 10^decimalDiff / Q192
|
|
||||||
// Use a large precision scale to avoid truncation
|
|
||||||
// We'll use 30 decimals to ensure we have enough precision even for extreme price ratios
|
|
||||||
|
|
||||||
const PRECISION_DECIMALS = 30;
|
|
||||||
const precisionScale = ethers.BigNumber.from(10).pow(PRECISION_DECIMALS);
|
|
||||||
let price;
|
|
||||||
|
|
||||||
if (decimalDiff >= 0) {
|
|
||||||
const decimalAdjustment = ethers.BigNumber.from(10).pow(decimalDiff);
|
|
||||||
const numerator = sqrtPriceSquared.mul(decimalAdjustment).mul(precisionScale);
|
|
||||||
console.log(' numerator:', numerator.toString());
|
|
||||||
price = numerator.div(Q192);
|
|
||||||
} else {
|
|
||||||
// When decimalDiff is negative, multiply denominator instead of dividing numerator
|
|
||||||
// This avoids precision loss
|
|
||||||
const decimalAdjustment = ethers.BigNumber.from(10).pow(-decimalDiff);
|
|
||||||
const numerator = sqrtPriceSquared.mul(precisionScale);
|
|
||||||
console.log(' numerator:', numerator.toString());
|
|
||||||
const denominator = Q192.mul(decimalAdjustment);
|
|
||||||
console.log(' denominator:', denominator.toString());
|
|
||||||
price = numerator.div(denominator);
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log(' price (raw):', price.toString());
|
|
||||||
|
|
||||||
const priceFormatted = ethers.utils.formatUnits(price, PRECISION_DECIMALS);
|
|
||||||
console.log(' price (formatted):', priceFormatted);
|
|
||||||
|
|
||||||
return priceFormatted;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Helper to calculate inverse price from a decimal string
|
|
||||||
function inversePrice(priceStr) {
|
|
||||||
const priceNum = parseFloat(priceStr);
|
|
||||||
if (priceNum === 0 || !isFinite(priceNum)) {
|
|
||||||
console.warn('Warning: Cannot calculate inverse of zero or invalid price');
|
|
||||||
return '0';
|
|
||||||
}
|
|
||||||
|
|
||||||
// Calculate 1/price using standard division
|
|
||||||
const inverse = 1.0 / priceNum;
|
|
||||||
|
|
||||||
// If result is very large, format as integer-like
|
|
||||||
// If result is normal decimal, format with precision
|
|
||||||
if (inverse > 1e10) {
|
|
||||||
return inverse.toExponential(18).replace(/e\+?/, 'e');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Format with high precision, removing trailing zeros
|
|
||||||
let formatted = inverse.toFixed(18);
|
|
||||||
// Remove trailing zeros but keep at least one decimal place
|
|
||||||
formatted = formatted.replace(/(\.\d*?)0+$/, '$1').replace(/\.$/, '.0');
|
|
||||||
return formatted;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get pool price using StateView
|
|
||||||
async function getPoolPriceWithSDK(blockNumber) {
|
|
||||||
try {
|
|
||||||
// Create StateView contract with ethers
|
|
||||||
const stateViewContract = new ethers.Contract(
|
|
||||||
STATE_VIEW_ADDRESS,
|
|
||||||
STATE_VIEW_ABI,
|
|
||||||
anvilProvider
|
|
||||||
);
|
|
||||||
|
|
||||||
// Get slot0 data
|
|
||||||
const slot0 = await stateViewContract.getSlot0(POOL_ID, {
|
|
||||||
blockTag: blockNumber
|
|
||||||
});
|
|
||||||
|
|
||||||
// Convert sqrtPriceX96 to price as BigNumber (maintains precision)
|
|
||||||
console.log('\n=== Pool State (Debug) ===');
|
|
||||||
console.log('Block:', blockNumber);
|
|
||||||
console.log('sqrtPriceX96:', slot0.sqrtPriceX96.toString());
|
|
||||||
console.log('Tick:', slot0.tick.toString());
|
|
||||||
console.log('Token A decimals:', tokenA.decimals);
|
|
||||||
console.log('Token B decimals:', tokenB.decimals);
|
|
||||||
|
|
||||||
// Calculate price: token0/token1 = USDC/WETH
|
|
||||||
// Using swapped decimals gives us the correct direction
|
|
||||||
const token0PerToken1 = sqrtPriceX96ToPrice(slot0.sqrtPriceX96, tokenB.decimals, tokenA.decimals);
|
|
||||||
console.log('Price USDC per WETH:', token0PerToken1);
|
|
||||||
|
|
||||||
// Calculate the reciprocal to get WETH per USDC
|
|
||||||
const token0PerToken1Num = parseFloat(token0PerToken1);
|
|
||||||
const token1PerToken0 = (1.0 / token0PerToken1Num).toFixed(18).replace(/\.?0+$/, '');
|
|
||||||
console.log('Price WETH per USDC (reciprocal):', token1PerToken0);
|
|
||||||
|
|
||||||
console.log('\n=== Pool State ===');
|
|
||||||
console.log('Block:', blockNumber);
|
|
||||||
console.log('sqrtPriceX96:', slot0.sqrtPriceX96.toString());
|
|
||||||
console.log('Tick:', slot0.tick.toString());
|
|
||||||
console.log(`Price calculated as: token1/token0 where token0=${tokenA.symbol}(${tokenA.decimals}d), token1=${tokenB.symbol}(${tokenB.decimals}d)`);
|
|
||||||
console.log(`${tokenB.symbol} per ${tokenA.symbol}:`, token1PerToken0);
|
|
||||||
console.log(`${tokenA.symbol} per ${tokenB.symbol}:`, token0PerToken1);
|
|
||||||
console.log('LP Fee:', slot0.lpFee, `(${(slot0.lpFee / 10000).toFixed(2)}%)`);
|
|
||||||
|
|
||||||
// Sanity check with actual swap data
|
|
||||||
console.log('\nSanity check: If swapping 1 USDC should get ~0.000256 WETH based on your data');
|
|
||||||
|
|
||||||
return {
|
|
||||||
sqrtPriceX96: slot0.sqrtPriceX96.toString(),
|
|
||||||
tick: slot0.tick.toString(),
|
|
||||||
priceStr: token1PerToken0, // WETH per USDC (tokenB per tokenA)
|
|
||||||
inversePriceStr: token0PerToken1, // USDC per WETH (tokenA per tokenB)
|
|
||||||
protocolFee: slot0.protocolFee,
|
|
||||||
lpFee: slot0.lpFee
|
|
||||||
};
|
|
||||||
} catch (error) {
|
|
||||||
console.error('Error getting pool price:', error.message);
|
|
||||||
throw error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Get quote from historical block (10 blocks back) with multiple amount testing
|
|
||||||
async function getQuoteFromHistoricalBlock(poolKey, targetBlock) {
|
|
||||||
try {
|
|
||||||
|
|
||||||
// Get starting pool price using SDK
|
|
||||||
try {
|
|
||||||
await getPoolPriceWithSDK(targetBlock);
|
|
||||||
} catch (error) {
|
|
||||||
console.error('Error getting pool price with SDK:', error.message);
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log('\n=== Testing Multiple Input Amounts ===');
|
|
||||||
console.log('Testing amounts from 1 USDC, increasing by 30% each iteration (limited to 5 iterations)');
|
|
||||||
console.log('Testing both directions: USDC→USDT and USDT→USDC\n');
|
|
||||||
|
|
||||||
// Create a new provider instance that queries at specific block
|
|
||||||
const quoterContract = new ethers.Contract(QUOTER_ADDRESS, QUOTER_ABI, anvilProvider);
|
|
||||||
|
|
||||||
const resultsForward = []; // USDC→USDT
|
|
||||||
const resultsReverse = []; // USDT→USDC
|
|
||||||
|
|
||||||
// Start with 1 token as BigNumber
|
|
||||||
let currentAmountBN = ethers.utils.parseUnits("1", tokenA.decimals);
|
|
||||||
const multiplierNumerator = 13; // 130% = 13/10
|
|
||||||
const multiplierDenominator = 10;
|
|
||||||
const maxIterations = 200;
|
|
||||||
const maxAmount = ethers.utils.parseUnits("1000000", tokenA.decimals); // 10 million limit
|
|
||||||
|
|
||||||
// Test USDC→USDT (forward direction)
|
|
||||||
console.log('\n=== USDC → USDT (Forward Direction) ===');
|
|
||||||
for (let i = 0; i < maxIterations; i++) {
|
|
||||||
// Check if currentAmountBN exceeds 10 million
|
|
||||||
if (currentAmountBN.gt(maxAmount)) {
|
|
||||||
console.log(`\nReached maximum amount limit of 10 million USDC. Stopping iterations.`);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
const currentAmountFormatted = formatBigNumberForDisplay(currentAmountBN, tokenA.decimals);
|
|
||||||
console.log(`\n--- Iteration ${i + 1}: ${currentAmountFormatted} USDC ---`);
|
|
||||||
|
|
||||||
const amountIn = currentAmountBN;
|
|
||||||
|
|
||||||
// Make the call at the specific block using overrides
|
|
||||||
const quotedAmountOut = await quoterContract.callStatic.quoteExactInputSingle({
|
|
||||||
poolKey: poolKey,
|
|
||||||
zeroForOne: tokenA.address.toLowerCase() > tokenB.address.toLowerCase(),
|
|
||||||
exactAmount: amountIn.toString(),
|
|
||||||
hookData: '0x00',
|
|
||||||
}, {
|
|
||||||
blockTag: targetBlock // Query at specific historical block
|
|
||||||
});
|
|
||||||
|
|
||||||
console.log('in/out', amountIn, quotedAmountOut.amountIn, quotedAmountOut.amountOut);
|
|
||||||
const actualAmountOut = ethers.BigNumber.from(quotedAmountOut.amountOut);
|
|
||||||
|
|
||||||
// Calculate effective exchange rate as BigNumber (with extra precision)
|
|
||||||
// effectiveRate = actualAmountOut / amountIn
|
|
||||||
// Scale to show tokenB per 1 tokenA (use tokenB decimals for result)
|
|
||||||
const scaleFactor = ethers.BigNumber.from(10).pow(tokenB.decimals);
|
|
||||||
const effectiveRateBN = actualAmountOut.mul(scaleFactor).div(amountIn);
|
|
||||||
|
|
||||||
// Log results for this amount (format only for display)
|
|
||||||
console.log(`Amount In: ${currentAmountFormatted} ${tokenA.symbol}`);
|
|
||||||
console.log(`Amount Out: ${formatBigNumberForDisplay(actualAmountOut, tokenB.decimals)} ${tokenB.symbol}`);
|
|
||||||
|
|
||||||
// Store result with full precision (as strings)
|
|
||||||
resultsForward.push({
|
|
||||||
iteration: i + 1,
|
|
||||||
amountInBN: amountIn.toString(),
|
|
||||||
amountOutBN: actualAmountOut.toString(),
|
|
||||||
effectiveRateBN: effectiveRateBN.toString(),
|
|
||||||
});
|
|
||||||
|
|
||||||
// Increase amount by 30% for next iteration using BigNumber math
|
|
||||||
currentAmountBN = currentAmountBN.mul(multiplierNumerator).div(multiplierDenominator);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Summary
|
|
||||||
console.log('\n\n=== Summary of Results ===');
|
|
||||||
|
|
||||||
console.log(`--- Forward Direction (${tokenA.symbol} → ${tokenB.symbol}) ---`);
|
|
||||||
console.log('\nAmount In → Amount Out (Rate) [Slippage]');
|
|
||||||
resultsForward.forEach(r => {
|
|
||||||
const amountIn = formatBigNumberForDisplay(ethers.BigNumber.from(r.amountInBN), tokenA.decimals);
|
|
||||||
const amountOut = formatBigNumberForDisplay(ethers.BigNumber.from(r.amountOutBN), tokenB.decimals);
|
|
||||||
const rate = formatBigNumberForDisplay(ethers.BigNumber.from(r.effectiveRateBN), tokenB.decimals);
|
|
||||||
console.log(`${amountIn} ${tokenA.symbol} → ${amountOut} ${tokenB.symbol} (${rate})`);
|
|
||||||
});
|
|
||||||
|
|
||||||
return {
|
|
||||||
blockNumber: targetBlock,
|
|
||||||
forward: resultsForward,
|
|
||||||
reverse: resultsReverse
|
|
||||||
};
|
|
||||||
} catch (error) {
|
|
||||||
console.error('Error getting historical quote:', error.message);
|
|
||||||
throw error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Function to write results to CSV with full precision
|
|
||||||
function writeResultsToCSV(blockNumber, priceData, quoteResults) {
|
|
||||||
const filename = `swap_results_block_${blockNumber}.csv`;
|
|
||||||
|
|
||||||
// Create CSV header
|
|
||||||
let csvContent = `block,${tokenB.symbol} per ${tokenA.symbol},${tokenA.symbol} per ${tokenB.symbol},Amount In,Amount Out,Effective Rate\n`;
|
|
||||||
|
|
||||||
// Get max number of iterations
|
|
||||||
const maxIterations = quoteResults.forward.length;
|
|
||||||
|
|
||||||
// Add data rows
|
|
||||||
for (let i = 0; i < maxIterations; i++) {
|
|
||||||
const forwardResult = quoteResults.forward[i];
|
|
||||||
|
|
||||||
// Use full precision for prices (no scientific notation)
|
|
||||||
const priceStr = priceData.priceStr;
|
|
||||||
const inversePriceStr = priceData.inversePriceStr;
|
|
||||||
csvContent += `${blockNumber},${priceStr},${inversePriceStr},`;
|
|
||||||
|
|
||||||
// Forward direction data with full precision
|
|
||||||
const amountInFormatted = bigNumberToFixed(ethers.BigNumber.from(forwardResult.amountInBN), tokenA.decimals);
|
|
||||||
const amountOutFormatted = bigNumberToFixed(ethers.BigNumber.from(forwardResult.amountOutBN), tokenB.decimals);
|
|
||||||
const effectiveRate = bigNumberToFixed(ethers.BigNumber.from(forwardResult.effectiveRateBN), tokenB.decimals);
|
|
||||||
|
|
||||||
csvContent += `${amountInFormatted},${amountOutFormatted},${effectiveRate}\n`;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write to file
|
|
||||||
fs.writeFileSync(filename, csvContent);
|
|
||||||
console.log(`\n✅ Results written to ${filename}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Main function
|
|
||||||
async function main() {
|
|
||||||
console.log('=== Uniswap V4 Quote and Gas Estimation ===\n');
|
|
||||||
// Get current block
|
|
||||||
const currentBlock = await anvilProvider.getBlockNumber();
|
|
||||||
const targetBlock = currentBlock - 10;
|
|
||||||
|
|
||||||
|
|
||||||
// Fetch pool key from Position Manager
|
|
||||||
let poolKey;
|
|
||||||
try {
|
|
||||||
poolKey = await getPoolKey();
|
|
||||||
} catch (error) {
|
|
||||||
console.error('Failed to fetch pool key. Exiting.');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get pool price data
|
|
||||||
let poolPriceData;
|
|
||||||
try {
|
|
||||||
poolPriceData = await getPoolPriceWithSDK(targetBlock);
|
|
||||||
} catch (error) {
|
|
||||||
console.error('Failed to get pool price data:', error.message);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get quotes for both directions
|
|
||||||
try {
|
|
||||||
const quoteResults = await getQuoteFromHistoricalBlock(poolKey, targetBlock);
|
|
||||||
console.log('✅ Historical quote successful!');
|
|
||||||
|
|
||||||
// Write results to CSV
|
|
||||||
writeResultsToCSV(targetBlock, poolPriceData, quoteResults);
|
|
||||||
} catch (error) {
|
|
||||||
console.error('❌ Failed to get historical quote:', error.message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Run the main function
|
|
||||||
main().catch(console.error);
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "uni4_quotes",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"description": "",
|
|
||||||
"license": "UNLICENSED",
|
|
||||||
"author": "",
|
|
||||||
"type": "module",
|
|
||||||
"main": "get_quotes.js",
|
|
||||||
"scripts": {
|
|
||||||
"dev": "node get_quotes.js",
|
|
||||||
"test": "echo \"Error: no test specified\" && exit 1"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"@uniswap/sdk-core": "^7.8.0",
|
|
||||||
"@uniswap/v4-sdk": "^1.22.0",
|
|
||||||
"ethers": "^5.8.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -67,6 +67,7 @@ contract DeployMock is Script {
|
|||||||
'Token Pool',
|
'Token Pool',
|
||||||
'TP',
|
'TP',
|
||||||
tokens,
|
tokens,
|
||||||
|
_bases,
|
||||||
ABDKMath64x64.divu(1, 10),
|
ABDKMath64x64.divu(1, 10),
|
||||||
ABDKMath64x64.divu(1,10000),
|
ABDKMath64x64.divu(1,10000),
|
||||||
_feePpm,
|
_feePpm,
|
||||||
@@ -111,6 +112,7 @@ contract DeployMock is Script {
|
|||||||
'Stablecoin Pool',
|
'Stablecoin Pool',
|
||||||
'STAP',
|
'STAP',
|
||||||
IERC20[](tokens),
|
IERC20[](tokens),
|
||||||
|
_bases,
|
||||||
ABDKMath64x64.divu(1, 10),
|
ABDKMath64x64.divu(1, 10),
|
||||||
ABDKMath64x64.divu(1,10000),
|
ABDKMath64x64.divu(1,10000),
|
||||||
_feePpm,
|
_feePpm,
|
||||||
@@ -152,6 +154,7 @@ contract DeployMock is Script {
|
|||||||
'Stable Pair',
|
'Stable Pair',
|
||||||
'SPAIR',
|
'SPAIR',
|
||||||
IERC20[](tokens),
|
IERC20[](tokens),
|
||||||
|
_bases,
|
||||||
ABDKMath64x64.divu(8,10), // kappa = 0.8
|
ABDKMath64x64.divu(8,10), // kappa = 0.8
|
||||||
_feePpm,
|
_feePpm,
|
||||||
_feePpm,
|
_feePpm,
|
||||||
|
|||||||
@@ -22,16 +22,11 @@ contract DeploySepolia is Script {
|
|||||||
vm.startBroadcast();
|
vm.startBroadcast();
|
||||||
|
|
||||||
// create mock _tokens
|
// create mock _tokens
|
||||||
// usxd = new MockERC20('Joke Currency', 'USXD', 6);
|
usxd = new MockERC20('Joke Currency', 'USXD', 6);
|
||||||
// fusd = new MockERC20('Fake USD', 'FUSD', 6);
|
fusd = new MockERC20('Fake USD', 'FUSD', 6);
|
||||||
// dive = new MockERC20('DAI Virtually Equal', 'DIVE', 18);
|
dive = new MockERC20('DAI Virtually Equal', 'DIVE', 18);
|
||||||
// butc = new MockERC20('Buttcoin', 'BUTC', 8);
|
butc = new MockERC20('Buttcoin', 'BUTC', 8);
|
||||||
// wteth = new MockERC20('Wrapped TETH', 'WTETH', 18);
|
wteth = new MockERC20('Wrapped TETH', 'WTETH', 18);
|
||||||
usxd = MockERC20(0x8E4D16886b8946dfE463fA172129eaBf4825fb09);
|
|
||||||
fusd = MockERC20(0xdc225280216822CA956738390f589c794129bd53);
|
|
||||||
dive = MockERC20(0x7ba123e4e7395A361284d069bD0D545F3f820641);
|
|
||||||
butc = MockERC20(0x88125947BBF1A6dd0FeD4B257BB3f9E1FBdCb3Cc);
|
|
||||||
wteth = MockERC20(0xC8dB65C0B9f4cf59097d4C5Bcb9e8E92B9e4e15F);
|
|
||||||
|
|
||||||
PartyPoolSwapImpl swapImpl = new PartyPoolSwapImpl(WETH);
|
PartyPoolSwapImpl swapImpl = new PartyPoolSwapImpl(WETH);
|
||||||
PartyPoolMintImpl mintImpl = new PartyPoolMintImpl(WETH);
|
PartyPoolMintImpl mintImpl = new PartyPoolMintImpl(WETH);
|
||||||
@@ -81,6 +76,7 @@ contract DeploySepolia is Script {
|
|||||||
'Token Pool',
|
'Token Pool',
|
||||||
'TP',
|
'TP',
|
||||||
tokens,
|
tokens,
|
||||||
|
_bases,
|
||||||
ABDKMath64x64.divu(1, 10),
|
ABDKMath64x64.divu(1, 10),
|
||||||
ABDKMath64x64.divu(1,10000),
|
ABDKMath64x64.divu(1,10000),
|
||||||
_feePpm,
|
_feePpm,
|
||||||
@@ -125,6 +121,7 @@ contract DeploySepolia is Script {
|
|||||||
'Stablecoin Pool',
|
'Stablecoin Pool',
|
||||||
'STAP',
|
'STAP',
|
||||||
tokens,
|
tokens,
|
||||||
|
_bases,
|
||||||
ABDKMath64x64.divu(1, 10),
|
ABDKMath64x64.divu(1, 10),
|
||||||
ABDKMath64x64.divu(1,10000),
|
ABDKMath64x64.divu(1,10000),
|
||||||
_feePpm,
|
_feePpm,
|
||||||
@@ -166,6 +163,7 @@ contract DeploySepolia is Script {
|
|||||||
'Stable Pair',
|
'Stable Pair',
|
||||||
'SPAIR',
|
'SPAIR',
|
||||||
tokens,
|
tokens,
|
||||||
|
_bases,
|
||||||
ABDKMath64x64.divu(8,10), // kappa = 0.8
|
ABDKMath64x64.divu(8,10), // kappa = 0.8
|
||||||
_feePpm,
|
_feePpm,
|
||||||
_feePpm,
|
_feePpm,
|
||||||
@@ -180,7 +178,7 @@ contract DeploySepolia is Script {
|
|||||||
PartyPoolViewer viewer = new PartyPoolViewer(swapImpl, mintImpl);
|
PartyPoolViewer viewer = new PartyPoolViewer(swapImpl, mintImpl);
|
||||||
|
|
||||||
// give tokens to msg.sender for later use
|
// give tokens to msg.sender for later use
|
||||||
// mintAll(msg.sender, 1_000_000);
|
mintAll(msg.sender, 1_000_000);
|
||||||
|
|
||||||
vm.stopBroadcast();
|
vm.stopBroadcast();
|
||||||
|
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ interface IPartyPlanner is IOwnable {
|
|||||||
/// @param name LP token name
|
/// @param name LP token name
|
||||||
/// @param symbol LP token symbol
|
/// @param symbol LP token symbol
|
||||||
/// @param tokens token addresses (n)
|
/// @param tokens token addresses (n)
|
||||||
|
/// @param bases scaling bases for each token (n) - used when converting to/from internal 64.64 amounts
|
||||||
/// @param tradeFrac trade fraction in 64.64 fixed-point (as used by LMSR)
|
/// @param tradeFrac trade fraction in 64.64 fixed-point (as used by LMSR)
|
||||||
/// @param targetSlippage target slippage in 64.64 fixed-point (as used by LMSR)
|
/// @param targetSlippage target slippage in 64.64 fixed-point (as used by LMSR)
|
||||||
/// @param swapFeePpm fee in parts-per-million, taken from swap input amounts before LMSR calculations
|
/// @param swapFeePpm fee in parts-per-million, taken from swap input amounts before LMSR calculations
|
||||||
@@ -34,6 +35,7 @@ interface IPartyPlanner is IOwnable {
|
|||||||
string memory name,
|
string memory name,
|
||||||
string memory symbol,
|
string memory symbol,
|
||||||
IERC20[] memory tokens,
|
IERC20[] memory tokens,
|
||||||
|
uint256[] memory bases,
|
||||||
int128 tradeFrac,
|
int128 tradeFrac,
|
||||||
int128 targetSlippage,
|
int128 targetSlippage,
|
||||||
uint256 swapFeePpm,
|
uint256 swapFeePpm,
|
||||||
@@ -51,6 +53,7 @@ interface IPartyPlanner is IOwnable {
|
|||||||
/// @param name LP token name
|
/// @param name LP token name
|
||||||
/// @param symbol LP token symbol
|
/// @param symbol LP token symbol
|
||||||
/// @param tokens token addresses (n)
|
/// @param tokens token addresses (n)
|
||||||
|
/// @param bases scaling bases for each token (n) - used when converting to/from internal 64.64 amounts
|
||||||
/// @param kappa liquidity parameter κ in 64.64 fixed-point used to derive b = κ * S(q)
|
/// @param kappa liquidity parameter κ in 64.64 fixed-point used to derive b = κ * S(q)
|
||||||
/// @param swapFeePpm fee in parts-per-million, taken from swap input amounts before LMSR calculations
|
/// @param swapFeePpm fee in parts-per-million, taken from swap input amounts before LMSR calculations
|
||||||
/// @param flashFeePpm fee in parts-per-million, taken for flash loans
|
/// @param flashFeePpm fee in parts-per-million, taken for flash loans
|
||||||
@@ -66,6 +69,7 @@ interface IPartyPlanner is IOwnable {
|
|||||||
string memory name,
|
string memory name,
|
||||||
string memory symbol,
|
string memory symbol,
|
||||||
IERC20[] memory tokens,
|
IERC20[] memory tokens,
|
||||||
|
uint256[] memory bases,
|
||||||
int128 kappa,
|
int128 kappa,
|
||||||
uint256 swapFeePpm,
|
uint256 swapFeePpm,
|
||||||
uint256 flashFeePpm,
|
uint256 flashFeePpm,
|
||||||
|
|||||||
261
src/LMSRBalancedPairPrecomputed.sol
Normal file
261
src/LMSRBalancedPairPrecomputed.sol
Normal file
@@ -0,0 +1,261 @@
|
|||||||
|
// SPDX-License-Identifier: UNLICENSED
|
||||||
|
pragma solidity ^0.8.30;
|
||||||
|
|
||||||
|
import "forge-std/console2.sol";
|
||||||
|
import {ABDKMath64x64} from "../lib/abdk-libraries-solidity/ABDKMath64x64.sol";
|
||||||
|
import {LMSRStabilized} from "./LMSRStabilized.sol";
|
||||||
|
|
||||||
|
/// @title LMSRBalancedPairPrecomputed
|
||||||
|
/// @notice Balanced-pair LMSR using a precomputed lookup table for amount-out:
|
||||||
|
/// y = b * ln(1 + α e^Δ), with Δ = (q_i - q_j)/b and α = 1 - e^{-u}, u = a/b.
|
||||||
|
/// @dev Precomputation is done once with exp/ln; runtime swaps are interpolation-only with no transcendental ops.
|
||||||
|
library LMSRBalancedPairPrecomputed {
|
||||||
|
using ABDKMath64x64 for int128;
|
||||||
|
using LMSRStabilized for LMSRStabilized.State;
|
||||||
|
|
||||||
|
// Q64.64 constants
|
||||||
|
int128 private constant ONE = 0x10000000000000000;
|
||||||
|
|
||||||
|
/// @dev Precomputation-only state; keeps table configuration and data separate from LMSR core state.
|
||||||
|
struct Precomp {
|
||||||
|
// Precompute config
|
||||||
|
int128 W; // half-width for Δ band (Q64.64), table centered at 0
|
||||||
|
int128 uMax; // maximum u = a/b covered (Q64.64)
|
||||||
|
uint256 NDelta; // number of Δ samples (>= 2)
|
||||||
|
uint256 NAlpha; // number of u/α samples (>= 2)
|
||||||
|
int128 deltaStep; // step in Δ grid (Q64.64) == 2W/(NDelta-1)
|
||||||
|
int128 uStep; // step in u grid (Q64.64) == uMax/(NAlpha-1)
|
||||||
|
|
||||||
|
// Grids and tables
|
||||||
|
int128[] deltaGrid; // Δ_i from -W to +W, length NDelta
|
||||||
|
int128[] uGrid; // u_j from 0 to uMax, length NAlpha
|
||||||
|
int128[] alphaLut; // α(u_j) = 1 - exp(-u_j), length NAlpha
|
||||||
|
int128[][] g; // g[j][i] = ln(1 + α_j * exp(Δ_i)), size NAlpha x NDelta
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --------------------
|
||||||
|
Initialization
|
||||||
|
-------------------- */
|
||||||
|
|
||||||
|
/// @notice Initialize the precomputed tables (assumes plenty of gas).
|
||||||
|
/// @param s LMSR core state (must already represent a 2-asset pool with kappa set)
|
||||||
|
/// @param p Precomputed table state to be filled
|
||||||
|
/// @param W Half-width in Δ around parity (Q64.64), table covers Δ ∈ [-W, +W]
|
||||||
|
/// @param uMax Maximum u = a/b to be supported by the table (Q64.64)
|
||||||
|
/// @param NDelta Number of Δ samples (>= 2)
|
||||||
|
/// @param NAlpha Number of u/α samples (>= 2)
|
||||||
|
function initPrecomputed(
|
||||||
|
LMSRStabilized.State storage s,
|
||||||
|
Precomp storage p,
|
||||||
|
int128 W,
|
||||||
|
int128 uMax,
|
||||||
|
uint256 NDelta,
|
||||||
|
uint256 NAlpha
|
||||||
|
) internal {
|
||||||
|
require(s.nAssets == 2, "Precomp: requires 2-asset pool");
|
||||||
|
require(s.kappa > int128(0), "Precomp: kappa>0");
|
||||||
|
require(W > int128(0), "Precomp: W>0");
|
||||||
|
require(uMax > int128(0), "Precomp: uMax>0");
|
||||||
|
require(NDelta >= 2, "Precomp: NDelta>=2");
|
||||||
|
require(NAlpha >= 2, "Precomp: NAlpha>=2");
|
||||||
|
|
||||||
|
// Store config
|
||||||
|
p.W = W;
|
||||||
|
p.uMax = uMax;
|
||||||
|
p.NDelta = NDelta;
|
||||||
|
p.NAlpha = NAlpha;
|
||||||
|
|
||||||
|
// Steps
|
||||||
|
p.deltaStep = _div64(_mul64(W, _fromUInt(2)), _fromUInt(NDelta - 1)); // 2W/(NDelta-1)
|
||||||
|
p.uStep = _div64(uMax, _fromUInt(NAlpha - 1)); // uMax/(NAlpha-1)
|
||||||
|
|
||||||
|
// Build grids
|
||||||
|
p.deltaGrid = new int128[](NDelta);
|
||||||
|
p.uGrid = new int128[](NAlpha);
|
||||||
|
p.alphaLut = new int128[](NAlpha);
|
||||||
|
p.g = new int128[][](NAlpha);
|
||||||
|
|
||||||
|
// Δ grid from -W to +W
|
||||||
|
int128 startDelta = W.neg();
|
||||||
|
for (uint256 i = 0; i < NDelta; ) {
|
||||||
|
p.deltaGrid[i] = startDelta.add(_mul64(p.deltaStep, _fromUInt(i)));
|
||||||
|
unchecked { ++i; }
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build u grid and alpha(u) LUT
|
||||||
|
for (uint256 j = 0; j < NAlpha; ) {
|
||||||
|
int128 uj = _mul64(p.uStep, _fromUInt(j)); // 0 .. uMax
|
||||||
|
p.uGrid[j] = uj;
|
||||||
|
// α(u) = 1 - exp(-u)
|
||||||
|
int128 alphaJ = ONE.sub(ABDKMath64x64.exp(uj.neg()));
|
||||||
|
p.alphaLut[j] = alphaJ;
|
||||||
|
p.g[j] = new int128[](NDelta);
|
||||||
|
unchecked { ++j; }
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fill g[j][i] = ln(1 + α_j * exp(Δ_i))
|
||||||
|
for (uint256 j = 0; j < NAlpha; ) {
|
||||||
|
int128 alphaJ = p.alphaLut[j];
|
||||||
|
for (uint256 i = 0; i < NDelta; ) {
|
||||||
|
int128 eDelta = ABDKMath64x64.exp(p.deltaGrid[i]);
|
||||||
|
int128 inner = ONE.add(alphaJ.mul(eDelta));
|
||||||
|
p.g[j][i] = ABDKMath64x64.ln(inner);
|
||||||
|
unchecked { ++i; }
|
||||||
|
}
|
||||||
|
unchecked { ++j; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --------------------
|
||||||
|
Swap (Interpolated)
|
||||||
|
-------------------- */
|
||||||
|
|
||||||
|
/// @notice Exact-input swap i -> j using the precomputed table when feasible.
|
||||||
|
/// @dev Falls back to exact LMSR for:
|
||||||
|
/// - limitPrice > 0,
|
||||||
|
/// - |Δ| > W or u not in [0, uMax],
|
||||||
|
/// - non-positive amounts or degenerate b,
|
||||||
|
/// - non-2-asset pools.
|
||||||
|
function swapAmountsForExactInput(
|
||||||
|
LMSRStabilized.State storage s,
|
||||||
|
Precomp storage p,
|
||||||
|
uint256 i,
|
||||||
|
uint256 j,
|
||||||
|
int128 a,
|
||||||
|
int128 limitPrice
|
||||||
|
) internal view returns (int128 amountIn, int128 amountOut) {
|
||||||
|
// Validate pool shape and indices
|
||||||
|
if (s.nAssets != 2 || i >= 2 || j >= 2) {
|
||||||
|
console2.log('Precomp: fallback (nAssets)');
|
||||||
|
return LMSRStabilized.swapAmountsForExactInput(s.nAssets, s.kappa, s.qInternal, i, j, a, limitPrice);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Do not handle limitPrice within the table path; use exact routine for correctness.
|
||||||
|
if (limitPrice > int128(0)) {
|
||||||
|
console2.log('Precomp: fallback (limit>0)');
|
||||||
|
return LMSRStabilized.swapAmountsForExactInput(s.nAssets, s.kappa, s.qInternal, i, j, a, limitPrice);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Compute b = κ * S(q)
|
||||||
|
int128 sizeMetric = _computeSizeMetric(s.qInternal);
|
||||||
|
if (!(sizeMetric > int128(0))) {
|
||||||
|
console2.log('Precomp: fallback (size=0)');
|
||||||
|
return (int128(0), int128(0));
|
||||||
|
}
|
||||||
|
int128 b = s.kappa.mul(sizeMetric);
|
||||||
|
if (!(b > int128(0))) {
|
||||||
|
console2.log('Precomp: fallback (b<=0)');
|
||||||
|
return (int128(0), int128(0));
|
||||||
|
}
|
||||||
|
int128 invB = _div64(ONE, b);
|
||||||
|
|
||||||
|
// Require positive input
|
||||||
|
if (a <= int128(0)) {
|
||||||
|
console2.log('Precomp: fallback (a<0)');
|
||||||
|
return LMSRStabilized.swapAmountsForExactInput(s.nAssets, s.kappa, s.qInternal, i, j, a, limitPrice);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Compute u and Δ
|
||||||
|
int128 u = a.mul(invB);
|
||||||
|
if (u < int128(0) || u > p.uMax) {
|
||||||
|
// outside u range - fallback
|
||||||
|
console2.log('Precomp: fallback (outside u)');
|
||||||
|
console2.log(u);
|
||||||
|
console2.log(p.uMax);
|
||||||
|
return LMSRStabilized.swapAmountsForExactInput(s.nAssets, s.kappa, s.qInternal, i, j, a, limitPrice);
|
||||||
|
}
|
||||||
|
|
||||||
|
int128 delta = s.qInternal[i].sub(s.qInternal[j]).mul(invB);
|
||||||
|
int128 absDelta = delta >= int128(0) ? delta : delta.neg();
|
||||||
|
if (absDelta > p.W) {
|
||||||
|
// outside ±W band - fallback
|
||||||
|
console2.log('Precomp: fallback (outside W)');
|
||||||
|
return LMSRStabilized.swapAmountsForExactInput(s.nAssets, s.kappa, s.qInternal, i, j, a, limitPrice);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 1D interpolation position for u (row selection)
|
||||||
|
(uint256 j0, int128 wu) = _interpPosition(u, p.uStep, p.NAlpha);
|
||||||
|
int128 oneMinusWu = ONE.sub(wu);
|
||||||
|
|
||||||
|
// Map Δ ∈ [-W, +W] to shifted in [0, 2W]
|
||||||
|
int128 deltaShifted = delta.add(p.W);
|
||||||
|
(uint256 i0, int128 wd) = _interpPosition(deltaShifted, p.deltaStep, p.NDelta);
|
||||||
|
int128 oneMinusWd = ONE.sub(wd);
|
||||||
|
|
||||||
|
// Interpolate along Δ within rows j0 and j0+1
|
||||||
|
int128 g00 = p.g[j0][i0];
|
||||||
|
int128 g01 = p.g[j0][i0 + 1];
|
||||||
|
int128 g0 = g00.mul(oneMinusWd).add(g01.mul(wd));
|
||||||
|
|
||||||
|
int128 g10 = p.g[j0 + 1][i0];
|
||||||
|
int128 g11 = p.g[j0 + 1][i0 + 1];
|
||||||
|
int128 g1 = g10.mul(oneMinusWd).add(g11.mul(wd));
|
||||||
|
|
||||||
|
// Interpolate across u between rows
|
||||||
|
int128 g = g0.mul(oneMinusWu).add(g1.mul(wu));
|
||||||
|
|
||||||
|
// amountOut = b * g
|
||||||
|
int128 out64 = b.mul(g);
|
||||||
|
if (out64 <= int128(0)) {
|
||||||
|
// Numerical guard; fallback
|
||||||
|
console2.log('Precomp: fallback (out<0)');
|
||||||
|
return LMSRStabilized.swapAmountsForExactInput(s.nAssets, s.kappa, s.qInternal, i, j, a, limitPrice);
|
||||||
|
}
|
||||||
|
|
||||||
|
console2.log('Precomp: success');
|
||||||
|
amountIn = a;
|
||||||
|
amountOut = out64;
|
||||||
|
return (amountIn, amountOut);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --------------------
|
||||||
|
Internal helpers
|
||||||
|
-------------------- */
|
||||||
|
|
||||||
|
/// @dev Compute size metric S(q) = sum q_i
|
||||||
|
function _computeSizeMetric(int128[] memory qInternal) private pure returns (int128) {
|
||||||
|
int128 total = int128(0);
|
||||||
|
for (uint256 k = 0; k < qInternal.length; ) {
|
||||||
|
total = total.add(qInternal[k]);
|
||||||
|
unchecked { ++k; }
|
||||||
|
}
|
||||||
|
return total;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @dev Q64.64 wrappers (avoid name conflicts and keep intent explicit)
|
||||||
|
function _fromUInt(uint256 x) private pure returns (int128) {
|
||||||
|
return ABDKMath64x64.fromUInt(x);
|
||||||
|
}
|
||||||
|
function _mul64(int128 a, int128 b) private pure returns (int128) {
|
||||||
|
return a.mul(b);
|
||||||
|
}
|
||||||
|
function _div64(int128 a, int128 b) private pure returns (int128) {
|
||||||
|
return ABDKMath64x64.div(a, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @dev Given x >= 0 and a uniform step > 0, compute index floor(x/step) clamped to [0, n-2] and fraction w in [0,1]:
|
||||||
|
/// x ≈ (idx * step) * (1-w) + ((idx+1) * step) * w
|
||||||
|
function _interpPosition(int128 x, int128 step, uint256 n)
|
||||||
|
private
|
||||||
|
pure
|
||||||
|
returns (uint256 idx, int128 w)
|
||||||
|
{
|
||||||
|
// t = x/step in Q64.64
|
||||||
|
int128 t = _div64(x, step);
|
||||||
|
// floor index = uint(t) via right shift by 64 (x >= 0 ensures non-negative)
|
||||||
|
uint256 idxFloor = uint256(int256(t)) >> 64;
|
||||||
|
if (idxFloor >= n - 1) {
|
||||||
|
// clamp to the last segment
|
||||||
|
idx = n - 2;
|
||||||
|
w = ONE; // exact at upper bound
|
||||||
|
return (idx, w);
|
||||||
|
}
|
||||||
|
idx = idxFloor;
|
||||||
|
|
||||||
|
// fractional part: w = (x - idx*step) / step
|
||||||
|
int128 xi = _mul64(step, _fromUInt(idx));
|
||||||
|
int128 frac = x.sub(xi);
|
||||||
|
w = _div64(frac, step); // in [0,1)
|
||||||
|
return (idx, w);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -87,6 +87,7 @@ contract PartyPlanner is OwnableExternal, IPartyPlanner {
|
|||||||
string memory name_,
|
string memory name_,
|
||||||
string memory symbol_,
|
string memory symbol_,
|
||||||
IERC20[] memory tokens_,
|
IERC20[] memory tokens_,
|
||||||
|
uint256[] memory bases_,
|
||||||
int128 kappa_,
|
int128 kappa_,
|
||||||
uint256 swapFeePpm_,
|
uint256 swapFeePpm_,
|
||||||
uint256 flashFeePpm_,
|
uint256 flashFeePpm_,
|
||||||
@@ -114,6 +115,7 @@ contract PartyPlanner is OwnableExternal, IPartyPlanner {
|
|||||||
name_,
|
name_,
|
||||||
symbol_,
|
symbol_,
|
||||||
tokens_,
|
tokens_,
|
||||||
|
bases_,
|
||||||
kappa_,
|
kappa_,
|
||||||
swapFeePpm_,
|
swapFeePpm_,
|
||||||
flashFeePpm_,
|
flashFeePpm_,
|
||||||
@@ -163,6 +165,7 @@ contract PartyPlanner is OwnableExternal, IPartyPlanner {
|
|||||||
string memory name_,
|
string memory name_,
|
||||||
string memory symbol_,
|
string memory symbol_,
|
||||||
IERC20[] memory tokens_,
|
IERC20[] memory tokens_,
|
||||||
|
uint256[] memory bases_,
|
||||||
int128 tradeFrac_,
|
int128 tradeFrac_,
|
||||||
int128 targetSlippage_,
|
int128 targetSlippage_,
|
||||||
uint256 swapFeePpm_,
|
uint256 swapFeePpm_,
|
||||||
@@ -187,6 +190,7 @@ contract PartyPlanner is OwnableExternal, IPartyPlanner {
|
|||||||
name_,
|
name_,
|
||||||
symbol_,
|
symbol_,
|
||||||
tokens_,
|
tokens_,
|
||||||
|
bases_,
|
||||||
computedKappa,
|
computedKappa,
|
||||||
swapFeePpm_,
|
swapFeePpm_,
|
||||||
flashFeePpm_,
|
flashFeePpm_,
|
||||||
|
|||||||
@@ -99,6 +99,7 @@ contract PartyPool is PartyPoolBase, OwnableExternal, ERC20External, IPartyPool
|
|||||||
/// @param name_ LP token name
|
/// @param name_ LP token name
|
||||||
/// @param symbol_ LP token symbol
|
/// @param symbol_ LP token symbol
|
||||||
/// @param tokens_ token addresses (n)
|
/// @param tokens_ token addresses (n)
|
||||||
|
/// @param bases_ scaling _bases for each token (n) - used when converting to/from internal 64.64 amounts
|
||||||
/// @param kappa_ liquidity parameter κ (Q64.64) used to derive b = κ * S(q)
|
/// @param kappa_ liquidity parameter κ (Q64.64) used to derive b = κ * S(q)
|
||||||
/// @param swapFeePpm_ fee in parts-per-million, taken from swap input amounts before LMSR calculations
|
/// @param swapFeePpm_ fee in parts-per-million, taken from swap input amounts before LMSR calculations
|
||||||
/// @param flashFeePpm_ fee in parts-per-million, taken for flash loans
|
/// @param flashFeePpm_ fee in parts-per-million, taken for flash loans
|
||||||
@@ -109,6 +110,7 @@ contract PartyPool is PartyPoolBase, OwnableExternal, ERC20External, IPartyPool
|
|||||||
string memory name_,
|
string memory name_,
|
||||||
string memory symbol_,
|
string memory symbol_,
|
||||||
IERC20[] memory tokens_,
|
IERC20[] memory tokens_,
|
||||||
|
uint256[] memory bases_,
|
||||||
int128 kappa_,
|
int128 kappa_,
|
||||||
uint256 swapFeePpm_,
|
uint256 swapFeePpm_,
|
||||||
uint256 flashFeePpm_,
|
uint256 flashFeePpm_,
|
||||||
@@ -124,7 +126,9 @@ contract PartyPool is PartyPoolBase, OwnableExternal, ERC20External, IPartyPool
|
|||||||
{
|
{
|
||||||
require(owner_ != address(0));
|
require(owner_ != address(0));
|
||||||
require(tokens_.length > 1, "Pool: need >1 asset");
|
require(tokens_.length > 1, "Pool: need >1 asset");
|
||||||
|
require(tokens_.length == bases_.length, "Pool: lengths mismatch");
|
||||||
_tokens = tokens_;
|
_tokens = tokens_;
|
||||||
|
_bases = bases_;
|
||||||
KAPPA = kappa_;
|
KAPPA = kappa_;
|
||||||
require(swapFeePpm_ < 1_000_000, "Pool: fee >= ppm");
|
require(swapFeePpm_ < 1_000_000, "Pool: fee >= ppm");
|
||||||
SWAP_FEE_PPM = swapFeePpm_;
|
SWAP_FEE_PPM = swapFeePpm_;
|
||||||
@@ -149,9 +153,6 @@ contract PartyPool is PartyPoolBase, OwnableExternal, ERC20External, IPartyPool
|
|||||||
unchecked {i++;}
|
unchecked {i++;}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Allocate denominators (bases) to be computed during initialMint from initial deposits
|
|
||||||
_bases = new uint256[](n);
|
|
||||||
|
|
||||||
// Initialize caches to zero and protocol ledger
|
// Initialize caches to zero and protocol ledger
|
||||||
_cachedUintBalances = new uint256[](n);
|
_cachedUintBalances = new uint256[](n);
|
||||||
_protocolFeesOwed = new uint256[](n);
|
_protocolFeesOwed = new uint256[](n);
|
||||||
|
|||||||
@@ -1,34 +1,55 @@
|
|||||||
// SPDX-License-Identifier: UNLICENSED
|
// SPDX-License-Identifier: UNLICENSED
|
||||||
pragma solidity ^0.8.30;
|
pragma solidity ^0.8.30;
|
||||||
|
|
||||||
|
import {ABDKMath64x64} from "../lib/abdk-libraries-solidity/ABDKMath64x64.sol";
|
||||||
import {IERC20} from "../lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol";
|
import {IERC20} from "../lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol";
|
||||||
|
import {LMSRBalancedPairPrecomputed} from "./LMSRBalancedPairPrecomputed.sol";
|
||||||
import {NativeWrapper} from "./NativeWrapper.sol";
|
import {NativeWrapper} from "./NativeWrapper.sol";
|
||||||
import {LMSRStabilizedBalancedPair} from "./LMSRStabilizedBalancedPair.sol";
|
|
||||||
import {PartyPool} from "./PartyPool.sol";
|
import {PartyPool} from "./PartyPool.sol";
|
||||||
import {PartyPoolBase} from "./PartyPoolBase.sol";
|
import {PartyPoolBase} from "./PartyPoolBase.sol";
|
||||||
import {PartyPoolMintImpl} from "./PartyPoolMintImpl.sol";
|
import {PartyPoolMintImpl} from "./PartyPoolMintImpl.sol";
|
||||||
import {PartyPoolSwapImpl} from "./PartyPoolSwapImpl.sol";
|
import {PartyPoolSwapImpl} from "./PartyPoolSwapImpl.sol";
|
||||||
|
|
||||||
contract PartyPoolBalancedPair is PartyPool {
|
contract PartyPoolBalancedPair is PartyPool {
|
||||||
|
|
||||||
|
LMSRBalancedPairPrecomputed.Precomp internal _precomp;
|
||||||
|
bool internal _precomputed;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
address owner_,
|
address owner_,
|
||||||
string memory name_,
|
string memory name_,
|
||||||
string memory symbol_,
|
string memory symbol_,
|
||||||
IERC20[] memory tokens_,
|
IERC20[] memory tokens_,
|
||||||
|
uint256[] memory bases_,
|
||||||
int128 kappa_,
|
int128 kappa_,
|
||||||
uint256 swapFeePpm_,
|
uint256 swapFeePpm_,
|
||||||
uint256 flashFeePpm_,
|
uint256 flashFeePpm_,
|
||||||
uint256 protocolFeePpm_, // NEW: protocol share of fees (ppm)
|
uint256 protocolFeePpm_,
|
||||||
address protocolFeeAddress_, // NEW: recipient for collected protocol tokens
|
address protocolFeeAddress_,
|
||||||
NativeWrapper wrapperToken_,
|
NativeWrapper wrapperToken_,
|
||||||
PartyPoolSwapImpl swapMintImpl_,
|
PartyPoolSwapImpl swapMintImpl_,
|
||||||
PartyPoolMintImpl mintImpl_
|
PartyPoolMintImpl mintImpl_
|
||||||
)
|
)
|
||||||
PartyPool(owner_, name_, symbol_, tokens_, kappa_, swapFeePpm_, flashFeePpm_, protocolFeePpm_, protocolFeeAddress_, wrapperToken_, swapMintImpl_, mintImpl_)
|
PartyPool(owner_, name_, symbol_, tokens_, bases_, kappa_, swapFeePpm_, flashFeePpm_, protocolFeePpm_, protocolFeeAddress_, wrapperToken_, swapMintImpl_, mintImpl_)
|
||||||
{}
|
{
|
||||||
|
// Initialize kappa early so precompute() can be called before initialMint()
|
||||||
|
_lmsr.kappa = kappa_;
|
||||||
|
}
|
||||||
|
|
||||||
|
function precompute(
|
||||||
|
int128 W,
|
||||||
|
int128 uMax,
|
||||||
|
uint256 NDelta,
|
||||||
|
uint256 NAlpha
|
||||||
|
) external {
|
||||||
|
require(!_precomputed, 'Precomp: already initialized');
|
||||||
|
LMSRBalancedPairPrecomputed.initPrecomputed(_lmsr, _precomp, W, uMax, NDelta, NAlpha );
|
||||||
|
_precomputed = true;
|
||||||
|
}
|
||||||
|
|
||||||
function _swapAmountsForExactInput(uint256 i, uint256 j, int128 a, int128 limitPrice) internal virtual override view
|
function _swapAmountsForExactInput(uint256 i, uint256 j, int128 a, int128 limitPrice) internal virtual override view
|
||||||
returns (int128 amountIn, int128 amountOut) {
|
returns (int128 amountIn, int128 amountOut) {
|
||||||
return LMSRStabilizedBalancedPair.swapAmountsForExactInput(_lmsr, i, j, a, limitPrice);
|
// return LMSRStabilizedBalancedPair.swapAmountsForExactInput(_lmsr, i, j, a, limitPrice);
|
||||||
|
return LMSRBalancedPairPrecomputed.swapAmountsForExactInput(_lmsr, _precomp, i, j, a, limitPrice);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,14 @@
|
|||||||
// SPDX-License-Identifier: UNLICENSED
|
// SPDX-License-Identifier: UNLICENSED
|
||||||
pragma solidity ^0.8.30;
|
pragma solidity ^0.8.30;
|
||||||
|
|
||||||
import "./PartyPoolMintImpl.sol";
|
import {ABDKMath64x64} from "../lib/abdk-libraries-solidity/ABDKMath64x64.sol";
|
||||||
import "./PartyPoolSwapImpl.sol";
|
import {IERC20} from "../lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol";
|
||||||
|
import {IPartyPool} from "./IPartyPool.sol";
|
||||||
|
import {NativeWrapper} from "./NativeWrapper.sol";
|
||||||
import {PartyPool} from "./PartyPool.sol";
|
import {PartyPool} from "./PartyPool.sol";
|
||||||
import {PartyPoolBalancedPair} from "./PartyPoolBalancedPair.sol";
|
import {PartyPoolBalancedPair} from "./PartyPoolBalancedPair.sol";
|
||||||
|
import {PartyPoolMintImpl} from "./PartyPoolMintImpl.sol";
|
||||||
|
import {PartyPoolSwapImpl} from "./PartyPoolSwapImpl.sol";
|
||||||
|
|
||||||
// This pattern is needed because the PartyPlanner constructs two different types of pools (regular and balanced-pair)
|
// This pattern is needed because the PartyPlanner constructs two different types of pools (regular and balanced-pair)
|
||||||
// but doesn't have room to store the initialization code of both contracts. Therefore, we delegate pool construction.
|
// but doesn't have room to store the initialization code of both contracts. Therefore, we delegate pool construction.
|
||||||
@@ -15,6 +19,7 @@ interface IPartyPoolDeployer {
|
|||||||
string memory name_,
|
string memory name_,
|
||||||
string memory symbol_,
|
string memory symbol_,
|
||||||
IERC20[] memory tokens_,
|
IERC20[] memory tokens_,
|
||||||
|
uint256[] memory bases_,
|
||||||
int128 kappa_,
|
int128 kappa_,
|
||||||
uint256 swapFeePpm_,
|
uint256 swapFeePpm_,
|
||||||
uint256 flashFeePpm_,
|
uint256 flashFeePpm_,
|
||||||
@@ -32,6 +37,7 @@ contract PartyPoolDeployer is IPartyPoolDeployer {
|
|||||||
string memory name_,
|
string memory name_,
|
||||||
string memory symbol_,
|
string memory symbol_,
|
||||||
IERC20[] memory tokens_,
|
IERC20[] memory tokens_,
|
||||||
|
uint256[] memory bases_,
|
||||||
int128 kappa_,
|
int128 kappa_,
|
||||||
uint256 swapFeePpm_,
|
uint256 swapFeePpm_,
|
||||||
uint256 flashFeePpm_,
|
uint256 flashFeePpm_,
|
||||||
@@ -46,6 +52,7 @@ contract PartyPoolDeployer is IPartyPoolDeployer {
|
|||||||
name_,
|
name_,
|
||||||
symbol_,
|
symbol_,
|
||||||
tokens_,
|
tokens_,
|
||||||
|
bases_,
|
||||||
kappa_,
|
kappa_,
|
||||||
swapFeePpm_,
|
swapFeePpm_,
|
||||||
flashFeePpm_,
|
flashFeePpm_,
|
||||||
@@ -64,6 +71,7 @@ contract PartyPoolBalancedPairDeployer is IPartyPoolDeployer {
|
|||||||
string memory name_,
|
string memory name_,
|
||||||
string memory symbol_,
|
string memory symbol_,
|
||||||
IERC20[] memory tokens_,
|
IERC20[] memory tokens_,
|
||||||
|
uint256[] memory bases_,
|
||||||
int128 kappa_,
|
int128 kappa_,
|
||||||
uint256 swapFeePpm_,
|
uint256 swapFeePpm_,
|
||||||
uint256 flashFeePpm_,
|
uint256 flashFeePpm_,
|
||||||
@@ -73,11 +81,12 @@ contract PartyPoolBalancedPairDeployer is IPartyPoolDeployer {
|
|||||||
PartyPoolSwapImpl swapImpl_,
|
PartyPoolSwapImpl swapImpl_,
|
||||||
PartyPoolMintImpl mintImpl_
|
PartyPoolMintImpl mintImpl_
|
||||||
) external returns (IPartyPool) {
|
) external returns (IPartyPool) {
|
||||||
return new PartyPoolBalancedPair(
|
PartyPoolBalancedPair pool = new PartyPoolBalancedPair(
|
||||||
owner_,
|
owner_,
|
||||||
name_,
|
name_,
|
||||||
symbol_,
|
symbol_,
|
||||||
tokens_,
|
tokens_,
|
||||||
|
bases_,
|
||||||
kappa_,
|
kappa_,
|
||||||
swapFeePpm_,
|
swapFeePpm_,
|
||||||
flashFeePpm_,
|
flashFeePpm_,
|
||||||
@@ -87,5 +96,14 @@ contract PartyPoolBalancedPairDeployer is IPartyPoolDeployer {
|
|||||||
swapImpl_,
|
swapImpl_,
|
||||||
mintImpl_
|
mintImpl_
|
||||||
);
|
);
|
||||||
|
|
||||||
|
pool.precompute(
|
||||||
|
ABDKMath64x64.divu(25,10_000), // ±25 bps
|
||||||
|
ABDKMath64x64.divu(10, 100), // taking up to 10% of the pool
|
||||||
|
20, // num Δ samples
|
||||||
|
20 // num α samples
|
||||||
|
);
|
||||||
|
|
||||||
|
return pool;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,38 +33,30 @@ contract PartyPoolMintImpl is PartyPoolBase {
|
|||||||
bool isInitialDeposit = _totalSupply == 0 || _lmsr.nAssets == 0;
|
bool isInitialDeposit = _totalSupply == 0 || _lmsr.nAssets == 0;
|
||||||
require(isInitialDeposit, "initialMint: pool already initialized");
|
require(isInitialDeposit, "initialMint: pool already initialized");
|
||||||
|
|
||||||
// Read initial on-chain balances, require all > 0, and compute denominators (bases) from deposits.
|
// Update cached balances for all assets
|
||||||
// We assume equal-valued deposits; set base[i] = depositAmount so internal q_i starts at 1.0.
|
|
||||||
int128[] memory newQInternal = new int128[](n);
|
int128[] memory newQInternal = new int128[](n);
|
||||||
uint256[] memory depositAmounts = new uint256[](n);
|
uint256[] memory depositAmounts = new uint256[](n);
|
||||||
|
|
||||||
for (uint i = 0; i < n; ) {
|
for (uint i = 0; i < n; ) {
|
||||||
uint256 bal = IERC20(_tokens[i]).balanceOf(address(this));
|
uint256 bal = IERC20(_tokens[i]).balanceOf(address(this));
|
||||||
require(bal > 0, "initialMint: zero initial balance");
|
|
||||||
depositAmounts[i] = bal;
|
|
||||||
|
|
||||||
// Cache external balances
|
|
||||||
_cachedUintBalances[i] = bal;
|
_cachedUintBalances[i] = bal;
|
||||||
|
|
||||||
// Set per-asset denominator to the observed deposit amount (at least 1)
|
|
||||||
_bases[i] = bal;
|
|
||||||
|
|
||||||
// Compute internal q_i = bal / base_i => ~1.0 in 64.64
|
|
||||||
newQInternal[i] = _uintToInternalFloor(bal, _bases[i]);
|
newQInternal[i] = _uintToInternalFloor(bal, _bases[i]);
|
||||||
require(newQInternal[i] > int128(0), "initialMint: zero internal q");
|
depositAmounts[i] = bal;
|
||||||
|
|
||||||
unchecked { i++; }
|
unchecked { i++; }
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize the stabilized LMSR state with provided kappa
|
// Initialize the stabilized LMSR state with provided kappa
|
||||||
_lmsr.init(newQInternal, KAPPA);
|
_lmsr.init(newQInternal, KAPPA);
|
||||||
|
|
||||||
// Obey the passed-in initial LP amount. If 0, default to 1e18
|
// Compute actual LP _tokens to mint based on size metric (scaled)
|
||||||
lpMinted = lpTokens == 0 ? 1e18 : lpTokens;
|
if( lpTokens != 0 )
|
||||||
|
lpMinted = lpTokens;
|
||||||
if (lpMinted > 0) {
|
else {
|
||||||
_mint(receiver, lpMinted);
|
int128 newTotal = _computeSizeMetric(newQInternal);
|
||||||
|
lpMinted = ABDKMath64x64.mulu(newTotal, LP_SCALE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
require(lpMinted > 0, "initialMint: zero LP amount");
|
||||||
|
_mint(receiver, lpMinted);
|
||||||
emit IPartyPool.Mint(address(0), receiver, depositAmounts, lpMinted);
|
emit IPartyPool.Mint(address(0), receiver, depositAmounts, lpMinted);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
// SPDX-License-Identifier: UNLICENSED
|
// SPDX-License-Identifier: UNLICENSED
|
||||||
pragma solidity ^0.8.30;
|
pragma solidity ^0.8.30;
|
||||||
|
|
||||||
|
import {ABDKMath64x64} from "../lib/abdk-libraries-solidity/ABDKMath64x64.sol";
|
||||||
import {IERC20} from "../lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol";
|
import {IERC20} from "../lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol";
|
||||||
import {NativeWrapper} from "../src/NativeWrapper.sol";
|
import {NativeWrapper} from "../src/NativeWrapper.sol";
|
||||||
import {PartyPlanner} from "../src/PartyPlanner.sol";
|
import {PartyPlanner} from "../src/PartyPlanner.sol";
|
||||||
@@ -44,13 +45,14 @@ library Deploy {
|
|||||||
string memory name_,
|
string memory name_,
|
||||||
string memory symbol_,
|
string memory symbol_,
|
||||||
IERC20[] memory tokens_,
|
IERC20[] memory tokens_,
|
||||||
|
uint256[] memory bases_,
|
||||||
int128 _kappa,
|
int128 _kappa,
|
||||||
uint256 _swapFeePpm,
|
uint256 _swapFeePpm,
|
||||||
uint256 _flashFeePpm,
|
uint256 _flashFeePpm,
|
||||||
bool _stable
|
bool _stable
|
||||||
) internal returns (PartyPool) {
|
) internal returns (PartyPool) {
|
||||||
NativeWrapper wrapper = new WETH9();
|
NativeWrapper wrapper = new WETH9();
|
||||||
return newPartyPool(owner_, name_, symbol_, tokens_, _kappa, _swapFeePpm, _flashFeePpm, wrapper, _stable);
|
return newPartyPool(owner_, name_, symbol_, tokens_, bases_, _kappa, _swapFeePpm, _flashFeePpm, wrapper, _stable);
|
||||||
}
|
}
|
||||||
|
|
||||||
function newPartyPool(
|
function newPartyPool(
|
||||||
@@ -58,32 +60,43 @@ library Deploy {
|
|||||||
string memory name_,
|
string memory name_,
|
||||||
string memory symbol_,
|
string memory symbol_,
|
||||||
IERC20[] memory tokens_,
|
IERC20[] memory tokens_,
|
||||||
|
uint256[] memory bases_,
|
||||||
int128 _kappa,
|
int128 _kappa,
|
||||||
uint256 _swapFeePpm,
|
uint256 _swapFeePpm,
|
||||||
uint256 _flashFeePpm,
|
uint256 _flashFeePpm,
|
||||||
NativeWrapper wrapper,
|
NativeWrapper wrapper,
|
||||||
bool _stable
|
bool _stable
|
||||||
) internal returns (PartyPool) {
|
) internal returns (PartyPool) {
|
||||||
return _stable && tokens_.length == 2 ?
|
if(_stable && tokens_.length == 2) {
|
||||||
new PartyPoolBalancedPair(
|
PartyPoolBalancedPair pool = new PartyPoolBalancedPair(
|
||||||
owner_,
|
owner_,
|
||||||
name_,
|
name_,
|
||||||
symbol_,
|
symbol_,
|
||||||
tokens_,
|
tokens_,
|
||||||
_kappa,
|
bases_,
|
||||||
_swapFeePpm,
|
_kappa,
|
||||||
_flashFeePpm,
|
_swapFeePpm,
|
||||||
PROTOCOL_FEE_PPM,
|
_flashFeePpm,
|
||||||
PROTOCOL_FEE_RECEIVER,
|
PROTOCOL_FEE_PPM,
|
||||||
wrapper,
|
PROTOCOL_FEE_RECEIVER,
|
||||||
new PartyPoolSwapImpl(wrapper),
|
wrapper,
|
||||||
new PartyPoolMintImpl(wrapper)
|
new PartyPoolSwapImpl(wrapper),
|
||||||
) :
|
new PartyPoolMintImpl(wrapper)
|
||||||
new PartyPool(
|
);
|
||||||
|
pool.precompute(
|
||||||
|
ABDKMath64x64.divu(25,10_000), // ±25 bps
|
||||||
|
ABDKMath64x64.divu(10, 100), // taking up to 10% of the pool
|
||||||
|
20, // num Δ samples
|
||||||
|
20 // num α samples
|
||||||
|
);
|
||||||
|
return pool;
|
||||||
|
}
|
||||||
|
return new PartyPool(
|
||||||
owner_,
|
owner_,
|
||||||
name_,
|
name_,
|
||||||
symbol_,
|
symbol_,
|
||||||
tokens_,
|
tokens_,
|
||||||
|
bases_,
|
||||||
_kappa,
|
_kappa,
|
||||||
_swapFeePpm,
|
_swapFeePpm,
|
||||||
_flashFeePpm,
|
_flashFeePpm,
|
||||||
|
|||||||
@@ -141,7 +141,7 @@ contract GasTest is Test {
|
|||||||
}
|
}
|
||||||
// Compute kappa from slippage params and number of _tokens, then construct pool with kappa
|
// Compute kappa from slippage params and number of _tokens, then construct pool with kappa
|
||||||
int128 computedKappa = LMSRStabilized.computeKappaFromSlippage(ierc20Tokens.length, tradeFrac, targetSlippage);
|
int128 computedKappa = LMSRStabilized.computeKappaFromSlippage(ierc20Tokens.length, tradeFrac, targetSlippage);
|
||||||
PartyPool newPool = Deploy.newPartyPool(address(this), poolName, poolName, ierc20Tokens, computedKappa, feePpm, feePpm, false);
|
PartyPool newPool = Deploy.newPartyPool(address(this), poolName, poolName, ierc20Tokens, bases, computedKappa, feePpm, feePpm, false);
|
||||||
|
|
||||||
// Transfer initial deposit amounts into pool before initial mint
|
// Transfer initial deposit amounts into pool before initial mint
|
||||||
for (uint256 i = 0; i < numTokens; i++) {
|
for (uint256 i = 0; i < numTokens; i++) {
|
||||||
@@ -181,7 +181,7 @@ contract GasTest is Test {
|
|||||||
ierc20Tokens[i] = IERC20(tokens[i]);
|
ierc20Tokens[i] = IERC20(tokens[i]);
|
||||||
}
|
}
|
||||||
int128 computedKappa = LMSRStabilized.computeKappaFromSlippage(ierc20Tokens.length, tradeFrac, targetSlippage);
|
int128 computedKappa = LMSRStabilized.computeKappaFromSlippage(ierc20Tokens.length, tradeFrac, targetSlippage);
|
||||||
PartyPool newPool = Deploy.newPartyPool(address(this), poolName, poolName, ierc20Tokens, computedKappa, feePpm, feePpm, true);
|
PartyPool newPool = Deploy.newPartyPool(address(this), poolName, poolName, ierc20Tokens, bases, computedKappa, feePpm, feePpm, true);
|
||||||
|
|
||||||
// Transfer initial deposit amounts into pool before initial mint
|
// Transfer initial deposit amounts into pool before initial mint
|
||||||
for (uint256 i = 0; i < numTokens; i++) {
|
for (uint256 i = 0; i < numTokens; i++) {
|
||||||
|
|||||||
@@ -94,7 +94,7 @@ contract NativeTest is Test {
|
|||||||
uint256 feePpm = 1000;
|
uint256 feePpm = 1000;
|
||||||
|
|
||||||
int128 kappa = LMSRStabilized.computeKappaFromSlippage(tokens.length, tradeFrac, targetSlippage);
|
int128 kappa = LMSRStabilized.computeKappaFromSlippage(tokens.length, tradeFrac, targetSlippage);
|
||||||
pool = Deploy.newPartyPool(address(this), "LP", "LP", tokens, kappa, feePpm, feePpm, weth, false);
|
pool = Deploy.newPartyPool(address(this), "LP", "LP", tokens, bases, kappa, feePpm, feePpm, weth, false);
|
||||||
|
|
||||||
// Transfer initial deposit amounts into pool
|
// Transfer initial deposit amounts into pool
|
||||||
token0.transfer(address(pool), INIT_BAL);
|
token0.transfer(address(pool), INIT_BAL);
|
||||||
|
|||||||
@@ -100,6 +100,7 @@ contract PartyPlannerTest is Test {
|
|||||||
name,
|
name,
|
||||||
symbol,
|
symbol,
|
||||||
tokens,
|
tokens,
|
||||||
|
bases,
|
||||||
computedKappa,
|
computedKappa,
|
||||||
swapFeePpm,
|
swapFeePpm,
|
||||||
flashFeePpm,
|
flashFeePpm,
|
||||||
@@ -175,7 +176,7 @@ contract PartyPlannerTest is Test {
|
|||||||
|
|
||||||
int128 kappa1 = LMSRStabilized.computeKappaFromSlippage(tokens1.length, int128((1 << 64) - 1), int128(1 << 62));
|
int128 kappa1 = LMSRStabilized.computeKappaFromSlippage(tokens1.length, int128((1 << 64) - 1), int128(1 << 62));
|
||||||
(IPartyPool pool1,) = planner.newPool(
|
(IPartyPool pool1,) = planner.newPool(
|
||||||
"Pool 1", "LP1", tokens1,
|
"Pool 1", "LP1", tokens1, bases1,
|
||||||
kappa1, 3000, 5000, false,
|
kappa1, 3000, 5000, false,
|
||||||
payer, receiver, deposits1, 1000e18, 0
|
payer, receiver, deposits1, 1000e18, 0
|
||||||
);
|
);
|
||||||
@@ -195,7 +196,7 @@ contract PartyPlannerTest is Test {
|
|||||||
|
|
||||||
int128 kappa2 = LMSRStabilized.computeKappaFromSlippage(tokens2.length, int128((1 << 64) - 1), int128(1 << 62));
|
int128 kappa2 = LMSRStabilized.computeKappaFromSlippage(tokens2.length, int128((1 << 64) - 1), int128(1 << 62));
|
||||||
(IPartyPool pool2,) = planner.newPool(
|
(IPartyPool pool2,) = planner.newPool(
|
||||||
"Pool 2", "LP2", tokens2,
|
"Pool 2", "LP2", tokens2, bases2,
|
||||||
kappa2, 3000, 5000, false,
|
kappa2, 3000, 5000, false,
|
||||||
payer, receiver, deposits2, 1000e18, 0
|
payer, receiver, deposits2, 1000e18, 0
|
||||||
);
|
);
|
||||||
@@ -239,7 +240,7 @@ contract PartyPlannerTest is Test {
|
|||||||
vm.expectRevert("Planner: tokens and deposits length mismatch");
|
vm.expectRevert("Planner: tokens and deposits length mismatch");
|
||||||
// call old-signature convenience (it will still exist) for the mismatched-length revert check
|
// call old-signature convenience (it will still exist) for the mismatched-length revert check
|
||||||
planner.newPool(
|
planner.newPool(
|
||||||
"Test Pool", "TESTLP", tokens,
|
"Test Pool", "TESTLP", tokens, bases,
|
||||||
int128((1 << 64) - 1), int128(1 << 62), 3000, 5000, false,
|
int128((1 << 64) - 1), int128(1 << 62), 3000, 5000, false,
|
||||||
payer, receiver, deposits, 1000e18, 0
|
payer, receiver, deposits, 1000e18, 0
|
||||||
);
|
);
|
||||||
@@ -253,7 +254,7 @@ contract PartyPlannerTest is Test {
|
|||||||
|
|
||||||
vm.expectRevert("Planner: payer cannot be zero address");
|
vm.expectRevert("Planner: payer cannot be zero address");
|
||||||
planner.newPool(
|
planner.newPool(
|
||||||
"Test Pool", "TESTLP", tokens,
|
"Test Pool", "TESTLP", tokens, bases,
|
||||||
kappaErr, 3000, 5000, false,
|
kappaErr, 3000, 5000, false,
|
||||||
address(0), receiver, validDeposits, 1000e18, 0
|
address(0), receiver, validDeposits, 1000e18, 0
|
||||||
);
|
);
|
||||||
@@ -261,7 +262,7 @@ contract PartyPlannerTest is Test {
|
|||||||
// Test zero receiver address
|
// Test zero receiver address
|
||||||
vm.expectRevert("Planner: receiver cannot be zero address");
|
vm.expectRevert("Planner: receiver cannot be zero address");
|
||||||
planner.newPool(
|
planner.newPool(
|
||||||
"Test Pool", "TESTLP", tokens,
|
"Test Pool", "TESTLP", tokens, bases,
|
||||||
kappaErr, 3000, 5000, false,
|
kappaErr, 3000, 5000, false,
|
||||||
payer, address(0), validDeposits, 1000e18, 0
|
payer, address(0), validDeposits, 1000e18, 0
|
||||||
);
|
);
|
||||||
@@ -272,7 +273,7 @@ contract PartyPlannerTest is Test {
|
|||||||
vm.warp(1000);
|
vm.warp(1000);
|
||||||
vm.expectRevert("Planner: deadline exceeded");
|
vm.expectRevert("Planner: deadline exceeded");
|
||||||
planner.newPool(
|
planner.newPool(
|
||||||
"Test Pool", "TESTLP", tokens,
|
"Test Pool", "TESTLP", tokens, bases,
|
||||||
kappaDeadline, 3000, 5000, false,
|
kappaDeadline, 3000, 5000, false,
|
||||||
payer, receiver, validDeposits, 1000e18, block.timestamp - 1
|
payer, receiver, validDeposits, 1000e18, block.timestamp - 1
|
||||||
);
|
);
|
||||||
@@ -300,7 +301,7 @@ contract PartyPlannerTest is Test {
|
|||||||
(IPartyPool pool,) = planner.newPool(
|
(IPartyPool pool,) = planner.newPool(
|
||||||
string(abi.encodePacked("Pool ", vm.toString(i))),
|
string(abi.encodePacked("Pool ", vm.toString(i))),
|
||||||
string(abi.encodePacked("LP", vm.toString(i))),
|
string(abi.encodePacked("LP", vm.toString(i))),
|
||||||
tokens,
|
tokens, bases,
|
||||||
kappaLoop, 3000, 5000, false,
|
kappaLoop, 3000, 5000, false,
|
||||||
payer, receiver, deposits, 1000e18, 0
|
payer, receiver, deposits, 1000e18, 0
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -123,6 +123,7 @@ contract PartyPoolTest is Test {
|
|||||||
int128 targetSlippage;
|
int128 targetSlippage;
|
||||||
|
|
||||||
uint256 constant INIT_BAL = 1_000_000; // initial token units for each token (internal==amount when base==1)
|
uint256 constant INIT_BAL = 1_000_000; // initial token units for each token (internal==amount when base==1)
|
||||||
|
uint256 constant BASE = 1; // use base=1 so internal amounts correspond to raw integers (Q64.64 units)
|
||||||
|
|
||||||
function setUp() public {
|
function setUp() public {
|
||||||
planner = Deploy.newPartyPlanner();
|
planner = Deploy.newPartyPlanner();
|
||||||
@@ -163,11 +164,16 @@ contract PartyPoolTest is Test {
|
|||||||
tokens[1] = IERC20(address(token1));
|
tokens[1] = IERC20(address(token1));
|
||||||
tokens[2] = IERC20(address(token2));
|
tokens[2] = IERC20(address(token2));
|
||||||
|
|
||||||
|
uint256[] memory bases = new uint256[](3);
|
||||||
|
bases[0] = BASE;
|
||||||
|
bases[1] = BASE;
|
||||||
|
bases[2] = BASE;
|
||||||
|
|
||||||
// Deploy pool with a small fee to test fee-handling paths (use 1000 ppm = 0.1%)
|
// Deploy pool with a small fee to test fee-handling paths (use 1000 ppm = 0.1%)
|
||||||
uint256 feePpm = 1000;
|
uint256 feePpm = 1000;
|
||||||
|
|
||||||
int128 kappa3 = LMSRStabilized.computeKappaFromSlippage(tokens.length, tradeFrac, targetSlippage);
|
int128 kappa3 = LMSRStabilized.computeKappaFromSlippage(tokens.length, tradeFrac, targetSlippage);
|
||||||
pool = Deploy.newPartyPool(address(this), "LP", "LP", tokens, kappa3, feePpm, feePpm, false);
|
pool = Deploy.newPartyPool(address(this), "LP", "LP", tokens, bases, kappa3, feePpm, feePpm, false);
|
||||||
|
|
||||||
// Transfer initial deposit amounts into pool before initial mint (pool expects _tokens already in contract)
|
// Transfer initial deposit amounts into pool before initial mint (pool expects _tokens already in contract)
|
||||||
// We deposit equal amounts INIT_BAL for each token
|
// We deposit equal amounts INIT_BAL for each token
|
||||||
@@ -191,8 +197,13 @@ contract PartyPoolTest is Test {
|
|||||||
tokens10[8] = IERC20(address(token8));
|
tokens10[8] = IERC20(address(token8));
|
||||||
tokens10[9] = IERC20(address(token9));
|
tokens10[9] = IERC20(address(token9));
|
||||||
|
|
||||||
|
uint256[] memory bases10 = new uint256[](10);
|
||||||
|
for (uint i = 0; i < 10; i++) {
|
||||||
|
bases10[i] = BASE;
|
||||||
|
}
|
||||||
|
|
||||||
int128 kappa10 = LMSRStabilized.computeKappaFromSlippage(tokens10.length, tradeFrac, targetSlippage);
|
int128 kappa10 = LMSRStabilized.computeKappaFromSlippage(tokens10.length, tradeFrac, targetSlippage);
|
||||||
pool10 = Deploy.newPartyPool(address(this), "LP10", "LP10", tokens10, kappa10, feePpm, feePpm, false);
|
pool10 = Deploy.newPartyPool(address(this), "LP10", "LP10", tokens10, bases10, kappa10, feePpm, feePpm, false);
|
||||||
|
|
||||||
// Mint additional _tokens for pool10 initial deposit
|
// Mint additional _tokens for pool10 initial deposit
|
||||||
token0.mint(address(this), INIT_BAL);
|
token0.mint(address(this), INIT_BAL);
|
||||||
@@ -972,15 +983,20 @@ contract PartyPoolTest is Test {
|
|||||||
tokens[1] = IERC20(address(token1));
|
tokens[1] = IERC20(address(token1));
|
||||||
tokens[2] = IERC20(address(token2));
|
tokens[2] = IERC20(address(token2));
|
||||||
|
|
||||||
|
uint256[] memory bases = new uint256[](3);
|
||||||
|
bases[0] = BASE;
|
||||||
|
bases[1] = BASE;
|
||||||
|
bases[2] = BASE;
|
||||||
|
|
||||||
uint256 feePpm = 1000;
|
uint256 feePpm = 1000;
|
||||||
|
|
||||||
// Pool with default initialization (lpTokens = 0)
|
// Pool with default initialization (lpTokens = 0)
|
||||||
int128 kappaDefault = LMSRStabilized.computeKappaFromSlippage(tokens.length, tradeFrac, targetSlippage);
|
int128 kappaDefault = LMSRStabilized.computeKappaFromSlippage(tokens.length, tradeFrac, targetSlippage);
|
||||||
PartyPool poolDefault = Deploy.newPartyPool(address(this), "LP_DEFAULT", "LP_DEFAULT", tokens, kappaDefault, feePpm, feePpm, false);
|
PartyPool poolDefault = Deploy.newPartyPool(address(this), "LP_DEFAULT", "LP_DEFAULT", tokens, bases, kappaDefault, feePpm, feePpm, false);
|
||||||
|
|
||||||
// Pool with custom initialization (lpTokens = custom amount)
|
// Pool with custom initialization (lpTokens = custom amount)
|
||||||
int128 kappaCustom = LMSRStabilized.computeKappaFromSlippage(tokens.length, tradeFrac, targetSlippage);
|
int128 kappaCustom = LMSRStabilized.computeKappaFromSlippage(tokens.length, tradeFrac, targetSlippage);
|
||||||
PartyPool poolCustom = Deploy.newPartyPool(address(this), "LP_CUSTOM", "LP_CUSTOM", tokens, kappaCustom, feePpm, feePpm, false);
|
PartyPool poolCustom = Deploy.newPartyPool(address(this), "LP_CUSTOM", "LP_CUSTOM", tokens, bases, kappaCustom, feePpm, feePpm, false);
|
||||||
|
|
||||||
// Mint additional _tokens for both pools
|
// Mint additional _tokens for both pools
|
||||||
token0.mint(address(this), INIT_BAL * 2);
|
token0.mint(address(this), INIT_BAL * 2);
|
||||||
@@ -1044,12 +1060,17 @@ contract PartyPoolTest is Test {
|
|||||||
tokens[1] = IERC20(address(token1));
|
tokens[1] = IERC20(address(token1));
|
||||||
tokens[2] = IERC20(address(token2));
|
tokens[2] = IERC20(address(token2));
|
||||||
|
|
||||||
|
uint256[] memory bases = new uint256[](3);
|
||||||
|
bases[0] = BASE;
|
||||||
|
bases[1] = BASE;
|
||||||
|
bases[2] = BASE;
|
||||||
|
|
||||||
uint256 feePpm = 1000;
|
uint256 feePpm = 1000;
|
||||||
|
|
||||||
int128 kappaDefault2 = LMSRStabilized.computeKappaFromSlippage(tokens.length, tradeFrac, targetSlippage);
|
int128 kappaDefault2 = LMSRStabilized.computeKappaFromSlippage(tokens.length, tradeFrac, targetSlippage);
|
||||||
PartyPool poolDefault = Deploy.newPartyPool(address(this), "LP_DEFAULT", "LP_DEFAULT", tokens, kappaDefault2, feePpm, feePpm, false);
|
PartyPool poolDefault = Deploy.newPartyPool(address(this), "LP_DEFAULT", "LP_DEFAULT", tokens, bases, kappaDefault2, feePpm, feePpm, false);
|
||||||
int128 kappaCustom2 = LMSRStabilized.computeKappaFromSlippage(tokens.length, tradeFrac, targetSlippage);
|
int128 kappaCustom2 = LMSRStabilized.computeKappaFromSlippage(tokens.length, tradeFrac, targetSlippage);
|
||||||
PartyPool poolCustom = Deploy.newPartyPool(address(this), "LP_CUSTOM", "LP_CUSTOM", tokens, kappaCustom2, feePpm, feePpm, false);
|
PartyPool poolCustom = Deploy.newPartyPool(address(this), "LP_CUSTOM", "LP_CUSTOM", tokens, bases, kappaCustom2, feePpm, feePpm, false);
|
||||||
|
|
||||||
// Mint additional _tokens
|
// Mint additional _tokens
|
||||||
token0.mint(address(this), INIT_BAL * 4);
|
token0.mint(address(this), INIT_BAL * 4);
|
||||||
|
|||||||
Reference in New Issue
Block a user