@@ -2,7 +2,7 @@ import { Address } from '@fuel-ts/address';
22import { ZeroBytes32 } from '@fuel-ts/address/configs' ;
33import { randomBytes } from '@fuel-ts/crypto' ;
44import { bn , toNumber } from '@fuel-ts/math' ;
5- import { TransactionType , UpgradePurposeTypeEnum } from '@fuel-ts/transactions' ;
5+ import { PolicyType , TransactionType , UpgradePurposeTypeEnum } from '@fuel-ts/transactions' ;
66import { concat , hexlify } from '@fuel-ts/utils' ;
77import { ASSET_A , ASSET_B } from '@fuel-ts/utils/test-utils' ;
88
@@ -13,6 +13,7 @@ import Provider from '../provider';
1313
1414import type { CoinTransactionRequestInput } from './input' ;
1515import { ScriptTransactionRequest } from './script-transaction-request' ;
16+ import { BaseTransactionRequest } from './transaction-request' ;
1617import type { TransactionRequestLike } from './types' ;
1718import type { UpgradeTransactionRequest } from './upgrade-transaction-request' ;
1819import type { UploadTransactionRequest } from './upload-transaction-request' ;
@@ -147,6 +148,165 @@ describe('TransactionRequest', () => {
147148 expect ( signTxSpy ) . toHaveBeenCalledTimes ( 7 ) ;
148149 expect ( createWitnessSpy ) . toHaveBeenCalledTimes ( 7 ) ;
149150 } ) ;
151+
152+ describe ( 'getPolicyMeta' , ( ) => {
153+ it ( 'should return MaxFee policy by default' , ( ) => {
154+ const txRequest = new ScriptTransactionRequest ( {
155+ maxFee : 1000 ,
156+ } ) ;
157+
158+ const result = BaseTransactionRequest . getPolicyMeta ( txRequest ) ;
159+
160+ expect ( result . policyTypes ) . toBe ( PolicyType . MaxFee ) ;
161+ expect ( result . policies ) . toHaveLength ( 1 ) ;
162+ expect ( result . policies [ 0 ] ) . toEqual ( {
163+ type : PolicyType . MaxFee ,
164+ data : bn ( 1000 ) ,
165+ } ) ;
166+ } ) ;
167+
168+ it ( 'should include Owner policy when ownerInputIndex is provided' , ( ) => {
169+ const txRequest = new ScriptTransactionRequest ( {
170+ maxFee : 1000 ,
171+ ownerInputIndex : 5 ,
172+ } ) ;
173+
174+ const result = BaseTransactionRequest . getPolicyMeta ( txRequest ) ;
175+
176+ expect ( result . policyTypes ) . toBe ( PolicyType . MaxFee + PolicyType . Owner ) ;
177+ expect ( result . policies ) . toHaveLength ( 2 ) ;
178+
179+ const maxFeePolicy = result . policies . find ( ( p ) => p . type === PolicyType . MaxFee ) ;
180+ expect ( maxFeePolicy ?. data . toNumber ( ) ) . toBe ( 1000 ) ;
181+
182+ const ownerPolicy = result . policies . find ( ( p ) => p . type === PolicyType . Owner ) ;
183+ expect ( ownerPolicy ?. data . toNumber ( ) ) . toBe ( 5 ) ;
184+ } ) ;
185+
186+ it ( 'should not include Owner policy when ownerInputIndex is undefined' , ( ) => {
187+ const txRequest = new ScriptTransactionRequest ( {
188+ maxFee : 1000 ,
189+ ownerInputIndex : undefined ,
190+ } ) ;
191+
192+ const result = BaseTransactionRequest . getPolicyMeta ( txRequest ) ;
193+
194+ expect ( result . policyTypes ) . toBe ( PolicyType . MaxFee ) ;
195+ expect ( result . policies ) . toHaveLength ( 1 ) ;
196+ expect ( result . policies [ 0 ] . type ) . not . toBe ( PolicyType . Owner ) ;
197+ } ) ;
198+
199+ it ( 'should include Owner policy with tip and other policies' , ( ) => {
200+ const txRequest = new ScriptTransactionRequest ( {
201+ maxFee : 2000 ,
202+ tip : 100 ,
203+ ownerInputIndex : 3 ,
204+ maturity : 10 ,
205+ } ) ;
206+
207+ const result = BaseTransactionRequest . getPolicyMeta ( txRequest ) ;
208+
209+ expect ( result . policyTypes ) . toBe (
210+ PolicyType . MaxFee + PolicyType . Tip + PolicyType . Maturity + PolicyType . Owner
211+ ) ;
212+ expect ( result . policies ) . toHaveLength ( 4 ) ;
213+
214+ const maxFeePolicy = result . policies . find ( ( p ) => p . type === PolicyType . MaxFee ) ;
215+ expect ( maxFeePolicy ?. data . toNumber ( ) ) . toBe ( 2000 ) ;
216+
217+ const tipPolicy = result . policies . find ( ( p ) => p . type === PolicyType . Tip ) ;
218+ expect ( tipPolicy ?. data . toNumber ( ) ) . toBe ( 100 ) ;
219+
220+ const maturityPolicy = result . policies . find ( ( p ) => p . type === PolicyType . Maturity ) ;
221+ expect ( maturityPolicy ?. data ) . toBe ( 10 ) ;
222+
223+ const ownerPolicy = result . policies . find ( ( p ) => p . type === PolicyType . Owner ) ;
224+ expect ( ownerPolicy ?. data . toNumber ( ) ) . toBe ( 3 ) ;
225+ } ) ;
226+
227+ it ( 'should include Owner policy with all possible policies' , ( ) => {
228+ const txRequest = new ScriptTransactionRequest ( {
229+ maxFee : 2000 ,
230+ tip : 100 ,
231+ ownerInputIndex : 2 ,
232+ maturity : 10 ,
233+ expiration : 100 ,
234+ witnessLimit : 500 ,
235+ } ) ;
236+
237+ const result = BaseTransactionRequest . getPolicyMeta ( txRequest ) ;
238+
239+ expect ( result . policyTypes ) . toBe (
240+ PolicyType . MaxFee +
241+ PolicyType . Tip +
242+ PolicyType . Maturity +
243+ PolicyType . Expiration +
244+ PolicyType . WitnessLimit +
245+ PolicyType . Owner
246+ ) ;
247+ expect ( result . policies ) . toHaveLength ( 6 ) ;
248+
249+ // Check that all policy types are present
250+ const policyTypes = result . policies . map ( ( p ) => p . type ) ;
251+ expect ( policyTypes ) . toContain ( PolicyType . MaxFee ) ;
252+ expect ( policyTypes ) . toContain ( PolicyType . Tip ) ;
253+ expect ( policyTypes ) . toContain ( PolicyType . Maturity ) ;
254+ expect ( policyTypes ) . toContain ( PolicyType . Expiration ) ;
255+ expect ( policyTypes ) . toContain ( PolicyType . WitnessLimit ) ;
256+ expect ( policyTypes ) . toContain ( PolicyType . Owner ) ;
257+
258+ // Check the values
259+ const maxFeePolicy = result . policies . find ( ( p ) => p . type === PolicyType . MaxFee ) ;
260+ expect ( maxFeePolicy ?. data . toNumber ( ) ) . toBe ( 2000 ) ;
261+
262+ const tipPolicy = result . policies . find ( ( p ) => p . type === PolicyType . Tip ) ;
263+ expect ( tipPolicy ?. data . toNumber ( ) ) . toBe ( 100 ) ;
264+
265+ const maturityPolicy = result . policies . find ( ( p ) => p . type === PolicyType . Maturity ) ;
266+ expect ( maturityPolicy ?. data ) . toBe ( 10 ) ;
267+
268+ const expirationPolicy = result . policies . find ( ( p ) => p . type === PolicyType . Expiration ) ;
269+ expect ( expirationPolicy ?. data ) . toBe ( 100 ) ;
270+
271+ const witnessLimitPolicy = result . policies . find ( ( p ) => p . type === PolicyType . WitnessLimit ) ;
272+ expect ( witnessLimitPolicy ?. data . toNumber ( ) ) . toBe ( 500 ) ;
273+
274+ const ownerPolicy = result . policies . find ( ( p ) => p . type === PolicyType . Owner ) ;
275+ expect ( ownerPolicy ?. data . toNumber ( ) ) . toBe ( 2 ) ;
276+ } ) ;
277+
278+ it ( 'should handle ownerInputIndex with different numeric values' , ( ) => {
279+ const testCases = [ 1 , 10 , 100 , 255 , 1000 , 65535 ] ;
280+
281+ testCases . forEach ( ( ownerInputIndex ) => {
282+ const txRequest = new ScriptTransactionRequest ( {
283+ maxFee : 1000 ,
284+ ownerInputIndex,
285+ } ) ;
286+
287+ const result = BaseTransactionRequest . getPolicyMeta ( txRequest ) ;
288+
289+ const ownerPolicy = result . policies . find ( ( p ) => p . type === PolicyType . Owner ) ;
290+ expect ( ownerPolicy ) . toBeDefined ( ) ;
291+ expect ( ownerPolicy ?. data . toNumber ( ) ) . toBe ( ownerInputIndex ) ;
292+ } ) ;
293+ } ) ;
294+
295+ it ( 'should serialize ownerInputIndex as BN in owner policy' , ( ) => {
296+ const txRequest = new ScriptTransactionRequest ( {
297+ maxFee : 1000 ,
298+ ownerInputIndex : 999 ,
299+ } ) ;
300+
301+ const result = BaseTransactionRequest . getPolicyMeta ( txRequest ) ;
302+
303+ const ownerPolicy = result . policies . find ( ( p ) => p . type === PolicyType . Owner ) ;
304+ expect ( ownerPolicy ) . toBeDefined ( ) ;
305+ expect ( ownerPolicy ?. type ) . toBe ( PolicyType . Owner ) ;
306+ expect ( ownerPolicy ?. data . toNumber ( ) ) . toBe ( 999 ) ;
307+ expect ( ownerPolicy ?. data . constructor . name ) . toBe ( 'BN' ) ;
308+ } ) ;
309+ } ) ;
150310} ) ;
151311
152312describe ( 'transactionRequestify' , ( ) => {
0 commit comments