Skip to content

Commit fa01adf

Browse files
committed
add supervisor for rebalancing
1 parent b176983 commit fa01adf

5 files changed

Lines changed: 163 additions & 9 deletions

File tree

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import "FlowTransactionScheduler"
2+
import "FlowCreditMarketRebalancerPaidV1"
3+
import "FlowCron"
4+
5+
access(all) contract FlowCreditMarketSupervisorV1 {
6+
7+
access(all) resource Supervisor: FlowTransactionScheduler.TransactionHandler {
8+
9+
access(all) let rebalancers: {UInt64: Bool}
10+
11+
init() {
12+
self.rebalancers = {}
13+
}
14+
15+
access(all) fun addPaidRebalancer(uuid: UInt64) {
16+
self.rebalancers[uuid] = true
17+
}
18+
19+
access(all) fun removePaidRebalancer(uuid: UInt64): Bool? {
20+
return self.rebalancers.remove(key: uuid)
21+
}
22+
23+
access(FlowTransactionScheduler.Execute) fun executeTransaction(id: UInt64, data: AnyStruct?) {
24+
for rebalancerUUID in self.rebalancers.keys {
25+
FlowCreditMarketRebalancerPaidV1.fixReschedule(uuid: rebalancerUUID)
26+
}
27+
}
28+
29+
access(all) view fun getViews(): [Type] {
30+
return [Type<StoragePath>(), Type<PublicPath>()]
31+
}
32+
33+
access(all) fun resolveView(_ view: Type): AnyStruct? {
34+
switch view {
35+
case Type<StoragePath>():
36+
return /storage/MyRecurringTaskHandler
37+
case Type<PublicPath>():
38+
return /public/MyRecurringTaskHandler
39+
default:
40+
return nil
41+
}
42+
}
43+
}
44+
45+
access(all) fun createSupervisor(): @Supervisor {
46+
return <- create Supervisor()
47+
}
48+
}

