Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
72 commits
Select commit Hold shift + click to select a range
fdc137d
relax dust balance
nialexsan Feb 13, 2026
20f9d81
Merge branch 'nialexsan/update-ref-20260211' into nialexsan/relax-rem…
nialexsan Feb 13, 2026
0a464a4
Merge branch 'main' into nialexsan/relax-remaining-balance
nialexsan Feb 13, 2026
ebe265a
restore relax
nialexsan Feb 13, 2026
8fd49d3
fix typo
nialexsan Feb 13, 2026
760b53d
update ref
nialexsan Feb 17, 2026
1833914
Merge remote-tracking branch 'origin/main' into nialexsan/relax-remai…
nialexsan Feb 19, 2026
8bcc4e2
Merge remote-tracking branch 'origin/main' into nialexsan/relax-remai…
nialexsan Feb 19, 2026
015a9d8
ref bridge exact
nialexsan Feb 19, 2026
972ac4c
update ref
nialexsan Feb 19, 2026
d9970e3
update ref
nialexsan Feb 20, 2026
3417621
Merge branch 'main' into nialexsan/relax-remaining-balance
nialexsan Feb 24, 2026
f158d12
close position method
nialexsan Feb 24, 2026
2a2e552
fix assertion
nialexsan Feb 24, 2026
8e0f6f7
close position
nialexsan Feb 25, 2026
824c388
Apply suggestion from @nialexsan
nialexsan Feb 25, 2026
47a9e67
Apply suggestion from @nialexsan
nialexsan Feb 25, 2026
94df1fc
fix lock
nialexsan Feb 25, 2026
76d6b6c
round up debt
nialexsan Feb 25, 2026
94ae8ce
repayment balance check
nialexsan Feb 25, 2026
77ab388
update deps
nialexsan Feb 25, 2026
ed16a72
revert unnecessary changes
nialexsan Feb 25, 2026
ad92e44
Apply suggestion from @nialexsan
nialexsan Feb 25, 2026
ebf1c8c
remove buffer
nialexsan Feb 25, 2026
253be6f
close position test
nialexsan Feb 25, 2026
ca37d21
add safe rounding
nialexsan Feb 26, 2026
b8366f5
Merge branch 'main' into nialexsan/relax-remaining-balance
nialexsan Feb 26, 2026
edf96dc
fix merge
nialexsan Feb 26, 2026
47d3ed0
Revert "Merge pull request #160 from onflow/jord/split-contracts"
nialexsan Feb 28, 2026
0b1831c
use vaults array
nialexsan Feb 28, 2026
cd7c16c
Apply suggestion from @nialexsan
nialexsan Feb 28, 2026
f5d99da
fix event
nialexsan Feb 28, 2026
cbd9f10
Merge remote-tracking branch 'origin/nialexsan/pre-refactor' into nia…
nialexsan Feb 28, 2026
182a5ff
run ci/cd
nialexsan Feb 28, 2026
aed49a1
fully repay debt
nialexsan Feb 28, 2026
355e1c6
tweaks
nialexsan Feb 28, 2026
d9f0b6c
tweaks
nialexsan Feb 28, 2026
6c722af
tweaks
nialexsan Feb 28, 2026
1b42f8a
tweaks
nialexsan Feb 28, 2026
f2b7859
fix position direction
nialexsan Mar 2, 2026
c008602
address PR comments
nialexsan Mar 3, 2026
c979d63
update FlowActions submodule
holyfuchs Mar 3, 2026
a11028e
remove redundent seen check
nialexsan Mar 3, 2026
c864297
split into helper functions
nialexsan Mar 3, 2026
0ed237b
remove unnecessary struct
nialexsan Mar 3, 2026
252e658
address comments
nialexsan Mar 3, 2026
7a769c8
handle queued deposits
nialexsan Mar 3, 2026
0117b9c
Apply suggestions from code review
nialexsan Mar 3, 2026
5e19226
address PR comments, add queued deposits test
nialexsan Mar 3, 2026
cb98c6b
fix looping
nialexsan Mar 3, 2026
ae8e3b9
one source per debt
nialexsan Mar 4, 2026
530f342
address comments, remove unnecessary tests
nialexsan Mar 4, 2026
901a226
tweak tests
nialexsan Mar 4, 2026
f5de92d
address comments
nialexsan Mar 4, 2026
114fa5c
tweak ci/cd
nialexsan Mar 4, 2026
1b3c6fa
rename test
nialexsan Mar 4, 2026
f43e2e0
remove unused test
nialexsan Mar 4, 2026
2531367
Apply suggestions from code review
nialexsan Mar 4, 2026
918c314
Apply suggestions from code review
nialexsan Mar 4, 2026
434e177
Fix stale async queue entries on close and add regression test
liobrasil Mar 4, 2026
cb17a21
Optimize closePosition queue removal to linear scan
liobrasil Mar 4, 2026
a1fbfb1
Apply suggestions from code review
nialexsan Mar 4, 2026
79bdb58
Merge branch 'nialexsan/close-position' into lionel/fix-close-positio…
liobrasil Mar 4, 2026
fa07368
Merge branch 'v0' into nialexsan/close-position
liobrasil Mar 4, 2026
4a93edd
Merge branch 'nialexsan/close-position' into lionel/fix-close-positio…
liobrasil Mar 4, 2026
047a6a7
Merge pull request #198 from onflow/lionel/fix-close-position-stale-a…
nialexsan Mar 4, 2026
6dafb4e
Remove closed Position resource from manager after close
liobrasil Mar 4, 2026
ce96de4
address comments
nialexsan Mar 5, 2026
3f464d7
Update cadence/transactions/flow-alp/position/repay_and_close_positio…
nialexsan Mar 5, 2026
91be4d5
Reapply "Merge pull request #160 from onflow/jord/split-contracts"
nialexsan Mar 5, 2026
5b3c936
Merge branch 'main' into nialexsan/close-position-main
nialexsan Mar 5, 2026
b292525
fix merge
nialexsan Mar 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/cadence_tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@ on:
push:
branches:
- main
- v0
pull_request:
branches:
- main
- v0

