Skip to content

Commit de2de81

Browse files
committed
fix: bad execution validity window check causing erroneous errors
1 parent 23f622a commit de2de81

File tree

6 files changed

+1113
-1940
lines changed

6 files changed

+1113
-1940
lines changed

assets/arc-0058/projects/arc-0058/smart_contracts/abstracted_account/contract.algo.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -203,14 +203,10 @@ export class AbstractedAccount extends Contract {
203203

204204
const { useRounds, useExecutionKey } = this.plugins(key).value
205205

206-
const epochRef = useRounds
207-
? Global.round
208-
: Global.latestTimestamp;
209-
210206
if (useExecutionKey && !(Txn.sender === this.admin.value)) {
211207
assert(this.executions(Txn.lease).exists, ERR_EXECUTION_KEY_NOT_FOUND);
212-
assert(this.executions(Txn.lease).value.firstValid <= epochRef, ERR_EXECUTION_NOT_READY);
213-
assert(epochRef < this.executions(Txn.lease).value.lastValid, ERR_EXECUTION_EXPIRED);
208+
assert(this.executions(Txn.lease).value.firstValid <= Global.round, ERR_EXECUTION_NOT_READY);
209+
assert(this.executions(Txn.lease).value.lastValid >= Global.round, ERR_EXECUTION_EXPIRED);
214210

215211
const groups = this.executions(Txn.lease).value.groups as Readonly<bytes<32>[]>;
216212

@@ -231,6 +227,10 @@ export class AbstractedAccount extends Contract {
231227
assert(!initialCheck.expired, ERR_PLUGIN_EXPIRED);
232228
assert(!initialCheck.onCooldown, ERR_PLUGIN_ON_COOLDOWN);
233229

230+
const epochRef = useRounds
231+
? Global.round
232+
: Global.latestTimestamp;
233+
234234
let rekeysBack = false;
235235
let methodIndex: uint64 = 0;
236236

assets/arc-0058/projects/arc-0058/smart_contracts/artifacts/abstracted_account/AbstractedAccount.approval.puya.map

Lines changed: 1018 additions & 1842 deletions
Large diffs are not rendered by default.

assets/arc-0058/projects/arc-0058/smart_contracts/artifacts/abstracted_account/AbstractedAccount.approval.teal

Lines changed: 64 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -5701,7 +5701,7 @@ smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rek
57015701
intc_0 // 0
57025702
dupn 10
57035703
bytec_1 // ""
5704-
dupn 19
5704+
dupn 18
57055705
// smart_contracts/abstracted_account/contract.algo.ts:575
57065706
// const caller = global ? Global.zeroAddress : Txn.sender
57075707
frame_dig -4
@@ -5818,7 +5818,7 @@ smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rek
58185818
intc_0 // 0
58195819
extract_uint64
58205820
dup
5821-
frame_bury 30
5821+
frame_bury 29
58225822
// smart_contracts/abstracted_account/contract.algo.ts:320-323
58235823
// const allowanceKey: AllowanceKey = {
58245824
// escrow,
@@ -5877,7 +5877,7 @@ smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rek
58775877
pushint 392 // 392
58785878
getbit
58795879
dup
5880-
frame_bury 29
5880+
frame_bury 28
58815881
// smart_contracts/abstracted_account/contract.algo.ts:351
58825882
// const newLast = useRounds ? Global.round : Global.latestTimestamp;
58835883
bz smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rekeyToPlugin_ternary_false@59
@@ -5931,7 +5931,7 @@ smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rek
59315931
box_replace
59325932
// smart_contracts/abstracted_account/contract.algo.ts:327
59335933
// if (fundsRequests[i].asset !== 0) {
5934-
frame_dig 30
5934+
frame_dig 29
59355935
bz smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rekeyToPlugin_else_body@73
59365936
// smart_contracts/abstracted_account/contract.algo.ts:328-335
59375937
// itxn
@@ -5958,7 +5958,7 @@ smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rek
59585958
frame_dig 0
59595959
intc_3 // 8
59605960
extract_uint64
5961-
frame_dig 30
5961+
frame_dig 29
59625962
itxn_field XferAsset
59635963
itxn_field AssetAmount
59645964
frame_dig 5
@@ -6056,7 +6056,7 @@ smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rek
60566056
bz smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rekeyToPlugin_else_body@66
60576057
// smart_contracts/abstracted_account/contract.algo.ts:385
60586058
// if (useRounds) {
6059-
frame_dig 29
6059+
frame_dig 28
60606060
bz smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rekeyToPlugin_after_if_else@77
60616061
// smart_contracts/abstracted_account/contract.algo.ts:386
60626062
// return Global.round - ((Global.round - start) % interval)
@@ -6147,7 +6147,7 @@ smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rek
61476147
bz smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rekeyToPlugin_after_if_else@71
61486148
// smart_contracts/abstracted_account/contract.algo.ts:370
61496149
// const epochRef = useRounds ? Global.round : Global.latestTimestamp;
6150-
frame_dig 29
6150+
frame_dig 28
61516151
bz smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rekeyToPlugin_ternary_false@69
61526152
global Round
61536153
frame_bury 14
@@ -6218,108 +6218,94 @@ smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rek
62186218
dup
62196219
intc_1 // 1
62206220
getbit
6221-
swap
6221+
frame_bury 28
62226222
intc_2 // 2
62236223
getbit
6224-
frame_bury 28
6225-
// smart_contracts/abstracted_account/contract.algo.ts:206-208
6226-
// const epochRef = useRounds
6227-
// ? Global.round
6228-
// : Global.latestTimestamp;
6229-
bz smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rekeyToPlugin_ternary_false@16
6230-
// smart_contracts/abstracted_account/contract.algo.ts:207
6231-
// ? Global.round
6232-
global Round
6233-
frame_bury 14
6234-
6235-
smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rekeyToPlugin_ternary_merge@17:
6236-
// smart_contracts/abstracted_account/contract.algo.ts:210
6224+
// smart_contracts/abstracted_account/contract.algo.ts:206
62376225
// if (useExecutionKey && !(Txn.sender === this.admin.value)) {
6238-
frame_dig 28
6239-
bz smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rekeyToPlugin_after_if_else@25
6226+
bz smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rekeyToPlugin_after_if_else@22
62406227
txn Sender
62416228
intc_0 // 0
62426229
// smart_contracts/abstracted_account/contract.algo.ts:16
62436230
// admin = GlobalState<Account>({ key: AbstractAccountGlobalStateKeysAdmin })
62446231
bytec_2 // "admin"
6245-
// smart_contracts/abstracted_account/contract.algo.ts:210
6232+
// smart_contracts/abstracted_account/contract.algo.ts:206
62466233
// if (useExecutionKey && !(Txn.sender === this.admin.value)) {
62476234
app_global_get_ex
62486235
assert // check GlobalState exists
62496236
==
6250-
bnz smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rekeyToPlugin_after_if_else@25
6237+
bnz smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rekeyToPlugin_after_if_else@22
62516238
// smart_contracts/abstracted_account/contract.algo.ts:41
62526239
// executions = BoxMap<bytes<32>, ExecutionInfo>({ keyPrefix: AbstractAccountBoxPrefixExecutions })
62536240
bytec 8 // "x"
6254-
// smart_contracts/abstracted_account/contract.algo.ts:211
6241+
// smart_contracts/abstracted_account/contract.algo.ts:207
62556242
// assert(this.executions(Txn.lease).exists, ERR_EXECUTION_KEY_NOT_FOUND);
62566243
txn Lease
62576244
// smart_contracts/abstracted_account/contract.algo.ts:41
62586245
// executions = BoxMap<bytes<32>, ExecutionInfo>({ keyPrefix: AbstractAccountBoxPrefixExecutions })
62596246
concat
6260-
// smart_contracts/abstracted_account/contract.algo.ts:211
6247+
// smart_contracts/abstracted_account/contract.algo.ts:207
62616248
// assert(this.executions(Txn.lease).exists, ERR_EXECUTION_KEY_NOT_FOUND);
62626249
box_len
62636250
bury 1
62646251
assert // Execution key not found
62656252
// smart_contracts/abstracted_account/contract.algo.ts:41
62666253
// executions = BoxMap<bytes<32>, ExecutionInfo>({ keyPrefix: AbstractAccountBoxPrefixExecutions })
62676254
bytec 8 // "x"
6268-
// smart_contracts/abstracted_account/contract.algo.ts:212
6269-
// assert(this.executions(Txn.lease).value.firstValid <= epochRef, ERR_EXECUTION_NOT_READY);
6255+
// smart_contracts/abstracted_account/contract.algo.ts:208
6256+
// assert(this.executions(Txn.lease).value.firstValid <= Global.round, ERR_EXECUTION_NOT_READY);
62706257
txn Lease
62716258
// smart_contracts/abstracted_account/contract.algo.ts:41
62726259
// executions = BoxMap<bytes<32>, ExecutionInfo>({ keyPrefix: AbstractAccountBoxPrefixExecutions })
62736260
concat
6274-
// smart_contracts/abstracted_account/contract.algo.ts:212
6275-
// assert(this.executions(Txn.lease).value.firstValid <= epochRef, ERR_EXECUTION_NOT_READY);
6261+
// smart_contracts/abstracted_account/contract.algo.ts:208
6262+
// assert(this.executions(Txn.lease).value.firstValid <= Global.round, ERR_EXECUTION_NOT_READY);
62766263
intc_2 // 2
62776264
intc_3 // 8
62786265
box_extract
62796266
btoi
6280-
frame_dig 14
6281-
dup
6282-
cover 2
6267+
global Round
62836268
<=
62846269
assert // Execution key not ready
62856270
// smart_contracts/abstracted_account/contract.algo.ts:41
62866271
// executions = BoxMap<bytes<32>, ExecutionInfo>({ keyPrefix: AbstractAccountBoxPrefixExecutions })
62876272
bytec 8 // "x"
6288-
// smart_contracts/abstracted_account/contract.algo.ts:213
6289-
// assert(epochRef < this.executions(Txn.lease).value.lastValid, ERR_EXECUTION_EXPIRED);
6273+
// smart_contracts/abstracted_account/contract.algo.ts:209
6274+
// assert(this.executions(Txn.lease).value.lastValid >= Global.round, ERR_EXECUTION_EXPIRED);
62906275
txn Lease
62916276
// smart_contracts/abstracted_account/contract.algo.ts:41
62926277
// executions = BoxMap<bytes<32>, ExecutionInfo>({ keyPrefix: AbstractAccountBoxPrefixExecutions })
62936278
concat
6294-
// smart_contracts/abstracted_account/contract.algo.ts:213
6295-
// assert(epochRef < this.executions(Txn.lease).value.lastValid, ERR_EXECUTION_EXPIRED);
6279+
// smart_contracts/abstracted_account/contract.algo.ts:209
6280+
// assert(this.executions(Txn.lease).value.lastValid >= Global.round, ERR_EXECUTION_EXPIRED);
62966281
pushint 10 // 10
62976282
intc_3 // 8
62986283
box_extract
62996284
btoi
6300-
<
6285+
global Round
6286+
>=
63016287
assert // Execution key expired
63026288
// smart_contracts/abstracted_account/contract.algo.ts:41
63036289
// executions = BoxMap<bytes<32>, ExecutionInfo>({ keyPrefix: AbstractAccountBoxPrefixExecutions })
63046290
bytec 8 // "x"
6305-
// smart_contracts/abstracted_account/contract.algo.ts:215
6291+
// smart_contracts/abstracted_account/contract.algo.ts:211
63066292
// const groups = this.executions(Txn.lease).value.groups as Readonly<bytes<32>[]>;
63076293
txn Lease
63086294
// smart_contracts/abstracted_account/contract.algo.ts:41
63096295
// executions = BoxMap<bytes<32>, ExecutionInfo>({ keyPrefix: AbstractAccountBoxPrefixExecutions })
63106296
concat
63116297
frame_bury 4
6312-
// smart_contracts/abstracted_account/contract.algo.ts:217
6298+
// smart_contracts/abstracted_account/contract.algo.ts:213
63136299
// let foundGroup = false;
63146300
intc_0 // 0
63156301
frame_bury 15
6316-
// smart_contracts/abstracted_account/contract.algo.ts:218
6302+
// smart_contracts/abstracted_account/contract.algo.ts:214
63176303
// for (let i: uint64 = 0; i < groups.length; i += 1) {
63186304
intc_0 // 0
63196305
frame_bury 16
63206306

6321-
smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rekeyToPlugin_while_top@20:
6322-
// smart_contracts/abstracted_account/contract.algo.ts:218
6307+
smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rekeyToPlugin_while_top@17:
6308+
// smart_contracts/abstracted_account/contract.algo.ts:214
63236309
// for (let i: uint64 = 0; i < groups.length; i += 1) {
63246310
frame_dig 4
63256311
pushint 18 // 18
@@ -6328,8 +6314,8 @@ smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rek
63286314
btoi
63296315
frame_dig 16
63306316
>
6331-
bz smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rekeyToPlugin_after_while@24
6332-
// smart_contracts/abstracted_account/contract.algo.ts:219
6317+
bz smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rekeyToPlugin_after_while@21
6318+
// smart_contracts/abstracted_account/contract.algo.ts:215
63336319
// if (groups[i] === Global.groupId) {
63346320
frame_dig 16
63356321
pushint 32 // 32
@@ -6342,67 +6328,77 @@ smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rek
63426328
box_extract
63436329
global GroupID
63446330
==
6345-
bz smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rekeyToPlugin_after_if_else@23
6346-
// smart_contracts/abstracted_account/contract.algo.ts:220
6331+
bz smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rekeyToPlugin_after_if_else@20
6332+
// smart_contracts/abstracted_account/contract.algo.ts:216
63476333
// foundGroup = true;
63486334
intc_1 // 1
63496335
frame_bury 15
63506336

6351-
smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rekeyToPlugin_after_if_else@23:
6352-
// smart_contracts/abstracted_account/contract.algo.ts:218
6337+
smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rekeyToPlugin_after_if_else@20:
6338+
// smart_contracts/abstracted_account/contract.algo.ts:214
63536339
// for (let i: uint64 = 0; i < groups.length; i += 1) {
63546340
frame_dig 16
63556341
intc_1 // 1
63566342
+
63576343
frame_bury 16
6358-
b smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rekeyToPlugin_while_top@20
6344+
b smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rekeyToPlugin_while_top@17
63596345

6360-
smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rekeyToPlugin_after_while@24:
6361-
// smart_contracts/abstracted_account/contract.algo.ts:224
6346+
smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rekeyToPlugin_after_while@21:
6347+
// smart_contracts/abstracted_account/contract.algo.ts:220
63626348
// assert(foundGroup, ERR_GROUP_NOT_FOUND);
63636349
frame_dig 15
63646350
assert // Group not found
63656351
// smart_contracts/abstracted_account/contract.algo.ts:41
63666352
// executions = BoxMap<bytes<32>, ExecutionInfo>({ keyPrefix: AbstractAccountBoxPrefixExecutions })
63676353
bytec 8 // "x"
6368-
// smart_contracts/abstracted_account/contract.algo.ts:225
6354+
// smart_contracts/abstracted_account/contract.algo.ts:221
63696355
// this.executions(Txn.lease).delete();
63706356
txn Lease
63716357
// smart_contracts/abstracted_account/contract.algo.ts:41
63726358
// executions = BoxMap<bytes<32>, ExecutionInfo>({ keyPrefix: AbstractAccountBoxPrefixExecutions })
63736359
concat
6374-
// smart_contracts/abstracted_account/contract.algo.ts:225
6360+
// smart_contracts/abstracted_account/contract.algo.ts:221
63756361
// this.executions(Txn.lease).delete();
63766362
box_del
63776363
pop
63786364

6379-
smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rekeyToPlugin_after_if_else@25:
6380-
// smart_contracts/abstracted_account/contract.algo.ts:228
6365+
smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rekeyToPlugin_after_if_else@22:
6366+
// smart_contracts/abstracted_account/contract.algo.ts:224
63816367
// const initialCheck = this.pluginCheck(key);
63826368
frame_dig 6
63836369
callsub pluginCheck
6384-
dup
6385-
cover 2
63866370
frame_bury 6
6387-
// smart_contracts/abstracted_account/contract.algo.ts:230
6371+
// smart_contracts/abstracted_account/contract.algo.ts:226
63886372
// assert(initialCheck.exists, ERR_PLUGIN_DOES_NOT_EXIST);
63896373
dup
63906374
intc_0 // 0
63916375
getbit
63926376
assert // plugin does not exist
6393-
// smart_contracts/abstracted_account/contract.algo.ts:231
6377+
// smart_contracts/abstracted_account/contract.algo.ts:227
63946378
// assert(!initialCheck.expired, ERR_PLUGIN_EXPIRED);
63956379
dup
63966380
intc_1 // 1
63976381
getbit
63986382
!
63996383
assert // plugin expired
6400-
// smart_contracts/abstracted_account/contract.algo.ts:232
6384+
// smart_contracts/abstracted_account/contract.algo.ts:228
64016385
// assert(!initialCheck.onCooldown, ERR_PLUGIN_ON_COOLDOWN);
64026386
intc_2 // 2
64036387
getbit
64046388
!
64056389
assert // plugin on cooldown
6390+
// smart_contracts/abstracted_account/contract.algo.ts:230-232
6391+
// const epochRef = useRounds
6392+
// ? Global.round
6393+
// : Global.latestTimestamp;
6394+
frame_dig 28
6395+
bz smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rekeyToPlugin_ternary_false@24
6396+
// smart_contracts/abstracted_account/contract.algo.ts:231
6397+
// ? Global.round
6398+
global Round
6399+
frame_bury 14
6400+
6401+
smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rekeyToPlugin_ternary_merge@25:
64066402
// smart_contracts/abstracted_account/contract.algo.ts:234
64076403
// let rekeysBack = false;
64086404
intc_0 // 0
@@ -6417,6 +6413,7 @@ smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rek
64176413
intc_1 // 1
64186414
+
64196415
frame_bury 18
6416+
frame_dig 6
64206417
frame_bury 7
64216418

64226419
smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rekeyToPlugin_while_top@26:
@@ -6657,7 +6654,7 @@ smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rek
66576654
getbit
66586655
dup
66596656
cover 2
6660-
frame_bury 29
6657+
frame_bury 28
66616658
// smart_contracts/abstracted_account/contract.algo.ts:288
66626659
// const { selector, cooldown, lastCalled } = this.plugins(key).value.methods[offset]
66636660
uncover 2
@@ -6710,7 +6707,7 @@ smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rek
67106707
bz smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rekeyToPlugin_after_if_else@43
67116708
// smart_contracts/abstracted_account/contract.algo.ts:298
67126709
// const lastCalled = useRounds ? Global.round : Global.latestTimestamp;
6713-
frame_dig 29
6710+
frame_dig 28
67146711
bz smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rekeyToPlugin_ternary_false@41
67156712
global Round
67166713

@@ -6809,12 +6806,12 @@ smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rek
68096806
global LatestTimestamp
68106807
b smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rekeyToPlugin_ternary_merge@35
68116808

6812-
smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rekeyToPlugin_ternary_false@16:
6813-
// smart_contracts/abstracted_account/contract.algo.ts:208
6809+
smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rekeyToPlugin_ternary_false@24:
6810+
// smart_contracts/abstracted_account/contract.algo.ts:232
68146811
// : Global.latestTimestamp;
68156812
global LatestTimestamp
68166813
frame_bury 14
6817-
b smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rekeyToPlugin_ternary_merge@17
6814+
b smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rekeyToPlugin_ternary_merge@25
68186815

68196816
smart_contracts/abstracted_account/contract.algo.ts::AbstractedAccount.arc58_rekeyToPlugin_else_body@7:
68206817
// smart_contracts/abstracted_account/contract.algo.ts:588

assets/arc-0058/projects/arc-0058/smart_contracts/artifacts/abstracted_account/AbstractedAccount.arc32.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)