@@ -18,10 +18,12 @@ module default {
18
18
}
19
19
required implementation: Address;
20
20
required salt: Bytes32;
21
- required isActive: bool ;
22
- photoUri: str ;
23
21
required paymasterEthCredit: decimal { constraint min_value (0 ); default := 0 ; }
22
+ activationEthFee: decimal { constraint min_value (0 ); }
23
+ upgradedAtBlock: bigint { constraint min_value (0 ); }
24
+ photoUri: str ;
24
25
required property chain := as_chain (.address);
26
+ required property isActive := exists .upgradedAtBlock;
25
27
multi link policies := (select .< account[is Policy ] filter .isEnabled);
26
28
multi link proposals := .< account[is Proposal];
27
29
multi link transactionProposals := .< account[is TransactionProposal];
@@ -51,13 +53,13 @@ module default {
51
53
multi link approvals := .< proposal[is Approval];
52
54
multi link rejections := .< proposal[is Rejection];
53
55
multi link potentialApprovers := (
54
- with potentialResponses := distinct (( select .policy) ?? .account.policies).state .approvers.id,
55
- ids := potentialResponses except .approvals.approver.id
56
+ with approvers := distinct (.policy ?? .account.policies).stateOrDraft .approvers.id,
57
+ ids := approvers except .approvals.approver.id
56
58
select Approver filter .id in ids
57
59
);
58
60
multi link potentialRejectors := (
59
- with potentialResponses := distinct (( select .policy) ?? .account.policies).state .approvers.id,
60
- ids := potentialResponses except .rejections.approver.id
61
+ with approvers := distinct (.policy ?? .account.policies).stateOrDraft .approvers.id,
62
+ ids := approvers except .rejections.approver.id
61
63
select Approver filter .id in ids
62
64
);
63
65
property riskLabel := assert_single ((select .< proposal[is ProposalRiskLabel] filter .user = global current_user)).risk;
@@ -118,6 +120,11 @@ module default {
118
120
data: Bytes;
119
121
}
120
122
123
+ type PaymasterFees {
124
+ required property total := .activation;
125
+ required activation: decimal { constraint min_value (0 ); default := 0 ; }
126
+ }
127
+
121
128
type TransactionProposal extending Proposal {
122
129
required multi operations: Operation {
123
130
constraint exclusive ;
@@ -126,13 +133,14 @@ module default {
126
133
required gasLimit: uint256 { default := 0 ; }
127
134
required feeToken: Token;
128
135
required paymaster: Address;
129
- required paymasterEthFee: decimal { constraint min_value ( 0 ) ; default := 0 ; }
136
+ required maxPaymasterEthFees: PaymasterFees { constraint exclusive ; default := ( insert PaymasterFees {}) ; }
130
137
simulation: Simulation { constraint exclusive ; on target delete deferred restrict ; }
131
138
multi link transactions := .< proposal[is Transaction ];
132
139
link transaction := (select .transactions order by .submittedAt desc limit 1 );
140
+ required submitted: bool { default := false ; }
133
141
required property status := (
134
142
select assert_exists ((
135
- TransactionProposalStatus.Pending if (not exists .transaction) else
143
+ TransactionProposalStatus.Pending if (not exists .transaction and not .submitted ) else
136
144
TransactionProposalStatus.Executing if (not exists .transaction.receipt) else
137
145
TransactionProposalStatus.Successful if (.transaction.receipt.success) else
138
146
TransactionProposalStatus.Failed
@@ -213,11 +221,14 @@ module default {
213
221
required hash : Bytes32 { constraint exclusive ; }
214
222
required proposal: TransactionProposal;
215
223
required maxEthFeePerGas: decimal { constraint min_value (0 ); }
216
- required ethDiscount: decimal { constraint min_value (0 ); default := 0 ; }
224
+ required paymasterEthFees: PaymasterFees { constraint exclusive ; default := (insert PaymasterFees {}); }
225
+ required ethCreditUsed: decimal { constraint min_value (0 ); default := 0 ; }
226
+ # required ethDiscount: decimal { constraint min_value(0); default := 0; }
227
+ required property ethDiscount := .ethCreditUsed + (.proposal.maxPaymasterEthFees.total - .paymasterEthFees.total);
217
228
required ethPerFeeToken: decimal { constraint min_value (0 ); }
218
229
required usdPerFeeToken: decimal { constraint min_value (0 ); }
219
230
required property maxNetworkEthFee := .maxEthFeePerGas * .proposal.gasLimit;
220
- required property maxEthFees := .maxNetworkEthFee + .proposal.paymasterEthFee - .ethDiscount;
231
+ required property maxEthFees := .maxNetworkEthFee + .paymasterEthFees.total - .ethDiscount;
221
232
required submittedAt: datetime { default := datetime_of_statement (); }
222
233
receipt: Receipt { constraint exclusive ; }
223
234
multi link events := .< transaction[is Event];
@@ -237,7 +248,7 @@ module default {
237
248
required gasUsed: bigint { constraint min_value (0 ); }
238
249
required ethFeePerGas: decimal { constraint min_value (0 ); }
239
250
required property networkEthFee := .ethFeePerGas * .transaction.proposal.gasLimit;
240
- required property ethFees := .networkEthFee + .transaction.proposal.paymasterEthFee - .transaction.ethDiscount;
251
+ required property ethFees := .networkEthFee + .transaction.paymasterEthFees.total - .transaction.ethDiscount;
241
252
multi link events := .transaction.events;
242
253
multi link transferEvents := .events[is Transfer];
243
254
multi link transferApprovalEvents := .events[is TransferApproval];
0 commit comments