jobs:
tests:
Expand Down
2 changes: 1 addition & 1 deletion FlowActions
Submodule FlowActions updated 68 files
+4 −0 .github/workflows/cadence_tests.yml
+6 −1 Makefile
+2 −4 cadence/contracts/connectors/SwapConnectors.cdc
+5 −7 cadence/contracts/connectors/band-oracle/BandOracleConnectors.cdc
+1 −1 cadence/contracts/connectors/evm/ERC4626PriceOracles.cdc
+7 −11 cadence/contracts/connectors/evm/ERC4626SinkConnectors.cdc
+12 −1 cadence/contracts/connectors/evm/ERC4626SwapConnectors.cdc
+3 −3 cadence/contracts/connectors/evm/EVMAmountUtils.cdc
+2 −4 cadence/contracts/connectors/evm/EVMTokenConnectors.cdc
+18 −16 cadence/contracts/connectors/evm/UniswapV2SwapConnectors.cdc
+20 −20 cadence/contracts/connectors/evm/UniswapV3SwapConnectors.cdc
+3 −9 cadence/contracts/connectors/evm/morpho/MorphoERC4626SinkConnectors.cdc
+1 −2 cadence/contracts/connectors/increment-fi/IncrementFiFlashloanConnectors.cdc
+2 −2 cadence/contracts/connectors/increment-fi/IncrementFiStakingConnectors.cdc
+38 −18 cadence/contracts/interfaces/DeFiActions.cdc
+6 −6 cadence/contracts/utils/EVMAbiHelpers.cdc
+62 −6 cadence/tests/AutoBalancer_test.cdc
+53 −1 cadence/tests/ERC4626SinkConnectors_test.cdc
+4 −4 cadence/tests/ERC4626SwapConnectors_test.cdc
+5 −5 cadence/tests/EVMAmountUtils_test.cdc
+8 −9 cadence/tests/IncrementFiIntegration_test.cdc
+5 −5 cadence/tests/IncrementFiStakingConnectors_test.cdc
+2 −2 cadence/tests/SwapConnectorsSequentialSwapper_test.cdc
+3 −3 cadence/tests/UniswapV3SwapConnectors_test.cdc
+20 −0 cadence/tests/contracts/ExecutionCallbackRecorder.cdc
+1 −3 cadence/tests/contracts/TokenA.cdc
+1 −3 cadence/tests/contracts/TokenB.cdc
+1 −3 cadence/tests/contracts/TokenC.cdc
+25 −38 cadence/tests/fork/UniswapV3SwapConnectors_coa_dust_test.cdc
+1 −1 cadence/tests/scripts/call.cdc
+2 −2 cadence/tests/scripts/uniswap-v3-swap-connectors/uniswap_v3_quote_dust_test.cdc
+62 −22 cadence/tests/test_helpers.cdc
+2 −2 cadence/tests/transactions/attempt_copy_auto_balancer_config.cdc
+18 −0 cadence/tests/transactions/auto-balance-adapter/set_execution_callback.cdc
+11 −15 cadence/tests/transactions/bridge/bridge_tokens_from_evm.cdc
+1 −1 cadence/tests/transactions/bridge/setup/set_bridged_ft_display_view.cdc
+2 −2 cadence/tests/transactions/bridge/setup/set_bridged_nft_collection_display_view.cdc
+1 −1 cadence/tests/transactions/bridge/setup/set_bridged_nft_display_view.cdc
+1 −1 cadence/tests/transactions/bridge/setup/set_delegated_deployer.cdc
+1 −1 cadence/tests/transactions/deploy_swap_pair.cdc
+72 −0 cadence/tests/transactions/erc4626-sink-connectors/deposit_to_paused_vault.cdc
+3 −5 cadence/tests/transactions/evm/deploy.cdc
+6 −4 cadence/tests/transactions/increment-fi/create_staking_pool.cdc
+1 −1 cadence/tests/transactions/increment-fi/withdraw_pool_rewards_source.cdc
+2 −2 cadence/tests/transactions/test-tokens/setup_vault.cdc
+2 −2 cadence/tests/transactions/uniswap-v3-swap-connectors/mint_moet_to_test_vault.cdc
+1 −2 cadence/tests/transactions/uniswap-v3-swap-connectors/provision_pyusd_via_v3.cdc
+11 −11 cadence/tests/transactions/uniswap-v3-swap-connectors/uniswap_v3_swap_dust_test.cdc
+11 −11 cadence/tests/transactions/uniswap-v3-swap-connectors/uniswap_v3_swap_overshoot_test.cdc
+2 −5 cadence/transactions/auto-balance-adapter/cancel_all_scheduled_transactions_and_remove_recurring_config.cdc
+2 −5 cadence/transactions/auto-balance-adapter/cancel_scheduled_transaction.cdc
+3 −3 cadence/transactions/auto-balance-adapter/create_auto_balancer.cdc
+2 −2 cadence/transactions/auto-balance-adapter/remove_recurring_config.cdc
+4 −5 cadence/transactions/auto-balance-adapter/schedule_next_rebalance.cdc
+7 −7 cadence/transactions/auto-balance-adapter/set_rebalance_sink_as_token_sink.cdc
+5 −5 cadence/transactions/auto-balance-adapter/set_rebalance_source_as_token_source.cdc
+2 −3 cadence/transactions/auto-balance-adapter/set_recurring_config.cdc
+2 −2 cadence/transactions/erc4626-sink-connectors/deposit_to_erc4626_vault.cdc
+3 −3 cadence/transactions/erc4626-swap-connectors/swap_assets_for_shares_out.cdc
+3 −3 cadence/transactions/erc4626-swap-connectors/swap_assets_in_for_shares.cdc
+1 −2 cadence/transactions/evm-token-connectors/deposit_via_sink.cdc
+1 −2 cadence/transactions/evm-token-connectors/withdraw_via_source.cdc
+2 −8 cadence/transactions/evm/create_coa.cdc
+12 −15 cadence/transactions/fungible-tokens/setup_generic_vault.cdc
+3 −3 cadence/transactions/increment-fi/add_liquidity.cdc
+1 −1 cadence/transactions/increment-fi/create_swap_pair.cdc
+3 −3 cadence/transactions/uniswap-v2-swap-connectors/uniswap_v2_swap.cdc
+59 −51 flow.json
39 changes: 39 additions & 0 deletions cadence/contracts/FlowALPEvents.cdc
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,18 @@ access(all) contract FlowALPEvents {
withdrawnUUID: UInt64
)

