PoolSwapTest
0xa47194471855c908c016d3d611dc8e90078f9ea6
Verification
Verified
v0.8.26+commit.8a97fa7a
Type
Contract
5,035 bytes
ABI entries
5
1 read · 2 write
License
none
Contract information
- Address
- 0xa47194471855c908c016d3d611dc8e90078f9ea6
- Chain
- Robinhood Chain (4663)
- Compiler
- v0.8.26+commit.8a97fa7a
- Optimization
- Enabled
- Creator
- 0xfc4f0b5861…d0c62137FD
- Creation tx
- 0xe6884ba3a0…b46d2a10e0
Token
Not a token
This contract does not expose ERC-20 metadata.
Read contract (1)
manager() → address
ABI
[
{
"inputs": [
{
"internalType": "contract IPoolManager",
"name": "_manager",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [],
"name": "NoSwapOccurred",
"type": "error"
},
{
"inputs": [],
"name": "manager",
"outputs": [
{
"internalType": "contract IPoolManager",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "Currency",
"name": "currency0",
"type": "address"
},
{
"internalType": "Currency",
"name": "currency1",
"type": "address"
},
{
"internalType": "uint24",
"name": "fee",
"type": "uint24"
},
{
"internalType": "int24",
"name": "tickSpacing",
"type": "int24"
},
{
"internalType": "contract IHooks",
"name": "hooks",
"type": "address"
}
],
"internalType": "struct PoolKey",
"name": "key",
"type": "tuple"
},
{
"components": [
{
"internalType": "bool",
"name": "zeroForOne",
"type": "bool"
},
{
"internalType": "int256",
"name": "amountSpecified",
"type": "int256"
},
{
"internalType": "uint160",
"name": "sqrtPriceLimitX96",
"type": "uint160"
}
],
"internalType": "struct SwapParams",
"name": "params",
"type": "tuple"
},
{
"components": [
{
"internalType": "bool",
"name": "takeClaims",
"type": "bool"
},
{
"internalType": "bool",
"name": "settleUsingBurn",
"type": "bool"
}
],
"internalType": "struct PoolSwapTest.TestSettings",
"name": "testSettings",
"type": "tuple"
},
{
"internalType": "bytes",
"name": "hookData",
"type": "bytes"
}
],
"name": "swap",
"outputs": [
{
"internalType": "BalanceDelta",
"name": "delta",
"type": "int256"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes",
"name": "rawData",
"type": "bytes"
}
],
"name": "unlockCallback",
"outputs": [
{
"internalType": "bytes",
"name": "",
"type": "bytes"
}
],
"stateMutability": "nonpayable",
"type": "function"
}
]Source code
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.24;
import {CurrencyLibrary, Currency} from "../types/Currency.sol";
import {IPoolManager} from "../interfaces/IPoolManager.sol";
import {BalanceDelta} from "../types/BalanceDelta.sol";
import {PoolKey} from "../types/PoolKey.sol";
import {SwapParams} from "../types/PoolOperation.sol";
import {IHooks} from "../interfaces/IHooks.sol";
import {Hooks} from "../libraries/Hooks.sol";
import {PoolTestBase} from "./PoolTestBase.sol";
import {CurrencySettler} from "../../test/utils/CurrencySettler.sol";
contract PoolSwapTest is PoolTestBase {
using CurrencySettler for Currency;
using Hooks for IHooks;
constructor(IPoolManager _manager) PoolTestBase(_manager) {}
error NoSwapOccurred();
struct CallbackData {
address sender;
TestSettings testSettings;
PoolKey key;
SwapParams params;
bytes hookData;
}
struct TestSettings {
bool takeClaims;
bool settleUsingBurn;
}
function swap(PoolKey memory key, SwapParams memory params, TestSettings memory testSettings, bytes memory hookData)
external
payable
returns (BalanceDelta delta)
{
delta = abi.decode(
manager.unlock(abi.encode(CallbackData(msg.sender, testSettings, key, params, hookData))), (BalanceDelta)
);
uint256 ethBalance = address(this).balance;
if (ethBalance > 0) CurrencyLibrary.ADDRESS_ZERO.transfer(msg.sender, ethBalance);
}
function unlockCallback(bytes calldata rawData) external returns (bytes memory) {
require(msg.sender == address(manager));
CallbackData memory data = abi.decode(rawData, (CallbackData));
(,, int256 deltaBefore0) = _fetchBalances(data.key.currency0, data.sender, address(this));
(,, int256 deltaBefore1) = _fetchBalances(data.key.currency1, data.sender, address(this));
require(deltaBefore0 == 0, "deltaBefore0 is not equal to 0");
require(deltaBefore1 == 0, "deltaBefore1 is not equal to 0");
BalanceDelta delta = manager.swap(data.key, data.params, data.hookData);
(,, int256 deltaAfter0) = _fetchBalances(data.key.currency0, data.sender, address(this));
(,, int256 deltaAfter1) = _fetchBalances(data.key.currency1, data.sender, address(this));
if (data.params.zeroForOne) {
if (data.params.amountSpecified < 0) {
// exact input, 0 for 1
require(
deltaAfter0 >= data.params.amountSpecified,
"deltaAfter0 is not greater than or equal to data.params.amountSpecified"
);
require(delta.amount0() == deltaAfter0, "delta.amount0() is not equal to deltaAfter0");
require(deltaAfter1 >= 0, "deltaAfter1 is not greater than or equal to 0");
} else {
// exact output, 0 for 1
require(deltaAfter0 <= 0, "deltaAfter0 is not less than or equal to zero");
require(delta.amount1() == deltaAfter1, "delta.amount1() is not equal to deltaAfter1");
require(
deltaAfter1 <= data.params.amountSpecified,
"deltaAfter1 is not less than or equal to data.params.amountSpecified"
);
}
} else {
if (data.params.amountSpecified < 0) {
// exact input, 1 for 0
require(
deltaAfter1 >= data.params.amountSpecified,
"deltaAfter1 is not greater than or equal to data.params.amountSpecified"
);
require(delta.amount1() == deltaAfter1, "delta.amount1() is not equal to deltaAfter1");
require(deltaAfter0 >= 0, "deltaAfter0 is not greater than or equal to 0");
} else {
// exact output, 1 for 0
require(deltaAfter1 <= 0, "deltaAfter1 is not less than or equal to 0");
require(delta.amount0() == deltaAfter0, "delta.amount0() is not equal to deltaAfter0");
require(
deltaAfter0 <= data.params.amountSpecified,
"deltaAfter0 is not less than or equal to data.params.amountSpecified"
);
}
}
if (deltaAfter0 < 0) {
data.key.currency0.settle(manager, data.sender, uint256(-deltaAfter0), data.testSettings.settleUsingBurn);
}
if (deltaAfter1 < 0) {
data.key.currency1.settle(manager, data.sender, uint256(-deltaAfter1), data.testSettings.settleUsingBurn);
}
if (deltaAfter0 > 0) {
data.key.currency0.take(manager, data.sender, uint256(deltaAfter0), data.testSettings.takeClaims);
}
if (deltaAfter1 > 0) {
data.key.currency1.take(manager, data.sender, uint256(deltaAfter1), data.testSettings.takeClaims);
}
return abi.encode(delta);
}
}
Chain explorer1342msChain node86ms