cadence/tests/paid_auto_balance_test.cdc

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,12 @@ access(all) fun setup() {
4747
createWrappedPosition(signer: userAccount, amount: 100.0, vaultStoragePath: flowVaultStoragePath, pushToDrawDownSink: false)
4848
depositToWrappedPosition(signer: userAccount, amount: 100.0, vaultStoragePath: flowVaultStoragePath, pushToDrawDownSink: false)
4949
addPaidRebalancerToWrappedPosition(signer: userAccount)
50+
createSupervisor(
51+
signer: protocolAccount,
52+
cronExpression: "0 0 * * *",
53+
wrappedHandlerStoragePath: /storage/myRecurringTaskHandler,
54+
cronHandlerStoragePath: /storage/myRecurringTaskHandler
55+
)
5056

5157
snapshot = getCurrentBlockHeight()
5258
}
@@ -238,7 +244,6 @@ access(all) fun test_public_fix_reschedule() {
238244
var evts = Test.eventsOfType(Type<FlowCreditMarketRebalancerV1.Rebalanced>())
239245
Test.assertEqual(1, evts.length)
240246
let e = evts[0] as! FlowCreditMarketRebalancerV1.Rebalanced
241-
let publicPath = PublicPath(identifier: "paidRebalancerV1\(e.uuid)")!
242247

243248
let randomAccount = Test.createAccount()
244249
fixPaidReschedule(signer: randomAccount, uuid: e.uuid)

cadence/tests/test_helpers_rebalance.cdc

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ fun changePaidInterval(
6464
Test.expect(setRes, expectFailure ? Test.beFailed() : Test.beSucceeded())
6565
}
6666

67-
6867
access(all)
6968
fun deletePaidRebalancer(
7069
signer: Test.TestAccount,
@@ -75,4 +74,19 @@ fun deletePaidRebalancer(
7574
signer
7675
)
7776
Test.expect(setRes, Test.beSucceeded())
77+
}
78+
79+
access(all)
80+
fun createSupervisor(
81+
signer: Test.TestAccount,
82+
cronExpression: String,
83+
wrappedHandlerStoragePath: StoragePath,
84+
cronHandlerStoragePath: StoragePath
85+
) {
86+
let setRes = _executeTransaction(
87+
"./transactions/rebalancer/create_supervisor.cdc",
88+
[cronExpression, wrappedHandlerStoragePath, cronHandlerStoragePath],
89+
signer
90+
)
91+
Test.expect(setRes, Test.beSucceeded())
7892
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import "FlowTransactionScheduler"
2+
import "FlowTransactionSchedulerUtils"
3+
import "FungibleToken"
4+
import "FlowToken"
5+
import "FlowCron"
6+
7+
transaction(
8+
cronExpression: String,
9+
wrappedHandlerStoragePath: StoragePath,
10+
cronHandlerStoragePath: StoragePath
11+
) {
12+
let signer: auth(BorrowValue, IssueStorageCapabilityController, SaveValue) &Account
13+
let wrappedHandlerCap: Capability<auth(FlowTransactionScheduler.Execute) &{FlowTransactionScheduler.TransactionHandler}>
14+
let feeProviderCap: Capability<auth(FungibleToken.Withdraw) &FlowToken.Vault>
15+
let schedulerManagerCap: Capability<auth(FlowTransactionSchedulerUtils.Owner) &{FlowTransactionSchedulerUtils.Manager}>
16+
17+
prepare(signer: auth(BorrowValue, IssueStorageCapabilityController, SaveValue) &Account) {
18+
self.wrappedHandlerCap = signer.capabilities.storage.issue<
19+
auth(FlowTransactionScheduler.Execute) &{FlowTransactionScheduler.TransactionHandler}
20+
>(wrappedHandlerStoragePath)
21+
self.feeProviderCap = signer.capabilities.storage.issue<auth(FungibleToken.Withdraw) &FlowToken.Vault>(/storage/flowTokenVault)
22+
self.schedulerManagerCap = signer.capabilities.storage.issue<auth(FlowTransactionSchedulerUtils.Owner) &{FlowTransactionSchedulerUtils.Manager}>(/storage/flowTransactionSchedulerManager)
23+
self.signer = signer
24+
}
25+
26+
execute {
27+
// let cronHandler <- FlowCron.createCronHandler(
28+
// cronExpression: cronExpression,
29+
// wrappedHandlerCap: self.wrappedHandlerCap,
30+
// feeProviderCap: self.feeProviderCap,
31+
// schedulerManagerCap: self.schedulerManagerCap
32+
// )
33+
// self.signer.storage.save(<-cronHandler, to: cronHandlerStoragePath)
34+
}
35+
}

flow.json

Lines changed: 59 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@
2828
"testing": "0000000000000007"
2929
}
3030
},
31-
"FlowCreditMarketRebalancerV1": {
32-
"source": "./cadence/contracts/FlowCreditMarketRebalancerV1.cdc",
31+
"FlowCreditMarketMath": {
32+
"source": "./cadence/lib/FlowCreditMarketMath.cdc",
3333
"aliases": {
3434
"testing": "0000000000000007"
3535
}
@@ -40,14 +40,14 @@
4040
"testing": "0000000000000007"
4141
}
4242
},
43-
"FlowCreditMarketMath": {
44-
"source": "./cadence/lib/FlowCreditMarketMath.cdc",
43+
"FlowCreditMarketRebalancerV1": {
44+
"source": "./cadence/contracts/FlowCreditMarketRebalancerV1.cdc",
4545
"aliases": {
4646
"testing": "0000000000000007"
4747
}
4848
},
49-
"SimpleSinkSource": {
50-
"source": "./cadence/contracts/mocks/SimpleSinkSource.cdc",
49+
"FlowCreditMarketSupervisorV1": {
50+
"source": "./cadence/contracts/FlowCreditMarketSupervisorV1.cdc",
5151
"aliases": {
5252
"testing": "0000000000000007"
5353
}
@@ -87,21 +87,57 @@
8787
"aliases": {
8888
"testing": "0000000000000007"
8989
}
90+
},
91+
"SimpleSinkSource": {
92+
"source": "./cadence/contracts/mocks/SimpleSinkSource.cdc",
93+
"aliases": {
94+
"testing": "0000000000000007"
95+
}
9096
}
9197
},
9298
"dependencies": {
9399
"Burner": {
94100
"source": "mainnet://f233dcee88fe0abe.Burner",
95101
"hash": "71af18e227984cd434a3ad00bb2f3618b76482842bae920ee55662c37c8bf331",
102+
"block_height": 141019535,
96103
"aliases": {
97104
"emulator": "f8d6e0586b0a20c7",
98105
"mainnet": "f233dcee88fe0abe",
99106
"testnet": "9a0766d93b6608b7"
100107
}
101108
},
109+
"EVM": {
110+
"source": "mainnet://e467b9dd11fa00df.EVM",
111+
"hash": "960b0c7df7ee536956af196fba8c8d5dd4f7a89a4ecc61467e31287c4617b0dd",
112+
"block_height": 141019535,
113+
"aliases": {
114+
"emulator": "f8d6e0586b0a20c7",
115+
"mainnet": "e467b9dd11fa00df",
116+
"testnet": "8c5303eaa26202d6"
117+
}
118+
},
119+
"FlowCron": {
120+
"source": "mainnet://6dec6e64a13b881e.FlowCron",
121+
"hash": "ab570aabfb4d3ee01537ad85ad789ed13ac193ba447bc037365d51d748272cd5",
122+
"block_height": 141024643,
123+
"aliases": {
124+
"mainnet": "6dec6e64a13b881e",
125+
"testnet": "5cbfdec870ee216d"
126+
}
127+
},
128+
"FlowCronUtils": {
129+
"source": "mainnet://6dec6e64a13b881e.FlowCronUtils",
130+
"hash": "498c32c1345b9b1db951a18e4ea94325b8c9c05ea691f2d9b6af75b886ab51a2",
131+
"block_height": 141024643,
132+
"aliases": {
133+
"mainnet": "6dec6e64a13b881e",
134+
"testnet": "5cbfdec870ee216d"
135+
}
136+
},
102137
"FlowFees": {
103138
"source": "mainnet://f919ee77447b7497.FlowFees",
104139
"hash": "341cc0f3cc847d6b787c390133f6a5e6c867c111784f09c5c0083c47f2f1df64",
140+
"block_height": 141019535,
105141
"aliases": {
106142
"emulator": "e5a8b7f23e8b548f",
107143
"mainnet": "f919ee77447b7497",
@@ -111,6 +147,7 @@
111147
"FlowStorageFees": {
112148
"source": "mainnet://e467b9dd11fa00df.FlowStorageFees",
113149
"hash": "a92c26fb2ea59725441fa703aa4cd811e0fc56ac73d649a8e12c1e72b67a8473",
150+
"block_height": 141019535,
114151
"aliases": {
115152
"emulator": "f8d6e0586b0a20c7",
116153
"mainnet": "e467b9dd11fa00df",
@@ -120,6 +157,7 @@
120157
"FlowToken": {
121158
"source": "mainnet://1654653399040a61.FlowToken",
122159
"hash": "f82389e2412624ffa439836b00b42e6605b0c00802a4e485bc95b8930a7eac38",
160+
"block_height": 141019535,
123161
"aliases": {
124162
"emulator": "0ae53cb6e3f42a79",
125163
"mainnet": "1654653399040a61",
@@ -128,16 +166,26 @@
128166
},
129167
"FlowTransactionScheduler": {
130168
"source": "mainnet://e467b9dd11fa00df.FlowTransactionScheduler",
131-
"hash": "c701f26f6a8e993b2573ec8700142f61c9ca936b199af8cc75dee7d9b19c9e95",
169+
"hash": "23157cf7d70534e45b0ab729133232d0ffb3cdae52661df1744747cb1f8c0495",
170+
"block_height": 141019535,
132171
"aliases": {
133172
"emulator": "f8d6e0586b0a20c7",
134173
"mainnet": "e467b9dd11fa00df",
135174
"testnet": "8c5303eaa26202d6"
136175
}
137176
},
177+
"FlowTransactionSchedulerUtils": {
178+
"source": "mainnet://e467b9dd11fa00df.FlowTransactionSchedulerUtils",
179+
"hash": "71a1febab6b9ba76abec36dab1e61b1c377e44fbe627e5fac649deb71b727877",
180+
"block_height": 141019535,
181+
"aliases": {
182+
"mainnet": "e467b9dd11fa00df"
183+
}
184+
},
138185
"FungibleToken": {
139186
"source": "mainnet://f233dcee88fe0abe.FungibleToken",
140187
"hash": "4b74edfe7d7ddfa70b703c14aa731a0b2e7ce016ce54d998bfd861ada4d240f6",
188+
"block_height": 141019535,
141189
"aliases": {
142190
"emulator": "ee82856bf20e2aa6",
143191
"mainnet": "f233dcee88fe0abe",
@@ -147,6 +195,7 @@
147195
"FungibleTokenMetadataViews": {
148196
"source": "mainnet://f233dcee88fe0abe.FungibleTokenMetadataViews",
149197
"hash": "70477f80fd7678466c224507e9689f68f72a9e697128d5ea54d19961ec856b3c",
198+
"block_height": 141019535,
150199
"aliases": {
151200
"emulator": "ee82856bf20e2aa6",
152201
"mainnet": "f233dcee88fe0abe",
@@ -156,6 +205,7 @@
156205
"MetadataViews": {
157206
"source": "mainnet://1d7e57aa55817448.MetadataViews",
158207
"hash": "b290b7906d901882b4b62e596225fb2f10defb5eaaab4a09368f3aee0e9c18b1",
208+
"block_height": 141019535,
159209
"aliases": {
160210
"emulator": "f8d6e0586b0a20c7",
161211
"mainnet": "1d7e57aa55817448",
@@ -165,6 +215,7 @@
165215
"NonFungibleToken": {
166216
"source": "mainnet://1d7e57aa55817448.NonFungibleToken",
167217
"hash": "a258de1abddcdb50afc929e74aca87161d0083588f6abf2b369672e64cf4a403",
218+
"block_height": 141019535,
168219
"aliases": {
169220
"emulator": "f8d6e0586b0a20c7",
170221
"mainnet": "1d7e57aa55817448",
@@ -174,6 +225,7 @@
174225
"ViewResolver": {
175226
"source": "mainnet://1d7e57aa55817448.ViewResolver",
176227
"hash": "374a1994046bac9f6228b4843cb32393ef40554df9bd9907a702d098a2987bde",
228+
"block_height": 141019535,
177229
"aliases": {
178230
"emulator": "f8d6e0586b0a20c7",
179231
"mainnet": "1d7e57aa55817448",

0 commit comments

Comments
 (0)