/// Emitted when a position is closed via the closePosition() method.
/// This indicates a full position closure with debt repayment and collateral extraction.
///
/// Uses dictionaries instead of parallel arrays for deterministic, unambiguous data.
/// Keys are token type identifiers (e.g., "A.xxx.FlowToken.Vault").
access(all) event PositionClosed(
pid: UInt64,
poolUUID: UInt64,
repaymentsByType: {String: UFix64}, // Map of debt token type → amount repaid
withdrawalsByType: {String: UFix64} // Map of token type → amount withdrawn (collateral + overpayment dust)
)

/// Emitted when a position is automatically rebalanced toward its target health factor.
/// Rebalancing occurs when a position drifts above or below its configured health thresholds.
///
Expand Down Expand Up @@ -317,4 +329,31 @@ access(all) contract FlowALPEvents {
access(account) fun emitDepositCapacityConsumed(tokenType: Type, pid: UInt64, amount: UFix64, remainingCapacity: UFix64) {
emit DepositCapacityConsumed(tokenType: tokenType, pid: pid, amount: amount, remainingCapacity: remainingCapacity)
}

/// Emits the PositionClosed event
access(account) fun emitPositionClosed(
pid: UInt64,
poolUUID: UInt64,
debtsByType: {Type: UFix64},
withdrawalsByType: {Type: UFix64}
) {
// Emit event for position closure
// Note: repayments = debts owed (sources may have provided more, but that became credit)
let repaymentsEvent: {String: UFix64} = {}
for debtType in debtsByType.keys {
repaymentsEvent[debtType.identifier] = debtsByType[debtType]!
}

let withdrawalsEvent: {String: UFix64} = {}
for withdrawalType in withdrawalsByType.keys {
withdrawalsEvent[withdrawalType.identifier] = withdrawalsByType[withdrawalType]!
}

emit PositionClosed(
pid: pid,
poolUUID: poolUUID,
repaymentsByType: repaymentsEvent,
withdrawalsByType: withdrawalsEvent
)
}
}
26 changes: 21 additions & 5 deletions cadence/contracts/FlowALPModels.cdc
Original file line number Diff line number Diff line change
Expand Up @@ -140,16 +140,24 @@ access(all) contract FlowALPModels {
interestIndex: tokenState.getDebitInterestIndex()
)

