@arcblock/payment-service 1.29.10 → 1.29.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cf.js +1 -1
- package/dist/index.js +1 -0
- package/package.json +3 -3
package/dist/cf.js
CHANGED
|
@@ -306,7 +306,7 @@ Signature verification is impossible without access to the original signed mater
|
|
|
306
306
|
`).filter(r=>{let n=r.match(qke);if(n===null||!n[1])return!0;let i=n[1];return i.includes(".app/Contents/Resources/electron.asar")||i.includes(".app/Contents/Resources/default_app.asar")?!1:!xAt.test(i)}).filter(r=>r.trim()!=="").map(r=>e.pretty?r.replace(qke,(n,i)=>n.replace(i,i.replace(EAt,"~"))):r).join(`
|
|
307
307
|
`))});var Jke=G((FCr,Gke)=>{"use strict";var vAt=Mke(),AAt=jke(),SAt=t=>t.replace(/\s+at .*aggregate-error\/index.js:\d+:\d+\)?/g,""),BX=class extends Error{constructor(e){if(!Array.isArray(e))throw new TypeError(`Expected input to be an Array, got ${typeof e}`);e=[...e].map(n=>n instanceof Error?n:n!==null&&typeof n=="object"?Object.assign(new Error(n.message),n):new Error(n));let r=e.map(n=>typeof n.stack=="string"?SAt(AAt(n.stack)):String(n)).join(`
|
|
308
308
|
`);r=`
|
|
309
|
-
`+vAt(r,4),super(r),this.name="AggregateError",Object.defineProperty(this,"_errors",{value:e})}*[Symbol.iterator](){for(let e of this._errors)yield e}};Gke.exports=BX});var Kke=G((MCr,Vke)=>{"use strict";var TAt=Jke();Vke.exports=async(t,e,{concurrency:r=1/0,stopOnError:n=!0}={})=>new Promise((i,o)=>{if(typeof e!="function")throw new TypeError("Mapper function is required");if(!((Number.isSafeInteger(r)||r===1/0)&&r>=1))throw new TypeError(`Expected \`concurrency\` to be an integer from 1 and up or \`Infinity\`, got \`${r}\` (${typeof r})`);let a=[],s=[],c=t[Symbol.iterator](),u=!1,d=!1,l=0,p=0,f=()=>{if(u)return;let m=c.next(),h=p;if(p++,m.done){d=!0,l===0&&(!n&&s.length!==0?o(new TAt(s)):i(a));return}l++,(async()=>{try{let g=await m.value;a[h]=await e(g,h),l--,f()}catch(g){n?(u=!0,o(g)):(s.push(g),l--,f())}})()};for(let m=0;m<r&&(f(),!d);m++);})});var Uy=G((UCr,Wke)=>{"use strict";var IAt=Kke();Wke.exports=(t,e)=>IAt(t,r=>r(),e)});function lw(t,e){if(!t.valid)return{valid:!1,reason:"This coupon is no longer available"};if(t.redeem_by&&Math.floor(Date.now()/1e3)>t.redeem_by)return{valid:!1,reason:"This coupon has expired and cannot be used"};if(t.max_redemptions&&(t.times_redeemed??0)>=t.max_redemptions)return{valid:!1,reason:"This coupon has been fully redeemed and is no longer available"};if(e&&e.length>0&&t.applies_to?.products){let r=t.applies_to?.products;if(r&&r.length>0&&!e.some(i=>r.includes(i.price?.product_id)))return{valid:!1,reason:"This coupon cannot be applied to the items in your cart"}}return{valid:!0}}async function $X(t,{customerId:e,amount:r,currencyId:n,checkoutSessionId:i}){if(!t.active)return{valid:!1,reason:"This promotion code is no longer available"};if(t.expires_at&&Math.floor(Date.now()/1e3)>t.expires_at)return{valid:!1,reason:"This promotion code has expired and cannot be used"};if(t.max_redemptions&&(t.times_redeemed??0)>=t.max_redemptions)return{valid:!1,reason:"This promotion code has been fully redeemed and is no longer available"};if(e){let a=(await te.findByPkOrDid(e))?.did||e;if(t.verification_type==="user_restricted"&&a&&!t.customer_dids?.includes(a))return{valid:!1,reason:"This promotion code is not available for your account"};if(t.restrictions?.first_time_transaction){let s={customer_id:e,coupon_id:t.coupon_id};if(i&&(s.checkout_session_id={[J.ne]:i}),await En.count({where:s})>0)return{valid:!1,reason:"This promotion is only available for first-time purchases"}}}if(r&&n&&(t.restrictions?.minimum_amount||t.restrictions?.currency_options?.[n])){let o=n===t.restrictions?.minimum_amount_currency?t.restrictions?.minimum_amount:t.restrictions?.currency_options?.[n]?.minimum_amount,a=await W.findByPk(n);if(o){let s=new F(r),c=new F(o);if(s.lt(c))return a?{valid:!1,reason:`This promotion requires a minimum purchase amount of ${vT(lt(c,a?.decimal||2))} ${a?.symbol}. Please add more items to your cart.`}:{valid:!1,reason:"This promotion requires a minimum purchase amount. Please add more items to your cart."}}}return{valid:!0}}function zke(t,e,r){if(t.percent_off>0)return new F(e).mul(new F(t.percent_off)).div(new F(100)).toString();if(t.amount_off){let n=t.currency_id===r.id?t.amount_off:t.currency_options?.[r.id]?.amount_off;if(n){let i=new F(n),o=new F(e);return F.min(i,o).toString()}}return"0"}async function Xke(t,e){try{if(t){let r=await Lt.findByPk(t);r&&!r.locked&&(await r.update({locked:!0}),y.info("Locked coupon when creating discount",{couponId:t}))}if(e){let r=await Jt.findByPk(e);r&&!r.locked&&(await r.update({locked:!0}),y.info("Locked promotion code when creating discount",{promotionCodeId:e}))}}catch(r){y.error("Error locking discount resources",{couponId:t,promotionCodeId:e,error:r.message})}}async function LX({checkoutSessionId:t,customerId:e}){let r=await En.findAll({where:{customer_id:e,checkout_session_id:t},include:[{model:Lt,as:"coupon"},{model:Jt,as:"promotionCode",required:!1}]});if(r.length===0)return{discountRecords:[],appliedDiscounts:[],discountBreakdown:[]};let n=r.map(o=>o.id),i=r.map(o=>({amount:o.metadata?.discount_amount||"0",discount:o.id}));return y.info("Retrieved discount records for checkout session",{checkoutSessionId:t,customerId:e,recordCount:r.length}),{discountRecords:r,appliedDiscounts:n,discountBreakdown:i}}async function CAt(t,e){try{let r=await En.findAll({where:{customer_id:t,checkout_session_id:e}}),n=new Map;return r.forEach(i=>{let o=i.subscription_id||"no_subscription";n.set(o,i)}),n}catch(r){throw y.error("Error fetching existing discount records",{customerId:t,checkoutSessionId:e,error:r.message}),new Error(`Failed to fetch existing discount records: ${r.message}`)}}function kAt({checkoutSession:t,customerId:e,coupon:r,promotionCode:n,discountAmount:i,verificationData:o}){let a=Math.floor(Date.now()/1e3),s;if(r.duration==="once")s=a+60;else if(r.duration==="repeating"&&r.duration_in_months){let c=new Date;c.setMonth(c.getMonth()+r.duration_in_months),s=Math.floor(c.getTime()/1e3)}return{livemode:r.livemode,coupon_id:r.id,promotion_code_id:n?.id,customer_id:e,checkout_session_id:t.id,start:a,end:s,verification_method:n?.verification_type,verification_data:o||t.metadata?.verification_data,metadata:{discount_amount:i,original_amount:t.amount_subtotal,final_amount:t.amount_total,currency_id:t.currency_id,applied_at:new Date().toISOString()}}}async function PAt({subscriptionId:t,baseDiscountData:e,existingDiscountMap:r,checkoutSessionId:n}){try{let i=r.get(t);if(i){let a=i.coupon_id!==e.coupon_id,s=i.promotion_code_id!==e.promotion_code_id,c=await i.update({...e,subscription_id:t});return y.info("Upserted discount record for subscription",{checkoutSessionId:n,subscriptionId:t,discountId:c.id,couponChanged:a,promoChanged:s}),{discountRecord:c,shouldUpdateUsage:a||s}}let o=await En.create({...e,subscription_id:t,confirmed:!1,metadata:{...e.metadata,subscription_id:t}});return await Xke(e.coupon_id,e.promotion_code_id),y.info("Created new discount record for subscription",{checkoutSessionId:n,subscriptionId:t,discountId:o.id}),{discountRecord:o,shouldUpdateUsage:!0}}catch(i){throw y.error("Error processing subscription discount",{subscriptionId:t,checkoutSessionId:n,error:i.message}),new Error(`Failed to process subscription discount: ${i.message}`)}}async function NAt(t,e,r){try{let n=e.get("no_subscription");if(n){let o=n.coupon_id!==t.coupon_id,a=n.promotion_code_id!==t.promotion_code_id,s=await n.update({...t});return y.info("Upserted single discount record",{checkoutSessionId:r,discountId:s.id,couponChanged:o,promoChanged:a}),{discountRecord:s,shouldUpdateUsage:o||a}}let i=await En.create({...t,confirmed:!1});return await Xke(t.coupon_id,t.promotion_code_id),y.info("Created new single discount record",{checkoutSessionId:r,discountId:i.id}),{discountRecord:i,shouldUpdateUsage:!0}}catch(n){throw y.error("Error processing non-subscription discount",{checkoutSessionId:r,error:n.message}),new Error(`Failed to process non-subscription discount: ${n.message}`)}}async function RAt({coupon:t,promotionCode:e,updatedCoupons:r,updatedPromotionCodes:n,checkoutSessionId:i}){try{let o=[],a=`${t.id}-${i}`,s=e?`${e.id}-${i}`:"";r.has(a)||(r.add(a),o.push(t.update({times_redeemed:(t.times_redeemed||0)+1}))),e&&s&&!n.has(s)&&(n.add(s),o.push(e.update({times_redeemed:(e.times_redeemed||0)+1}))),await Promise.all(o),Lf("discount-status.queued",t,"coupon",!0),e&&Lf("discount-status.queued",e,"promotion-code",!0),y.debug("Updated coupon and promotion code usage counts",{checkoutSessionId:i,couponId:t.id,promotionCodeId:e?.id})}catch(o){throw y.error("Error updating usage counts",{checkoutSessionId:i,couponId:t.id,promotionCodeId:e?.id,error:o.message}),new Error(`Failed to update usage counts: ${o.message}`)}}async function Yke({discountRecords:t,subscriptionsUpdated:e}){if(e.length===0)return{updatedSubscriptions:[]};let r=[];try{y.info("Updating subscription discount_id references",{subscriptionsToUpdate:e.length});let n=e.map(async o=>{try{let a=t.find(c=>c.subscription_id===o);if(!a)return y.warn("No discount record found for subscription",{subscriptionId:o}),null;let[s]=await ee.update({discount_id:a.id},{where:{id:o}});return s>0?(y.debug("Updated subscription discount_id",{subscriptionId:o,discountId:a.id}),o):(y.warn("Subscription not found for discount_id update",{subscriptionId:o}),null)}catch(a){return y.error("Failed to update subscription discount_id",{subscriptionId:o,error:a.message}),null}}),i=await Promise.all(n);return r.push(...i.filter(o=>o!==null)),y.info("Completed subscription discount_id reference updates",{requestedUpdates:e.length,successfulUpdates:r.length}),{updatedSubscriptions:r}}catch(n){throw y.error("Error updating subscription discount references",{subscriptionsUpdated:e,error:n.message}),new Error(`Failed to update subscription discount references: ${n.message}`)}}async function FX({checkoutSession:t,customerId:e,subscriptionIds:r=[]}){if(!t.discounts?.length)return{discountRecords:[],updatedCoupons:[],updatedPromotionCodes:[],subscriptionsUpdated:[]};y.info("Creating/updating discount records for checkout session",{checkoutSessionId:t.id,customerId:e,subscriptionIds:r});try{let n=await CAt(e,t.id),i=new Set,o=new Set,a=[],s=[],c=t.discounts.map(async d=>{let{promotion_code:l,coupon:p,discount_amount:f}=d;if(!p)return y.warn("Incomplete discount configuration, skipping",{checkoutSessionId:t.id,hasCoupon:!!p}),null;try{let[m,h]=await Promise.all([Lt.findByPk(p),l?Jt.findByPk(l):Promise.resolve(null)]);if(!m)return y.warn("Coupon not found, skipping discount",{couponId:p,checkoutSessionId:t.id}),null;let g=kAt({checkoutSession:t,customerId:e,coupon:m,promotionCode:h||void 0,discountAmount:f,verificationData:d.verification_data}),_=[],b=!1,E=[];if(r.length>0){let A=r.map(async C=>{try{let L=await PAt({subscriptionId:C,baseDiscountData:g,existingDiscountMap:n,checkoutSessionId:t.id});return L.shouldUpdateUsage&&E.push(C),L.discountRecord}catch(L){return y.error("Failed to process subscription discount, continuing with others",{subscriptionId:C,error:L.message}),null}}),R=await Promise.all(A);_.push(...R.filter(C=>C!==null)),E.length>0&&(b=!0)}else try{let A=await NAt(g,n,t.id);_.push(A.discountRecord),b=A.shouldUpdateUsage}catch(A){throw y.error("Failed to process non-subscription discount",{checkoutSessionId:t.id,error:A.message}),A}if(b)try{await RAt({coupon:m,promotionCode:h||void 0,updatedCoupons:i,updatedPromotionCodes:o,checkoutSessionId:t.id}),await Promise.all(_.map(async A=>{await A.update({confirmed:!0})}))}catch(A){y.error("Failed to update usage counts, but continuing",{couponId:m.id,promotionCodeId:h?.id,error:A.message})}return{discountRecords:_,subscriptionsUpdated:E}}catch(m){return y.error("Error processing discount configuration, skipping",{couponId:p,promotionCodeId:l,checkoutSessionId:t.id,error:m.message}),null}});return(await Promise.all(c)).forEach(d=>{d&&(a.push(...d.discountRecords),s.push(...d.subscriptionsUpdated))}),y.info("All discount records processed successfully",{checkoutSessionId:t.id,customerId:e,totalRecords:a.length,subscriptionCount:r.length,subscriptionsUpdated:s.length,updatedCouponsCount:i.size,updatedPromotionCodesCount:o.size}),{discountRecords:a,updatedCoupons:Array.from(i),updatedPromotionCodes:Array.from(o),subscriptionsUpdated:s}}catch(n){throw y.error("Critical error processing discount records for checkout",{checkoutSessionId:t.id,customerId:e,subscriptionIds:r,error:n.message}),new Error(`Failed to process discount records: ${n.message}`)}}async function lF({promotionCode:t,couponId:e,customerId:r,amount:n,currencyId:i,lineItems:o=[],checkoutSessionId:a}){let s=0;if(a&&(s=await En.count({where:{checkout_session_id:a,promotion_code_id:t.id,confirmed:!0}})),!t.active&&s===0)return{eligible:!1,reason:"This promotion code is no longer available"};if(t.expires_at&&Math.floor(Date.now()/1e3)>t.expires_at)return{eligible:!1,reason:"This promotion code has expired and cannot be used"};if(t.max_redemptions&&(t.times_redeemed??0)-s>=t.max_redemptions)return{eligible:!1,reason:"This promotion code has been fully redeemed and is no longer available"};let c=await Lt.findByPk(e);if(!c)return{eligible:!1,reason:"This promotion is no longer available"};let u=c.valid;s>0&&(c.valid||(c.valid=!0),c.times_redeemed&&c.times_redeemed>0&&(c.times_redeemed-=s));let d=lw(c,o);if(s>0&&(c.valid=u,c.times_redeemed!=null&&(c.times_redeemed+=s)),!d.valid)return{eligible:!1,reason:d.reason};let l=t.active;s>0&&(t.active||(t.active=!0),t.times_redeemed&&t.times_redeemed>0&&(t.times_redeemed-=s));let p=await $X(t,{customerId:r,amount:n,currencyId:i,checkoutSessionId:a});return s>0&&(t.active=l,t.times_redeemed!=null&&(t.times_redeemed+=s)),p.valid?{eligible:!0}:{eligible:!1,reason:p.reason}}async function OAt({discount:t}){let e=await Lt.findByPk(t.coupon_id);if(!e)return{valid:!1,reason:"This discount is no longer available",shouldRemove:!0};let r=Math.floor(Date.now()/1e3);switch(e.duration){case"once":return{valid:!1,reason:"One-time discount cannot be applied to subscription billing",shouldRemove:!0};case"repeating":if(!t.end)return{valid:!1,reason:"Repeating discount missing end date",shouldRemove:!0};if(r>Number(t.end))return{valid:!1,reason:"Repeating discount has expired",shouldRemove:!0};break;case"forever":break;default:return{valid:!1,reason:`Unknown coupon duration: ${e.duration}`,shouldRemove:!0}}return{valid:!0}}async function Qke({subscriptionId:t,customerId:e}){let r=await En.findAll({where:{customer_id:e,subscription_id:t},include:[{model:Lt,as:"coupon"},{model:Jt,as:"promotionCode"}]}),n=[],i=[];return y.info("Found discounts for subscription billing",{subscriptionId:t,discountCount:r.map(o=>o.id)}),await Promise.all(r.map(async o=>{let a=await OAt({discount:o,subscriptionId:t});a.valid?n.push(o):(i.push(o),y.info("Expired discount for subscription billing",{subscriptionId:t,discountId:o.id,reason:a.reason}))})),{validDiscounts:n,expiredDiscounts:i}}async function MX(t,e,r){return e?.length?await Promise.all(t.map(async i=>{if(!i.discount_amounts?.length)return i;let o=await Promise.all(i.discount_amounts.map(async a=>{let s=null,c=null,u=e.find(d=>d.coupon||d.promotion_code);if(u){if(u.coupon){let d=await Lt.findByPk(u.coupon);d&&(s={object:"coupon",id:d.id,name:d.name,amount_off:d.amount_off,percent_off:d.percent_off,currency:d.currency_id,duration:d.duration,duration_in_months:d.duration_in_months,has_applies_to_products:!0})}if(u.promotion_code){let d=await Jt.findByPk(u.promotion_code);d&&(c={object:"promotion_code",id:d.id,code:d.code})}}return{...a,coupon:s,promotion_code:c,currency:r}}));return{...i,discount_amounts:o}})):t}async function aC(t){return t?.length?await Promise.all(t.map(async r=>{let n=null,i=null;if(r.coupon){let o=await Lt.findByPk(r.coupon);o&&(n=Re(o,["id","name","percent_off","amount_off","valid","duration","duration_in_months","currency_id","currency_options"]))}if(r.promotion_code){let o=await Jt.findByPk(r.promotion_code);o&&(i=Re(o,["id","code"]))}return{...r,coupon_details:n,promotion_code_details:i}})):[]}var pw=N(()=>{"use strict";qe();$e();Hr();_e();he();Rn();ke()});async function qy(t){let e=t?.config?.httpEndpoint||"unknown";if(we.address===Zke&&e===ePe&&Cv!==null&&Date.now()-tPe<DAt)return Cv;try{let{state:r}=await t.getAccountState({address:we.address});return Cv=r?.migratedFrom||[],Zke=we.address,ePe=e,tPe=Date.now(),Cv.length>0&&y.info("wallet-migration: loaded migratedFrom list",{walletAddress:we.address,chainHost:e,migratedFrom:Cv}),Cv}catch(r){return y.error("wallet-migration: failed to get migratedFrom list",{walletAddress:we.address,chainHost:e,error:r}),[]}}async function rPe({storedAddress:t,delegator:e,client:r}){let n=r?.config?.httpEndpoint||"unknown";if(t)try{let{state:d}=await r.getDelegateState({address:t});if(d?.ops?.length>0)return{address:t,needsBackfill:!1,source:"stored"};y.warn("wallet-migration: stored delegation address has no valid state, falling back",{storedAddress:t,delegator:e,hasState:!!d,opsCount:d?.ops?.length||0})}catch(d){y.warn("wallet-migration: failed to query stored delegation address, falling back",{storedAddress:t,delegator:e,error:d})}let i=U_(e,we.address),o={hasState:!1,opsCount:0},[a,s]=await Promise.all([r.getDelegateState({address:i}).catch(d=>(o.error=String(d),y.warn("wallet-migration: failed to query current delegation state",{address:i,error:d}),{state:null})),qy(r)]),c=a.state;if(o={hasState:!!c,opsCount:c?.ops?.length||0,error:o.error},(c?.ops?.length??0)>0)return{address:i,needsBackfill:!0,source:"current"};let u=[];if(s.length>0){let d=await Promise.allSettled(s.map(async l=>{let p=U_(e,l),{state:f}=await r.getDelegateState({address:p});return{appDid:l,address:p,state:f}}));for(let l=0;l<d.length;l++){let p=d[l],f=s[l];if(p.status==="fulfilled"){let{address:m,state:h}=p.value;if(u.push({appDid:f,address:m,hasState:!!h,opsCount:h?.ops?.length||0}),(h?.ops?.length??0)>0)return y.info("wallet-migration: found delegation in migratedFrom",{delegator:e,oldAppDid:f,oldAddress:m}),{address:m,needsBackfill:!0,source:"migrated"}}else{let m=U_(e,f);u.push({appDid:f,address:m,hasState:!1,opsCount:0,error:String(p.reason)}),y.warn("wallet-migration: failed to query migrated delegation state",{address:m,oldAppDid:f,error:p.reason})}}}return y.error("wallet-migration: no delegation found after full search",{delegator:e,chainHost:n,currentWalletAddress:we.address,currentDelegationAddress:i,currentStateResult:o,migratedFromCount:s.length,migratedResults:u}),null}async function nPe({storedAddress:t,userDid:e,nonce:r,client:n}){if(t)return{address:t,needsBackfill:!1,source:"stored"};let i=Bu(e,we.address,r);try{let{state:a}=await n.getStakeState({address:i});if(a)return{address:i,needsBackfill:!0,source:"current"}}catch(a){y.warn("wallet-migration: failed to query current stake state",{address:i,error:a})}let o=await qy(n);for(let a of o){let s=Bu(e,a,r);try{let{state:c}=await n.getStakeState({address:s});if(c)return y.info("wallet-migration: found stake in migratedFrom",{userDid:e,nonce:r,oldAppDid:a,oldAddress:s}),{address:s,needsBackfill:!0,source:"migrated"}}catch(c){y.warn("wallet-migration: failed to query migrated stake state",{address:s,oldAppDid:a,error:c})}}return null}async function sC({client:t}){let e=Bu(we.address,we.address);try{let{state:n}=await t.getStakeState({address:e});if(n)return{address:e,needsBackfill:!1,source:"current"}}catch(n){y.warn("wallet-migration: failed to query current app stake state",{address:e,error:n})}let r=await qy(t);for(let n of r){let i=Bu(n,n);try{let{state:o}=await t.getStakeState({address:i});if(o)return y.info("wallet-migration: found app stake in migratedFrom",{oldAppDid:n,oldAddress:i}),{address:i,needsBackfill:!1,source:"migrated"}}catch(o){y.warn("wallet-migration: failed to query migrated app stake state",{address:i,oldAppDid:n,error:o})}}return null}async function iPe(t,e){if(!t)return!1;try{let r=await ee.findByPk(t);if(!r||r.payment_details?.arcblock?.delegation_address)return!1;let n=r.payment_details?.arcblock;return n?(await r.update({payment_details:{...r.payment_details,arcblock:{...n,delegation_address:e}}}),y.info("wallet-migration: backfilled delegation_address",{subscriptionId:r.id,address:e}),!0):(y.info("migration: cannot backfill delegation_address - missing arcblock payment_details",{subscriptionId:r.id}),!1)}catch(r){return y.error("wallet-migration: failed to backfill delegation_address",{subscriptionId:t,address:e,error:r}),!1}}var DAt,Cv,Zke,ePe,tPe,cC=N(()=>{"use strict";j_();Ir();he();_e();DAt=300*1e3,Cv=null,Zke=null,ePe=null,tPe=0});async function uC({lineItems:t,promotionCodeId:e,couponId:r,discountId:n,customerId:i,currency:o,totalAmount:a,billingContext:s}){let c=null;n&&(c=await En.findByPk(n));let u=a??UX(t,o.id,s),d=await Lt.findByPk(c?.coupon_id||r);if(!d)return{enhancedLineItems:t.map(h=>({...h,discountable:!1,discount_amounts:[]})),discountSummary:{appliedCoupon:null,discountAmount:"0",totalDiscountAmount:"0",finalTotal:u},notValidReason:"Coupon not found"};let l=!1,p="";if(e||c?.promotion_code_id){let m=await Jt.findByPk(e||c?.promotion_code_id);if(!m)l=!1;else{let h=await lF({promotionCode:m,couponId:r,customerId:i,amount:u,currencyId:o.id,lineItems:t});l=h.eligible,p=h.reason||""}}else{let m=await lw(d,t);l=m.valid,p=m.reason||""}return l?{...sPe({lineItems:t,coupon:d,discount:c,currency:o,totalAmount:a,billingContext:s}),notValidReason:void 0}:{enhancedLineItems:t.map(h=>({...h,discountable:!1,discount_amounts:[]})),discountSummary:{appliedCoupon:null,discountAmount:"0",totalDiscountAmount:"0",finalTotal:u},notValidReason:p}}function sPe({lineItems:t,coupon:e,discount:r,currency:n,totalAmount:i,billingContext:o}){let a=i??UX(t,n.id,o),s=t.filter(m=>e.applies_to?.products?.length?e.applies_to.products.some(h=>m.price?.product_id===h):!0);if(s.length===0)return{enhancedLineItems:t.map(h=>({...h,discountable:!1,discount_amounts:[]})),discountSummary:{appliedCoupon:null,discountAmount:"0",totalDiscountAmount:"0",finalTotal:a}};let c=s.reduce((m,h)=>{let g=oPe(h,n.id);return new F(m).add(new F(g)).toString()},"0"),u=zke(e,c,n);if(e.amount_off&&(!e.percent_off||e.percent_off<=0)&&u==="0")return{enhancedLineItems:t.map(h=>({...h,discountable:!1,discount_amounts:[]})),discountSummary:{appliedCoupon:null,discountAmount:"0",totalDiscountAmount:"0",finalTotal:a}};let d=new F(u).gt(new F(a))?a:u,l=new F(a).sub(new F(d)),p=l.lt(new F("0"))?"0":l.toString();return{enhancedLineItems:t.map(m=>{if(!s.includes(m))return{...m,discountable:!1,discount_amounts:[]};let g=oPe(m,n.id),_="0";return e.percent_off>0?_=new F(g).mul(new F(e.percent_off)).div(new F(100)).toString():e.amount_off&&c!=="0"&&(_=new F(g).mul(new F(d)).div(new F(c)).toString()),{...m,discountable:!0,discount_amounts:_!=="0"?[{amount:_,coupon:e.id,discount:r?.id}]:[]}}),discountSummary:{appliedCoupon:e.id,discountAmount:d,totalDiscountAmount:d,finalTotal:p}}}async function cPe({lineItems:t,discount:e,currency:r,totalAmount:n,billingContext:i}){let o=await Lt.findByPk(e.coupon_id);if(!o)return y.error("Coupon not found for stored discount",{discountId:e.id,couponId:e.coupon_id}),{enhancedLineItems:t.map(c=>({...c,discountable:!1,discount_amounts:[]})),discountSummary:{appliedCoupon:null,discountAmount:"0",totalDiscountAmount:"0",finalTotal:n??UX(t,r.id,i)}};let a=sPe({lineItems:t,coupon:o,discount:e,currency:r,totalAmount:n,billingContext:i});return y.info("Applied subscription discount",{discountId:e.id,originalTotal:n,discountAmount:a.discountSummary.discountAmount,finalTotal:a.discountSummary.finalTotal}),a}async function aPe(t,e){let r=t.times_redeemed||0;r<=0||(e==="coupon"?await t.update({times_redeemed:r-1,valid:!0}):await t.update({times_redeemed:r-1,active:!0}),y.info("Updated usage for resource",{resourceId:t.id,resourceType:e,currentUsage:r-1}),Lf("discount-status.queued",t,e,!0))}async function dC(t){try{let e=await ve.findByPk(t);if(!e){y.error("Checkout session not found",{checkoutSessionId:t});return}if(e.status==="complete"){y.error("Cannot rollback completed session",{checkoutSessionId:t});return}let r=await En.findAll({where:{checkout_session_id:t},include:[{model:Lt,as:"coupon"},{model:Jt,as:"promotionCode",required:!1}]});if(r.length===0){y.info("No discounts found for checkout session",{checkoutSessionId:t});return}let n=new Map,i=new Map;r.forEach(a=>{a.confirmed&&(a.coupon?.id&&!n.has(a.coupon.id)&&n.set(a.coupon.id,a.coupon),a.promotionCode?.id&&!i.has(a.promotionCode.id)&&i.set(a.promotionCode.id,a.promotionCode))});let o=[...Array.from(i.values()).map(a=>aPe(a,"promotion-code")),...Array.from(n.values()).map(a=>aPe(a,"coupon"))];await Promise.all(o),await Promise.all(r.map(a=>a.destroy()))}catch(e){y.error("Discount rollback failed",{checkoutSessionId:t,error:e.message})}}var UX,oPe,lC=N(()=>{"use strict";qe();_e();Qf();pw();Rn();he();UX=(t,e,r)=>{let n=new F(0);return t.forEach(i=>{let o=i.upsell_price||i.price,a=o?.pricing_type==="dynamic"?i.custom_amount||i.quoted_amount:void 0,s=Yn(o,e);if(!(o?.type==="recurring"&&(r?.trialing||o?.recurring?.usage_type==="metered"))){if(a){n=n.add(new F(a));return}n=n.add(new F(s).mul(new F(i.quantity)))}}),n.toString()},oPe=(t,e)=>{let r=t.upsell_price||t.price,n=r?.pricing_type==="dynamic"?t.custom_amount||t.quoted_amount:void 0;if(n)return new F(n).toString();let i=Yn(r,e);return new F(i).mul(new F(t.quantity)).toString()}});import HX from"crypto";function dPe(t){if(!t)return!1;if(t.name==="SequelizeUniqueConstraintError")return!0;let e=String(t.message||"").toLowerCase();return e.includes("unique constraint")||e.includes("unique violation")}function mF(t){let{contextId:e,priceId:r,currencyId:n,quantity:i,baseAmount:o,salt:a}=t,s=a?`:${a}`:"";return HX.createHash("sha256").update(`${e}:${r}:${n}:${i}:${o}${s}`).digest("hex").substring(0,64)}function Ci(){return qX||(qX=new jX),qX}var uPe,pF,fF,jX,qX,Zf=N(()=>{"use strict";qe();_e();Yf();he();_u();pu();s0();uPe=.5,pF=t=>{if(t==null)return uPe;let e=typeof t=="string"?Number(t):t;return!Number.isFinite(e)||e<0?uPe:e},fF=t=>t.consensus_method?t.consensus_method:t.providers&&t.providers.length>1?"median":"single";jX=class{async getOrCreateQuote(e){let{price_id:r,session_id:n,invoice_id:i,target_currency_id:o,quantity:a,idempotency_key_salt:s}=e;if(!r||!o||!a)throw new zr("INVALID_PARAMS","price_id, target_currency_id, and quantity are required");if(!n&&!i)throw new zr("INVALID_PARAMS","Either session_id or invoice_id must be provided");let c=await ne.findByPk(r);if(!c)throw new zr("PRICE_NOT_FOUND",`Price ${r} not found`);if(c.pricing_type!=="dynamic")throw new zr("INVALID_PRICE_TYPE",`Price ${r} is not a dynamic price`);if(!c.base_currency||!c.base_amount)throw new zr("INVALID_PRICE_CONFIG",`Price ${r} missing base_currency or base_amount`);let u=await W.findByPk(o,{include:[{model:Y,as:"payment_method"}]});if(!u)throw new zr("CURRENCY_NOT_FOUND",`Currency ${o} not found`);if(u.payment_method?.type==="stripe")throw new zr("CURRENCY_NOT_SUPPORTED",`Currency ${o} is not supported`);let d=8,l=Ue(zt(c.base_amount,d),d),p=new F(a),f=l.mul(p),m=lt(f.toString(),d),h=n||i||"",g=mF({contextId:h,priceId:r,currencyId:o,quantity:a,baseAmount:m,salt:s}),_=await Vt.findByIdempotencyKey(g);if(_&&_.canRetry())return y.debug("Reusing existing quote",{quoteId:_.id,idempotencyKey:g,status:_.status}),{quote:_,computed_unit_amount:_.quoted_amount,expires_at:_.expires_at};let b=pF(e.slippage_percent),E=e.min_acceptable_rate,A=gn(),R=Xn(u.symbol,u.payment_method?.type),C=await A.getRate(R),L=Ue(zt(C.rate,d),d),T=f.mul(new F(10).pow(new F(u.decimal))),$=L,U=T.add($).sub(new F(1)).div($),H=ip(U,u.decimal,10),M;if(E&&Number(E)>0){let D=Ue(zt(E,d),d),q=f.mul(new F(10).pow(new F(u.decimal))).add(D).sub(new F(1)).div(D);M=ip(q,u.decimal,10).toString()}else{let D=new F(1e4),q=Math.round(b*100),B=D.add(new F(q));M=H.mul(B).add(D.sub(new F(1))).div(D).toString()}let k=c.dynamic_pricing_config?.lock_duration||180,w=Math.floor(Date.now()/1e3)+k,x={price_id:r,session_id:n||void 0,invoice_id:i||void 0,idempotency_key:g,base_currency:c.base_currency,base_amount:m,target_currency_id:o,rate_currency_symbol:u.symbol,exchange_rate:C.rate,quoted_amount:H.toString(),slippage_percent:b,max_payable_token:M,rate_provider_id:C.provider_id,rate_provider_name:C.provider_name,rate_timestamp_ms:C.timestamp_ms,expires_at:w,status:"active",metadata:{calculation:{total_base_amount_scaled:f.toString(),rate_scaled:L.toString(),quoted_amount_unit:H.toString()},rounding:{mode:"ceil",token_decimals:u.decimal},risk:{anomaly_detected:!1,degraded:C.degraded,degraded_reason:C.degraded_reason||null},rate:{consensus_method:fF(C),providers:C.providers||[]},slippage:{percent:b,min_acceptable_rate:E||void 0,max_payable_token:M},context:{quantity:a,base_amount_per_unit:c.base_amount}}},v=3,P=null,O=null;for(let D=0;D<v;D++)try{P=await Vt.create(x);break}catch(q){if(O=q,dPe(q)){let B=await Vt.findOne({where:{idempotency_key:x.idempotency_key}});if(B&&B.canRetry())return y.warn("Idempotency key collision, reusing existing quote",{quoteId:B.id,idempotencyKey:x.idempotency_key,attempt:D,status:B.status}),{quote:B,computed_unit_amount:B.quoted_amount,expires_at:B.expires_at};if(D>=v-1){y.error("Max retries exceeded for quote creation in getOrCreateQuote",{priceId:r,currencyId:o,attempts:D+1,idempotencyKey:x.idempotency_key});break}let I=`${s||"fallback"}:retry:${D}:${Date.now()}:${HX.randomBytes(4).toString("hex")}`;x.idempotency_key=mF({contextId:h,priceId:r,currencyId:o,quantity:a,baseAmount:m,salt:I}),y.info("Retrying quote creation with new idempotency key",{priceId:r,attempt:D+1,newIdempotencyKey:x.idempotency_key})}else throw q}if(!P)throw O||new Error("Failed to create quote after retries");return y.info("Created new quote",{quoteId:P.id,priceId:r,currencyId:o,baseAmount:m,rate:C.rate,quotedAmount:H.toString(),expiresAt:w}),{quote:P,computed_unit_amount:H.toString(),expires_at:w}}async createQuoteWithRate(e){let{price_id:r,session_id:n,invoice_id:i,target_currency_id:o,quantity:a,rateResult:s,idempotency_key_salt:c,slippage_percent:u,min_acceptable_rate:d}=e;if(!r||!o||!a)throw new zr("INVALID_PARAMS","price_id, target_currency_id, and quantity are required");if(!n&&!i)throw new zr("INVALID_PARAMS","Either session_id or invoice_id must be provided");let l=await ne.findByPk(r);if(!l)throw new zr("PRICE_NOT_FOUND",`Price ${r} not found`);if(l.pricing_type!=="dynamic")throw new zr("INVALID_PRICE_TYPE",`Price ${r} is not a dynamic price`);if(!l.base_currency||!l.base_amount)throw new zr("INVALID_PRICE_CONFIG",`Price ${r} missing base_currency or base_amount`);let p=await W.findByPk(o);if(!p)throw new zr("CURRENCY_NOT_FOUND",`Currency ${o} not found`);let f=8,m=Ue(zt(l.base_amount,f),f),h=new F(a),g=m.mul(h),_=lt(g.toString(),f),b=n||i||"",E=mF({contextId:b,priceId:r,currencyId:o,quantity:a,baseAmount:_,salt:c}),A=await Vt.findByIdempotencyKey(E);if(A&&A.canRetry())return y.debug("Reusing existing quote",{quoteId:A.id,idempotencyKey:E,status:A.status}),{quote:A,computed_unit_amount:A.quoted_amount,expires_at:A.expires_at};let R=Ue(zt(s.rate,f),f),C=g.mul(new F(10).pow(new F(p.decimal))),L=R,T=C.add(L).sub(new F(1)).div(L),$=ip(T,p.decimal,10),U=l.dynamic_pricing_config?.lock_duration||180,H=Math.floor(Date.now()/1e3)+U,M=pF(u),k;if(d&&Number(d)>0){let O=Ue(zt(d,f),f),D=g.mul(new F(10).pow(new F(p.decimal))).add(O).sub(new F(1)).div(O);k=ip(D,p.decimal,10).toString()}else{let O=new F(1e4),D=Math.round(M*100),q=O.add(new F(D));k=$.mul(q).add(O.sub(new F(1))).div(O).toString()}let w={price_id:r,session_id:n||void 0,invoice_id:i||void 0,idempotency_key:E,base_currency:l.base_currency,base_amount:_,target_currency_id:o,rate_currency_symbol:p.symbol,exchange_rate:s.rate,quoted_amount:$.toString(),slippage_percent:M,max_payable_token:k,rate_provider_id:s.provider_id,rate_provider_name:s.provider_name,rate_timestamp_ms:s.timestamp_ms,expires_at:H,status:"active",metadata:{calculation:{total_base_amount_scaled:g.toString(),rate_scaled:R.toString(),quoted_amount_unit:$.toString()},rounding:{mode:"ceil",token_decimals:p.decimal},risk:{anomaly_detected:!1,degraded:s.degraded,degraded_reason:s.degraded_reason||null},rate:{consensus_method:fF(s),providers:s.providers||[]},slippage:{percent:M,min_acceptable_rate:d||void 0,max_payable_token:k},context:{quantity:a,base_amount_per_unit:l.base_amount}}},x=3,v=null,P=null;for(let O=0;O<x;O++)try{v=await Vt.create(w);break}catch(D){if(P=D,dPe(D)){let q=await Vt.findOne({where:{idempotency_key:w.idempotency_key}});if(q&&q.canRetry())return y.warn("Idempotency key collision, reusing existing quote",{quoteId:q.id,idempotencyKey:w.idempotency_key,attempt:O,status:q.status}),{quote:q,computed_unit_amount:q.quoted_amount,expires_at:q.expires_at};if(O>=x-1){y.error("Max retries exceeded for quote creation in createQuoteWithRate",{priceId:r,currencyId:o,attempts:O+1,idempotencyKey:w.idempotency_key});break}let B=`${c||"fallback"}:retry:${O}:${Date.now()}:${HX.randomBytes(4).toString("hex")}`;w.idempotency_key=mF({contextId:b,priceId:r,currencyId:o,quantity:a,baseAmount:_,salt:B}),y.info("Retrying quote creation with new idempotency key",{priceId:r,attempt:O+1,newIdempotencyKey:w.idempotency_key})}else throw D}if(!v)throw P||new Error("Failed to create quote after retries");return y.info("Created new quote with provided rate",{quoteId:v.id,priceId:r,currencyId:o,baseAmount:_,rate:s.rate,quotedAmount:$.toString(),expiresAt:H}),{quote:v,computed_unit_amount:$.toString(),expires_at:H}}async refreshQuoteWithRate(e){let{quote_id:r,price_id:n,session_id:i,invoice_id:o,target_currency_id:a,quantity:s,rateResult:c,slippage_percent:u}=e,d=await Vt.findByPk(r);if(!d)return this.createQuoteWithRate({price_id:n,session_id:i,invoice_id:o,target_currency_id:a,quantity:s,rateResult:c});if(d.status==="paid"||d.status==="used")return{quote:d,computed_unit_amount:d.quoted_amount,expires_at:d.expires_at};if(d.status==="failed")return this.createQuoteWithRate({price_id:n,session_id:i,invoice_id:o,target_currency_id:a,quantity:s,rateResult:c});let l=await ne.findByPk(n);if(!l)throw new zr("PRICE_NOT_FOUND",`Price ${n} not found`);if(l.pricing_type!=="dynamic")throw new zr("INVALID_PRICE_TYPE",`Price ${n} is not a dynamic price`);if(!l.base_currency||!l.base_amount)throw new zr("INVALID_PRICE_CONFIG",`Price ${n} missing base_currency or base_amount`);let p=await W.findByPk(a);if(!p)throw new zr("CURRENCY_NOT_FOUND",`Currency ${a} not found`);let f=8,m=Ue(zt(l.base_amount,f),f),h=new F(s),g=m.mul(h),_=lt(g.toString(),f),b=Ue(zt(c.rate,f),f),E=g.mul(new F(10).pow(new F(p.decimal))),A=b,R=E.add(A).sub(new F(1)).div(A),C=ip(R,p.decimal,10),L=l.dynamic_pricing_config?.lock_duration||180,T=Math.floor(Date.now()/1e3)+L,$=pF(u);return await d.update({base_currency:l.base_currency,base_amount:_,target_currency_id:a,rate_currency_symbol:p.symbol,exchange_rate:c.rate,quoted_amount:C.toString(),slippage_percent:$,rate_provider_id:c.provider_id,rate_provider_name:c.provider_name,rate_timestamp_ms:c.timestamp_ms,expires_at:T,status:"active",metadata:{calculation:{total_base_amount_scaled:g.toString(),rate_scaled:b.toString(),quoted_amount_unit:C.toString()},rounding:{mode:"ceil",token_decimals:p.decimal},risk:{anomaly_detected:!1,degraded:c.degraded,degraded_reason:c.degraded_reason||null},rate:{consensus_method:fF(c),providers:c.providers||[]},slippage:{percent:$},context:{quantity:s,base_amount_per_unit:l.base_amount}}}),{quote:d,computed_unit_amount:d.quoted_amount,expires_at:d.expires_at}}async validateAndConsume(e,r){let n=await Vt.findOne({where:{id:e},lock:r?r.LOCK.UPDATE:void 0,transaction:r});if(!n)throw new zr("QUOTE_NOT_FOUND",`Quote ${e} not found`);if(!n.canRetry())throw new zr("QUOTE_INVALID",`Quote ${e} cannot be used (status: ${n.status})`);return n}async markAsPaid(e,r){let n=await Vt.findByPk(e,{transaction:r});if(!n){y.warn("Quote not found when marking as paid",{quoteId:e});return}await n.markAsPaid(r)}async markQuotesAsPaidByInvoice(e,r){let n=await Vt.findAll({where:{invoice_id:e},transaction:r});if(n.length===0)return[];let i=[];return await Promise.all(n.map(async o=>{o.status!=="paid"&&(await o.markAsPaid(r),i.push(o.id))})),i.length>0&&y.info("Marked quotes as paid by invoice",{invoiceId:e,quoteIds:i}),i}expireOldQuotes(){return y.info("expireOldQuotes called but quotes no longer expire (Final Freeze)"),0}async createUsedQuoteWithValidation(e){let{price_id:r,session_id:n,invoice_id:i,idempotency_key:o,target_currency_id:a,quantity:s,preview_rate:c,slippage_percent:u,price_confirmed:d=!1}=e,l=await Vt.findByIdempotencyKey(o);if(l)return y.info("Idempotent submit: returning existing quote",{quoteId:l.id,idempotencyKey:o,status:l.status}),{quote:l,validation_passed:!0};let p=await ne.findByPk(r);if(!p)throw new zr("PRICE_NOT_FOUND",`Price ${r} not found`);if(p.pricing_type!=="dynamic")throw new zr("INVALID_PRICE_TYPE",`Price ${r} is not a dynamic price`);if(!p.base_currency||!p.base_amount)throw new zr("INVALID_PRICE_CONFIG",`Price ${r} missing base_currency or base_amount`);let f=await W.findByPk(a,{include:[{model:Y,as:"payment_method"}]});if(!f)throw new zr("CURRENCY_NOT_FOUND",`Currency ${a} not found`);if(f.payment_method?.type==="stripe")throw new zr("CURRENCY_NOT_SUPPORTED",`Currency ${a} is not supported for dynamic pricing`);let m=gn(),h=Xn(f.symbol,f.payment_method?.type),g;try{g=await m.getRate(h)}catch(D){return y.error("Failed to fetch exchange rate for submit",{priceId:r,currencyId:a,error:D.message}),{quote:null,validation_passed:!1,error_code:"PRICE_UNAVAILABLE",error_message:"Unable to fetch exchange rate. Please try again later."}}let _=pF(u),b=bke({rate:g.rate,timestamp_ms:g.timestamp_ms,provider_id:g.provider_id,provider_name:g.provider_name,degraded:g.degraded,degraded_reason:g.degraded_reason,providers:g.providers,consensus_method:g.consensus_method},h,c,_,d);if(!b.passed)return y.info("Submit validation failed",{priceId:r,currencyId:a,errorCode:b.error_code,errorMessage:b.error_message,changePercent:b.slippage_validation?.change_percent}),{quote:null,validation_passed:!1,error_code:b.error_code,error_message:b.error_message,change_percent:b.slippage_validation?.change_percent};let E=8,A=Ue(zt(p.base_amount,E),E),R=new F(s),C=A.mul(R),L=lt(C.toString(),E),T=Ue(zt(g.rate,E),E),$=C.mul(new F(10).pow(new F(f.decimal))),U=T,H=$.add(U).sub(new F(1)).div(U),M=ip(H,f.decimal,10),k=1e4,w=Math.round(_*100),x=M.mul(new F(k+w)).add(new F(k-1)).div(new F(k)),v=T.mul(new F(k-w)).div(new F(k)),P={price_id:r,session_id:n,invoice_id:i,idempotency_key:o,base_currency:p.base_currency,base_amount:L,target_currency_id:a,rate_currency_symbol:f.symbol,exchange_rate:g.rate,quoted_amount:M.toString(),rate_provider_id:g.provider_id,rate_provider_name:g.provider_name,rate_timestamp_ms:g.timestamp_ms,slippage_percent:_,max_payable_token:x.toString(),min_acceptable_rate:lt(v.toString(),E),metadata:{calculation:{total_base_amount_scaled:C.toString(),rate_scaled:T.toString(),quoted_amount_unit:M.toString()},rounding:{mode:"ceil",token_decimals:f.decimal},risk:{anomaly_detected:!1,degraded:g.degraded,degraded_reason:g.degraded_reason||null},rate:{consensus_method:fF(g),providers:g.providers||[]},slippage:{percent:_,max_payable_token:x.toString(),min_acceptable_rate:lt(v.toString(),E),derived_at_ms:Date.now()},context:{quantity:s,base_amount_per_unit:p.base_amount,preview_rate:c,price_confirmed:d}}},O=await Vt.createUsedQuote(P);return y.info("Created used quote at submit (Final Freeze)",{quoteId:O.id,priceId:r,currencyId:a,baseAmount:L,rate:g.rate,quotedAmount:M.toString(),status:O.status,idempotencyKey:o}),{quote:O,validation_passed:!0}}async markAsPaymentFailed(e,r){let n=await Vt.findByPk(e,{transaction:r});if(!n)throw new Error(`Quote ${e} not found`);await n.markAsPaymentFailed(r)}},qX=null});function lPe(t,e=Hy){let r=Number(t);return!Number.isFinite(r)||r<0?e:r}function em(t,e=Hy){let r=t?.slippage;if(!r||typeof r!="object")return null;let n=r.mode==="rate"?"rate":"percent",i=lPe(r.percent,e);return{mode:n,percent:i,min_acceptable_rate:r.min_acceptable_rate,base_currency:r.base_currency,updated_at_ms:r.updated_at_ms}}function BAt(t,e,r=Hy){let n=t.slippage_percent??t.metadata?.slippage?.percent,i=em(e?.metadata,r)?.percent,o=e?.slippage_percent;return lPe(n??i??o??r,r)}function pPe(t){let{quote:e,checkoutSession:r,nowMs:n=Date.now()}=t;if(!e.quoted_amount||!e.exchange_rate)return null;let i=r?.metadata?.slippage,o=i?.mode==="rate"&&i?.min_acceptable_rate,a=BAt(e,r),s=Math.round(a*100),c=fw.add(new F(s)),d=new F(e.quoted_amount).mul(c).add(fw.sub(new F(1))).div(fw),l;if(o)l=i.min_acceptable_rate;else{let m=Ue(zt(e.exchange_rate,8),8).mul(fw).div(c);l=lt(m.toString(),8)}return{percent:a,max_payable_token:d.toString(),min_acceptable_rate:l,derived_at_ms:n}}function jy(t,e){let r=Number(t),n=Number(e);return!Number.isFinite(r)||!Number.isFinite(n)?!1:r<n}function fPe(t,e){if(!e||e<=0)return t;let r=Math.round(e*100),n=fw.add(new F(r));return t.mul(n).add(fw.sub(new F(1))).div(fw)}var fw,Hy,Gy=N(()=>{"use strict";qe();pu();fw=new F(1e4),Hy=.5});function kv(t){return t.type==="recurring"&&t.recurring?.usage_type==="metered"&&!!t.recurring?.meter_id}function GX(t){return t.every(e=>e.price&&kv(e.price))}function qo(t){return t.upsell_price||t.price}var Pv=N(()=>{"use strict"});function mw(t){for(let e of t)if(e.price?.product?.statement_descriptor)return e.price?.product?.statement_descriptor;return Kt.appName}function yPe(t=[]){return t.length===0||t.every(e=>e.price.type==="recurring"&&e.price.recurring?.usage_type==="metered")?"setup":t.some(e=>e.price.type==="recurring")?"subscription":"payment"}async function I0(t,e,r=!1,n){let i=t,o=new F(0);if(t.find(l=>(l.upsell_price||l.price).custom_unit_amount)&&t.length>1)throw new Error("Multiple items with custom unit amount are not supported");if(n?.couponId&&n?.customerId)try{let l=await W.findByPk(e);if(l){let p=await uC({lineItems:t,promotionCodeId:n.promotionCodeId,couponId:n.couponId,customerId:n.customerId,currency:l,billingContext:{trialing:r}});p.discountSummary.appliedCoupon&&(i=p.enhancedLineItems)}}catch(l){console.warn("Failed to apply discounts in getCheckoutAmount:",l.message)}let a=await i.reduce(async(l,p)=>{let f=await l,m=p.upsell_price||p.price,h=m?.type==="recurring",g=h&&(r||m?.recurring?.usage_type==="metered");if(p.custom_amount)return h&&(o=o.add(new F(p.custom_amount))),g?f:f.add(new F(p.custom_amount));if(p.quote_id)try{let E=await Vt.findByPk(p.quote_id);if(E)return y.info("Using quoted_amount from quote_id for checkout amount calculation",{priceId:p.price.id,quoteId:p.quote_id,quotedAmount:E.quoted_amount}),h&&(o=o.add(new F(E.quoted_amount))),g?f:f.add(new F(E.quoted_amount));y.warn("Quote not found for quote_id in line_item",{priceId:p.price.id,quoteId:p.quote_id})}catch(E){y.error("Failed to fetch quote for quote_id",{priceId:p.price.id,quoteId:p.quote_id,error:E.message})}let _=Yn(m,e),b=new F(_).mul(new F(p.quantity));return m.custom_unit_amount&&_?(h&&(o=o.add(b)),g?f:f.add(b)):h&&(o=o.add(b),g)?f:f.add(b)},Promise.resolve(new F(0))).then(l=>l.toString()),s=new F(0);i.forEach(l=>{l.discount_amounts?.length>0&&l.discount_amounts.forEach(p=>{s=s.add(new F(p.amount||"0"))})});let c=s.gt(new F(a))?new F(a):s,u=new F(a).sub(c),d=u.lt(new F("0"))?"0":u.toString();return{subtotal:a||"0",total:d,renew:o.toString()||"0",discount:c.toString(),shipping:"0",tax:"0",processedItems:i}}function pC(t){let{interval:e}=t||{};if(!e)return 0;let r=+t.interval_count||1,n=1440*60*1e3;switch(e){case"hour":return 3600*1e3;case"day":return r*n;case"week":return r*7*n;case"month":return r*30*n;case"year":return r*365*n;default:return 0}}function $s(t,e,r,n){return t.forEach(i=>{i.price=r.find(o=>o.id===i.price_id),i.price&&(i.price.product=e.find(o=>o.id===i.price.product_id),i.price.product?.type==="credit"&&i.price.metadata?.credit_config&&(i.price.credit={amount:Number(i.price.metadata.credit_config.credit_amount||0)*Number(i.quantity),currency_id:i.price.metadata.credit_config.currency_id,currency:n?.find(o=>o.id===i.price.metadata.credit_config.currency_id)}))}),t}function $At(t,e){return t.payment_currencies=t.payment_currencies.filter(r=>e(r)),t}function hPe(t,e){return Vn(t).map(n=>$At(n,e)).filter(n=>n.payment_currencies.length)}function fC(t){let e=t.reduce((r,n)=>{let i=n.upsell_price||n.price;return i?r.concat(Sv(i).map(o=>o.currency_id)):r},[]);return Array.from(new Set(e))}function VX(t,e){let r=t.map(i=>i.upsell_price||i.price),n=Sv(r[e]).map(i=>i.currency_id).sort();for(let i=0;i<e;i++){let o=Sv(r[i]).map(a=>a.currency_id).sort();if($ke(n,o)===!1)return!1}return!0}function LAt(t,e){let r=t.map(i=>i.upsell_price||i.price);if(r[e]?.type!=="recurring")return!0;let n=r.slice(0,e).find(i=>i?.type==="recurring")?.recurring;return n?r.slice(0,e+1).every(i=>i.type!=="recurring"?!0:!(String(n?.interval)!==String(i.recurring?.interval)||Number(n?.interval_count)!==Number(i.recurring?.interval_count))):!0}function Nv(t,e){let r=VX(t,e),n=LAt(t,e);return{currency:r,recurring:n,aligned:r&&n}}function hF(t,e){if(t.id===e.id||t.product_id!==e.product_id||e.active===!1||e.type!=="recurring")return!1;let r=pC(t.recurring),n=pC(e.recurring);if(!r||!n||r>=n)return!1;let i=new F(t.unit_amount).div(new F(r)),o=new F(e.unit_amount).div(new F(n));return!i.lt(o)}async function Aa({items:t,mode:e,currencyId:r,trialing:n=!1,minimumCycle:i=1,discountConfig:o}){(!i||i<1)&&(i=1);let{total:a,renew:s}=await I0(t,r,n,o);return e==="payment"||e==="auto-recharge-auth"?a:e==="setup"?new F(s).mul(new F(i)).toString():e==="subscription"?new F(a).add(new F(s).mul(new F(n?i:i-1))).toString():"0"}function Rv(t={}){if(t?.billing_threshold_amount){let r=+t.billing_threshold_amount;if(r>0)return r}let e=nH();return e>0?e:0}function Ov(t={}){if(t?.min_stake_amount){let r=+t.min_stake_amount;if(r>0)return r}let e=iH();return e>0?e:0}async function KX(t,e){if(t.length===0)return!0;let r=[we.address];if(e?.type==="arcblock"){let n=e.getOcapClient(),i=await qy(n);r=[we.address,...i]}return t.every(n=>r.includes(n.address))}function WX(t,e){if(e.length){let r=e.reduce((i,o)=>i+parseInt(o.share,10),0),n=[];return e.forEach((i,o)=>{let a=new F(t).div(new F(r)).mul(new F(i.share)).toString();o===e.length-1&&(a=n.reduce((s,c)=>s.sub(new F(c.share)),new F(t)).toString()),n.push({...i,share:a})}),n}return[]}function gPe(t,e,r){return r.length?r.map(n=>({owner:n.address,assets:[],tokens:[{address:e,value:n.share}]})):[{owner:we.address,assets:[],tokens:[{address:e,value:t}]}]}function gF(t){return t.submit_type==="donate"||t.metadata?.type==="donation"||!!t.metadata?.is_donation}function zX(t,e=3){let r=t.map(n=>n.price?.product?.name||"").filter(Boolean);return r.length>e?`${r.slice(0,e).join(", ")} ...`:r.join(", ")}function ko(t,e,r=0,n=0,i){let o=typeof i=="number"?{percent:i}:i||{percent:yF},a=new F(0),s=!1,c=new F(0);if(y.debug("getSubscriptionCreateSetup: items check",{itemCount:t.length,items:t.map(_=>({price_id:_.price?.id,upsell_price_id:_.upsell_price?.id,has_upsell:!!_.upsell_price,selected_price_id:qo(_)?.id,price_base_amount:_.price?.base_amount,upsell_base_amount:_.upsell_price?.base_amount}))}),t.forEach(_=>{let b=qo(_),E;if(_.custom_amount)E=new F(_.custom_amount);else{let A=Yn(b,e);E=new F(A).mul(new F(_.quantity))}if(b.pricing_type==="dynamic"&&(s=!0,b.base_amount)){let R=Ue(b.base_amount,Jy).mul(new F(_.quantity));c=c.add(R),y.debug("getSubscriptionCreateSetup: processing dynamic pricing item",{priceId:b.id,baseAmount:b.base_amount,quantity:_.quantity,contributionUSD:lt(R.toString(),Jy)})}b.type==="recurring"&&b.recurring?.usage_type==="licensed"&&(a=a.add(E)),b.type==="one_time"&&(a=a.add(E))}),s&&a.gt(new F(0))){let{percent:_,minAcceptableRate:b,currencyDecimal:E}=o;if(b&&Number(b)>0&&E!==void 0&&c.gt(new F(0))){let A=Ue(b,Jy);A.gt(new F(0))&&(a=c.mul(new F(10).pow(new F(E))).add(A).sub(new F(1)).div(A),y.info("Applied subscription authorization with min_acceptable_rate",{hasDynamicPricing:s,authorizationAmountRaw:a.toString(),authorizationAmountDisplay:lt(a.toString(),E),minAcceptableRate:b,totalBaseAmountUSD:lt(c.toString(),Jy),currencyDecimal:E}))}else{let A=Number.isFinite(_)&&_>=0?_:yF,R=new F(Math.round(1e3+A*10)),C=new F(1e3);a=a.mul(R).div(C),y.info("Applied subscription authorization slippage protection",{hasDynamicPricing:s,authorizationAmount:a.toString(),slippageRate:`${A}%`})}}let u=se().unix(),d=t.find(_=>qo(_)?.type==="recurring"),l=d?qo(d)?.recurring:void 0,p=pC(l),f=0,m=0;+n&&n>u?(f=u,m=n):r&&(f=u,m=se().add(r,"day").unix());let h=f||u,g=m||se().add(p,"millisecond").unix();return{recurring:l,cycle:{duration:p,anchor:g},trial:{start:f,end:m},period:{start:h,end:g},amount:{setup:a.toString()}}}async function _Pe({checkoutSession:t,lineItems:e,customer:r,paymentSettings:n,setupIntent:i,trialConfig:o={}}){let a=t.enable_subscription_grouping,s=XX(e);if(s.length===0)return y.info("No recurring items found for subscription",{session:t.id}),{subscriptions:[],subscriptionGroups:{},primarySubscription:null};try{return a?await MAt({checkoutSession:t,lineItems:e,customer:r,paymentSettings:n,setupIntent:i,trialConfig:o}):await FAt({checkoutSession:t,lineItems:s,customer:r,paymentSettings:n,setupIntent:i,trialConfig:o})}catch(c){throw y.error("Failed to create subscriptions",{error:c.message,session:t.id,stack:c.stack}),c}}async function FAt(t){let{checkoutSession:e,lineItems:r,customer:n,paymentSettings:i,setupIntent:o,trialConfig:a}=t,s=e.subscription_id,c=await bPe({existingSubscriptionId:s,checkoutSession:e,lineItems:r,customer:n,paymentSettings:i,setupIntent:o,trialConfig:a});return y.info("Single subscription processed",{session:e.id,subscription:c?.id,isNew:!s}),{subscriptions:c?[c]:[],subscriptionGroups:{},primarySubscription:c}}async function MAt(t){let{checkoutSession:e,lineItems:r,customer:n,paymentSettings:i,setupIntent:o,trialConfig:a}=t,s=wPe(r),c=e.subscription_groups||{},u=[],d={},l=null,p=!!e.subscription_data?.no_stake,f=Rv(e.subscription_data),m=Ov(e.subscription_data),h=Object.entries(s).map(([_,b],E)=>async()=>{try{let A=c[_],R=E===0,C={price_id:_,checkout_session_id:e.id,...R?{is_primary_subscription:!0}:{}},L=b,T={};R?T={amount_gte:f,stake_gte:m,reset_billing_cycle_anchor:!1,no_stake:p}:T={amount_gte:0,stake_gte:0,reset_billing_cycle_anchor:!1,no_stake:!0,references_primary_stake:!0};let $=await bPe({existingSubscriptionId:A,checkoutSession:e,lineItems:L,customer:n,paymentSettings:i,setupIntent:o,trialConfig:a,metadata:C,billing_thresholds:T});return $?{success:!0,priceId:_,subscription:$,isPrimary:R}:{success:!1,priceId:_,error:"Failed to create subscription"}}catch(A){return y.error("Failed to create subscription for price group",{priceId:_,error:A.message,session:e.id,stack:A.stack}),{success:!1,priceId:_,error:A.message}}});return(await(0,JX.default)(h,{concurrency:5})).forEach(_=>{_.success&&_.subscription&&(d[_.priceId]=_.subscription.id,u.push(_.subscription),_.isPrimary&&(l=_.subscription))}),{subscriptions:u,subscriptionGroups:d,primarySubscription:l}}async function bPe(t){let{existingSubscriptionId:e,checkoutSession:r,lineItems:n,customer:i,paymentSettings:o,setupIntent:a,trialConfig:s={},metadata:c={},billing_thresholds:u}=t,{trialInDays:d=0,trialEnd:l=0}=s,{method:p,currency:f}=o,m=_=>{let b=typeof _=="string"?Number(_):_;return!Number.isFinite(b)||b<0?yF:b},g=(()=>{let _=c?.slippage;if(_&&typeof _=="object"){let A=_.mode==="rate"?"rate":"percent",R=m(_.percent),C=typeof _.min_acceptable_rate=="string"?_.min_acceptable_rate:void 0,L=typeof _.base_currency=="string"?_.base_currency:void 0,T=Number.isFinite(Number(_.updated_at_ms))?Number(_.updated_at_ms):void 0;return{mode:A,percent:R,...C?{min_acceptable_rate:C}:{},...L?{base_currency:L}:{},...T?{updated_at_ms:T}:{}}}let b=em(r.metadata,yF);return b||{mode:"percent",percent:m(r.slippage_percent)}})();try{let _=UAt(n),b=null,E={percent:g.percent,minAcceptableRate:g.min_acceptable_rate,currencyDecimal:f.decimal},A=ko(n,f.id,d,l,E);if(e&&(b=await ee.findByPk(e)),b){if(b.status!=="incomplete")throw new Error(`Subscription ${b.id} status not incomplete: ${b.status}`);let R=_?.billing_cycle_anchor||r.subscription_data?.billing_cycle_anchor||A.cycle.anchor;b=await b.update({currency_id:f.id,customer_id:i.id,default_payment_method_id:p.id,current_period_start:A.period.start,current_period_end:A.period.end,billing_cycle_anchor:R,trial_end:A.trial.end,trial_start:A.trial.start,pending_invoice_item_interval:A.recurring,pending_setup_intent:a?.id,slippage_config:g}),y.info("Subscription updated",{session:r.id,subscription:b.id}),await He.destroy({where:{subscription_id:b.id}}),await mPe(b.id,n,r,_);let C=await ce.findByPk(b.latest_invoice_id);C&&C.customer_id!==i.id&&await C.update({customer_id:i.id})}else{let R=_.recovered_from||r.subscription_data?.recovered_from||"",C=R?await ee.findByPk(R):null,L={...r.subscription_data?.notification_settings?{notification_settings:r.subscription_data.notification_settings}:{},...hu(r.metadata||{},["days_until_due","days_until_cancel","page_info"]),..._.metadata||{},...c},T={...r.subscription_data,..._},$=u||{amount_gte:Rv(T),stake_gte:Ov(T),reset_billing_cycle_anchor:!1,no_stake:T.no_stake};b=await ee.create({livemode:!!r.livemode,currency_id:f.id,customer_id:i.id,status:"incomplete",current_period_start:A.period.start,current_period_end:A.period.end,billing_cycle_anchor:T.billing_cycle_anchor||A.cycle.anchor,start_date:se().unix(),trial_end:A.trial.end,trial_start:A.trial.start,trial_settings:{end_behavior:{missing_payment_method:"create_invoice"}},billing_thresholds:$,pending_invoice_item_interval:A.recurring,pending_setup_intent:a?.id,default_payment_method_id:p.id,cancel_at_period_end:!1,collection_method:"charge_automatically",slippage_config:g,description:T.description||zX(n),proration_behavior:T.proration_behavior||"none",payment_behavior:"default_incomplete",days_until_due:T.days_until_due,days_until_cancel:T.days_until_cancel,recovered_from:C?.id,metadata:L,service_actions:T.service_actions||[]}),y.info("Subscription created",{session:r.id,subscription:b.id}),await mPe(b.id,n,r,_)}return b}catch(_){throw y.error("Failed in createOrUpdateSubscription",{existingSubscriptionId:e,error:_.message,stack:_.stack,session:r.id}),_}}async function mPe(t,e,r,n){try{let i={...n?.metadata||{},...r.metadata||{}},o=await Promise.all(e.map(a=>He.create({livemode:!!r.livemode,subscription_id:t,price_id:a.upsell_price_id||a.price_id,quantity:a.quantity,metadata:i})));return y.info("Subscription items created",{session:r.id,subscription:t,items:o.map(a=>a.id)}),o}catch(i){throw y.error("Failed to create subscription items",{subscriptionId:t,error:i.message,stack:i.stack,session:r.id}),i}}function wPe(t){let e={};return XX(t).forEach(n=>{let i=n.upsell_price_id||n.price_id;e[i]||(e[i]=[]),e[i].push(n)}),e}function is(t){return!t.enable_subscription_grouping&&t.subscription_id?[t.subscription_id]:Object.values(t.subscription_groups||{}).filter(Boolean)}function _F(t){return t.filter(e=>e.price?.type==="one_time")}function XX(t){return t.filter(e=>e.price?.type==="recurring")}function UAt(t){if(t.length===0)return{};let e={},r={};return t.forEach(n=>{let i=n.subscription_data||{};i.metadata&&Object.assign(r,i.metadata),Object.entries(i).forEach(([o,a])=>{o!=="metadata"&&(e[o]=a)})}),Object.keys(r).length>0&&(e.metadata=r),e}async function bF(t,e,r){let n=await He.findAll({where:{subscription_id:t.id}}),i=e.filter(o=>n.some(a=>a.price_id===o.price_id||a.price_id===o.upsell_price_id));return r&&t.id===r.id&&(i=[...i,..._F(e)]),i}function xPe(t,e){let r=Ue(.5,e.decimal);return new F(t).gte(new F(r))}async function EPe(t,e,r){let n=r.enable_subscription_grouping,i=_F(t),o=XX(t),a=t.some(u=>(u.upsell_price||u.price)?.pricing_type==="dynamic"),s=t.some(u=>{let d=u.upsell_price||u.price;return!d?.pricing_type||d?.pricing_type==="fixed"});if(a&&s)return{valid:!1,error:"Cannot mix fixed pricing and dynamic pricing in the same checkout session"};let c=Ue(.5,e.decimal);if(o.length===0&&i.length>0){let{total:u}=await I0(t,e.id);return new F(u).lt(new F(c))?{valid:!1,error:"Total payment amount must be greater or equal to 0.5 USD"}:{valid:!0}}if(o.length>0)if(n){let u=wPe(t);for(let[d,l]of Object.entries(u)){if((l[0]?.upsell_price||l[0]?.price)?.recurring?.usage_type==="metered")continue;let f=new F(0);if(l.forEach(m=>{let h=m.upsell_price||m.price,g=Yn(h,e.id);f=f.add(new F(g).mul(new F(m.quantity)))}),f.lt(new F(c)))return{valid:!1,error:`product "${l[0]?.price?.product?.name||`Product ${d}`}" unit price must be greater or equal to 0.5 USD`}}}else{let u=o.filter(d=>(d.upsell_price||d.price)?.recurring?.usage_type!=="metered");if(u.length>0){let{renew:d}=await I0(u,e.id);if(new F(d).lt(new F(c)))return{valid:!1,error:"Total subscription amount must be greater or equal to 0.5 USD"}}}return{valid:!0}}async function vPe(t,e){if(!e||!Array.isArray(e)||e.length===0)return[];if(!await W.findByPk(t.currency_id))throw new Error("Currency not found");let n=[],i=await ne.expand(t.line_items||[],{product:!0,upsell:!0}),o=e.map((s,c)=>async()=>{if(!s.coupon)throw new Error(`Coupon ID is required for discount at index ${c}`);let u=await Lt.findByPk(s.coupon);if(!u)throw new Error(`Coupon '${s.coupon}' not found`);let d=lw(u,i);if(!d.valid)throw new Error(`Coupon '${s.coupon}' is not valid: ${d.reason}`);return{coupon:u.id,verification_method:"direct"}}),a=await(0,JX.default)(o,{concurrency:5});return n.push(...a),n}async function C0(t){let{discounts:e}=t,r=t.amount_subtotal||"0",n=t.amount_total||"0",i=t.total_details||{amount_discount:"0",amount_shipping:"0",amount_tax:"0"};if(!e||e.length===0)return{amount_subtotal:r,amount_total:n,total_details:{amount_discount:i.amount_discount||"0",amount_shipping:i.amount_shipping||"0",amount_tax:i.amount_tax||"0"}};let o=n,a=new F("0"),s=e.map(async l=>{if(!l.coupon)return new F("0");let p=await Lt.findByPk(l.coupon);if(!p||!p.valid)return new F("0");let f=new F("0"),m=new F(o);return p.percent_off>0?f=m.mul(new F(p.percent_off)).div(new F(100)):p.amount_off&&new F(p.amount_off).gt(new F("0"))&&(f=new F(p.amount_off)),f.gt(m)&&(f=m),f});a=(await Promise.all(s)).reduce((l,p)=>l.add(p),new F("0")),a.gt(new F(o))&&(a=new F(o));let u=new F(o).sub(a),d=u.lt(new F("0"))?"0":u.toString();return{amount_subtotal:r,amount_total:d,total_details:{amount_discount:a.toString(),amount_shipping:i.amount_shipping||"0",amount_tax:i.amount_tax||"0"},discounts:e}}function HAt(t,e){let r=Ue(zt(t,Jy),Jy),n=new F(e),i=r.mul(n);return lt(i.toString(),Jy)}async function mC(t,e,r,n={}){let{skipGeneration:i=!1,forceRefresh:o=!1}=n,a=Ci(),s=e.filter(D=>!D.price);s.length>0&&y.error("Line items with missing price detected - possible data integrity issue",{sessionId:t.id,invalidPriceIds:s.map(D=>D.price_id),totalItems:e.length,invalidCount:s.length});let c=e.filter(D=>D.price);if(c.length===0)return y.warn("No valid line items with price found",{sessionId:t.id}),{lineItems:e,quotes:{},refreshed:!1};let u={},d=c.filter(D=>D.quote_id),l=Math.floor(Date.now()/1e3),p=t.metadata?.quote_locked_at,f=typeof p=="number"?p:typeof p=="string"?Number(p):null,m=Number.isFinite(f)&&l-f<qAt,h=t.metadata?.slippage?.percent??t.slippage_percent,g=Number(h),_=Number.isFinite(g)?g:.5,b=new Map,E=new Set,A=!1,R=!1,C=!1,L=!1,T=!1,$=(D,q)=>{D.custom_amount=q.quoted_amount,D.quoted_amount=q.quoted_amount,D.quote_id=q.id,D.exchange_rate=q.exchange_rate,D.rate_provider_name=q.rate_provider_name,D.rate_provider_id=q.rate_provider_id,D.rate_timestamp_ms=q.rate_timestamp_ms,D.expires_at=q.expires_at,D.quote_currency_id=q.target_currency_id;let B=`${D.price?.id||D.price_id}_${r}`;u[B]={quote_id:q.id,expires_at:q.expires_at,quoted_amount:q.quoted_amount,exchange_rate:q.exchange_rate,rate_provider_name:q.rate_provider_name,rate_provider_id:q.rate_provider_id}};if(d.length>0){let D=Array.from(new Set(d.map(B=>B.quote_id).filter(Boolean))),q=await Vt.findAll({where:{id:D}});if(q.forEach(B=>{b.set(B.id,B)}),q.length!==D.length&&(C=!0,y.warn("Some quote references are missing from database",{sessionId:t.id,totalQuoteIds:D.length,foundQuotes:q.length})),d.forEach(B=>{let I=B.quote_id,j=b.get(I);if(!j){i||E.add(I);return}let K=j.status==="paid",X=j.status==="used";if(K||X&&(m||i)){$(B,j);return}if(X&&!m&&!i){A=!0,E.add(I),y.info("Detected used quote with expired lock, will refresh",{sessionId:t.id,quoteId:I,status:j.status});return}if(o&&!i){m?y.info("Skip force refresh due to active quote lock",{sessionId:t.id,quoteId:I}):(E.add(I),y.info("Force refresh quote for checkout session",{sessionId:t.id,quoteId:I}));return}let Z=B.upsell_price||B.price;if(!i&&!m&&j.status!=="paid"&&Z?.pricing_type==="dynamic"&&Z?.base_amount){let Q=HAt(Z.base_amount,Number(B.quantity||0)),ae=zt(Q,Jy),de=zt(j.base_amount||"0",Jy);if(de!==ae){R=!0,E.add(I),y.info("Detected quote base_amount mismatch, will refresh quote",{sessionId:t.id,quoteId:I,priceId:B.price_id||B.price?.id,expectedBaseAmount:ae,quoteBaseAmount:de,quantity:B.quantity});return}}let ie=j.status!=="paid"&&(j.expires_at<l||j.status==="expired");if(!i&&!m&&ie){A=!0,E.add(I),y.info("Detected expired quote",{sessionId:t.id,expiredQuoteId:j.id,expiresAt:new Date(j.expires_at*1e3).toISOString(),now:new Date(l*1e3).toISOString()});return}let ue=j.status!=="active"&&j.status!=="paid";if(!i&&!m&&ue){A=!0,E.add(I),y.info("Detected inactive quote, will refresh",{sessionId:t.id,quoteId:j.id,status:j.status});return}$(B,j)}),y.info("Processed existing quotes from database",{sessionId:t.id,totalQuoteIds:d.length,foundQuotes:b.size,hasExpiredQuotes:A,hasStaleQuotes:R,hasMissingQuotes:C,skipGeneration:i,refreshQuotes:E.size}),i||E.size===0)return{lineItems:e,quotes:u,refreshed:!1}}let U=c.filter(D=>qo(D)?.pricing_type==="dynamic"&&(D.quote_id?E.has(D.quote_id):!0));if(U.length===0)return{lineItems:e,quotes:u,refreshed:!1};if(i)return y.info("Skipping quote generation for dynamic items (skipGeneration enabled)",{sessionId:t.id,dynamicItemsWithoutQuotes:U.length}),{lineItems:e,quotes:u,refreshed:!1};let H=await W.findByPk(r,{include:[{model:Y,as:"payment_method"}]});if(!H)throw new Error(`Currency ${r} not found`);if(H.payment_method?.type==="stripe")return{lineItems:e,quotes:u,refreshed:!1};let M=gn(),k;try{let D=Xn(H.symbol,H.payment_method?.type);k=await M.getRate(D)}catch(D){return y.warn("Exchange rate unavailable for checkout session",{checkoutSessionId:t.id,currencyId:r,currencySymbol:H.symbol,error:D.message}),{lineItems:e,quotes:{},rateUnavailable:!0,rateError:D.message||"Exchange rate service unavailable",refreshed:!1}}y.info("Fetched exchange rate for batch quote creation",{currencyId:r,currencySymbol:H.symbol,rate:k.rate,provider:k.provider_name,dynamicItemsCount:U.length});let w=await Promise.all(U.map(async D=>{let q=qo(D),{quantity:B}=D;try{let I=D.quote_id,j,K=I?b.get(I):null;return!(!K||K.status==="used"&&!m)&&I&&K?j=await a.refreshQuoteWithRate({quote_id:I,price_id:q?.id,session_id:t.id,target_currency_id:r,quantity:B,rateResult:k,slippage_percent:_}):(j=await a.createQuoteWithRate({price_id:q?.id,session_id:t.id,target_currency_id:r,quantity:B,rateResult:k,slippage_percent:_}),T=!0),{item:D,quoteResponse:j}}catch(I){let j=I instanceof Error?I.message:String(I);throw y.error("Failed to create quote for dynamic price",{priceId:q.id,checkoutSessionId:t.id,currencyId:r,errorMessage:j,errorName:I?.name}),I}})),x=new Map;w.forEach(D=>{let q=D.item.price?.id||D.item.price_id;q&&x.set(q,D)});let v=D=>({quote_id:D.quote.id,expires_at:D.expires_at,quoted_amount:D.computed_unit_amount,exchange_rate:D.quote.exchange_rate,rate_provider_name:D.quote.rate_provider_name,rate_provider_id:D.quote.rate_provider_id,rate_timestamp_ms:D.quote.rate_timestamp_ms});w.forEach(D=>{let q=D.item.price?.id||D.item.price_id;if(q){let B=`${q}_${r}`;u[B]=v(D.quoteResponse)}}),L=T;let P=E.size>0||T;return{lineItems:e.map(D=>{if(!D.price)return D;let q=x.get(D.price.id);if(!q)return D;let B=v(q.quoteResponse);return{...D,...B,custom_amount:q.quoteResponse.computed_unit_amount}}),quotes:u,regenerated:L,refreshed:P}}var JX,yF,Jy,qAt,ki=N(()=>{"use strict";My();qe();qf();Lke();JX=Oe(Uy());HI();Zt();pr();pw();Qf();_e();Ds();Ir();he();cC();lC();Zf();Yf();_u();pu();Gy();Pv();Pv();yF=.5,Jy=8;qAt=180});var yC,APe=N(()=>{"use strict";Xg();yC=class t extends li.AbstractSigner{constructor(e,r){super(r),this.wallet=e}getAddress(){return Promise.resolve(this.wallet.address)}async signTransaction(e){let r=await this.populateTransaction(e),{from:n,...i}=r,o=li.Transaction.from(i),a=o.unsignedSerialized,s=li.keccak256(a),c=await this.wallet.signETH(s,!1);return o.signature=li.Signature.from(c),o.serialized}async signMessage(e){let r=typeof e=="string"?li.toUtf8Bytes(e):e,n=li.hashMessage(r),i=await this.wallet.signETH(n,!1);return li.hexlify(i)}async signTypedData(e,r,n){let i=li.TypedDataEncoder.hash(e,r,n),o=await this.wallet.signETH(i,!1);return li.hexlify(o)}connect(e){return new t(this.wallet,e)}}});var tm,YX=N(()=>{tm=[{constant:!0,inputs:[],name:"name",outputs:[{name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"},{constant:!1,inputs:[{name:"_spender",type:"address"},{name:"_value",type:"uint256"}],name:"approve",outputs:[{name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!0,inputs:[],name:"totalSupply",outputs:[{name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},{constant:!1,inputs:[{name:"_from",type:"address"},{name:"_to",type:"address"},{name:"_value",type:"uint256"}],name:"transferFrom",outputs:[{name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!0,inputs:[],name:"INITIAL_SUPPLY",outputs:[{name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},{constant:!0,inputs:[],name:"decimals",outputs:[{name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},{constant:!1,inputs:[],name:"unpause",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!0,inputs:[],name:"paused",outputs:[{name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function"},{constant:!1,inputs:[{name:"_spender",type:"address"},{name:"_subtractedValue",type:"uint256"}],name:"decreaseApproval",outputs:[{name:"success",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!1,inputs:[{name:"_spender",type:"address"},{name:"_subtractedValue",type:"uint256"}],name:"decreaseAllowance",outputs:[{name:"success",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!0,inputs:[{name:"_owner",type:"address"}],name:"balanceOf",outputs:[{name:"balance",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},{constant:!1,inputs:[],name:"pause",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!0,inputs:[],name:"owner",outputs:[{name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},{constant:!0,inputs:[],name:"symbol",outputs:[{name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"},{constant:!1,inputs:[{name:"_to",type:"address"},{name:"_value",type:"uint256"}],name:"transfer",outputs:[{name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!1,inputs:[{name:"_spender",type:"address"},{name:"_addedValue",type:"uint256"}],name:"increaseApproval",outputs:[{name:"success",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!1,inputs:[{name:"_spender",type:"address"},{name:"_addedValue",type:"uint256"}],name:"increaseAllowance",outputs:[{name:"success",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!0,inputs:[{name:"_owner",type:"address"},{name:"_spender",type:"address"}],name:"allowance",outputs:[{name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},{constant:!1,inputs:[{name:"newOwner",type:"address"}],name:"transferOwnership",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function"},{inputs:[],payable:!1,stateMutability:"nonpayable",type:"constructor"},{anonymous:!1,inputs:[],name:"Pause",type:"event"},{anonymous:!1,inputs:[],name:"Unpause",type:"event"},{anonymous:!1,inputs:[{indexed:!0,name:"previousOwner",type:"address"},{indexed:!0,name:"newOwner",type:"address"}],name:"OwnershipTransferred",type:"event"},{anonymous:!1,inputs:[{indexed:!0,name:"owner",type:"address"},{indexed:!0,name:"spender",type:"address"},{indexed:!1,name:"value",type:"uint256"}],name:"Approval",type:"event"},{anonymous:!1,inputs:[{indexed:!0,name:"from",type:"address"},{indexed:!0,name:"to",type:"address"},{indexed:!1,name:"value",type:"uint256"}],name:"Transfer",type:"event"}]});async function GAt(t,e,r){let n=await t.getCode(e);return n.length<=2?!1:r.find(o=>{let a=tm.find(c=>c.name===o&&c.type==="function"),s=Ku.from(a);return!!n.includes(s.selector.slice(2))})}async function Dv(t,e){let r=await GAt(t,e,["increaseAllowance","increaseApproval","approve"]);if(!r)throw new Error(`Approval function not supported in contract ${e}`);return r}var wF=N(()=>{"use strict";Xg();YX()});async function SPe(t,e){let r=new li.Contract(e,tm,t),[n,i,o]=await Promise.all([r.name(),r.symbol(),r.decimals()]);return{name:n,symbol:i,decimal:typeof o.toNumber=="function"?o.toNumber():Number(o)}}async function yw(t,e,r){return(await new li.Contract(e,tm,t).balanceOf(r)).toString()}async function TPe(t,e,r,n){return(await new li.Contract(e,tm,t).allowance(r,n)).toString()}async function hC(t,e){return(await t.getBalance(e)).toString()}function JAt(t,e){return new li.Interface(tm).encodeFunctionData("transfer",[t,e])}function VAt(t,e,r="approve"){return new li.Interface(tm).encodeFunctionData(r,[t,e])}function rm(t,e,r){return r?{to:r,value:"0",gasLimit:"120000",data:JAt(t,e)}:{to:t,value:e,gasLimit:"21000",data:""}}async function IPe(t,e,r,n){let i=await Dv(t,n);return{to:n,value:"0",gasLimit:"120000",data:VAt(e,r,i)}}async function CPe(t,e,r,n){let i=new yC(Sn,t);return await(await new li.Contract(e,tm,i).transferFrom(r,Sn.address,n)).wait()}async function Bv(t,e,r,n){let i=new yC(Sn,t);return await(await new li.Contract(e,tm,i).transfer(r,n)).wait()}var bu=N(()=>{"use strict";Xg();Ir();APe();wF();YX()});var PPe={};Je(PPe,{checkStakeRevokeTx:()=>eY,ensureStakedForGas:()=>QX,estimateMaxGasForTx:()=>ZX,getAllResults:()=>kPe,getStakeSummaryByDid:()=>xF,getTokenByAddress:()=>yp,getTokenSummaryByDid:()=>id,hasStakedForGas:()=>gC});import KAt from"assert";async function QX(){let t=await W.findAll({where:{active:!0,is_base_currency:!0}});for(let e of t){let r=await Y.findByPk(e.payment_method_id);if(r&&r.type==="arcblock"){let n=r.getOcapClient(),i=r.settings.arcblock?.api_host;try{let{state:o}=await n.getAccountState({address:we.address}),a=await sC({client:n});if(a){y.info(`app already staked for gas on chain ${i}`,{source:a.source});continue}let s=await n.getForgeState({}),{token:c,txConfig:u}=s.state,d=(o?.tokens||[]).find(p=>p.address===c.address);if(Su(d?.value||"0").lte(Su(u.txGas.minStake))){y.info(`not enough balance to stake for gas on chain ${i}`);continue}let[l]=await n.stake({to:we.address,message:"stake-for-gas",tokens:[{address:c.address,value:lt(u.txGas.minStake,Number(c.decimal))}],wallet:we});y.info(`staked for gas on chain ${i}`,{hash:l})}catch(o){y.error(`stake for gas on chain ${i} failed`,o)}}}}async function gC(t,e=we.address){if(t.type==="arcblock"){let r=t.getOcapClient();if(e===we.address)return!!await sC({client:r});let n=Bu(e,e),{state:i}=await r.getStakeState({address:n});return!!i}return!0}async function ZX(t,e="fg:t:delegate"){if(t.type==="arcblock"){let r=t.getOcapClient(),{estimate:n}=await r.estimateGas({typeUrl:e});return n.max}return"0"}async function kPe(t,e){let r=[],{page:i,[t]:o}=await e({size:40});if(i.total<40)return o;r.push(...o);let a=Math.floor(i.total/40),s=[];for(let c=1;c<=a;c++)s.push(async()=>{let{[t]:u}=await e({size:40,cursor:c*40});r.push(...u)});return await Promise.all(s.map(c=>c())),KAt.equal(r.length,i.total,`fetched ${t} count does not match`),r}async function eY(){let t=await Y.findAll({where:{type:"arcblock"}});if(t.length===0)return;let e=1e3*60*10,r=new Date(Date.now()-e).toISOString(),n=new Date().toISOString();for(let i of t){let o=i.getOcapClient(),a=await kPe("transactions",s=>o.listTransactions({paging:s,typeFilter:{types:["revoke_stake"]},timeFilter:{field:"time",startDateTime:r,endDateTime:n}}));y.info(`Found ${a.length} revoke stake tx on chain ${i.name}`,{interval:e,startDateTime:r,endDateTime:n,txs:a.map(s=>s.hash)}),await Promise.all(a.map(async s=>{let c=await te.findByPkOrDid(s.tx.from);if(!c)return;let{address:u}=s.tx.itxJson,d=await ee.findAll({where:{[J.or]:[{"payment_details.arcblock.staking.address":u},{"overdraft_protection.payment_details.arcblock.staking.address":u}]}});if(d.length===0)return;y.info(`Active subscriptions found for revoked stake on chain ${i.name}`,{address:u,customer:c.did,subscriptions:d.map(p=>p.id),txHash:s.hash});let{state:l}=await o.getStakeState({address:u});if(l.nonce)d.filter(p=>p.isActive()).forEach(p=>{ge.emit("customer.stake.revoked",{subscriptionId:p.id,tx:s})});else{let p=JSON.parse(l.data?.value||"{}");d.filter(f=>f.isActive()).filter(f=>p[f.id]).forEach(f=>{ge.emit("customer.stake.revoked",{subscriptionId:f.id,tx:s})})}}))}}async function xF(t,e=!0){let r=await Y.findAll({where:{type:"arcblock",livemode:e},include:[{model:W,as:"payment_currencies"}]});if(r.length===0)return{};let n={};return await Promise.all(r.map(async i=>{let o=i.getOcapClient(),a=await qy(o),s=[...new Set([we.address,...a])];for(let c of s){let{stakes:u}=await o.listStakes({addressFilter:{receiver:c}});(u||[]).filter(d=>d.sender===t).forEach(d=>{let{tokens:l}=d;(l||[]).forEach(p=>{let f=i.payment_currencies?.find(m=>p.address===m.contract);f&&(n[f.id]=new F(n[f.id]||"0").add(new F(p.balance||"0")).toString())})})}})),n}async function id(t,e,r="arcblock"){let n=await Y.findAll({where:{type:r,livemode:e},include:[{model:W,as:"payment_currencies"}]});if(n.length===0)return{};let i={};return await Promise.all(n.map(async o=>{if(o.type==="arcblock"){let a=o.getOcapClient(),{tokens:s}=await a.getAccountTokens({address:t});(s||[]).forEach(c=>{let u=o.payment_currencies.find(d=>c.address===d.contract);u&&(i[u.id]=c.balance)})}if(wt.includes(o.type)&&Yp(t)){let a=o.getEvmClient();await Promise.all(o.payment_currencies.map(async s=>{s.contract?i[s.id]=await yw(a,s.contract,t):i[s.id]=await hC(a,t)}))}})),i}async function yp(t,e,r){if(e.type==="arcblock"){let n=e.getOcapClient(),{tokens:i}=await n.getAccountTokens({address:t});return i.find(o=>o.address===r.contract)?.balance}if(wt.includes(e.type)){let n=e.getEvmClient();return r.contract?await yw(n,r.contract,t):await hC(n,t)}return y.info(`unsupported payment method type: ${e.type}`,{paymentCurrencyId:r.id,paymentMethodId:e.id,address:t}),"0"}var wu=N(()=>{"use strict";ja();j_();qe();$e();Ir();Rn();he();_e();bu();mi();cC()});function WAt(t,e){return`${t}:${e}`}function zAt(t){let e=$v.get(t);return e?Date.now()-e.cachedAt>NPe?($v.delete(t),null):e:null}function XAt(t,e){if($v.size>1e3){let r=Date.now();for(let[n,i]of $v)r-i.cachedAt>NPe&&$v.delete(n)}$v.set(t,{...e,cachedAt:Date.now()})}async function _C(t){let{paymentMethod:e,paymentCurrency:r,userDid:n,amount:i}=t,o=r.contract,a=new F(i);if(e.type==="arcblock"){let s=n;if(!t.skipUserCheck){let{user:l}=await hr.getUser(n,{enableConnectedAccount:!0});l&&(s=CS(l))}if(!s)return{sufficient:!1,reason:"NO_DID_WALLET",requestedAmount:a.toString()};let c=e.getOcapClient(),{tokens:u}=await c.getAccountTokens({address:s,token:o}),[d]=u;return d?new F(d.balance).lt(a)?{sufficient:!1,reason:"NO_ENOUGH_TOKEN",token:d,requestedAmount:a.toString()}:{sufficient:!0,token:d,requestedAmount:a.toString()}:{sufficient:!1,reason:"NO_TOKEN",requestedAmount:a.toString()}}if(wt.includes(e.type)){if(!r.contract)return{sufficient:!1,reason:"NO_TOKEN",requestedAmount:a.toString()};if(Yp(n)===!1)return{sufficient:!1,reason:"NO_TOKEN",requestedAmount:a.toString()};let s=e.getEvmClient(),c=await yw(s,r.contract,n);return new F(c).lt(a)?{sufficient:!1,reason:"NO_ENOUGH_TOKEN",token:{address:o,balance:c},requestedAmount:a.toString()}:{sufficient:!0,token:{address:o,balance:c},requestedAmount:a.toString()}}return{sufficient:!0,requestedAmount:a.toString()}}async function tY(t){let{paymentMethod:e,paymentCurrency:r,userDid:n,amount:i,lineItems:o}=t;if(e.type==="arcblock"&&r.type==="credit"){let a=await te.findOne({where:{did:n}});if(!a)return{sufficient:!1,reason:"NO_CUSTOMER"};let s=[];o&&o.length>0&&o.forEach(d=>{kv(d.price)&&s.push(d.price_id)});let c=await ct.getEffectiveCreditSummary({customerId:a.id,currencyId:r.id,priceIds:s});if(!c)return{sufficient:!1,reason:"NO_CREDIT_GRANTS"};let u=new F(c[r.id]?.remainingAmount||"0");return u.lt(new F(i))?{sufficient:!1,reason:"NO_ENOUGH_CREDIT"}:{sufficient:!0,token:{address:r.id,balance:u.toString()},requestedAmount:i}}return{sufficient:!1,reason:"NOT_SUPPORTED"}}async function oi(t){let{paymentCurrency:e,paymentMethod:r,userDid:n,amount:i,delegatorAmounts:o,subscription:a,storedDelegationAddress:s}=t;if(!n)return{sufficient:!1,reason:"NO_DID_WALLET"};let c=e.contract,u=new F(i),d=o&&o.length>0;if(d&&(u=o.reduce((l,p)=>l.add(new F(p)),new F("0"))),r.type==="arcblock"){if(e.type==="credit")return await tY({paymentMethod:r,paymentCurrency:e,userDid:n,amount:i,lineItems:t.lineItems});let l=n,{user:p}=await hr.getUser(n,{enableConnectedAccount:!0});if(p&&(l=CS(p),!l))return{sufficient:!1,reason:"NO_DID_WALLET"};y.info("isDelegationSufficientForPayment: checking delegation",{originalUserDid:n,resolvedDelegator:l,delegatorChanged:n!==l,walletAddress:we.address,paymentMethodApiHost:r.settings?.arcblock?.api_host});let f=r.getOcapClient(),m=WAt(l,r.id),h=zAt(m),g,_;if(h)g=h.delegationAddress,_=h.source,y.info("isDelegationSufficientForPayment: using cached delegation address",{delegator:l,delegationAddress:g,source:_,cacheAgeMs:Date.now()-h.cachedAt});else{let L=await rPe({storedAddress:s||a?.payment_details?.arcblock?.delegation_address,delegator:l,client:f});if(!L)return y.error("isDelegationSufficientForPayment: no delegation address found",{delegator:l,storedDelegationAddress:s,subscriptionDelegationAddress:a?.payment_details?.arcblock?.delegation_address,subscriptionId:a?.id}),{sufficient:!1,reason:"NO_DELEGATION"};let{address:T,needsBackfill:$}=L;g=T,_=L.source,$&&a&&await iPe(a.id,T),XAt(m,{delegator:l,delegationAddress:T,source:_,needsBackfill:$})}let b=await f.getDelegateState({address:g});if(!b.state)return y.error("isDelegationSufficientForPayment: no delegation state",{address:g,delegator:l,source:_}),{sufficient:!1,reason:"NO_DELEGATION"};let{state:E}=b;if(!E.ops||E.ops?.length===0)return y.error("isDelegationSufficientForPayment: no delegation ops",{address:g,delegator:l,source:_}),{sufficient:!1,reason:"NO_DELEGATION",state:E};let A=E.ops.find(L=>L.key===AT)?.value;if(!A)return{sufficient:!1,reason:"NO_TRANSFER_PERMISSION",state:E};if(A.limit&&Array.isArray(A.limit.tokens)&&A.limit.tokens.length>0){let L=A.limit.tokens.find(T=>T.address===c);if(!L)return{sufficient:!1,reason:"NO_TOKEN_PERMISSION",state:E};if(Array.isArray(L.to)&&L.to.length){let T=await qy(f);if(![we.address,...T].some(H=>L.to.includes(H)))return{sufficient:!1,reason:"NO_TRANSFER_TO",state:E}}if(L.txAllowance!=="0"){let T=new F(L.txAllowance);if(d){if(o.find(U=>new F(U).gt(T)))return{sufficient:!1,reason:"NO_ENOUGH_ALLOWANCE",state:E}}else if(u.gt(T))return{sufficient:!1,reason:"NO_ENOUGH_ALLOWANCE",state:E}}}let{tokens:R}=await f.getAccountTokens({address:l,token:c}),[C]=R;return C?new F(C.balance).lt(u)?{sufficient:!1,reason:"NO_ENOUGH_TOKEN",token:C,state:E,requestedAmount:u.toString()}:{sufficient:!0,delegator:l,state:E,token:C,requestedAmount:u.toString()}:{sufficient:!1,reason:"NO_TOKEN",state:E}}if(r.type==="stripe")return{sufficient:!1,reason:"NOT_SUPPORTED"};if(wt.includes(r.type)){if(!e.contract)return{sufficient:!1,reason:"NOT_SUPPORTED"};if(Yp(n)===!1)return{sufficient:!1,reason:"NOT_SUPPORTED"};let l=r.getEvmClient(),p=await yw(l,e.contract,n);if(new F(p).lt(new F(i)))return{sufficient:!1,reason:"NO_ENOUGH_TOKEN"};let f=await TPe(l,e.contract,n,Sn.address);return y.info("isDelegationSufficientForPayment",{userDid:n,amount:i,allowance:f,contract:e.contract}),new F(f).lt(new F(i))?{sufficient:!1,reason:"NO_ENOUGH_ALLOWANCE"}:{sufficient:!0}}throw new Error(`Payment method ${r.type} not supported`)}function rY(t){let{paymentMethod:e,paymentCurrency:r,customer:n,amount:i}=t;if(e.type==="stripe")return{sufficient:!1,balance:n.balance||"0",reason:"NOT_SUPPORTED"};let a=(n.token_balance||{})[r.id]||"0";return i==="0"?{sufficient:!0,balance:a}:new F(a).lt(new F(i))?{sufficient:!1,balance:a,reason:"NO_ENOUGH_TOKEN"}:{sufficient:!0,balance:a}}async function Qn(t,e,r){if(!(r?await sC({client:r}).then(o=>!!o).catch(()=>!1):!1)&&e&&e["x-gas-payer-sig"]&&e["x-gas-payer-pk"])return{headers:e};let i=Kse(t);return{headers:{"x-gas-payer-sig":await we.signJWT({txHash:i}),"x-gas-payer-pk":we.publicKey}}}async function EF(t,e,r="0"){let n={balance:0,price:0,symbol:""},i=await W.findByPk(e.currency_id);if(!i)return n;Object.assign(n,{symbol:i.symbol});let o=await Te.findByPk(e.payment_intent_id),a=o?o.amount:r,s=await Y.findByPk(e.default_payment_method_id);if(!s)return n;let c=e?.payment_settings;if(cc.includes(s.type)){let u=c?.payment_method_options.arcblock?.payer,d=await oi({paymentMethod:s,paymentCurrency:i,userDid:u||t,amount:a});if(!d.token)return n;let l=+lt(a,i.decimal);return d.delegator?{balance:+lt(d.token.balance,i.decimal),price:l,symbol:i.symbol}:{balance:0,price:l,symbol:i.symbol}}return n}async function RPe(t,e,r,n,i,o){let s=t.some(u=>u.price.recurring?.usage_type==="metered")?"0":i,c={address:r.contract,to:[we.address],txAllowance:s,totalAllowance:"0",txCount:0,validUntil:0};if(e.type==="arcblock"){let u=o;if(u===void 0){let l=e.getOcapClient();await l.getContext(),{state:u}=await l.getDelegateState({address:n}),y.info("getTokenLimitsForDelegation: fetched DelegateState from chain",{address:n})}else y.info("getTokenLimitsForDelegation: reused DelegateState from caller",{address:n});if(!u)return[c];if(!u.ops||u.ops?.length===0)return[c];let d=u.ops.find(l=>l.key===AT);if(d&&Array.isArray(d.value.limit?.tokens)&&d.value.limit.tokens.length>0){let l=Vn(d.value.limit.tokens),p=d.value.limit.tokens.findIndex(f=>f.address===r.contract);if(p>-1){let f=d.value.limit.tokens[p];f.txAllowance!=="0"&&new F(f.txAllowance).lt(new F(i))&&(l[p]=c)}else l.push(c);return l}return[c]}if(wt.includes(e.type))return c.totalAllowance=new F(i).mul(new F(12)).toString(),[c];throw new Error(`getTokenLimitsForDelegation: Payment method ${e.type} not supported`)}async function nY(t){let{paymentCurrency:e,paymentMethod:r,amount:n}=t,i=e.contract;if(r.type==="arcblock"){let o=r.getOcapClient(),{tokens:a}=await o.getAccountTokens({address:we.address,token:i}),[s]=a;return s?new F(s.balance).lt(new F(n))?{sufficient:!1,reason:"NO_ENOUGH_TOKEN",token:s}:{sufficient:!0,token:s}:{sufficient:!1,reason:"NO_TOKEN"}}if(wt.includes(r.type)){let o=r.getEvmClient(),a=e.contract?await yw(o,e.contract,Sn.address):await hC(o,Sn.address);return new F(a).lt(new F(n))?{sufficient:!1,reason:"NO_ENOUGH_TOKEN"}:{sufficient:!0}}if(r.type==="stripe")return{sufficient:!1,reason:"NOT_SUPPORTED"};throw new Error(`isBalanceSufficientForRefund: Payment method ${r.type} not supported`)}async function OPe(t,e,r){let{donation_settings:n}=t;if(!n)return[];let{beneficiaries:i}=n,o=i.reduce((c,u)=>c+Number(u.share),0);if(o===0)return i;let a=await Yg(e);return await Promise.all(i.map(async c=>{let{address:u,share:d,name:l,avatar:p}=c;try{let f=await Df(u,a);return{address:u,percent:Number(d)*100/o,name:l||f?.name||"",avatar:p||f?.avatar||"",url:$_e(f?.url||"",r),type:f?.type||"user"}}catch{return{address:u,percent:Number(d)*100/o,name:l||"",avatar:p||""}}}))}async function vF(t){let e=await W.scope("withVaultConfig").findByPk(t);if(!e)return{depositAmount:"0",message:"Payment currency not found"};if(!e?.vault_config?.enabled)return{depositAmount:"0",message:"Deposit vault is not enabled"};let r=e?.vault_config?.deposit_threshold;if(!r||r==="0")return{depositAmount:"0",message:"Deposit threshold is not set or zero"};let n=await Y.findByPk(e.payment_method_id);if(!n)return{depositAmount:"0",message:"Payment method not found"};let i=await rb();if(!i)return{depositAmount:"0",message:"Vault address is not found"};if(!N4(i).includes(n.type))return{depositAmount:"0",message:"Vault chain type is not supported"};let a=n.type==="arcblock"?we.address:Sn.address,s=await yp(a,n,e),c=new F(r);if(new F(s).lte(c))return{depositAmount:"0",message:"No enough balance to deposit to vault"};let u=new F(s),d=u.sub(c).toString(),{[e.id]:l}=await Tr.getPayoutLockedAmount({currency_id:e.id});if(new F(l).add(c).gte(u))return{depositAmount:"0",message:"Amount to payout is already greater than the deposit threshold"};if(d=new F(d).sub(new F(l)).toString(),new F(d).lte(new F(0)))return{depositAmount:"0",message:"No amount available to deposit after calculations"};let p=e?.vault_config?.buffer_threshold;return p&&p!=="0"&&new F(d).lt(new F(p))?{depositAmount:"0",message:"Amount to deposit is less than the buffer threshold"}:{depositAmount:d,vaultAddress:i,paymentCurrency:e}}var NPe,$v,ai=N(()=>{"use strict";ja();kH();Ou();qe();qf();bu();_e();cC();Ir();he();ke();mi();wu();Pv();NPe=3e4,$v=new Map});function dc({subscriptionId:t,locale:e="en",userDid:r}){return Bh.getUrl(cn(`customer/subscription/${t}`,{locale:e,...to({userDid:r})}))}function AF({subscriptionId:t,locale:e="en",userDid:r}){return Bh.getUrl(cn(`admin/billing/${t}`,{locale:e,...to({userDid:r})}))}function DPe({invoiceId:t,locale:e="en",userDid:r}){return Bh.getUrl(cn(`admin/billing/${t}`,{locale:e,...to({userDid:r})}))}function BPe(t,e){for(let r of t){let n=parseInt(r,10);if(typeof n=="number"&&n>=0)return n}return e}function Vy(t={}){return BPe([t.days_until_due,oH()],6)}function hp(t={}){return BPe([t.days_until_cancel,aH()],0)}function oY(t,e,r="0"){let n={licensed:new F(0),metered:new F(0)};return t.map(o=>o.upsell_price||o.price).filter(o=>o.type==="recurring"&&o.recurring).length>0&&(new F(r).gt(YAt)?n.licensed=new F(r):t.forEach(o=>{let a=qo(o),s=Yn(a,e),c=new F(s).mul(new F(o.quantity));a.type==="recurring"&&a.recurring&&(a.recurring.usage_type==="licensed"&&(n.licensed=n.licensed.add(c)),a.recurring.usage_type==="metered"&&(n.metered=n.metered.add(c)))})),n}function Ky(t,e,r){let n=pC(t),i=se().unix();if(!r?.catchUp)return{recurring:t,cycle:n,period:{start:e,end:se.unix(e).add(n,"millisecond").unix()},missedPeriods:0};let o=se.unix(e).add(n,"millisecond").unix();if(i<=o)return{recurring:t,cycle:n,period:{start:e,end:o},missedPeriods:0};let a=i-o,s=n/1e3,c=Math.floor(a/s),u=r.maxMissedPeriods||100,d=Math.min(c,u),l=se.unix(e).add((d+1)*n,"millisecond").unix(),p=se.unix(l).add(n,"millisecond").unix();return{recurring:t,cycle:n,period:{start:l,end:p},missedPeriods:d,recovery:{originalPeriodEnd:e,expectedPeriodEnd:o,timeMissed:a,periodsSkipped:d,wasLimited:c>u}}}function hw(t,e){let r=new F(0);return t.forEach(n=>{let i=qo(n),o=i?.pricing_type==="dynamic"?n.custom_amount||n.quoted_amount:null;if(o){r=r.add(new F(o));return}r=r.add(new F(Yn(i,e)).mul(new F(n.quantity)))}),{total:r.toString()}}async function SF(t,e,r){let n=await ce.findByPk(t.latest_invoice_id);if(!n)throw new Error("Subscription should have latest invoice when create proration");let i=await te.findByPk(t.customer_id);if(!i)throw new Error("Subscription should have customer when create proration");let o=await jt.findAll({where:{invoice_id:n.id,proration:!1}}),s=(await ne.expand(o.map($=>$.toJSON()))).filter($=>{let U=qo($);return U.type==="recurring"&&U.recurring?.usage_type==="licensed"}),c=1e4,u=n.period_start<n.period_end,d=u?n.period_start:t.current_period_start,l=u?n.period_end:t.current_period_end;if(r>l)throw y.warn("try to create proration with invalid arguments",{anchor:r,prorationStart:d,prorationEnd:l}),new Error("Subscription proration anchor should not be larger than prorationEnd");if(t.status==="trialing")return{lastInvoice:n,total:"0",shouldPay:"0",used:"0",unused:"0",prorations:[],newCredit:"0",appliedCredit:"0",remaining:"0",remainingUnused:"0"};let f=Math.ceil((l-r)/(l-d)*c),m=new F(0),h=await Promise.all(s.map($=>{let U=qo($),H;if(U.pricing_type==="dynamic")H=$.amount||"0",y.info("Using dynamic pricing amount for proration",{subscriptionId:t.id,priceId:U.id,actualAmount:H});else{let k=Yn(U,n.currency_id);H=new F(k).mul(new F($.quantity)).toString()}let M=new F(H).mul(new F(f)).div(new F(c)).toString();return y.info("subscription proration item",{subscription:t.id,invoice:$.invoice_id,invoiceItem:$.id,amount:M,isDynamic:U.pricing_type==="dynamic"}),m=m.add(new F(M)),{price_id:U.id,amount:`-${M}`,quantity:$.quantity,description:`Unused time on ${U.product.name} after ${se().format("lll")}`,period:{start:n.period_start,end:n.period_end},proration:!0,proration_details:{credited_items:{invoice_id:n.id,invoice_line_items:[$.id]}},pricing_type:U.pricing_type,base_amount_usd:U.pricing_type==="dynamic"?U.base_amount:null,proration_rate:f/c}}));y.info("subscription prorations created",{subscription:t.id,prorations:h});let g=e.amount.setup,b=(await Rt.findAll({where:{status:{[J.not]:"canceled"},subscription_id:t.id,currency_id:n?.currency_id,invoice_id:n?.id}})).reduce(($,U)=>$.add(new F(U.amount||"0")),new F(0)),E=($,U)=>$.sub(U).lt(new F(0))?"0":$.sub(U).toString(),A=E(new F(g),b),R=E(m,b),C=e.amount.setup,L="0",T="0";return new F(g).gte(m)?(C=new F(g).sub(m).toString(),T=i.getBalanceToApply(t.currency_id,C),C=new F(C).sub(new F(T)).toString()):(L=m.sub(new F(g)).toString(),C="0"),y.info("subscription proration result",{subscription:t.id,prorationStart:d,prorationEnd:l,prorationRate:f,unused:m.toString(),remaining:A,remainingUnused:R,total:g,due:C,newCredit:L,appliedCredit:T}),{lastInvoice:n,total:g,due:C,remaining:A,remainingUnused:R,used:new F(n.amount_due).sub(m).toString(),unused:m.toString(),prorations:h,newCredit:L,appliedCredit:T}}async function bC(t,e,r){let n=await He.findAll({where:{subscription_id:t.id}}),i=await ne.expand(n.map(d=>d.toJSON())),o=r||t.currency_id,a=t.slippage_config,s=await W.findByPk(o),c={percent:a?.percent??.5,minAcceptableRate:a?.min_acceptable_rate,currencyDecimal:s?.decimal},u=ko(i,o,0,0,c);return SF(t,u,e)}function Fv(t){if(["past_due","active","trialing"].includes(t.status)){let e=se().unix();if(t.cancel_at){if(t.cancel_at<=e)return!0}else if(t.cancel_at_period_end&&t.current_period_end<=e)return!0}return!1}async function gw(t){let e=await He.findAll({where:{subscription_id:t}});return ne.expand(e.map(r=>r.toJSON()))}async function TF(t){let e=await ee.findByPk(t);if(!e)throw new Error("Subscription not found");if(e.isActive()===!1&&e.status!=="past_due")throw new Error(`Subscription not active for ${t}, so usage check is skipped`);let r=await W.findByPk(e.currency_id),n=await He.findAll({where:{subscription_id:t}}),i=await ne.expand(n.map(u=>u.toJSON())),o=new F(0),a=new F(0),s=!1;for(let u of i){let d=qo(u);if(d.pricing_type==="dynamic"&&(s=!0),d.type==="recurring"){let l=Yn(d,e.currency_id);if(d.recurring?.usage_type==="licensed"&&(o=o.add(new F(l).mul(new F(u.quantity))),a=a.add(new F(l).mul(new F(u.quantity)))),d.recurring?.usage_type==="metered"){let p=await hn.getSummary({id:u?.id,start:e.current_period_start,end:e.current_period_end,method:d.recurring?.aggregate_usage,dryRun:!0}),f=d.transformQuantity(p);o=o.add(new F(l).mul(new F(f))),a=a.add(new F(l).mul(new F(u.quantity)))}}}let c=null;if(s&&r)try{let u=await Y.findByPk(r.payment_method_id),d=gn(),l=Xn(r.symbol,u?.type);if(l){let p=await d.getRate(l);p?.rate&&(c={exchange_rate:p.rate,rate_timestamp_ms:p.timestamp_ms||Date.now(),providers:p.providers||[]})}}catch(u){y.warn("Failed to fetch exchange rate for upcoming invoice",{subscriptionId:t,error:u})}return{amount:o.toString(),minExpectedAmount:a.toString(),start:e.current_period_start,end:e.current_period_end,currency:r,quoteInfo:c}}async function LPe(t,e="max"){let r=await ee.findByPk(t);if(!r)throw new Error("Subscription not found");let n=await W.findByPk(r.currency_id),i=await ce.findAll({where:{subscription_id:t,currency_id:r.currency_id,billing_reason:["subscription_create","subscription_cycle","subscription_update","subscription_recover","subscription_threshold","subscription_cancel","subscription"]},order:[["created_at","DESC"]]}),o=Ky(r.pending_invoice_item_interval,r.current_period_end),a=o.period.start-o.cycle/1e3,s=o.period.end-o.cycle/1e3,c=se(r.created_at).unix(),u={};for(;a<s&&a>=c;){let l=`${a}-${s}`,f=i.filter(m=>m.period_start>=a&&m.period_end<=s).reduce((m,h)=>m.add(new F(h.total)),new F(0));u[l]=f,a-=o.cycle/1e3,s-=o.cycle/1e3}let d=new F(0);switch(e){case"sum":d=Object.values(u).reduce((l,p)=>l.add(p),new F(0));break;case"avg":d=Object.values(u).length>0?Object.values(u).reduce((l,p)=>l.add(p),new F(0)).div(new F(Object.values(u).length)):new F(0);break;case"max":d=Object.values(u).length>0?Object.values(u).reduce((l,p)=>l.gt(p)?l:p,new F(0)):new F(0);break;default:throw new Error("Invalid aggregation rule")}return{amount:d.toString(),currency:n}}async function IF({subscription:t,customer:e,invoice:r,paymentCurrency:n,appliedCredit:i,newCredit:o,addedItems:a,updatedItems:s,deletedItems:c,updates:u}){if(Os(u)){y.info("subscription update aborted",{subscription:t.id,updates:u});return}y.info("subscription update finalized",{subscription:t.id,updates:u}),await t.update({...u,pending_update:null});for(let l of a)await He.create({price_id:l.price_id,quantity:l.quantity,livemode:t.livemode,subscription_id:t.id,metadata:{}}),y.info("subscription item added on update finalize",{subscription:t.id,item:l.id});for(let l of s)await He.update(Re(l,["quantity","metadata","billing_thresholds"]),{where:{id:l.id}}),y.info("subscription item updated on update finalize",{subscription:t.id,item:l.id});for(let l of c)l.clear_usage&&(await hn.destroy({where:{subscription_item_id:l.id}}),y.info("subscription item usage cleared on update finalize",{subscription:t.id,item:l.id})),await He.destroy({where:{id:l.id}}),y.info("subscription item deleted on update finalize",{subscription:t.id,item:l.id});if(i!=="0"){let l=await e.decreaseTokenBalance(n.id,i);r&&(await r.update({starting_token_balance:l.starting,ending_token_balance:l.ending}),y.info("customer credit applied to invoice after proration",{subscription:t.id,appliedCredit:i,creditResult:l}))}if(o!=="0"){let l=await e.increaseTokenBalance(n.id,o);r&&(await r.update({starting_token_balance:l.starting,ending_token_balance:l.ending}),y.info("subscription proration credit applied to customer",{subscription:t.id,newCredit:o,creditResult:l}))}let d=t.current_period_end;await ii.acquire(`${t.id}-change-plan`,d),y.info("subscription plan change lock acquired on finalize",{subscription:t.id,releaseAt:d})}async function FPe({subscription:t,items:e,updates:r}){if(Os(r)){y.info("subscription update aborted",{subscription:t.id,updates:r});return}if(t.pending_update){let i=(await He.findAll({where:{subscription_id:t.id}})).filter(a=>e.some(s=>s.id===a.id)===!1).map(a=>a.id);i.length&&(await hn.destroy({where:{subscription_item_id:i}}),y.info("subscription item usage cleared on update",{subscription:t.id,deletedItems:i}),await He.destroy({where:{id:i}}),y.info("subscription item deleted on update",{subscription:t.id,deletedItems:i}));for(let a of e)if(a.id)await He.update(Re(a,["quantity","billing_thresholds"]),{where:{id:a.id}}),y.info("subscription item synced on update",{subscription:t.id,item:a});else{let s=await He.create({price_id:a.price_id,quantity:a.quantity||1,livemode:t.livemode,subscription_id:t.id,metadata:{stripe_id:a.stripe_id,stripe_subscription_id:a.stripe_subscription_id}});y.info("subscription item mirrored on update",{subscription:t.id,item:a});let d=await(await Y.findByPk(t.default_payment_method_id)).getStripeClient().subscriptionItems.update(a.stripe_id,{metadata:{appPid:pa.appPid,id:s.id}});y.info("subscription item related on mirror",{subscription:t.id,item:a,result:d})}let o=t.current_period_end;await ii.acquire(`${t.id}-change-plan`,o),y.info("subscription plan change lock acquired on finalize",{subscription:t.id,releaseAt:o}),xe("Subscription","customer.subscription.upgraded",t).catch(Se)}y.info("subscription update finalized",{subscription:t.id,updates:r,items:e}),await t.update({...r,pending_update:null})}async function CF(t){let e=await ee.findByPk(t);if(!e)return;let r=se().unix(),n=e.pending_update;if(y.info("subscription update connected",{subscription:e.id,pending:n}),n?.updates&&n?.expires_at&&n.expires_at>=r&&n.updates?.latest_invoice_id){let i=await W.findByPk(e.currency_id);if(!i)return;let o=await te.findByPk(e.customer_id);if(!o)return;let a=await ce.findByPk(n.updates.latest_invoice_id);if(!a)return;await IF({subscription:e,customer:o,invoice:a,paymentCurrency:i,appliedCredit:n.appliedCredit||"0",newCredit:n.newCredit||"0",addedItems:n.addedItems||[],deletedItems:n.deletedItems||[],updatedItems:n.updatedItems||[],updates:n.updates})}}async function QAt(t,e){if(!t||t.length===0)return"0";let r=new F("0");return await Promise.all(t.map(async n=>{await Rt.findOne({where:{subscription_id:n,status:{[J.not]:"canceled"},type:"stake_return"}})||(r=r.add(new F(e[n]||"0")))})),r.toString()}async function kF(t,e,r,n){let i=await ce.findByPk(t.latest_invoice_id);return{...await MPe(t,e,r,"slash",n),lastInvoice:i}}async function wC(t,e,r,n){let i=await ce.findByPk(t.latest_invoice_id);return{...await MPe(t,e,r,"return",n),lastInvoice:i}}async function MPe(t,e,r,n="return",i){let o=await W.findByPk(i||t.currency_id);if(!o)return{total:"0",return_amount:"0",sender:""};let a=r.getOcapClient(),{state:s}=await a.getStakeState({address:e});if(!s)return{total:"0",return_amount:"0",sender:""};let c=new F(s.tokens.find(h=>h.address===o.contract)?.value||"0");if(n==="slash"){let h=s.revokedTokens?.find(g=>g.address===o.contract);c=c.add(new F(h?.value||"0"))}let[u]=await ce.getUncollectibleAmount({subscriptionId:t.id,currencyId:o.id,customerId:t.customer_id}),d=JSON.parse(s.data?.value||"{}"),l=d[t.id],p=new F(u?.[o.id]||"0");if(s.nonce){let h=c.sub(p);return{total:c.toString(),return_amount:h.lt(new F(0))?"0":h.toString(),sender:s.sender}}let m=await(async()=>{let h=new F(l),g=Object.keys(d).filter(A=>A!=="appId"&&A!==t.id),_=await QAt(g,d),b=new F(c).sub(new F(_));return(h.lt(b)?h:b).sub(p)})();return{total:l,return_amount:m.lt(new F(0))?"0":m.toString(),sender:s.sender}}async function Sa(t,e,r,n){if(t?.type!=="arcblock")return{enough:!1,staked:"0",revoked:"0"};let i=t.getOcapClient(),{state:o}=await i.getStakeState({address:r});if(!o)return y.warn("getStakeState failed in checkRemainingStake",{address:r}),{enough:!1,staked:"0",revoked:"0"};let a=o.tokens?.find(u=>u.address===e.contract),s=o.revokedTokens?.find(u=>u.address===e.contract),c=new F(0);return a&&(c=c.add(new F(a?.value||"0"))),s&&(c=c.add(new F(s?.value||"0"))),{enough:c.gte(new F(n||"0")),staked:a,revoked:s}}function nm(t,e){let r=Number(t?.trial_period_days||0),n=Number(t?.trial_end||0),i=(t?.trial_currency||"").split(",").map(cke).filter(Boolean);return i.length>0&&i.includes(e)===!1&&(n=0,r=0),{trialInDays:r,trialEnd:n}}async function _w(t,e,r){let n=t.payment_details?.arcblock?.staking?.address;if(n)return n;if(r?.type==="arcblock"){let i=r.getOcapClient(),o=await nPe({userDid:e,nonce:t.id,client:i});if(o)return o.address}return S1(e,t.id)}async function UPe(t,e,r){let n={stakeReturn:t.cancelation_details?.return_stake===!0,stakeSlash:t.cancelation_details?.slash_stake===!0,stakeEnough:!1,hasStake:!!t?.payment_details?.arcblock?.staking?.tx_hash};if(t.cancelation_details?.reason==="cancellation_requested"){let o=t?.payment_details?.arcblock?.staking?.address,a;if(o&&e){let s=await wC(t,o,e);a=await Sa(e,r,o,s.return_amount),n.stakeEnough=a?.enough}}return n}async function qPe(t,e,r){if(e.type!=="arcblock")return null;let n=r||t?.payment_details?.arcblock?.staking?.tx_hash;if(!n)return null;let i=e.getOcapClient(),{info:o}=await i.getTx({hash:n});if(!o)return null;let a=o?.tx?.itxJson?.inputs||[];if(!a||a.length===0)return y.info("getSubscriptionStakeAmountSetup failed, no inputs",{txHash:n,info:o}),null;let s={};return a.forEach(c=>{let{tokens:u}=c;u.forEach(d=>{let{address:l,value:p}=d;s[l]?s[l]=new F(s[l]).add(new F(p)).toString():s[l]=new F(p).toString()})}),y.info("get subscription stake amount setup success",{txHash:n,amountRes:s}),s}async function Mv(t,e,r){let n=await He.findAll({where:{subscription_id:t.id}}),o=(await ne.expand(n.map(s=>({id:s.id,price_id:s.price_id,quantity:s.quantity})),{product:!0})).filter(s=>s?.price?.recurring?.usage_type==="metered");return o.length===0?!1:(await Promise.all(o.map(async s=>(await hn.findAll({where:{subscription_item_id:s.id,billed:!1,timestamp:{[J.gt]:e,[J.lte]:r}}})).length===0))).every(Boolean)}function oo(t,e){return t.payment_details?.[e]?.payer||t.payment_settings?.payment_method_options?.[e]?.payer}async function PF(t,e){let r=await He.findAll({where:{subscription_id:t.id}});if(r.length===0)return y.info("subscription items not found in getPaymentAmountForCycleSubscription",{subscription:t.id}),0;let n=await ne.expand(r.map(a=>({id:a.id,price_id:a.price_id,quantity:a.quantity})),{product:!0});if(n.length===0)return y.info("expanded items not found in getPaymentAmountForCycleSubscription",{subscription:t.id}),0;let i=t.status==="trialing"?t.trial_end:t.current_period_end,o=Ky(t.pending_invoice_item_interval,i);if(n=await Promise.all(n.map(async a=>{if(a.price.recurring?.usage_type==="metered"){let s=await hn.getSummary({id:a.id,start:o.period.start-o.cycle/1e3,end:o.period.end-o.cycle/1e3,method:a.price.recurring?.aggregate_usage,dryRun:!0});a.quantity=a.price.transformQuantity(s),a.metadata=a.metadata||{},a.metadata.quantity=s}return a})),n.length>0){let a=hw(n,e.id);return+lt(a?.total||"0",e.decimal)}return 0}async function HPe(t,e){let r=await He.findAll({where:{subscription_id:t.id}});if(r.length===0)return y.info("subscription items not found in getEstimatedPaymentAmountForCycleSubscription",{subscription:t.id}),{amount:0,estimatedByRate:!1};let n=await ne.expand(r.map(u=>({id:u.id,price_id:u.price_id,quantity:u.quantity})),{product:!0});if(n.length===0)return y.info("expanded items not found in getEstimatedPaymentAmountForCycleSubscription",{subscription:t.id}),{amount:0,estimatedByRate:!1};let i=t.status==="trialing"?t.trial_end:t.current_period_end,o=Ky(t.pending_invoice_item_interval,i);if(n=await Promise.all(n.map(async u=>{if(u.price.recurring?.usage_type==="metered"){let d=await hn.getSummary({id:u.id,start:o.period.start-o.cycle/1e3,end:o.period.end-o.cycle/1e3,method:u.price.recurring?.aggregate_usage,dryRun:!0});u.quantity=u.price.transformQuantity(d),u.metadata=u.metadata||{},u.metadata.quantity=d}return u})),n.length===0)return{amount:0,estimatedByRate:!1};let a=!1;if(n.some(u=>u.price?.pricing_type==="dynamic"))try{let u=await Y.findByPk(e.payment_method_id);if(!u)throw new Error(`PaymentMethod not found in ${t.id}`);let d=gn(),l=Xn(e.symbol,u.type),p=await d.getRate(l),f=8,m=Ue(zt(p.rate,f),f);n=n.map(h=>{let{price:g}=h;if(g?.pricing_type!=="dynamic")return h;if(!g.base_amount)return y.warn("Dynamic price missing base_amount for estimate",{subscriptionId:t.id,priceId:g.id}),h;let _=Ue(zt(g.base_amount,f),f),b=new F(h.quantity||0),R=_.mul(b).mul(new F(10).pow(new F(e.decimal))).add(m).sub(new F(1)).div(m),C=ip(R,e.decimal,10);return a=!0,{...h,custom_amount:C.toString(),quoted_amount:C.toString()}})}catch(u){y.warn("Failed to estimate dynamic pricing amount for subscription",{subscriptionId:t.id,error:u?.message||u})}let c=hw(n,e.id);return{amount:+lt(c?.total||"0",e.decimal),estimatedByRate:a}}async function Ta(t,e){try{let r=await W.findByPk(e||t.currency_id);if(!r)throw new Error(`PaymentCurrency not found in ${t.id}`);let n=await Y.findByPk(r.payment_method_id);if(!n)throw new Error(`PaymentMethod not found in ${t.id}`);if(n.type!=="arcblock")return{enabled:!1,remaining:"0",used:"0",shouldPay:"0",unused:"0",revokedStake:"0"};if(!t.overdraft_protection)return{enabled:!1,remaining:"0",used:"0",shouldPay:"0",unused:"0",revokedStake:"0"};let i=n.getOcapClient(),o=t?.overdraft_protection?.payment_details?.arcblock?.staking?.address;if(!o)return y.info("Seems you have no staking for overdraft protection",{subscription:t.id}),{enabled:!1,remaining:"0",used:"0",shouldPay:"0",unused:"0",revokedStake:"0"};let{state:a}=await i.getStakeState({address:o});if(!a)throw new Error(`Stake state not found in ${t.id}`);if(!JSON.parse(a.data?.value||"{}")[t.id]&&!a.nonce)throw new Error(`No staking for subscription: ${t.id}, address: ${o}`);let c=new F(a.tokens.find(h=>h.address===r.contract)?.value||"0"),u=new F(a.revokedTokens?.find(h=>h.address===r.contract)?.value||"0"),l=(await Rt.findAll({where:{subscription_id:t.id,type:"stake_return",status:{[J.notIn]:["canceled","succeeded"]},currency_id:r.id},include:[{model:ce,as:"invoice"}]})).filter(h=>h.invoice?.billing_reason==="stake_overdraft_protection").reduce((h,g)=>h.add(new F(g.amount)),new F(0));c=c.sub(l);let p=await ce.findAll({where:{subscription_id:t.id,status:["open","uncollectible"],currency_id:r.id}}),f=new F(0),m=new F(0);return p.forEach(h=>{f=f.add(new F(h.amount_remaining)),h.billing_reason!=="overdraft_protection"&&(m=m.add(new F(h.amount_remaining)))}),{enabled:t.overdraft_protection.enabled&&f.lte(c),remaining:c.toString(),used:f.toString(),shouldPay:m.toString(),revoked:u.toString(),unused:c.gte(f)?c.sub(f).toString():"0"}}catch(r){return y.error("error in isSubscriptionOverdraftProtectionEnabled",{error:r}),{enabled:!1,remaining:"0",used:"0",unused:"0",shouldPay:"0",revokedStake:"0"}}}async function jPe(t,e,r){y.info("returnOverdraftProtectionStake",{subscription:t.id,paymentCurrencyId:e});try{await aY(t,e);let{unused:n}=await Ta(t,e);if(n!=="0"){let i=t?.overdraft_protection?.payment_details?.arcblock?.staking?.address;if(!i){y.info("Stake return skipped due to missing staking address",{subscription:t.id});return}let o=await ce.findOne({where:{subscription_id:t.id,billing_reason:"stake_overdraft_protection",currency_id:e||t.currency_id,status:"paid"},order:[["created_at","DESC"]]}),a=await Rt.create({type:"stake_return",amount:n,description:"stake_return_for_subscription_guard",status:"pending",reason:r||"requested_by_admin",subscription_id:t.id,currency_id:e||t.currency_id,livemode:t.livemode,customer_id:t.customer_id,invoice_id:o?.id,payment_intent_id:o?.payment_intent_id||"",payment_method_id:t.overdraft_protection?.payment_method_id||"",starting_balance:n,ending_balance:"0",attempt_count:0,attempted:!1,next_attempt:0,last_attempt_error:null,starting_token_balance:{},ending_token_balance:{},payment_details:{arcblock:{receiver:t?.overdraft_protection?.payment_details?.arcblock?.payer||oo(t,"arcblock"),staking:{address:i||"",tx_hash:""}}}});y.info("returnOverdraftProtectionStake Refund created",{item:a})}}catch(n){throw y.error("returnOverdraftProtectionStake failed",{error:n}),n}}async function aY(t,e){let r=Qr(`slash_overdraft_protection_stake_${t.id}-${e||t.currency_id}`);y.info("slashOverdraftProtectionStake",{subscription:t.id,paymentCurrencyId:e});try{if(await r.acquire(),!t.overdraft_protection){y.info("slashOverdraftProtectionStake skipped due to missing overdraft protection",{subscription:t.id});return}let n=await W.findByPk(e||t.currency_id);if(!n)throw new Error(`PaymentCurrency not found in ${t.id}`);let{used:i,remaining:o,revoked:a}=await Ta(t,n.id),s=new F(o).add(new F(a)).toString();if(i==="0"){y.info("slashOverdraftProtectionStake skipped due to no unpaid invoices",{subscription:t.id,paymentCurrencyId:n.id});return}if(s==="0"){y.info("slashOverdraftProtectionStake skipped due to no remaining stake",{subscription:t.id,paymentCurrencyId:n.id});return}let c=await Y.findByPk(n.payment_method_id);if(!c||c.type!=="arcblock")throw new Error(`PaymentMethod type not supported in ${t.id}`);let u=t?.overdraft_protection?.payment_details?.arcblock?.staking?.address;if(!u){y.info("Stake slashing skipped due to missing staking address",{subscription:t.id});return}let d=c.getOcapClient(),{state:l}=await d.getStakeState({address:u});if(!l||!l.data?.value)throw new Error(`Stake slashing aborted due to missing staking state for subscription: ${t.id}, address: ${u}`);if(!JSON.parse(l.data.value||"{}")[t.id]&&!l.nonce)throw new Error(`Stake slashing aborted because no staking for subscription: ${t.id}, address: ${u}`);let f=await ce.findAll({where:{subscription_id:t.id,status:["open","uncollectible"],currency_id:n.id},order:[["created_at","ASC"]]}),m=new F(0),h=[];for(let b of f){b.payment_intent_id||(await Lf("invoice.queued",b.id,{invoiceId:b.id,retryOnError:!1,justCreate:!0},{sync:!0}),await b.reload());let E=await Te.findByPk(b.payment_intent_id);if(E)if(E.status==="succeeded"&&b.status==="paid")y.info("PaymentIntent and Invoice already updated",{subscription:t.id,paymentIntent:E.id,invoice:b.id});else{let R=m.add(new F(b.amount_remaining));if(R.lte(new F(s)))m=R,h.push(b);else break}}let g=[],_=async b=>{let E=await Te.findByPk(b.payment_intent_id);if(!(!E||E.status==="succeeded"&&b.status==="paid"))try{if(!(await Sa(c,n,u,b.amount_remaining)).enough)throw new Error(`Stake slashing aborted because no enough staking for invoice: ${b.id}`);let R=await d.signSlashStakeTx({tx:{itx:{address:u,outputs:[{owner:we.address,tokens:[{address:n.contract,value:b.amount_remaining}]}],message:"overdraft_exceeded",data:{typeUrl:"json",value:{appId:we.address,reason:"overdraft_exceeded",subscriptionId:t.id,invoiceId:b.id,paymentIntentId:E.id}}}},wallet:we}),{buffer:C}=await d.encodeSlashStakeTx({tx:R}),L=await d.sendSlashStakeTx({tx:R,wallet:we},await Qn(C));await E.update({status:"succeeded",amount_received:b.amount_remaining,capture_method:"manual",last_payment_error:null,payment_details:{arcblock:{tx_hash:L,payer:t.overdraft_protection?.payment_details?.arcblock?.payer||oo(t,"arcblock"),type:"slash"}}}),y.info("PaymentIntent updated after stake slash",{subscription:t.id,paymentIntent:E.id,status:"succeeded"}),await b.update({status:"paid",paid:!0,amount_paid:b.amount_remaining,amount_remaining:"0",attempted:!0,attempt_count:b.attempt_count+1,status_transitions:{...b.status_transitions,paid_at:se().unix()}}),y.info("Invoice updated after stake slash",{subscription:t.id,invoice:b.id,status:"paid"}),g.push(b.id)}catch(A){throw y.error("stake slash failed",{subscription:t.id,invoice:b.id,error:A}),A}};await Promise.all(h.map(_)),y.info(`${g.length} invoices updated after stake slash`,{subscription:t.id,invoices:g,slashAmount:m.toString()})}catch(n){throw y.error("Error in slashOverdraftProtectionStake",{error:n}),n}finally{r.release()}}async function GPe(t){try{return await ce.count({where:{subscription_id:t.id,status:["open","uncollectible"],billing_reason:{[J.notIn]:["overdraft_protection"]}}})}catch(e){return y.error("getSubscriptionUnpaidInvoicesCount failed",{error:e}),0}}function JPe(t,e){if(!t||t.length===0)return{amount:"0",cycle:0,desc:"no subscription",interval:""};let r={hour:[],day:[],month:[],year:[]};t.forEach(l=>{l.items?.length&&l.items.forEach(p=>{let{price:f}=p;if(f?.type==="recurring"&&f.recurring?.interval){let m=f.recurring.interval;Object.keys(r).includes(m)&&r[m].push({subscription:l,item:p,price:f})}})});let n=r.hour.length>0,i=r.day.length>0,o=r.month.length>0,a=r.year.length>0,s="",c=0,u="";o?(s="month",c=720*60*60,u="monthly"):(n||i)&&!a?(s="week",c=10080*60,u="weekly"):(i||n)&&a?(s="month",c=720*60*60,u="monthly"):a&&(s="year",c=365*24*60*60,u="yearly");let d=new F(0);return t.forEach(l=>{l.items?.length&&l.items.forEach(p=>{let{price:f}=p;if(!f)return;let m=Yn(f,e),h=p.quantity||1,g=new F(m).mul(new F(h));if(f.type==="recurring"&&f.recurring?.interval){let{interval:_}=f.recurring,b=f.recurring.interval_count||1;s==="month"?_==="hour"?g=g.mul(new F(720)).div(new F(b)):_==="day"?g=g.mul(new F(30)).div(new F(b)):_==="month"?g=g.div(new F(b)):_==="year"&&(g=g.div(new F(12*b))):s==="week"&&(_==="hour"?g=g.mul(new F(168)).div(new F(b)):_==="day"&&(g=g.mul(new F(7)).div(new F(b)))),d=d.add(g)}else f.type==="one_time"&&(d=d.add(g))})}),{amount:d.toString(),cycle:c,desc:u,interval:s}}async function bw(t){return(await He.findAll({where:{subscription_id:t.id},include:[{model:ne,as:"price"}]})).filter(n=>n.price.recurring?.meter_id).map(n=>n.price.id)}var Lv,$Pe,iY,YAt,Pr=N(()=>{"use strict";Qo();qe();Ly();uke();Hr();Ss();$e();Zt();_e();Cr();pr();he();Yf();_u();pu();Qf();ki();ke();cC();Ir();ai();mu();Rn();Pv();Pv();Lv=t=>t==="hour"?60:t==="day"?3600:3600*24,$Pe=t=>t==="hour"?10:t==="day"?15:t==="week"?18:20,iY=t=>t==="hour"?9:t==="day"?13:15,YAt=new F(0)});function sY(t,e,r){typeof t=="function"&&(r=e,e=t,t=null);let n=[],i=!1,o=null;async function a(){if(!i){for(i=!0;n.length>0;){let c=n.shift();try{await new Promise(u=>{let d=!1,l=(f,m)=>{d||(d=!0,c.cb?.(f,m),u())},p=e(c.data,l);p&&typeof p.then=="function"&&p.then(()=>{d||(console.warn("[fastq-shim] worker resolved without calling cb \u2014 resolving with no-op"),d=!0,u())},f=>{d||(console.error("[fastq-shim] worker rejected without calling cb:",f),d=!0,c.cb?.(f),u())})})}catch(u){console.error("[fastq-shim] unexpected error in processQueue:",u),c.cb?.(u)}}i=!1,n.length===0&&o&&o()}}return{push(c,u){n.push({data:c,cb:u}),queueMicrotask(()=>a())},unshift(c,u){n.unshift({data:c,cb:u}),queueMicrotask(()=>a())},pause(){},resume(){},idle(){return n.length===0&&!i},length(){return n.length},kill(){n.length=0},killAndDrain(){n.length=0,o&&o()},get drain(){return o},set drain(c){o=c},empty:null,saturated:null,error:null}}var VPe=N(()=>{"use strict"});function cY(t){return{async isCancelled(e){let r=await ia.findOne({where:{queue:t,id:e},transaction:null});return!!r&&!!r.cancelled},getJob(e){return ia.findOne({where:{queue:t,id:e},transaction:null})},getJobs(){return ia.findAll({where:{queue:t,delay:-1,cancelled:!1},order:[["created_at","ASC"]],transaction:null})},getScheduledJobs(){return ia.findAll({where:{queue:t,delay:{[J.not]:-1},will_run_at:{[J.lte]:Date.now()},cancelled:!1},order:[["created_at","ASC"]],transaction:null})},findJobs(e){return ia.findAll({where:{queue:t,cancelled:!1,...e},order:[["created_at","ASC"]],transaction:null})},async updateJob(e,r){let n=await ia.findOne({where:{queue:t,id:e},transaction:null});if(!n)throw new Si("JOB_NOT_FOUND",`Job ${e} does not exist`);return n.update(r)},async addJob(e,r,n={},i=!1){if(!i){let o=await ia.findOne({where:{id:e}});if(o)throw new Si("JOB_DUPLICATE",`Job with id ${e} already exists ${o.queue===t?"in the same queue":`in queue ${o.queue}`}`)}try{return await ia.create({id:e,job:r,queue:t,retry_count:1,cancelled:!1,...n})}catch(o){throw o.name==="SequelizeUniqueConstraintError"?new Si("JOB_DUPLICATE",`Job with id ${e} was created concurrently`):o}},async deleteJob(e){return await ia.destroy({where:{queue:t,id:e}})>0}}}var KPe=N(()=>{"use strict";$e();LT();s0()});var NF={};Je(NF,{clearTenantIdentityCache:()=>nSt,createEmbeddedIdentityServices:()=>uY,getCachedTenantIdentity:()=>XPe,hasDynamicIdentity:()=>zPe,resolveTenantIdentity:()=>xC,warmTenantIdentity:()=>EC});function rSt(t,e){if(k0.set(t,{value:e,expiry:Date.now()+eSt}),k0.size>tSt){let r=k0.keys().next().value;r!==void 0&&k0.delete(r)}}function nSt(t){t?k0.delete(t):k0.clear()}function zPe(){return typeof Xm().getInstanceAppIdentity=="function"}async function xC(t){let e=t??Le(),r=k0.get(e);if(r&&r.expiry>Date.now())return r.value;let n=Xm();if(typeof n.getInstanceAppIdentity!="function")throw new Error("resolveTenantIdentity: the active IdentityDriver does not implement getInstanceAppIdentity \u2014 a non-blocklet-server DID-Connect runtime requires an AUTH_SERVICE-backed identity driver");let i=await n.getInstanceAppIdentity(e);if(!i||!i.appSk)throw new Error(`resolveTenantIdentity: no app signing key for instance "${e}" (fail-closed)`);if(i.appSk.length<66)throw new Error(`resolveTenantIdentity: appSk for instance "${e}" is too short (${i.appSk.length} chars) to derive a wallet (fail-closed)`);let o=W_(i.appSk,WPe),a=W_(i.appSk.slice(0,66),ZAt),s=i.appPsk?W_(i.appPsk,WPe):o,c={instanceDid:e,wallet:o,ethWallet:a,permanentWallet:s,appInfo:i.appInfo??{}};return rSt(e,c),c}function XPe(t){let e=t??Le(),r=k0.get(e);if(!r||r.expiry<=Date.now())throw new Error(`tenant identity for "${e}" is not resolved (fail-closed) \u2014 warmTenantIdentity must run in the request/job scope before any wallet access`);return r.value}async function EC(t){if(zPe()){try{await xC(t)}catch(e){y.warn("[tenant-identity] wallet identity warm failed \u2014 wallet access will fail-closed",{error:e instanceof Error?e.message:String(e)})}try{await XIe(t)}catch(e){y.warn("[tenant-identity] secrets warm failed \u2014 settings/Stripe decrypt will fail-closed",{error:e instanceof Error?e.message:String(e)})}}}function uY(){return{getBusinessWallet(t){let e=XPe();return t==="ethereum"?e.ethWallet:e.wallet},directory(){return iSt}}}var WPe,ZAt,eSt,tSt,k0,iSt,P0=N(()=>{"use strict";Ou();of();nt();V_();he();Xz();WPe={role:Xe.RoleType.ROLE_APPLICATION,pk:Xe.KeyType.ED25519,hash:Xe.HashType.SHA3},ZAt=Tpe("ethereum"),eSt=300*1e3,tSt=512,k0=new Map;iSt={getUser(t){return t?{user:{did:t,fullName:t,email:"",phone:"",remark:"",connectedAccounts:[{provider:"wallet",did:t}]}}:{user:null}},getUsers(){return{users:[]}},getVault(){return null},getBlocklet(){return{id:"",site:{id:""}}}}});import YPe from"events";import{AsyncLocalStorage as oSt}from"async_hooks";function aSt(t){return!t||typeof t!="object"?t:t.instance_did?(p_(t.instance_did),t):{...t,instance_did:or.getInstanceDid()}}async function QPe(t,e){let{warmTenantIdentity:r}=(P0(),Pe(NF));return await r(),t(e)}function sSt(t,e){let r=t?.instance_did;if(r)return qr(r,()=>QPe(e,t));if(Ec()==="single")return qr(_d(),()=>QPe(e,t));let n=new Cn(Ks,"legacy job without tenant refused in multi mode");return n.nonRetryable=!0,y.error("[queue] legacy job without tenant refused",{code:Ks,job:t}),Promise.reject(n)}function Me(t){if(!t)return;let e=Ws(t),r=or.getInstanceDid();if(e!==r){y.error("TENANT_VIOLATION",{code:Bo,rowTenant:e,jobTenant:r});let n=new Cn(Bo,`job object belongs to ${e} but payload says ${r}`);throw n.nonRetryable=!0,n}}function Pt({name:t,onJob:e,options:r=ZPe}){let n=cY(t),{concurrency:i,maxRetries:o,maxTimeout:a,retryDelay:s,enableScheduledJob:c}=Object.assign({},ZPe,r),u=(w,x)=>w||(r.id?r.id(x):Xh())||Xh(),d=new YPe,l=new oSt,p=new Set,f=new Set,m=async(w,x)=>{if(p.has(w)){y.warn("Job already running, skipping",{id:w});return}p.add(w);try{await l.run({id:w},x)}finally{p.delete(w),y.info(`Running job deleted: ${w}`)}},h=sY(async({job:w,id:x,persist:v},P)=>{y.info("execute job",{id:x,job:w,persist:v}),await m(x,async()=>{if(v)try{if(await n.isCancelled(x)){P(null,dY);return}}catch(O){P(O);return}if(f.has(x)){P(null,dY),y.info(`Job skipped because it is cancelled: ${x}`),f.delete(x);return}try{let O=await P_e(()=>sSt(w,e),a);y.info("job finished",{id:x,result:O}),P(null,O)}catch(O){P(O)}})},i),g=({job:w,id:x,persist:v=!0,delay:P,runAt:O,skipDuplicateCheck:D=!1,fromStore:q=!1})=>{let B=new YPe,I=(ae,de)=>{d.emit(ae,de),B.emit(ae,de)},j=se().unix();if(!w)throw new Error("Can not queue empty job");let K=q?w:aSt(w),X=u(x,K);if(P&&P>=RF()||O&&O>j){if(!c)throw new Error("Must set options.enableScheduledJob to true to run delay jobs");if(P&&P<RF())throw new Error(`minimum delay is ${RF()}s`);let ae={};return P&&(ae.delay=P,ae.will_run_at=Date.now()+P*1e3),O&&(ae.delay=1,ae.will_run_at=O*1e3),n.addJob(X,K,ae,D).then(()=>{I("queued",{id:X,job:K,attrs:ae,persist:v}),y.info("delayed or scheduled job queued",{id:X,job:K,attrs:ae,persist:v})}).catch(de=>{console.error(de)}),B.id=X,B}let Z=ae=>n.deleteJob(ae),ie=async(ae,de)=>{if(de===dY){await Z(X),I("cancelled",{id:X,job:K});return}if(!ae){await Z(X),I("finished",{id:X,job:K,result:de});return}y.error("job errored",{queue:t,id:X,job:K,result:de,error:ae});try{let me=await n.getJob(X);if(!me){I("failed",{id:X,job:K,error:ae});return}if(ae&&ae.nonRetryable===!0){y.info("fail job due to non-retryable error",{id:X,job:K,errorCode:ae.code}),await Z(X),I("failed",{id:X,job:K,error:ae});return}if(me.retry_count>=o){y.info("fail job on max retry exceed",{id:X,job:K}),await Z(X),I("failed",{id:X,job:K,error:ae});return}await n.updateJob(X,{retry_count:me.retry_count+1}),y.info("retry job",{id:X,count:me.retry_count+1}),setTimeout(()=>{I("retry",{id:X,job:K,doc:me}),h.unshift({id:X,job:K,persist:v},ie)},s)}catch(me){console.error(me),await Z(X),I("failed",{id:X,job:K,error:me})}},ue=()=>setImmediate(()=>{I("queued",{id:X,job:K,persist:v}),y.info("queue job",{id:X,job:K}),f.has(X)&&f.delete(X),h.push({id:X,job:K,persist:v},ie)}),Q=()=>{};if(ux()==="workerd"){let ae=new Promise(de=>{Q=de});B.on("finished",Q),B.on("failed",Q),B.on("cancelled",Q),sq(ae)}return v?n.addJob(X,K,{},D).then(ue).catch(ae=>{y.error("Can not add job to store",{error:ae}),Q()}):ue(),B.id=X,B},_=w=>new Promise((x,v)=>{try{(w.runAt||w.delay)&&console.warn("You may have to wait for a long time to get the result of the delayed job");let P=g(w);P.on("finished",O=>x(O)),P.on("cancelled",O=>x(O)),P.on("failed",O=>v(O))}catch(P){v(P)}}),b=async w=>{let x=await n.updateJob(w,{cancelled:!0});return f.add(w),x?x.job:null},E=async w=>{let x=await n.getJob(w);return x?x.job:null},A=async(w,x=!1)=>{if(!x&&!await E(w))return!1;try{return f.add(w),await n.deleteJob(w),y.info(`Job deleted successfully: ${w}`),!0}catch(v){try{await b(w)}catch(P){console.error(`Error during job cancellation fallback for ${w}:`,P)}return console.error(`Error during job deletion process for ${w}:`,v),!1}},R=async(w,x)=>await n.updateJob(w,x);ux()==="node"&&process.nextTick(async()=>{try{ia.isInitialized()||ia.initialize(Bc),(await n.getJobs()).forEach(x=>{if(x.job&&x.id)try{g({job:x.job,id:x.id,persist:!1,fromStore:!0})}catch(v){y.error("failed to re-queue stored job",{id:x.id,code:v?.code,message:v?.message})}else y.info("skip invalid job from db",{job:x})})}catch(w){console.error(w),y.error(`Can not load existing ${t} jobs`,{error:w})}});let C=async()=>{let w=0,x=0;if(c!==!0)return{dispatched:w,failed:x};let v=await n.getScheduledJobs();for(let P of v)if(P.job&&P.id){await b(P.id),y.info("reschedule delayed or scheduled job",{id:P.id,job:P.job});try{g({job:P.job,id:P.id,persist:!1,fromStore:!0}),w+=1}catch(O){x+=1,y.error("failed to reschedule stored job",{id:P.id,code:O?.code,message:O?.message})}}else y.info("skip invalid job from db",{job:P});return{dispatched:w,failed:x}},L=!1,T=null,$=null,U=w=>new Promise(x=>{$=x,T=setTimeout(()=>{T=null,$=null,x()},w)}),H=()=>{if(L=!0,T&&(clearTimeout(T),T=null),$){let w=$;$=null,w()}};(async()=>{if(c===!0&&ux()==="node")for(;!L;){if(await U(RF()*1e3/2),L||ux()!=="node")return;try{await C()}catch(w){console.error(w),y.error(`Can not load scheduled ${t} jobs`,{error:w})}}})();let k=Object.assign(d,{store:n,push:g,pushAndWait:_,drain:w=>h.drain=w,empty:w=>h.empty=w,saturated:w=>h.saturated=w,error:w=>h.error=w,get:E,delete:A,cancel:b,update:R,stop:H,options:{concurrency:i,maxRetries:o,maxTimeout:a,retryDelay:s,enableScheduledJob:c}});return iq({name:t,enableScheduledJob:c===!0,handle:k,redispatchDue:C,stop:H}),k}var dY,RF,ZPe,Pi=N(()=>{"use strict";VPe();a3();Zt();he();nt();fa();ke();pr();KPe();YA();LT();E0();dY="__CANCELLED__",RF=()=>Dm()?2:8;ZPe={concurrency:1,maxRetries:1,maxTimeout:1440*60*1e3,retryDelay:0,enableScheduledJob:!1}});var iNe=G((XNr,nNe)=>{"use strict";var OF,tr,eNe={'"':'"',"\\":"\\","/":"/",b:"\b",f:"\f",n:`
|
|
309
|
+
`+vAt(r,4),super(r),this.name="AggregateError",Object.defineProperty(this,"_errors",{value:e})}*[Symbol.iterator](){for(let e of this._errors)yield e}};Gke.exports=BX});var Kke=G((MCr,Vke)=>{"use strict";var TAt=Jke();Vke.exports=async(t,e,{concurrency:r=1/0,stopOnError:n=!0}={})=>new Promise((i,o)=>{if(typeof e!="function")throw new TypeError("Mapper function is required");if(!((Number.isSafeInteger(r)||r===1/0)&&r>=1))throw new TypeError(`Expected \`concurrency\` to be an integer from 1 and up or \`Infinity\`, got \`${r}\` (${typeof r})`);let a=[],s=[],c=t[Symbol.iterator](),u=!1,d=!1,l=0,p=0,f=()=>{if(u)return;let m=c.next(),h=p;if(p++,m.done){d=!0,l===0&&(!n&&s.length!==0?o(new TAt(s)):i(a));return}l++,(async()=>{try{let g=await m.value;a[h]=await e(g,h),l--,f()}catch(g){n?(u=!0,o(g)):(s.push(g),l--,f())}})()};for(let m=0;m<r&&(f(),!d);m++);})});var Uy=G((UCr,Wke)=>{"use strict";var IAt=Kke();Wke.exports=(t,e)=>IAt(t,r=>r(),e)});function lw(t,e){if(!t.valid)return{valid:!1,reason:"This coupon is no longer available"};if(t.redeem_by&&Math.floor(Date.now()/1e3)>t.redeem_by)return{valid:!1,reason:"This coupon has expired and cannot be used"};if(t.max_redemptions&&(t.times_redeemed??0)>=t.max_redemptions)return{valid:!1,reason:"This coupon has been fully redeemed and is no longer available"};if(e&&e.length>0&&t.applies_to?.products){let r=t.applies_to?.products;if(r&&r.length>0&&!e.some(i=>r.includes(i.price?.product_id)))return{valid:!1,reason:"This coupon cannot be applied to the items in your cart"}}return{valid:!0}}async function $X(t,{customerId:e,amount:r,currencyId:n,checkoutSessionId:i}){if(!t.active)return{valid:!1,reason:"This promotion code is no longer available"};if(t.expires_at&&Math.floor(Date.now()/1e3)>t.expires_at)return{valid:!1,reason:"This promotion code has expired and cannot be used"};if(t.max_redemptions&&(t.times_redeemed??0)>=t.max_redemptions)return{valid:!1,reason:"This promotion code has been fully redeemed and is no longer available"};if(e){let a=(await te.findByPkOrDid(e))?.did||e;if(t.verification_type==="user_restricted"&&a&&!t.customer_dids?.includes(a))return{valid:!1,reason:"This promotion code is not available for your account"};if(t.restrictions?.first_time_transaction){let s={customer_id:e,coupon_id:t.coupon_id};if(i&&(s.checkout_session_id={[J.ne]:i}),await En.count({where:s})>0)return{valid:!1,reason:"This promotion is only available for first-time purchases"}}}if(r&&n&&(t.restrictions?.minimum_amount||t.restrictions?.currency_options?.[n])){let o=n===t.restrictions?.minimum_amount_currency?t.restrictions?.minimum_amount:t.restrictions?.currency_options?.[n]?.minimum_amount,a=await W.findByPk(n);if(o){let s=new F(r),c=new F(o);if(s.lt(c))return a?{valid:!1,reason:`This promotion requires a minimum purchase amount of ${vT(lt(c,a?.decimal||2))} ${a?.symbol}. Please add more items to your cart.`}:{valid:!1,reason:"This promotion requires a minimum purchase amount. Please add more items to your cart."}}}return{valid:!0}}function zke(t,e,r){if(t.percent_off>0)return new F(e).mul(new F(t.percent_off)).div(new F(100)).toString();if(t.amount_off){let n=t.currency_id===r.id?t.amount_off:t.currency_options?.[r.id]?.amount_off;if(n){let i=new F(n),o=new F(e);return F.min(i,o).toString()}}return"0"}async function Xke(t,e){try{if(t){let r=await Lt.findByPk(t);r&&!r.locked&&(await r.update({locked:!0}),y.info("Locked coupon when creating discount",{couponId:t}))}if(e){let r=await Jt.findByPk(e);r&&!r.locked&&(await r.update({locked:!0}),y.info("Locked promotion code when creating discount",{promotionCodeId:e}))}}catch(r){y.error("Error locking discount resources",{couponId:t,promotionCodeId:e,error:r.message})}}async function LX({checkoutSessionId:t,customerId:e}){let r=await En.findAll({where:{customer_id:e,checkout_session_id:t},include:[{model:Lt,as:"coupon"},{model:Jt,as:"promotionCode",required:!1}]});if(r.length===0)return{discountRecords:[],appliedDiscounts:[],discountBreakdown:[]};let n=r.map(o=>o.id),i=r.map(o=>({amount:o.metadata?.discount_amount||"0",discount:o.id}));return y.info("Retrieved discount records for checkout session",{checkoutSessionId:t,customerId:e,recordCount:r.length}),{discountRecords:r,appliedDiscounts:n,discountBreakdown:i}}async function CAt(t,e){try{let r=await En.findAll({where:{customer_id:t,checkout_session_id:e}}),n=new Map;return r.forEach(i=>{let o=i.subscription_id||"no_subscription";n.set(o,i)}),n}catch(r){throw y.error("Error fetching existing discount records",{customerId:t,checkoutSessionId:e,error:r.message}),new Error(`Failed to fetch existing discount records: ${r.message}`)}}function kAt({checkoutSession:t,customerId:e,coupon:r,promotionCode:n,discountAmount:i,verificationData:o}){let a=Math.floor(Date.now()/1e3),s;if(r.duration==="once")s=a+60;else if(r.duration==="repeating"&&r.duration_in_months){let c=new Date;c.setMonth(c.getMonth()+r.duration_in_months),s=Math.floor(c.getTime()/1e3)}return{livemode:r.livemode,coupon_id:r.id,promotion_code_id:n?.id,customer_id:e,checkout_session_id:t.id,start:a,end:s,verification_method:n?.verification_type,verification_data:o||t.metadata?.verification_data,metadata:{discount_amount:i,original_amount:t.amount_subtotal,final_amount:t.amount_total,currency_id:t.currency_id,applied_at:new Date().toISOString()}}}async function PAt({subscriptionId:t,baseDiscountData:e,existingDiscountMap:r,checkoutSessionId:n}){try{let i=r.get(t);if(i){let a=i.coupon_id!==e.coupon_id,s=i.promotion_code_id!==e.promotion_code_id,c=await i.update({...e,subscription_id:t});return y.info("Upserted discount record for subscription",{checkoutSessionId:n,subscriptionId:t,discountId:c.id,couponChanged:a,promoChanged:s}),{discountRecord:c,shouldUpdateUsage:a||s}}let o=await En.create({...e,subscription_id:t,confirmed:!1,metadata:{...e.metadata,subscription_id:t}});return await Xke(e.coupon_id,e.promotion_code_id),y.info("Created new discount record for subscription",{checkoutSessionId:n,subscriptionId:t,discountId:o.id}),{discountRecord:o,shouldUpdateUsage:!0}}catch(i){throw y.error("Error processing subscription discount",{subscriptionId:t,checkoutSessionId:n,error:i.message}),new Error(`Failed to process subscription discount: ${i.message}`)}}async function NAt(t,e,r){try{let n=e.get("no_subscription");if(n){let o=n.coupon_id!==t.coupon_id,a=n.promotion_code_id!==t.promotion_code_id,s=await n.update({...t});return y.info("Upserted single discount record",{checkoutSessionId:r,discountId:s.id,couponChanged:o,promoChanged:a}),{discountRecord:s,shouldUpdateUsage:o||a}}let i=await En.create({...t,confirmed:!1});return await Xke(t.coupon_id,t.promotion_code_id),y.info("Created new single discount record",{checkoutSessionId:r,discountId:i.id}),{discountRecord:i,shouldUpdateUsage:!0}}catch(n){throw y.error("Error processing non-subscription discount",{checkoutSessionId:r,error:n.message}),new Error(`Failed to process non-subscription discount: ${n.message}`)}}async function RAt({coupon:t,promotionCode:e,updatedCoupons:r,updatedPromotionCodes:n,checkoutSessionId:i}){try{let o=[],a=`${t.id}-${i}`,s=e?`${e.id}-${i}`:"";r.has(a)||(r.add(a),o.push(t.update({times_redeemed:(t.times_redeemed||0)+1}))),e&&s&&!n.has(s)&&(n.add(s),o.push(e.update({times_redeemed:(e.times_redeemed||0)+1}))),await Promise.all(o),Lf("discount-status.queued",t,"coupon",!0),e&&Lf("discount-status.queued",e,"promotion-code",!0),y.debug("Updated coupon and promotion code usage counts",{checkoutSessionId:i,couponId:t.id,promotionCodeId:e?.id})}catch(o){throw y.error("Error updating usage counts",{checkoutSessionId:i,couponId:t.id,promotionCodeId:e?.id,error:o.message}),new Error(`Failed to update usage counts: ${o.message}`)}}async function Yke({discountRecords:t,subscriptionsUpdated:e}){if(e.length===0)return{updatedSubscriptions:[]};let r=[];try{y.info("Updating subscription discount_id references",{subscriptionsToUpdate:e.length});let n=e.map(async o=>{try{let a=t.find(c=>c.subscription_id===o);if(!a)return y.warn("No discount record found for subscription",{subscriptionId:o}),null;let[s]=await ee.update({discount_id:a.id},{where:{id:o}});return s>0?(y.debug("Updated subscription discount_id",{subscriptionId:o,discountId:a.id}),o):(y.warn("Subscription not found for discount_id update",{subscriptionId:o}),null)}catch(a){return y.error("Failed to update subscription discount_id",{subscriptionId:o,error:a.message}),null}}),i=await Promise.all(n);return r.push(...i.filter(o=>o!==null)),y.info("Completed subscription discount_id reference updates",{requestedUpdates:e.length,successfulUpdates:r.length}),{updatedSubscriptions:r}}catch(n){throw y.error("Error updating subscription discount references",{subscriptionsUpdated:e,error:n.message}),new Error(`Failed to update subscription discount references: ${n.message}`)}}async function FX({checkoutSession:t,customerId:e,subscriptionIds:r=[]}){if(!t.discounts?.length)return{discountRecords:[],updatedCoupons:[],updatedPromotionCodes:[],subscriptionsUpdated:[]};y.info("Creating/updating discount records for checkout session",{checkoutSessionId:t.id,customerId:e,subscriptionIds:r});try{let n=await CAt(e,t.id),i=new Set,o=new Set,a=[],s=[],c=t.discounts.map(async d=>{let{promotion_code:l,coupon:p,discount_amount:f}=d;if(!p)return y.warn("Incomplete discount configuration, skipping",{checkoutSessionId:t.id,hasCoupon:!!p}),null;try{let[m,h]=await Promise.all([Lt.findByPk(p),l?Jt.findByPk(l):Promise.resolve(null)]);if(!m)return y.warn("Coupon not found, skipping discount",{couponId:p,checkoutSessionId:t.id}),null;let g=kAt({checkoutSession:t,customerId:e,coupon:m,promotionCode:h||void 0,discountAmount:f,verificationData:d.verification_data}),_=[],b=!1,E=[];if(r.length>0){let A=r.map(async C=>{try{let L=await PAt({subscriptionId:C,baseDiscountData:g,existingDiscountMap:n,checkoutSessionId:t.id});return L.shouldUpdateUsage&&E.push(C),L.discountRecord}catch(L){return y.error("Failed to process subscription discount, continuing with others",{subscriptionId:C,error:L.message}),null}}),R=await Promise.all(A);_.push(...R.filter(C=>C!==null)),E.length>0&&(b=!0)}else try{let A=await NAt(g,n,t.id);_.push(A.discountRecord),b=A.shouldUpdateUsage}catch(A){throw y.error("Failed to process non-subscription discount",{checkoutSessionId:t.id,error:A.message}),A}if(b)try{await RAt({coupon:m,promotionCode:h||void 0,updatedCoupons:i,updatedPromotionCodes:o,checkoutSessionId:t.id}),await Promise.all(_.map(async A=>{await A.update({confirmed:!0})}))}catch(A){y.error("Failed to update usage counts, but continuing",{couponId:m.id,promotionCodeId:h?.id,error:A.message})}return{discountRecords:_,subscriptionsUpdated:E}}catch(m){return y.error("Error processing discount configuration, skipping",{couponId:p,promotionCodeId:l,checkoutSessionId:t.id,error:m.message}),null}});return(await Promise.all(c)).forEach(d=>{d&&(a.push(...d.discountRecords),s.push(...d.subscriptionsUpdated))}),y.info("All discount records processed successfully",{checkoutSessionId:t.id,customerId:e,totalRecords:a.length,subscriptionCount:r.length,subscriptionsUpdated:s.length,updatedCouponsCount:i.size,updatedPromotionCodesCount:o.size}),{discountRecords:a,updatedCoupons:Array.from(i),updatedPromotionCodes:Array.from(o),subscriptionsUpdated:s}}catch(n){throw y.error("Critical error processing discount records for checkout",{checkoutSessionId:t.id,customerId:e,subscriptionIds:r,error:n.message}),new Error(`Failed to process discount records: ${n.message}`)}}async function lF({promotionCode:t,couponId:e,customerId:r,amount:n,currencyId:i,lineItems:o=[],checkoutSessionId:a}){let s=0;if(a&&(s=await En.count({where:{checkout_session_id:a,promotion_code_id:t.id,confirmed:!0}})),!t.active&&s===0)return{eligible:!1,reason:"This promotion code is no longer available"};if(t.expires_at&&Math.floor(Date.now()/1e3)>t.expires_at)return{eligible:!1,reason:"This promotion code has expired and cannot be used"};if(t.max_redemptions&&(t.times_redeemed??0)-s>=t.max_redemptions)return{eligible:!1,reason:"This promotion code has been fully redeemed and is no longer available"};let c=await Lt.findByPk(e);if(!c)return{eligible:!1,reason:"This promotion is no longer available"};let u=c.valid;s>0&&(c.valid||(c.valid=!0),c.times_redeemed&&c.times_redeemed>0&&(c.times_redeemed-=s));let d=lw(c,o);if(s>0&&(c.valid=u,c.times_redeemed!=null&&(c.times_redeemed+=s)),!d.valid)return{eligible:!1,reason:d.reason};let l=t.active;s>0&&(t.active||(t.active=!0),t.times_redeemed&&t.times_redeemed>0&&(t.times_redeemed-=s));let p=await $X(t,{customerId:r,amount:n,currencyId:i,checkoutSessionId:a});return s>0&&(t.active=l,t.times_redeemed!=null&&(t.times_redeemed+=s)),p.valid?{eligible:!0}:{eligible:!1,reason:p.reason}}async function OAt({discount:t}){let e=await Lt.findByPk(t.coupon_id);if(!e)return{valid:!1,reason:"This discount is no longer available",shouldRemove:!0};let r=Math.floor(Date.now()/1e3);switch(e.duration){case"once":return{valid:!1,reason:"One-time discount cannot be applied to subscription billing",shouldRemove:!0};case"repeating":if(!t.end)return{valid:!1,reason:"Repeating discount missing end date",shouldRemove:!0};if(r>Number(t.end))return{valid:!1,reason:"Repeating discount has expired",shouldRemove:!0};break;case"forever":break;default:return{valid:!1,reason:`Unknown coupon duration: ${e.duration}`,shouldRemove:!0}}return{valid:!0}}async function Qke({subscriptionId:t,customerId:e}){let r=await En.findAll({where:{customer_id:e,subscription_id:t},include:[{model:Lt,as:"coupon"},{model:Jt,as:"promotionCode"}]}),n=[],i=[];return y.info("Found discounts for subscription billing",{subscriptionId:t,discountCount:r.map(o=>o.id)}),await Promise.all(r.map(async o=>{let a=await OAt({discount:o,subscriptionId:t});a.valid?n.push(o):(i.push(o),y.info("Expired discount for subscription billing",{subscriptionId:t,discountId:o.id,reason:a.reason}))})),{validDiscounts:n,expiredDiscounts:i}}async function MX(t,e,r){return e?.length?await Promise.all(t.map(async i=>{if(!i.discount_amounts?.length)return i;let o=await Promise.all(i.discount_amounts.map(async a=>{let s=null,c=null,u=e.find(d=>d.coupon||d.promotion_code);if(u){if(u.coupon){let d=await Lt.findByPk(u.coupon);d&&(s={object:"coupon",id:d.id,name:d.name,amount_off:d.amount_off,percent_off:d.percent_off,currency:d.currency_id,duration:d.duration,duration_in_months:d.duration_in_months,has_applies_to_products:!0})}if(u.promotion_code){let d=await Jt.findByPk(u.promotion_code);d&&(c={object:"promotion_code",id:d.id,code:d.code})}}return{...a,coupon:s,promotion_code:c,currency:r}}));return{...i,discount_amounts:o}})):t}async function aC(t){return t?.length?await Promise.all(t.map(async r=>{let n=null,i=null;if(r.coupon){let o=await Lt.findByPk(r.coupon);o&&(n=Re(o,["id","name","percent_off","amount_off","valid","duration","duration_in_months","currency_id","currency_options"]))}if(r.promotion_code){let o=await Jt.findByPk(r.promotion_code);o&&(i=Re(o,["id","code"]))}return{...r,coupon_details:n,promotion_code_details:i}})):[]}var pw=N(()=>{"use strict";qe();$e();Hr();_e();he();Rn();ke()});async function qy(t){let e=t?.config?.httpEndpoint||"unknown";if(we.address===Zke&&e===ePe&&Cv!==null&&Date.now()-tPe<DAt)return Cv;try{let{state:r}=await t.getAccountState({address:we.address});return Cv=r?.migratedFrom||[],Zke=we.address,ePe=e,tPe=Date.now(),Cv.length>0&&y.info("wallet-migration: loaded migratedFrom list",{walletAddress:we.address,chainHost:e,migratedFrom:Cv}),Cv}catch(r){return y.error("wallet-migration: failed to get migratedFrom list",{walletAddress:we.address,chainHost:e,error:r}),[]}}async function rPe({storedAddress:t,delegator:e,client:r}){let n=r?.config?.httpEndpoint||"unknown";if(t)try{let{state:d}=await r.getDelegateState({address:t});if(d?.ops?.length>0)return{address:t,needsBackfill:!1,source:"stored"};y.warn("wallet-migration: stored delegation address has no valid state, falling back",{storedAddress:t,delegator:e,hasState:!!d,opsCount:d?.ops?.length||0})}catch(d){y.warn("wallet-migration: failed to query stored delegation address, falling back",{storedAddress:t,delegator:e,error:d})}let i=U_(e,we.address),o={hasState:!1,opsCount:0},[a,s]=await Promise.all([r.getDelegateState({address:i}).catch(d=>(o.error=String(d),y.warn("wallet-migration: failed to query current delegation state",{address:i,error:d}),{state:null})),qy(r)]),c=a.state;if(o={hasState:!!c,opsCount:c?.ops?.length||0,error:o.error},(c?.ops?.length??0)>0)return{address:i,needsBackfill:!0,source:"current"};let u=[];if(s.length>0){let d=await Promise.allSettled(s.map(async l=>{let p=U_(e,l),{state:f}=await r.getDelegateState({address:p});return{appDid:l,address:p,state:f}}));for(let l=0;l<d.length;l++){let p=d[l],f=s[l];if(p.status==="fulfilled"){let{address:m,state:h}=p.value;if(u.push({appDid:f,address:m,hasState:!!h,opsCount:h?.ops?.length||0}),(h?.ops?.length??0)>0)return y.info("wallet-migration: found delegation in migratedFrom",{delegator:e,oldAppDid:f,oldAddress:m}),{address:m,needsBackfill:!0,source:"migrated"}}else{let m=U_(e,f);u.push({appDid:f,address:m,hasState:!1,opsCount:0,error:String(p.reason)}),y.warn("wallet-migration: failed to query migrated delegation state",{address:m,oldAppDid:f,error:p.reason})}}}return y.error("wallet-migration: no delegation found after full search",{delegator:e,chainHost:n,currentWalletAddress:we.address,currentDelegationAddress:i,currentStateResult:o,migratedFromCount:s.length,migratedResults:u}),null}async function nPe({storedAddress:t,userDid:e,nonce:r,client:n}){if(t)return{address:t,needsBackfill:!1,source:"stored"};let i=Bu(e,we.address,r);try{let{state:a}=await n.getStakeState({address:i});if(a)return{address:i,needsBackfill:!0,source:"current"}}catch(a){y.warn("wallet-migration: failed to query current stake state",{address:i,error:a})}let o=await qy(n);for(let a of o){let s=Bu(e,a,r);try{let{state:c}=await n.getStakeState({address:s});if(c)return y.info("wallet-migration: found stake in migratedFrom",{userDid:e,nonce:r,oldAppDid:a,oldAddress:s}),{address:s,needsBackfill:!0,source:"migrated"}}catch(c){y.warn("wallet-migration: failed to query migrated stake state",{address:s,oldAppDid:a,error:c})}}return null}async function sC({client:t}){let e=Bu(we.address,we.address);try{let{state:n}=await t.getStakeState({address:e});if(n)return{address:e,needsBackfill:!1,source:"current"}}catch(n){y.warn("wallet-migration: failed to query current app stake state",{address:e,error:n})}let r=await qy(t);for(let n of r){let i=Bu(n,n);try{let{state:o}=await t.getStakeState({address:i});if(o)return y.info("wallet-migration: found app stake in migratedFrom",{oldAppDid:n,oldAddress:i}),{address:i,needsBackfill:!1,source:"migrated"}}catch(o){y.warn("wallet-migration: failed to query migrated app stake state",{address:i,oldAppDid:n,error:o})}}return null}async function iPe(t,e){if(!t)return!1;try{let r=await ee.findByPk(t);if(!r||r.payment_details?.arcblock?.delegation_address)return!1;let n=r.payment_details?.arcblock;return n?(await r.update({payment_details:{...r.payment_details,arcblock:{...n,delegation_address:e}}}),y.info("wallet-migration: backfilled delegation_address",{subscriptionId:r.id,address:e}),!0):(y.info("migration: cannot backfill delegation_address - missing arcblock payment_details",{subscriptionId:r.id}),!1)}catch(r){return y.error("wallet-migration: failed to backfill delegation_address",{subscriptionId:t,address:e,error:r}),!1}}var DAt,Cv,Zke,ePe,tPe,cC=N(()=>{"use strict";j_();Ir();he();_e();DAt=300*1e3,Cv=null,Zke=null,ePe=null,tPe=0});async function uC({lineItems:t,promotionCodeId:e,couponId:r,discountId:n,customerId:i,currency:o,totalAmount:a,billingContext:s}){let c=null;n&&(c=await En.findByPk(n));let u=a??UX(t,o.id,s),d=await Lt.findByPk(c?.coupon_id||r);if(!d)return{enhancedLineItems:t.map(h=>({...h,discountable:!1,discount_amounts:[]})),discountSummary:{appliedCoupon:null,discountAmount:"0",totalDiscountAmount:"0",finalTotal:u},notValidReason:"Coupon not found"};let l=!1,p="";if(e||c?.promotion_code_id){let m=await Jt.findByPk(e||c?.promotion_code_id);if(!m)l=!1;else{let h=await lF({promotionCode:m,couponId:r,customerId:i,amount:u,currencyId:o.id,lineItems:t});l=h.eligible,p=h.reason||""}}else{let m=await lw(d,t);l=m.valid,p=m.reason||""}return l?{...sPe({lineItems:t,coupon:d,discount:c,currency:o,totalAmount:a,billingContext:s}),notValidReason:void 0}:{enhancedLineItems:t.map(h=>({...h,discountable:!1,discount_amounts:[]})),discountSummary:{appliedCoupon:null,discountAmount:"0",totalDiscountAmount:"0",finalTotal:u},notValidReason:p}}function sPe({lineItems:t,coupon:e,discount:r,currency:n,totalAmount:i,billingContext:o}){let a=i??UX(t,n.id,o),s=t.filter(m=>e.applies_to?.products?.length?e.applies_to.products.some(h=>m.price?.product_id===h):!0);if(s.length===0)return{enhancedLineItems:t.map(h=>({...h,discountable:!1,discount_amounts:[]})),discountSummary:{appliedCoupon:null,discountAmount:"0",totalDiscountAmount:"0",finalTotal:a}};let c=s.reduce((m,h)=>{let g=oPe(h,n.id);return new F(m).add(new F(g)).toString()},"0"),u=zke(e,c,n);if(e.amount_off&&(!e.percent_off||e.percent_off<=0)&&u==="0")return{enhancedLineItems:t.map(h=>({...h,discountable:!1,discount_amounts:[]})),discountSummary:{appliedCoupon:null,discountAmount:"0",totalDiscountAmount:"0",finalTotal:a}};let d=new F(u).gt(new F(a))?a:u,l=new F(a).sub(new F(d)),p=l.lt(new F("0"))?"0":l.toString();return{enhancedLineItems:t.map(m=>{if(!s.includes(m))return{...m,discountable:!1,discount_amounts:[]};let g=oPe(m,n.id),_="0";return e.percent_off>0?_=new F(g).mul(new F(e.percent_off)).div(new F(100)).toString():e.amount_off&&c!=="0"&&(_=new F(g).mul(new F(d)).div(new F(c)).toString()),{...m,discountable:!0,discount_amounts:_!=="0"?[{amount:_,coupon:e.id,discount:r?.id}]:[]}}),discountSummary:{appliedCoupon:e.id,discountAmount:d,totalDiscountAmount:d,finalTotal:p}}}async function cPe({lineItems:t,discount:e,currency:r,totalAmount:n,billingContext:i}){let o=await Lt.findByPk(e.coupon_id);if(!o)return y.error("Coupon not found for stored discount",{discountId:e.id,couponId:e.coupon_id}),{enhancedLineItems:t.map(c=>({...c,discountable:!1,discount_amounts:[]})),discountSummary:{appliedCoupon:null,discountAmount:"0",totalDiscountAmount:"0",finalTotal:n??UX(t,r.id,i)}};let a=sPe({lineItems:t,coupon:o,discount:e,currency:r,totalAmount:n,billingContext:i});return y.info("Applied subscription discount",{discountId:e.id,originalTotal:n,discountAmount:a.discountSummary.discountAmount,finalTotal:a.discountSummary.finalTotal}),a}async function aPe(t,e){let r=t.times_redeemed||0;r<=0||(e==="coupon"?await t.update({times_redeemed:r-1,valid:!0}):await t.update({times_redeemed:r-1,active:!0}),y.info("Updated usage for resource",{resourceId:t.id,resourceType:e,currentUsage:r-1}),Lf("discount-status.queued",t,e,!0))}async function dC(t){try{let e=await ve.findByPk(t);if(!e){y.error("Checkout session not found",{checkoutSessionId:t});return}if(e.status==="complete"){y.error("Cannot rollback completed session",{checkoutSessionId:t});return}let r=await En.findAll({where:{checkout_session_id:t},include:[{model:Lt,as:"coupon"},{model:Jt,as:"promotionCode",required:!1}]});if(r.length===0){y.info("No discounts found for checkout session",{checkoutSessionId:t});return}let n=new Map,i=new Map;r.forEach(a=>{a.confirmed&&(a.coupon?.id&&!n.has(a.coupon.id)&&n.set(a.coupon.id,a.coupon),a.promotionCode?.id&&!i.has(a.promotionCode.id)&&i.set(a.promotionCode.id,a.promotionCode))});let o=[...Array.from(i.values()).map(a=>aPe(a,"promotion-code")),...Array.from(n.values()).map(a=>aPe(a,"coupon"))];await Promise.all(o),await Promise.all(r.map(a=>a.destroy()))}catch(e){y.error("Discount rollback failed",{checkoutSessionId:t,error:e.message})}}var UX,oPe,lC=N(()=>{"use strict";qe();_e();Qf();pw();Rn();he();UX=(t,e,r)=>{let n=new F(0);return t.forEach(i=>{let o=i.upsell_price||i.price,a=o?.pricing_type==="dynamic"?i.custom_amount||i.quoted_amount:void 0,s=Yn(o,e);if(!(o?.type==="recurring"&&(r?.trialing||o?.recurring?.usage_type==="metered"))){if(a){n=n.add(new F(a));return}n=n.add(new F(s).mul(new F(i.quantity)))}}),n.toString()},oPe=(t,e)=>{let r=t.upsell_price||t.price,n=r?.pricing_type==="dynamic"?t.custom_amount||t.quoted_amount:void 0;if(n)return new F(n).toString();let i=Yn(r,e);return new F(i).mul(new F(t.quantity)).toString()}});import HX from"crypto";function dPe(t){if(!t)return!1;if(t.name==="SequelizeUniqueConstraintError")return!0;let e=String(t.message||"").toLowerCase();return e.includes("unique constraint")||e.includes("unique violation")}function mF(t){let{contextId:e,priceId:r,currencyId:n,quantity:i,baseAmount:o,salt:a}=t,s=a?`:${a}`:"";return HX.createHash("sha256").update(`${e}:${r}:${n}:${i}:${o}${s}`).digest("hex").substring(0,64)}function Ci(){return qX||(qX=new jX),qX}var uPe,pF,fF,jX,qX,Zf=N(()=>{"use strict";qe();_e();Yf();he();_u();pu();s0();uPe=.5,pF=t=>{if(t==null)return uPe;let e=typeof t=="string"?Number(t):t;return!Number.isFinite(e)||e<0?uPe:e},fF=t=>t.consensus_method?t.consensus_method:t.providers&&t.providers.length>1?"median":"single";jX=class{async getOrCreateQuote(e){let{price_id:r,session_id:n,invoice_id:i,target_currency_id:o,quantity:a,idempotency_key_salt:s}=e;if(!r||!o||!a)throw new zr("INVALID_PARAMS","price_id, target_currency_id, and quantity are required");if(!n&&!i)throw new zr("INVALID_PARAMS","Either session_id or invoice_id must be provided");let c=await ne.findByPk(r);if(!c)throw new zr("PRICE_NOT_FOUND",`Price ${r} not found`);if(c.pricing_type!=="dynamic")throw new zr("INVALID_PRICE_TYPE",`Price ${r} is not a dynamic price`);if(!c.base_currency||!c.base_amount)throw new zr("INVALID_PRICE_CONFIG",`Price ${r} missing base_currency or base_amount`);let u=await W.findByPk(o,{include:[{model:Y,as:"payment_method"}]});if(!u)throw new zr("CURRENCY_NOT_FOUND",`Currency ${o} not found`);if(u.payment_method?.type==="stripe")throw new zr("CURRENCY_NOT_SUPPORTED",`Currency ${o} is not supported`);let d=8,l=Ue(zt(c.base_amount,d),d),p=new F(a),f=l.mul(p),m=lt(f.toString(),d),h=n||i||"",g=mF({contextId:h,priceId:r,currencyId:o,quantity:a,baseAmount:m,salt:s}),_=await Vt.findByIdempotencyKey(g);if(_&&_.canRetry())return y.debug("Reusing existing quote",{quoteId:_.id,idempotencyKey:g,status:_.status}),{quote:_,computed_unit_amount:_.quoted_amount,expires_at:_.expires_at};let b=pF(e.slippage_percent),E=e.min_acceptable_rate,A=gn(),R=Xn(u.symbol,u.payment_method?.type),C=await A.getRate(R),L=Ue(zt(C.rate,d),d),T=f.mul(new F(10).pow(new F(u.decimal))),$=L,U=T.add($).sub(new F(1)).div($),H=ip(U,u.decimal,10),M;if(E&&Number(E)>0){let D=Ue(zt(E,d),d),q=f.mul(new F(10).pow(new F(u.decimal))).add(D).sub(new F(1)).div(D);M=ip(q,u.decimal,10).toString()}else{let D=new F(1e4),q=Math.round(b*100),B=D.add(new F(q));M=H.mul(B).add(D.sub(new F(1))).div(D).toString()}let k=c.dynamic_pricing_config?.lock_duration||180,w=Math.floor(Date.now()/1e3)+k,x={price_id:r,session_id:n||void 0,invoice_id:i||void 0,idempotency_key:g,base_currency:c.base_currency,base_amount:m,target_currency_id:o,rate_currency_symbol:u.symbol,exchange_rate:C.rate,quoted_amount:H.toString(),slippage_percent:b,max_payable_token:M,rate_provider_id:C.provider_id,rate_provider_name:C.provider_name,rate_timestamp_ms:C.timestamp_ms,expires_at:w,status:"active",metadata:{calculation:{total_base_amount_scaled:f.toString(),rate_scaled:L.toString(),quoted_amount_unit:H.toString()},rounding:{mode:"ceil",token_decimals:u.decimal},risk:{anomaly_detected:!1,degraded:C.degraded,degraded_reason:C.degraded_reason||null},rate:{consensus_method:fF(C),providers:C.providers||[]},slippage:{percent:b,min_acceptable_rate:E||void 0,max_payable_token:M},context:{quantity:a,base_amount_per_unit:c.base_amount}}},v=3,P=null,O=null;for(let D=0;D<v;D++)try{P=await Vt.create(x);break}catch(q){if(O=q,dPe(q)){let B=await Vt.findOne({where:{idempotency_key:x.idempotency_key}});if(B&&B.canRetry())return y.warn("Idempotency key collision, reusing existing quote",{quoteId:B.id,idempotencyKey:x.idempotency_key,attempt:D,status:B.status}),{quote:B,computed_unit_amount:B.quoted_amount,expires_at:B.expires_at};if(D>=v-1){y.error("Max retries exceeded for quote creation in getOrCreateQuote",{priceId:r,currencyId:o,attempts:D+1,idempotencyKey:x.idempotency_key});break}let I=`${s||"fallback"}:retry:${D}:${Date.now()}:${HX.randomBytes(4).toString("hex")}`;x.idempotency_key=mF({contextId:h,priceId:r,currencyId:o,quantity:a,baseAmount:m,salt:I}),y.info("Retrying quote creation with new idempotency key",{priceId:r,attempt:D+1,newIdempotencyKey:x.idempotency_key})}else throw q}if(!P)throw O||new Error("Failed to create quote after retries");return y.info("Created new quote",{quoteId:P.id,priceId:r,currencyId:o,baseAmount:m,rate:C.rate,quotedAmount:H.toString(),expiresAt:w}),{quote:P,computed_unit_amount:H.toString(),expires_at:w}}async createQuoteWithRate(e){let{price_id:r,session_id:n,invoice_id:i,target_currency_id:o,quantity:a,rateResult:s,idempotency_key_salt:c,slippage_percent:u,min_acceptable_rate:d}=e;if(!r||!o||!a)throw new zr("INVALID_PARAMS","price_id, target_currency_id, and quantity are required");if(!n&&!i)throw new zr("INVALID_PARAMS","Either session_id or invoice_id must be provided");let l=await ne.findByPk(r);if(!l)throw new zr("PRICE_NOT_FOUND",`Price ${r} not found`);if(l.pricing_type!=="dynamic")throw new zr("INVALID_PRICE_TYPE",`Price ${r} is not a dynamic price`);if(!l.base_currency||!l.base_amount)throw new zr("INVALID_PRICE_CONFIG",`Price ${r} missing base_currency or base_amount`);let p=await W.findByPk(o);if(!p)throw new zr("CURRENCY_NOT_FOUND",`Currency ${o} not found`);let f=8,m=Ue(zt(l.base_amount,f),f),h=new F(a),g=m.mul(h),_=lt(g.toString(),f),b=n||i||"",E=mF({contextId:b,priceId:r,currencyId:o,quantity:a,baseAmount:_,salt:c}),A=await Vt.findByIdempotencyKey(E);if(A&&A.canRetry())return y.debug("Reusing existing quote",{quoteId:A.id,idempotencyKey:E,status:A.status}),{quote:A,computed_unit_amount:A.quoted_amount,expires_at:A.expires_at};let R=Ue(zt(s.rate,f),f),C=g.mul(new F(10).pow(new F(p.decimal))),L=R,T=C.add(L).sub(new F(1)).div(L),$=ip(T,p.decimal,10),U=l.dynamic_pricing_config?.lock_duration||180,H=Math.floor(Date.now()/1e3)+U,M=pF(u),k;if(d&&Number(d)>0){let O=Ue(zt(d,f),f),D=g.mul(new F(10).pow(new F(p.decimal))).add(O).sub(new F(1)).div(O);k=ip(D,p.decimal,10).toString()}else{let O=new F(1e4),D=Math.round(M*100),q=O.add(new F(D));k=$.mul(q).add(O.sub(new F(1))).div(O).toString()}let w={price_id:r,session_id:n||void 0,invoice_id:i||void 0,idempotency_key:E,base_currency:l.base_currency,base_amount:_,target_currency_id:o,rate_currency_symbol:p.symbol,exchange_rate:s.rate,quoted_amount:$.toString(),slippage_percent:M,max_payable_token:k,rate_provider_id:s.provider_id,rate_provider_name:s.provider_name,rate_timestamp_ms:s.timestamp_ms,expires_at:H,status:"active",metadata:{calculation:{total_base_amount_scaled:g.toString(),rate_scaled:R.toString(),quoted_amount_unit:$.toString()},rounding:{mode:"ceil",token_decimals:p.decimal},risk:{anomaly_detected:!1,degraded:s.degraded,degraded_reason:s.degraded_reason||null},rate:{consensus_method:fF(s),providers:s.providers||[]},slippage:{percent:M,min_acceptable_rate:d||void 0,max_payable_token:k},context:{quantity:a,base_amount_per_unit:l.base_amount}}},x=3,v=null,P=null;for(let O=0;O<x;O++)try{v=await Vt.create(w);break}catch(D){if(P=D,dPe(D)){let q=await Vt.findOne({where:{idempotency_key:w.idempotency_key}});if(q&&q.canRetry())return y.warn("Idempotency key collision, reusing existing quote",{quoteId:q.id,idempotencyKey:w.idempotency_key,attempt:O,status:q.status}),{quote:q,computed_unit_amount:q.quoted_amount,expires_at:q.expires_at};if(O>=x-1){y.error("Max retries exceeded for quote creation in createQuoteWithRate",{priceId:r,currencyId:o,attempts:O+1,idempotencyKey:w.idempotency_key});break}let B=`${c||"fallback"}:retry:${O}:${Date.now()}:${HX.randomBytes(4).toString("hex")}`;w.idempotency_key=mF({contextId:b,priceId:r,currencyId:o,quantity:a,baseAmount:_,salt:B}),y.info("Retrying quote creation with new idempotency key",{priceId:r,attempt:O+1,newIdempotencyKey:w.idempotency_key})}else throw D}if(!v)throw P||new Error("Failed to create quote after retries");return y.info("Created new quote with provided rate",{quoteId:v.id,priceId:r,currencyId:o,baseAmount:_,rate:s.rate,quotedAmount:$.toString(),expiresAt:H}),{quote:v,computed_unit_amount:$.toString(),expires_at:H}}async refreshQuoteWithRate(e){let{quote_id:r,price_id:n,session_id:i,invoice_id:o,target_currency_id:a,quantity:s,rateResult:c,slippage_percent:u}=e,d=await Vt.findByPk(r);if(!d)return this.createQuoteWithRate({price_id:n,session_id:i,invoice_id:o,target_currency_id:a,quantity:s,rateResult:c});if(d.status==="paid"||d.status==="used")return{quote:d,computed_unit_amount:d.quoted_amount,expires_at:d.expires_at};if(d.status==="failed")return this.createQuoteWithRate({price_id:n,session_id:i,invoice_id:o,target_currency_id:a,quantity:s,rateResult:c});let l=await ne.findByPk(n);if(!l)throw new zr("PRICE_NOT_FOUND",`Price ${n} not found`);if(l.pricing_type!=="dynamic")throw new zr("INVALID_PRICE_TYPE",`Price ${n} is not a dynamic price`);if(!l.base_currency||!l.base_amount)throw new zr("INVALID_PRICE_CONFIG",`Price ${n} missing base_currency or base_amount`);let p=await W.findByPk(a);if(!p)throw new zr("CURRENCY_NOT_FOUND",`Currency ${a} not found`);let f=8,m=Ue(zt(l.base_amount,f),f),h=new F(s),g=m.mul(h),_=lt(g.toString(),f),b=Ue(zt(c.rate,f),f),E=g.mul(new F(10).pow(new F(p.decimal))),A=b,R=E.add(A).sub(new F(1)).div(A),C=ip(R,p.decimal,10),L=l.dynamic_pricing_config?.lock_duration||180,T=Math.floor(Date.now()/1e3)+L,$=pF(u);return await d.update({base_currency:l.base_currency,base_amount:_,target_currency_id:a,rate_currency_symbol:p.symbol,exchange_rate:c.rate,quoted_amount:C.toString(),slippage_percent:$,rate_provider_id:c.provider_id,rate_provider_name:c.provider_name,rate_timestamp_ms:c.timestamp_ms,expires_at:T,status:"active",metadata:{calculation:{total_base_amount_scaled:g.toString(),rate_scaled:b.toString(),quoted_amount_unit:C.toString()},rounding:{mode:"ceil",token_decimals:p.decimal},risk:{anomaly_detected:!1,degraded:c.degraded,degraded_reason:c.degraded_reason||null},rate:{consensus_method:fF(c),providers:c.providers||[]},slippage:{percent:$},context:{quantity:s,base_amount_per_unit:l.base_amount}}}),{quote:d,computed_unit_amount:d.quoted_amount,expires_at:d.expires_at}}async validateAndConsume(e,r){let n=await Vt.findOne({where:{id:e},lock:r?r.LOCK.UPDATE:void 0,transaction:r});if(!n)throw new zr("QUOTE_NOT_FOUND",`Quote ${e} not found`);if(!n.canRetry())throw new zr("QUOTE_INVALID",`Quote ${e} cannot be used (status: ${n.status})`);return n}async markAsPaid(e,r){let n=await Vt.findByPk(e,{transaction:r});if(!n){y.warn("Quote not found when marking as paid",{quoteId:e});return}await n.markAsPaid(r)}async markQuotesAsPaidByInvoice(e,r){let n=await Vt.findAll({where:{invoice_id:e},transaction:r});if(n.length===0)return[];let i=[];return await Promise.all(n.map(async o=>{o.status!=="paid"&&(await o.markAsPaid(r),i.push(o.id))})),i.length>0&&y.info("Marked quotes as paid by invoice",{invoiceId:e,quoteIds:i}),i}expireOldQuotes(){return y.info("expireOldQuotes called but quotes no longer expire (Final Freeze)"),0}async createUsedQuoteWithValidation(e){let{price_id:r,session_id:n,invoice_id:i,idempotency_key:o,target_currency_id:a,quantity:s,preview_rate:c,slippage_percent:u,price_confirmed:d=!1}=e,l=await Vt.findByIdempotencyKey(o);if(l)return y.info("Idempotent submit: returning existing quote",{quoteId:l.id,idempotencyKey:o,status:l.status}),{quote:l,validation_passed:!0};let p=await ne.findByPk(r);if(!p)throw new zr("PRICE_NOT_FOUND",`Price ${r} not found`);if(p.pricing_type!=="dynamic")throw new zr("INVALID_PRICE_TYPE",`Price ${r} is not a dynamic price`);if(!p.base_currency||!p.base_amount)throw new zr("INVALID_PRICE_CONFIG",`Price ${r} missing base_currency or base_amount`);let f=await W.findByPk(a,{include:[{model:Y,as:"payment_method"}]});if(!f)throw new zr("CURRENCY_NOT_FOUND",`Currency ${a} not found`);if(f.payment_method?.type==="stripe")throw new zr("CURRENCY_NOT_SUPPORTED",`Currency ${a} is not supported for dynamic pricing`);let m=gn(),h=Xn(f.symbol,f.payment_method?.type),g;try{g=await m.getRate(h)}catch(D){return y.error("Failed to fetch exchange rate for submit",{priceId:r,currencyId:a,error:D.message}),{quote:null,validation_passed:!1,error_code:"PRICE_UNAVAILABLE",error_message:"Unable to fetch exchange rate. Please try again later."}}let _=pF(u),b=bke({rate:g.rate,timestamp_ms:g.timestamp_ms,provider_id:g.provider_id,provider_name:g.provider_name,degraded:g.degraded,degraded_reason:g.degraded_reason,providers:g.providers,consensus_method:g.consensus_method},h,c,_,d);if(!b.passed)return y.info("Submit validation failed",{priceId:r,currencyId:a,errorCode:b.error_code,errorMessage:b.error_message,changePercent:b.slippage_validation?.change_percent}),{quote:null,validation_passed:!1,error_code:b.error_code,error_message:b.error_message,change_percent:b.slippage_validation?.change_percent};let E=8,A=Ue(zt(p.base_amount,E),E),R=new F(s),C=A.mul(R),L=lt(C.toString(),E),T=Ue(zt(g.rate,E),E),$=C.mul(new F(10).pow(new F(f.decimal))),U=T,H=$.add(U).sub(new F(1)).div(U),M=ip(H,f.decimal,10),k=1e4,w=Math.round(_*100),x=M.mul(new F(k+w)).add(new F(k-1)).div(new F(k)),v=T.mul(new F(k-w)).div(new F(k)),P={price_id:r,session_id:n,invoice_id:i,idempotency_key:o,base_currency:p.base_currency,base_amount:L,target_currency_id:a,rate_currency_symbol:f.symbol,exchange_rate:g.rate,quoted_amount:M.toString(),rate_provider_id:g.provider_id,rate_provider_name:g.provider_name,rate_timestamp_ms:g.timestamp_ms,slippage_percent:_,max_payable_token:x.toString(),min_acceptable_rate:lt(v.toString(),E),metadata:{calculation:{total_base_amount_scaled:C.toString(),rate_scaled:T.toString(),quoted_amount_unit:M.toString()},rounding:{mode:"ceil",token_decimals:f.decimal},risk:{anomaly_detected:!1,degraded:g.degraded,degraded_reason:g.degraded_reason||null},rate:{consensus_method:fF(g),providers:g.providers||[]},slippage:{percent:_,max_payable_token:x.toString(),min_acceptable_rate:lt(v.toString(),E),derived_at_ms:Date.now()},context:{quantity:s,base_amount_per_unit:p.base_amount,preview_rate:c,price_confirmed:d}}},O=await Vt.createUsedQuote(P);return y.info("Created used quote at submit (Final Freeze)",{quoteId:O.id,priceId:r,currencyId:a,baseAmount:L,rate:g.rate,quotedAmount:M.toString(),status:O.status,idempotencyKey:o}),{quote:O,validation_passed:!0}}async markAsPaymentFailed(e,r){let n=await Vt.findByPk(e,{transaction:r});if(!n)throw new Error(`Quote ${e} not found`);await n.markAsPaymentFailed(r)}},qX=null});function lPe(t,e=Hy){let r=Number(t);return!Number.isFinite(r)||r<0?e:r}function em(t,e=Hy){let r=t?.slippage;if(!r||typeof r!="object")return null;let n=r.mode==="rate"?"rate":"percent",i=lPe(r.percent,e);return{mode:n,percent:i,min_acceptable_rate:r.min_acceptable_rate,base_currency:r.base_currency,updated_at_ms:r.updated_at_ms}}function BAt(t,e,r=Hy){let n=t.slippage_percent??t.metadata?.slippage?.percent,i=em(e?.metadata,r)?.percent,o=e?.slippage_percent;return lPe(n??i??o??r,r)}function pPe(t){let{quote:e,checkoutSession:r,nowMs:n=Date.now()}=t;if(!e.quoted_amount||!e.exchange_rate)return null;let i=r?.metadata?.slippage,o=i?.mode==="rate"&&i?.min_acceptable_rate,a=BAt(e,r),s=Math.round(a*100),c=fw.add(new F(s)),d=new F(e.quoted_amount).mul(c).add(fw.sub(new F(1))).div(fw),l;if(o)l=i.min_acceptable_rate;else{let m=Ue(zt(e.exchange_rate,8),8).mul(fw).div(c);l=lt(m.toString(),8)}return{percent:a,max_payable_token:d.toString(),min_acceptable_rate:l,derived_at_ms:n}}function jy(t,e){let r=Number(t),n=Number(e);return!Number.isFinite(r)||!Number.isFinite(n)?!1:r<n}function fPe(t,e){if(!e||e<=0)return t;let r=Math.round(e*100),n=fw.add(new F(r));return t.mul(n).add(fw.sub(new F(1))).div(fw)}var fw,Hy,Gy=N(()=>{"use strict";qe();pu();fw=new F(1e4),Hy=.5});function kv(t){return t.type==="recurring"&&t.recurring?.usage_type==="metered"&&!!t.recurring?.meter_id}function GX(t){return t.every(e=>e.price&&kv(e.price))}function qo(t){return t.upsell_price||t.price}var Pv=N(()=>{"use strict"});function mw(t){for(let e of t)if(e.price?.product?.statement_descriptor)return e.price?.product?.statement_descriptor;return Kt.appName}function yPe(t=[]){return t.length===0||t.every(e=>e.price.type==="recurring"&&e.price.recurring?.usage_type==="metered")?"setup":t.some(e=>e.price.type==="recurring")?"subscription":"payment"}async function I0(t,e,r=!1,n){let i=t,o=new F(0);if(t.find(l=>(l.upsell_price||l.price).custom_unit_amount)&&t.length>1)throw new Error("Multiple items with custom unit amount are not supported");if(n?.couponId&&n?.customerId)try{let l=await W.findByPk(e);if(l){let p=await uC({lineItems:t,promotionCodeId:n.promotionCodeId,couponId:n.couponId,customerId:n.customerId,currency:l,billingContext:{trialing:r}});p.discountSummary.appliedCoupon&&(i=p.enhancedLineItems)}}catch(l){console.warn("Failed to apply discounts in getCheckoutAmount:",l.message)}let a=await i.reduce(async(l,p)=>{let f=await l,m=p.upsell_price||p.price,h=m?.type==="recurring",g=h&&(r||m?.recurring?.usage_type==="metered");if(p.custom_amount)return h&&(o=o.add(new F(p.custom_amount))),g?f:f.add(new F(p.custom_amount));if(p.quote_id)try{let E=await Vt.findByPk(p.quote_id);if(E)return y.info("Using quoted_amount from quote_id for checkout amount calculation",{priceId:p.price.id,quoteId:p.quote_id,quotedAmount:E.quoted_amount}),h&&(o=o.add(new F(E.quoted_amount))),g?f:f.add(new F(E.quoted_amount));y.warn("Quote not found for quote_id in line_item",{priceId:p.price.id,quoteId:p.quote_id})}catch(E){y.error("Failed to fetch quote for quote_id",{priceId:p.price.id,quoteId:p.quote_id,error:E.message})}let _=Yn(m,e),b=new F(_).mul(new F(p.quantity));return m.custom_unit_amount&&_?(h&&(o=o.add(b)),g?f:f.add(b)):h&&(o=o.add(b),g)?f:f.add(b)},Promise.resolve(new F(0))).then(l=>l.toString()),s=new F(0);i.forEach(l=>{l.discount_amounts?.length>0&&l.discount_amounts.forEach(p=>{s=s.add(new F(p.amount||"0"))})});let c=s.gt(new F(a))?new F(a):s,u=new F(a).sub(c),d=u.lt(new F("0"))?"0":u.toString();return{subtotal:a||"0",total:d,renew:o.toString()||"0",discount:c.toString(),shipping:"0",tax:"0",processedItems:i}}function pC(t){let{interval:e}=t||{};if(!e)return 0;let r=+t.interval_count||1,n=1440*60*1e3;switch(e){case"hour":return 3600*1e3;case"day":return r*n;case"week":return r*7*n;case"month":return r*30*n;case"year":return r*365*n;default:return 0}}function $s(t,e,r,n){return t.forEach(i=>{i.price=r.find(o=>o.id===i.price_id),i.price&&(i.price.product=e.find(o=>o.id===i.price.product_id),i.price.product?.type==="credit"&&i.price.metadata?.credit_config&&(i.price.credit={amount:Number(i.price.metadata.credit_config.credit_amount||0)*Number(i.quantity),currency_id:i.price.metadata.credit_config.currency_id,currency:n?.find(o=>o.id===i.price.metadata.credit_config.currency_id)}))}),t}function $At(t,e){return t.payment_currencies=t.payment_currencies.filter(r=>e(r)),t}function hPe(t,e){return Vn(t).map(n=>$At(n,e)).filter(n=>n.payment_currencies.length)}function fC(t){let e=t.reduce((r,n)=>{let i=n.upsell_price||n.price;return i?r.concat(Sv(i).map(o=>o.currency_id)):r},[]);return Array.from(new Set(e))}function VX(t,e){let r=t.map(i=>i.upsell_price||i.price),n=Sv(r[e]).map(i=>i.currency_id).sort();for(let i=0;i<e;i++){let o=Sv(r[i]).map(a=>a.currency_id).sort();if($ke(n,o)===!1)return!1}return!0}function LAt(t,e){let r=t.map(i=>i.upsell_price||i.price);if(r[e]?.type!=="recurring")return!0;let n=r.slice(0,e).find(i=>i?.type==="recurring")?.recurring;return n?r.slice(0,e+1).every(i=>i.type!=="recurring"?!0:!(String(n?.interval)!==String(i.recurring?.interval)||Number(n?.interval_count)!==Number(i.recurring?.interval_count))):!0}function Nv(t,e){let r=VX(t,e),n=LAt(t,e);return{currency:r,recurring:n,aligned:r&&n}}function hF(t,e){if(t.id===e.id||t.product_id!==e.product_id||e.active===!1||e.type!=="recurring")return!1;let r=pC(t.recurring),n=pC(e.recurring);if(!r||!n||r>=n)return!1;let i=new F(t.unit_amount).div(new F(r)),o=new F(e.unit_amount).div(new F(n));return!i.lt(o)}async function Aa({items:t,mode:e,currencyId:r,trialing:n=!1,minimumCycle:i=1,discountConfig:o}){(!i||i<1)&&(i=1);let{total:a,renew:s}=await I0(t,r,n,o);return e==="payment"||e==="auto-recharge-auth"?a:e==="setup"?new F(s).mul(new F(i)).toString():e==="subscription"?new F(a).add(new F(s).mul(new F(n?i:i-1))).toString():"0"}function Rv(t={}){if(t?.billing_threshold_amount){let r=+t.billing_threshold_amount;if(r>0)return r}let e=nH();return e>0?e:0}function Ov(t={}){if(t?.min_stake_amount){let r=+t.min_stake_amount;if(r>0)return r}let e=iH();return e>0?e:0}async function KX(t,e){if(t.length===0)return!0;let r=[we.address];if(e?.type==="arcblock"){let n=e.getOcapClient(),i=await qy(n);r=[we.address,...i]}return t.every(n=>r.includes(n.address))}function WX(t,e){if(e.length){let r=e.reduce((i,o)=>i+parseInt(o.share,10),0),n=[];return e.forEach((i,o)=>{let a=new F(t).div(new F(r)).mul(new F(i.share)).toString();o===e.length-1&&(a=n.reduce((s,c)=>s.sub(new F(c.share)),new F(t)).toString()),n.push({...i,share:a})}),n}return[]}function gPe(t,e,r){return r.length?r.map(n=>({owner:n.address,assets:[],tokens:[{address:e,value:n.share}]})):[{owner:we.address,assets:[],tokens:[{address:e,value:t}]}]}function gF(t){return t.submit_type==="donate"||t.metadata?.type==="donation"||!!t.metadata?.is_donation}function zX(t,e=3){let r=t.map(n=>n.price?.product?.name||"").filter(Boolean);return r.length>e?`${r.slice(0,e).join(", ")} ...`:r.join(", ")}function ko(t,e,r=0,n=0,i){let o=typeof i=="number"?{percent:i}:i||{percent:yF},a=new F(0),s=!1,c=new F(0);if(y.debug("getSubscriptionCreateSetup: items check",{itemCount:t.length,items:t.map(_=>({price_id:_.price?.id,upsell_price_id:_.upsell_price?.id,has_upsell:!!_.upsell_price,selected_price_id:qo(_)?.id,price_base_amount:_.price?.base_amount,upsell_base_amount:_.upsell_price?.base_amount}))}),t.forEach(_=>{let b=qo(_),E;if(_.custom_amount)E=new F(_.custom_amount);else{let A=Yn(b,e);E=new F(A).mul(new F(_.quantity))}if(b.pricing_type==="dynamic"&&(s=!0,b.base_amount)){let R=Ue(b.base_amount,Jy).mul(new F(_.quantity));c=c.add(R),y.debug("getSubscriptionCreateSetup: processing dynamic pricing item",{priceId:b.id,baseAmount:b.base_amount,quantity:_.quantity,contributionUSD:lt(R.toString(),Jy)})}b.type==="recurring"&&b.recurring?.usage_type==="licensed"&&(a=a.add(E)),b.type==="one_time"&&(a=a.add(E))}),s&&a.gt(new F(0))){let{percent:_,minAcceptableRate:b,currencyDecimal:E}=o;if(b&&Number(b)>0&&E!==void 0&&c.gt(new F(0))){let A=Ue(b,Jy);A.gt(new F(0))&&(a=c.mul(new F(10).pow(new F(E))).add(A).sub(new F(1)).div(A),y.info("Applied subscription authorization with min_acceptable_rate",{hasDynamicPricing:s,authorizationAmountRaw:a.toString(),authorizationAmountDisplay:lt(a.toString(),E),minAcceptableRate:b,totalBaseAmountUSD:lt(c.toString(),Jy),currencyDecimal:E}))}else{let A=Number.isFinite(_)&&_>=0?_:yF,R=new F(Math.round(1e3+A*10)),C=new F(1e3);a=a.mul(R).div(C),y.info("Applied subscription authorization slippage protection",{hasDynamicPricing:s,authorizationAmount:a.toString(),slippageRate:`${A}%`})}}let u=se().unix(),d=t.find(_=>qo(_)?.type==="recurring"),l=d?qo(d)?.recurring:void 0,p=pC(l),f=0,m=0;+n&&n>u?(f=u,m=n):r&&(f=u,m=se().add(r,"day").unix());let h=f||u,g=m||se().add(p,"millisecond").unix();return{recurring:l,cycle:{duration:p,anchor:g},trial:{start:f,end:m},period:{start:h,end:g},amount:{setup:a.toString()}}}async function _Pe({checkoutSession:t,lineItems:e,customer:r,paymentSettings:n,setupIntent:i,trialConfig:o={}}){let a=t.enable_subscription_grouping,s=XX(e);if(s.length===0)return y.info("No recurring items found for subscription",{session:t.id}),{subscriptions:[],subscriptionGroups:{},primarySubscription:null};try{return a?await MAt({checkoutSession:t,lineItems:e,customer:r,paymentSettings:n,setupIntent:i,trialConfig:o}):await FAt({checkoutSession:t,lineItems:s,customer:r,paymentSettings:n,setupIntent:i,trialConfig:o})}catch(c){throw y.error("Failed to create subscriptions",{error:c.message,session:t.id,stack:c.stack}),c}}async function FAt(t){let{checkoutSession:e,lineItems:r,customer:n,paymentSettings:i,setupIntent:o,trialConfig:a}=t,s=e.subscription_id,c=await bPe({existingSubscriptionId:s,checkoutSession:e,lineItems:r,customer:n,paymentSettings:i,setupIntent:o,trialConfig:a});return y.info("Single subscription processed",{session:e.id,subscription:c?.id,isNew:!s}),{subscriptions:c?[c]:[],subscriptionGroups:{},primarySubscription:c}}async function MAt(t){let{checkoutSession:e,lineItems:r,customer:n,paymentSettings:i,setupIntent:o,trialConfig:a}=t,s=wPe(r),c=e.subscription_groups||{},u=[],d={},l=null,p=!!e.subscription_data?.no_stake,f=Rv(e.subscription_data),m=Ov(e.subscription_data),h=Object.entries(s).map(([_,b],E)=>async()=>{try{let A=c[_],R=E===0,C={price_id:_,checkout_session_id:e.id,...R?{is_primary_subscription:!0}:{}},L=b,T={};R?T={amount_gte:f,stake_gte:m,reset_billing_cycle_anchor:!1,no_stake:p}:T={amount_gte:0,stake_gte:0,reset_billing_cycle_anchor:!1,no_stake:!0,references_primary_stake:!0};let $=await bPe({existingSubscriptionId:A,checkoutSession:e,lineItems:L,customer:n,paymentSettings:i,setupIntent:o,trialConfig:a,metadata:C,billing_thresholds:T});return $?{success:!0,priceId:_,subscription:$,isPrimary:R}:{success:!1,priceId:_,error:"Failed to create subscription"}}catch(A){return y.error("Failed to create subscription for price group",{priceId:_,error:A.message,session:e.id,stack:A.stack}),{success:!1,priceId:_,error:A.message}}});return(await(0,JX.default)(h,{concurrency:5})).forEach(_=>{_.success&&_.subscription&&(d[_.priceId]=_.subscription.id,u.push(_.subscription),_.isPrimary&&(l=_.subscription))}),{subscriptions:u,subscriptionGroups:d,primarySubscription:l}}async function bPe(t){let{existingSubscriptionId:e,checkoutSession:r,lineItems:n,customer:i,paymentSettings:o,setupIntent:a,trialConfig:s={},metadata:c={},billing_thresholds:u}=t,{trialInDays:d=0,trialEnd:l=0}=s,{method:p,currency:f}=o,m=_=>{let b=typeof _=="string"?Number(_):_;return!Number.isFinite(b)||b<0?yF:b},g=(()=>{let _=c?.slippage;if(_&&typeof _=="object"){let A=_.mode==="rate"?"rate":"percent",R=m(_.percent),C=typeof _.min_acceptable_rate=="string"?_.min_acceptable_rate:void 0,L=typeof _.base_currency=="string"?_.base_currency:void 0,T=Number.isFinite(Number(_.updated_at_ms))?Number(_.updated_at_ms):void 0;return{mode:A,percent:R,...C?{min_acceptable_rate:C}:{},...L?{base_currency:L}:{},...T?{updated_at_ms:T}:{}}}let b=em(r.metadata,yF);return b||{mode:"percent",percent:m(r.slippage_percent)}})();try{let _=UAt(n),b=null,E={percent:g.percent,minAcceptableRate:g.min_acceptable_rate,currencyDecimal:f.decimal},A=ko(n,f.id,d,l,E);if(e&&(b=await ee.findByPk(e)),b){if(b.status!=="incomplete")throw new Error(`Subscription ${b.id} status not incomplete: ${b.status}`);let R=_?.billing_cycle_anchor||r.subscription_data?.billing_cycle_anchor||A.cycle.anchor;b=await b.update({currency_id:f.id,customer_id:i.id,default_payment_method_id:p.id,current_period_start:A.period.start,current_period_end:A.period.end,billing_cycle_anchor:R,trial_end:A.trial.end,trial_start:A.trial.start,pending_invoice_item_interval:A.recurring,pending_setup_intent:a?.id,slippage_config:g}),y.info("Subscription updated",{session:r.id,subscription:b.id}),await He.destroy({where:{subscription_id:b.id}}),await mPe(b.id,n,r,_);let C=await ce.findByPk(b.latest_invoice_id);C&&C.customer_id!==i.id&&await C.update({customer_id:i.id})}else{let R=_.recovered_from||r.subscription_data?.recovered_from||"",C=R?await ee.findByPk(R):null,L={...r.subscription_data?.notification_settings?{notification_settings:r.subscription_data.notification_settings}:{},...hu(r.metadata||{},["days_until_due","days_until_cancel","page_info"]),..._.metadata||{},...c},T={...r.subscription_data,..._},$=u||{amount_gte:Rv(T),stake_gte:Ov(T),reset_billing_cycle_anchor:!1,no_stake:T.no_stake};b=await ee.create({livemode:!!r.livemode,currency_id:f.id,customer_id:i.id,status:"incomplete",current_period_start:A.period.start,current_period_end:A.period.end,billing_cycle_anchor:T.billing_cycle_anchor||A.cycle.anchor,start_date:se().unix(),trial_end:A.trial.end,trial_start:A.trial.start,trial_settings:{end_behavior:{missing_payment_method:"create_invoice"}},billing_thresholds:$,pending_invoice_item_interval:A.recurring,pending_setup_intent:a?.id,default_payment_method_id:p.id,cancel_at_period_end:!1,collection_method:"charge_automatically",slippage_config:g,description:T.description||zX(n),proration_behavior:T.proration_behavior||"none",payment_behavior:"default_incomplete",days_until_due:T.days_until_due,days_until_cancel:T.days_until_cancel,recovered_from:C?.id,metadata:L,service_actions:T.service_actions||[]}),y.info("Subscription created",{session:r.id,subscription:b.id}),await mPe(b.id,n,r,_)}return b}catch(_){throw y.error("Failed in createOrUpdateSubscription",{existingSubscriptionId:e,error:_.message,stack:_.stack,session:r.id}),_}}async function mPe(t,e,r,n){try{let i={...n?.metadata||{},...r.metadata||{}},o=await Promise.all(e.map(a=>He.create({livemode:!!r.livemode,subscription_id:t,price_id:a.upsell_price_id||a.price_id,quantity:a.quantity,metadata:i})));return y.info("Subscription items created",{session:r.id,subscription:t,items:o.map(a=>a.id)}),o}catch(i){throw y.error("Failed to create subscription items",{subscriptionId:t,error:i.message,stack:i.stack,session:r.id}),i}}function wPe(t){let e={};return XX(t).forEach(n=>{let i=n.upsell_price_id||n.price_id;e[i]||(e[i]=[]),e[i].push(n)}),e}function is(t){return!t.enable_subscription_grouping&&t.subscription_id?[t.subscription_id]:Object.values(t.subscription_groups||{}).filter(Boolean)}function _F(t){return t.filter(e=>e.price?.type==="one_time")}function XX(t){return t.filter(e=>e.price?.type==="recurring")}function UAt(t){if(t.length===0)return{};let e={},r={};return t.forEach(n=>{let i=n.subscription_data||{};i.metadata&&Object.assign(r,i.metadata),Object.entries(i).forEach(([o,a])=>{o!=="metadata"&&(e[o]=a)})}),Object.keys(r).length>0&&(e.metadata=r),e}async function bF(t,e,r){let n=await He.findAll({where:{subscription_id:t.id}}),i=e.filter(o=>n.some(a=>a.price_id===o.price_id||a.price_id===o.upsell_price_id));return r&&t.id===r.id&&(i=[...i,..._F(e)]),i}function xPe(t,e){let r=Ue(.5,e.decimal);return new F(t).gte(new F(r))}async function EPe(t,e,r){let n=r.enable_subscription_grouping,i=_F(t),o=XX(t),a=t.some(u=>(u.upsell_price||u.price)?.pricing_type==="dynamic"),s=t.some(u=>{let d=u.upsell_price||u.price;return!d?.pricing_type||d?.pricing_type==="fixed"});if(a&&s)return{valid:!1,error:"Cannot mix fixed pricing and dynamic pricing in the same checkout session"};let c=Ue(.5,e.decimal);if(o.length===0&&i.length>0){let{total:u}=await I0(t,e.id);return new F(u).lt(new F(c))?{valid:!1,error:"Total payment amount must be greater or equal to 0.5 USD"}:{valid:!0}}if(o.length>0)if(n){let u=wPe(t);for(let[d,l]of Object.entries(u)){if((l[0]?.upsell_price||l[0]?.price)?.recurring?.usage_type==="metered")continue;let f=new F(0);if(l.forEach(m=>{let h=m.upsell_price||m.price,g=Yn(h,e.id);f=f.add(new F(g).mul(new F(m.quantity)))}),f.lt(new F(c)))return{valid:!1,error:`product "${l[0]?.price?.product?.name||`Product ${d}`}" unit price must be greater or equal to 0.5 USD`}}}else{let u=o.filter(d=>(d.upsell_price||d.price)?.recurring?.usage_type!=="metered");if(u.length>0){let{renew:d}=await I0(u,e.id);if(new F(d).lt(new F(c)))return{valid:!1,error:"Total subscription amount must be greater or equal to 0.5 USD"}}}return{valid:!0}}async function vPe(t,e){if(!e||!Array.isArray(e)||e.length===0)return[];if(!await W.findByPk(t.currency_id))throw new Error("Currency not found");let n=[],i=await ne.expand(t.line_items||[],{product:!0,upsell:!0}),o=e.map((s,c)=>async()=>{if(!s.coupon)throw new Error(`Coupon ID is required for discount at index ${c}`);let u=await Lt.findByPk(s.coupon);if(!u)throw new Error(`Coupon '${s.coupon}' not found`);let d=lw(u,i);if(!d.valid)throw new Error(`Coupon '${s.coupon}' is not valid: ${d.reason}`);return{coupon:u.id,verification_method:"direct"}}),a=await(0,JX.default)(o,{concurrency:5});return n.push(...a),n}async function C0(t){let{discounts:e}=t,r=t.amount_subtotal||"0",n=t.amount_total||"0",i=t.total_details||{amount_discount:"0",amount_shipping:"0",amount_tax:"0"};if(!e||e.length===0)return{amount_subtotal:r,amount_total:n,total_details:{amount_discount:i.amount_discount||"0",amount_shipping:i.amount_shipping||"0",amount_tax:i.amount_tax||"0"}};let o=n,a=new F("0"),s=e.map(async l=>{if(!l.coupon)return new F("0");let p=await Lt.findByPk(l.coupon);if(!p||!p.valid)return new F("0");let f=new F("0"),m=new F(o);return p.percent_off>0?f=m.mul(new F(p.percent_off)).div(new F(100)):p.amount_off&&new F(p.amount_off).gt(new F("0"))&&(f=new F(p.amount_off)),f.gt(m)&&(f=m),f});a=(await Promise.all(s)).reduce((l,p)=>l.add(p),new F("0")),a.gt(new F(o))&&(a=new F(o));let u=new F(o).sub(a),d=u.lt(new F("0"))?"0":u.toString();return{amount_subtotal:r,amount_total:d,total_details:{amount_discount:a.toString(),amount_shipping:i.amount_shipping||"0",amount_tax:i.amount_tax||"0"},discounts:e}}function HAt(t,e){let r=Ue(zt(t,Jy),Jy),n=new F(e),i=r.mul(n);return lt(i.toString(),Jy)}async function mC(t,e,r,n={}){let{skipGeneration:i=!1,forceRefresh:o=!1}=n,a=Ci(),s=e.filter(D=>!D.price);s.length>0&&y.error("Line items with missing price detected - possible data integrity issue",{sessionId:t.id,invalidPriceIds:s.map(D=>D.price_id),totalItems:e.length,invalidCount:s.length});let c=e.filter(D=>D.price);if(c.length===0)return y.warn("No valid line items with price found",{sessionId:t.id}),{lineItems:e,quotes:{},refreshed:!1};let u={},d=c.filter(D=>D.quote_id),l=Math.floor(Date.now()/1e3),p=t.metadata?.quote_locked_at,f=typeof p=="number"?p:typeof p=="string"?Number(p):null,m=Number.isFinite(f)&&l-f<qAt,h=t.metadata?.slippage?.percent??t.slippage_percent,g=Number(h),_=Number.isFinite(g)?g:.5,b=new Map,E=new Set,A=!1,R=!1,C=!1,L=!1,T=!1,$=(D,q)=>{D.custom_amount=q.quoted_amount,D.quoted_amount=q.quoted_amount,D.quote_id=q.id,D.exchange_rate=q.exchange_rate,D.rate_provider_name=q.rate_provider_name,D.rate_provider_id=q.rate_provider_id,D.rate_timestamp_ms=q.rate_timestamp_ms,D.expires_at=q.expires_at,D.quote_currency_id=q.target_currency_id;let B=`${D.price?.id||D.price_id}_${r}`;u[B]={quote_id:q.id,expires_at:q.expires_at,quoted_amount:q.quoted_amount,exchange_rate:q.exchange_rate,rate_provider_name:q.rate_provider_name,rate_provider_id:q.rate_provider_id}};if(d.length>0){let D=Array.from(new Set(d.map(B=>B.quote_id).filter(Boolean))),q=await Vt.findAll({where:{id:D}});if(q.forEach(B=>{b.set(B.id,B)}),q.length!==D.length&&(C=!0,y.warn("Some quote references are missing from database",{sessionId:t.id,totalQuoteIds:D.length,foundQuotes:q.length})),d.forEach(B=>{let I=B.quote_id,j=b.get(I);if(!j){i||E.add(I);return}let K=j.status==="paid",X=j.status==="used";if(K||X&&(m||i)){$(B,j);return}if(X&&!m&&!i){A=!0,E.add(I),y.info("Detected used quote with expired lock, will refresh",{sessionId:t.id,quoteId:I,status:j.status});return}if(o&&!i){m?y.info("Skip force refresh due to active quote lock",{sessionId:t.id,quoteId:I}):(E.add(I),y.info("Force refresh quote for checkout session",{sessionId:t.id,quoteId:I}));return}let Z=B.upsell_price||B.price;if(!i&&!m&&j.status!=="paid"&&Z?.pricing_type==="dynamic"&&Z?.base_amount){let Q=HAt(Z.base_amount,Number(B.quantity||0)),ae=zt(Q,Jy),de=zt(j.base_amount||"0",Jy);if(de!==ae){R=!0,E.add(I),y.info("Detected quote base_amount mismatch, will refresh quote",{sessionId:t.id,quoteId:I,priceId:B.price_id||B.price?.id,expectedBaseAmount:ae,quoteBaseAmount:de,quantity:B.quantity});return}}let ie=j.status!=="paid"&&(j.expires_at<l||j.status==="expired");if(!i&&!m&&ie){A=!0,E.add(I),y.info("Detected expired quote",{sessionId:t.id,expiredQuoteId:j.id,expiresAt:new Date(j.expires_at*1e3).toISOString(),now:new Date(l*1e3).toISOString()});return}let ue=j.status!=="active"&&j.status!=="paid";if(!i&&!m&&ue){A=!0,E.add(I),y.info("Detected inactive quote, will refresh",{sessionId:t.id,quoteId:j.id,status:j.status});return}$(B,j)}),y.info("Processed existing quotes from database",{sessionId:t.id,totalQuoteIds:d.length,foundQuotes:b.size,hasExpiredQuotes:A,hasStaleQuotes:R,hasMissingQuotes:C,skipGeneration:i,refreshQuotes:E.size}),i||E.size===0)return{lineItems:e,quotes:u,refreshed:!1}}let U=c.filter(D=>qo(D)?.pricing_type==="dynamic"&&(D.quote_id?E.has(D.quote_id):!0));if(U.length===0)return{lineItems:e,quotes:u,refreshed:!1};if(i)return y.info("Skipping quote generation for dynamic items (skipGeneration enabled)",{sessionId:t.id,dynamicItemsWithoutQuotes:U.length}),{lineItems:e,quotes:u,refreshed:!1};let H=await W.findByPk(r,{include:[{model:Y,as:"payment_method"}]});if(!H)throw new Error(`Currency ${r} not found`);if(H.payment_method?.type==="stripe")return{lineItems:e,quotes:u,refreshed:!1};let M=gn(),k;try{let D=Xn(H.symbol,H.payment_method?.type);k=await M.getRate(D)}catch(D){return y.warn("Exchange rate unavailable for checkout session",{checkoutSessionId:t.id,currencyId:r,currencySymbol:H.symbol,error:D.message}),{lineItems:e,quotes:{},rateUnavailable:!0,rateError:D.message||"Exchange rate service unavailable",refreshed:!1}}y.info("Fetched exchange rate for batch quote creation",{currencyId:r,currencySymbol:H.symbol,rate:k.rate,provider:k.provider_name,dynamicItemsCount:U.length});let w=await Promise.all(U.map(async D=>{let q=qo(D),{quantity:B}=D;try{let I=D.quote_id,j,K=I?b.get(I):null;return!(!K||K.status==="used"&&!m)&&I&&K?j=await a.refreshQuoteWithRate({quote_id:I,price_id:q?.id,session_id:t.id,target_currency_id:r,quantity:B,rateResult:k,slippage_percent:_}):(j=await a.createQuoteWithRate({price_id:q?.id,session_id:t.id,target_currency_id:r,quantity:B,rateResult:k,slippage_percent:_}),T=!0),{item:D,quoteResponse:j}}catch(I){let j=I instanceof Error?I.message:String(I);throw y.error("Failed to create quote for dynamic price",{priceId:q.id,checkoutSessionId:t.id,currencyId:r,errorMessage:j,errorName:I?.name}),I}})),x=new Map;w.forEach(D=>{let q=D.item.price?.id||D.item.price_id;q&&x.set(q,D)});let v=D=>({quote_id:D.quote.id,expires_at:D.expires_at,quoted_amount:D.computed_unit_amount,exchange_rate:D.quote.exchange_rate,rate_provider_name:D.quote.rate_provider_name,rate_provider_id:D.quote.rate_provider_id,rate_timestamp_ms:D.quote.rate_timestamp_ms});w.forEach(D=>{let q=D.item.price?.id||D.item.price_id;if(q){let B=`${q}_${r}`;u[B]=v(D.quoteResponse)}}),L=T;let P=E.size>0||T;return{lineItems:e.map(D=>{if(!D.price)return D;let q=x.get(D.price.id);if(!q)return D;let B=v(q.quoteResponse);return{...D,...B,custom_amount:q.quoteResponse.computed_unit_amount}}),quotes:u,regenerated:L,refreshed:P}}var JX,yF,Jy,qAt,ki=N(()=>{"use strict";My();qe();qf();Lke();JX=Oe(Uy());HI();Zt();pr();pw();Qf();_e();Ds();Ir();he();cC();lC();Zf();Yf();_u();pu();Gy();Pv();Pv();yF=.5,Jy=8;qAt=180});var yC,APe=N(()=>{"use strict";Xg();yC=class t extends li.AbstractSigner{constructor(e,r){super(r),this.wallet=e}getAddress(){return Promise.resolve(this.wallet.address)}async signTransaction(e){let r=await this.populateTransaction(e),{from:n,...i}=r,o=li.Transaction.from(i),a=o.unsignedSerialized,s=li.keccak256(a),c=await this.wallet.signETH(s,!1);return o.signature=li.Signature.from(c),o.serialized}async signMessage(e){let r=typeof e=="string"?li.toUtf8Bytes(e):e,n=li.hashMessage(r),i=await this.wallet.signETH(n,!1);return li.hexlify(i)}async signTypedData(e,r,n){let i=li.TypedDataEncoder.hash(e,r,n),o=await this.wallet.signETH(i,!1);return li.hexlify(o)}connect(e){return new t(this.wallet,e)}}});var tm,YX=N(()=>{tm=[{constant:!0,inputs:[],name:"name",outputs:[{name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"},{constant:!1,inputs:[{name:"_spender",type:"address"},{name:"_value",type:"uint256"}],name:"approve",outputs:[{name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!0,inputs:[],name:"totalSupply",outputs:[{name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},{constant:!1,inputs:[{name:"_from",type:"address"},{name:"_to",type:"address"},{name:"_value",type:"uint256"}],name:"transferFrom",outputs:[{name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!0,inputs:[],name:"INITIAL_SUPPLY",outputs:[{name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},{constant:!0,inputs:[],name:"decimals",outputs:[{name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},{constant:!1,inputs:[],name:"unpause",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!0,inputs:[],name:"paused",outputs:[{name:"",type:"bool"}],payable:!1,stateMutability:"view",type:"function"},{constant:!1,inputs:[{name:"_spender",type:"address"},{name:"_subtractedValue",type:"uint256"}],name:"decreaseApproval",outputs:[{name:"success",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!1,inputs:[{name:"_spender",type:"address"},{name:"_subtractedValue",type:"uint256"}],name:"decreaseAllowance",outputs:[{name:"success",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!0,inputs:[{name:"_owner",type:"address"}],name:"balanceOf",outputs:[{name:"balance",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},{constant:!1,inputs:[],name:"pause",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!0,inputs:[],name:"owner",outputs:[{name:"",type:"address"}],payable:!1,stateMutability:"view",type:"function"},{constant:!0,inputs:[],name:"symbol",outputs:[{name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"},{constant:!1,inputs:[{name:"_to",type:"address"},{name:"_value",type:"uint256"}],name:"transfer",outputs:[{name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!1,inputs:[{name:"_spender",type:"address"},{name:"_addedValue",type:"uint256"}],name:"increaseApproval",outputs:[{name:"success",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!1,inputs:[{name:"_spender",type:"address"},{name:"_addedValue",type:"uint256"}],name:"increaseAllowance",outputs:[{name:"success",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!0,inputs:[{name:"_owner",type:"address"},{name:"_spender",type:"address"}],name:"allowance",outputs:[{name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},{constant:!1,inputs:[{name:"newOwner",type:"address"}],name:"transferOwnership",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function"},{inputs:[],payable:!1,stateMutability:"nonpayable",type:"constructor"},{anonymous:!1,inputs:[],name:"Pause",type:"event"},{anonymous:!1,inputs:[],name:"Unpause",type:"event"},{anonymous:!1,inputs:[{indexed:!0,name:"previousOwner",type:"address"},{indexed:!0,name:"newOwner",type:"address"}],name:"OwnershipTransferred",type:"event"},{anonymous:!1,inputs:[{indexed:!0,name:"owner",type:"address"},{indexed:!0,name:"spender",type:"address"},{indexed:!1,name:"value",type:"uint256"}],name:"Approval",type:"event"},{anonymous:!1,inputs:[{indexed:!0,name:"from",type:"address"},{indexed:!0,name:"to",type:"address"},{indexed:!1,name:"value",type:"uint256"}],name:"Transfer",type:"event"}]});async function GAt(t,e,r){let n=await t.getCode(e);return n.length<=2?!1:r.find(o=>{let a=tm.find(c=>c.name===o&&c.type==="function"),s=Ku.from(a);return!!n.includes(s.selector.slice(2))})}async function Dv(t,e){let r=await GAt(t,e,["increaseAllowance","increaseApproval","approve"]);if(!r)throw new Error(`Approval function not supported in contract ${e}`);return r}var wF=N(()=>{"use strict";Xg();YX()});async function SPe(t,e){let r=new li.Contract(e,tm,t),[n,i,o]=await Promise.all([r.name(),r.symbol(),r.decimals()]);return{name:n,symbol:i,decimal:typeof o.toNumber=="function"?o.toNumber():Number(o)}}async function yw(t,e,r){return(await new li.Contract(e,tm,t).balanceOf(r)).toString()}async function TPe(t,e,r,n){return(await new li.Contract(e,tm,t).allowance(r,n)).toString()}async function hC(t,e){return(await t.getBalance(e)).toString()}function JAt(t,e){return new li.Interface(tm).encodeFunctionData("transfer",[t,e])}function VAt(t,e,r="approve"){return new li.Interface(tm).encodeFunctionData(r,[t,e])}function rm(t,e,r){return r?{to:r,value:"0",gasLimit:"120000",data:JAt(t,e)}:{to:t,value:e,gasLimit:"21000",data:""}}async function IPe(t,e,r,n){let i=await Dv(t,n);return{to:n,value:"0",gasLimit:"120000",data:VAt(e,r,i)}}async function CPe(t,e,r,n){let i=new yC(Sn,t);return await(await new li.Contract(e,tm,i).transferFrom(r,Sn.address,n)).wait()}async function Bv(t,e,r,n){let i=new yC(Sn,t);return await(await new li.Contract(e,tm,i).transfer(r,n)).wait()}var bu=N(()=>{"use strict";Xg();Ir();APe();wF();YX()});var PPe={};Je(PPe,{checkStakeRevokeTx:()=>eY,ensureStakedForGas:()=>QX,estimateMaxGasForTx:()=>ZX,getAllResults:()=>kPe,getStakeSummaryByDid:()=>xF,getTokenByAddress:()=>yp,getTokenSummaryByDid:()=>id,hasStakedForGas:()=>gC});import KAt from"assert";async function QX(){let t=await W.findAll({where:{active:!0,is_base_currency:!0}});for(let e of t){let r=await Y.findByPk(e.payment_method_id);if(r&&r.type==="arcblock"){let n=r.getOcapClient(),i=r.settings.arcblock?.api_host;try{let{state:o}=await n.getAccountState({address:we.address}),a=await sC({client:n});if(a){y.info(`app already staked for gas on chain ${i}`,{source:a.source});continue}await n.getContext();let s=await n.getForgeState({}),{token:c,txConfig:u}=s.state,d=(o?.tokens||[]).find(p=>p.address===c.address);if(Su(d?.value||"0").lte(Su(u.txGas.minStake))){y.info(`not enough balance to stake for gas on chain ${i}`);continue}let[l]=await n.stake({to:we.address,message:"stake-for-gas",tokens:[{address:c.address,value:lt(u.txGas.minStake,Number(c.decimal))}],wallet:we});y.info(`staked for gas on chain ${i}`,{hash:l})}catch(o){y.error(`stake for gas on chain ${i} failed`,o)}}}}async function gC(t,e=we.address){if(t.type==="arcblock"){let r=t.getOcapClient();if(e===we.address)return!!await sC({client:r});let n=Bu(e,e),{state:i}=await r.getStakeState({address:n});return!!i}return!0}async function ZX(t,e="fg:t:delegate"){if(t.type==="arcblock"){let r=t.getOcapClient(),{estimate:n}=await r.estimateGas({typeUrl:e});return n.max}return"0"}async function kPe(t,e){let r=[],{page:i,[t]:o}=await e({size:40});if(i.total<40)return o;r.push(...o);let a=Math.floor(i.total/40),s=[];for(let c=1;c<=a;c++)s.push(async()=>{let{[t]:u}=await e({size:40,cursor:c*40});r.push(...u)});return await Promise.all(s.map(c=>c())),KAt.equal(r.length,i.total,`fetched ${t} count does not match`),r}async function eY(){let t=await Y.findAll({where:{type:"arcblock"}});if(t.length===0)return;let e=1e3*60*10,r=new Date(Date.now()-e).toISOString(),n=new Date().toISOString();for(let i of t){let o=i.getOcapClient(),a=await kPe("transactions",s=>o.listTransactions({paging:s,typeFilter:{types:["revoke_stake"]},timeFilter:{field:"time",startDateTime:r,endDateTime:n}}));y.info(`Found ${a.length} revoke stake tx on chain ${i.name}`,{interval:e,startDateTime:r,endDateTime:n,txs:a.map(s=>s.hash)}),await Promise.all(a.map(async s=>{let c=await te.findByPkOrDid(s.tx.from);if(!c)return;let{address:u}=s.tx.itxJson,d=await ee.findAll({where:{[J.or]:[{"payment_details.arcblock.staking.address":u},{"overdraft_protection.payment_details.arcblock.staking.address":u}]}});if(d.length===0)return;y.info(`Active subscriptions found for revoked stake on chain ${i.name}`,{address:u,customer:c.did,subscriptions:d.map(p=>p.id),txHash:s.hash});let{state:l}=await o.getStakeState({address:u});if(l.nonce)d.filter(p=>p.isActive()).forEach(p=>{ge.emit("customer.stake.revoked",{subscriptionId:p.id,tx:s})});else{let p=JSON.parse(l.data?.value||"{}");d.filter(f=>f.isActive()).filter(f=>p[f.id]).forEach(f=>{ge.emit("customer.stake.revoked",{subscriptionId:f.id,tx:s})})}}))}}async function xF(t,e=!0){let r=await Y.findAll({where:{type:"arcblock",livemode:e},include:[{model:W,as:"payment_currencies"}]});if(r.length===0)return{};let n={};return await Promise.all(r.map(async i=>{let o=i.getOcapClient(),a=await qy(o),s=[...new Set([we.address,...a])];for(let c of s){let{stakes:u}=await o.listStakes({addressFilter:{receiver:c}});(u||[]).filter(d=>d.sender===t).forEach(d=>{let{tokens:l}=d;(l||[]).forEach(p=>{let f=i.payment_currencies?.find(m=>p.address===m.contract);f&&(n[f.id]=new F(n[f.id]||"0").add(new F(p.balance||"0")).toString())})})}})),n}async function id(t,e,r="arcblock"){let n=await Y.findAll({where:{type:r,livemode:e},include:[{model:W,as:"payment_currencies"}]});if(n.length===0)return{};let i={};return await Promise.all(n.map(async o=>{if(o.type==="arcblock"){let a=o.getOcapClient(),{tokens:s}=await a.getAccountTokens({address:t});(s||[]).forEach(c=>{let u=o.payment_currencies.find(d=>c.address===d.contract);u&&(i[u.id]=c.balance)})}if(wt.includes(o.type)&&Yp(t)){let a=o.getEvmClient();await Promise.all(o.payment_currencies.map(async s=>{s.contract?i[s.id]=await yw(a,s.contract,t):i[s.id]=await hC(a,t)}))}})),i}async function yp(t,e,r){if(e.type==="arcblock"){let n=e.getOcapClient(),{tokens:i}=await n.getAccountTokens({address:t});return i.find(o=>o.address===r.contract)?.balance}if(wt.includes(e.type)){let n=e.getEvmClient();return r.contract?await yw(n,r.contract,t):await hC(n,t)}return y.info(`unsupported payment method type: ${e.type}`,{paymentCurrencyId:r.id,paymentMethodId:e.id,address:t}),"0"}var wu=N(()=>{"use strict";ja();j_();qe();$e();Ir();Rn();he();_e();bu();mi();cC()});function WAt(t,e){return`${t}:${e}`}function zAt(t){let e=$v.get(t);return e?Date.now()-e.cachedAt>NPe?($v.delete(t),null):e:null}function XAt(t,e){if($v.size>1e3){let r=Date.now();for(let[n,i]of $v)r-i.cachedAt>NPe&&$v.delete(n)}$v.set(t,{...e,cachedAt:Date.now()})}async function _C(t){let{paymentMethod:e,paymentCurrency:r,userDid:n,amount:i}=t,o=r.contract,a=new F(i);if(e.type==="arcblock"){let s=n;if(!t.skipUserCheck){let{user:l}=await hr.getUser(n,{enableConnectedAccount:!0});l&&(s=CS(l))}if(!s)return{sufficient:!1,reason:"NO_DID_WALLET",requestedAmount:a.toString()};let c=e.getOcapClient(),{tokens:u}=await c.getAccountTokens({address:s,token:o}),[d]=u;return d?new F(d.balance).lt(a)?{sufficient:!1,reason:"NO_ENOUGH_TOKEN",token:d,requestedAmount:a.toString()}:{sufficient:!0,token:d,requestedAmount:a.toString()}:{sufficient:!1,reason:"NO_TOKEN",requestedAmount:a.toString()}}if(wt.includes(e.type)){if(!r.contract)return{sufficient:!1,reason:"NO_TOKEN",requestedAmount:a.toString()};if(Yp(n)===!1)return{sufficient:!1,reason:"NO_TOKEN",requestedAmount:a.toString()};let s=e.getEvmClient(),c=await yw(s,r.contract,n);return new F(c).lt(a)?{sufficient:!1,reason:"NO_ENOUGH_TOKEN",token:{address:o,balance:c},requestedAmount:a.toString()}:{sufficient:!0,token:{address:o,balance:c},requestedAmount:a.toString()}}return{sufficient:!0,requestedAmount:a.toString()}}async function tY(t){let{paymentMethod:e,paymentCurrency:r,userDid:n,amount:i,lineItems:o}=t;if(e.type==="arcblock"&&r.type==="credit"){let a=await te.findOne({where:{did:n}});if(!a)return{sufficient:!1,reason:"NO_CUSTOMER"};let s=[];o&&o.length>0&&o.forEach(d=>{kv(d.price)&&s.push(d.price_id)});let c=await ct.getEffectiveCreditSummary({customerId:a.id,currencyId:r.id,priceIds:s});if(!c)return{sufficient:!1,reason:"NO_CREDIT_GRANTS"};let u=new F(c[r.id]?.remainingAmount||"0");return u.lt(new F(i))?{sufficient:!1,reason:"NO_ENOUGH_CREDIT"}:{sufficient:!0,token:{address:r.id,balance:u.toString()},requestedAmount:i}}return{sufficient:!1,reason:"NOT_SUPPORTED"}}async function oi(t){let{paymentCurrency:e,paymentMethod:r,userDid:n,amount:i,delegatorAmounts:o,subscription:a,storedDelegationAddress:s}=t;if(!n)return{sufficient:!1,reason:"NO_DID_WALLET"};let c=e.contract,u=new F(i),d=o&&o.length>0;if(d&&(u=o.reduce((l,p)=>l.add(new F(p)),new F("0"))),r.type==="arcblock"){if(e.type==="credit")return await tY({paymentMethod:r,paymentCurrency:e,userDid:n,amount:i,lineItems:t.lineItems});let l=n,{user:p}=await hr.getUser(n,{enableConnectedAccount:!0});if(p&&(l=CS(p),!l))return{sufficient:!1,reason:"NO_DID_WALLET"};y.info("isDelegationSufficientForPayment: checking delegation",{originalUserDid:n,resolvedDelegator:l,delegatorChanged:n!==l,walletAddress:we.address,paymentMethodApiHost:r.settings?.arcblock?.api_host});let f=r.getOcapClient(),m=WAt(l,r.id),h=zAt(m),g,_;if(h)g=h.delegationAddress,_=h.source,y.info("isDelegationSufficientForPayment: using cached delegation address",{delegator:l,delegationAddress:g,source:_,cacheAgeMs:Date.now()-h.cachedAt});else{let L=await rPe({storedAddress:s||a?.payment_details?.arcblock?.delegation_address,delegator:l,client:f});if(!L)return y.error("isDelegationSufficientForPayment: no delegation address found",{delegator:l,storedDelegationAddress:s,subscriptionDelegationAddress:a?.payment_details?.arcblock?.delegation_address,subscriptionId:a?.id}),{sufficient:!1,reason:"NO_DELEGATION"};let{address:T,needsBackfill:$}=L;g=T,_=L.source,$&&a&&await iPe(a.id,T),XAt(m,{delegator:l,delegationAddress:T,source:_,needsBackfill:$})}let b=await f.getDelegateState({address:g});if(!b.state)return y.error("isDelegationSufficientForPayment: no delegation state",{address:g,delegator:l,source:_}),{sufficient:!1,reason:"NO_DELEGATION"};let{state:E}=b;if(!E.ops||E.ops?.length===0)return y.error("isDelegationSufficientForPayment: no delegation ops",{address:g,delegator:l,source:_}),{sufficient:!1,reason:"NO_DELEGATION",state:E};let A=E.ops.find(L=>L.key===AT)?.value;if(!A)return{sufficient:!1,reason:"NO_TRANSFER_PERMISSION",state:E};if(A.limit&&Array.isArray(A.limit.tokens)&&A.limit.tokens.length>0){let L=A.limit.tokens.find(T=>T.address===c);if(!L)return{sufficient:!1,reason:"NO_TOKEN_PERMISSION",state:E};if(Array.isArray(L.to)&&L.to.length){let T=await qy(f);if(![we.address,...T].some(H=>L.to.includes(H)))return{sufficient:!1,reason:"NO_TRANSFER_TO",state:E}}if(L.txAllowance!=="0"){let T=new F(L.txAllowance);if(d){if(o.find(U=>new F(U).gt(T)))return{sufficient:!1,reason:"NO_ENOUGH_ALLOWANCE",state:E}}else if(u.gt(T))return{sufficient:!1,reason:"NO_ENOUGH_ALLOWANCE",state:E}}}let{tokens:R}=await f.getAccountTokens({address:l,token:c}),[C]=R;return C?new F(C.balance).lt(u)?{sufficient:!1,reason:"NO_ENOUGH_TOKEN",token:C,state:E,requestedAmount:u.toString()}:{sufficient:!0,delegator:l,state:E,token:C,requestedAmount:u.toString()}:{sufficient:!1,reason:"NO_TOKEN",state:E}}if(r.type==="stripe")return{sufficient:!1,reason:"NOT_SUPPORTED"};if(wt.includes(r.type)){if(!e.contract)return{sufficient:!1,reason:"NOT_SUPPORTED"};if(Yp(n)===!1)return{sufficient:!1,reason:"NOT_SUPPORTED"};let l=r.getEvmClient(),p=await yw(l,e.contract,n);if(new F(p).lt(new F(i)))return{sufficient:!1,reason:"NO_ENOUGH_TOKEN"};let f=await TPe(l,e.contract,n,Sn.address);return y.info("isDelegationSufficientForPayment",{userDid:n,amount:i,allowance:f,contract:e.contract}),new F(f).lt(new F(i))?{sufficient:!1,reason:"NO_ENOUGH_ALLOWANCE"}:{sufficient:!0}}throw new Error(`Payment method ${r.type} not supported`)}function rY(t){let{paymentMethod:e,paymentCurrency:r,customer:n,amount:i}=t;if(e.type==="stripe")return{sufficient:!1,balance:n.balance||"0",reason:"NOT_SUPPORTED"};let a=(n.token_balance||{})[r.id]||"0";return i==="0"?{sufficient:!0,balance:a}:new F(a).lt(new F(i))?{sufficient:!1,balance:a,reason:"NO_ENOUGH_TOKEN"}:{sufficient:!0,balance:a}}async function Qn(t,e,r){if(!(r?await sC({client:r}).then(o=>!!o).catch(()=>!1):!1)&&e&&e["x-gas-payer-sig"]&&e["x-gas-payer-pk"])return{headers:e};let i=Kse(t);return{headers:{"x-gas-payer-sig":await we.signJWT({txHash:i}),"x-gas-payer-pk":we.publicKey}}}async function EF(t,e,r="0"){let n={balance:0,price:0,symbol:""},i=await W.findByPk(e.currency_id);if(!i)return n;Object.assign(n,{symbol:i.symbol});let o=await Te.findByPk(e.payment_intent_id),a=o?o.amount:r,s=await Y.findByPk(e.default_payment_method_id);if(!s)return n;let c=e?.payment_settings;if(cc.includes(s.type)){let u=c?.payment_method_options.arcblock?.payer,d=await oi({paymentMethod:s,paymentCurrency:i,userDid:u||t,amount:a});if(!d.token)return n;let l=+lt(a,i.decimal);return d.delegator?{balance:+lt(d.token.balance,i.decimal),price:l,symbol:i.symbol}:{balance:0,price:l,symbol:i.symbol}}return n}async function RPe(t,e,r,n,i,o){let s=t.some(u=>u.price.recurring?.usage_type==="metered")?"0":i,c={address:r.contract,to:[we.address],txAllowance:s,totalAllowance:"0",txCount:0,validUntil:0};if(e.type==="arcblock"){let u=o;if(u===void 0){let l=e.getOcapClient();await l.getContext(),{state:u}=await l.getDelegateState({address:n}),y.info("getTokenLimitsForDelegation: fetched DelegateState from chain",{address:n})}else y.info("getTokenLimitsForDelegation: reused DelegateState from caller",{address:n});if(!u)return[c];if(!u.ops||u.ops?.length===0)return[c];let d=u.ops.find(l=>l.key===AT);if(d&&Array.isArray(d.value.limit?.tokens)&&d.value.limit.tokens.length>0){let l=Vn(d.value.limit.tokens),p=d.value.limit.tokens.findIndex(f=>f.address===r.contract);if(p>-1){let f=d.value.limit.tokens[p];f.txAllowance!=="0"&&new F(f.txAllowance).lt(new F(i))&&(l[p]=c)}else l.push(c);return l}return[c]}if(wt.includes(e.type))return c.totalAllowance=new F(i).mul(new F(12)).toString(),[c];throw new Error(`getTokenLimitsForDelegation: Payment method ${e.type} not supported`)}async function nY(t){let{paymentCurrency:e,paymentMethod:r,amount:n}=t,i=e.contract;if(r.type==="arcblock"){let o=r.getOcapClient(),{tokens:a}=await o.getAccountTokens({address:we.address,token:i}),[s]=a;return s?new F(s.balance).lt(new F(n))?{sufficient:!1,reason:"NO_ENOUGH_TOKEN",token:s}:{sufficient:!0,token:s}:{sufficient:!1,reason:"NO_TOKEN"}}if(wt.includes(r.type)){let o=r.getEvmClient(),a=e.contract?await yw(o,e.contract,Sn.address):await hC(o,Sn.address);return new F(a).lt(new F(n))?{sufficient:!1,reason:"NO_ENOUGH_TOKEN"}:{sufficient:!0}}if(r.type==="stripe")return{sufficient:!1,reason:"NOT_SUPPORTED"};throw new Error(`isBalanceSufficientForRefund: Payment method ${r.type} not supported`)}async function OPe(t,e,r){let{donation_settings:n}=t;if(!n)return[];let{beneficiaries:i}=n,o=i.reduce((c,u)=>c+Number(u.share),0);if(o===0)return i;let a=await Yg(e);return await Promise.all(i.map(async c=>{let{address:u,share:d,name:l,avatar:p}=c;try{let f=await Df(u,a);return{address:u,percent:Number(d)*100/o,name:l||f?.name||"",avatar:p||f?.avatar||"",url:$_e(f?.url||"",r),type:f?.type||"user"}}catch{return{address:u,percent:Number(d)*100/o,name:l||"",avatar:p||""}}}))}async function vF(t){let e=await W.scope("withVaultConfig").findByPk(t);if(!e)return{depositAmount:"0",message:"Payment currency not found"};if(!e?.vault_config?.enabled)return{depositAmount:"0",message:"Deposit vault is not enabled"};let r=e?.vault_config?.deposit_threshold;if(!r||r==="0")return{depositAmount:"0",message:"Deposit threshold is not set or zero"};let n=await Y.findByPk(e.payment_method_id);if(!n)return{depositAmount:"0",message:"Payment method not found"};let i=await rb();if(!i)return{depositAmount:"0",message:"Vault address is not found"};if(!N4(i).includes(n.type))return{depositAmount:"0",message:"Vault chain type is not supported"};let a=n.type==="arcblock"?we.address:Sn.address,s=await yp(a,n,e),c=new F(r);if(new F(s).lte(c))return{depositAmount:"0",message:"No enough balance to deposit to vault"};let u=new F(s),d=u.sub(c).toString(),{[e.id]:l}=await Tr.getPayoutLockedAmount({currency_id:e.id});if(new F(l).add(c).gte(u))return{depositAmount:"0",message:"Amount to payout is already greater than the deposit threshold"};if(d=new F(d).sub(new F(l)).toString(),new F(d).lte(new F(0)))return{depositAmount:"0",message:"No amount available to deposit after calculations"};let p=e?.vault_config?.buffer_threshold;return p&&p!=="0"&&new F(d).lt(new F(p))?{depositAmount:"0",message:"Amount to deposit is less than the buffer threshold"}:{depositAmount:d,vaultAddress:i,paymentCurrency:e}}var NPe,$v,ai=N(()=>{"use strict";ja();kH();Ou();qe();qf();bu();_e();cC();Ir();he();ke();mi();wu();Pv();NPe=3e4,$v=new Map});function dc({subscriptionId:t,locale:e="en",userDid:r}){return Bh.getUrl(cn(`customer/subscription/${t}`,{locale:e,...to({userDid:r})}))}function AF({subscriptionId:t,locale:e="en",userDid:r}){return Bh.getUrl(cn(`admin/billing/${t}`,{locale:e,...to({userDid:r})}))}function DPe({invoiceId:t,locale:e="en",userDid:r}){return Bh.getUrl(cn(`admin/billing/${t}`,{locale:e,...to({userDid:r})}))}function BPe(t,e){for(let r of t){let n=parseInt(r,10);if(typeof n=="number"&&n>=0)return n}return e}function Vy(t={}){return BPe([t.days_until_due,oH()],6)}function hp(t={}){return BPe([t.days_until_cancel,aH()],0)}function oY(t,e,r="0"){let n={licensed:new F(0),metered:new F(0)};return t.map(o=>o.upsell_price||o.price).filter(o=>o.type==="recurring"&&o.recurring).length>0&&(new F(r).gt(YAt)?n.licensed=new F(r):t.forEach(o=>{let a=qo(o),s=Yn(a,e),c=new F(s).mul(new F(o.quantity));a.type==="recurring"&&a.recurring&&(a.recurring.usage_type==="licensed"&&(n.licensed=n.licensed.add(c)),a.recurring.usage_type==="metered"&&(n.metered=n.metered.add(c)))})),n}function Ky(t,e,r){let n=pC(t),i=se().unix();if(!r?.catchUp)return{recurring:t,cycle:n,period:{start:e,end:se.unix(e).add(n,"millisecond").unix()},missedPeriods:0};let o=se.unix(e).add(n,"millisecond").unix();if(i<=o)return{recurring:t,cycle:n,period:{start:e,end:o},missedPeriods:0};let a=i-o,s=n/1e3,c=Math.floor(a/s),u=r.maxMissedPeriods||100,d=Math.min(c,u),l=se.unix(e).add((d+1)*n,"millisecond").unix(),p=se.unix(l).add(n,"millisecond").unix();return{recurring:t,cycle:n,period:{start:l,end:p},missedPeriods:d,recovery:{originalPeriodEnd:e,expectedPeriodEnd:o,timeMissed:a,periodsSkipped:d,wasLimited:c>u}}}function hw(t,e){let r=new F(0);return t.forEach(n=>{let i=qo(n),o=i?.pricing_type==="dynamic"?n.custom_amount||n.quoted_amount:null;if(o){r=r.add(new F(o));return}r=r.add(new F(Yn(i,e)).mul(new F(n.quantity)))}),{total:r.toString()}}async function SF(t,e,r){let n=await ce.findByPk(t.latest_invoice_id);if(!n)throw new Error("Subscription should have latest invoice when create proration");let i=await te.findByPk(t.customer_id);if(!i)throw new Error("Subscription should have customer when create proration");let o=await jt.findAll({where:{invoice_id:n.id,proration:!1}}),s=(await ne.expand(o.map($=>$.toJSON()))).filter($=>{let U=qo($);return U.type==="recurring"&&U.recurring?.usage_type==="licensed"}),c=1e4,u=n.period_start<n.period_end,d=u?n.period_start:t.current_period_start,l=u?n.period_end:t.current_period_end;if(r>l)throw y.warn("try to create proration with invalid arguments",{anchor:r,prorationStart:d,prorationEnd:l}),new Error("Subscription proration anchor should not be larger than prorationEnd");if(t.status==="trialing")return{lastInvoice:n,total:"0",shouldPay:"0",used:"0",unused:"0",prorations:[],newCredit:"0",appliedCredit:"0",remaining:"0",remainingUnused:"0"};let f=Math.ceil((l-r)/(l-d)*c),m=new F(0),h=await Promise.all(s.map($=>{let U=qo($),H;if(U.pricing_type==="dynamic")H=$.amount||"0",y.info("Using dynamic pricing amount for proration",{subscriptionId:t.id,priceId:U.id,actualAmount:H});else{let k=Yn(U,n.currency_id);H=new F(k).mul(new F($.quantity)).toString()}let M=new F(H).mul(new F(f)).div(new F(c)).toString();return y.info("subscription proration item",{subscription:t.id,invoice:$.invoice_id,invoiceItem:$.id,amount:M,isDynamic:U.pricing_type==="dynamic"}),m=m.add(new F(M)),{price_id:U.id,amount:`-${M}`,quantity:$.quantity,description:`Unused time on ${U.product.name} after ${se().format("lll")}`,period:{start:n.period_start,end:n.period_end},proration:!0,proration_details:{credited_items:{invoice_id:n.id,invoice_line_items:[$.id]}},pricing_type:U.pricing_type,base_amount_usd:U.pricing_type==="dynamic"?U.base_amount:null,proration_rate:f/c}}));y.info("subscription prorations created",{subscription:t.id,prorations:h});let g=e.amount.setup,b=(await Rt.findAll({where:{status:{[J.not]:"canceled"},subscription_id:t.id,currency_id:n?.currency_id,invoice_id:n?.id}})).reduce(($,U)=>$.add(new F(U.amount||"0")),new F(0)),E=($,U)=>$.sub(U).lt(new F(0))?"0":$.sub(U).toString(),A=E(new F(g),b),R=E(m,b),C=e.amount.setup,L="0",T="0";return new F(g).gte(m)?(C=new F(g).sub(m).toString(),T=i.getBalanceToApply(t.currency_id,C),C=new F(C).sub(new F(T)).toString()):(L=m.sub(new F(g)).toString(),C="0"),y.info("subscription proration result",{subscription:t.id,prorationStart:d,prorationEnd:l,prorationRate:f,unused:m.toString(),remaining:A,remainingUnused:R,total:g,due:C,newCredit:L,appliedCredit:T}),{lastInvoice:n,total:g,due:C,remaining:A,remainingUnused:R,used:new F(n.amount_due).sub(m).toString(),unused:m.toString(),prorations:h,newCredit:L,appliedCredit:T}}async function bC(t,e,r){let n=await He.findAll({where:{subscription_id:t.id}}),i=await ne.expand(n.map(d=>d.toJSON())),o=r||t.currency_id,a=t.slippage_config,s=await W.findByPk(o),c={percent:a?.percent??.5,minAcceptableRate:a?.min_acceptable_rate,currencyDecimal:s?.decimal},u=ko(i,o,0,0,c);return SF(t,u,e)}function Fv(t){if(["past_due","active","trialing"].includes(t.status)){let e=se().unix();if(t.cancel_at){if(t.cancel_at<=e)return!0}else if(t.cancel_at_period_end&&t.current_period_end<=e)return!0}return!1}async function gw(t){let e=await He.findAll({where:{subscription_id:t}});return ne.expand(e.map(r=>r.toJSON()))}async function TF(t){let e=await ee.findByPk(t);if(!e)throw new Error("Subscription not found");if(e.isActive()===!1&&e.status!=="past_due")throw new Error(`Subscription not active for ${t}, so usage check is skipped`);let r=await W.findByPk(e.currency_id),n=await He.findAll({where:{subscription_id:t}}),i=await ne.expand(n.map(u=>u.toJSON())),o=new F(0),a=new F(0),s=!1;for(let u of i){let d=qo(u);if(d.pricing_type==="dynamic"&&(s=!0),d.type==="recurring"){let l=Yn(d,e.currency_id);if(d.recurring?.usage_type==="licensed"&&(o=o.add(new F(l).mul(new F(u.quantity))),a=a.add(new F(l).mul(new F(u.quantity)))),d.recurring?.usage_type==="metered"){let p=await hn.getSummary({id:u?.id,start:e.current_period_start,end:e.current_period_end,method:d.recurring?.aggregate_usage,dryRun:!0}),f=d.transformQuantity(p);o=o.add(new F(l).mul(new F(f))),a=a.add(new F(l).mul(new F(u.quantity)))}}}let c=null;if(s&&r)try{let u=await Y.findByPk(r.payment_method_id),d=gn(),l=Xn(r.symbol,u?.type);if(l){let p=await d.getRate(l);p?.rate&&(c={exchange_rate:p.rate,rate_timestamp_ms:p.timestamp_ms||Date.now(),providers:p.providers||[]})}}catch(u){y.warn("Failed to fetch exchange rate for upcoming invoice",{subscriptionId:t,error:u})}return{amount:o.toString(),minExpectedAmount:a.toString(),start:e.current_period_start,end:e.current_period_end,currency:r,quoteInfo:c}}async function LPe(t,e="max"){let r=await ee.findByPk(t);if(!r)throw new Error("Subscription not found");let n=await W.findByPk(r.currency_id),i=await ce.findAll({where:{subscription_id:t,currency_id:r.currency_id,billing_reason:["subscription_create","subscription_cycle","subscription_update","subscription_recover","subscription_threshold","subscription_cancel","subscription"]},order:[["created_at","DESC"]]}),o=Ky(r.pending_invoice_item_interval,r.current_period_end),a=o.period.start-o.cycle/1e3,s=o.period.end-o.cycle/1e3,c=se(r.created_at).unix(),u={};for(;a<s&&a>=c;){let l=`${a}-${s}`,f=i.filter(m=>m.period_start>=a&&m.period_end<=s).reduce((m,h)=>m.add(new F(h.total)),new F(0));u[l]=f,a-=o.cycle/1e3,s-=o.cycle/1e3}let d=new F(0);switch(e){case"sum":d=Object.values(u).reduce((l,p)=>l.add(p),new F(0));break;case"avg":d=Object.values(u).length>0?Object.values(u).reduce((l,p)=>l.add(p),new F(0)).div(new F(Object.values(u).length)):new F(0);break;case"max":d=Object.values(u).length>0?Object.values(u).reduce((l,p)=>l.gt(p)?l:p,new F(0)):new F(0);break;default:throw new Error("Invalid aggregation rule")}return{amount:d.toString(),currency:n}}async function IF({subscription:t,customer:e,invoice:r,paymentCurrency:n,appliedCredit:i,newCredit:o,addedItems:a,updatedItems:s,deletedItems:c,updates:u}){if(Os(u)){y.info("subscription update aborted",{subscription:t.id,updates:u});return}y.info("subscription update finalized",{subscription:t.id,updates:u}),await t.update({...u,pending_update:null});for(let l of a)await He.create({price_id:l.price_id,quantity:l.quantity,livemode:t.livemode,subscription_id:t.id,metadata:{}}),y.info("subscription item added on update finalize",{subscription:t.id,item:l.id});for(let l of s)await He.update(Re(l,["quantity","metadata","billing_thresholds"]),{where:{id:l.id}}),y.info("subscription item updated on update finalize",{subscription:t.id,item:l.id});for(let l of c)l.clear_usage&&(await hn.destroy({where:{subscription_item_id:l.id}}),y.info("subscription item usage cleared on update finalize",{subscription:t.id,item:l.id})),await He.destroy({where:{id:l.id}}),y.info("subscription item deleted on update finalize",{subscription:t.id,item:l.id});if(i!=="0"){let l=await e.decreaseTokenBalance(n.id,i);r&&(await r.update({starting_token_balance:l.starting,ending_token_balance:l.ending}),y.info("customer credit applied to invoice after proration",{subscription:t.id,appliedCredit:i,creditResult:l}))}if(o!=="0"){let l=await e.increaseTokenBalance(n.id,o);r&&(await r.update({starting_token_balance:l.starting,ending_token_balance:l.ending}),y.info("subscription proration credit applied to customer",{subscription:t.id,newCredit:o,creditResult:l}))}let d=t.current_period_end;await ii.acquire(`${t.id}-change-plan`,d),y.info("subscription plan change lock acquired on finalize",{subscription:t.id,releaseAt:d})}async function FPe({subscription:t,items:e,updates:r}){if(Os(r)){y.info("subscription update aborted",{subscription:t.id,updates:r});return}if(t.pending_update){let i=(await He.findAll({where:{subscription_id:t.id}})).filter(a=>e.some(s=>s.id===a.id)===!1).map(a=>a.id);i.length&&(await hn.destroy({where:{subscription_item_id:i}}),y.info("subscription item usage cleared on update",{subscription:t.id,deletedItems:i}),await He.destroy({where:{id:i}}),y.info("subscription item deleted on update",{subscription:t.id,deletedItems:i}));for(let a of e)if(a.id)await He.update(Re(a,["quantity","billing_thresholds"]),{where:{id:a.id}}),y.info("subscription item synced on update",{subscription:t.id,item:a});else{let s=await He.create({price_id:a.price_id,quantity:a.quantity||1,livemode:t.livemode,subscription_id:t.id,metadata:{stripe_id:a.stripe_id,stripe_subscription_id:a.stripe_subscription_id}});y.info("subscription item mirrored on update",{subscription:t.id,item:a});let d=await(await Y.findByPk(t.default_payment_method_id)).getStripeClient().subscriptionItems.update(a.stripe_id,{metadata:{appPid:pa.appPid,id:s.id}});y.info("subscription item related on mirror",{subscription:t.id,item:a,result:d})}let o=t.current_period_end;await ii.acquire(`${t.id}-change-plan`,o),y.info("subscription plan change lock acquired on finalize",{subscription:t.id,releaseAt:o}),xe("Subscription","customer.subscription.upgraded",t).catch(Se)}y.info("subscription update finalized",{subscription:t.id,updates:r,items:e}),await t.update({...r,pending_update:null})}async function CF(t){let e=await ee.findByPk(t);if(!e)return;let r=se().unix(),n=e.pending_update;if(y.info("subscription update connected",{subscription:e.id,pending:n}),n?.updates&&n?.expires_at&&n.expires_at>=r&&n.updates?.latest_invoice_id){let i=await W.findByPk(e.currency_id);if(!i)return;let o=await te.findByPk(e.customer_id);if(!o)return;let a=await ce.findByPk(n.updates.latest_invoice_id);if(!a)return;await IF({subscription:e,customer:o,invoice:a,paymentCurrency:i,appliedCredit:n.appliedCredit||"0",newCredit:n.newCredit||"0",addedItems:n.addedItems||[],deletedItems:n.deletedItems||[],updatedItems:n.updatedItems||[],updates:n.updates})}}async function QAt(t,e){if(!t||t.length===0)return"0";let r=new F("0");return await Promise.all(t.map(async n=>{await Rt.findOne({where:{subscription_id:n,status:{[J.not]:"canceled"},type:"stake_return"}})||(r=r.add(new F(e[n]||"0")))})),r.toString()}async function kF(t,e,r,n){let i=await ce.findByPk(t.latest_invoice_id);return{...await MPe(t,e,r,"slash",n),lastInvoice:i}}async function wC(t,e,r,n){let i=await ce.findByPk(t.latest_invoice_id);return{...await MPe(t,e,r,"return",n),lastInvoice:i}}async function MPe(t,e,r,n="return",i){let o=await W.findByPk(i||t.currency_id);if(!o)return{total:"0",return_amount:"0",sender:""};let a=r.getOcapClient(),{state:s}=await a.getStakeState({address:e});if(!s)return{total:"0",return_amount:"0",sender:""};let c=new F(s.tokens.find(h=>h.address===o.contract)?.value||"0");if(n==="slash"){let h=s.revokedTokens?.find(g=>g.address===o.contract);c=c.add(new F(h?.value||"0"))}let[u]=await ce.getUncollectibleAmount({subscriptionId:t.id,currencyId:o.id,customerId:t.customer_id}),d=JSON.parse(s.data?.value||"{}"),l=d[t.id],p=new F(u?.[o.id]||"0");if(s.nonce){let h=c.sub(p);return{total:c.toString(),return_amount:h.lt(new F(0))?"0":h.toString(),sender:s.sender}}let m=await(async()=>{let h=new F(l),g=Object.keys(d).filter(A=>A!=="appId"&&A!==t.id),_=await QAt(g,d),b=new F(c).sub(new F(_));return(h.lt(b)?h:b).sub(p)})();return{total:l,return_amount:m.lt(new F(0))?"0":m.toString(),sender:s.sender}}async function Sa(t,e,r,n){if(t?.type!=="arcblock")return{enough:!1,staked:"0",revoked:"0"};let i=t.getOcapClient(),{state:o}=await i.getStakeState({address:r});if(!o)return y.warn("getStakeState failed in checkRemainingStake",{address:r}),{enough:!1,staked:"0",revoked:"0"};let a=o.tokens?.find(u=>u.address===e.contract),s=o.revokedTokens?.find(u=>u.address===e.contract),c=new F(0);return a&&(c=c.add(new F(a?.value||"0"))),s&&(c=c.add(new F(s?.value||"0"))),{enough:c.gte(new F(n||"0")),staked:a,revoked:s}}function nm(t,e){let r=Number(t?.trial_period_days||0),n=Number(t?.trial_end||0),i=(t?.trial_currency||"").split(",").map(cke).filter(Boolean);return i.length>0&&i.includes(e)===!1&&(n=0,r=0),{trialInDays:r,trialEnd:n}}async function _w(t,e,r){let n=t.payment_details?.arcblock?.staking?.address;if(n)return n;if(r?.type==="arcblock"){let i=r.getOcapClient(),o=await nPe({userDid:e,nonce:t.id,client:i});if(o)return o.address}return S1(e,t.id)}async function UPe(t,e,r){let n={stakeReturn:t.cancelation_details?.return_stake===!0,stakeSlash:t.cancelation_details?.slash_stake===!0,stakeEnough:!1,hasStake:!!t?.payment_details?.arcblock?.staking?.tx_hash};if(t.cancelation_details?.reason==="cancellation_requested"){let o=t?.payment_details?.arcblock?.staking?.address,a;if(o&&e){let s=await wC(t,o,e);a=await Sa(e,r,o,s.return_amount),n.stakeEnough=a?.enough}}return n}async function qPe(t,e,r){if(e.type!=="arcblock")return null;let n=r||t?.payment_details?.arcblock?.staking?.tx_hash;if(!n)return null;let i=e.getOcapClient(),{info:o}=await i.getTx({hash:n});if(!o)return null;let a=o?.tx?.itxJson?.inputs||[];if(!a||a.length===0)return y.info("getSubscriptionStakeAmountSetup failed, no inputs",{txHash:n,info:o}),null;let s={};return a.forEach(c=>{let{tokens:u}=c;u.forEach(d=>{let{address:l,value:p}=d;s[l]?s[l]=new F(s[l]).add(new F(p)).toString():s[l]=new F(p).toString()})}),y.info("get subscription stake amount setup success",{txHash:n,amountRes:s}),s}async function Mv(t,e,r){let n=await He.findAll({where:{subscription_id:t.id}}),o=(await ne.expand(n.map(s=>({id:s.id,price_id:s.price_id,quantity:s.quantity})),{product:!0})).filter(s=>s?.price?.recurring?.usage_type==="metered");return o.length===0?!1:(await Promise.all(o.map(async s=>(await hn.findAll({where:{subscription_item_id:s.id,billed:!1,timestamp:{[J.gt]:e,[J.lte]:r}}})).length===0))).every(Boolean)}function oo(t,e){return t.payment_details?.[e]?.payer||t.payment_settings?.payment_method_options?.[e]?.payer}async function PF(t,e){let r=await He.findAll({where:{subscription_id:t.id}});if(r.length===0)return y.info("subscription items not found in getPaymentAmountForCycleSubscription",{subscription:t.id}),0;let n=await ne.expand(r.map(a=>({id:a.id,price_id:a.price_id,quantity:a.quantity})),{product:!0});if(n.length===0)return y.info("expanded items not found in getPaymentAmountForCycleSubscription",{subscription:t.id}),0;let i=t.status==="trialing"?t.trial_end:t.current_period_end,o=Ky(t.pending_invoice_item_interval,i);if(n=await Promise.all(n.map(async a=>{if(a.price.recurring?.usage_type==="metered"){let s=await hn.getSummary({id:a.id,start:o.period.start-o.cycle/1e3,end:o.period.end-o.cycle/1e3,method:a.price.recurring?.aggregate_usage,dryRun:!0});a.quantity=a.price.transformQuantity(s),a.metadata=a.metadata||{},a.metadata.quantity=s}return a})),n.length>0){let a=hw(n,e.id);return+lt(a?.total||"0",e.decimal)}return 0}async function HPe(t,e){let r=await He.findAll({where:{subscription_id:t.id}});if(r.length===0)return y.info("subscription items not found in getEstimatedPaymentAmountForCycleSubscription",{subscription:t.id}),{amount:0,estimatedByRate:!1};let n=await ne.expand(r.map(u=>({id:u.id,price_id:u.price_id,quantity:u.quantity})),{product:!0});if(n.length===0)return y.info("expanded items not found in getEstimatedPaymentAmountForCycleSubscription",{subscription:t.id}),{amount:0,estimatedByRate:!1};let i=t.status==="trialing"?t.trial_end:t.current_period_end,o=Ky(t.pending_invoice_item_interval,i);if(n=await Promise.all(n.map(async u=>{if(u.price.recurring?.usage_type==="metered"){let d=await hn.getSummary({id:u.id,start:o.period.start-o.cycle/1e3,end:o.period.end-o.cycle/1e3,method:u.price.recurring?.aggregate_usage,dryRun:!0});u.quantity=u.price.transformQuantity(d),u.metadata=u.metadata||{},u.metadata.quantity=d}return u})),n.length===0)return{amount:0,estimatedByRate:!1};let a=!1;if(n.some(u=>u.price?.pricing_type==="dynamic"))try{let u=await Y.findByPk(e.payment_method_id);if(!u)throw new Error(`PaymentMethod not found in ${t.id}`);let d=gn(),l=Xn(e.symbol,u.type),p=await d.getRate(l),f=8,m=Ue(zt(p.rate,f),f);n=n.map(h=>{let{price:g}=h;if(g?.pricing_type!=="dynamic")return h;if(!g.base_amount)return y.warn("Dynamic price missing base_amount for estimate",{subscriptionId:t.id,priceId:g.id}),h;let _=Ue(zt(g.base_amount,f),f),b=new F(h.quantity||0),R=_.mul(b).mul(new F(10).pow(new F(e.decimal))).add(m).sub(new F(1)).div(m),C=ip(R,e.decimal,10);return a=!0,{...h,custom_amount:C.toString(),quoted_amount:C.toString()}})}catch(u){y.warn("Failed to estimate dynamic pricing amount for subscription",{subscriptionId:t.id,error:u?.message||u})}let c=hw(n,e.id);return{amount:+lt(c?.total||"0",e.decimal),estimatedByRate:a}}async function Ta(t,e){try{let r=await W.findByPk(e||t.currency_id);if(!r)throw new Error(`PaymentCurrency not found in ${t.id}`);let n=await Y.findByPk(r.payment_method_id);if(!n)throw new Error(`PaymentMethod not found in ${t.id}`);if(n.type!=="arcblock")return{enabled:!1,remaining:"0",used:"0",shouldPay:"0",unused:"0",revokedStake:"0"};if(!t.overdraft_protection)return{enabled:!1,remaining:"0",used:"0",shouldPay:"0",unused:"0",revokedStake:"0"};let i=n.getOcapClient(),o=t?.overdraft_protection?.payment_details?.arcblock?.staking?.address;if(!o)return y.info("Seems you have no staking for overdraft protection",{subscription:t.id}),{enabled:!1,remaining:"0",used:"0",shouldPay:"0",unused:"0",revokedStake:"0"};let{state:a}=await i.getStakeState({address:o});if(!a)throw new Error(`Stake state not found in ${t.id}`);if(!JSON.parse(a.data?.value||"{}")[t.id]&&!a.nonce)throw new Error(`No staking for subscription: ${t.id}, address: ${o}`);let c=new F(a.tokens.find(h=>h.address===r.contract)?.value||"0"),u=new F(a.revokedTokens?.find(h=>h.address===r.contract)?.value||"0"),l=(await Rt.findAll({where:{subscription_id:t.id,type:"stake_return",status:{[J.notIn]:["canceled","succeeded"]},currency_id:r.id},include:[{model:ce,as:"invoice"}]})).filter(h=>h.invoice?.billing_reason==="stake_overdraft_protection").reduce((h,g)=>h.add(new F(g.amount)),new F(0));c=c.sub(l);let p=await ce.findAll({where:{subscription_id:t.id,status:["open","uncollectible"],currency_id:r.id}}),f=new F(0),m=new F(0);return p.forEach(h=>{f=f.add(new F(h.amount_remaining)),h.billing_reason!=="overdraft_protection"&&(m=m.add(new F(h.amount_remaining)))}),{enabled:t.overdraft_protection.enabled&&f.lte(c),remaining:c.toString(),used:f.toString(),shouldPay:m.toString(),revoked:u.toString(),unused:c.gte(f)?c.sub(f).toString():"0"}}catch(r){return y.error("error in isSubscriptionOverdraftProtectionEnabled",{error:r}),{enabled:!1,remaining:"0",used:"0",unused:"0",shouldPay:"0",revokedStake:"0"}}}async function jPe(t,e,r){y.info("returnOverdraftProtectionStake",{subscription:t.id,paymentCurrencyId:e});try{await aY(t,e);let{unused:n}=await Ta(t,e);if(n!=="0"){let i=t?.overdraft_protection?.payment_details?.arcblock?.staking?.address;if(!i){y.info("Stake return skipped due to missing staking address",{subscription:t.id});return}let o=await ce.findOne({where:{subscription_id:t.id,billing_reason:"stake_overdraft_protection",currency_id:e||t.currency_id,status:"paid"},order:[["created_at","DESC"]]}),a=await Rt.create({type:"stake_return",amount:n,description:"stake_return_for_subscription_guard",status:"pending",reason:r||"requested_by_admin",subscription_id:t.id,currency_id:e||t.currency_id,livemode:t.livemode,customer_id:t.customer_id,invoice_id:o?.id,payment_intent_id:o?.payment_intent_id||"",payment_method_id:t.overdraft_protection?.payment_method_id||"",starting_balance:n,ending_balance:"0",attempt_count:0,attempted:!1,next_attempt:0,last_attempt_error:null,starting_token_balance:{},ending_token_balance:{},payment_details:{arcblock:{receiver:t?.overdraft_protection?.payment_details?.arcblock?.payer||oo(t,"arcblock"),staking:{address:i||"",tx_hash:""}}}});y.info("returnOverdraftProtectionStake Refund created",{item:a})}}catch(n){throw y.error("returnOverdraftProtectionStake failed",{error:n}),n}}async function aY(t,e){let r=Qr(`slash_overdraft_protection_stake_${t.id}-${e||t.currency_id}`);y.info("slashOverdraftProtectionStake",{subscription:t.id,paymentCurrencyId:e});try{if(await r.acquire(),!t.overdraft_protection){y.info("slashOverdraftProtectionStake skipped due to missing overdraft protection",{subscription:t.id});return}let n=await W.findByPk(e||t.currency_id);if(!n)throw new Error(`PaymentCurrency not found in ${t.id}`);let{used:i,remaining:o,revoked:a}=await Ta(t,n.id),s=new F(o).add(new F(a)).toString();if(i==="0"){y.info("slashOverdraftProtectionStake skipped due to no unpaid invoices",{subscription:t.id,paymentCurrencyId:n.id});return}if(s==="0"){y.info("slashOverdraftProtectionStake skipped due to no remaining stake",{subscription:t.id,paymentCurrencyId:n.id});return}let c=await Y.findByPk(n.payment_method_id);if(!c||c.type!=="arcblock")throw new Error(`PaymentMethod type not supported in ${t.id}`);let u=t?.overdraft_protection?.payment_details?.arcblock?.staking?.address;if(!u){y.info("Stake slashing skipped due to missing staking address",{subscription:t.id});return}let d=c.getOcapClient(),{state:l}=await d.getStakeState({address:u});if(!l||!l.data?.value)throw new Error(`Stake slashing aborted due to missing staking state for subscription: ${t.id}, address: ${u}`);if(!JSON.parse(l.data.value||"{}")[t.id]&&!l.nonce)throw new Error(`Stake slashing aborted because no staking for subscription: ${t.id}, address: ${u}`);let f=await ce.findAll({where:{subscription_id:t.id,status:["open","uncollectible"],currency_id:n.id},order:[["created_at","ASC"]]}),m=new F(0),h=[];for(let b of f){b.payment_intent_id||(await Lf("invoice.queued",b.id,{invoiceId:b.id,retryOnError:!1,justCreate:!0},{sync:!0}),await b.reload());let E=await Te.findByPk(b.payment_intent_id);if(E)if(E.status==="succeeded"&&b.status==="paid")y.info("PaymentIntent and Invoice already updated",{subscription:t.id,paymentIntent:E.id,invoice:b.id});else{let R=m.add(new F(b.amount_remaining));if(R.lte(new F(s)))m=R,h.push(b);else break}}let g=[],_=async b=>{let E=await Te.findByPk(b.payment_intent_id);if(!(!E||E.status==="succeeded"&&b.status==="paid"))try{if(!(await Sa(c,n,u,b.amount_remaining)).enough)throw new Error(`Stake slashing aborted because no enough staking for invoice: ${b.id}`);let R=await d.signSlashStakeTx({tx:{itx:{address:u,outputs:[{owner:we.address,tokens:[{address:n.contract,value:b.amount_remaining}]}],message:"overdraft_exceeded",data:{typeUrl:"json",value:{appId:we.address,reason:"overdraft_exceeded",subscriptionId:t.id,invoiceId:b.id,paymentIntentId:E.id}}}},wallet:we}),{buffer:C}=await d.encodeSlashStakeTx({tx:R}),L=await d.sendSlashStakeTx({tx:R,wallet:we},await Qn(C));await E.update({status:"succeeded",amount_received:b.amount_remaining,capture_method:"manual",last_payment_error:null,payment_details:{arcblock:{tx_hash:L,payer:t.overdraft_protection?.payment_details?.arcblock?.payer||oo(t,"arcblock"),type:"slash"}}}),y.info("PaymentIntent updated after stake slash",{subscription:t.id,paymentIntent:E.id,status:"succeeded"}),await b.update({status:"paid",paid:!0,amount_paid:b.amount_remaining,amount_remaining:"0",attempted:!0,attempt_count:b.attempt_count+1,status_transitions:{...b.status_transitions,paid_at:se().unix()}}),y.info("Invoice updated after stake slash",{subscription:t.id,invoice:b.id,status:"paid"}),g.push(b.id)}catch(A){throw y.error("stake slash failed",{subscription:t.id,invoice:b.id,error:A}),A}};await Promise.all(h.map(_)),y.info(`${g.length} invoices updated after stake slash`,{subscription:t.id,invoices:g,slashAmount:m.toString()})}catch(n){throw y.error("Error in slashOverdraftProtectionStake",{error:n}),n}finally{r.release()}}async function GPe(t){try{return await ce.count({where:{subscription_id:t.id,status:["open","uncollectible"],billing_reason:{[J.notIn]:["overdraft_protection"]}}})}catch(e){return y.error("getSubscriptionUnpaidInvoicesCount failed",{error:e}),0}}function JPe(t,e){if(!t||t.length===0)return{amount:"0",cycle:0,desc:"no subscription",interval:""};let r={hour:[],day:[],month:[],year:[]};t.forEach(l=>{l.items?.length&&l.items.forEach(p=>{let{price:f}=p;if(f?.type==="recurring"&&f.recurring?.interval){let m=f.recurring.interval;Object.keys(r).includes(m)&&r[m].push({subscription:l,item:p,price:f})}})});let n=r.hour.length>0,i=r.day.length>0,o=r.month.length>0,a=r.year.length>0,s="",c=0,u="";o?(s="month",c=720*60*60,u="monthly"):(n||i)&&!a?(s="week",c=10080*60,u="weekly"):(i||n)&&a?(s="month",c=720*60*60,u="monthly"):a&&(s="year",c=365*24*60*60,u="yearly");let d=new F(0);return t.forEach(l=>{l.items?.length&&l.items.forEach(p=>{let{price:f}=p;if(!f)return;let m=Yn(f,e),h=p.quantity||1,g=new F(m).mul(new F(h));if(f.type==="recurring"&&f.recurring?.interval){let{interval:_}=f.recurring,b=f.recurring.interval_count||1;s==="month"?_==="hour"?g=g.mul(new F(720)).div(new F(b)):_==="day"?g=g.mul(new F(30)).div(new F(b)):_==="month"?g=g.div(new F(b)):_==="year"&&(g=g.div(new F(12*b))):s==="week"&&(_==="hour"?g=g.mul(new F(168)).div(new F(b)):_==="day"&&(g=g.mul(new F(7)).div(new F(b)))),d=d.add(g)}else f.type==="one_time"&&(d=d.add(g))})}),{amount:d.toString(),cycle:c,desc:u,interval:s}}async function bw(t){return(await He.findAll({where:{subscription_id:t.id},include:[{model:ne,as:"price"}]})).filter(n=>n.price.recurring?.meter_id).map(n=>n.price.id)}var Lv,$Pe,iY,YAt,Pr=N(()=>{"use strict";Qo();qe();Ly();uke();Hr();Ss();$e();Zt();_e();Cr();pr();he();Yf();_u();pu();Qf();ki();ke();cC();Ir();ai();mu();Rn();Pv();Pv();Lv=t=>t==="hour"?60:t==="day"?3600:3600*24,$Pe=t=>t==="hour"?10:t==="day"?15:t==="week"?18:20,iY=t=>t==="hour"?9:t==="day"?13:15,YAt=new F(0)});function sY(t,e,r){typeof t=="function"&&(r=e,e=t,t=null);let n=[],i=!1,o=null;async function a(){if(!i){for(i=!0;n.length>0;){let c=n.shift();try{await new Promise(u=>{let d=!1,l=(f,m)=>{d||(d=!0,c.cb?.(f,m),u())},p=e(c.data,l);p&&typeof p.then=="function"&&p.then(()=>{d||(console.warn("[fastq-shim] worker resolved without calling cb \u2014 resolving with no-op"),d=!0,u())},f=>{d||(console.error("[fastq-shim] worker rejected without calling cb:",f),d=!0,c.cb?.(f),u())})})}catch(u){console.error("[fastq-shim] unexpected error in processQueue:",u),c.cb?.(u)}}i=!1,n.length===0&&o&&o()}}return{push(c,u){n.push({data:c,cb:u}),queueMicrotask(()=>a())},unshift(c,u){n.unshift({data:c,cb:u}),queueMicrotask(()=>a())},pause(){},resume(){},idle(){return n.length===0&&!i},length(){return n.length},kill(){n.length=0},killAndDrain(){n.length=0,o&&o()},get drain(){return o},set drain(c){o=c},empty:null,saturated:null,error:null}}var VPe=N(()=>{"use strict"});function cY(t){return{async isCancelled(e){let r=await ia.findOne({where:{queue:t,id:e},transaction:null});return!!r&&!!r.cancelled},getJob(e){return ia.findOne({where:{queue:t,id:e},transaction:null})},getJobs(){return ia.findAll({where:{queue:t,delay:-1,cancelled:!1},order:[["created_at","ASC"]],transaction:null})},getScheduledJobs(){return ia.findAll({where:{queue:t,delay:{[J.not]:-1},will_run_at:{[J.lte]:Date.now()},cancelled:!1},order:[["created_at","ASC"]],transaction:null})},findJobs(e){return ia.findAll({where:{queue:t,cancelled:!1,...e},order:[["created_at","ASC"]],transaction:null})},async updateJob(e,r){let n=await ia.findOne({where:{queue:t,id:e},transaction:null});if(!n)throw new Si("JOB_NOT_FOUND",`Job ${e} does not exist`);return n.update(r)},async addJob(e,r,n={},i=!1){if(!i){let o=await ia.findOne({where:{id:e}});if(o)throw new Si("JOB_DUPLICATE",`Job with id ${e} already exists ${o.queue===t?"in the same queue":`in queue ${o.queue}`}`)}try{return await ia.create({id:e,job:r,queue:t,retry_count:1,cancelled:!1,...n})}catch(o){throw o.name==="SequelizeUniqueConstraintError"?new Si("JOB_DUPLICATE",`Job with id ${e} was created concurrently`):o}},async deleteJob(e){return await ia.destroy({where:{queue:t,id:e}})>0}}}var KPe=N(()=>{"use strict";$e();LT();s0()});var NF={};Je(NF,{clearTenantIdentityCache:()=>nSt,createEmbeddedIdentityServices:()=>uY,getCachedTenantIdentity:()=>XPe,hasDynamicIdentity:()=>zPe,resolveTenantIdentity:()=>xC,warmTenantIdentity:()=>EC});function rSt(t,e){if(k0.set(t,{value:e,expiry:Date.now()+eSt}),k0.size>tSt){let r=k0.keys().next().value;r!==void 0&&k0.delete(r)}}function nSt(t){t?k0.delete(t):k0.clear()}function zPe(){return typeof Xm().getInstanceAppIdentity=="function"}async function xC(t){let e=t??Le(),r=k0.get(e);if(r&&r.expiry>Date.now())return r.value;let n=Xm();if(typeof n.getInstanceAppIdentity!="function")throw new Error("resolveTenantIdentity: the active IdentityDriver does not implement getInstanceAppIdentity \u2014 a non-blocklet-server DID-Connect runtime requires an AUTH_SERVICE-backed identity driver");let i=await n.getInstanceAppIdentity(e);if(!i||!i.appSk)throw new Error(`resolveTenantIdentity: no app signing key for instance "${e}" (fail-closed)`);if(i.appSk.length<66)throw new Error(`resolveTenantIdentity: appSk for instance "${e}" is too short (${i.appSk.length} chars) to derive a wallet (fail-closed)`);let o=W_(i.appSk,WPe),a=W_(i.appSk.slice(0,66),ZAt),s=i.appPsk?W_(i.appPsk,WPe):o,c={instanceDid:e,wallet:o,ethWallet:a,permanentWallet:s,appInfo:i.appInfo??{}};return rSt(e,c),c}function XPe(t){let e=t??Le(),r=k0.get(e);if(!r||r.expiry<=Date.now())throw new Error(`tenant identity for "${e}" is not resolved (fail-closed) \u2014 warmTenantIdentity must run in the request/job scope before any wallet access`);return r.value}async function EC(t){if(zPe()){try{await xC(t)}catch(e){y.warn("[tenant-identity] wallet identity warm failed \u2014 wallet access will fail-closed",{error:e instanceof Error?e.message:String(e)})}try{await XIe(t)}catch(e){y.warn("[tenant-identity] secrets warm failed \u2014 settings/Stripe decrypt will fail-closed",{error:e instanceof Error?e.message:String(e)})}}}function uY(){return{getBusinessWallet(t){let e=XPe();return t==="ethereum"?e.ethWallet:e.wallet},directory(){return iSt}}}var WPe,ZAt,eSt,tSt,k0,iSt,P0=N(()=>{"use strict";Ou();of();nt();V_();he();Xz();WPe={role:Xe.RoleType.ROLE_APPLICATION,pk:Xe.KeyType.ED25519,hash:Xe.HashType.SHA3},ZAt=Tpe("ethereum"),eSt=300*1e3,tSt=512,k0=new Map;iSt={getUser(t){return t?{user:{did:t,fullName:t,email:"",phone:"",remark:"",connectedAccounts:[{provider:"wallet",did:t}]}}:{user:null}},getUsers(){return{users:[]}},getVault(){return null},getBlocklet(){return{id:"",site:{id:""}}}}});import YPe from"events";import{AsyncLocalStorage as oSt}from"async_hooks";function aSt(t){return!t||typeof t!="object"?t:t.instance_did?(p_(t.instance_did),t):{...t,instance_did:or.getInstanceDid()}}async function QPe(t,e){let{warmTenantIdentity:r}=(P0(),Pe(NF));return await r(),t(e)}function sSt(t,e){let r=t?.instance_did;if(r)return qr(r,()=>QPe(e,t));if(Ec()==="single")return qr(_d(),()=>QPe(e,t));let n=new Cn(Ks,"legacy job without tenant refused in multi mode");return n.nonRetryable=!0,y.error("[queue] legacy job without tenant refused",{code:Ks,job:t}),Promise.reject(n)}function Me(t){if(!t)return;let e=Ws(t),r=or.getInstanceDid();if(e!==r){y.error("TENANT_VIOLATION",{code:Bo,rowTenant:e,jobTenant:r});let n=new Cn(Bo,`job object belongs to ${e} but payload says ${r}`);throw n.nonRetryable=!0,n}}function Pt({name:t,onJob:e,options:r=ZPe}){let n=cY(t),{concurrency:i,maxRetries:o,maxTimeout:a,retryDelay:s,enableScheduledJob:c}=Object.assign({},ZPe,r),u=(w,x)=>w||(r.id?r.id(x):Xh())||Xh(),d=new YPe,l=new oSt,p=new Set,f=new Set,m=async(w,x)=>{if(p.has(w)){y.warn("Job already running, skipping",{id:w});return}p.add(w);try{await l.run({id:w},x)}finally{p.delete(w),y.info(`Running job deleted: ${w}`)}},h=sY(async({job:w,id:x,persist:v},P)=>{y.info("execute job",{id:x,job:w,persist:v}),await m(x,async()=>{if(v)try{if(await n.isCancelled(x)){P(null,dY);return}}catch(O){P(O);return}if(f.has(x)){P(null,dY),y.info(`Job skipped because it is cancelled: ${x}`),f.delete(x);return}try{let O=await P_e(()=>sSt(w,e),a);y.info("job finished",{id:x,result:O}),P(null,O)}catch(O){P(O)}})},i),g=({job:w,id:x,persist:v=!0,delay:P,runAt:O,skipDuplicateCheck:D=!1,fromStore:q=!1})=>{let B=new YPe,I=(ae,de)=>{d.emit(ae,de),B.emit(ae,de)},j=se().unix();if(!w)throw new Error("Can not queue empty job");let K=q?w:aSt(w),X=u(x,K);if(P&&P>=RF()||O&&O>j){if(!c)throw new Error("Must set options.enableScheduledJob to true to run delay jobs");if(P&&P<RF())throw new Error(`minimum delay is ${RF()}s`);let ae={};return P&&(ae.delay=P,ae.will_run_at=Date.now()+P*1e3),O&&(ae.delay=1,ae.will_run_at=O*1e3),n.addJob(X,K,ae,D).then(()=>{I("queued",{id:X,job:K,attrs:ae,persist:v}),y.info("delayed or scheduled job queued",{id:X,job:K,attrs:ae,persist:v})}).catch(de=>{console.error(de)}),B.id=X,B}let Z=ae=>n.deleteJob(ae),ie=async(ae,de)=>{if(de===dY){await Z(X),I("cancelled",{id:X,job:K});return}if(!ae){await Z(X),I("finished",{id:X,job:K,result:de});return}y.error("job errored",{queue:t,id:X,job:K,result:de,error:ae});try{let me=await n.getJob(X);if(!me){I("failed",{id:X,job:K,error:ae});return}if(ae&&ae.nonRetryable===!0){y.info("fail job due to non-retryable error",{id:X,job:K,errorCode:ae.code}),await Z(X),I("failed",{id:X,job:K,error:ae});return}if(me.retry_count>=o){y.info("fail job on max retry exceed",{id:X,job:K}),await Z(X),I("failed",{id:X,job:K,error:ae});return}await n.updateJob(X,{retry_count:me.retry_count+1}),y.info("retry job",{id:X,count:me.retry_count+1}),setTimeout(()=>{I("retry",{id:X,job:K,doc:me}),h.unshift({id:X,job:K,persist:v},ie)},s)}catch(me){console.error(me),await Z(X),I("failed",{id:X,job:K,error:me})}},ue=()=>setImmediate(()=>{I("queued",{id:X,job:K,persist:v}),y.info("queue job",{id:X,job:K}),f.has(X)&&f.delete(X),h.push({id:X,job:K,persist:v},ie)}),Q=()=>{};if(ux()==="workerd"){let ae=new Promise(de=>{Q=de});B.on("finished",Q),B.on("failed",Q),B.on("cancelled",Q),sq(ae)}return v?n.addJob(X,K,{},D).then(ue).catch(ae=>{y.error("Can not add job to store",{error:ae}),Q()}):ue(),B.id=X,B},_=w=>new Promise((x,v)=>{try{(w.runAt||w.delay)&&console.warn("You may have to wait for a long time to get the result of the delayed job");let P=g(w);P.on("finished",O=>x(O)),P.on("cancelled",O=>x(O)),P.on("failed",O=>v(O))}catch(P){v(P)}}),b=async w=>{let x=await n.updateJob(w,{cancelled:!0});return f.add(w),x?x.job:null},E=async w=>{let x=await n.getJob(w);return x?x.job:null},A=async(w,x=!1)=>{if(!x&&!await E(w))return!1;try{return f.add(w),await n.deleteJob(w),y.info(`Job deleted successfully: ${w}`),!0}catch(v){try{await b(w)}catch(P){console.error(`Error during job cancellation fallback for ${w}:`,P)}return console.error(`Error during job deletion process for ${w}:`,v),!1}},R=async(w,x)=>await n.updateJob(w,x);ux()==="node"&&process.nextTick(async()=>{try{ia.isInitialized()||ia.initialize(Bc),(await n.getJobs()).forEach(x=>{if(x.job&&x.id)try{g({job:x.job,id:x.id,persist:!1,fromStore:!0})}catch(v){y.error("failed to re-queue stored job",{id:x.id,code:v?.code,message:v?.message})}else y.info("skip invalid job from db",{job:x})})}catch(w){console.error(w),y.error(`Can not load existing ${t} jobs`,{error:w})}});let C=async()=>{let w=0,x=0;if(c!==!0)return{dispatched:w,failed:x};let v=await n.getScheduledJobs();for(let P of v)if(P.job&&P.id){await b(P.id),y.info("reschedule delayed or scheduled job",{id:P.id,job:P.job});try{g({job:P.job,id:P.id,persist:!1,fromStore:!0}),w+=1}catch(O){x+=1,y.error("failed to reschedule stored job",{id:P.id,code:O?.code,message:O?.message})}}else y.info("skip invalid job from db",{job:P});return{dispatched:w,failed:x}},L=!1,T=null,$=null,U=w=>new Promise(x=>{$=x,T=setTimeout(()=>{T=null,$=null,x()},w)}),H=()=>{if(L=!0,T&&(clearTimeout(T),T=null),$){let w=$;$=null,w()}};(async()=>{if(c===!0&&ux()==="node")for(;!L;){if(await U(RF()*1e3/2),L||ux()!=="node")return;try{await C()}catch(w){console.error(w),y.error(`Can not load scheduled ${t} jobs`,{error:w})}}})();let k=Object.assign(d,{store:n,push:g,pushAndWait:_,drain:w=>h.drain=w,empty:w=>h.empty=w,saturated:w=>h.saturated=w,error:w=>h.error=w,get:E,delete:A,cancel:b,update:R,stop:H,options:{concurrency:i,maxRetries:o,maxTimeout:a,retryDelay:s,enableScheduledJob:c}});return iq({name:t,enableScheduledJob:c===!0,handle:k,redispatchDue:C,stop:H}),k}var dY,RF,ZPe,Pi=N(()=>{"use strict";VPe();a3();Zt();he();nt();fa();ke();pr();KPe();YA();LT();E0();dY="__CANCELLED__",RF=()=>Dm()?2:8;ZPe={concurrency:1,maxRetries:1,maxTimeout:1440*60*1e3,retryDelay:0,enableScheduledJob:!1}});var iNe=G((XNr,nNe)=>{"use strict";var OF,tr,eNe={'"':'"',"\\":"\\","/":"/",b:"\b",f:"\f",n:`
|
|
310
310
|
`,r:"\r",t:" "},lY;function N0(t){throw{name:"SyntaxError",message:t,at:OF,text:lY}}function tn(t){return t&&t!==tr&&N0("Expected '"+t+"' instead of '"+tr+"'"),tr=lY.charAt(OF),OF+=1,tr}function tNe(){var t,e="";for(tr==="-"&&(e="-",tn("-"));tr>="0"&&tr<="9";)e+=tr,tn();if(tr===".")for(e+=".";tn()&&tr>="0"&&tr<="9";)e+=tr;if(tr==="e"||tr==="E")for(e+=tr,tn(),(tr==="-"||tr==="+")&&(e+=tr,tn());tr>="0"&&tr<="9";)e+=tr,tn();return t=Number(e),isFinite(t)||N0("Bad number"),t}function rNe(){var t,e,r="",n;if(tr==='"')for(;tn();){if(tr==='"')return tn(),r;if(tr==="\\")if(tn(),tr==="u"){for(n=0,e=0;e<4&&(t=parseInt(tn(),16),!!isFinite(t));e+=1)n=n*16+t;r+=String.fromCharCode(n)}else if(typeof eNe[tr]=="string")r+=eNe[tr];else break;else r+=tr}N0("Bad string")}function Wy(){for(;tr&&tr<=" ";)tn()}function cSt(){switch(tr){case"t":return tn("t"),tn("r"),tn("u"),tn("e"),!0;case"f":return tn("f"),tn("a"),tn("l"),tn("s"),tn("e"),!1;case"n":return tn("n"),tn("u"),tn("l"),tn("l"),null;default:N0("Unexpected '"+tr+"'")}}function uSt(){var t=[];if(tr==="["){if(tn("["),Wy(),tr==="]")return tn("]"),t;for(;tr;){if(t.push(DF()),Wy(),tr==="]")return tn("]"),t;tn(","),Wy()}}N0("Bad array")}function dSt(){var t,e={};if(tr==="{"){if(tn("{"),Wy(),tr==="}")return tn("}"),e;for(;tr;){if(t=rNe(),Wy(),tn(":"),Object.prototype.hasOwnProperty.call(e,t)&&N0('Duplicate key "'+t+'"'),e[t]=DF(),Wy(),tr==="}")return tn("}"),e;tn(","),Wy()}}N0("Bad object")}function DF(){switch(Wy(),tr){case"{":return dSt();case"[":return uSt();case'"':return rNe();case"-":return tNe();default:return tr>="0"&&tr<="9"?tNe():cSt()}}nNe.exports=function(t,e){var r;return lY=t,OF=0,tr=" ",r=DF(),Wy(),tr&&N0("Syntax error"),typeof e=="function"?(function n(i,o){var a,s,c=i[o];if(c&&typeof c=="object")for(a in DF)Object.prototype.hasOwnProperty.call(c,a)&&(s=n(c,a),typeof s>"u"?delete c[a]:c[a]=s);return e.call(i,o,c)})({"":r},""):r}});var aNe=G((YNr,oNe)=>{"use strict";var pY=/[\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,od,BF,lSt={"\b":"\\b"," ":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},ww;function fY(t){return pY.lastIndex=0,pY.test(t)?'"'+t.replace(pY,function(e){var r=lSt[e];return typeof r=="string"?r:"\\u"+("0000"+e.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+t+'"'}function $F(t,e){var r,n,i,o,a=od,s,c=e[t];switch(c&&typeof c=="object"&&typeof c.toJSON=="function"&&(c=c.toJSON(t)),typeof ww=="function"&&(c=ww.call(e,t,c)),typeof c){case"string":return fY(c);case"number":return isFinite(c)?String(c):"null";case"boolean":case"null":return String(c);case"object":if(!c)return"null";if(od+=BF,s=[],Object.prototype.toString.apply(c)==="[object Array]"){for(o=c.length,r=0;r<o;r+=1)s[r]=$F(r,c)||"null";return i=s.length===0?"[]":od?`[
|
|
311
311
|
`+od+s.join(`,
|
|
312
312
|
`+od)+`
|
package/dist/index.js
CHANGED
|
@@ -16345,6 +16345,7 @@ async function ensureStakedForGas() {
|
|
|
16345
16345
|
logger_default.info(`app already staked for gas on chain ${host}`, { source: stakeResult.source });
|
|
16346
16346
|
continue;
|
|
16347
16347
|
}
|
|
16348
|
+
await client.getContext();
|
|
16348
16349
|
const result = await client.getForgeState({});
|
|
16349
16350
|
const { token, txConfig } = result.state;
|
|
16350
16351
|
const holding = (account?.tokens || []).find((x) => x.address === token.address);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@arcblock/payment-service",
|
|
3
|
-
"version": "1.29.
|
|
3
|
+
"version": "1.29.11",
|
|
4
4
|
"description": "Embedded payment service factory (W2) — side-effect-free core for arc / blocklet server / standalone worker hosts",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
"@blocklet/constant": "^1.17.13-beta-20260613-094425-b81920c8",
|
|
45
45
|
"@blocklet/error": "^0.3.5",
|
|
46
46
|
"@blocklet/logger": "^1.17.13-beta-20260613-094425-b81920c8",
|
|
47
|
-
"@blocklet/payment-vendor": "1.29.
|
|
47
|
+
"@blocklet/payment-vendor": "1.29.11",
|
|
48
48
|
"@blocklet/sdk": "^1.17.13-beta-20260613-094425-b81920c8",
|
|
49
49
|
"@blocklet/xss": "^0.15.4",
|
|
50
50
|
"@hono/node-server": "^2.0.4",
|
|
@@ -90,5 +90,5 @@
|
|
|
90
90
|
"ts-jest": "^29.1.2",
|
|
91
91
|
"typescript": "^5.4.3"
|
|
92
92
|
},
|
|
93
|
-
"gitHead": "
|
|
93
|
+
"gitHead": "775c2d6b9624e70d12a3872f46f7b2deb52591ba"
|
|
94
94
|
}
|