// Harmonize comparison with withdrawal: treat an exact match as "does not flip to credit"
// Use >= comparison to match withdrawal pattern (both use >= for consistency).
// When deposit exactly equals debt, we enter this branch and check if balance reaches zero.
if trueBalance >= amount {
// The deposit isn't big enough to clear the debt,
// so we just decrement the debt.
let updatedBalance = trueBalance - amount

self.scaledBalance = FlowALPMath.trueBalanceToScaledBalance(
updatedBalance,
interestIndex: tokenState.getDebitInterestIndex()
)
// Special case: If debt is fully repaid (exact match), flip to Credit with zero balance.
// This ensures a position with zero debt is always represented as Credit, not Debit.
if updatedBalance == 0.0 {
self.direction = BalanceDirection.Credit
self.scaledBalance = 0.0
} else {
self.scaledBalance = FlowALPMath.trueBalanceToScaledBalance(
updatedBalance,
interestIndex: tokenState.getDebitInterestIndex()
)
}

// Decrease the total debit balance for the token
tokenState.decreaseDebitBalance(by: amount)
Expand Down Expand Up @@ -1599,6 +1607,9 @@ access(all) contract FlowALPModels {
/// Removes and returns the first position ID from the update queue
access(EImplementation) fun removeFirstPositionNeedingUpdate(): UInt64

/// Removes and returns a speicific position ID by index from the update queue.
access(EImplementation) fun removeAtPositionNeedingUpdate(_ i: Int): UInt64

/// Returns whether the given position ID is in the update queue
access(all) view fun positionsNeedingUpdatesContains(_ pid: UInt64): Bool

Expand Down Expand Up @@ -1781,6 +1792,11 @@ access(all) contract FlowALPModels {
return self.positionsNeedingUpdates.removeFirst()
}

/// Removes and returns a speicific position ID by index from the update queue.
access(EImplementation) fun removeAtPositionNeedingUpdate(_ i: Int): UInt64 {
return self.positionsNeedingUpdates.remove(at: i)
}

/// Returns whether the given position ID is in the update queue.
access(all) view fun positionsNeedingUpdatesContains(_ pid: UInt64): Bool {
return self.positionsNeedingUpdates.contains(pid)
Expand Down
Loading
Loading