diff --git a/dist/governance/util/utils.d.ts b/dist/governance/util/utils.d.ts index 83375063..d49a3a0d 100644 --- a/dist/governance/util/utils.d.ts +++ b/dist/governance/util/utils.d.ts @@ -1,4 +1,3 @@ -export declare function intToBytes(num: number, length?: number): Uint8Array; export declare function areBuffersEqual(buf1: Uint8Array, buf2: Uint8Array): boolean; export declare function bytesToInt(buffer: Uint8Array): number; export declare function sum(values: number[]): number; diff --git a/dist/index.d.ts b/dist/index.d.ts index c1a780a0..52049117 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -3,7 +3,7 @@ export type { InitiatorSigner, SignerTransaction, SupportedNetwork } from "./uti export { BASE_MINIMUM_BALANCE, MINIMUM_ADD_LIQUIDITY_AMOUNT, MINIMUM_BALANCE_REQUIRED_PER_APP, MINIMUM_BALANCE_REQUIRED_PER_ASSET, MINIMUM_BALANCE_REQUIRED_PER_BYTE_SCHEMA, MINIMUM_BALANCE_REQUIRED_PER_INT_SCHEMA_VALUE } from "./util/constant"; export * from "./swap/v2/router"; export * from "./swap/common/utils"; -export { applySlippageToAmount, ASSET_OPT_IN_PROCESS_TXN_COUNT, convertFromBaseUnits, convertToBaseUnits, getTxnGroupID, sendAndWaitRawTransaction, sumUpTxnFees, joinByteArrays } from "./util/util"; +export { applySlippageToAmount, ASSET_OPT_IN_PROCESS_TXN_COUNT, convertFromBaseUnits, convertToBaseUnits, getTxnGroupID, sendAndWaitRawTransaction, sumUpTxnFees, joinByteArrays, intToBytes } from "./util/util"; export { generateOptIntoAssetTxns } from "./util/asset/assetUtils"; export type { AssetWithIdAndAmount, TinymanAnalyticsApiAsset } from "./util/asset/assetModels"; export { ALGO_ASSET, ALGO_ASSET_ID, POOL_TOKEN_UNIT_NAME } from "./util/asset/assetConstants"; @@ -48,7 +48,8 @@ export { TinymanTAlgoClient } from "./liquid-stake/tAlgoClient"; export { ProposalVote } from "./governance/proposal-voting/constants"; export { generateProposalMetadata } from "./governance/proposal-voting/transactions"; export type { GenerateProposalMetadataPayload } from "./governance/proposal-voting/types"; -export { intToBytes } from "./governance/util/utils"; export { AccountState } from "./governance/vault/storage"; export { getStartTimestampOfWeek } from "./governance/vault/utils"; export { calculateTinyPower, combineAndRegroupTxns, generateCidFromProposalMetadata } from "./governance/utils"; +export { OrderingClient } from "./order/index"; +export type { PutTriggerOrderParams, PutRecurringOrderParams, OrderType } from "./order/types"; diff --git a/dist/index.js b/dist/index.js index bb6b0591..ea15af02 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1 +1 @@ -"use strict";var e=require("algosdk"),t=require("base64-js"),n=require("crypto");function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t=0;--a){var s=this.tryEntries[a],o=s.completion;if("root"===s.tryLoc)return r("end");if(s.tryLoc<=this.prev){var i=n.call(s,"catchLoc"),u=n.call(s,"finallyLoc");if(i&&u){if(this.prev=0;--r){var a=this.tryEntries[r];if(a.tryLoc<=this.prev&&n.call(a,"finallyLoc")&&this.prev=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),k(n),d}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if("throw"===r.type){var a=r.arg;k(n)}return a}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,n){return this.delegate={iterator:P(e),resultName:t,nextLoc:n},"next"===this.method&&(this.arg=void 0),d}},e}function o(e,t,n,r,a,s,o){try{var i=e[s](o),u=i.value}catch(e){return void n(e)}i.done?t(u):Promise.resolve(u).then(r,a)}function i(e){return function(){var t=this,n=arguments;return new Promise((function(r,a){var s=e.apply(t,n);function i(e){o(s,r,a,i,u,"next",e)}function u(e){o(s,r,a,i,u,"throw",e)}i(void 0)}))}}function u(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function c(e,t){for(var n=0;ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var s,o=!0,i=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return o=e.done,e},e:function(e){i=!0,s=e},f:function(){try{o||null==n.return||n.return()}finally{if(i)throw s}}}}function b(e){var t=function(e,t){if("object"!=typeof e||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t||"default");if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:String(t)}var T=function(e){return e.SwapRouterStaleDataError="SwapRouterStaleDataError",e.SwapRouterNoRouteError="SwapRouterNoRouteError",e.SwapRouterLowSwapAmountError="SwapRouterLowSwapAmountError",e.SwapRouterInsufficientReservesError="SwapRouterInsufficientReservesError",e.SwapRouterPoolHasNoLiquidityError="SwapRouterPoolHasNoLiquidityError",e.NoAvailablePoolError="NoAvailablePoolError",e.OutputAmountExceedsAvailableLiquidityError="OutputAmountExceedsAvailableLiquidityError",e.UnknownError="UnknownError",e.LowSwapAmountError="LowSwapAmountError",e.AssetDoesNotBelongToPoolError="AssetDoesNotBelongToPoolError",e.InvalidSwapTypeError="InvalidSwapTypeError",e}({}),k=function(e){function t(e,n){var r,a,s,o;return u(this,t),a=this,o=[n],s=f(s=t),(r=x(a,function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){return!1}}()?Reflect.construct(s,o||[],f(a).constructor):s.apply(a,o))).type=e,r.message=n,Error.captureStackTrace&&Error.captureStackTrace(r,t),r}return d(t,g(Error)),p(t)}(),S=Uint8Array.from([1]),P=100000n,_=100000n,E=100000n,D=50000n,N=28500n,O=1000n,B=1e3,C={mainnet:{base:"https://mainnet.analytics.tinyman.org/api",v1:"https://mainnet.analytics.tinyman.org/api/v1"},testnet:{base:"https://testnet.analytics.tinyman.org/api",v1:"https://testnet.analytics.tinyman.org/api/v1"}};var F="- would result negative",L="logic eval error:",R="exceeds schema integer count",M=/transaction \w+:/,U=function(e){function t(e,n){var r;u(this,t);for(var a=arguments.length,s=new Array(a>2?a-2:0),o=2;o1||t<0)throw new Error("Invalid slippage value. Must be between 0 and 1, got ".concat(t));var r;try{var a="negative"===e?1-t:1+t;r=BigInt(Math.floor(Number(n)*a))}catch(e){throw new Error(e.message)}return r}function W(e,t){var n=Number(e);return z({decimalPlaces:n},Math.pow(10,-n)*Number(t))}function z(e,t){var n=e.decimalPlaces,r=void 0===n?0:n;if(r>0){var a=A(K(t),2),s=a[0],o=a[1],i=A(K(Math.round(Number(J(s,o+r)))),2),u=i[0],c=i[1];return Number(J(u,c-r))}return Math.round(t)}function J(e,t){return e+(t<0?"e".concat(t):"e+".concat(t))}function K(e){if(e.toString().includes("e")){var t=e.toString().split("e");return[parseFloat(t[0]),parseFloat(t[1])]}return[e,0]}function Y(e,t){return H.apply(this,arguments)}function H(){return(H=i(s().mark((function e(t,n){var r,a,o,i,u,c,p,l;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:e.prev=0,r=[],a=y(n),e.prev=3,a.s();case 5:if((o=a.n()).done){e.next=18;break}return i=o.value,e.next=9,t.sendRawTransaction(i).do();case 9:return u=e.sent,c=u.txid,e.next=13,Q(t,c);case 13:p=e.sent,l=Number(p.confirmedRound),r.push({confirmedRound:l,txnID:c});case 16:e.next=5;break;case 18:e.next=23;break;case 20:e.prev=20,e.t0=e.catch(3),a.e(e.t0);case 23:return e.prev=23,a.f(),e.finish(23);case 26:return e.abrupt("return",r);case 29:throw e.prev=29,e.t1=e.catch(0),new U(e.t1,"We encountered an error while processing this transaction. Try again later.");case 32:case"end":return e.stop()}}),e,null,[[0,29],[3,20,23,26]])})))).apply(this,arguments)}function $(e){return e.reduce((function(e,t){return e+Number(t.txn.fee)}),0)}function Z(e){var t,n;return(n=null===(t=e[0].txn.group)||void 0===t?void 0:t.buffer)?Buffer.from(n).toString("base64"):""}function ee(e){for(var t=[];;){var n=Number(e&BigInt(127));if(!(e>>=BigInt(7))){t.push(n);break}t.push(128|n)}return t}function te(e){return(new TextEncoder).encode(e)}var ne=function(e){return e.FixedInput="fixed-input",e.FixedOutput="fixed-output",e}({}),re=.003,ae={V1_1:"v1_1",V2:"v2"},se=new(function(){return p((function e(){u(this,e),this.clientName="tinyman-js-sdk"}),[{key:"getClientName",value:function(){return this.clientName}},{key:"setClientName",value:function(e){this.clientName=e}},{key:"getAppCallTxnNoteWithClientName",value:function(e,t){var n=e===ae.V1_1?"v1":e,r=JSON.stringify(a({origin:this.clientName},t));return te("tinyman/".concat(n,":j").concat(r))}}])}());function oe(e){return ie.apply(this,arguments)}function ie(){return(ie=i(s().mark((function t(n){var r,a,o,i,u,c;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(r=n.initiatorAddr,a=n.client,(o=n.route).transactions&&o.transaction_fee){t.next=3;break}return t.abrupt("return",[]);case 3:return t.next=5,a.getTransactionParams().do();case 5:return i=t.sent,u=[],o.transactions.forEach((function(e){u.push(ue(e,i,r))})),u[0].fee=BigInt(o.transaction_fee),c=e.assignGroupID(u),t.abrupt("return",c.map((function(e){return{txn:e,signers:[r]}})));case 11:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function ue(n,r,a){var s;switch(n.type){case e.TransactionType.pay:return(s=e.makePaymentTxnWithSuggestedParamsFromObject({sender:a,receiver:n.receiver,amount:n.amount,suggestedParams:r})).fee=0n,s;case e.TransactionType.axfer:return(s=e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:a,receiver:n.receiver,amount:n.amount,assetIndex:n.asset_id,suggestedParams:r})).fee=0n,s;case e.TransactionType.appl:var o,i=null===(o=n.args)||void 0===o?void 0:o.map(t.toByteArray),u=n.args&&"swap"===Buffer.from(n.args[0],"base64").toString("utf8");return(s=e.makeApplicationNoOpTxnFromObject({sender:a,appIndex:n.app_id,appArgs:i,accounts:n.accounts,foreignApps:n.apps,foreignAssets:n.assets,suggestedParams:r,note:u?se.getAppCallTxnNoteWithClientName(ae.V2):void 0})).fee=0n,s;default:throw new Error("Unknown transaction type: ".concat(n.type))}}function ce(e){return pe.apply(this,arguments)}function pe(){return(pe=i(s().mark((function e(t){var n,r,a,o,i,u,c,p,l,d,f,m;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return o=t.amount,i=t.assetInID,u=t.assetOutID,c=t.swapType,p=t.network,l=t.slippage,d={asset_in_id:String(i),asset_out_id:String(u),swap_type:c,input_amount:c===ne.FixedInput?String(o):void 0,output_amount:c===ne.FixedOutput?String(o):void 0,slippage:l},e.next=4,fetch("".concat(C[p].v1,"/swap-router/quotes-v2/"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(d)}).catch((function(){throw new Error("Network error")}));case 4:return f=e.sent,e.next=7,f.json();case 7:if(m=e.sent,f.ok){e.next=14;break}if(s=m,!Boolean(s)||void 0===s.fallback_message){e.next=13;break}throw new k(m.type,m.fallback_message);case 13:throw new k(T.UnknownError,"There was an error while getting a quote from Swap Router");case 14:if(null!==(n=m.transactions)&&void 0!==n&&n.length){e.next=16;break}throw new k(T.SwapRouterNoRouteError,"Swap router couldn't find a route for this swap.");case 16:if(!(Number(m.asset_in.id)!==i||Number(m.asset_out.id)!==u||m.swap_type===ne.FixedInput?BigInt(o)!==BigInt(null!==(r=m.input_amount)&&void 0!==r?r:0):BigInt(o)!==BigInt(null!==(a=m.output_amount)&&void 0!==a?a:0))){e.next=18;break}throw new k(T.UnknownError,"Swap router quote doesn't match the requested swap. Please try again.");case 18:return e.abrupt("return",m);case 19:case"end":return e.stop()}var s}),e)})))).apply(this,arguments)}var le={testnet:184778019,mainnet:1083651166};function de(e){var t=he(e),n=t.assetIn,r=t.assetOut;return W(r.asset.decimals,Number(r.amount))/W(n.asset.decimals,Number(n.amount))}function fe(e){var t;return{asset:e.asset_out,amount:BigInt(null!==(t=e.output_amount)&&void 0!==t?t:0)}}function me(e){var t;return{asset:e.asset_in,amount:BigInt(null!==(t=e.input_amount)&&void 0!==t?t:0)}}function he(e){return{assetIn:me(e),assetOut:fe(e)}}l(l({},ne.FixedInput,7),ne.FixedOutput,8);var ge=0,xe={id:"".concat(ge),name:"Algorand",unit_name:"ALGO",decimals:6,url:"https://algorand.org",is_liquidity_token:!1,total_amount:"6615503326932151",clawback_address:""},Ae={V1:"TM1POOL",V1_1:"TMPOOL11",V2:"TMPOOL2"},ve={testnet:258703304,mainnet:22e8},Ie={testnet:724519992,mainnet:2537013734},we={testnet:724676936,mainnet:2537023208};function ye(e){return be.apply(this,arguments)}function be(){return(be=i(s().mark((function t(n){var r,a,o,i,u;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.client,a=n.assetID,o=n.initiatorAddr,t.prev=1,t.next=4,r.getTransactionParams().do();case 4:return i=t.sent,u=e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:o,receiver:o,assetIndex:a,amount:0,suggestedParams:i}),t.abrupt("return",[{txn:u,signers:[o]}]);case 9:throw t.prev=9,t.t0=t.catch(1),new U(t.t0,"We encountered something unexpected while opting into this asset. Try again later.");case 12:case"end":return t.stop()}}),t,null,[[1,9]])})))).apply(this,arguments)}function Te(e,t){var n=Number(e.id),r=Number(t.id);return n>r?[a(a({},e),{},{id:n}),a(a({},t),{},{id:r})]:[a(a({},t),{},{id:r}),a(a({},e),{},{id:n})]}function ke(e,t){var n=[e,t];return[Math.max.apply(Math,n),Math.min.apply(Math,n)]}function Se(e){return Number(e)===ge}function Pe(e){return Number(e.id)}var _e=function(e){return e.Direct="direct",e.Router="router",e}({}),Ee=4;var De=function(e){return e[e.INPUT_TXN=0]="INPUT_TXN",e[e.APP_CALL_TXN=1]="APP_CALL_TXN",e}({}),Ne=l(l({},ne.FixedInput,1),ne.FixedOutput,2),Oe=2,Be=te("swap"),Ce=l(l({},ne.FixedInput,te("fixed-input")),ne.FixedOutput,te("fixed-output"));function Fe(e,t){return BigInt(Ne[e]+Oe)*t}function Le(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:re;return Math.ceil(1/e)}function Re(e){return e1&&void 0!==arguments[1]?arguments[1]:re)}function Me(e,t){return BigInt(Ne[e]+1)*t}function Ue(e){var t=e.assetIn,n=e.assetOut;return W(n.decimals,Number(n.amount))/W(t.decimals,Number(t.amount))}function je(e){var t=e.inputSupply,n=e.outputSupply,r=e.assetIn,a=e.assetOut,s=Ue({assetIn:r,assetOut:a}),o=W(a.decimals,Number(n))/W(r.decimals,Number(t));return z({decimalPlaces:5},Math.abs(s/o-1))}function Ve(e){if(e.type===_e.Router){var t=me(e.data);return{id:Pe(t.asset),amount:t.amount}}return{id:e.data.quote.assetInID,amount:e.data.quote.assetInAmount}}function Ge(e){if(e.type===_e.Router){var t=fe(e.data);return{id:Pe(t.asset),amount:t.amount}}return{id:e.data.quote.assetOutID,amount:e.data.quote.assetOutAmount}}function Qe(e){return e.type===_e.Direct?e.data.pool.contractVersion:ae.V2}function qe(e){return e.type===_e.Direct?e.data.quote.rate:de(e.data)}function Xe(e){for(var t=e[0],n=qe(t),r=1;rn&&(t=a,n=s)}return t}function We(e){return e instanceof k&&[T.SwapRouterInsufficientReservesError,T.SwapRouterLowSwapAmountError,T.OutputAmountExceedsAvailableLiquidityError,T.LowSwapAmountError].includes(e.type)}te("asset_opt_in");var ze={type:"logicsig",logic:{bytecode:"BCAIAQCBgICAgICAgPABgICAgICAgIDwAQMEBQYlJA1EMQkyAxJEMRUyAxJEMSAyAxJEMgQiDUQzAQAxABJEMwEQIQcSRDMBGIGCgICAgICAgPABEkQzARkiEjMBGyEEEhA3ARoAgAlib290c3RyYXASEEAAXDMBGSMSRDMBG4ECEjcBGgCABHN3YXASEEACOzMBGyISRDcBGgCABG1pbnQSQAE7NwEaAIAEYnVybhJAAZg3ARoAgAZyZWRlZW0SQAJbNwEaAIAEZmVlcxJAAnkAIQYhBSQjEk0yBBJENwEaARclEjcBGgIXJBIQRDMCADEAEkQzAhAhBBJEMwIhIxJEMwIiIxwSRDMCIyEHEkQzAiQjEkQzAiWACFRNUE9PTDExEkQzAiZRAA+AD1RpbnltYW5Qb29sMS4xIBJEMwIngBNodHRwczovL3RpbnltYW4ub3JnEkQzAikyAxJEMwIqMgMSRDMCKzIDEkQzAiwyAxJEMwMAMQASRDMDECEFEkQzAxElEkQzAxQxABJEMwMSIxJEJCMTQAAQMwEBMwIBCDMDAQg1AUIBsTMEADEAEkQzBBAhBRJEMwQRJBJEMwQUMQASRDMEEiMSRDMBATMCAQgzAwEIMwQBCDUBQgF8MgQhBhJENwEcATEAE0Q3ARwBMwQUEkQzAgAxABNEMwIUMQASRDMDADMCABJEMwIRJRJEMwMUMwMHMwMQIhJNMQASRDMDESMzAxAiEk0kEkQzBAAxABJEMwQUMwIAEkQzAQEzBAEINQFCAREyBCEGEkQ3ARwBMQATRDcBHAEzAhQSRDMDFDMDBzMDECISTTcBHAESRDMCADEAEkQzAhQzBAASRDMCESUSRDMDADEAEkQzAxQzAwczAxAiEk0zBAASRDMDESMzAxAiEk0kEkQzBAAxABNEMwQUMQASRDMBATMCAQgzAwEINQFCAJAyBCEFEkQ3ARwBMQATRDMCADcBHAESRDMCADEAE0QzAwAxABJEMwIUMwIHMwIQIhJNMQASRDMDFDMDBzMDECISTTMCABJEMwEBMwMBCDUBQgA+MgQhBBJENwEcATEAE0QzAhQzAgczAhAiEk03ARwBEkQzAQEzAgEINQFCABIyBCEEEkQzAQEzAgEINQFCAAAzAAAxABNEMwAHMQASRDMACDQBD0M=",address:"ABUKAXTANWR6K6ZYV75DWJEPVWWOU6SFUVRI6QHO44E4SIDLHBTD2CZ64A",size:881,variables:[{name:"TMPL_ASSET_ID_1",type:"int",index:15,length:10},{name:"TMPL_ASSET_ID_2",type:"int",index:5,length:10},{name:"TMPL_VALIDATOR_APP_ID",type:"int",index:74,length:10}],source:"https://github.com/tinymanorg/tinyman-contracts-v1/tree/dc9ab40c58b85c15d58f63a1507e18be76720dbb/contracts/pool_logicsig.teal.tmpl"},name:"pool_logicsig"},Je={type:"app",global_state_schema:{num_uints:0,num_byte_slices:0},local_state_schema:{num_uints:16,num_byte_slices:0},name:"validator_app"},Ke=l(l({},ae.V1_1,{testnet:62368684,mainnet:552635992}),ae.V2,{testnet:148607e3,mainnet:1002541853});function Ye(e,t){var n=Ke[t][e];if(!n)throw new Error("No Validator App exists for ".concat(e," network with ").concat(t," contract version"));return n}function He(){return(He=i(s().mark((function t(n){var r,a,o,i,u,c;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.client,a=n.network,o=n.contractVersion,i=n.initiatorAddr,t.next=3,r.getTransactionParams().do();case 3:return u=t.sent,c=e.makeApplicationOptInTxnFromObject({sender:i,appIndex:Ye(a,o),note:se.getAppCallTxnNoteWithClientName(o),suggestedParams:u}),t.abrupt("return",[{txn:c,signers:[i]}]);case 6:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function $e(){return($e=i(s().mark((function t(n){var r,a,o,i,u,c;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.client,a=n.network,o=n.contractVersion,i=n.initiatorAddr,t.next=3,r.getTransactionParams().do();case 3:return u=t.sent,c=e.makeApplicationClearStateTxnFromObject({sender:i,appIndex:Ye(a,o),note:se.getAppCallTxnNoteWithClientName(o),suggestedParams:u}),t.abrupt("return",[{txn:c,signers:[i]}]);case 6:case"end":return t.stop()}}),t)})))).apply(this,arguments)}var Ze=p((function e(t){u(this,e),this.schema={numLocalInts:t.local_state_schema.num_uints,numLocalByteSlices:t.local_state_schema.num_byte_slices,numGlobalInts:t.global_state_schema.num_uints,numGlobalByteSlices:t.global_state_schema.num_byte_slices}}));var et=function(n){function r(e,t){var n,a,s,o;return u(this,r),a=this,o=[e],s=f(s=r),(n=x(a,function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){return!1}}()?Reflect.construct(s,o||[],f(a).constructor):s.apply(a,o))).poolLogicSigContractTemplate=t.logic.bytecode,n.templateVariables=t.logic.variables,n}return d(r,Ze),p(r,[{key:"generateLogicSigAccountForPool",value:function(n){if(n.asset1ID===n.asset2ID)throw new Error("Assets are the same");var r=Ye(n.network,ae.V1_1),a=A(ke(n.asset1ID,n.asset2ID),2),s=a[0],o=a[1],i=Array.from(t.toByteArray(this.poolLogicSigContractTemplate)),u={asset_id_1:s,asset_id_2:o,validator_app_id:r},c=0;this.templateVariables.sort((function(e,t){return e.index-t.index}));for(var p=0;pht)){n.next=52;break}throw new Error("Issued liquidity value is out of the expected range ([0n, ".concat(ht,"]): ").concat(O.issuedLiquidity));case 52:return n.abrupt("return",O);case 53:case"end":return n.stop()}}),n,null,[[12,35,38,41]])})))).apply(this,arguments)}function vt(){return vt=i(s().mark((function e(t){var n,r,a,o,i,u,c,p,l,d=arguments;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=t.client,r=t.address,a=t.network,!(o=d.length>1&&void 0!==d[1]?d[1]:{})[r]){e.next=4;break}return e.abrupt("return",o[r]);case 4:return e.next=6,n.accountInformation(r).do();case 6:return i=e.sent,u=ot(i,Ye(a,ae.V1_1)),c=null,u&&(l=i.createdAssets[0],p=Number(l.index),c={asset1ID:Number(u[dt[ae.V1_1].asset1]),asset2ID:Number(u[dt[ae.V1_1].asset2]),poolTokenID:p},o[r]=c),e.abrupt("return",c);case 11:case"end":return e.stop()}}),e)}))),vt.apply(this,arguments)}var It=Object.freeze({__proto__:null,getPoolAssets:function(e){return vt.apply(this,arguments)},getPoolInfo:gt,getPoolReserves:function(e,t){return At.apply(this,arguments)}});function wt(e){return yt.apply(this,arguments)}function yt(){return(yt=i(s().mark((function e(t){var n,r,a,o,i,u,c,p,l,d,f,m;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.client,r=t.network,a=t.asset1ID,o=t.asset2ID,i=st(ae.V2),u=i.generateLogicSigAccountForPool(t),c=Ye(r,ae.V2),p=u.address(),l=ke(a,o),e.next=8,n.accountInformation(p).do();case 8:return d=e.sent,f=ot(d,c),m={account:u,validatorAppID:c,asset1ID:l[0],asset2ID:l[1],status:f?lt.READY:lt.NOT_CREATED,contractVersion:ae.V2},f&&(m.asset1ProtocolFees=BigInt(f[dt.v2.asset1ProtocolFees]),m.asset2ProtocolFees=BigInt(f[dt.v2.asset2ProtocolFees]),m.asset1Reserves=BigInt(f[dt.v2.asset1Reserves]),m.asset2Reserves=BigInt(f[dt.v2.asset2Reserves]),m.issuedPoolTokens=BigInt(f[dt.v2.issuedPoolTokens]),m.cumulativePriceUpdateTimeStamp=Number(f[dt.v2.cumulativePriceUpdateTimeStamp]),m.protocolFeeRatio=Number(f[dt.v2.protocolFeeRatio]),m.totalFeeShare=BigInt(f[dt.v2.totalFeeShare]),m.poolTokenID=Number(f[dt.v2.poolTokenID]),m.asset1ID=Number(f[dt.v2.asset1]),m.asset2ID=Number(f[dt.v2.asset2])),e.abrupt("return",m);case 13:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function bt(){return(bt=i(s().mark((function e(t,n){var r,a,o;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t.accountInformation(n.account.address()).do();case 2:return r=e.sent,a=ot(r,n.validatorAppID),o={asset1:0n,asset2:0n,issuedLiquidity:0n,round:r.round},a&&(o.asset1=BigInt(a[dt.v2.asset1Reserves]),o.asset2=BigInt(a[dt.v2.asset2Reserves]),o.issuedLiquidity=BigInt(a[dt.v2.issuedPoolTokens])),e.abrupt("return",o);case 7:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Tt(){return(Tt=i(s().mark((function e(t){var n,r,a,o,i,u;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.client,r=t.address,a=t.network,e.next=3,n.accountInformation(r).do();case 3:return o=e.sent,i=ot(o,Ye(a,ae.V2)),u=null,i&&(u={asset1ID:i[dt[ae.V2].asset1],asset2ID:i[dt[ae.V2].asset2],poolTokenID:i[dt[ae.V2].poolTokenID]}),e.abrupt("return",u);case 8:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var kt=Object.freeze({__proto__:null,getPoolAssets:function(e){return Tt.apply(this,arguments)},getPoolInfo:wt,getPoolReserves:function(e,t){return bt.apply(this,arguments)}});function St(e){return Boolean(e&&!(e.asset1+e.asset2))}var Pt=Object.freeze({__proto__:null,getPoolPairRatio:function(e){var t=St(e),n=null;return e&&!t&&e.asset1&&e.asset2&&(n=Number(e.asset1)/Number(e.asset2)),n},getPoolShare:function(e,t){var n=Number(t)/Number(e);return Number.isFinite(n)||(n=0),n},getPoolsForPair:function(e){return Promise.all([gt(e),wt(e)])},isPoolEmpty:St,isPoolNotCreated:function(e){return(null==e?void 0:e.status)===lt.NOT_CREATED},isPoolReady:function(e){return(null==e?void 0:e.status)===lt.READY}}),_t=a(l(l({},ae.V1_1,a(a({},It),Pt)),ae.V2,a(a({},kt),Pt)),Pt),Et=function(e){return e[e.FUNDING_TXN=0]="FUNDING_TXN",e[e.VALIDATOR_APP_CALL=1]="VALIDATOR_APP_CALL",e[e.POOL_TOKEN_CREATE=2]="POOL_TOKEN_CREATE",e[e.ASSET1_OPT_IN=3]="ASSET1_OPT_IN",e[e.ASSET2_OPT_IN=4]="ASSET2_OPT_IN",e}({}),Dt={ASA_ALGO:960000n,ASA_ASA:859000n};function Nt(){return(Nt=i(s().mark((function t(n){var r,a,o,i,u,c,p,l,d,f,m,h,g,x,v,I,w,y,b,T,k,S,P,_,E;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.client,a=n.network,o=n.asset_1,i=n.asset_2,u=n.initiatorAddr,t.next=3,r.getTransactionParams().do();case 3:return c=t.sent,p=Te(o,i),l=A(p,2),d=l[0],f=d.id,m=d.unit_name,h=l[1],g=h.id,x=h.unit_name,v=Se(g),I=Ye(a,ae.V1_1),w=tt.generateLogicSigAccountForPool({network:a,asset1ID:f,asset2ID:g}),y=w.address(),b=e.makeApplicationOptInTxnFromObject({sender:y,appIndex:I,note:se.getAppCallTxnNoteWithClientName(ae.V1_1),appArgs:[te("bootstrap"),e.encodeUint64(f),e.encodeUint64(g)],foreignAssets:v?[f]:[g],suggestedParams:c}),T=e.makeAssetCreateTxnWithSuggestedParamsFromObject({sender:y,total:0xffffffffffffffffn,decimals:6,defaultFrozen:!1,unitName:Ae.V1_1,assetName:"TinymanPool1.1 ".concat(m,"-").concat(x),assetURL:"https://tinyman.org",suggestedParams:c}),k=e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:y,receiver:y,assetIndex:f,amount:0,suggestedParams:c}),S=e.makePaymentTxnWithSuggestedParamsFromObject({sender:u,receiver:y,amount:Ot(v),suggestedParams:c}),(P=[])[Et.FUNDING_TXN]=S,P[Et.VALIDATOR_APP_CALL]=b,P[Et.POOL_TOKEN_CREATE]=T,P[Et.ASSET1_OPT_IN]=k,v||(P[Et.ASSET2_OPT_IN]=e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:y,receiver:y,assetIndex:g,amount:0,suggestedParams:c})),_=e.assignGroupID(P),E=[{txn:_[Et.FUNDING_TXN],signers:[u]},{txn:_[Et.VALIDATOR_APP_CALL],signers:[y.toString()]},{txn:_[Et.POOL_TOKEN_CREATE],signers:[y.toString()]},{txn:_[Et.ASSET1_OPT_IN],signers:[y.toString()]}],_[Et.ASSET2_OPT_IN]&&E.push({txn:_[Et.ASSET2_OPT_IN],signers:[y.toString()]}),t.abrupt("return",E);case 23:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function Ot(e){return e?Dt.ASA_ALGO:Dt.ASA_ASA}function Bt(){return(Bt=i(s().mark((function t(n){var r,a,o,i,u,c,p,l,d,f,m,h,g,x,v;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.txGroup,a=n.network,o=n.initiatorSigner,i=n.asset1ID,u=n.asset2ID,t.next=3,o([r]);case 3:return c=t.sent,p=A(c,1),l=p[0],d=ke(i,u),f=A(d,2),m=f[0],h=f[1],g=tt.generateLogicSigAccountForPool({network:a,asset1ID:m,asset2ID:h}),x=[],v=r.map((function(t,n){if(n===Et.FUNDING_TXN)return x.push(t.txn.txID().toString()),l;var r=e.signLogicSigTransactionObject(t.txn,g),a=r.txID,s=r.blob;return x.push(a),s})),t.abrupt("return",{signedTxns:v,txnIDs:x});case 11:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function Ct(e){return Ft.apply(this,arguments)}function Ft(){return(Ft=i(s().mark((function e(t){var n,r,a,o,i;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.client,r=t.signedTxns,a=t.txnIDs,e.prev=1,e.next=4,n.sendRawTransaction(r).do();case 4:return e.next=6,Q(n,a[Et.POOL_TOKEN_CREATE]);case 6:if(o=e.sent,"bigint"==typeof(i=o.assetIndex)){e.next=10;break}throw new Error("Generated ID is not valid: got ".concat(i));case 10:return e.abrupt("return",{poolTokenID:i});case 13:throw e.prev=13,e.t0=e.catch(1),new U(e.t0,"We encountered something unexpected while bootstraping the pool. Try again later.");case 16:case"end":return e.stop()}}),e,null,[[1,13]])})))).apply(this,arguments)}function Lt(){return(Lt=i(s().mark((function e(t){var n,r,a,o,i,u,c;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.client,r=t.network,a=t.pool,o=a.asset1ID,i=a.asset2ID,u=t.signedTxns,c=t.txnIDs,e.next=3,Ct({client:n,signedTxns:u,txnIDs:c});case 3:return e.abrupt("return",_t.v1_1.getPoolInfo({client:n,network:r,asset1ID:o,asset2ID:i}));case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var Rt={generateTxns:function(e){return Nt.apply(this,arguments)},signTxns:function(e){return Bt.apply(this,arguments)},execute:function(e){return Lt.apply(this,arguments)},getBootstrapFundingTxnAmount:Ot};var Mt=function(e){return e[e.FUNDING_TXN=0]="FUNDING_TXN",e[e.VALIDATOR_APP_CALL=1]="VALIDATOR_APP_CALL",e}({}),Ut={ASA_ALGO:5,ASA_ASA:6};function jt(e,t){return Vt.apply(this,arguments)}function Vt(){return(Vt=i(s().mark((function t(n,r){var a,o,i;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(!(o=null===(a=r.find((function(t){return t.txn.type===e.TransactionType.appl})))||void 0===a?void 0:a.txn.txID())){t.next=7;break}return t.next=4,e.waitForConfirmation(n,o,B);case 4:t.t0=t.sent,t.next=8;break;case 7:t.t0=void 0;case 8:return i=t.t0,t.abrupt("return",i);case 10:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function Gt(e,t){return Qt.apply(this,arguments)}function Qt(){return(Qt=i(s().mark((function e(t,n){var r;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,jt(t,n);case 2:return r=e.sent,e.abrupt("return",null==r?void 0:r.innerTxns);case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function qt(e,t){return Xt.apply(this,arguments)}function Xt(){return(Xt=i(s().mark((function t(n,r){var a,o;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,Gt(n,r);case 2:return a=t.sent,o=r[0].txn.sender.toString(),t.abrupt("return",null==a?void 0:a.reduce((function(t,n){var r,a,s=t,i=n.txn.txn;i.type===e.TransactionType.axfer&&i.assetTransfer&&i.assetTransfer.receiver.toString()===o?s.push({id:Number(i.assetTransfer.assetIndex),amount:null===(a=i.assetTransfer)||void 0===a?void 0:a.amount}):i.type===e.TransactionType.pay&&(null===(r=i.payment)||void 0===r?void 0:r.receiver.toString())===o&&s.push({id:ge,amount:i.payment.amount});return s}),[]));case 5:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function Wt(){return(Wt=i(s().mark((function t(n){var r,a,o,i,u,c,p,l,d,f,m,h,g,x,v,I,w,y,b,T;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.client,a=n.network,o=n.asset_1,i=n.asset_2,u=n.initiatorAddr,t.next=3,r.getTransactionParams().do();case 3:return c=t.sent,p=Ye(a,ae.V2),l=e.getApplicationAddress(p),d=Te(o,i),f=A(d,2),m=f[0].id,h=f[1].id,t.next=9,_t.v2.getPoolInfo({client:r,network:a,asset1ID:m,asset2ID:h});case 9:if(t.sent.status!==lt.READY){t.next=12;break}throw new Error("Pool for ".concat(o.unit_name,"-").concat(i.unit_name," already exists"));case 12:return g=at.generateLogicSigAccountForPool({network:a,asset1ID:m,asset2ID:h}),x=g.address(),v=Se(h),(I=e.makeApplicationOptInTxnFromObject({sender:x,appIndex:p,appArgs:[te("bootstrap")],note:se.getAppCallTxnNoteWithClientName(ae.V2),foreignAssets:[m,h],rekeyTo:l,suggestedParams:c})).fee=Jt(v,c.minFee),w=e.makePaymentTxnWithSuggestedParamsFromObject({sender:u,receiver:x,amount:zt(v,c.minFee),suggestedParams:c}),(y=[])[Mt.FUNDING_TXN]=w,y[Mt.VALIDATOR_APP_CALL]=I,b=e.assignGroupID(y),(T=[])[Mt.FUNDING_TXN]={txn:b[Mt.FUNDING_TXN],signers:[u]},T[Mt.VALIDATOR_APP_CALL]={txn:b[Mt.VALIDATOR_APP_CALL],signers:[x.toString()]},t.abrupt("return",T);case 26:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function zt(e,t){return function(e,t){var n=st(e).schema,r=n.numLocalInts,a=n.numLocalByteSlices,s=P+_+_+E+N*BigInt(r)+D*BigInt(a);return t||(s+=_),s}(ae.V2,e)+Jt(e,t)+_}function Jt(e,t){var n=e?Ut.ASA_ALGO:Ut.ASA_ASA;return BigInt(n+1)*t}function Kt(){return(Kt=i(s().mark((function t(n){var r,a,o,i,u,c,p,l,d,f,m,h,g,x,v;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.txGroup,a=n.network,o=n.initiatorSigner,i=n.asset1ID,u=n.asset2ID,t.next=3,o([r]);case 3:return c=t.sent,p=A(c,1),l=p[0],d=ke(i,u),f=A(d,2),m=f[0],h=f[1],g=at.generateLogicSigAccountForPool({network:a,asset1ID:m,asset2ID:h}),x=[],v=r.map((function(t,n){if(n===Mt.FUNDING_TXN)return x.push(t.txn.txID().toString()),l;var r=e.signLogicSigTransactionObject(t.txn,g),a=r.txID,s=r.blob;return x.push(a),s})),t.abrupt("return",{signedTxns:v,txnIDs:x});case 11:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function Yt(){return(Yt=i(s().mark((function t(n){var r,a,o,i,u,c,p,l,d,f,m;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.client,a=n.network,o=n.pool,i=o.asset1ID,u=o.asset2ID,c=n.txGroup,p=n.signedTxns,t.prev=1,t.next=4,r.sendRawTransaction(p).do();case 4:return t.next=6,jt(r,c);case 6:if(t.t5=f=t.sent,t.t4=null===t.t5,t.t4){t.next=10;break}t.t4=void 0===f;case 10:if(!t.t4){t.next=14;break}t.t6=void 0,t.next=15;break;case 14:t.t6=f.localStateDelta;case 15:if(t.t7=d=t.t6,t.t3=null!==t.t7,!t.t3){t.next=19;break}t.t3=void 0!==d;case 19:if(!t.t3){t.next=23;break}t.t8=d,t.next=24;break;case 23:t.t8=[];case 24:if(t.t9=l=t.t8[0],t.t2=null===t.t9,t.t2){t.next=28;break}t.t2=void 0===l;case 28:if(t.t1=t.t2,t.t1){t.next=31;break}t.t1=null===(l=l.delta)||void 0===l;case 31:if(t.t0=t.t1,t.t0){t.next=34;break}t.t0=null===(l=l.find((function(t){return t.key===e.bytesToBase64(te(dt.v2.poolTokenID))})))||void 0===l;case 34:if(!t.t0){t.next=38;break}t.t10=void 0,t.next=39;break;case 38:t.t10=l.value.uint;case 39:if("bigint"==typeof(m=t.t10)){t.next=42;break}throw new Error("Generated ID is not valid: got ".concat(m));case 42:return t.abrupt("return",_t.v2.getPoolInfo({client:r,network:a,asset1ID:i,asset2ID:u}));case 45:throw t.prev=45,t.t11=t.catch(1),new U(t.t11,"We encountered something unexpected while bootstraping the pool. Try again later.");case 48:case"end":return t.stop()}}),t,null,[[1,45]])})))).apply(this,arguments)}var Ht={generateTxns:function(e){return Wt.apply(this,arguments)},signTxns:function(e){return Kt.apply(this,arguments)},execute:function(e){return Yt.apply(this,arguments)},getBootstrapFundingTxnAmount:zt,getTotalCost:function(e,t){return t+zt(e,t)}};var $t=l(l(l(l(l(l({},ae.V1_1,Rt),ae.V2,Ht),"generateTxns",(function(e){return e.contractVersion===ae.V1_1?Rt.generateTxns(e):Ht.generateTxns(e)})),"signTxns",(function(e){return e.contractVersion===ae.V1_1?Rt.signTxns(e):Ht.signTxns(e)})),"execute",(function(e){return e.contractVersion===ae.V1_1?Rt.execute(e):Ht.execute(e)})),"calculateBootstrapFundingTxnAmount",(function(e){var t=e.contractVersion,n=e.isAlgoPool,r=e.minFee;return t===ae.V1_1?Rt.getBootstrapFundingTxnAmount(n):Ht.getBootstrapFundingTxnAmount(n,r)})),Zt=te("add_liquidity"),en=l(l({},ae.V1_1,[te("mint")]),ae.V2,{INITIAL_LIQUIDITY:[te("add_initial_liquidity")],SINGLE_ASSET_MODE:[Zt,te("single")],FLEXIBLE_MODE:[Zt,te("flexible")]}),tn=function(e){return e[e.FEE_TXN=0]="FEE_TXN",e[e.VALIDATOR_APP_CALL_TXN=1]="VALIDATOR_APP_CALL_TXN",e[e.ASSET1_IN_TXN=2]="ASSET1_IN_TXN",e[e.ASSET2_IN_TXN=3]="ASSET2_IN_TXN",e[e.LIQUDITY_OUT_TXN=4]="LIQUDITY_OUT_TXN",e}({}),nn=5;function rn(){return(rn=i(s().mark((function t(n){var r,a,o,i,u,c,p,l,d,f,m,h,g,x,A,v;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.client,a=n.network,o=n.poolAddress,i=n.asset1In,u=n.asset2In,c=n.poolTokenOut,p=n.slippage,l=n.initiatorAddr,d=X("negative",p,c.amount),t.next=4,r.getTransactionParams().do();case 4:return f=t.sent,m=e.makeApplicationNoOpTxnFromObject({sender:o,appIndex:Ye(a,ae.V1_1),appArgs:en.v1_1,accounts:[l],note:se.getAppCallTxnNoteWithClientName(ae.V1_1),foreignAssets:u.id==ge?[i.id,c.id]:[i.id,u.id,c.id],suggestedParams:f}),h=e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:l,receiver:o,assetIndex:i.id,amount:i.amount,suggestedParams:f}),g=u.id===ge?e.makePaymentTxnWithSuggestedParamsFromObject({sender:l,receiver:o,amount:u.amount,suggestedParams:f}):e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:l,receiver:o,assetIndex:u.id,amount:u.amount,suggestedParams:f}),x=e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:o,receiver:l,assetIndex:c.id,amount:d,suggestedParams:f}),A=e.makePaymentTxnWithSuggestedParamsFromObject({sender:l,receiver:o,amount:m.fee+x.fee,note:S,suggestedParams:f}),v=e.assignGroupID([A,m,h,g,x]),t.abrupt("return",[{txn:v[0],signers:[l]},{txn:v[1],signers:[o]},{txn:v[2],signers:[l]},{txn:v[3],signers:[l]},{txn:v[4],signers:[o]}]);case 12:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function an(){return(an=i(s().mark((function t(n){var r,a,o,i,u,c,p,l,d,f;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.pool,a=n.txGroup,o=n.initiatorSigner,i=r.account,t.next=4,o([a]);case 4:return u=t.sent,c=A(u,3),p=c[0],l=c[1],d=c[2],f=a.map((function(t,n){return n===tn.FEE_TXN?p:n===tn.ASSET1_IN_TXN?l:n===tn.ASSET2_IN_TXN?d:e.signLogicSigTransactionObject(t.txn,i).blob})),t.abrupt("return",f);case 11:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function sn(){return(sn=i(s().mark((function e(t){var n,r,a,o,i,u,c,p,l,d,f,m,h,g,x,v,I,w,y;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.client,r=t.pool,a=t.txGroup,o=t.signedTxns,i=t.initiatorAddr,e.prev=1,p=null!==(u=null===(c=a[tn.LIQUDITY_OUT_TXN].txn.payment)||void 0===c?void 0:c.amount)&&void 0!==u?u:0n,e.next=5,ut({client:n,pool:r,accountAddr:i});case 5:return l=e.sent,e.next=8,Y(n,[o]);case 8:return d=e.sent,f=A(d,1),m=f[0],h=m.confirmedRound,g=m.txnID,x=$(a),v=Z(a),e.next=17,ut({client:n,pool:r,accountAddr:i});case 17:return I=e.sent,(w=I.excessPoolTokens-l.excessPoolTokens)<0n&&(w=0n),e.abrupt("return",{round:h,fees:x,poolTokenID:r.poolTokenID,poolTokenOut:p+w,excessAmount:{excessAmountForAddingLiquidity:w,totalExcessAmount:I.excessPoolTokens},txnID:g,groupID:v});case 23:throw e.prev=23,e.t0=e.catch(1),"SlippageTolerance"===(y=new U(e.t0,"We encountered something unexpected while adding liquidity. Try again later.")).type&&y.setMessage("Adding liquidity failed due to too much slippage in the price. Please adjust the slippage tolerance and try again."),y;case 28:case"end":return e.stop()}}),e,null,[[1,23]])})))).apply(this,arguments)}var on=Object.freeze({__proto__:null,execute:function(e){return sn.apply(this,arguments)},generateTxns:function(e){return rn.apply(this,arguments)},getQuote:function(e){var t=e.pool,n=e.reserves,r=e.asset1In,a=e.asset2In;if(0n===n.issuedLiquidity){var s=BigInt(Math.floor(Math.sqrt(Number(r)*Number(a))));if(s<=O)throw new Error("Initial liquidity amount is too small. The amount must be greater than ".concat(O,", this quote is for ").concat(s,"."));return{round:Number(n.round),asset1ID:t.asset1ID,asset1In:r,asset2ID:t.asset2ID,asset2In:a,poolTokenID:t.poolTokenID,poolTokenOut:s-O,share:1}}var o=r*n.issuedLiquidity/n.asset1,i=a*n.issuedLiquidity/n.asset2,u=ox){var A=g;r=mn(A,s),t={id:o.id,amount:A+r,decimals:o.decimals,reserves:a.asset1},n={id:i.id,amount:BigInt(Math.abs(Math.min(Number(x),0))),decimals:i.decimals,reserves:a.asset2},f-=r*d/(c*BigInt(2))}else{var v=x;r=mn(v,s),t={id:i.id,amount:v+r,decimals:i.decimals,reserves:a.asset2},n={id:o.id,amount:BigInt(Math.abs(Math.min(Number(g),0))),decimals:o.decimals,reserves:a.asset1},f-=r*d/(p*BigInt(2))}return{poolTokenOutAmount:f,internalSwapQuote:{assetIn:t,assetOut:n,swapFees:r,priceImpact:je({inputSupply:t.reserves,outputSupply:n.reserves,assetIn:t,assetOut:n})}}}function fn(e,t){if(!e.amount||!t.amount)throw new Error("Both assets are required for the initial add liquidity");return BigInt(Math.floor(Math.abs(Math.sqrt(Number(e.amount)*Number(t.amount))-ft)))}function mn(e,t){return e*BigInt(t)/(BigInt(1e4)-BigInt(t))}function hn(e,t){var n=pn[e];return BigInt(n+1)*t}function gn(e){var t=e.txGroup;return(0,e.initiatorSigner)([t])}function xn(e){return An.apply(this,arguments)}function An(){return(An=i(s().mark((function e(t){var n,r,a,o,i,u,c,p,l,d,f,m;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.client,r=t.pool,a=t.txGroup,o=t.signedTxns,e.prev=1,e.next=4,Y(n,[o]);case 4:return i=e.sent,u=A(i,1),c=u[0],p=c.confirmedRound,l=c.txnID,e.prev=9,e.next=12,qt(n,a);case 12:if(e.t1=f=e.sent,e.t0=null===e.t1,e.t0){e.next=16;break}e.t0=void 0===f;case 16:if(!e.t0){e.next=20;break}e.t2=void 0,e.next=21;break;case 20:e.t2=f.find((function(e){return e.id===r.poolTokenID}));case 21:d=e.t2,e.next=26;break;case 24:e.prev=24,e.t3=e.catch(9);case 26:return e.abrupt("return",{round:p,assetOut:d,fees:$(a),poolTokenID:r.poolTokenID,txnID:l,groupID:Z(a)});case 29:throw e.prev=29,e.t4=e.catch(1),"SlippageTolerance"===(m=new U(e.t4,"We encountered something unexpected while adding liquidity. Try again later.")).type&&m.setMessage("Adding liquidity failed due to too much slippage in the price. Please adjust the slippage tolerance and try again."),m;case 34:case"end":return e.stop()}}),e,null,[[1,29],[9,24]])})))).apply(this,arguments)}function vn(){return(vn=i(s().mark((function t(n){var r,a,o,i,u,c,p,l,d,f,m,h,g,x,I,w,y,b;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.client,a=n.network,o=n.poolAddress,i=n.asset1In,u=n.asset2In,c=n.poolTokenOut,p=n.initiatorAddr,l=n.minPoolTokenAssetAmount,t.next=3,r.getTransactionParams().do();case 3:return d=t.sent,f=Te(i,u),m=A(f,2),h=m[0],g=m[1],x=Se(g.id),I=e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:p,receiver:o,assetIndex:h.id,amount:h.amount,suggestedParams:d}),w=x?e.makePaymentTxnWithSuggestedParamsFromObject({sender:p,receiver:o,amount:g.amount,suggestedParams:d}):e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:p,receiver:o,assetIndex:g.id,amount:g.amount,suggestedParams:d}),(y=e.makeApplicationNoOpTxnFromObject({sender:p,appIndex:Ye(a,ae.V2),note:se.getAppCallTxnNoteWithClientName(ae.V2),appArgs:[].concat(v(en.v2.FLEXIBLE_MODE),[e.encodeUint64(l)]),accounts:[o],foreignAssets:[c.id],suggestedParams:d})).fee=hn(un.FLEXIBLE,d.minFee),b=e.assignGroupID([I,w,y]),t.abrupt("return",[{txn:b[0],signers:[p]},{txn:b[1],signers:[p]},{txn:b[2],signers:[p]}]);case 12:case"end":return t.stop()}}),t)})))).apply(this,arguments)}var In=Object.freeze({__proto__:null,execute:xn,generateTxns:function(e){return vn.apply(this,arguments)},getQuote:function(e){var t=e.pool,n=e.slippage,r=void 0===n?.05:n,a=e.asset1,s=e.asset2;if(0n===t.issuedPoolTokens)throw new Error("Pool has no liquidity at the moment. To be able to do Flexible Swap, you should first add initial liquidity.");if(t.status!==lt.READY)throw new Error("Pool is not ready");if(!t.poolTokenID)throw new Error("Pool token ID is not available");var o={asset1:t.asset1Reserves||0n,asset2:t.asset2Reserves||0n,issuedLiquidity:t.issuedPoolTokens||0n},i=dn({reserves:o,totalFeeShare:t.totalFeeShare,asset1:{id:t.asset1ID,amount:a.amount,decimals:a.decimals},asset2:{id:t.asset2ID,amount:s.amount,decimals:s.decimals}}),u=i.poolTokenOutAmount,c=i.internalSwapQuote,p=u-BigInt(Math.ceil(Number(u)*r));return{asset1In:{id:t.asset1ID,amount:a.amount},asset2In:{id:t.asset2ID,amount:s.amount},poolTokenOut:{id:t.poolTokenID,amount:u},share:_t.getPoolShare(o.issuedLiquidity+u,u),slippage:r,internalSwapQuote:c,minPoolTokenAssetAmountWithSlippage:p}},signTxns:gn});function wn(){return(wn=i(s().mark((function t(n){var r,a,o,i,u,c,p,l,d,f,m,h;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.client,a=n.network,o=n.poolAddress,i=n.assetIn,u=n.poolTokenId,c=n.initiatorAddr,p=n.minPoolTokenAssetAmount,t.next=3,r.getTransactionParams().do();case 3:return l=t.sent,d=Se(i.id),f=d?e.makePaymentTxnWithSuggestedParamsFromObject({sender:c,receiver:o,amount:i.amount,suggestedParams:l}):e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:c,receiver:o,assetIndex:i.id,amount:i.amount,suggestedParams:l}),(m=e.makeApplicationNoOpTxnFromObject({sender:c,appIndex:Ye(a,ae.V2),note:se.getAppCallTxnNoteWithClientName(ae.V2),appArgs:[].concat(v(en.v2.SINGLE_ASSET_MODE),[e.encodeUint64(p)]),accounts:[o],foreignAssets:[u],suggestedParams:l})).fee=hn(un.SINGLE,l.minFee),h=e.assignGroupID([f,m]),t.abrupt("return",[{txn:h[0],signers:[c]},{txn:h[1],signers:[c]}]);case 10:case"end":return t.stop()}}),t)})))).apply(this,arguments)}var yn=Object.freeze({__proto__:null,execute:xn,generateTxns:function(e){return wn.apply(this,arguments)},getQuote:function(e){var t=e.pool,n=e.assetIn,r=e.slippage,a=void 0===r?.05:r,s=e.decimals;if(0n===t.issuedPoolTokens)throw new Error("Pool has no liquidity");if(t.status!==lt.READY)throw new Error("Pool is not ready");if(!t.poolTokenID)throw new Error("Pool token ID is not available");var o=n.id===t.asset1ID,i=n.id===t.asset2ID;if(!o&&!i)throw new Error("Provided input asset id didn't match any asset of the pool");var u={id:t.asset1ID,amount:o?n.amount:0n,decimals:s.asset1},c={id:t.asset2ID,amount:i?n.amount:0n,decimals:s.asset2},p={asset1:t.asset1Reserves||0n,asset2:t.asset2Reserves||0n,issuedLiquidity:t.issuedPoolTokens||0n},l=dn({reserves:p,totalFeeShare:t.totalFeeShare||0,asset1:u,asset2:c}),d=l.poolTokenOutAmount,f=l.internalSwapQuote,m=d-BigInt(Math.ceil(Number(d)*a));return{assetIn:{id:o?t.asset1ID:t.asset2ID,amount:n.amount},poolTokenOut:{id:t.poolTokenID,amount:d},share:_t.getPoolShare(p.issuedLiquidity+d,d),slippage:a,internalSwapQuote:f,minPoolTokenAssetAmountWithSlippage:m}},signTxns:gn});function bn(){return(bn=i(s().mark((function t(n){var r,a,o,i,u,c,p,l,d,f,m,h,g;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.client,a=n.pool,o=n.network,i=n.poolAddress,u=n.asset1In,c=n.asset2In,p=n.poolTokenId,l=n.initiatorAddr,d=Se(a.asset2ID),t.next=4,r.getTransactionParams().do();case 4:return f=t.sent,m=e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:l,receiver:i,assetIndex:a.asset1ID,amount:u.amount,suggestedParams:f}),h=d?e.makePaymentTxnWithSuggestedParamsFromObject({sender:l,receiver:i,amount:c.amount,suggestedParams:f}):e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:l,receiver:i,assetIndex:a.asset2ID,amount:c.amount,suggestedParams:f}),(g=e.makeApplicationNoOpTxnFromObject({sender:l,appIndex:Ye(o,ae.V2),appArgs:en.v2.INITIAL_LIQUIDITY,note:se.getAppCallTxnNoteWithClientName(ae.V2),accounts:[i],foreignAssets:[p],suggestedParams:f})).fee=hn(un.INITIAL,f.minFee),t.abrupt("return",e.assignGroupID([m,h,g]).map((function(e){return{txn:e,signers:[l]}})));case 10:case"end":return t.stop()}}),t)})))).apply(this,arguments)}var Tn=Object.freeze({__proto__:null,execute:xn,generateTxns:function(e){return bn.apply(this,arguments)},getQuote:function(e){var t=e.pool,n=e.asset1,r=e.asset2,a=e.slippage,s=void 0===a?.05:a;if(0n!==t.issuedPoolTokens)throw new Error("Pool already has liquidity");var o=BigInt(Math.floor(Math.sqrt(Number(n.amount)*Number(r.amount))));if(o<=BigInt(ft))throw new Error("Initial liquidity amount is too small. Liquidity amount must be greater than ".concat(ft,", this quote is for ").concat(o,"."));return{asset1In:{id:t.asset1ID,amount:n.amount},asset2In:{id:t.asset2ID,amount:r.amount},poolTokenOut:{id:t.poolTokenID,amount:fn(n,r)},slippage:s}},signTxns:gn}),kn=Object.freeze({__proto__:null,flexible:In,initial:Tn,withSingleAsset:yn}),Sn=l(l({},ae.V1_1,on),ae.V2,kn);var Pn=function(e){return e[e.FEE_TXN=0]="FEE_TXN",e[e.VALIDATOR_APP_CALL_TXN=1]="VALIDATOR_APP_CALL_TXN",e[e.ASSET1_OUT_TXN=2]="ASSET1_OUT_TXN",e[e.ASSET2_OUT_TXN=3]="ASSET2_OUT_TXN",e[e.POOL_TOKEN_IN_TXN=4]="POOL_TOKEN_IN_TXN",e}({}),_n=Object.values(Pn).length;function En(){return(En=i(s().mark((function t(n){var r,a,o,i,u,c,p,l,d,f,m,h,g,x,A,v,I,w,y,b;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.client,a=n.pool,o=n.poolTokenIn,i=n.asset1Out,u=n.asset2Out,c=n.slippage,p=n.initiatorAddr,t.next=3,r.getTransactionParams().do();case 3:return l=t.sent,d=a.account.address(),f=Se(a.asset2ID),m=e.makeApplicationNoOpTxnFromObject({sender:d,appIndex:a.validatorAppID,appArgs:[te("burn")],note:se.getAppCallTxnNoteWithClientName(ae.V1_1),accounts:[p],foreignAssets:f?[a.asset1ID,a.poolTokenID]:[a.asset1ID,a.asset2ID,a.poolTokenID],suggestedParams:l}),h=X("negative",c,i),g=e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:d,receiver:p,assetIndex:a.asset1ID,amount:h,suggestedParams:l}),x=X("negative",c,u),A=f?e.makePaymentTxnWithSuggestedParamsFromObject({sender:d,receiver:p,amount:x,suggestedParams:l}):e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:d,receiver:p,assetIndex:a.asset2ID,amount:x,suggestedParams:l}),v=e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:p,receiver:d,assetIndex:a.poolTokenID,amount:o,suggestedParams:l}),I=m.fee+g.fee+A.fee,w=e.makePaymentTxnWithSuggestedParamsFromObject({sender:p,receiver:d,amount:I,note:S,suggestedParams:l}),(y=[])[Pn.FEE_TXN]=w,y[Pn.VALIDATOR_APP_CALL_TXN]=m,y[Pn.ASSET1_OUT_TXN]=g,y[Pn.ASSET2_OUT_TXN]=A,y[Pn.POOL_TOKEN_IN_TXN]=v,b=e.assignGroupID(y),t.abrupt("return",[{txn:b[Pn.FEE_TXN],signers:[p]},{txn:b[Pn.VALIDATOR_APP_CALL_TXN],signers:[d.toString()]},{txn:b[Pn.ASSET1_OUT_TXN],signers:[d.toString()]},{txn:b[Pn.ASSET2_OUT_TXN],signers:[d.toString()]},{txn:b[Pn.POOL_TOKEN_IN_TXN],signers:[p]}]);case 22:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function Dn(){return(Dn=i(s().mark((function t(n){var r,a,o,i,u,c,p,l,d;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.pool,a=n.txGroup,o=n.initiatorSigner,t.next=3,o([a]);case 3:return i=t.sent,u=A(i,2),c=u[0],p=u[1],l=r.account,d=a.map((function(t,n){return n===Pn.FEE_TXN?c:n===Pn.POOL_TOKEN_IN_TXN?p:e.signLogicSigTransactionObject(t.txn,l).blob})),t.abrupt("return",d);case 10:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function Nn(){return(Nn=i(s().mark((function e(t){var n,r,a,o,i,u,c,p,l,d,f,m,h,g,x,v,I,w,y,b,T,k,S,P;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.client,r=t.pool,a=t.txGroup,o=t.signedTxns,i=t.initiatorAddr,e.prev=1,m=null!==(u=null===(c=a[Pn.ASSET1_OUT_TXN].txn.payment)||void 0===c?void 0:c.amount)&&void 0!==u?u:0n,h=null!==(p=null===(l=a[Pn.ASSET2_OUT_TXN].txn.payment)||void 0===l?void 0:l.amount)&&void 0!==p?p:0n,g=null!==(d=null===(f=a[Pn.POOL_TOKEN_IN_TXN].txn.payment)||void 0===f?void 0:f.amount)&&void 0!==d?d:0n,e.next=7,ut({client:n,pool:r,accountAddr:i});case 7:return x=e.sent,e.next=10,Y(n,[o]);case 10:return v=e.sent,I=A(v,1),w=I[0],y=w.confirmedRound,b=w.txnID,e.next=17,ut({client:n,pool:r,accountAddr:i});case 17:return T=e.sent,(k=T.excessAsset1-x.excessAsset1)<0n&&(k=0n),(S=T.excessAsset2-x.excessAsset2)<0n&&(S=0n),e.abrupt("return",{round:y,fees:$(a),asset1ID:r.asset1ID,asset1Out:m+k,asset2ID:r.asset2ID,asset2Out:h+S,poolTokenID:r.poolTokenID,poolTokenIn:g,excessAmounts:[{assetID:r.asset1ID,excessAmountForBurning:k,totalExcessAmount:T.excessAsset1},{assetID:r.asset2ID,excessAmountForBurning:S,totalExcessAmount:T.excessAsset2}],txnID:b,groupID:Z(a)});case 25:throw e.prev=25,e.t0=e.catch(1),"SlippageTolerance"===(P=new U(e.t0,"We encountered something unexpected while burning liquidity. Try again later.")).type&&P.setMessage("The burn failed due to too much slippage in the price. Please adjust the slippage tolerance and try again."),P;case 30:case"end":return e.stop()}}),e,null,[[1,25]])})))).apply(this,arguments)}var On={generateTxns:function(e){return En.apply(this,arguments)},getQuote:function(e){var t=e.pool,n=e.reserves,r=e.poolTokenIn,a=n.issuedLiquidity&&r*n.asset1/n.issuedLiquidity,s=n.issuedLiquidity&&r*n.asset2/n.issuedLiquidity;return{round:Number(n.round),poolTokenID:t.poolTokenID,poolTokenIn:r,asset1ID:t.asset1ID,asset1Out:a,asset2ID:t.asset2ID,asset2Out:s}},signTxns:function(e){return Dn.apply(this,arguments)},execute:function(e){return Nn.apply(this,arguments)}};function Bn(){return(Bn=i(s().mark((function t(n){var r,o,i,u,c,p,l,d,f,m,h,g,x,A,v,I,w,y,b,T;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(n.quote.type!==_e.Router){t.next=2;break}return t.abrupt("return",oe(a(a({},n),{},{route:n.quote.data})));case 2:if(r=n.client,o=n.initiatorAddr,i=n.slippage,u=n.swapType,c=n.quote,p=c.data,l=p.pool,d=p.quote,f=d.assetInID,m=d.assetOutID,h=l.account.address(),(g=[l.asset1ID,l.asset2ID]).includes(f)&&g.includes(m)&&f!==m){t.next=9;break}throw new U({pool:l,quote:c},"Input asset (#".concat(f,") and output asset (#").concat(m,") provided to generate transactions do not belong to the pool ").concat(h,"."));case 9:return t.next=11,r.getTransactionParams().do();case 11:return x=t.sent,A=Se(f),v=u===ne.FixedInput?d.assetInAmount:X("positive",i,d.assetInAmount),I=u===ne.FixedOutput?d.assetOutAmount:X("negative",i,d.assetOutAmount),w=A?e.makePaymentTxnWithSuggestedParamsFromObject({sender:o,receiver:h,amount:v,suggestedParams:x}):e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:o,receiver:h,amount:v,assetIndex:f,suggestedParams:x}),(y=e.makeApplicationNoOpTxnFromObject({sender:o,appIndex:l.validatorAppID,appArgs:[Be,Ce[u],e.encodeUint64(I)],note:se.getAppCallTxnNoteWithClientName(ae.V2,n.appCallNoteExtraData),accounts:[h],foreignAssets:[l.asset1ID,l.asset2ID],suggestedParams:x})).fee=Me(u,x.minFee),(b=[])[De.INPUT_TXN]=w,b[De.APP_CALL_TXN]=y,T=e.assignGroupID(b),t.abrupt("return",[{txn:T[De.INPUT_TXN],signers:[o]},{txn:T[De.APP_CALL_TXN],signers:[o]}]);case 23:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function Cn(){return(Cn=i(s().mark((function e(t){var n,r,a,o,i,u,c,p,l,d,f,m,h,g,x,v;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.client,o=t.quote,i=t.txGroup,u=t.signedTxns,e.next=3,Y(a,[u]);case 3:return c=e.sent,p=A(c,1),l=p[0],d=l.confirmedRound,f=l.txnID,m=Ge(o).id,h=Ve(o),e.prev=10,e.next=13,qt(a,i);case 13:g=e.sent,e.next=18;break;case 16:e.prev=16,e.t0=e.catch(10);case 18:return x=null===(n=g)||void 0===n||null===(n=n.find((function(e){return e.id===h.id})))||void 0===n?void 0:n.amount,v=null===(r=g)||void 0===r?void 0:r.find((function(e){return e.id===m})),e.abrupt("return",{round:d,assetIn:{amount:h.amount-(x||0n),id:h.id},assetOut:v,quote:o,txnID:f});case 21:case"end":return e.stop()}}),e,null,[[10,16]])})))).apply(this,arguments)}function Fn(){return(Fn=i(s().mark((function e(t){var n,r,a,o,i,u,c,p;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=t.type,r=t.amount,a=t.assetIn,o=t.assetOut,i=t.network,u=t.slippage,c=t.pool,n!==ne.FixedInput){e.next=7;break}return e.next=4,Un({assetIn:a,assetOut:o,amount:r,network:i,pool:c,slippage:u});case 4:p=e.sent,e.next=10;break;case 7:return e.next=9,Vn({amount:r,assetIn:a,assetOut:o,network:i,pool:c,slippage:u});case 9:p=e.sent;case 10:return e.abrupt("return",p);case 11:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Ln(e){return Promise.allSettled(e).then((function(e){if(e.every((function(e){return"rejected"===e.status}))){var t=e[0].reason;if(2===e.length){var n=e[1].reason;if(We(t)&&!We(n))throw t;throw n}throw t}return e.filter((function(e){return"fulfilled"===e.status&&e.value})).map((function(e){return e.value}))}))}function Rn(e){var t=e.amount,n=e.assetIn,r=e.assetOut,a=e.pool;if(!_t.isPoolReady(a))throw new k(T.NoAvailablePoolError,"There is not an available pool for this asset pair");var s,o,i=n.id,u=n.decimals,c=r.id,p=r.decimals,l=t,d=a.totalFeeShare;if(i===a.asset1ID)s=a.asset1Reserves,o=a.asset2Reserves;else{if(i!==a.asset2ID)throw new k(T.AssetDoesNotBelongToPoolError,"Input asset (#".concat(i,") doesn't belong to the pool ").concat(a.account.address(),"."));s=a.asset2Reserves,o=a.asset1Reserves}var f=Qn({inputSupply:s,outputSupply:o,swapInputAmount:l,totalFeeShare:d,decimals:{assetIn:u,assetOut:p}}),m=f.swapOutputAmount,h=f.totalFeeAmount,g=f.priceImpact;if(m>o)throw new k(T.OutputAmountExceedsAvailableLiquidityError,"Output amount exceeds available liquidity.");if(Re(Number(t)))throw new k(T.LowSwapAmountError,"Swap amount is too low.");return{assetInID:i,assetInAmount:l,assetOutID:c,assetOutAmount:m,swapFee:Number(h),rate:W(p,Number(m))/W(u,Number(l)),priceImpact:g}}function Mn(e){var t=e.amount,n=e.assetIn,r=e.assetOut,a=e.pool;if(!a||!_t.isPoolReady(a))throw new k(T.NoAvailablePoolError,"There is not an available pool for this asset pair");var s,o,i=n.id,u=n.decimals,c=r.id,p=r.decimals,l=t,d=a.totalFeeShare;if(c===a.asset1ID)s=a.asset2Reserves,o=a.asset1Reserves;else{if(c!==a.asset2ID)throw new k(T.AssetDoesNotBelongToPoolError,"Output asset (#".concat(c,") doesn't belong to the pool ").concat(a.account.address(),"."));s=a.asset1Reserves,o=a.asset2Reserves}var f=function(e){var t=e.inputSupply,n=e.outputSupply,r=e.swapOutputAmount,a=e.totalFeeShare,s=e.decimals,o=function(e){var t=e.inputSupply,n=e.outputSupply,r=e.outputAmount,a=t*n,s=a/(n-r)-t;return s+=BigInt(1),s}({inputSupply:t,outputSupply:n,outputAmount:r}),i=function(e){var t=e.swapAmount,n=e.totalFeeShare,r=Math.floor(Number(t*BigInt(1e4)/(BigInt(1e4)-n))),a=BigInt(r)-t;return a}({swapAmount:o,totalFeeShare:a}),u=o+i,c=je({inputSupply:t,outputSupply:n,assetIn:{amount:u,decimals:s.assetIn},assetOut:{amount:r,decimals:s.assetOut}});return{swapInputAmount:u,totalFeeAmount:i,priceImpact:c}}({inputSupply:s,outputSupply:o,swapOutputAmount:l,totalFeeShare:d,decimals:{assetIn:u,assetOut:p}}),m=f.swapInputAmount,h=f.totalFeeAmount,g=f.priceImpact;if(l>o)throw new k(T.OutputAmountExceedsAvailableLiquidityError,"Output amount exceeds available liquidity.");if(Re(Number(m)))throw new k(T.LowSwapAmountError,"Swap amount is too low.");return{type:_e.Direct,data:{pool:a,quote:{assetInID:i,assetInAmount:m,assetOutID:c,assetOutAmount:l,swapFee:Number(h),rate:W(p,Number(l))/W(u,Number(m)),priceImpact:g}}}}function Un(e){return jn.apply(this,arguments)}function jn(){return(jn=i(s().mark((function e(t){var n,r,a,o,i,u,c,p;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.amount,r=t.assetIn,a=t.assetOut,o=t.network,i=t.slippage,u=t.pool,c=[],u?c.push(new Promise((function(e,t){try{var s=Rn({amount:n,assetIn:r,assetOut:a,pool:u});e({type:_e.Direct,data:{pool:u,quote:s}})}catch(e){t(e)}}))):c.push(Promise.reject(new k(T.NoAvailablePoolError,"There is not an available pool for this asset pair"))),c.push(ce({amount:n,assetInID:r.id,assetOutID:a.id,swapType:ne.FixedInput,network:o,slippage:i}).then((function(e){return{type:_e.Router,data:e}}))),e.next=6,Ln(c);case 6:return p=e.sent,e.abrupt("return",Xe(p));case 8:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Vn(e){return Gn.apply(this,arguments)}function Gn(){return(Gn=i(s().mark((function e(t){var n,r,a,o,i,u,c,p;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.amount,r=t.assetIn,a=t.assetOut,o=t.network,i=t.slippage,u=t.pool,(c=[new Promise((function(e,t){try{e(Mn({amount:n,assetIn:r,assetOut:a,pool:u}))}catch(e){t(e)}}))]).push(ce({amount:n,assetInID:r.id,assetOutID:a.id,swapType:ne.FixedOutput,network:o,slippage:i}).then((function(e){return{type:_e.Router,data:e}}))),e.next=5,Ln(c);case 5:return p=e.sent,e.abrupt("return",Xe(p));case 7:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Qn(e){var t=e.inputSupply,n=e.outputSupply,r=e.swapInputAmount,a=e.totalFeeShare,s=e.decimals,o=function(e){var t=e.inputAmount,n=e.totalFeeShare;return BigInt(Math.floor(Number(t*n)/1e4))}({inputAmount:r,totalFeeShare:a}),i=function(e){var t=e.inputSupply,n=e.outputSupply,r=e.swapAmount,a=t*n,s=n-a/(t+r);return s-=BigInt(1)}({inputSupply:t,outputSupply:n,swapAmount:r-o});return{swapOutputAmount:i,totalFeeAmount:o,priceImpact:je({inputSupply:t,outputSupply:n,assetIn:{amount:r,decimals:s.assetIn},assetOut:{amount:i,decimals:s.assetOut}})}}var qn={getQuote:function(e){return Fn.apply(this,arguments)},getFixedInputSwapQuote:Un,getFixedInputDirectSwapQuote:Rn,getFixedOutputDirectSwapQuote:Mn,getFixedOutputSwapQuote:Vn,generateTxns:function(e){return Bn.apply(this,arguments)},signTxns:function(e){var t=e.txGroup;return(0,e.initiatorSigner)([t])},execute:function(e){return Cn.apply(this,arguments)},calculateFixedInputSwap:Qn},Xn=2,Wn=te("remove_liquidity"),zn=function(e){return e[e.ASSET_TRANSFER_TXN=0]="ASSET_TRANSFER_TXN",e[e.APP_CALL_TXN=1]="APP_CALL_TXN",e}({});function Jn(e,t){var n,r,a=t.issuedLiquidity;return a>e+BigInt(ft)?(n=e*t.asset1/a,r=e*t.asset2/a):(n=t.asset1,r=t.asset2),{asset1OutputAmount:n,asset2OutputAmount:r}}function Kn(){return(Kn=i(s().mark((function t(n){var r,a,o,i,u,c,p,l,d,f,m,h,g,x;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.client,a=n.pool,o=n.poolTokenIn,i=n.initiatorAddr,u=n.minAsset1Amount,c=n.minAsset2Amount,p=n.slippage,t.next=3,r.getTransactionParams().do();case 3:if(l=t.sent,d=a.account.address(),f=a.poolTokenID){t.next=8;break}throw new Error("Pool token asset ID is missing");case 8:return m=e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:i,receiver:d,assetIndex:f,amount:o,suggestedParams:l}),(h=e.makeApplicationNoOpTxnFromObject({sender:i,appIndex:a.validatorAppID,note:se.getAppCallTxnNoteWithClientName(ae.V2),appArgs:[Wn,e.encodeUint64(X("negative",p,u)),e.encodeUint64(X("negative",p,c))],accounts:[d],foreignAssets:[a.asset1ID,a.asset2ID],suggestedParams:l})).fee=BigInt(Xn+1)*l.minFee,(g=[])[zn.ASSET_TRANSFER_TXN]=m,g[zn.APP_CALL_TXN]=h,x=e.assignGroupID(g),t.abrupt("return",[{txn:x[zn.ASSET_TRANSFER_TXN],signers:[i]},{txn:x[zn.APP_CALL_TXN],signers:[i]}]);case 16:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function Yn(){return(Yn=i(s().mark((function t(n){var r,a,o,i,u,c,p,l,d,f,m,h,g,x,A,v,I,w,y;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.client,a=n.pool,o=n.initiatorAddr,i=n.poolTokenIn,u=n.outputAssetId,c=n.minOutputAssetAmount,p=n.slippage,t.next=3,r.getTransactionParams().do();case 3:if(l=t.sent,d=a.asset1ID,f=a.asset2ID,m=a.account.address(),h=a.poolTokenID){t.next=9;break}throw new Error("Pool token asset ID is missing");case 9:if(g=0n,x=0n,A=X("negative",p,c),u!==d){t.next=17;break}g=A,x=0n,t.next=23;break;case 17:if(u!==f){t.next=22;break}g=0n,x=A,t.next=23;break;case 22:throw new Error("Invalid output asset id. It doesn't match with pool assets");case 23:return v=e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:o,receiver:m,assetIndex:h,amount:i,suggestedParams:l}),(I=e.makeApplicationNoOpTxnFromObject({sender:o,appIndex:a.validatorAppID,note:se.getAppCallTxnNoteWithClientName(ae.V2),appArgs:[Wn,e.encodeUint64(g),e.encodeUint64(x)],accounts:[m],foreignAssets:[u],suggestedParams:l})).fee=BigInt(Xn+1)*l.minFee,(w=[])[zn.ASSET_TRANSFER_TXN]=v,w[zn.APP_CALL_TXN]=I,y=e.assignGroupID(w),t.abrupt("return",[{txn:y[zn.ASSET_TRANSFER_TXN],signers:[o]},{txn:y[zn.APP_CALL_TXN],signers:[o]}]);case 31:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function Hn(){return(Hn=i(s().mark((function e(t){var n,r,a,o,i,u,c;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.client,r=t.txGroup,a=t.signedTxns,e.next=3,Y(n,[a]);case 3:return o=e.sent,i=A(o,1),u=i[0].txnID,e.prev=6,e.next=9,qt(n,r);case 9:c=e.sent,e.next=14;break;case 12:e.prev=12,e.t0=e.catch(6);case 14:return e.abrupt("return",{outputAssets:c,txnID:u});case 15:case"end":return e.stop()}}),e,null,[[6,12]])})))).apply(this,arguments)}var $n={getQuote:function(e){var t=e.pool,n=e.reserves,r=e.poolTokenIn,a=Jn(r,n),s=a.asset1OutputAmount,o=a.asset2OutputAmount;return{round:Number(n.round),asset1Out:{assetId:t.asset1ID,amount:s},asset2Out:{assetId:t.asset2ID,amount:o},poolTokenIn:{assetId:t.poolTokenID,amount:r}}},getSingleAssetRemoveLiquidityQuote:function(e){var t,n=e.pool,r=e.reserves,a=e.poolTokenIn,s=e.assetOutID,o=e.decimals,i=Jn(a,r),u=i.asset1OutputAmount,c=i.asset2OutputAmount,p=n.totalFeeShare;if(s===n.asset1ID){var l=qn.calculateFixedInputSwap({inputSupply:r.asset2-c,outputSupply:r.asset1-u,swapInputAmount:c,totalFeeShare:p,decimals:o}),d=l.swapOutputAmount,f=l.totalFeeAmount,m=l.priceImpact;t={round:Number(r.round),assetOut:{assetId:s,amount:u+d},poolTokenIn:{assetId:n.poolTokenID,amount:a},internalSwapQuote:{amountIn:{assetId:n.asset2ID,amount:c},amountOut:{assetId:n.asset1ID,amount:d},swapFees:{assetId:n.asset2ID,amount:f},priceImpact:m}}}else{if(s!==n.asset2ID)throw new Error("assetOutID must be one of the pool assets");var h=qn.calculateFixedInputSwap({inputSupply:r.asset1-u,outputSupply:r.asset2-c,swapInputAmount:u,totalFeeShare:p,decimals:o}),g=h.swapOutputAmount,x=h.totalFeeAmount,A=h.priceImpact;t={round:Number(r.round),assetOut:{assetId:s,amount:c+g},poolTokenIn:{assetId:n.poolTokenID,amount:a},internalSwapQuote:{amountIn:{assetId:n.asset2ID,amount:c},amountOut:{assetId:n.asset1ID,amount:g},swapFees:{assetId:n.asset2ID,amount:x},priceImpact:A}}}return t},generateTxns:function(e){return Kn.apply(this,arguments)},generateSingleAssetOutTxns:function(e){return Yn.apply(this,arguments)},signTxns:function(e){var t=e.txGroup;return(0,e.initiatorSigner)([t])},execute:function(e){return Hn.apply(this,arguments)}},Zn=l(l({},ae.V1_1,On),ae.V2,$n),er=3n,tr=1000n,nr=function(e){return e[e.FEE_TXN_INDEX=0]="FEE_TXN_INDEX",e[e.VALIDATOR_APP_CALL_TXN_INDEX=1]="VALIDATOR_APP_CALL_TXN_INDEX",e[e.ASSET_IN_TXN_INDEX=2]="ASSET_IN_TXN_INDEX",e[e.ASSET_OUT_TXN_INDEX=3]="ASSET_OUT_TXN_INDEX",e}(nr||{});function rr(){return(rr=i(s().mark((function t(n){var r,a,o,i,u,c,p,l;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.pool,a=n.txGroup,o=n.initiatorSigner,t.next=3,o([a]);case 3:return i=t.sent,u=A(i,2),c=u[0],p=u[1],l=a.map((function(t,n){return n===nr.FEE_TXN_INDEX?c:n===nr.ASSET_IN_TXN_INDEX?p:e.signLogicSigTransactionObject(t.txn,r.account.lsig).blob})),t.abrupt("return",l);case 9:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function ar(){return(ar=i(s().mark((function t(n){var r,a,o,i,u,c,p,l,d,f,m,h,g,x,A,v,I,w,y,b;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(r=n.client,a=n.quoteAndPool,o=n.swapType,i=n.slippage,u=n.initiatorAddr,c=a.pool,p=a.quote,l=p.assetInID,d=p.assetOutID,f=c.account.address(),(m=[c.asset1ID,c.asset2ID]).includes(l)&&m.includes(d)&&l!==d){t.next=7;break}throw new U({pool:c,quote:p},"Input asset (#".concat(l,") and output asset (#").concat(d,") provided to generate transactions do not belong to the pool ").concat(f,"."));case 7:return t.next=9,r.getTransactionParams().do();case 9:return h=t.sent,g=[te("swap"),o===ne.FixedInput?te("fi"):te("fo")],x=e.makeApplicationNoOpTxnFromObject({sender:f,appIndex:c.validatorAppID,appArgs:g,accounts:[u],note:se.getAppCallTxnNoteWithClientName(ae.V1_1),foreignAssets:c.asset2ID==ge?[c.asset1ID,c.poolTokenID]:[c.asset1ID,c.asset2ID,c.poolTokenID],suggestedParams:h}),A=o===ne.FixedOutput?X("positive",i,p.assetInAmount):p.assetInAmount,v=l===ge?e.makePaymentTxnWithSuggestedParamsFromObject({sender:u,receiver:f,amount:A,suggestedParams:h}):e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:u,receiver:f,assetIndex:l,amount:A,suggestedParams:h}),I=o===ne.FixedInput?X("negative",i,p.assetOutAmount):p.assetOutAmount,w=d===ge?e.makePaymentTxnWithSuggestedParamsFromObject({sender:f,receiver:u,amount:I,suggestedParams:h}):e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:f,receiver:u,assetIndex:d,amount:I,suggestedParams:h}),y=e.makePaymentTxnWithSuggestedParamsFromObject({sender:u,receiver:f,amount:x.fee+w.fee,note:S,suggestedParams:h}),b=e.assignGroupID([y,x,v,w]),t.abrupt("return",[{txn:b[0],signers:[u]},{txn:b[1],signers:[f.toString()]},{txn:b[2],signers:[u]},{txn:b[3],signers:[f.toString()]}]);case 19:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function sr(e){var t=e.pool,n=e.reserves,r=e.assetIn,s=e.decimals;if(t.status!==lt.READY)throw new k(T.NoAvailablePoolError,"There is not an available pool for this asset pair");var o,i,u,c=r.amount;if(r.id===t.asset1ID)o=t.asset2ID,i=n.asset1,u=n.asset2;else{if(r.id!==t.asset2ID)throw new k(T.AssetDoesNotBelongToPoolError,"Input asset (#".concat(r.id,") doesn't belong to the pool ").concat(t.account.address(),"."));o=t.asset1ID,i=n.asset2,u=n.asset1}var p=c*er/tr,l=u-i*u/(i+(c-p));if(l>u)throw new k(T.OutputAmountExceedsAvailableLiquidityError,"Output amount exceeds available liquidity.");var d={assetIn:{amount:c,decimals:s.assetIn},assetOut:{amount:l,decimals:s.assetOut}},f={round:Number(n.round),assetInID:r.id,assetInAmount:c,assetOutID:o,assetOutAmount:l,swapFee:Number(p),rate:Ue(d),priceImpact:je(a({inputSupply:i,outputSupply:u},d))};return{type:_e.Direct,data:{pool:t,quote:f}}}function or(e){return ir.apply(this,arguments)}function ir(){return(ir=i(s().mark((function e(t){var n,r,a,o,i,u,c,p,l,d,f,m,h,g,x,v;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.client,r=t.pool,a=t.signedTxns,o=t.assetIn,i=t.assetOut,u=t.initiatorAddr,e.next=3,ut({client:n,pool:r,accountAddr:u});case 3:return c=e.sent,e.next=6,Y(n,[a]);case 6:return p=e.sent,l=A(p,1),d=l[0],f=d.confirmedRound,m=d.txnID,e.next=13,ut({client:n,pool:r,accountAddr:u});case 13:return h=e.sent,i.id===r.asset1ID?(g=c.excessAsset1,x=h.excessAsset1):(g=c.excessAsset2,x=h.excessAsset2),(v=x-g)<0n&&(v=0n),e.abrupt("return",{round:f,assetInID:o.id,assetInAmount:o.amount,assetOutID:i.id,assetOutAmount:i.amount+v,excessAmount:{assetID:i.id,excessAmountForSwap:v,totalExcessAmount:x},txnID:m});case 18:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ur(e){var t=e.pool,n=e.reserves,r=e.assetOut,a=e.decimals;if(t.status!==lt.READY)throw new k(T.NoAvailablePoolError,"There is not an available pool for this asset pair");var s,o,i,u=r.amount;if(r.id===t.asset1ID)s=t.asset2ID,o=n.asset2,i=n.asset1;else{if(r.id!==t.asset2ID)throw new k(T.AssetDoesNotBelongToPoolError,"Output asset (#".concat(r.id,") doesn't belong to the pool ").concat(t.account.address(),"."));s=t.asset1ID,o=n.asset1,i=n.asset2}if(u>i)throw new k(T.OutputAmountExceedsAvailableLiquidityError,"Output amount exceeds available liquidity.");var c=o*i/(i-u)-o,p=c*tr/(tr-er),l=p-c,d=W(a.assetOut,Number(u))/W(a.assetIn,Number(p)),f=W(a.assetOut,Number(i))/W(a.assetIn,Number(o)),m=z({decimalPlaces:5},Math.abs(d/f-1)),h={round:Number(n.round),assetInID:s,assetInAmount:p,assetOutID:r.id,assetOutAmount:u,swapFee:Number(l),rate:d,priceImpact:m};return{type:_e.Direct,data:{pool:t,quote:h}}}function cr(e){return pr.apply(this,arguments)}function pr(){return(pr=i(s().mark((function e(t){var n,r,a,o,i,u,c,p,l,d,f,m,h,g,x,v;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.client,r=t.pool,a=t.signedTxns,o=t.assetIn,i=t.assetOut,u=t.initiatorAddr,e.next=3,ut({client:n,pool:r,accountAddr:u});case 3:return c=e.sent,e.next=6,Y(n,[a]);case 6:return p=e.sent,l=A(p,1),d=l[0],f=d.confirmedRound,m=d.txnID,e.next=13,ut({client:n,pool:r,accountAddr:u});case 13:return h=e.sent,o.id===r.asset1ID?(g=c.excessAsset1,x=h.excessAsset1):(g=c.excessAsset2,x=h.excessAsset2),(v=x-g)<0n&&(v=0n),e.abrupt("return",{round:f,assetInID:o.id,assetInAmount:o.amount-v,assetOutID:i.id,assetOutAmount:i.amount,excessAmount:{assetID:o.id,excessAmountForSwap:v,totalExcessAmount:x},txnID:m});case 18:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function lr(){return(lr=i(s().mark((function e(t){var n,r,o,i,u,c,p,l,d,f,m,h,g,x,A,v;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=t.client,r=t.pool,o=t.swapType,i=t.txGroup,u=t.signedTxns,c=t.initiatorAddr,r.status===lt.READY){e.next=3;break}throw new U({pool:r,swapType:o,txGroup:i},"There is not an available pool for this asset pair");case 3:if(e.prev=3,g={id:Number(null===(p=i[nr.ASSET_IN_TXN_INDEX].txn.assetConfig)||void 0===p?void 0:p.assetIndex)||ge,amount:null!==(l=null===(d=i[nr.ASSET_IN_TXN_INDEX].txn.payment)||void 0===d?void 0:d.amount)&&void 0!==l?l:0n},x={id:Number(null===(f=i[nr.ASSET_OUT_TXN_INDEX].txn.assetConfig)||void 0===f?void 0:f.assetIndex)||ge,amount:null!==(m=null===(h=i[nr.ASSET_OUT_TXN_INDEX].txn.payment)||void 0===h?void 0:h.amount)&&void 0!==m?m:0n},o!==ne.FixedInput){e.next=12;break}return e.next=9,or({client:n,pool:r,signedTxns:u,assetIn:g,assetOut:x,initiatorAddr:c});case 9:A=e.sent,e.next=15;break;case 12:return e.next=14,cr({client:n,pool:r,signedTxns:u,assetIn:g,assetOut:x,initiatorAddr:c});case 14:A=e.sent;case 15:return e.abrupt("return",a(a({},A),{},{groupID:Z(i),fees:$(i)}));case 18:throw e.prev=18,e.t0=e.catch(3),"SlippageTolerance"===(v=new U(e.t0,"We encountered something unexpected while swapping. Try again later.")).type&&v.setMessage("The swap failed due to too much slippage in the price. Please adjust the slippage tolerance and try again."),v;case 23:case"end":return e.stop()}}),e,null,[[3,18]])})))).apply(this,arguments)}var dr={getQuote:function(e,t,n,r,a){return e===ne.FixedInput?sr({pool:t,reserves:n,assetIn:r,decimals:a}):ur({pool:t,reserves:n,assetOut:r,decimals:a})},getFixedInputSwapQuote:sr,getFixedOutputSwapQuote:ur,generateTxns:function(e){return ar.apply(this,arguments)},signTxns:function(e){return rr.apply(this,arguments)},execute:function(e){return lr.apply(this,arguments)},executeFixedOutputSwap:cr};function fr(e){return Promise.allSettled(e).then((function(e){if(e.every((function(e){return"rejected"===e.status}))){var t=A(e.map((function(e){return e.reason})),2),n=t[0],r=t[1];if(We(n)&&!We(r))throw n;throw r}return e.filter((function(e){return"fulfilled"===e.status&&e.value})).map((function(e){return e.value}))}))}function mr(){return(mr=i(s().mark((function e(t){var n,r,a,o,i,u,c,p,l;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=t.amount,a=t.assetIn,o=t.assetOut,i=t.pools,u=[],(c=i.find((function(e){return e.info.contractVersion===ae.V1_1})))?u.push(new Promise((function(e,t){try{e(dr.getFixedInputSwapQuote({pool:c.info,assetIn:{amount:r,id:Number(a.id)},decimals:{assetIn:a.decimals,assetOut:o.decimals},reserves:c.reserves}))}catch(e){t(e)}}))):u.push(Promise.reject(new k(T.NoAvailablePoolError,"Trying to swap from non-existent pool"))),p=i.find((function(e){return e.info.contractVersion===ae.V2})),u.push(qn.getFixedInputSwapQuote({amount:r,assetIn:{id:Pe(a),decimals:a.decimals},assetOut:{id:Pe(o),decimals:o.decimals},pool:null!==(n=null==p?void 0:p.info)&&void 0!==n?n:null,network:t.network,slippage:t.slippage})),e.next=8,fr(u);case 8:return l=e.sent,e.abrupt("return",Xe(l));case 10:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function hr(){return(hr=i(s().mark((function e(t){var n,r,a,o,i,u,c,p,l;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=t.amount,a=t.assetIn,o=t.assetOut,i=t.pools,u=[],(c=i.find((function(e){return e.info.contractVersion===ae.V1_1})))?u.push(new Promise((function(e,t){try{e(dr.getFixedOutputSwapQuote({pool:c.info,assetOut:{amount:r,id:Number(o.id)},decimals:{assetIn:a.decimals,assetOut:o.decimals},reserves:c.reserves}))}catch(e){t(e)}}))):u.push(Promise.reject(new k(T.NoAvailablePoolError,"Trying to swap from non-existent pool"))),p=i.find((function(e){return e.info.contractVersion===ae.V2})),u.push(qn.getFixedOutputSwapQuote({amount:r,assetIn:{id:Pe(a),decimals:a.decimals},assetOut:{id:Pe(o),decimals:o.decimals},pool:null!==(n=null==p?void 0:p.info)&&void 0!==n?n:null,network:t.network,slippage:t.slippage})),e.next=8,fr(u);case 8:return l=e.sent,e.abrupt("return",Xe(l));case 10:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var gr=l(l(l(l(l(l({},ae.V1_1,dr),ae.V2,qn),"getQuote",(function(e){var t=e.type;if(t===ne.FixedInput)return function(e){return mr.apply(this,arguments)}(e);if(t===ne.FixedOutput)return function(e){return hr.apply(this,arguments)}(e);throw new k(T.InvalidSwapTypeError,"Invalid swap type")})),"generateTxns",(function(e){return e.quote.type===_e.Direct&&Qe(e.quote)===ae.V1_1?dr.generateTxns(a(a({},e),{},{quoteAndPool:e.quote.data})):qn.generateTxns(e)})),"signTxns",(function(e){if(e.quote.type===_e.Direct&&Qe(e.quote)===ae.V1_1){var t=e.quote.data.pool;return dr.signTxns(a(a({},e),{},{pool:t}))}return qn.signTxns(e)})),"execute",(function(e){return e.contractVersion===ae.V1_1?dr.execute(e):qn.execute(e)}));function xr(){return(xr=i(s().mark((function e(t){var n,r,a,o,i,u,c,p,l,d;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.client,r=t.pool,a=t.txGroup,o=t.initiatorSigner,e.prev=1,e.next=4,Ar({txGroup:a,pool:r,initiatorSigner:o});case 4:return i=e.sent,e.next=7,Y(n,[i]);case 7:return u=e.sent,c=A(u,1),p=c[0],l=p.txnID,d=p.confirmedRound,e.abrupt("return",{fees:$(a),confirmedRound:d,txnID:l,groupID:Z(a)});case 15:throw e.prev=15,e.t0=e.catch(1),new U(e.t0,"We encountered something unexpected while redeeming. Try again later.");case 18:case"end":return e.stop()}}),e,null,[[1,15]])})))).apply(this,arguments)}function Ar(e){return vr.apply(this,arguments)}function vr(){return(vr=i(s().mark((function t(n){var r,a,o,i,u,c,p,l;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.txGroup,a=n.pool,o=n.initiatorSigner,t.next=3,o([r]);case 3:return i=t.sent,u=A(i,1),c=u[0],p=a.account.lsig,l=r.map((function(t,n){return 0===n?c:e.signLogicSigTransactionObject(t.txn,p).blob})),t.abrupt("return",l);case 9:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function Ir(){return Ir=i(s().mark((function t(n){var r,a,o,u,c,p;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.client,a=n.data,o=n.initiatorSigner,t.prev=1,u=a.map((function(e){var t=e.txGroup,n=e.pool;return{txns:t,txnFees:$(t),groupID:Z(t),lsig:n.account.lsig}})),t.next=5,o(u.map((function(e){return e.txns})));case 5:return c=t.sent,p=Promise.all(u.map((function(t,n){return new Promise(function(){var a=i(s().mark((function a(o,i){var u,p,l,d,f,m;return s().wrap((function(a){for(;;)switch(a.prev=a.next){case 0:return a.prev=0,u=t.txns.map((function(r,a){return 0===a?c[n]:e.signLogicSigTransactionObject(r.txn,t.lsig).blob})),a.next=4,Y(r,[u]);case 4:p=a.sent,l=A(p,1),d=l[0],f=d.txnID,m=d.confirmedRound,o({fees:t.txnFees,groupID:t.groupID,txnID:f,confirmedRound:m}),a.next=15;break;case 12:a.prev=12,a.t0=a.catch(0),i(a.t0);case 15:case"end":return a.stop()}}),a,null,[[0,12]])})));return function(e,t){return a.apply(this,arguments)}}())}))),t.abrupt("return",p);case 10:throw t.prev=10,t.t0=t.catch(1),new U(t.t0,"We encountered something unexpected while redeeming. Try again later.");case 13:case"end":return t.stop()}}),t,null,[[1,10]])}))),Ir.apply(this,arguments)}function wr(){return(wr=i(s().mark((function t(n){var r,a,o,i,u,c,p,l,d,f,m;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.client,a=n.pool,o=n.assetID,i=n.assetOut,u=n.initiatorAddr,t.next=3,r.getTransactionParams().do();case 3:return c=t.sent,p=a.account.address(),l=e.makeApplicationNoOpTxnFromObject({sender:p,appIndex:a.validatorAppID,appArgs:[te("redeem")],note:se.getAppCallTxnNoteWithClientName(a.contractVersion),accounts:[u],foreignAssets:0==a.asset2ID?[a.asset1ID,a.poolTokenID]:[a.asset1ID,a.asset2ID,a.poolTokenID],suggestedParams:c}),d=0===o?e.makePaymentTxnWithSuggestedParamsFromObject({sender:p,receiver:u,amount:i,suggestedParams:c}):e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:p,receiver:u,assetIndex:o,amount:i,suggestedParams:c}),f=e.makePaymentTxnWithSuggestedParamsFromObject({sender:u,receiver:p,amount:l.fee+d.fee,note:S,suggestedParams:c}),m=e.assignGroupID([f,l,d]),t.abrupt("return",[{txn:m[0],signers:[u]},{txn:m[1],signers:[p.toString()]},{txn:m[2],signers:[p.toString()]}]);case 10:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function yr(e){var t,n={},r=y(e);try{for(r.s();!(t=r.n()).done;){var a=t.value,s=(new TextDecoder).decode(Buffer.from(a.key,"base64")),o=void 0;o=1===a.value.type?a.value.bytes:a.value.uint,n[s]=o}}catch(e){r.e(e)}finally{r.f()}return n}function br(e,t,n){return e*t/n}var Tr=BigInt(31536e3),kr=BigInt(1e14),Sr=BigInt(1e16),Pr={testnet:548587153,mainnet:1385499515},_r=14;function Er(e){return Dr.apply(this,arguments)}function Dr(){return(Dr=i(s().mark((function t(n){var r,a,o,i,u,c;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.client,a=n.network,o=n.assetIDs,i=e.getApplicationAddress(Pr[a]),t.next=4,r.accountInformation(i).do();case 4:return u=t.sent,c=u.assets?u.assets.map((function(e){return e.assetId})):[],t.abrupt("return",o.filter((function(e){return e!==ge&&!c.includes(BigInt(e))})));case 7:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function Nr(){return(Nr=i(s().mark((function t(n){var r,a,o,i,u,c,p,l,d,f,m,h,g,x,I,w,y,b,T,k,S,P,E;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.client,a=n.network,o=n.poolAddress,i=n.poolTokenId,u=n.lendingManagerId,c=n.asset1In,p=n.asset2In,l=n.initiatorAddr,d=e.getApplicationAddress(Pr[a]),t.next=4,r.getTransactionParams().do();case 4:return f=t.sent,m=[c,p].sort((function(e,t){return t.fAssetId-e.fAssetId})),h=A(m,2),g=h[0],x=h[1],I=Se(x.id),w=e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:l,receiver:d,assetIndex:g.id,amount:g.amount,suggestedParams:f}),y=I?e.makePaymentTxnWithSuggestedParamsFromObject({sender:l,receiver:d,amount:x.amount,suggestedParams:f}):e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:l,receiver:d,assetIndex:x.id,amount:x.amount,suggestedParams:f}),(b=e.makeApplicationNoOpTxnFromObject({sender:l,appIndex:Pr[a],appArgs:[te("add_liquidity"),e.decodeAddress(o).publicKey,e.encodeUint64(g.lendingAppId),e.encodeUint64(x.lendingAppId)],foreignAssets:[g.id,x.id,g.fAssetId,x.fAssetId],foreignApps:[g.lendingAppId,x.lendingAppId,u],accounts:[o],suggestedParams:f})).fee=f.minFee*BigInt(_r+1),T=Ye(a,ae.V2),k=e.makeApplicationNoOpTxnFromObject({sender:l,appIndex:Pr[a],appArgs:[te("noop")],foreignAssets:[i],foreignApps:[T],accounts:[o],suggestedParams:f}),S=[w,y,b,k],t.next=16,Er({client:r,network:a,assetIDs:[g.id,x.id,g.fAssetId,x.fAssetId,i]});case 16:return(P=t.sent).length&&((E=[e.makePaymentTxnWithSuggestedParamsFromObject({sender:l,receiver:d,amount:_*BigInt(P.length),suggestedParams:f}),e.makeApplicationNoOpTxnFromObject({sender:l,appIndex:Pr[a],appArgs:[te("asset_optin")].concat(v(P.map((function(t){return e.encodeUint64(t)})))),foreignAssets:v(P),suggestedParams:f})])[1].fee=BigInt(P.length+1)*f.minFee,S.unshift.apply(S,E)),t.abrupt("return",e.assignGroupID(S).map((function(e){return{txn:e,signers:[l]}})));case 19:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function Or(){return(Or=i(s().mark((function t(n){var r,a,o,i,u,c,p,l,d,f,m,h,g,x,A,v,I;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.client,a=n.pool,o=n.poolTokenIn,i=n.initiatorAddr,u=n.asset1Out,c=n.asset2Out,p=n.lendingManagerId,l=n.network,d=e.getApplicationAddress(Pr[l]),t.next=4,r.getTransactionParams().do();case 4:if(f=t.sent,m=a.account.address(),h=a.poolTokenID){t.next=9;break}throw new Error("Pool token asset ID is missing");case 9:return g=e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:i,receiver:d,assetIndex:h,amount:o,suggestedParams:f}),(x=e.makeApplicationNoOpTxnFromObject({sender:i,appIndex:Pr[l],appArgs:[te("remove_liquidity"),m.publicKey,e.encodeUint64(u.lendingAppId),e.encodeUint64(c.lendingAppId)],accounts:[m],foreignAssets:[u.id,c.id,u.fAssetId,c.fAssetId],foreignApps:[u.lendingAppId,c.lendingAppId,p],suggestedParams:f})).fee=f.minFee*BigInt(_r+1),A=Ye(l,ae.V2),v=e.makeApplicationNoOpTxnFromObject({sender:i,appIndex:Pr[l],appArgs:[te("noop")],accounts:[m],foreignAssets:[h,u.fAssetId,c.fAssetId],foreignApps:[A],suggestedParams:f}),I=e.assignGroupID([g,x,v]),t.abrupt("return",I.map((function(e){return{txn:e,signers:[i]}})));case 16:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function Br(e,t,n){var r=BigInt(Math.floor((new Date).getTime()/1e3)-function(e){return null!=e?e:Math.floor((new Date).getTime()/1e3)}(n));return br(e,Sr+t*r/Tr,Sr)}function Cr(){return(Cr=i(s().mark((function e(t,n){var r,a,o,i,u,c,p,l,d;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t.getApplicationByID(n).do();case 2:return a=e.sent,o=null!==(r=a.params.globalState)&&void 0!==r?r:[],i=yr(o),u=Number(Buffer.from(i.pm,"base64").readBigUInt64BE(0)),c=Buffer.from(i.i,"base64"),p=c.readBigUInt64BE(32),l=c.readBigUInt64BE(40),d=Number(c.readBigUInt64BE(48)),e.abrupt("return",{appId:n,managerAppId:u,depositInterestRate:p,depositInterestIndex:l,lastUpdate:d});case 11:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var Fr={AddLiquidity:Object.freeze({__proto__:null,generateTxns:function(e){return Nr.apply(this,arguments)},getAddLiquidityTotalFee:function(e,t){return e*BigInt(4+_r)+(t?BigInt(t+1)*e+BigInt(t)*_:0n)}}),RemoveLiquidity:Object.freeze({__proto__:null,generateTxns:function(e){return Or.apply(this,arguments)},getRemoveLiquidityTotalFee:function(e){return e*BigInt(3+_r)}}),calculateWithdrawReturn:function(e){var t=e.withdrawAmount,n=Br(e.depositInterestIndex,e.depositInterestRate,e.lastUpdate);return br(BigInt(t),n,kr)},calculateDepositReturn:function(e){var t=e.depositAmount,n=Br(e.depositInterestIndex,e.depositInterestRate,e.lastUpdate);return t*kr/n},getFolksWrapperAppOptInRequiredAssetIDs:Er};function Lr(t){var n=t.suggestedParams,r=t.stakingAppID,a=t.initiatorAddr,s=t.liquidityAssetID,o=t.program,i=t.amount,u=e.encodeUint64(i),c=e.encodeUint64(o.id);return e.makeApplicationNoOpTxnFromObject({appIndex:r,sender:a,suggestedParams:n,foreignAssets:[s],accounts:[o.accountAddress],appArgs:[te("commit"),u],note:V(te("tinymanStaking/v1:b"),c,e.encodeUint64(s),u)})}function Rr(){return(Rr=i(s().mark((function t(n){var r,a,o,i,u,c,p,l,d,f,m;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.client,a=n.stakingAppID,o=n.program,i=n.requiredAssetID,u=n.liquidityAssetID,c=n.amount,p=n.initiatorAddr,t.next=3,r.getTransactionParams().do();case 3:if(l=t.sent,d=Lr({suggestedParams:l,stakingAppID:a,program:o,liquidityAssetID:u,initiatorAddr:p,amount:c}),f=[d],"number"!=typeof i){t.next=10;break}return m=e.makeApplicationNoOpTxnFromObject({appIndex:a,sender:p,suggestedParams:l,foreignAssets:[i],accounts:[o.accountAddress],appArgs:[te("log_balance")]}),f=e.assignGroupID([d,m]),t.abrupt("return",[{txn:f[0],signers:[p]},{txn:f[1],signers:[p]}]);case 10:return t.abrupt("return",[{txn:f[0],signers:[p]}]);case 11:case"end":return t.stop()}}),t)})))).apply(this,arguments)}var Mr=604800,Ur=1e3,jr={testnet:480164661,mainnet:2200606875},Vr={testnet:360907790,mainnet:2200609638},Gr={testnet:336189106,mainnet:2200608153},Qr={testnet:383416252,mainnet:2200608887},qr=2500,Xr=400,Wr=604800,zr=te("p"),Jr=te("a"),Kr=24,Yr=111300,Hr=qr+Xr*(41+Kr),$r=function(e){return e[e.Against=0]="Against",e[e.For=1]="For",e[e.Abstain=2]="Abstain",e}($r||{}),Zr=new Uint8Array(34);function ea(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:8,n=new Uint8Array(t),r=BigInt(e),a=t-1;a>=0;a--)n[a]=Number(r&BigInt(255)),r>>=BigInt(8);return n}function ta(e,t){return 0===Buffer.compare(e,t)}function na(e){for(var t=0n,n=0;n=255)throw new TypeError("Alphabet too long");for(var n=new Uint8Array(256),r=0;r>>0,o=new Uint8Array(s);e[t];){var p=n[e.charCodeAt(t)];if(255===p)return;for(var l=0,d=s-1;(0!==p||l>>0,o[d]=p%256>>>0,p=p/256>>>0;if(0!==p)throw new Error("Non-zero carry");a=l,t++}if(" "!==e[t]){for(var f=s-a;f!==s&&0===o[f];)f++;for(var m=new Uint8Array(r+(s-f)),h=r;f!==s;)m[h++]=o[f++];return m}}}return{encode:function(t){if(t instanceof Uint8Array||(ArrayBuffer.isView(t)?t=new Uint8Array(t.buffer,t.byteOffset,t.byteLength):Array.isArray(t)&&(t=Uint8Array.from(t))),!(t instanceof Uint8Array))throw new TypeError("Expected Uint8Array");if(0===t.length)return"";for(var n=0,r=0,a=0,s=t.length;a!==s&&0===t[a];)a++,n++;for(var o=(s-a)*p+1>>>0,c=new Uint8Array(o);a!==s;){for(var l=t[a],d=0,f=o-1;(0!==l||d>>0,c[f]=l%i>>>0,l=l/i>>>0;if(0!==l)throw new Error("Non-zero carry");r=d,a++}for(var m=o-r;m!==o&&0===c[m];)m++;for(var h=u.repeat(n);mra(a(e))})}function fa({name:e,prefix:t,bitsPerChar:n,alphabet:r}){return la({prefix:t,name:e,encode:e=>function(e,t,n){const r="="===t[t.length-1],a=(1<n;)o-=n,s+=t[a&i>>o];if(0!==o&&(s+=t[a&i<function(e,t,n,r){const a={};for(let e=0;e=8&&(i-=8,o[c++]=255&u>>i)}if(i>=n||0!=(255&u<<8-i))throw new SyntaxError("Unexpected end of data");return o}(t,r,n,e)})}const ma=fa({prefix:"b",name:"base32",alphabet:"abcdefghijklmnopqrstuvwxyz234567",bitsPerChar:5});fa({prefix:"B",name:"base32upper",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",bitsPerChar:5}),fa({prefix:"c",name:"base32pad",alphabet:"abcdefghijklmnopqrstuvwxyz234567=",bitsPerChar:5}),fa({prefix:"C",name:"base32padupper",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=",bitsPerChar:5}),fa({prefix:"v",name:"base32hex",alphabet:"0123456789abcdefghijklmnopqrstuv",bitsPerChar:5}),fa({prefix:"V",name:"base32hexupper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUV",bitsPerChar:5}),fa({prefix:"t",name:"base32hexpad",alphabet:"0123456789abcdefghijklmnopqrstuv=",bitsPerChar:5}),fa({prefix:"T",name:"base32hexpadupper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUV=",bitsPerChar:5}),fa({prefix:"h",name:"base32z",alphabet:"ybndrfg8ejkmcpqxot1uwisza345h769",bitsPerChar:5});const ha=da({prefix:"k",name:"base36",alphabet:"0123456789abcdefghijklmnopqrstuvwxyz"});da({prefix:"K",name:"base36upper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"});const ga=da({name:"base58btc",prefix:"z",alphabet:"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"});da({name:"base58flickr",prefix:"Z",alphabet:"123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"});var xa=function e(t,n,r){n=n||[];var a=r=r||0;for(;t>=Ia;)n[r++]=255&t|Aa,t/=128;for(;t&va;)n[r++]=255&t|Aa,t>>>=7;return n[r]=0|t,e.bytes=r-a+1,n},Aa=128,va=-128,Ia=Math.pow(2,31);var wa=function e(t,n){var r,a=0,s=0,o=n=n||0,i=t.length;do{if(o>=i)throw e.bytes=0,new RangeError("Could not decode varint");r=t[o++],a+=s<28?(r&ba)<=ya);return e.bytes=o-n,a},ya=128,ba=127;var Ta=Math.pow(2,7),ka=Math.pow(2,14),Sa=Math.pow(2,21),Pa=Math.pow(2,28),_a=Math.pow(2,35),Ea=Math.pow(2,42),Da=Math.pow(2,49),Na=Math.pow(2,56),Oa=Math.pow(2,63),Ba={encode:xa,decode:wa,encodingLength:function(e){return e{const[n,r]=Ca(e.subarray(t));return t+=r,n};let r=n(),a=Qa;if(18===r?(r=0,t=0):a=n(),0!==r&&1!==r)throw new RangeError(`Invalid CID version ${r}`);const s=t,o=n(),i=n(),u=t+i;return{version:r,codec:a,multihashCode:o,digestSize:i,multihashSize:u-s,size:u}}static parse(e,t){const[n,r]=function(e,t){switch(e[0]){case"Q":{const n=t??ga;return[ga.prefix,n.decode(`${ga.prefix}${e}`)]}case ga.prefix:{const n=t??ga;return[ga.prefix,n.decode(e)]}case ma.prefix:{const n=t??ma;return[ma.prefix,n.decode(e)]}case ha.prefix:{const n=t??ha;return[ha.prefix,n.decode(e)]}default:if(null==t)throw Error("To parse non base32, base36 or base58btc encoded CID multibase decoder must be provided");return[e[0],t.decode(e)]}}(e,t),a=Ga.decode(r);if(0===a.version&&"Q"!==e[0])throw Error("Version 0 CID string must not include multibase prefix");return Va(a).set(n,e),a}}const Qa=112,qa=18;function Xa(e,t,n){const r=La(e),a=r+La(t),s=new Uint8Array(a+n.byteLength);return Fa(e,s,0),Fa(t,s,r),s.set(n,a),s}const Wa=Symbol.for("@ipld/js-cid/CID");class za{name;code;encode;constructor(e,t,n){this.name=e,this.code=t,this.encode=n}digest(e){if(e instanceof Uint8Array){const t=this.encode(e);return t instanceof Uint8Array?Ra(this.code,t):t.then((e=>Ra(this.code,e)))}throw Error("Unknown type, must be binary type")}}const Ja=85,Ka=function({name:e,code:t,encode:n}){return new za(e,t,n)}({name:"sha2-256",code:18,encode:e=>ra(n.createHash("sha256").update(e).digest())});var Ya=126144e3,Ha=1e7,$a=Math.pow(2,64),Za=48,es=21,ts=48,ns=te("tp"),rs=te("sc"),as=28100,ss=12900,os=421700,is=409700;function us(e){var t=e/Wr;return(arguments.length>1&&void 0!==arguments[1]&&arguments[1]?Math.floor(t):Math.ceil(t))*Wr}function cs(e,t){if(e>t)throw new Error("Old timestamp must be less than or equal to new timestamp");for(var n=[],r=us(e)+Wr;re?r=t?e*e*$a/(2*t):0:r=(e+(e-r))*n/2;return r}function gs(e,t){return xs.apply(this,arguments)}function xs(){return(xs=i(s().mark((function e(t,n){var r;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t.getApplicationByID(n).do();case 2:return r=e.sent,e.abrupt("return",As(r));case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function As(e){var t,n,r={},a=y(null!==(t=e.params.globalState)&&void 0!==t?t:[]);try{for(a.s();!(n=a.n()).done;){var s=n.value,o=Buffer.from(s.key).toString(),i=void 0;i=1===s.value.type?s.value.bytes:s.value.uint,r[o]=i}}catch(e){a.e(e)}finally{a.f()}return r}function vs(){return(vs=i(s().mark((function e(t){var n,r,a;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=(new TextEncoder).encode(t),e.next=3,Ka.digest(n);case 3:return r=e.sent,a=Ga.createV1(Ja,r),e.abrupt("return",a.toString(ma));case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Is(){for(var t=arguments.length,n=new Array(t),r=0;r0?es-e:0}},{key:"lastAccountPowerBoxIndex",get:function(){return Ms(BigInt(this.powerCount))[0]}},{key:"lastAccountPowerArrayIndex",get:function(){return Ms(BigInt(this.powerCount))[1]}}])}(),Ds=function(){return p((function e(t,n,r,a){u(this,e),this.bias=t,this.timestamp=n,this.slope=r,this.cumulativePower=a}),[{key:"lockEndTimestamp",get:function(){var e=this.bias*Math.pow(2,64)/this.slope;return this.timestamp+e}},{key:"cumulativePowerAt",value:function(e){var t=e-this.timestamp;if(t<0)throw new Error("Time delta must be greater than or equal to 0");return this.cumulativePower+hs(this.bias,this.slope,t)}}])}(),Ns=p((function e(t,n,r,a){u(this,e),this.bias=t,this.timestamp=n,this.slope=r,this.cumulativePower=a})),Os=p((function e(t){u(this,e),this.slopeDelta=t})),Bs=function(){return p((function e(t,n,r,a){u(this,e),this.totalLockedAmount=t,this.totalPowerCount=n,this.lastTotalPowerTimestamp=Number(r),this.tinyAssetId=Number(a)}),[{key:"freeTotalPowerSpaceCount",get:function(){var e=Number(this.totalPowerCount%BigInt(es));return e>0?es-e:0}},{key:"lastTotalPowerBoxIndex",get:function(){return Ms(this.totalPowerCount)[0]}},{key:"lastTotalPowerArrayIndex",get:function(){return Ms(this.totalPowerCount)[1]}}])}();function Cs(){return(Cs=i(s().mark((function e(t,n,r){var a,o;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a=Ls(r),e.prev=1,e.next=4,ps(t,n,a);case 4:if(!(o=e.sent)){e.next=7;break}return e.abrupt("return",Fs(o));case 7:return e.abrupt("return",null);case 10:return e.prev=10,e.t0=e.catch(1),console.log(e.t0),e.abrupt("return",null);case 14:case"end":return e.stop()}}),e,null,[[1,10]])})))).apply(this,arguments)}function Fs(e){var t=Buffer.from(e);return new Es(t.readUIntBE(0,8),t.readUIntBE(8,8),t.readUIntBE(16,8),t.readUIntBE(24,8))}function Ls(t){return e.decodeAddress(t).publicKey}function Rs(e){var t=ea(e),n=new Uint8Array(ns.length+t.length);return n.set(ns,0),n.set(t,ns.length),n}function Ms(e){var t=e-1n;return[Number(t/BigInt(es)),Number(t%BigInt(es))]}function Us(t,n){var r=e.decodeAddress(t).publicKey,a=ea(n),s=new Uint8Array(r.length+a.length);return s.set(r,0),s.set(a,r.length),s}function js(e,t,n){return Vs.apply(this,arguments)}function Vs(){return(Vs=i(s().mark((function e(t,n,r){var a,o;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a=Qs(r),e.next=3,ps(t,n,a);case 3:if(o=e.sent){e.next=6;break}return e.abrupt("return",null);case 6:return e.abrupt("return",Gs(o));case 7:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Gs(t){return new Os(Number(e.bytesToBigInt(t.slice(t.length-16,t.length))))}function Qs(e){return V(rs,ea(e))}function qs(e,t,n){return Xs.apply(this,arguments)}function Xs(){return(Xs=i(s().mark((function e(t,n,r){var a,o,i,u,c;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:a=0,r&&(a=Number((r+BigInt(es-1))/BigInt(es))),o=[],i=0;case 4:if(!(i=e[r].timestamp))break;n=r}return n}function Ys(e){for(var t,n=Za,r=[],a=0;a=11)throw new Error("Boxes' length cannot be larger than 10");var b=d.slice(0,6),T=[e.makeApplicationNoOpTxnFromObject({sender:s,suggestedParams:c,appIndex:n,appArgs:[te("claim_rewards"),ea(o),ea(i),V.apply(void 0,v(u.map((function(e){return ea(e)}))))],foreignApps:[r],foreignAssets:[a],boxes:b,note:l?te(l):void 0})];T[0].fee=T[0].fee*BigInt(i+2);var k=0,S=92+865*i,P=700+700*i;if(S>P&&(k=Math.floor((S-P)/666)+1),k||d.length>6){var _=d.slice(6),E=xo({sender:s,suggestedParams:c,extraAppArgs:[ea(Math.max(k-1,0))],index:n,foreignApps:[r],boxes:_});E.fee*=BigInt(Math.max(k,1)),T.unshift(E)}if(p){var D=e.makePaymentTxnWithSuggestedParamsFromObject({sender:s,receiver:e.getApplicationAddress(n),amount:ro,suggestedParams:c});T.unshift(D)}return e.assignGroupID(T)}var vo=8,Io=te("p"),wo=te("a"),yo=te("v"),bo=28500,To=12500,ko=p((function e(t,n,r,a,s,o,i){u(this,e),this.index=t,this.creationTimestamp=n,this.votingStartTimestamp=r,this.votingEndTimestamp=a,this.votingPower=s,this.voteCount=o,this.isCancelled=i}));function So(t,n){return V(wo,e.decodeAddress(t).publicKey,ea(n))}function Po(e){return new ko(na(e.slice(0,8)),na(e.slice(8,16)),na(e.slice(16,24)),na(e.slice(24,32)),na(e.slice(32,40)),na(e.slice(40,48)),Boolean(na(e.slice(48,49))))}function _o(){return(_o=i(s().mark((function e(t,n,r){var a,o;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a=ks(r),e.next=3,ps(t,n,a);case 3:if(o=e.sent){e.next=6;break}return e.abrupt("return",null);case 6:return e.abrupt("return",Po(o));case 7:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Eo(t){var n=t.stakingVotingAppId,r=t.vaultAppId,a=t.sender,s=t.proposalId,o=t.proposal,i=t.votes,u=t.assetIds,c=t.accountPowerIndex,p=t.appBoxNames,l=t.suggestedParams,d=t.appCallNote,f=void 0===d?null:d;if(i.length!==u.length)throw new Error("The number of votes must be equal to the number of asset ids");if(u.length>vo)throw new Error("You cannot cast vote for more than ".concat(vo," different pools"));if(100!==i.reduce((function(e,t){return e+t}),0))throw new Error("The sum of the votes must equal 100%");var m,h=V.apply(void 0,v(i.map((function(e){return ea(e)})))),g=V.apply(void 0,v(u.map((function(e){return ea(e)})))),x=function(e){return V(Io,te(e))}(s),A=So(a,Math.floor(o.index/8192)),I=!p.some((function(e){return ta(e,A)})),w=Ls(a),b=Math.floor(c/es),T=Us(a,b),k=Us(a,b+1),S=0,P=[],_=y(u);try{var E=function(){var e=m.value,t=function(e,t){return V(yo,ea(e),ea(t))}(o.index,e);P.push({appIndex:n,name:t}),p.some((function(e){return ta(e,t)}))||(S+=1)};for(_.s();!(m=_.n()).done;)E()}catch(e){_.e(e)}finally{_.f()}var D=[{appIndex:n,name:x},{appIndex:n,name:A}].concat(P,[{appIndex:r,name:w},{appIndex:r,name:T},{appIndex:r,name:k}]),N=[e.makeApplicationNoOpTxnFromObject({sender:a,suggestedParams:l,appIndex:n,appArgs:[te("cast_vote"),te(s),h,g,ea(c)],foreignApps:[r],boxes:D.slice(0,7),note:f?te(f):void 0})];N[0].fee*=2n,D.length>=7&&N.push(xo({sender:a,suggestedParams:l,index:r,foreignApps:[n],boxes:D.slice(7,14)})),D.length>=14&&N.push(xo({sender:a,suggestedParams:l,index:r,foreignApps:[n],boxes:D.slice(14)}));var O=Number(I)*bo+S*To;return O&&(N=[e.makePaymentTxnWithSuggestedParamsFromObject({sender:a,receiver:e.getApplicationAddress(n),suggestedParams:l,amount:O})].concat(v(N))),e.assignGroupID(N)}function Do(t){var n=t.accountState,r=t.lockEndTime,a=t.lockedAmount,s=t.network,o=t.sender,i=t.vaultAppGlobalState,u=t.suggestedParams,c=t.slopeChangeAtLockEndTime,p=t.appCallNote;if(ai.freeTotalPowerSpaceCount&&(T+=is),c||(T+=ss);var k=[e.makeAssetTransferTxnWithSuggestedParamsFromObject({amount:a,assetIndex:ve[s],sender:o,receiver:e.getApplicationAddress(l),suggestedParams:u}),e.makeApplicationNoOpTxnFromObject({appIndex:l,sender:o,suggestedParams:u,appArgs:[te("create_lock"),ea(r)],boxes:d.slice(0,8),note:p}),xo({sender:o,suggestedParams:u,index:l,boxes:d.slice(8)})];if(T){var S=e.makePaymentTxnWithSuggestedParamsFromObject({sender:o,receiver:e.getApplicationAddress(l),amount:T,suggestedParams:u});k.unshift(S)}return e.assignGroupID(k)}function No(t){var n=t.accountState,r=t.lockedAmount,a=t.network,s=t.sender,o=t.vaultAppGlobalState,i=t.suggestedParams,u=t.appCallNote;if(ro.freeTotalPowerSpaceCount&&(I+=is),!n.freeAccountPowerSpaceCount){var w=Us(s,n.lastAccountPowerBoxIndex+1);h.push({appIndex:jr[a],name:w}),I+=os}var b=[e.makeAssetTransferTxnWithSuggestedParamsFromObject({assetIndex:ve[a],sender:s,receiver:e.getApplicationAddress(jr[a]),amount:r,suggestedParams:i}),e.makeApplicationNoOpTxnFromObject({appIndex:jr[a],sender:s,suggestedParams:i,appArgs:[te("increase_lock_amount")],boxes:h,note:u}),xo({sender:s,suggestedParams:i,index:jr[a]})];if(I){var T=e.makePaymentTxnWithSuggestedParamsFromObject({sender:s,receiver:e.getApplicationAddress(jr[a]),amount:I,suggestedParams:i});b.unshift(T)}return e.assignGroupID(b)}function Oo(t){var n=t.accountState,r=t.network,a=t.newLockEndTime,s=t.slopeChangeAtNewLockEndTime,o=t.sender,i=t.vaultAppGlobalState,u=t.suggestedParams,c=t.appCallNote;if(a%Wr)throw new Error("Invalid lock end time");if(a<=n.lockEndTime)throw new Error("New lock end time must be greater than current lock end time");var p=Ls(o),l=Us(o,n.lastAccountPowerBoxIndex),d=Rs(i.lastTotalPowerBoxIndex),f=Rs(i.lastTotalPowerBoxIndex+1),m=Qs(n.lockEndTime),h=Qs(a),g=[{appIndex:jr[r],name:p},{appIndex:jr[r],name:l},{appIndex:jr[r],name:d},{appIndex:jr[r],name:f},{appIndex:jr[r],name:m},{appIndex:jr[r],name:h}];if(!n.freeAccountPowerSpaceCount){var x=Us(o,n.lastAccountPowerBoxIndex+1);g.push({appIndex:jr[r],name:x})}var A,v=cs(i.lastTotalPowerTimestamp,Math.floor(Date.now()/1e3)),I=v.length,w=y(v);try{for(w.s();!(A=w.n()).done;){var b=A.value;if(b%Wr==0){var T=Qs(b);g.push({appIndex:jr[r],name:T})}}}catch(e){w.e(e)}finally{w.f()}var k=0;s||(k+=ss),n.freeAccountPowerSpaceCount||(k+=os),I>i.freeTotalPowerSpaceCount&&(k+=is);var S=[e.makeApplicationNoOpTxnFromObject({appIndex:jr[r],sender:o,suggestedParams:u,appArgs:[te("extend_lock_end_time"),ea(a)],boxes:g.slice(0,8),note:c}),xo({sender:o,suggestedParams:u,index:jr[r],boxes:g.slice(8)})];if(k){var P=e.makePaymentTxnWithSuggestedParamsFromObject({sender:o,receiver:e.getApplicationAddress(jr[r]),amount:k,suggestedParams:u});S.unshift(P)}return e.assignGroupID(S)}function Bo(t){var n=t.accountState,r=t.network,a=t.sender,s=t.suggestedParams,o=t.appCallNote,i=Ls(a),u=Us(a,n.lastAccountPowerBoxIndex),c=Us(a,n.lastAccountPowerBoxIndex+1),p=[{appIndex:jr[r],name:i},{appIndex:jr[r],name:u},{appIndex:jr[r],name:c}],l=e.makeApplicationNoOpTxnFromObject({appIndex:jr[r],sender:a,suggestedParams:s,appArgs:[te("withdraw")],foreignAssets:[ve[r]],boxes:p,note:o});l.fee*=2n;var d=[l];if(!n.freeAccountPowerSpaceCount){var f=e.makePaymentTxnWithSuggestedParamsFromObject({sender:a,receiver:e.getApplicationAddress(jr[r]),amount:os,suggestedParams:s});d.unshift(f)}return e.assignGroupID(d)}var Co=function(){return p((function e(t,n,r){u(this,e),this.algodClient=t,this.userAddress=n,this.network=r}),[{key:"getTinyPower",value:(w=i(s().mark((function e(){var t,n,r,a,o,i,u,c=arguments;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=c.length>0&&void 0!==c[0]?c[0]:Math.floor(Date.now()/Ur),e.next=3,this.fetchAccountState();case 3:if(n=e.sent){e.next=6;break}return e.abrupt("return",0);case 6:return e.next=8,zs({algodClient:this.algodClient,address:this.userAddress,appId:jr[this.network],powerCount:n.powerCount});case 8:if(r=e.sent,null!==(a=Ks(r,t))){e.next=12;break}return e.abrupt("return",0);case 12:return o=r[a],i=t-o.timestamp,u=Math.max(o.bias-ms(o.slope,i),0),e.abrupt("return",u);case 16:case"end":return e.stop()}}),e,this)}))),function(){return w.apply(this,arguments)})},{key:"getTotalTinyPower",value:(I=i(s().mark((function e(){var t,n,r,a,o,i,u,c,p,l,d,f,m,h,g,x,A,v,I=arguments;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=I.length>0&&void 0!==I[0]?I[0]:Math.floor(Date.now()/Ur),e.next=3,this.fetchVaultAppGlobalState();case 3:if(n=e.sent){e.next=6;break}return e.abrupt("return",0);case 6:return e.next=8,qs(this.algodClient,jr[this.network],n.totalPowerCount);case 8:if(r=e.sent,a=Ks(r,t)){e.next=12;break}return e.abrupt("return",0);case 12:o=r[a],i=Math.floor(o.timestamp/Wr),u=Math.floor(t/Wr)-i,c=Array.from({length:u},(function(e,t){return(i+t)*Wr})),p=c.map((function(e,t){return[0===t?o.timestamp:c[t-1],e]})),l=o.slope,d=o.bias,f=y(p),e.prev=19,f.s();case 21:if((m=f.n()).done){e.next=34;break}return h=m.value,g=h[1]-h[0],x=ms(l,g),d=Math.max(d-x,0),e.next=28,js(this.algodClient,jr[this.network],h[1]);case 28:A=e.sent,v=(null==A?void 0:A.slopeDelta)||0,l=Math.max(l-v,0),0!==d&&0!==l||(d=0,l=0);case 32:e.next=21;break;case 34:e.next=39;break;case 36:e.prev=36,e.t0=e.catch(19),f.e(e.t0);case 39:return e.prev=39,f.f(),e.finish(39);case 42:return e.abrupt("return",d);case 43:case"end":return e.stop()}}),e,this,[[19,36,39,42]])}))),function(){return I.apply(this,arguments)})},{key:"getCumulativeTinyPower",value:(A=i(s().mark((function e(){var t,n,r,a,o,i,u,c,p=arguments;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=p.length>0&&void 0!==p[0]?p[0]:Math.floor(Date.now()/Ur),e.next=3,this.fetchAccountState();case 3:if(n=e.sent){e.next=6;break}return e.abrupt("return",0);case 6:return e.next=8,zs({algodClient:this.algodClient,address:this.userAddress,appId:jr[this.network],powerCount:n.powerCount});case 8:if(r=e.sent,null!==(a=Ks(r,t))){e.next=12;break}return e.abrupt("return",0);case 12:return o=r[a],i=t-o.timestamp,u=hs(o.bias,o.slope,i),c=o.cumulativePower-u,e.abrupt("return",c);case 17:case"end":return e.stop()}}),e,this)}))),function(){return A.apply(this,arguments)})},{key:"fetchVaultAppGlobalState",value:(x=i(s().mark((function e(){var t;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,gs(this.algodClient,jr[this.network]);case 3:return t=e.sent,e.abrupt("return",new Bs(t.total_locked_amount,t.total_power_count,t.last_total_power_timestamp,t.tiny_asset_id));case 7:return e.prev=7,e.t0=e.catch(0),console.error(e.t0),e.abrupt("return",null);case 11:case"end":return e.stop()}}),e,this,[[0,7]])}))),function(){return x.apply(this,arguments)})},{key:"generateCreateLockTransactions",value:(g=i(s().mark((function e(t){var n,r,a,o,i,u,c,p,l;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.lockedAmount,r=t.lockEndTime,a=t.userAddress,o=t.suggestedParams,i=a||this.userAddress,e.next=4,this.fetchAccountState();case 4:return u=e.sent,e.next=7,this.fetchVaultAppGlobalState();case 7:if(c=e.sent,p=o,c){e.next=11;break}throw new Error("There was an error while fetching vault app global state");case 11:if(p){e.next=15;break}return e.next=14,this.algodClient.getTransactionParams().do();case 14:p=e.sent;case 15:return e.next=17,js(this.algodClient,jr[this.network],r);case 17:return l=e.sent,e.abrupt("return",Do({lockedAmount:n,lockEndTime:r,vaultAppGlobalState:c,slopeChangeAtLockEndTime:l,sender:i,network:this.network,accountState:u,suggestedParams:p}));case 19:case"end":return e.stop()}}),e,this)}))),function(e){return g.apply(this,arguments)})},{key:"generateIncreaseLockAmountTransactions",value:(h=i(s().mark((function e(t){var n,r,a,o,i,u,c;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.lockedAmount,r=t.userAddress,a=t.suggestedParams,o=r||this.userAddress,e.next=4,this.fetchAccountState();case 4:return i=e.sent,e.next=7,this.fetchVaultAppGlobalState();case 7:if(u=e.sent,c=a,u){e.next=11;break}throw new Error("There was an error while fetching vault app global state");case 11:if(i){e.next=13;break}throw new Error("There was an error while fetcing the account state");case 13:if(c){e.next=17;break}return e.next=16,this.algodClient.getTransactionParams().do();case 16:c=e.sent;case 17:return e.abrupt("return",No({accountState:i,lockedAmount:n,network:this.network,sender:o,vaultAppGlobalState:u,suggestedParams:c}));case 18:case"end":return e.stop()}}),e,this)}))),function(e){return h.apply(this,arguments)})},{key:"generateExtendLockTimeTransactions",value:(m=i(s().mark((function e(t){var n,r,a,o,i,u,c,p;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.newLockEndTime,r=t.userAddress,a=t.suggestedParams,o=r||this.userAddress,e.next=4,this.fetchAccountState();case 4:return i=e.sent,e.next=7,this.fetchVaultAppGlobalState();case 7:if(u=e.sent,c=a,u){e.next=11;break}throw new Error("There was an error while fetching vault app global state");case 11:if(i){e.next=13;break}throw new Error("There was an error while fetcing the account state");case 13:if(c){e.next=17;break}return e.next=16,this.algodClient.getTransactionParams().do();case 16:c=e.sent;case 17:return e.next=19,js(this.algodClient,jr[this.network],n);case 19:return p=e.sent,e.abrupt("return",Oo({accountState:i,network:this.network,newLockEndTime:n,sender:o,vaultAppGlobalState:u,suggestedParams:c,slopeChangeAtNewLockEndTime:null==p?void 0:p.slopeDelta}));case 21:case"end":return e.stop()}}),e,this)}))),function(e){return m.apply(this,arguments)})},{key:"generateIncreaseLockAmountAndExtendLockEndTimeTransactions",value:(f=i(s().mark((function e(t){var n,r,a,o,i,u,c,p,l,d,f,m;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.lockAmount,r=t.lockEndTime,a=t.userAddress,o=t.suggestedParams,i=a||this.userAddress,e.next=4,this.fetchAccountState();case 4:return u=e.sent,e.next=7,this.fetchVaultAppGlobalState();case 7:if(c=e.sent,p=[],l=[],d=o,c){e.next=13;break}throw new Error("There was an error while fetching vault app global state");case 13:if(u){e.next=15;break}throw new Error("There was an error while fetcing the account state");case 15:if(d){e.next=19;break}return e.next=18,this.algodClient.getTransactionParams().do();case 18:d=e.sent;case 19:return p=No({accountState:u,lockedAmount:n,network:this.network,sender:i,vaultAppGlobalState:c,suggestedParams:d}),u.powerCount+=1,c.totalPowerCount+=1n,e.next=24,js(this.algodClient,jr[this.network],r);case 24:return f=e.sent,l=Oo({accountState:u,network:this.network,newLockEndTime:r,sender:i,vaultAppGlobalState:c,suggestedParams:d,slopeChangeAtNewLockEndTime:null==f?void 0:f.slopeDelta}),m=[].concat(v(p),v(l)),e.abrupt("return",Boolean(p.length)&&Boolean(l.length)?Is(p,l):m);case 28:case"end":return e.stop()}}),e,this)}))),function(e){return f.apply(this,arguments)})},{key:"generateWithdrawTransactions",value:(d=i(s().mark((function e(t,n,r){var a,o,i,u,c;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a=t||this.userAddress,e.next=3,this.fetchAccountState();case 3:if(o=e.sent,i=r,o){e.next=7;break}throw new Error("There was an error while fetcing the account state");case 7:if(i){e.next=11;break}return e.next=10,this.algodClient.getTransactionParams().do();case 10:i=e.sent;case 11:if(u=Bo({accountState:o,network:this.network,sender:a,suggestedParams:i,client:this.algodClient}),!n){e.next=17;break}return e.next=15,ye({client:this.algodClient,initiatorAddr:a,assetID:ve[this.network]});case 15:c=e.sent,u=Is([c[0].txn],u);case 17:return e.abrupt("return",u);case 18:case"end":return e.stop()}}),e,this)}))),function(e,t,n){return d.apply(this,arguments)})},{key:"fetchAccountState",value:function(){return function(e,t,n){return Cs.apply(this,arguments)}(this.algodClient,jr[this.network],this.userAddress)}},{key:"fetchStakingDistributionProposal",value:function(e){return function(e,t,n){return _o.apply(this,arguments)}(this.algodClient,Vr[this.network],e)}},{key:"generateCastVoteForStakingDistributionProposalTransactions",value:(l=i(s().mark((function e(t){var n,r,a,o,i,u,c,p,l,d,f,m,h;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=t.proposalId,a=t.votes,o=t.assetIds,i=t.userAddress,u=t.suggestedParams,c=null!=i?i:this.userAddress,p=u,e.next=5,this.fetchStakingDistributionProposal(r);case 5:if(l=e.sent){e.next=8;break}throw new Error("There was an error while fetching staking distribution proposal");case 8:if(p){e.next=12;break}return e.next=11,this.algodClient.getTransactionParams().do();case 11:p=e.sent;case 12:return e.next=14,this.fetchAccountState();case 14:return d=e.sent,e.next=17,ws(this.algodClient,Vr[this.network]);case 17:return f=e.sent,e.next=20,zs({algodClient:this.algodClient,address:c,appId:jr[this.network],powerCount:null!==(n=null==d?void 0:d.powerCount)&&void 0!==n?n:null});case 20:if(m=e.sent,null!==(h=Ks(m,l.creationTimestamp))){e.next=24;break}throw new Error("It is required to have an account power at the staking distribution proposal creation timestamp");case 24:return e.abrupt("return",Eo({stakingVotingAppId:Vr[this.network],vaultAppId:jr[this.network],sender:c,proposalId:r,proposal:l,votes:a,assetIds:o,accountPowerIndex:h,appBoxNames:f,suggestedParams:p,appCallNote:null}));case 25:case"end":return e.stop()}}),e,this)}))),function(e){return l.apply(this,arguments)})},{key:"fetchRewardsAppGlobalState",value:(c=i(s().mark((function t(){var n;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,gs(this.algodClient,Gr[this.network]);case 3:return n=t.sent,t.abrupt("return",new ao(n.tiny_asset_id,n.vault_app_id,n.reward_history_count,n.first_period_timestamp,n.reward_period_count,e.encodeAddress(n.manager),e.encodeAddress(n.rewards_manager)));case 7:return t.prev=7,t.t0=t.catch(0),console.error(t.t0),t.abrupt("return",null);case 11:case"end":return t.stop()}}),t,this,[[0,7]])}))),function(){return c.apply(this,arguments)})},{key:"generateClaimRewardTransactions",value:(o=i(s().mark((function e(t){var n,r,a,o,i,u,c,p,l,d,f,m,h,g,x,A,v,I,w,y,b,T,k;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(r=t.periodIndexStart,a=t.periodCount,o=t.userAddress,i=t.suggestedParams,u=t.shouldOptIntoTINY,c=null!=o?o:this.userAddress,p=i){e.next=7;break}return e.next=6,this.algodClient.getTransactionParams().do();case 6:p=e.sent;case 7:return e.next=9,this.fetchAccountState();case 9:return l=e.sent,e.next=12,this.fetchRewardsAppGlobalState();case 12:if(d=e.sent){e.next=15;break}throw new Error("There was an error while fetching rewards app global state");case 15:if(!(r+a>d.rewardPeriodCount)){e.next=17;break}throw new Error("The reward period index to be claimed cannot be larger than the latest reward period index");case 17:return e.next=19,zs({algodClient:this.algodClient,address:c,appId:jr[this.network],powerCount:null!==(n=null==l?void 0:l.powerCount)&&void 0!==n?n:null});case 19:for(f=e.sent,m=d.firstPeriodTimestamp+r*Mr,h=d.firstPeriodTimestamp+(r+a)*Mr,g=[],x=m;x=Math.floor(Date.now()/Ur)||c.votingEndTimestamp<=Math.floor(Date.now()/Ur))){e.next=23;break}throw new Error("Voting period is not active");case 23:return e.next=25,zs({algodClient:this.algodClient,address:i,appId:jr[this.network],powerCount:p.powerCount});case 25:if(l=e.sent,null!==(d=Ks(l,c.creationTimestamp))){e.next=29;break}throw new Error("Account power index not found");case 29:return f=Math.floor(c.index/(8*Kr)),m=So(i,f),e.next=33,ds(this.algodClient,Qr[this.network],m);case 33:return h=!e.sent,e.abrupt("return",$s({proposalVotingAppId:Qr[this.network],vaultAppId:jr[this.network],sender:i,proposalId:n,proposal:c,vote:a,accountPowerIndex:d,createAttendanceSheetBox:h,suggestedParams:u}));case 35:case"end":return e.stop()}}),e,this)}))),function(e){return r.apply(this,arguments)})},{key:"fetchProposalVotingAppGlobalState",value:(n=i(s().mark((function e(){var t;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,gs(this.algodClient,Qr[this.network]);case 2:return t=e.sent,e.abrupt("return",new Ts(t.vault_app_id,t.proposal_index_counter,t.voting_delay,t.voting_duration,t.proposal_threshold,t.proposal_threshold_numerator,t.quorum_threshold,t.approval_requirement,t.manager,t.proposal_manager));case 4:case"end":return e.stop()}}),e,this)}))),function(){return n.apply(this,arguments)})},{key:"getRequiredTinyPowerToCreateProposal",value:(t=i(s().mark((function e(t){var n,r,a;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(null==t){e.next=4;break}e.t0=t,e.next=7;break;case 4:return e.next=6,this.getTotalTinyPower();case 6:e.t0=e.sent;case 7:return n=e.t0,e.next=10,this.fetchProposalVotingAppGlobalState();case 10:return r=e.sent,a=r.proposalThreshold,r.proposalThresholdNumerator&&(a=Math.max(a,Math.floor(n*r.proposalThresholdNumerator/100)+1)),e.abrupt("return",a);case 14:case"end":return e.stop()}}),e,this)}))),function(e){return t.apply(this,arguments)})}]);var t,n,r,a,o,c,l,d,f,m,h,g,x,A,I,w}(),Fo=2500,Lo=400,Ro=function(){return p((function e(t,n){u(this,e),l(this,"data",null),this.name=t,this.structReference=n,this.size=n[t].size,this.fields=n[t].fields}),[{key:"apply",value:function(e){var t=e;return t||(t=Buffer.alloc(this.size)),this.data=new DataView(t.buffer,t.byteOffset,t.byteLength),this}},{key:"getField",value:function(e){var t;if(!this.data)throw new Error("Data is not initialized");var n=this.fields[e];if(!n)throw new Error("Field ".concat(e," does not exist in struct ").concat(this.name));var r=n.offset,a=n.offset+n.size,s=null===(t=this.data)||void 0===t?void 0:t.buffer.slice(r,a);return Vo(n.type,this.structReference).apply(Buffer.from(s))}}])}(),Mo=function(){return p((function e(t,n){u(this,e),l(this,"data",null),this.struct=t,this.length=n}),[{key:"apply",value:function(e){var t=e;return t||(t=Buffer.alloc(this.struct.size*this.length)),this.data=new DataView(t.buffer,t.byteOffset,t.byteLength),this}},{key:"getField",value:function(e){var t,n=this.struct.size*e,r=n+this.struct.size,a=null===(t=this.data)||void 0===t?void 0:t.buffer.slice(n,r);return this.struct.apply(a?Buffer.from(a):void 0)}}])}(),Uo=function(){return p((function e(){u(this,e)}),[{key:"apply",value:function(e){for(var t=BigInt(0),n=0;n2&&void 0!==arguments[2]?arguments[2]:Math.floor(Date.now()/1e3),a=(n=e,Math.floor(n*$a/Ya)),s=t-r;return s<0?0:ms(a,s)},exports.combineAndRegroupSignerTxns=function(){for(var t=arguments.length,n=new Array(t),r=0;r=e.minBalance},exports.intToBytes=ea,exports.isAccountOptedIntoApp=function(e){var t=e.appID,n=e.accountAppsLocalState;return!!n&&n.some((function(e){return e.id===BigInt(t)}))},exports.isSwapAssetInAmountLow=Re,exports.isSwapQuoteErrorCausedByAmount=We,exports.joinByteArrays=V,exports.poolUtils=_t,exports.prepareCommitTransactions=function(e){return Rr.apply(this,arguments)},exports.redeemAllExcessAsset=function(e){return Ir.apply(this,arguments)},exports.redeemExcessAsset=function(e){return xr.apply(this,arguments)},exports.sendAndWaitRawTransaction=Y,exports.sumUpTxnFees=$,exports.tinymanContract_v1_1=tt,exports.tinymanContract_v2=at,exports.tinymanJSSDKConfig=se; +"use strict";var e=require("algosdk"),t=require("base64-js"),n=require("crypto");function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t=0;--a){var s=this.tryEntries[a],o=s.completion;if("root"===s.tryLoc)return r("end");if(s.tryLoc<=this.prev){var i=n.call(s,"catchLoc"),u=n.call(s,"finallyLoc");if(i&&u){if(this.prev=0;--r){var a=this.tryEntries[r];if(a.tryLoc<=this.prev&&n.call(a,"finallyLoc")&&this.prev=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),k(n),d}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if("throw"===r.type){var a=r.arg;k(n)}return a}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,n){return this.delegate={iterator:N(e),resultName:t,nextLoc:n},"next"===this.method&&(this.arg=void 0),d}},e}function o(e,t,n,r,a,s,o){try{var i=e[s](o),u=i.value}catch(e){return void n(e)}i.done?t(u):Promise.resolve(u).then(r,a)}function i(e){return function(){var t=this,n=arguments;return new Promise((function(r,a){var s=e.apply(t,n);function i(e){o(s,r,a,i,u,"next",e)}function u(e){o(s,r,a,i,u,"throw",e)}i(void 0)}))}}function u(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function c(e,t){for(var n=0;ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var s,o=!0,i=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return o=e.done,e},e:function(e){i=!0,s=e},f:function(){try{o||null==n.return||n.return()}finally{if(i)throw s}}}}function b(e){var t=function(e,t){if("object"!=typeof e||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t||"default");if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:String(t)}var T=function(e){return e.SwapRouterStaleDataError="SwapRouterStaleDataError",e.SwapRouterNoRouteError="SwapRouterNoRouteError",e.SwapRouterLowSwapAmountError="SwapRouterLowSwapAmountError",e.SwapRouterInsufficientReservesError="SwapRouterInsufficientReservesError",e.SwapRouterPoolHasNoLiquidityError="SwapRouterPoolHasNoLiquidityError",e.NoAvailablePoolError="NoAvailablePoolError",e.OutputAmountExceedsAvailableLiquidityError="OutputAmountExceedsAvailableLiquidityError",e.UnknownError="UnknownError",e.LowSwapAmountError="LowSwapAmountError",e.AssetDoesNotBelongToPoolError="AssetDoesNotBelongToPoolError",e.InvalidSwapTypeError="InvalidSwapTypeError",e}({}),k=function(e){function t(e,n){var r,a,s,o;return u(this,t),a=this,o=[n],s=f(s=t),(r=A(a,function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){return!1}}()?Reflect.construct(s,o||[],f(a).constructor):s.apply(a,o))).type=e,r.message=n,Error.captureStackTrace&&Error.captureStackTrace(r,t),r}return d(t,m(Error)),p(t)}(),E=Uint8Array.from([1]),N=100000n,S=100000n,P=100000n,D=50000n,_=28500n,B=1000n,O=1e3,R={mainnet:{base:"https://mainnet.analytics.tinyman.org/api",v1:"https://mainnet.analytics.tinyman.org/api/v1"},testnet:{base:"https://testnet.analytics.tinyman.org/api",v1:"https://testnet.analytics.tinyman.org/api/v1"}};var F="- would result negative",C="logic eval error:",Q="exceeds schema integer count",L=/transaction \w+:/,V=function(e){function t(e,n){var r;u(this,t);for(var a=arguments.length,s=new Array(a>2?a-2:0),o=2;o1||t<0)throw new Error("Invalid slippage value. Must be between 0 and 1, got ".concat(t));var r;try{var a="negative"===e?1-t:1+t;r=BigInt(Math.floor(Number(n)*a))}catch(e){throw new Error(e.message)}return r}function z(e,t){var n=Number(e);return Y({decimalPlaces:n},Math.pow(10,-n)*Number(t))}function Y(e,t){var n=e.decimalPlaces,r=void 0===n?0:n;if(r>0){var a=x(q(t),2),s=a[0],o=a[1],i=x(q(Math.round(Number(J(s,o+r)))),2),u=i[0],c=i[1];return Number(J(u,c-r))}return Math.round(t)}function J(e,t){return e+(t<0?"e".concat(t):"e+".concat(t))}function q(e){if(e.toString().includes("e")){var t=e.toString().split("e");return[parseFloat(t[0]),parseFloat(t[1])]}return[e,0]}function Z(e,t){return H.apply(this,arguments)}function H(){return(H=i(s().mark((function e(t,n){var r,a,o,i,u,c,p,l;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:e.prev=0,r=[],a=w(n),e.prev=3,a.s();case 5:if((o=a.n()).done){e.next=18;break}return i=o.value,e.next=9,t.sendRawTransaction(i).do();case 9:return u=e.sent,c=u.txid,e.next=13,G(t,c);case 13:p=e.sent,l=Number(p.confirmedRound),r.push({confirmedRound:l,txnID:c});case 16:e.next=5;break;case 18:e.next=23;break;case 20:e.prev=20,e.t0=e.catch(3),a.e(e.t0);case 23:return e.prev=23,a.f(),e.finish(23);case 26:return e.abrupt("return",r);case 29:throw e.prev=29,e.t1=e.catch(0),new V(e.t1,"We encountered an error while processing this transaction. Try again later.");case 32:case"end":return e.stop()}}),e,null,[[0,29],[3,20,23,26]])})))).apply(this,arguments)}function K(e){return e.reduce((function(e,t){return e+Number(t.txn.fee)}),0)}function $(e){var t,n;return(n=null===(t=e[0].txn.group)||void 0===t?void 0:t.buffer)?Buffer.from(n).toString("base64"):""}function ee(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:8,n=new Uint8Array(t),r=BigInt(e),a=t-1;a>=0;a--)n[a]=Number(r&BigInt(255)),r>>=BigInt(8);return n}function te(e){for(var t=[];;){var n=Number(e&BigInt(127));if(!(e>>=BigInt(7))){t.push(n);break}t.push(128|n)}return t}function ne(e){return(new TextEncoder).encode(e)}var re=function(e){return e.FixedInput="fixed-input",e.FixedOutput="fixed-output",e}({}),ae=.003,se={V1_1:"v1_1",V2:"v2"},oe=new(function(){return p((function e(){u(this,e),this.clientName="tinyman-js-sdk"}),[{key:"getClientName",value:function(){return this.clientName}},{key:"setClientName",value:function(e){this.clientName=e}},{key:"getAppCallTxnNoteWithClientName",value:function(e,t){var n=e===se.V1_1?"v1":e,r=JSON.stringify(a({origin:this.clientName},t));return ne("tinyman/".concat(n,":j").concat(r))}}])}());function ie(e){return ue.apply(this,arguments)}function ue(){return(ue=i(s().mark((function t(n){var r,a,o,i,u,c;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(r=n.initiatorAddr,a=n.client,(o=n.route).transactions&&o.transaction_fee){t.next=3;break}return t.abrupt("return",[]);case 3:return t.next=5,a.getTransactionParams().do();case 5:return i=t.sent,u=[],o.transactions.forEach((function(e){u.push(ce(e,i,r))})),u[0].fee=BigInt(o.transaction_fee),c=e.assignGroupID(u),t.abrupt("return",c.map((function(e){return{txn:e,signers:[r]}})));case 11:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function ce(n,r,a){var s;switch(n.type){case e.TransactionType.pay:return(s=e.makePaymentTxnWithSuggestedParamsFromObject({sender:a,receiver:n.receiver,amount:n.amount,suggestedParams:r})).fee=0n,s;case e.TransactionType.axfer:return(s=e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:a,receiver:n.receiver,amount:n.amount,assetIndex:n.asset_id,suggestedParams:r})).fee=0n,s;case e.TransactionType.appl:var o,i=null===(o=n.args)||void 0===o?void 0:o.map(t.toByteArray),u=n.args&&"swap"===Buffer.from(n.args[0],"base64").toString("utf8");return(s=e.makeApplicationNoOpTxnFromObject({sender:a,appIndex:n.app_id,appArgs:i,accounts:n.accounts,foreignApps:n.apps,foreignAssets:n.assets,suggestedParams:r,note:u?oe.getAppCallTxnNoteWithClientName(se.V2):void 0})).fee=0n,s;default:throw new Error("Unknown transaction type: ".concat(n.type))}}function pe(e){return le.apply(this,arguments)}function le(){return(le=i(s().mark((function e(t){var n,r,a,o,i,u,c,p,l,d,f,g;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return o=t.amount,i=t.assetInID,u=t.assetOutID,c=t.swapType,p=t.network,l=t.slippage,d={asset_in_id:String(i),asset_out_id:String(u),swap_type:c,input_amount:c===re.FixedInput?String(o):void 0,output_amount:c===re.FixedOutput?String(o):void 0,slippage:l},e.next=4,fetch("".concat(R[p].v1,"/swap-router/quotes-v2/"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(d)}).catch((function(){throw new Error("Network error")}));case 4:return f=e.sent,e.next=7,f.json();case 7:if(g=e.sent,f.ok){e.next=14;break}if(s=g,!Boolean(s)||void 0===s.fallback_message){e.next=13;break}throw new k(g.type,g.fallback_message);case 13:throw new k(T.UnknownError,"There was an error while getting a quote from Swap Router");case 14:if(null!==(n=g.transactions)&&void 0!==n&&n.length){e.next=16;break}throw new k(T.SwapRouterNoRouteError,"Swap router couldn't find a route for this swap.");case 16:if(!(Number(g.asset_in.id)!==i||Number(g.asset_out.id)!==u||g.swap_type===re.FixedInput?BigInt(o)!==BigInt(null!==(r=g.input_amount)&&void 0!==r?r:0):BigInt(o)!==BigInt(null!==(a=g.output_amount)&&void 0!==a?a:0))){e.next=18;break}throw new k(T.UnknownError,"Swap router quote doesn't match the requested swap. Please try again.");case 18:return e.abrupt("return",g);case 19:case"end":return e.stop()}var s}),e)})))).apply(this,arguments)}var de={testnet:184778019,mainnet:1083651166};function fe(e){var t=me(e),n=t.assetIn,r=t.assetOut;return z(r.asset.decimals,Number(r.amount))/z(n.asset.decimals,Number(n.amount))}function ge(e){var t;return{asset:e.asset_out,amount:BigInt(null!==(t=e.output_amount)&&void 0!==t?t:0)}}function he(e){var t;return{asset:e.asset_in,amount:BigInt(null!==(t=e.input_amount)&&void 0!==t?t:0)}}function me(e){return{assetIn:he(e),assetOut:ge(e)}}l(l({},re.FixedInput,7),re.FixedOutput,8);var Ae=0,xe={id:"".concat(Ae),name:"Algorand",unit_name:"ALGO",decimals:6,url:"https://algorand.org",is_liquidity_token:!1,total_amount:"6615503326932151",clawback_address:""},Ie={V1:"TM1POOL",V1_1:"TMPOOL11",V2:"TMPOOL2"},ve={testnet:258703304,mainnet:22e8},ye={testnet:724519992,mainnet:2537013734},we={testnet:724676936,mainnet:2537023208};function be(e){return Te.apply(this,arguments)}function Te(){return(Te=i(s().mark((function t(n){var r,a,o,i,u;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.client,a=n.assetID,o=n.initiatorAddr,t.prev=1,t.next=4,r.getTransactionParams().do();case 4:return i=t.sent,u=e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:o,receiver:o,assetIndex:a,amount:0,suggestedParams:i}),t.abrupt("return",[{txn:u,signers:[o]}]);case 9:throw t.prev=9,t.t0=t.catch(1),new V(t.t0,"We encountered something unexpected while opting into this asset. Try again later.");case 12:case"end":return t.stop()}}),t,null,[[1,9]])})))).apply(this,arguments)}function ke(e,t){var n=Number(e.id),r=Number(t.id);return n>r?[a(a({},e),{},{id:n}),a(a({},t),{},{id:r})]:[a(a({},t),{},{id:r}),a(a({},e),{},{id:n})]}function Ee(e,t){var n=[e,t];return[Math.max.apply(Math,n),Math.min.apply(Math,n)]}function Ne(e){return Number(e)===Ae}function Se(e){return Number(e.id)}var Pe=function(e){return e.Direct="direct",e.Router="router",e}({}),De=4;var _e=function(e){return e[e.INPUT_TXN=0]="INPUT_TXN",e[e.APP_CALL_TXN=1]="APP_CALL_TXN",e}({}),Be=l(l({},re.FixedInput,1),re.FixedOutput,2),Oe=2,Re=ne("swap"),Fe=l(l({},re.FixedInput,ne("fixed-input")),re.FixedOutput,ne("fixed-output"));function Ce(e,t){return BigInt(Be[e]+Oe)*t}function Qe(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ae;return Math.ceil(1/e)}function Le(e){return e1&&void 0!==arguments[1]?arguments[1]:ae)}function Ve(e,t){return BigInt(Be[e]+1)*t}function Ue(e){var t=e.assetIn,n=e.assetOut;return z(n.decimals,Number(n.amount))/z(t.decimals,Number(t.amount))}function Me(e){var t=e.inputSupply,n=e.outputSupply,r=e.assetIn,a=e.assetOut,s=Ue({assetIn:r,assetOut:a}),o=z(a.decimals,Number(n))/z(r.decimals,Number(t));return Y({decimalPlaces:5},Math.abs(s/o-1))}function je(e){if(e.type===Pe.Router){var t=he(e.data);return{id:Se(t.asset),amount:t.amount}}return{id:e.data.quote.assetInID,amount:e.data.quote.assetInAmount}}function Ge(e){if(e.type===Pe.Router){var t=ge(e.data);return{id:Se(t.asset),amount:t.amount}}return{id:e.data.quote.assetOutID,amount:e.data.quote.assetOutAmount}}function Xe(e){return e.type===Pe.Direct?e.data.pool.contractVersion:se.V2}function We(e){return e.type===Pe.Direct?e.data.quote.rate:fe(e.data)}function ze(e){for(var t=e[0],n=We(t),r=1;rn&&(t=a,n=s)}return t}function Ye(e){return e instanceof k&&[T.SwapRouterInsufficientReservesError,T.SwapRouterLowSwapAmountError,T.OutputAmountExceedsAvailableLiquidityError,T.LowSwapAmountError].includes(e.type)}ne("asset_opt_in");var Je={type:"logicsig",logic:{bytecode:"BCAIAQCBgICAgICAgPABgICAgICAgIDwAQMEBQYlJA1EMQkyAxJEMRUyAxJEMSAyAxJEMgQiDUQzAQAxABJEMwEQIQcSRDMBGIGCgICAgICAgPABEkQzARkiEjMBGyEEEhA3ARoAgAlib290c3RyYXASEEAAXDMBGSMSRDMBG4ECEjcBGgCABHN3YXASEEACOzMBGyISRDcBGgCABG1pbnQSQAE7NwEaAIAEYnVybhJAAZg3ARoAgAZyZWRlZW0SQAJbNwEaAIAEZmVlcxJAAnkAIQYhBSQjEk0yBBJENwEaARclEjcBGgIXJBIQRDMCADEAEkQzAhAhBBJEMwIhIxJEMwIiIxwSRDMCIyEHEkQzAiQjEkQzAiWACFRNUE9PTDExEkQzAiZRAA+AD1RpbnltYW5Qb29sMS4xIBJEMwIngBNodHRwczovL3RpbnltYW4ub3JnEkQzAikyAxJEMwIqMgMSRDMCKzIDEkQzAiwyAxJEMwMAMQASRDMDECEFEkQzAxElEkQzAxQxABJEMwMSIxJEJCMTQAAQMwEBMwIBCDMDAQg1AUIBsTMEADEAEkQzBBAhBRJEMwQRJBJEMwQUMQASRDMEEiMSRDMBATMCAQgzAwEIMwQBCDUBQgF8MgQhBhJENwEcATEAE0Q3ARwBMwQUEkQzAgAxABNEMwIUMQASRDMDADMCABJEMwIRJRJEMwMUMwMHMwMQIhJNMQASRDMDESMzAxAiEk0kEkQzBAAxABJEMwQUMwIAEkQzAQEzBAEINQFCAREyBCEGEkQ3ARwBMQATRDcBHAEzAhQSRDMDFDMDBzMDECISTTcBHAESRDMCADEAEkQzAhQzBAASRDMCESUSRDMDADEAEkQzAxQzAwczAxAiEk0zBAASRDMDESMzAxAiEk0kEkQzBAAxABNEMwQUMQASRDMBATMCAQgzAwEINQFCAJAyBCEFEkQ3ARwBMQATRDMCADcBHAESRDMCADEAE0QzAwAxABJEMwIUMwIHMwIQIhJNMQASRDMDFDMDBzMDECISTTMCABJEMwEBMwMBCDUBQgA+MgQhBBJENwEcATEAE0QzAhQzAgczAhAiEk03ARwBEkQzAQEzAgEINQFCABIyBCEEEkQzAQEzAgEINQFCAAAzAAAxABNEMwAHMQASRDMACDQBD0M=",address:"ABUKAXTANWR6K6ZYV75DWJEPVWWOU6SFUVRI6QHO44E4SIDLHBTD2CZ64A",size:881,variables:[{name:"TMPL_ASSET_ID_1",type:"int",index:15,length:10},{name:"TMPL_ASSET_ID_2",type:"int",index:5,length:10},{name:"TMPL_VALIDATOR_APP_ID",type:"int",index:74,length:10}],source:"https://github.com/tinymanorg/tinyman-contracts-v1/tree/dc9ab40c58b85c15d58f63a1507e18be76720dbb/contracts/pool_logicsig.teal.tmpl"},name:"pool_logicsig"},qe={type:"app",global_state_schema:{num_uints:0,num_byte_slices:0},local_state_schema:{num_uints:16,num_byte_slices:0},name:"validator_app"},Ze=l(l({},se.V1_1,{testnet:62368684,mainnet:552635992}),se.V2,{testnet:148607e3,mainnet:1002541853});function He(e,t){var n=Ze[t][e];if(!n)throw new Error("No Validator App exists for ".concat(e," network with ").concat(t," contract version"));return n}function Ke(){return(Ke=i(s().mark((function t(n){var r,a,o,i,u,c;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.client,a=n.network,o=n.contractVersion,i=n.initiatorAddr,t.next=3,r.getTransactionParams().do();case 3:return u=t.sent,c=e.makeApplicationOptInTxnFromObject({sender:i,appIndex:He(a,o),note:oe.getAppCallTxnNoteWithClientName(o),suggestedParams:u}),t.abrupt("return",[{txn:c,signers:[i]}]);case 6:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function $e(){return($e=i(s().mark((function t(n){var r,a,o,i,u,c;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.client,a=n.network,o=n.contractVersion,i=n.initiatorAddr,t.next=3,r.getTransactionParams().do();case 3:return u=t.sent,c=e.makeApplicationClearStateTxnFromObject({sender:i,appIndex:He(a,o),note:oe.getAppCallTxnNoteWithClientName(o),suggestedParams:u}),t.abrupt("return",[{txn:c,signers:[i]}]);case 6:case"end":return t.stop()}}),t)})))).apply(this,arguments)}var et=p((function e(t){u(this,e),this.schema={numLocalInts:t.local_state_schema.num_uints,numLocalByteSlices:t.local_state_schema.num_byte_slices,numGlobalInts:t.global_state_schema.num_uints,numGlobalByteSlices:t.global_state_schema.num_byte_slices}}));var tt=function(n){function r(e,t){var n,a,s,o;return u(this,r),a=this,o=[e],s=f(s=r),(n=A(a,function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){return!1}}()?Reflect.construct(s,o||[],f(a).constructor):s.apply(a,o))).poolLogicSigContractTemplate=t.logic.bytecode,n.templateVariables=t.logic.variables,n}return d(r,et),p(r,[{key:"generateLogicSigAccountForPool",value:function(n){if(n.asset1ID===n.asset2ID)throw new Error("Assets are the same");var r=He(n.network,se.V1_1),a=x(Ee(n.asset1ID,n.asset2ID),2),s=a[0],o=a[1],i=Array.from(t.toByteArray(this.poolLogicSigContractTemplate)),u={asset_id_1:s,asset_id_2:o,validator_app_id:r},c=0;this.templateVariables.sort((function(e,t){return e.index-t.index}));for(var p=0;pmt)){n.next=52;break}throw new Error("Issued liquidity value is out of the expected range ([0n, ".concat(mt,"]): ").concat(B.issuedLiquidity));case 52:return n.abrupt("return",B);case 53:case"end":return n.stop()}}),n,null,[[12,35,38,41]])})))).apply(this,arguments)}function vt(){return vt=i(s().mark((function e(t){var n,r,a,o,i,u,c,p,l,d=arguments;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=t.client,r=t.address,a=t.network,!(o=d.length>1&&void 0!==d[1]?d[1]:{})[r]){e.next=4;break}return e.abrupt("return",o[r]);case 4:return e.next=6,n.accountInformation(r).do();case 6:return i=e.sent,u=it(i,He(a,se.V1_1)),c=null,u&&(l=i.createdAssets[0],p=Number(l.index),c={asset1ID:Number(u[ft[se.V1_1].asset1]),asset2ID:Number(u[ft[se.V1_1].asset2]),poolTokenID:p},o[r]=c),e.abrupt("return",c);case 11:case"end":return e.stop()}}),e)}))),vt.apply(this,arguments)}var yt=Object.freeze({__proto__:null,getPoolAssets:function(e){return vt.apply(this,arguments)},getPoolInfo:At,getPoolReserves:function(e,t){return It.apply(this,arguments)}});function wt(e){return bt.apply(this,arguments)}function bt(){return(bt=i(s().mark((function e(t){var n,r,a,o,i,u,c,p,l,d,f,g;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.client,r=t.network,a=t.asset1ID,o=t.asset2ID,i=ot(se.V2),u=i.generateLogicSigAccountForPool(t),c=He(r,se.V2),p=u.address(),l=Ee(a,o),e.next=8,n.accountInformation(p).do();case 8:return d=e.sent,f=it(d,c),g={account:u,validatorAppID:c,asset1ID:l[0],asset2ID:l[1],status:f?dt.READY:dt.NOT_CREATED,contractVersion:se.V2},f&&(g.asset1ProtocolFees=BigInt(f[ft.v2.asset1ProtocolFees]),g.asset2ProtocolFees=BigInt(f[ft.v2.asset2ProtocolFees]),g.asset1Reserves=BigInt(f[ft.v2.asset1Reserves]),g.asset2Reserves=BigInt(f[ft.v2.asset2Reserves]),g.issuedPoolTokens=BigInt(f[ft.v2.issuedPoolTokens]),g.cumulativePriceUpdateTimeStamp=Number(f[ft.v2.cumulativePriceUpdateTimeStamp]),g.protocolFeeRatio=Number(f[ft.v2.protocolFeeRatio]),g.totalFeeShare=BigInt(f[ft.v2.totalFeeShare]),g.poolTokenID=Number(f[ft.v2.poolTokenID]),g.asset1ID=Number(f[ft.v2.asset1]),g.asset2ID=Number(f[ft.v2.asset2])),e.abrupt("return",g);case 13:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Tt(){return(Tt=i(s().mark((function e(t,n){var r,a,o;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t.accountInformation(n.account.address()).do();case 2:return r=e.sent,a=it(r,n.validatorAppID),o={asset1:0n,asset2:0n,issuedLiquidity:0n,round:r.round},a&&(o.asset1=BigInt(a[ft.v2.asset1Reserves]),o.asset2=BigInt(a[ft.v2.asset2Reserves]),o.issuedLiquidity=BigInt(a[ft.v2.issuedPoolTokens])),e.abrupt("return",o);case 7:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function kt(){return(kt=i(s().mark((function e(t){var n,r,a,o,i,u;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.client,r=t.address,a=t.network,e.next=3,n.accountInformation(r).do();case 3:return o=e.sent,i=it(o,He(a,se.V2)),u=null,i&&(u={asset1ID:i[ft[se.V2].asset1],asset2ID:i[ft[se.V2].asset2],poolTokenID:i[ft[se.V2].poolTokenID]}),e.abrupt("return",u);case 8:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var Et=Object.freeze({__proto__:null,getPoolAssets:function(e){return kt.apply(this,arguments)},getPoolInfo:wt,getPoolReserves:function(e,t){return Tt.apply(this,arguments)}});function Nt(e){return Boolean(e&&!(e.asset1+e.asset2))}var St=Object.freeze({__proto__:null,getPoolPairRatio:function(e){var t=Nt(e),n=null;return e&&!t&&e.asset1&&e.asset2&&(n=Number(e.asset1)/Number(e.asset2)),n},getPoolShare:function(e,t){var n=Number(t)/Number(e);return Number.isFinite(n)||(n=0),n},getPoolsForPair:function(e){return Promise.all([At(e),wt(e)])},isPoolEmpty:Nt,isPoolNotCreated:function(e){return(null==e?void 0:e.status)===dt.NOT_CREATED},isPoolReady:function(e){return(null==e?void 0:e.status)===dt.READY}}),Pt=a(l(l({},se.V1_1,a(a({},yt),St)),se.V2,a(a({},Et),St)),St),Dt=function(e){return e[e.FUNDING_TXN=0]="FUNDING_TXN",e[e.VALIDATOR_APP_CALL=1]="VALIDATOR_APP_CALL",e[e.POOL_TOKEN_CREATE=2]="POOL_TOKEN_CREATE",e[e.ASSET1_OPT_IN=3]="ASSET1_OPT_IN",e[e.ASSET2_OPT_IN=4]="ASSET2_OPT_IN",e}({}),_t={ASA_ALGO:960000n,ASA_ASA:859000n};function Bt(){return(Bt=i(s().mark((function t(n){var r,a,o,i,u,c,p,l,d,f,g,h,m,A,I,v,y,w,b,T,k,E,N,S,P;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.client,a=n.network,o=n.asset_1,i=n.asset_2,u=n.initiatorAddr,t.next=3,r.getTransactionParams().do();case 3:return c=t.sent,p=ke(o,i),l=x(p,2),d=l[0],f=d.id,g=d.unit_name,h=l[1],m=h.id,A=h.unit_name,I=Ne(m),v=He(a,se.V1_1),y=nt.generateLogicSigAccountForPool({network:a,asset1ID:f,asset2ID:m}),w=y.address(),b=e.makeApplicationOptInTxnFromObject({sender:w,appIndex:v,note:oe.getAppCallTxnNoteWithClientName(se.V1_1),appArgs:[ne("bootstrap"),e.encodeUint64(f),e.encodeUint64(m)],foreignAssets:I?[f]:[m],suggestedParams:c}),T=e.makeAssetCreateTxnWithSuggestedParamsFromObject({sender:w,total:0xffffffffffffffffn,decimals:6,defaultFrozen:!1,unitName:Ie.V1_1,assetName:"TinymanPool1.1 ".concat(g,"-").concat(A),assetURL:"https://tinyman.org",suggestedParams:c}),k=e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:w,receiver:w,assetIndex:f,amount:0,suggestedParams:c}),E=e.makePaymentTxnWithSuggestedParamsFromObject({sender:u,receiver:w,amount:Ot(I),suggestedParams:c}),(N=[])[Dt.FUNDING_TXN]=E,N[Dt.VALIDATOR_APP_CALL]=b,N[Dt.POOL_TOKEN_CREATE]=T,N[Dt.ASSET1_OPT_IN]=k,I||(N[Dt.ASSET2_OPT_IN]=e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:w,receiver:w,assetIndex:m,amount:0,suggestedParams:c})),S=e.assignGroupID(N),P=[{txn:S[Dt.FUNDING_TXN],signers:[u]},{txn:S[Dt.VALIDATOR_APP_CALL],signers:[w.toString()]},{txn:S[Dt.POOL_TOKEN_CREATE],signers:[w.toString()]},{txn:S[Dt.ASSET1_OPT_IN],signers:[w.toString()]}],S[Dt.ASSET2_OPT_IN]&&P.push({txn:S[Dt.ASSET2_OPT_IN],signers:[w.toString()]}),t.abrupt("return",P);case 23:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function Ot(e){return e?_t.ASA_ALGO:_t.ASA_ASA}function Rt(){return(Rt=i(s().mark((function t(n){var r,a,o,i,u,c,p,l,d,f,g,h,m,A,I;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.txGroup,a=n.network,o=n.initiatorSigner,i=n.asset1ID,u=n.asset2ID,t.next=3,o([r]);case 3:return c=t.sent,p=x(c,1),l=p[0],d=Ee(i,u),f=x(d,2),g=f[0],h=f[1],m=nt.generateLogicSigAccountForPool({network:a,asset1ID:g,asset2ID:h}),A=[],I=r.map((function(t,n){if(n===Dt.FUNDING_TXN)return A.push(t.txn.txID().toString()),l;var r=e.signLogicSigTransactionObject(t.txn,m),a=r.txID,s=r.blob;return A.push(a),s})),t.abrupt("return",{signedTxns:I,txnIDs:A});case 11:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function Ft(e){return Ct.apply(this,arguments)}function Ct(){return(Ct=i(s().mark((function e(t){var n,r,a,o,i;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.client,r=t.signedTxns,a=t.txnIDs,e.prev=1,e.next=4,n.sendRawTransaction(r).do();case 4:return e.next=6,G(n,a[Dt.POOL_TOKEN_CREATE]);case 6:if(o=e.sent,"bigint"==typeof(i=o.assetIndex)){e.next=10;break}throw new Error("Generated ID is not valid: got ".concat(i));case 10:return e.abrupt("return",{poolTokenID:i});case 13:throw e.prev=13,e.t0=e.catch(1),new V(e.t0,"We encountered something unexpected while bootstraping the pool. Try again later.");case 16:case"end":return e.stop()}}),e,null,[[1,13]])})))).apply(this,arguments)}function Qt(){return(Qt=i(s().mark((function e(t){var n,r,a,o,i,u,c;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.client,r=t.network,a=t.pool,o=a.asset1ID,i=a.asset2ID,u=t.signedTxns,c=t.txnIDs,e.next=3,Ft({client:n,signedTxns:u,txnIDs:c});case 3:return e.abrupt("return",Pt.v1_1.getPoolInfo({client:n,network:r,asset1ID:o,asset2ID:i}));case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var Lt={generateTxns:function(e){return Bt.apply(this,arguments)},signTxns:function(e){return Rt.apply(this,arguments)},execute:function(e){return Qt.apply(this,arguments)},getBootstrapFundingTxnAmount:Ot};var Vt=function(e){return e[e.FUNDING_TXN=0]="FUNDING_TXN",e[e.VALIDATOR_APP_CALL=1]="VALIDATOR_APP_CALL",e}({}),Ut={ASA_ALGO:5,ASA_ASA:6};function Mt(e,t){return jt.apply(this,arguments)}function jt(){return(jt=i(s().mark((function t(n,r){var a,o,i;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(!(o=null===(a=r.find((function(t){return t.txn.type===e.TransactionType.appl})))||void 0===a?void 0:a.txn.txID())){t.next=7;break}return t.next=4,e.waitForConfirmation(n,o,O);case 4:t.t0=t.sent,t.next=8;break;case 7:t.t0=void 0;case 8:return i=t.t0,t.abrupt("return",i);case 10:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function Gt(e,t){return Xt.apply(this,arguments)}function Xt(){return(Xt=i(s().mark((function e(t,n){var r;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Mt(t,n);case 2:return r=e.sent,e.abrupt("return",null==r?void 0:r.innerTxns);case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Wt(e,t){return zt.apply(this,arguments)}function zt(){return(zt=i(s().mark((function t(n,r){var a,o;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,Gt(n,r);case 2:return a=t.sent,o=r[0].txn.sender.toString(),t.abrupt("return",null==a?void 0:a.reduce((function(t,n){var r,a,s=t,i=n.txn.txn;i.type===e.TransactionType.axfer&&i.assetTransfer&&i.assetTransfer.receiver.toString()===o?s.push({id:Number(i.assetTransfer.assetIndex),amount:null===(a=i.assetTransfer)||void 0===a?void 0:a.amount}):i.type===e.TransactionType.pay&&(null===(r=i.payment)||void 0===r?void 0:r.receiver.toString())===o&&s.push({id:Ae,amount:i.payment.amount});return s}),[]));case 5:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function Yt(){return(Yt=i(s().mark((function t(n){var r,a,o,i,u,c,p,l,d,f,g,h,m,A,I,v,y,w,b,T;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.client,a=n.network,o=n.asset_1,i=n.asset_2,u=n.initiatorAddr,t.next=3,r.getTransactionParams().do();case 3:return c=t.sent,p=He(a,se.V2),l=e.getApplicationAddress(p),d=ke(o,i),f=x(d,2),g=f[0].id,h=f[1].id,t.next=9,Pt.v2.getPoolInfo({client:r,network:a,asset1ID:g,asset2ID:h});case 9:if(t.sent.status!==dt.READY){t.next=12;break}throw new Error("Pool for ".concat(o.unit_name,"-").concat(i.unit_name," already exists"));case 12:return m=st.generateLogicSigAccountForPool({network:a,asset1ID:g,asset2ID:h}),A=m.address(),I=Ne(h),(v=e.makeApplicationOptInTxnFromObject({sender:A,appIndex:p,appArgs:[ne("bootstrap")],note:oe.getAppCallTxnNoteWithClientName(se.V2),foreignAssets:[g,h],rekeyTo:l,suggestedParams:c})).fee=qt(I,c.minFee),y=e.makePaymentTxnWithSuggestedParamsFromObject({sender:u,receiver:A,amount:Jt(I,c.minFee),suggestedParams:c}),(w=[])[Vt.FUNDING_TXN]=y,w[Vt.VALIDATOR_APP_CALL]=v,b=e.assignGroupID(w),(T=[])[Vt.FUNDING_TXN]={txn:b[Vt.FUNDING_TXN],signers:[u]},T[Vt.VALIDATOR_APP_CALL]={txn:b[Vt.VALIDATOR_APP_CALL],signers:[A.toString()]},t.abrupt("return",T);case 26:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function Jt(e,t){return function(e,t){var n=ot(e).schema,r=n.numLocalInts,a=n.numLocalByteSlices,s=N+S+S+P+_*BigInt(r)+D*BigInt(a);return t||(s+=S),s}(se.V2,e)+qt(e,t)+S}function qt(e,t){var n=e?Ut.ASA_ALGO:Ut.ASA_ASA;return BigInt(n+1)*t}function Zt(){return(Zt=i(s().mark((function t(n){var r,a,o,i,u,c,p,l,d,f,g,h,m,A,I;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.txGroup,a=n.network,o=n.initiatorSigner,i=n.asset1ID,u=n.asset2ID,t.next=3,o([r]);case 3:return c=t.sent,p=x(c,1),l=p[0],d=Ee(i,u),f=x(d,2),g=f[0],h=f[1],m=st.generateLogicSigAccountForPool({network:a,asset1ID:g,asset2ID:h}),A=[],I=r.map((function(t,n){if(n===Vt.FUNDING_TXN)return A.push(t.txn.txID().toString()),l;var r=e.signLogicSigTransactionObject(t.txn,m),a=r.txID,s=r.blob;return A.push(a),s})),t.abrupt("return",{signedTxns:I,txnIDs:A});case 11:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function Ht(){return(Ht=i(s().mark((function t(n){var r,a,o,i,u,c,p,l,d,f,g;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.client,a=n.network,o=n.pool,i=o.asset1ID,u=o.asset2ID,c=n.txGroup,p=n.signedTxns,t.prev=1,t.next=4,r.sendRawTransaction(p).do();case 4:return t.next=6,Mt(r,c);case 6:if(t.t5=f=t.sent,t.t4=null===t.t5,t.t4){t.next=10;break}t.t4=void 0===f;case 10:if(!t.t4){t.next=14;break}t.t6=void 0,t.next=15;break;case 14:t.t6=f.localStateDelta;case 15:if(t.t7=d=t.t6,t.t3=null!==t.t7,!t.t3){t.next=19;break}t.t3=void 0!==d;case 19:if(!t.t3){t.next=23;break}t.t8=d,t.next=24;break;case 23:t.t8=[];case 24:if(t.t9=l=t.t8[0],t.t2=null===t.t9,t.t2){t.next=28;break}t.t2=void 0===l;case 28:if(t.t1=t.t2,t.t1){t.next=31;break}t.t1=null===(l=l.delta)||void 0===l;case 31:if(t.t0=t.t1,t.t0){t.next=34;break}t.t0=null===(l=l.find((function(t){return t.key===e.bytesToBase64(ne(ft.v2.poolTokenID))})))||void 0===l;case 34:if(!t.t0){t.next=38;break}t.t10=void 0,t.next=39;break;case 38:t.t10=l.value.uint;case 39:if("bigint"==typeof(g=t.t10)){t.next=42;break}throw new Error("Generated ID is not valid: got ".concat(g));case 42:return t.abrupt("return",Pt.v2.getPoolInfo({client:r,network:a,asset1ID:i,asset2ID:u}));case 45:throw t.prev=45,t.t11=t.catch(1),new V(t.t11,"We encountered something unexpected while bootstraping the pool. Try again later.");case 48:case"end":return t.stop()}}),t,null,[[1,45]])})))).apply(this,arguments)}var Kt={generateTxns:function(e){return Yt.apply(this,arguments)},signTxns:function(e){return Zt.apply(this,arguments)},execute:function(e){return Ht.apply(this,arguments)},getBootstrapFundingTxnAmount:Jt,getTotalCost:function(e,t){return t+Jt(e,t)}};var $t=l(l(l(l(l(l({},se.V1_1,Lt),se.V2,Kt),"generateTxns",(function(e){return e.contractVersion===se.V1_1?Lt.generateTxns(e):Kt.generateTxns(e)})),"signTxns",(function(e){return e.contractVersion===se.V1_1?Lt.signTxns(e):Kt.signTxns(e)})),"execute",(function(e){return e.contractVersion===se.V1_1?Lt.execute(e):Kt.execute(e)})),"calculateBootstrapFundingTxnAmount",(function(e){var t=e.contractVersion,n=e.isAlgoPool,r=e.minFee;return t===se.V1_1?Lt.getBootstrapFundingTxnAmount(n):Kt.getBootstrapFundingTxnAmount(n,r)})),en=ne("add_liquidity"),tn=l(l({},se.V1_1,[ne("mint")]),se.V2,{INITIAL_LIQUIDITY:[ne("add_initial_liquidity")],SINGLE_ASSET_MODE:[en,ne("single")],FLEXIBLE_MODE:[en,ne("flexible")]}),nn=function(e){return e[e.FEE_TXN=0]="FEE_TXN",e[e.VALIDATOR_APP_CALL_TXN=1]="VALIDATOR_APP_CALL_TXN",e[e.ASSET1_IN_TXN=2]="ASSET1_IN_TXN",e[e.ASSET2_IN_TXN=3]="ASSET2_IN_TXN",e[e.LIQUDITY_OUT_TXN=4]="LIQUDITY_OUT_TXN",e}({}),rn=5;function an(){return(an=i(s().mark((function t(n){var r,a,o,i,u,c,p,l,d,f,g,h,m,A,x,I;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.client,a=n.network,o=n.poolAddress,i=n.asset1In,u=n.asset2In,c=n.poolTokenOut,p=n.slippage,l=n.initiatorAddr,d=W("negative",p,c.amount),t.next=4,r.getTransactionParams().do();case 4:return f=t.sent,g=e.makeApplicationNoOpTxnFromObject({sender:o,appIndex:He(a,se.V1_1),appArgs:tn.v1_1,accounts:[l],note:oe.getAppCallTxnNoteWithClientName(se.V1_1),foreignAssets:u.id==Ae?[i.id,c.id]:[i.id,u.id,c.id],suggestedParams:f}),h=e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:l,receiver:o,assetIndex:i.id,amount:i.amount,suggestedParams:f}),m=u.id===Ae?e.makePaymentTxnWithSuggestedParamsFromObject({sender:l,receiver:o,amount:u.amount,suggestedParams:f}):e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:l,receiver:o,assetIndex:u.id,amount:u.amount,suggestedParams:f}),A=e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:o,receiver:l,assetIndex:c.id,amount:d,suggestedParams:f}),x=e.makePaymentTxnWithSuggestedParamsFromObject({sender:l,receiver:o,amount:g.fee+A.fee,note:E,suggestedParams:f}),I=e.assignGroupID([x,g,h,m,A]),t.abrupt("return",[{txn:I[0],signers:[l]},{txn:I[1],signers:[o]},{txn:I[2],signers:[l]},{txn:I[3],signers:[l]},{txn:I[4],signers:[o]}]);case 12:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function sn(){return(sn=i(s().mark((function t(n){var r,a,o,i,u,c,p,l,d,f;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.pool,a=n.txGroup,o=n.initiatorSigner,i=r.account,t.next=4,o([a]);case 4:return u=t.sent,c=x(u,3),p=c[0],l=c[1],d=c[2],f=a.map((function(t,n){return n===nn.FEE_TXN?p:n===nn.ASSET1_IN_TXN?l:n===nn.ASSET2_IN_TXN?d:e.signLogicSigTransactionObject(t.txn,i).blob})),t.abrupt("return",f);case 11:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function on(){return(on=i(s().mark((function e(t){var n,r,a,o,i,u,c,p,l,d,f,g,h,m,A,I,v,y,w;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.client,r=t.pool,a=t.txGroup,o=t.signedTxns,i=t.initiatorAddr,e.prev=1,p=null!==(u=null===(c=a[nn.LIQUDITY_OUT_TXN].txn.payment)||void 0===c?void 0:c.amount)&&void 0!==u?u:0n,e.next=5,ct({client:n,pool:r,accountAddr:i});case 5:return l=e.sent,e.next=8,Z(n,[o]);case 8:return d=e.sent,f=x(d,1),g=f[0],h=g.confirmedRound,m=g.txnID,A=K(a),I=$(a),e.next=17,ct({client:n,pool:r,accountAddr:i});case 17:return v=e.sent,(y=v.excessPoolTokens-l.excessPoolTokens)<0n&&(y=0n),e.abrupt("return",{round:h,fees:A,poolTokenID:r.poolTokenID,poolTokenOut:p+y,excessAmount:{excessAmountForAddingLiquidity:y,totalExcessAmount:v.excessPoolTokens},txnID:m,groupID:I});case 23:throw e.prev=23,e.t0=e.catch(1),"SlippageTolerance"===(w=new V(e.t0,"We encountered something unexpected while adding liquidity. Try again later.")).type&&w.setMessage("Adding liquidity failed due to too much slippage in the price. Please adjust the slippage tolerance and try again."),w;case 28:case"end":return e.stop()}}),e,null,[[1,23]])})))).apply(this,arguments)}var un=Object.freeze({__proto__:null,execute:function(e){return on.apply(this,arguments)},generateTxns:function(e){return an.apply(this,arguments)},getQuote:function(e){var t=e.pool,n=e.reserves,r=e.asset1In,a=e.asset2In;if(0n===n.issuedLiquidity){var s=BigInt(Math.floor(Math.sqrt(Number(r)*Number(a))));if(s<=B)throw new Error("Initial liquidity amount is too small. The amount must be greater than ".concat(B,", this quote is for ").concat(s,"."));return{round:Number(n.round),asset1ID:t.asset1ID,asset1In:r,asset2ID:t.asset2ID,asset2In:a,poolTokenID:t.poolTokenID,poolTokenOut:s-B,share:1}}var o=r*n.issuedLiquidity/n.asset1,i=a*n.issuedLiquidity/n.asset2,u=oA){var x=m;r=hn(x,s),t={id:o.id,amount:x+r,decimals:o.decimals,reserves:a.asset1},n={id:i.id,amount:BigInt(Math.abs(Math.min(Number(A),0))),decimals:i.decimals,reserves:a.asset2},f-=r*d/(c*BigInt(2))}else{var I=A;r=hn(I,s),t={id:i.id,amount:I+r,decimals:i.decimals,reserves:a.asset2},n={id:o.id,amount:BigInt(Math.abs(Math.min(Number(m),0))),decimals:o.decimals,reserves:a.asset1},f-=r*d/(p*BigInt(2))}return{poolTokenOutAmount:f,internalSwapQuote:{assetIn:t,assetOut:n,swapFees:r,priceImpact:Me({inputSupply:t.reserves,outputSupply:n.reserves,assetIn:t,assetOut:n})}}}function gn(e,t){if(!e.amount||!t.amount)throw new Error("Both assets are required for the initial add liquidity");return BigInt(Math.floor(Math.abs(Math.sqrt(Number(e.amount)*Number(t.amount))-gt)))}function hn(e,t){return e*BigInt(t)/(BigInt(1e4)-BigInt(t))}function mn(e,t){var n=ln[e];return BigInt(n+1)*t}function An(e){var t=e.txGroup;return(0,e.initiatorSigner)([t])}function xn(e){return In.apply(this,arguments)}function In(){return(In=i(s().mark((function e(t){var n,r,a,o,i,u,c,p,l,d,f,g;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.client,r=t.pool,a=t.txGroup,o=t.signedTxns,e.prev=1,e.next=4,Z(n,[o]);case 4:return i=e.sent,u=x(i,1),c=u[0],p=c.confirmedRound,l=c.txnID,e.prev=9,e.next=12,Wt(n,a);case 12:if(e.t1=f=e.sent,e.t0=null===e.t1,e.t0){e.next=16;break}e.t0=void 0===f;case 16:if(!e.t0){e.next=20;break}e.t2=void 0,e.next=21;break;case 20:e.t2=f.find((function(e){return e.id===r.poolTokenID}));case 21:d=e.t2,e.next=26;break;case 24:e.prev=24,e.t3=e.catch(9);case 26:return e.abrupt("return",{round:p,assetOut:d,fees:K(a),poolTokenID:r.poolTokenID,txnID:l,groupID:$(a)});case 29:throw e.prev=29,e.t4=e.catch(1),"SlippageTolerance"===(g=new V(e.t4,"We encountered something unexpected while adding liquidity. Try again later.")).type&&g.setMessage("Adding liquidity failed due to too much slippage in the price. Please adjust the slippage tolerance and try again."),g;case 34:case"end":return e.stop()}}),e,null,[[1,29],[9,24]])})))).apply(this,arguments)}function vn(){return(vn=i(s().mark((function t(n){var r,a,o,i,u,c,p,l,d,f,g,h,m,A,v,y,w,b;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.client,a=n.network,o=n.poolAddress,i=n.asset1In,u=n.asset2In,c=n.poolTokenOut,p=n.initiatorAddr,l=n.minPoolTokenAssetAmount,t.next=3,r.getTransactionParams().do();case 3:return d=t.sent,f=ke(i,u),g=x(f,2),h=g[0],m=g[1],A=Ne(m.id),v=e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:p,receiver:o,assetIndex:h.id,amount:h.amount,suggestedParams:d}),y=A?e.makePaymentTxnWithSuggestedParamsFromObject({sender:p,receiver:o,amount:m.amount,suggestedParams:d}):e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:p,receiver:o,assetIndex:m.id,amount:m.amount,suggestedParams:d}),(w=e.makeApplicationNoOpTxnFromObject({sender:p,appIndex:He(a,se.V2),note:oe.getAppCallTxnNoteWithClientName(se.V2),appArgs:[].concat(I(tn.v2.FLEXIBLE_MODE),[e.encodeUint64(l)]),accounts:[o],foreignAssets:[c.id],suggestedParams:d})).fee=mn(cn.FLEXIBLE,d.minFee),b=e.assignGroupID([v,y,w]),t.abrupt("return",[{txn:b[0],signers:[p]},{txn:b[1],signers:[p]},{txn:b[2],signers:[p]}]);case 12:case"end":return t.stop()}}),t)})))).apply(this,arguments)}var yn=Object.freeze({__proto__:null,execute:xn,generateTxns:function(e){return vn.apply(this,arguments)},getQuote:function(e){var t=e.pool,n=e.slippage,r=void 0===n?.05:n,a=e.asset1,s=e.asset2;if(0n===t.issuedPoolTokens)throw new Error("Pool has no liquidity at the moment. To be able to do Flexible Swap, you should first add initial liquidity.");if(t.status!==dt.READY)throw new Error("Pool is not ready");if(!t.poolTokenID)throw new Error("Pool token ID is not available");var o={asset1:t.asset1Reserves||0n,asset2:t.asset2Reserves||0n,issuedLiquidity:t.issuedPoolTokens||0n},i=fn({reserves:o,totalFeeShare:t.totalFeeShare,asset1:{id:t.asset1ID,amount:a.amount,decimals:a.decimals},asset2:{id:t.asset2ID,amount:s.amount,decimals:s.decimals}}),u=i.poolTokenOutAmount,c=i.internalSwapQuote,p=u-BigInt(Math.ceil(Number(u)*r));return{asset1In:{id:t.asset1ID,amount:a.amount},asset2In:{id:t.asset2ID,amount:s.amount},poolTokenOut:{id:t.poolTokenID,amount:u},share:Pt.getPoolShare(o.issuedLiquidity+u,u),slippage:r,internalSwapQuote:c,minPoolTokenAssetAmountWithSlippage:p}},signTxns:An});function wn(){return(wn=i(s().mark((function t(n){var r,a,o,i,u,c,p,l,d,f,g,h;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.client,a=n.network,o=n.poolAddress,i=n.assetIn,u=n.poolTokenId,c=n.initiatorAddr,p=n.minPoolTokenAssetAmount,t.next=3,r.getTransactionParams().do();case 3:return l=t.sent,d=Ne(i.id),f=d?e.makePaymentTxnWithSuggestedParamsFromObject({sender:c,receiver:o,amount:i.amount,suggestedParams:l}):e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:c,receiver:o,assetIndex:i.id,amount:i.amount,suggestedParams:l}),(g=e.makeApplicationNoOpTxnFromObject({sender:c,appIndex:He(a,se.V2),note:oe.getAppCallTxnNoteWithClientName(se.V2),appArgs:[].concat(I(tn.v2.SINGLE_ASSET_MODE),[e.encodeUint64(p)]),accounts:[o],foreignAssets:[u],suggestedParams:l})).fee=mn(cn.SINGLE,l.minFee),h=e.assignGroupID([f,g]),t.abrupt("return",[{txn:h[0],signers:[c]},{txn:h[1],signers:[c]}]);case 10:case"end":return t.stop()}}),t)})))).apply(this,arguments)}var bn=Object.freeze({__proto__:null,execute:xn,generateTxns:function(e){return wn.apply(this,arguments)},getQuote:function(e){var t=e.pool,n=e.assetIn,r=e.slippage,a=void 0===r?.05:r,s=e.decimals;if(0n===t.issuedPoolTokens)throw new Error("Pool has no liquidity");if(t.status!==dt.READY)throw new Error("Pool is not ready");if(!t.poolTokenID)throw new Error("Pool token ID is not available");var o=n.id===t.asset1ID,i=n.id===t.asset2ID;if(!o&&!i)throw new Error("Provided input asset id didn't match any asset of the pool");var u={id:t.asset1ID,amount:o?n.amount:0n,decimals:s.asset1},c={id:t.asset2ID,amount:i?n.amount:0n,decimals:s.asset2},p={asset1:t.asset1Reserves||0n,asset2:t.asset2Reserves||0n,issuedLiquidity:t.issuedPoolTokens||0n},l=fn({reserves:p,totalFeeShare:t.totalFeeShare||0,asset1:u,asset2:c}),d=l.poolTokenOutAmount,f=l.internalSwapQuote,g=d-BigInt(Math.ceil(Number(d)*a));return{assetIn:{id:o?t.asset1ID:t.asset2ID,amount:n.amount},poolTokenOut:{id:t.poolTokenID,amount:d},share:Pt.getPoolShare(p.issuedLiquidity+d,d),slippage:a,internalSwapQuote:f,minPoolTokenAssetAmountWithSlippage:g}},signTxns:An});function Tn(){return(Tn=i(s().mark((function t(n){var r,a,o,i,u,c,p,l,d,f,g,h,m;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.client,a=n.pool,o=n.network,i=n.poolAddress,u=n.asset1In,c=n.asset2In,p=n.poolTokenId,l=n.initiatorAddr,d=Ne(a.asset2ID),t.next=4,r.getTransactionParams().do();case 4:return f=t.sent,g=e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:l,receiver:i,assetIndex:a.asset1ID,amount:u.amount,suggestedParams:f}),h=d?e.makePaymentTxnWithSuggestedParamsFromObject({sender:l,receiver:i,amount:c.amount,suggestedParams:f}):e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:l,receiver:i,assetIndex:a.asset2ID,amount:c.amount,suggestedParams:f}),(m=e.makeApplicationNoOpTxnFromObject({sender:l,appIndex:He(o,se.V2),appArgs:tn.v2.INITIAL_LIQUIDITY,note:oe.getAppCallTxnNoteWithClientName(se.V2),accounts:[i],foreignAssets:[p],suggestedParams:f})).fee=mn(cn.INITIAL,f.minFee),t.abrupt("return",e.assignGroupID([g,h,m]).map((function(e){return{txn:e,signers:[l]}})));case 10:case"end":return t.stop()}}),t)})))).apply(this,arguments)}var kn=Object.freeze({__proto__:null,execute:xn,generateTxns:function(e){return Tn.apply(this,arguments)},getQuote:function(e){var t=e.pool,n=e.asset1,r=e.asset2,a=e.slippage,s=void 0===a?.05:a;if(0n!==t.issuedPoolTokens)throw new Error("Pool already has liquidity");var o=BigInt(Math.floor(Math.sqrt(Number(n.amount)*Number(r.amount))));if(o<=BigInt(gt))throw new Error("Initial liquidity amount is too small. Liquidity amount must be greater than ".concat(gt,", this quote is for ").concat(o,"."));return{asset1In:{id:t.asset1ID,amount:n.amount},asset2In:{id:t.asset2ID,amount:r.amount},poolTokenOut:{id:t.poolTokenID,amount:gn(n,r)},slippage:s}},signTxns:An}),En=Object.freeze({__proto__:null,flexible:yn,initial:kn,withSingleAsset:bn}),Nn=l(l({},se.V1_1,un),se.V2,En);var Sn=function(e){return e[e.FEE_TXN=0]="FEE_TXN",e[e.VALIDATOR_APP_CALL_TXN=1]="VALIDATOR_APP_CALL_TXN",e[e.ASSET1_OUT_TXN=2]="ASSET1_OUT_TXN",e[e.ASSET2_OUT_TXN=3]="ASSET2_OUT_TXN",e[e.POOL_TOKEN_IN_TXN=4]="POOL_TOKEN_IN_TXN",e}({}),Pn=Object.values(Sn).length;function Dn(){return(Dn=i(s().mark((function t(n){var r,a,o,i,u,c,p,l,d,f,g,h,m,A,x,I,v,y,w,b;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.client,a=n.pool,o=n.poolTokenIn,i=n.asset1Out,u=n.asset2Out,c=n.slippage,p=n.initiatorAddr,t.next=3,r.getTransactionParams().do();case 3:return l=t.sent,d=a.account.address(),f=Ne(a.asset2ID),g=e.makeApplicationNoOpTxnFromObject({sender:d,appIndex:a.validatorAppID,appArgs:[ne("burn")],note:oe.getAppCallTxnNoteWithClientName(se.V1_1),accounts:[p],foreignAssets:f?[a.asset1ID,a.poolTokenID]:[a.asset1ID,a.asset2ID,a.poolTokenID],suggestedParams:l}),h=W("negative",c,i),m=e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:d,receiver:p,assetIndex:a.asset1ID,amount:h,suggestedParams:l}),A=W("negative",c,u),x=f?e.makePaymentTxnWithSuggestedParamsFromObject({sender:d,receiver:p,amount:A,suggestedParams:l}):e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:d,receiver:p,assetIndex:a.asset2ID,amount:A,suggestedParams:l}),I=e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:p,receiver:d,assetIndex:a.poolTokenID,amount:o,suggestedParams:l}),v=g.fee+m.fee+x.fee,y=e.makePaymentTxnWithSuggestedParamsFromObject({sender:p,receiver:d,amount:v,note:E,suggestedParams:l}),(w=[])[Sn.FEE_TXN]=y,w[Sn.VALIDATOR_APP_CALL_TXN]=g,w[Sn.ASSET1_OUT_TXN]=m,w[Sn.ASSET2_OUT_TXN]=x,w[Sn.POOL_TOKEN_IN_TXN]=I,b=e.assignGroupID(w),t.abrupt("return",[{txn:b[Sn.FEE_TXN],signers:[p]},{txn:b[Sn.VALIDATOR_APP_CALL_TXN],signers:[d.toString()]},{txn:b[Sn.ASSET1_OUT_TXN],signers:[d.toString()]},{txn:b[Sn.ASSET2_OUT_TXN],signers:[d.toString()]},{txn:b[Sn.POOL_TOKEN_IN_TXN],signers:[p]}]);case 22:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function _n(){return(_n=i(s().mark((function t(n){var r,a,o,i,u,c,p,l,d;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.pool,a=n.txGroup,o=n.initiatorSigner,t.next=3,o([a]);case 3:return i=t.sent,u=x(i,2),c=u[0],p=u[1],l=r.account,d=a.map((function(t,n){return n===Sn.FEE_TXN?c:n===Sn.POOL_TOKEN_IN_TXN?p:e.signLogicSigTransactionObject(t.txn,l).blob})),t.abrupt("return",d);case 10:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function Bn(){return(Bn=i(s().mark((function e(t){var n,r,a,o,i,u,c,p,l,d,f,g,h,m,A,I,v,y,w,b,T,k,E,N;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.client,r=t.pool,a=t.txGroup,o=t.signedTxns,i=t.initiatorAddr,e.prev=1,g=null!==(u=null===(c=a[Sn.ASSET1_OUT_TXN].txn.payment)||void 0===c?void 0:c.amount)&&void 0!==u?u:0n,h=null!==(p=null===(l=a[Sn.ASSET2_OUT_TXN].txn.payment)||void 0===l?void 0:l.amount)&&void 0!==p?p:0n,m=null!==(d=null===(f=a[Sn.POOL_TOKEN_IN_TXN].txn.payment)||void 0===f?void 0:f.amount)&&void 0!==d?d:0n,e.next=7,ct({client:n,pool:r,accountAddr:i});case 7:return A=e.sent,e.next=10,Z(n,[o]);case 10:return I=e.sent,v=x(I,1),y=v[0],w=y.confirmedRound,b=y.txnID,e.next=17,ct({client:n,pool:r,accountAddr:i});case 17:return T=e.sent,(k=T.excessAsset1-A.excessAsset1)<0n&&(k=0n),(E=T.excessAsset2-A.excessAsset2)<0n&&(E=0n),e.abrupt("return",{round:w,fees:K(a),asset1ID:r.asset1ID,asset1Out:g+k,asset2ID:r.asset2ID,asset2Out:h+E,poolTokenID:r.poolTokenID,poolTokenIn:m,excessAmounts:[{assetID:r.asset1ID,excessAmountForBurning:k,totalExcessAmount:T.excessAsset1},{assetID:r.asset2ID,excessAmountForBurning:E,totalExcessAmount:T.excessAsset2}],txnID:b,groupID:$(a)});case 25:throw e.prev=25,e.t0=e.catch(1),"SlippageTolerance"===(N=new V(e.t0,"We encountered something unexpected while burning liquidity. Try again later.")).type&&N.setMessage("The burn failed due to too much slippage in the price. Please adjust the slippage tolerance and try again."),N;case 30:case"end":return e.stop()}}),e,null,[[1,25]])})))).apply(this,arguments)}var On={generateTxns:function(e){return Dn.apply(this,arguments)},getQuote:function(e){var t=e.pool,n=e.reserves,r=e.poolTokenIn,a=n.issuedLiquidity&&r*n.asset1/n.issuedLiquidity,s=n.issuedLiquidity&&r*n.asset2/n.issuedLiquidity;return{round:Number(n.round),poolTokenID:t.poolTokenID,poolTokenIn:r,asset1ID:t.asset1ID,asset1Out:a,asset2ID:t.asset2ID,asset2Out:s}},signTxns:function(e){return _n.apply(this,arguments)},execute:function(e){return Bn.apply(this,arguments)}};function Rn(){return(Rn=i(s().mark((function t(n){var r,o,i,u,c,p,l,d,f,g,h,m,A,x,I,v,y,w,b,T;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(n.quote.type!==Pe.Router){t.next=2;break}return t.abrupt("return",ie(a(a({},n),{},{route:n.quote.data})));case 2:if(r=n.client,o=n.initiatorAddr,i=n.slippage,u=n.swapType,c=n.quote,p=c.data,l=p.pool,d=p.quote,f=d.assetInID,g=d.assetOutID,h=l.account.address(),(m=[l.asset1ID,l.asset2ID]).includes(f)&&m.includes(g)&&f!==g){t.next=9;break}throw new V({pool:l,quote:c},"Input asset (#".concat(f,") and output asset (#").concat(g,") provided to generate transactions do not belong to the pool ").concat(h,"."));case 9:return t.next=11,r.getTransactionParams().do();case 11:return A=t.sent,x=Ne(f),I=u===re.FixedInput?d.assetInAmount:W("positive",i,d.assetInAmount),v=u===re.FixedOutput?d.assetOutAmount:W("negative",i,d.assetOutAmount),y=x?e.makePaymentTxnWithSuggestedParamsFromObject({sender:o,receiver:h,amount:I,suggestedParams:A}):e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:o,receiver:h,amount:I,assetIndex:f,suggestedParams:A}),(w=e.makeApplicationNoOpTxnFromObject({sender:o,appIndex:l.validatorAppID,appArgs:[Re,Fe[u],e.encodeUint64(v)],note:oe.getAppCallTxnNoteWithClientName(se.V2,n.appCallNoteExtraData),accounts:[h],foreignAssets:[l.asset1ID,l.asset2ID],suggestedParams:A})).fee=Ve(u,A.minFee),(b=[])[_e.INPUT_TXN]=y,b[_e.APP_CALL_TXN]=w,T=e.assignGroupID(b),t.abrupt("return",[{txn:T[_e.INPUT_TXN],signers:[o]},{txn:T[_e.APP_CALL_TXN],signers:[o]}]);case 23:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function Fn(){return(Fn=i(s().mark((function e(t){var n,r,a,o,i,u,c,p,l,d,f,g,h,m,A,I;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.client,o=t.quote,i=t.txGroup,u=t.signedTxns,e.next=3,Z(a,[u]);case 3:return c=e.sent,p=x(c,1),l=p[0],d=l.confirmedRound,f=l.txnID,g=Ge(o).id,h=je(o),e.prev=10,e.next=13,Wt(a,i);case 13:m=e.sent,e.next=18;break;case 16:e.prev=16,e.t0=e.catch(10);case 18:return A=null===(n=m)||void 0===n||null===(n=n.find((function(e){return e.id===h.id})))||void 0===n?void 0:n.amount,I=null===(r=m)||void 0===r?void 0:r.find((function(e){return e.id===g})),e.abrupt("return",{round:d,assetIn:{amount:h.amount-(A||0n),id:h.id},assetOut:I,quote:o,txnID:f});case 21:case"end":return e.stop()}}),e,null,[[10,16]])})))).apply(this,arguments)}function Cn(){return(Cn=i(s().mark((function e(t){var n,r,a,o,i,u,c,p;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=t.type,r=t.amount,a=t.assetIn,o=t.assetOut,i=t.network,u=t.slippage,c=t.pool,n!==re.FixedInput){e.next=7;break}return e.next=4,Un({assetIn:a,assetOut:o,amount:r,network:i,pool:c,slippage:u});case 4:p=e.sent,e.next=10;break;case 7:return e.next=9,jn({amount:r,assetIn:a,assetOut:o,network:i,pool:c,slippage:u});case 9:p=e.sent;case 10:return e.abrupt("return",p);case 11:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Qn(e){return Promise.allSettled(e).then((function(e){if(e.every((function(e){return"rejected"===e.status}))){var t=e[0].reason;if(2===e.length){var n=e[1].reason;if(Ye(t)&&!Ye(n))throw t;throw n}throw t}return e.filter((function(e){return"fulfilled"===e.status&&e.value})).map((function(e){return e.value}))}))}function Ln(e){var t=e.amount,n=e.assetIn,r=e.assetOut,a=e.pool;if(!Pt.isPoolReady(a))throw new k(T.NoAvailablePoolError,"There is not an available pool for this asset pair");var s,o,i=n.id,u=n.decimals,c=r.id,p=r.decimals,l=t,d=a.totalFeeShare;if(i===a.asset1ID)s=a.asset1Reserves,o=a.asset2Reserves;else{if(i!==a.asset2ID)throw new k(T.AssetDoesNotBelongToPoolError,"Input asset (#".concat(i,") doesn't belong to the pool ").concat(a.account.address(),"."));s=a.asset2Reserves,o=a.asset1Reserves}var f=Xn({inputSupply:s,outputSupply:o,swapInputAmount:l,totalFeeShare:d,decimals:{assetIn:u,assetOut:p}}),g=f.swapOutputAmount,h=f.totalFeeAmount,m=f.priceImpact;if(g>o)throw new k(T.OutputAmountExceedsAvailableLiquidityError,"Output amount exceeds available liquidity.");if(Le(Number(t)))throw new k(T.LowSwapAmountError,"Swap amount is too low.");return{assetInID:i,assetInAmount:l,assetOutID:c,assetOutAmount:g,swapFee:Number(h),rate:z(p,Number(g))/z(u,Number(l)),priceImpact:m}}function Vn(e){var t=e.amount,n=e.assetIn,r=e.assetOut,a=e.pool;if(!a||!Pt.isPoolReady(a))throw new k(T.NoAvailablePoolError,"There is not an available pool for this asset pair");var s,o,i=n.id,u=n.decimals,c=r.id,p=r.decimals,l=t,d=a.totalFeeShare;if(c===a.asset1ID)s=a.asset2Reserves,o=a.asset1Reserves;else{if(c!==a.asset2ID)throw new k(T.AssetDoesNotBelongToPoolError,"Output asset (#".concat(c,") doesn't belong to the pool ").concat(a.account.address(),"."));s=a.asset1Reserves,o=a.asset2Reserves}var f=function(e){var t=e.inputSupply,n=e.outputSupply,r=e.swapOutputAmount,a=e.totalFeeShare,s=e.decimals,o=function(e){var t=e.inputSupply,n=e.outputSupply,r=e.outputAmount,a=t*n,s=a/(n-r)-t;return s+=BigInt(1),s}({inputSupply:t,outputSupply:n,outputAmount:r}),i=function(e){var t=e.swapAmount,n=e.totalFeeShare,r=Math.floor(Number(t*BigInt(1e4)/(BigInt(1e4)-n))),a=BigInt(r)-t;return a}({swapAmount:o,totalFeeShare:a}),u=o+i,c=Me({inputSupply:t,outputSupply:n,assetIn:{amount:u,decimals:s.assetIn},assetOut:{amount:r,decimals:s.assetOut}});return{swapInputAmount:u,totalFeeAmount:i,priceImpact:c}}({inputSupply:s,outputSupply:o,swapOutputAmount:l,totalFeeShare:d,decimals:{assetIn:u,assetOut:p}}),g=f.swapInputAmount,h=f.totalFeeAmount,m=f.priceImpact;if(l>o)throw new k(T.OutputAmountExceedsAvailableLiquidityError,"Output amount exceeds available liquidity.");if(Le(Number(g)))throw new k(T.LowSwapAmountError,"Swap amount is too low.");return{type:Pe.Direct,data:{pool:a,quote:{assetInID:i,assetInAmount:g,assetOutID:c,assetOutAmount:l,swapFee:Number(h),rate:z(p,Number(l))/z(u,Number(g)),priceImpact:m}}}}function Un(e){return Mn.apply(this,arguments)}function Mn(){return(Mn=i(s().mark((function e(t){var n,r,a,o,i,u,c,p;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.amount,r=t.assetIn,a=t.assetOut,o=t.network,i=t.slippage,u=t.pool,c=[],u?c.push(new Promise((function(e,t){try{var s=Ln({amount:n,assetIn:r,assetOut:a,pool:u});e({type:Pe.Direct,data:{pool:u,quote:s}})}catch(e){t(e)}}))):c.push(Promise.reject(new k(T.NoAvailablePoolError,"There is not an available pool for this asset pair"))),c.push(pe({amount:n,assetInID:r.id,assetOutID:a.id,swapType:re.FixedInput,network:o,slippage:i}).then((function(e){return{type:Pe.Router,data:e}}))),e.next=6,Qn(c);case 6:return p=e.sent,e.abrupt("return",ze(p));case 8:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function jn(e){return Gn.apply(this,arguments)}function Gn(){return(Gn=i(s().mark((function e(t){var n,r,a,o,i,u,c,p;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.amount,r=t.assetIn,a=t.assetOut,o=t.network,i=t.slippage,u=t.pool,(c=[new Promise((function(e,t){try{e(Vn({amount:n,assetIn:r,assetOut:a,pool:u}))}catch(e){t(e)}}))]).push(pe({amount:n,assetInID:r.id,assetOutID:a.id,swapType:re.FixedOutput,network:o,slippage:i}).then((function(e){return{type:Pe.Router,data:e}}))),e.next=5,Qn(c);case 5:return p=e.sent,e.abrupt("return",ze(p));case 7:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Xn(e){var t=e.inputSupply,n=e.outputSupply,r=e.swapInputAmount,a=e.totalFeeShare,s=e.decimals,o=function(e){var t=e.inputAmount,n=e.totalFeeShare;return BigInt(Math.floor(Number(t*n)/1e4))}({inputAmount:r,totalFeeShare:a}),i=function(e){var t=e.inputSupply,n=e.outputSupply,r=e.swapAmount,a=t*n,s=n-a/(t+r);return s-=BigInt(1)}({inputSupply:t,outputSupply:n,swapAmount:r-o});return{swapOutputAmount:i,totalFeeAmount:o,priceImpact:Me({inputSupply:t,outputSupply:n,assetIn:{amount:r,decimals:s.assetIn},assetOut:{amount:i,decimals:s.assetOut}})}}var Wn={getQuote:function(e){return Cn.apply(this,arguments)},getFixedInputSwapQuote:Un,getFixedInputDirectSwapQuote:Ln,getFixedOutputDirectSwapQuote:Vn,getFixedOutputSwapQuote:jn,generateTxns:function(e){return Rn.apply(this,arguments)},signTxns:function(e){var t=e.txGroup;return(0,e.initiatorSigner)([t])},execute:function(e){return Fn.apply(this,arguments)},calculateFixedInputSwap:Xn},zn=2,Yn=ne("remove_liquidity"),Jn=function(e){return e[e.ASSET_TRANSFER_TXN=0]="ASSET_TRANSFER_TXN",e[e.APP_CALL_TXN=1]="APP_CALL_TXN",e}({});function qn(e,t){var n,r,a=t.issuedLiquidity;return a>e+BigInt(gt)?(n=e*t.asset1/a,r=e*t.asset2/a):(n=t.asset1,r=t.asset2),{asset1OutputAmount:n,asset2OutputAmount:r}}function Zn(){return(Zn=i(s().mark((function t(n){var r,a,o,i,u,c,p,l,d,f,g,h,m,A;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.client,a=n.pool,o=n.poolTokenIn,i=n.initiatorAddr,u=n.minAsset1Amount,c=n.minAsset2Amount,p=n.slippage,t.next=3,r.getTransactionParams().do();case 3:if(l=t.sent,d=a.account.address(),f=a.poolTokenID){t.next=8;break}throw new Error("Pool token asset ID is missing");case 8:return g=e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:i,receiver:d,assetIndex:f,amount:o,suggestedParams:l}),(h=e.makeApplicationNoOpTxnFromObject({sender:i,appIndex:a.validatorAppID,note:oe.getAppCallTxnNoteWithClientName(se.V2),appArgs:[Yn,e.encodeUint64(W("negative",p,u)),e.encodeUint64(W("negative",p,c))],accounts:[d],foreignAssets:[a.asset1ID,a.asset2ID],suggestedParams:l})).fee=BigInt(zn+1)*l.minFee,(m=[])[Jn.ASSET_TRANSFER_TXN]=g,m[Jn.APP_CALL_TXN]=h,A=e.assignGroupID(m),t.abrupt("return",[{txn:A[Jn.ASSET_TRANSFER_TXN],signers:[i]},{txn:A[Jn.APP_CALL_TXN],signers:[i]}]);case 16:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function Hn(){return(Hn=i(s().mark((function t(n){var r,a,o,i,u,c,p,l,d,f,g,h,m,A,x,I,v,y,w;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.client,a=n.pool,o=n.initiatorAddr,i=n.poolTokenIn,u=n.outputAssetId,c=n.minOutputAssetAmount,p=n.slippage,t.next=3,r.getTransactionParams().do();case 3:if(l=t.sent,d=a.asset1ID,f=a.asset2ID,g=a.account.address(),h=a.poolTokenID){t.next=9;break}throw new Error("Pool token asset ID is missing");case 9:if(m=0n,A=0n,x=W("negative",p,c),u!==d){t.next=17;break}m=x,A=0n,t.next=23;break;case 17:if(u!==f){t.next=22;break}m=0n,A=x,t.next=23;break;case 22:throw new Error("Invalid output asset id. It doesn't match with pool assets");case 23:return I=e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:o,receiver:g,assetIndex:h,amount:i,suggestedParams:l}),(v=e.makeApplicationNoOpTxnFromObject({sender:o,appIndex:a.validatorAppID,note:oe.getAppCallTxnNoteWithClientName(se.V2),appArgs:[Yn,e.encodeUint64(m),e.encodeUint64(A)],accounts:[g],foreignAssets:[u],suggestedParams:l})).fee=BigInt(zn+1)*l.minFee,(y=[])[Jn.ASSET_TRANSFER_TXN]=I,y[Jn.APP_CALL_TXN]=v,w=e.assignGroupID(y),t.abrupt("return",[{txn:w[Jn.ASSET_TRANSFER_TXN],signers:[o]},{txn:w[Jn.APP_CALL_TXN],signers:[o]}]);case 31:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function Kn(){return(Kn=i(s().mark((function e(t){var n,r,a,o,i,u,c;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.client,r=t.txGroup,a=t.signedTxns,e.next=3,Z(n,[a]);case 3:return o=e.sent,i=x(o,1),u=i[0].txnID,e.prev=6,e.next=9,Wt(n,r);case 9:c=e.sent,e.next=14;break;case 12:e.prev=12,e.t0=e.catch(6);case 14:return e.abrupt("return",{outputAssets:c,txnID:u});case 15:case"end":return e.stop()}}),e,null,[[6,12]])})))).apply(this,arguments)}var $n={getQuote:function(e){var t=e.pool,n=e.reserves,r=e.poolTokenIn,a=qn(r,n),s=a.asset1OutputAmount,o=a.asset2OutputAmount;return{round:Number(n.round),asset1Out:{assetId:t.asset1ID,amount:s},asset2Out:{assetId:t.asset2ID,amount:o},poolTokenIn:{assetId:t.poolTokenID,amount:r}}},getSingleAssetRemoveLiquidityQuote:function(e){var t,n=e.pool,r=e.reserves,a=e.poolTokenIn,s=e.assetOutID,o=e.decimals,i=qn(a,r),u=i.asset1OutputAmount,c=i.asset2OutputAmount,p=n.totalFeeShare;if(s===n.asset1ID){var l=Wn.calculateFixedInputSwap({inputSupply:r.asset2-c,outputSupply:r.asset1-u,swapInputAmount:c,totalFeeShare:p,decimals:o}),d=l.swapOutputAmount,f=l.totalFeeAmount,g=l.priceImpact;t={round:Number(r.round),assetOut:{assetId:s,amount:u+d},poolTokenIn:{assetId:n.poolTokenID,amount:a},internalSwapQuote:{amountIn:{assetId:n.asset2ID,amount:c},amountOut:{assetId:n.asset1ID,amount:d},swapFees:{assetId:n.asset2ID,amount:f},priceImpact:g}}}else{if(s!==n.asset2ID)throw new Error("assetOutID must be one of the pool assets");var h=Wn.calculateFixedInputSwap({inputSupply:r.asset1-u,outputSupply:r.asset2-c,swapInputAmount:u,totalFeeShare:p,decimals:o}),m=h.swapOutputAmount,A=h.totalFeeAmount,x=h.priceImpact;t={round:Number(r.round),assetOut:{assetId:s,amount:c+m},poolTokenIn:{assetId:n.poolTokenID,amount:a},internalSwapQuote:{amountIn:{assetId:n.asset2ID,amount:c},amountOut:{assetId:n.asset1ID,amount:m},swapFees:{assetId:n.asset2ID,amount:A},priceImpact:x}}}return t},generateTxns:function(e){return Zn.apply(this,arguments)},generateSingleAssetOutTxns:function(e){return Hn.apply(this,arguments)},signTxns:function(e){var t=e.txGroup;return(0,e.initiatorSigner)([t])},execute:function(e){return Kn.apply(this,arguments)}},er=l(l({},se.V1_1,On),se.V2,$n),tr=3n,nr=1000n,rr=function(e){return e[e.FEE_TXN_INDEX=0]="FEE_TXN_INDEX",e[e.VALIDATOR_APP_CALL_TXN_INDEX=1]="VALIDATOR_APP_CALL_TXN_INDEX",e[e.ASSET_IN_TXN_INDEX=2]="ASSET_IN_TXN_INDEX",e[e.ASSET_OUT_TXN_INDEX=3]="ASSET_OUT_TXN_INDEX",e}(rr||{});function ar(){return(ar=i(s().mark((function t(n){var r,a,o,i,u,c,p,l;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.pool,a=n.txGroup,o=n.initiatorSigner,t.next=3,o([a]);case 3:return i=t.sent,u=x(i,2),c=u[0],p=u[1],l=a.map((function(t,n){return n===rr.FEE_TXN_INDEX?c:n===rr.ASSET_IN_TXN_INDEX?p:e.signLogicSigTransactionObject(t.txn,r.account.lsig).blob})),t.abrupt("return",l);case 9:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function sr(){return(sr=i(s().mark((function t(n){var r,a,o,i,u,c,p,l,d,f,g,h,m,A,x,I,v,y,w,b;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(r=n.client,a=n.quoteAndPool,o=n.swapType,i=n.slippage,u=n.initiatorAddr,c=a.pool,p=a.quote,l=p.assetInID,d=p.assetOutID,f=c.account.address(),(g=[c.asset1ID,c.asset2ID]).includes(l)&&g.includes(d)&&l!==d){t.next=7;break}throw new V({pool:c,quote:p},"Input asset (#".concat(l,") and output asset (#").concat(d,") provided to generate transactions do not belong to the pool ").concat(f,"."));case 7:return t.next=9,r.getTransactionParams().do();case 9:return h=t.sent,m=[ne("swap"),o===re.FixedInput?ne("fi"):ne("fo")],A=e.makeApplicationNoOpTxnFromObject({sender:f,appIndex:c.validatorAppID,appArgs:m,accounts:[u],note:oe.getAppCallTxnNoteWithClientName(se.V1_1),foreignAssets:c.asset2ID==Ae?[c.asset1ID,c.poolTokenID]:[c.asset1ID,c.asset2ID,c.poolTokenID],suggestedParams:h}),x=o===re.FixedOutput?W("positive",i,p.assetInAmount):p.assetInAmount,I=l===Ae?e.makePaymentTxnWithSuggestedParamsFromObject({sender:u,receiver:f,amount:x,suggestedParams:h}):e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:u,receiver:f,assetIndex:l,amount:x,suggestedParams:h}),v=o===re.FixedInput?W("negative",i,p.assetOutAmount):p.assetOutAmount,y=d===Ae?e.makePaymentTxnWithSuggestedParamsFromObject({sender:f,receiver:u,amount:v,suggestedParams:h}):e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:f,receiver:u,assetIndex:d,amount:v,suggestedParams:h}),w=e.makePaymentTxnWithSuggestedParamsFromObject({sender:u,receiver:f,amount:A.fee+y.fee,note:E,suggestedParams:h}),b=e.assignGroupID([w,A,I,y]),t.abrupt("return",[{txn:b[0],signers:[u]},{txn:b[1],signers:[f.toString()]},{txn:b[2],signers:[u]},{txn:b[3],signers:[f.toString()]}]);case 19:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function or(e){var t=e.pool,n=e.reserves,r=e.assetIn,s=e.decimals;if(t.status!==dt.READY)throw new k(T.NoAvailablePoolError,"There is not an available pool for this asset pair");var o,i,u,c=r.amount;if(r.id===t.asset1ID)o=t.asset2ID,i=n.asset1,u=n.asset2;else{if(r.id!==t.asset2ID)throw new k(T.AssetDoesNotBelongToPoolError,"Input asset (#".concat(r.id,") doesn't belong to the pool ").concat(t.account.address(),"."));o=t.asset1ID,i=n.asset2,u=n.asset1}var p=c*tr/nr,l=u-i*u/(i+(c-p));if(l>u)throw new k(T.OutputAmountExceedsAvailableLiquidityError,"Output amount exceeds available liquidity.");var d={assetIn:{amount:c,decimals:s.assetIn},assetOut:{amount:l,decimals:s.assetOut}},f={round:Number(n.round),assetInID:r.id,assetInAmount:c,assetOutID:o,assetOutAmount:l,swapFee:Number(p),rate:Ue(d),priceImpact:Me(a({inputSupply:i,outputSupply:u},d))};return{type:Pe.Direct,data:{pool:t,quote:f}}}function ir(e){return ur.apply(this,arguments)}function ur(){return(ur=i(s().mark((function e(t){var n,r,a,o,i,u,c,p,l,d,f,g,h,m,A,I;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.client,r=t.pool,a=t.signedTxns,o=t.assetIn,i=t.assetOut,u=t.initiatorAddr,e.next=3,ct({client:n,pool:r,accountAddr:u});case 3:return c=e.sent,e.next=6,Z(n,[a]);case 6:return p=e.sent,l=x(p,1),d=l[0],f=d.confirmedRound,g=d.txnID,e.next=13,ct({client:n,pool:r,accountAddr:u});case 13:return h=e.sent,i.id===r.asset1ID?(m=c.excessAsset1,A=h.excessAsset1):(m=c.excessAsset2,A=h.excessAsset2),(I=A-m)<0n&&(I=0n),e.abrupt("return",{round:f,assetInID:o.id,assetInAmount:o.amount,assetOutID:i.id,assetOutAmount:i.amount+I,excessAmount:{assetID:i.id,excessAmountForSwap:I,totalExcessAmount:A},txnID:g});case 18:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function cr(e){var t=e.pool,n=e.reserves,r=e.assetOut,a=e.decimals;if(t.status!==dt.READY)throw new k(T.NoAvailablePoolError,"There is not an available pool for this asset pair");var s,o,i,u=r.amount;if(r.id===t.asset1ID)s=t.asset2ID,o=n.asset2,i=n.asset1;else{if(r.id!==t.asset2ID)throw new k(T.AssetDoesNotBelongToPoolError,"Output asset (#".concat(r.id,") doesn't belong to the pool ").concat(t.account.address(),"."));s=t.asset1ID,o=n.asset1,i=n.asset2}if(u>i)throw new k(T.OutputAmountExceedsAvailableLiquidityError,"Output amount exceeds available liquidity.");var c=o*i/(i-u)-o,p=c*nr/(nr-tr),l=p-c,d=z(a.assetOut,Number(u))/z(a.assetIn,Number(p)),f=z(a.assetOut,Number(i))/z(a.assetIn,Number(o)),g=Y({decimalPlaces:5},Math.abs(d/f-1)),h={round:Number(n.round),assetInID:s,assetInAmount:p,assetOutID:r.id,assetOutAmount:u,swapFee:Number(l),rate:d,priceImpact:g};return{type:Pe.Direct,data:{pool:t,quote:h}}}function pr(e){return lr.apply(this,arguments)}function lr(){return(lr=i(s().mark((function e(t){var n,r,a,o,i,u,c,p,l,d,f,g,h,m,A,I;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.client,r=t.pool,a=t.signedTxns,o=t.assetIn,i=t.assetOut,u=t.initiatorAddr,e.next=3,ct({client:n,pool:r,accountAddr:u});case 3:return c=e.sent,e.next=6,Z(n,[a]);case 6:return p=e.sent,l=x(p,1),d=l[0],f=d.confirmedRound,g=d.txnID,e.next=13,ct({client:n,pool:r,accountAddr:u});case 13:return h=e.sent,o.id===r.asset1ID?(m=c.excessAsset1,A=h.excessAsset1):(m=c.excessAsset2,A=h.excessAsset2),(I=A-m)<0n&&(I=0n),e.abrupt("return",{round:f,assetInID:o.id,assetInAmount:o.amount-I,assetOutID:i.id,assetOutAmount:i.amount,excessAmount:{assetID:o.id,excessAmountForSwap:I,totalExcessAmount:A},txnID:g});case 18:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function dr(){return(dr=i(s().mark((function e(t){var n,r,o,i,u,c,p,l,d,f,g,h,m,A,x,I;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=t.client,r=t.pool,o=t.swapType,i=t.txGroup,u=t.signedTxns,c=t.initiatorAddr,r.status===dt.READY){e.next=3;break}throw new V({pool:r,swapType:o,txGroup:i},"There is not an available pool for this asset pair");case 3:if(e.prev=3,m={id:Number(null===(p=i[rr.ASSET_IN_TXN_INDEX].txn.assetConfig)||void 0===p?void 0:p.assetIndex)||Ae,amount:null!==(l=null===(d=i[rr.ASSET_IN_TXN_INDEX].txn.payment)||void 0===d?void 0:d.amount)&&void 0!==l?l:0n},A={id:Number(null===(f=i[rr.ASSET_OUT_TXN_INDEX].txn.assetConfig)||void 0===f?void 0:f.assetIndex)||Ae,amount:null!==(g=null===(h=i[rr.ASSET_OUT_TXN_INDEX].txn.payment)||void 0===h?void 0:h.amount)&&void 0!==g?g:0n},o!==re.FixedInput){e.next=12;break}return e.next=9,ir({client:n,pool:r,signedTxns:u,assetIn:m,assetOut:A,initiatorAddr:c});case 9:x=e.sent,e.next=15;break;case 12:return e.next=14,pr({client:n,pool:r,signedTxns:u,assetIn:m,assetOut:A,initiatorAddr:c});case 14:x=e.sent;case 15:return e.abrupt("return",a(a({},x),{},{groupID:$(i),fees:K(i)}));case 18:throw e.prev=18,e.t0=e.catch(3),"SlippageTolerance"===(I=new V(e.t0,"We encountered something unexpected while swapping. Try again later.")).type&&I.setMessage("The swap failed due to too much slippage in the price. Please adjust the slippage tolerance and try again."),I;case 23:case"end":return e.stop()}}),e,null,[[3,18]])})))).apply(this,arguments)}var fr={getQuote:function(e,t,n,r,a){return e===re.FixedInput?or({pool:t,reserves:n,assetIn:r,decimals:a}):cr({pool:t,reserves:n,assetOut:r,decimals:a})},getFixedInputSwapQuote:or,getFixedOutputSwapQuote:cr,generateTxns:function(e){return sr.apply(this,arguments)},signTxns:function(e){return ar.apply(this,arguments)},execute:function(e){return dr.apply(this,arguments)},executeFixedOutputSwap:pr};function gr(e){return Promise.allSettled(e).then((function(e){if(e.every((function(e){return"rejected"===e.status}))){var t=x(e.map((function(e){return e.reason})),2),n=t[0],r=t[1];if(Ye(n)&&!Ye(r))throw n;throw r}return e.filter((function(e){return"fulfilled"===e.status&&e.value})).map((function(e){return e.value}))}))}function hr(){return(hr=i(s().mark((function e(t){var n,r,a,o,i,u,c,p,l;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=t.amount,a=t.assetIn,o=t.assetOut,i=t.pools,u=[],(c=i.find((function(e){return e.info.contractVersion===se.V1_1})))?u.push(new Promise((function(e,t){try{e(fr.getFixedInputSwapQuote({pool:c.info,assetIn:{amount:r,id:Number(a.id)},decimals:{assetIn:a.decimals,assetOut:o.decimals},reserves:c.reserves}))}catch(e){t(e)}}))):u.push(Promise.reject(new k(T.NoAvailablePoolError,"Trying to swap from non-existent pool"))),p=i.find((function(e){return e.info.contractVersion===se.V2})),u.push(Wn.getFixedInputSwapQuote({amount:r,assetIn:{id:Se(a),decimals:a.decimals},assetOut:{id:Se(o),decimals:o.decimals},pool:null!==(n=null==p?void 0:p.info)&&void 0!==n?n:null,network:t.network,slippage:t.slippage})),e.next=8,gr(u);case 8:return l=e.sent,e.abrupt("return",ze(l));case 10:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function mr(){return(mr=i(s().mark((function e(t){var n,r,a,o,i,u,c,p,l;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=t.amount,a=t.assetIn,o=t.assetOut,i=t.pools,u=[],(c=i.find((function(e){return e.info.contractVersion===se.V1_1})))?u.push(new Promise((function(e,t){try{e(fr.getFixedOutputSwapQuote({pool:c.info,assetOut:{amount:r,id:Number(o.id)},decimals:{assetIn:a.decimals,assetOut:o.decimals},reserves:c.reserves}))}catch(e){t(e)}}))):u.push(Promise.reject(new k(T.NoAvailablePoolError,"Trying to swap from non-existent pool"))),p=i.find((function(e){return e.info.contractVersion===se.V2})),u.push(Wn.getFixedOutputSwapQuote({amount:r,assetIn:{id:Se(a),decimals:a.decimals},assetOut:{id:Se(o),decimals:o.decimals},pool:null!==(n=null==p?void 0:p.info)&&void 0!==n?n:null,network:t.network,slippage:t.slippage})),e.next=8,gr(u);case 8:return l=e.sent,e.abrupt("return",ze(l));case 10:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var Ar=l(l(l(l(l(l({},se.V1_1,fr),se.V2,Wn),"getQuote",(function(e){var t=e.type;if(t===re.FixedInput)return function(e){return hr.apply(this,arguments)}(e);if(t===re.FixedOutput)return function(e){return mr.apply(this,arguments)}(e);throw new k(T.InvalidSwapTypeError,"Invalid swap type")})),"generateTxns",(function(e){return e.quote.type===Pe.Direct&&Xe(e.quote)===se.V1_1?fr.generateTxns(a(a({},e),{},{quoteAndPool:e.quote.data})):Wn.generateTxns(e)})),"signTxns",(function(e){if(e.quote.type===Pe.Direct&&Xe(e.quote)===se.V1_1){var t=e.quote.data.pool;return fr.signTxns(a(a({},e),{},{pool:t}))}return Wn.signTxns(e)})),"execute",(function(e){return e.contractVersion===se.V1_1?fr.execute(e):Wn.execute(e)}));function xr(){return(xr=i(s().mark((function e(t){var n,r,a,o,i,u,c,p,l,d;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.client,r=t.pool,a=t.txGroup,o=t.initiatorSigner,e.prev=1,e.next=4,Ir({txGroup:a,pool:r,initiatorSigner:o});case 4:return i=e.sent,e.next=7,Z(n,[i]);case 7:return u=e.sent,c=x(u,1),p=c[0],l=p.txnID,d=p.confirmedRound,e.abrupt("return",{fees:K(a),confirmedRound:d,txnID:l,groupID:$(a)});case 15:throw e.prev=15,e.t0=e.catch(1),new V(e.t0,"We encountered something unexpected while redeeming. Try again later.");case 18:case"end":return e.stop()}}),e,null,[[1,15]])})))).apply(this,arguments)}function Ir(e){return vr.apply(this,arguments)}function vr(){return(vr=i(s().mark((function t(n){var r,a,o,i,u,c,p,l;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.txGroup,a=n.pool,o=n.initiatorSigner,t.next=3,o([r]);case 3:return i=t.sent,u=x(i,1),c=u[0],p=a.account.lsig,l=r.map((function(t,n){return 0===n?c:e.signLogicSigTransactionObject(t.txn,p).blob})),t.abrupt("return",l);case 9:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function yr(){return yr=i(s().mark((function t(n){var r,a,o,u,c,p;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.client,a=n.data,o=n.initiatorSigner,t.prev=1,u=a.map((function(e){var t=e.txGroup,n=e.pool;return{txns:t,txnFees:K(t),groupID:$(t),lsig:n.account.lsig}})),t.next=5,o(u.map((function(e){return e.txns})));case 5:return c=t.sent,p=Promise.all(u.map((function(t,n){return new Promise(function(){var a=i(s().mark((function a(o,i){var u,p,l,d,f,g;return s().wrap((function(a){for(;;)switch(a.prev=a.next){case 0:return a.prev=0,u=t.txns.map((function(r,a){return 0===a?c[n]:e.signLogicSigTransactionObject(r.txn,t.lsig).blob})),a.next=4,Z(r,[u]);case 4:p=a.sent,l=x(p,1),d=l[0],f=d.txnID,g=d.confirmedRound,o({fees:t.txnFees,groupID:t.groupID,txnID:f,confirmedRound:g}),a.next=15;break;case 12:a.prev=12,a.t0=a.catch(0),i(a.t0);case 15:case"end":return a.stop()}}),a,null,[[0,12]])})));return function(e,t){return a.apply(this,arguments)}}())}))),t.abrupt("return",p);case 10:throw t.prev=10,t.t0=t.catch(1),new V(t.t0,"We encountered something unexpected while redeeming. Try again later.");case 13:case"end":return t.stop()}}),t,null,[[1,10]])}))),yr.apply(this,arguments)}function wr(){return(wr=i(s().mark((function t(n){var r,a,o,i,u,c,p,l,d,f,g;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.client,a=n.pool,o=n.assetID,i=n.assetOut,u=n.initiatorAddr,t.next=3,r.getTransactionParams().do();case 3:return c=t.sent,p=a.account.address(),l=e.makeApplicationNoOpTxnFromObject({sender:p,appIndex:a.validatorAppID,appArgs:[ne("redeem")],note:oe.getAppCallTxnNoteWithClientName(a.contractVersion),accounts:[u],foreignAssets:0==a.asset2ID?[a.asset1ID,a.poolTokenID]:[a.asset1ID,a.asset2ID,a.poolTokenID],suggestedParams:c}),d=0===o?e.makePaymentTxnWithSuggestedParamsFromObject({sender:p,receiver:u,amount:i,suggestedParams:c}):e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:p,receiver:u,assetIndex:o,amount:i,suggestedParams:c}),f=e.makePaymentTxnWithSuggestedParamsFromObject({sender:u,receiver:p,amount:l.fee+d.fee,note:E,suggestedParams:c}),g=e.assignGroupID([f,l,d]),t.abrupt("return",[{txn:g[0],signers:[u]},{txn:g[1],signers:[p.toString()]},{txn:g[2],signers:[p.toString()]}]);case 10:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function br(e){var t,n={},r=w(e);try{for(r.s();!(t=r.n()).done;){var a=t.value,s=(new TextDecoder).decode(Buffer.from(a.key,"base64")),o=void 0;o=1===a.value.type?a.value.bytes:a.value.uint,n[s]=o}}catch(e){r.e(e)}finally{r.f()}return n}function Tr(e,t,n){return e*t/n}var kr=BigInt(31536e3),Er=BigInt(1e14),Nr=BigInt(1e16),Sr={testnet:548587153,mainnet:1385499515},Pr=14;function Dr(e){return _r.apply(this,arguments)}function _r(){return(_r=i(s().mark((function t(n){var r,a,o,i,u,c;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.client,a=n.network,o=n.assetIDs,i=e.getApplicationAddress(Sr[a]),t.next=4,r.accountInformation(i).do();case 4:return u=t.sent,c=u.assets?u.assets.map((function(e){return e.assetId})):[],t.abrupt("return",o.filter((function(e){return e!==Ae&&!c.includes(BigInt(e))})));case 7:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function Br(){return(Br=i(s().mark((function t(n){var r,a,o,i,u,c,p,l,d,f,g,h,m,A,v,y,w,b,T,k,E,N,P;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.client,a=n.network,o=n.poolAddress,i=n.poolTokenId,u=n.lendingManagerId,c=n.asset1In,p=n.asset2In,l=n.initiatorAddr,d=e.getApplicationAddress(Sr[a]),t.next=4,r.getTransactionParams().do();case 4:return f=t.sent,g=[c,p].sort((function(e,t){return t.fAssetId-e.fAssetId})),h=x(g,2),m=h[0],A=h[1],v=Ne(A.id),y=e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:l,receiver:d,assetIndex:m.id,amount:m.amount,suggestedParams:f}),w=v?e.makePaymentTxnWithSuggestedParamsFromObject({sender:l,receiver:d,amount:A.amount,suggestedParams:f}):e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:l,receiver:d,assetIndex:A.id,amount:A.amount,suggestedParams:f}),(b=e.makeApplicationNoOpTxnFromObject({sender:l,appIndex:Sr[a],appArgs:[ne("add_liquidity"),e.decodeAddress(o).publicKey,e.encodeUint64(m.lendingAppId),e.encodeUint64(A.lendingAppId)],foreignAssets:[m.id,A.id,m.fAssetId,A.fAssetId],foreignApps:[m.lendingAppId,A.lendingAppId,u],accounts:[o],suggestedParams:f})).fee=f.minFee*BigInt(Pr+1),T=He(a,se.V2),k=e.makeApplicationNoOpTxnFromObject({sender:l,appIndex:Sr[a],appArgs:[ne("noop")],foreignAssets:[i],foreignApps:[T],accounts:[o],suggestedParams:f}),E=[y,w,b,k],t.next=16,Dr({client:r,network:a,assetIDs:[m.id,A.id,m.fAssetId,A.fAssetId,i]});case 16:return(N=t.sent).length&&((P=[e.makePaymentTxnWithSuggestedParamsFromObject({sender:l,receiver:d,amount:S*BigInt(N.length),suggestedParams:f}),e.makeApplicationNoOpTxnFromObject({sender:l,appIndex:Sr[a],appArgs:[ne("asset_optin")].concat(I(N.map((function(t){return e.encodeUint64(t)})))),foreignAssets:I(N),suggestedParams:f})])[1].fee=BigInt(N.length+1)*f.minFee,E.unshift.apply(E,P)),t.abrupt("return",e.assignGroupID(E).map((function(e){return{txn:e,signers:[l]}})));case 19:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function Or(){return(Or=i(s().mark((function t(n){var r,a,o,i,u,c,p,l,d,f,g,h,m,A,x,I,v;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.client,a=n.pool,o=n.poolTokenIn,i=n.initiatorAddr,u=n.asset1Out,c=n.asset2Out,p=n.lendingManagerId,l=n.network,d=e.getApplicationAddress(Sr[l]),t.next=4,r.getTransactionParams().do();case 4:if(f=t.sent,g=a.account.address(),h=a.poolTokenID){t.next=9;break}throw new Error("Pool token asset ID is missing");case 9:return m=e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:i,receiver:d,assetIndex:h,amount:o,suggestedParams:f}),(A=e.makeApplicationNoOpTxnFromObject({sender:i,appIndex:Sr[l],appArgs:[ne("remove_liquidity"),g.publicKey,e.encodeUint64(u.lendingAppId),e.encodeUint64(c.lendingAppId)],accounts:[g],foreignAssets:[u.id,c.id,u.fAssetId,c.fAssetId],foreignApps:[u.lendingAppId,c.lendingAppId,p],suggestedParams:f})).fee=f.minFee*BigInt(Pr+1),x=He(l,se.V2),I=e.makeApplicationNoOpTxnFromObject({sender:i,appIndex:Sr[l],appArgs:[ne("noop")],accounts:[g],foreignAssets:[h,u.fAssetId,c.fAssetId],foreignApps:[x],suggestedParams:f}),v=e.assignGroupID([m,A,I]),t.abrupt("return",v.map((function(e){return{txn:e,signers:[i]}})));case 16:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function Rr(e,t,n){var r=BigInt(Math.floor((new Date).getTime()/1e3)-function(e){return null!=e?e:Math.floor((new Date).getTime()/1e3)}(n));return Tr(e,Nr+t*r/kr,Nr)}function Fr(){return(Fr=i(s().mark((function e(t,n){var r,a,o,i,u,c,p,l,d;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t.getApplicationByID(n).do();case 2:return a=e.sent,o=null!==(r=a.params.globalState)&&void 0!==r?r:[],i=br(o),u=Number(Buffer.from(i.pm,"base64").readBigUInt64BE(0)),c=Buffer.from(i.i,"base64"),p=c.readBigUInt64BE(32),l=c.readBigUInt64BE(40),d=Number(c.readBigUInt64BE(48)),e.abrupt("return",{appId:n,managerAppId:u,depositInterestRate:p,depositInterestIndex:l,lastUpdate:d});case 11:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var Cr={AddLiquidity:Object.freeze({__proto__:null,generateTxns:function(e){return Br.apply(this,arguments)},getAddLiquidityTotalFee:function(e,t){return e*BigInt(4+Pr)+(t?BigInt(t+1)*e+BigInt(t)*S:0n)}}),RemoveLiquidity:Object.freeze({__proto__:null,generateTxns:function(e){return Or.apply(this,arguments)},getRemoveLiquidityTotalFee:function(e){return e*BigInt(3+Pr)}}),calculateWithdrawReturn:function(e){var t=e.withdrawAmount,n=Rr(e.depositInterestIndex,e.depositInterestRate,e.lastUpdate);return Tr(BigInt(t),n,Er)},calculateDepositReturn:function(e){var t=e.depositAmount,n=Rr(e.depositInterestIndex,e.depositInterestRate,e.lastUpdate);return t*Er/n},getFolksWrapperAppOptInRequiredAssetIDs:Dr};function Qr(t){var n=t.suggestedParams,r=t.stakingAppID,a=t.initiatorAddr,s=t.liquidityAssetID,o=t.program,i=t.amount,u=e.encodeUint64(i),c=e.encodeUint64(o.id);return e.makeApplicationNoOpTxnFromObject({appIndex:r,sender:a,suggestedParams:n,foreignAssets:[s],accounts:[o.accountAddress],appArgs:[ne("commit"),u],note:M(ne("tinymanStaking/v1:b"),c,e.encodeUint64(s),u)})}function Lr(){return(Lr=i(s().mark((function t(n){var r,a,o,i,u,c,p,l,d,f,g;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.client,a=n.stakingAppID,o=n.program,i=n.requiredAssetID,u=n.liquidityAssetID,c=n.amount,p=n.initiatorAddr,t.next=3,r.getTransactionParams().do();case 3:if(l=t.sent,d=Qr({suggestedParams:l,stakingAppID:a,program:o,liquidityAssetID:u,initiatorAddr:p,amount:c}),f=[d],"number"!=typeof i){t.next=10;break}return g=e.makeApplicationNoOpTxnFromObject({appIndex:a,sender:p,suggestedParams:l,foreignAssets:[i],accounts:[o.accountAddress],appArgs:[ne("log_balance")]}),f=e.assignGroupID([d,g]),t.abrupt("return",[{txn:f[0],signers:[p]},{txn:f[1],signers:[p]}]);case 10:return t.abrupt("return",[{txn:f[0],signers:[p]}]);case 11:case"end":return t.stop()}}),t)})))).apply(this,arguments)}var Vr=604800,Ur=1e3,Mr={testnet:480164661,mainnet:2200606875},jr={testnet:360907790,mainnet:2200609638},Gr={testnet:336189106,mainnet:2200608153},Xr={testnet:383416252,mainnet:2200608887},Wr=2500,zr=400,Yr=604800,Jr=ne("p"),qr=ne("a"),Zr=24,Hr=111300,Kr=Wr+zr*(41+Zr),$r=function(e){return e[e.Against=0]="Against",e[e.For=1]="For",e[e.Abstain=2]="Abstain",e}($r||{}),ea=new Uint8Array(34);function ta(e){if(e instanceof Uint8Array&&"Uint8Array"===e.constructor.name)return e;if(e instanceof ArrayBuffer)return new Uint8Array(e);if(ArrayBuffer.isView(e))return new Uint8Array(e.buffer,e.byteOffset,e.byteLength);throw new Error("Unknown type, must be binary type")}var na=function(e,t){if(e.length>=255)throw new TypeError("Alphabet too long");for(var n=new Uint8Array(256),r=0;r>>0,o=new Uint8Array(s);e[t];){var p=n[e.charCodeAt(t)];if(255===p)return;for(var l=0,d=s-1;(0!==p||l>>0,o[d]=p%256>>>0,p=p/256>>>0;if(0!==p)throw new Error("Non-zero carry");a=l,t++}if(" "!==e[t]){for(var f=s-a;f!==s&&0===o[f];)f++;for(var g=new Uint8Array(r+(s-f)),h=r;f!==s;)g[h++]=o[f++];return g}}}return{encode:function(t){if(t instanceof Uint8Array||(ArrayBuffer.isView(t)?t=new Uint8Array(t.buffer,t.byteOffset,t.byteLength):Array.isArray(t)&&(t=Uint8Array.from(t))),!(t instanceof Uint8Array))throw new TypeError("Expected Uint8Array");if(0===t.length)return"";for(var n=0,r=0,a=0,s=t.length;a!==s&&0===t[a];)a++,n++;for(var o=(s-a)*p+1>>>0,c=new Uint8Array(o);a!==s;){for(var l=t[a],d=0,f=o-1;(0!==l||d>>0,c[f]=l%i>>>0,l=l/i>>>0;if(0!==l)throw new Error("Non-zero carry");r=d,a++}for(var g=o-r;g!==o&&0===c[g];)g++;for(var h=u.repeat(n);gta(a(e))})}function la({name:e,prefix:t,bitsPerChar:n,alphabet:r}){return ca({prefix:t,name:e,encode:e=>function(e,t,n){const r="="===t[t.length-1],a=(1<n;)o-=n,s+=t[a&i>>o];if(0!==o&&(s+=t[a&i<function(e,t,n,r){const a={};for(let e=0;e=8&&(i-=8,o[c++]=255&u>>i)}if(i>=n||0!=(255&u<<8-i))throw new SyntaxError("Unexpected end of data");return o}(t,r,n,e)})}const da=la({prefix:"b",name:"base32",alphabet:"abcdefghijklmnopqrstuvwxyz234567",bitsPerChar:5});la({prefix:"B",name:"base32upper",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",bitsPerChar:5}),la({prefix:"c",name:"base32pad",alphabet:"abcdefghijklmnopqrstuvwxyz234567=",bitsPerChar:5}),la({prefix:"C",name:"base32padupper",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=",bitsPerChar:5}),la({prefix:"v",name:"base32hex",alphabet:"0123456789abcdefghijklmnopqrstuv",bitsPerChar:5}),la({prefix:"V",name:"base32hexupper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUV",bitsPerChar:5}),la({prefix:"t",name:"base32hexpad",alphabet:"0123456789abcdefghijklmnopqrstuv=",bitsPerChar:5}),la({prefix:"T",name:"base32hexpadupper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUV=",bitsPerChar:5}),la({prefix:"h",name:"base32z",alphabet:"ybndrfg8ejkmcpqxot1uwisza345h769",bitsPerChar:5});const fa=pa({prefix:"k",name:"base36",alphabet:"0123456789abcdefghijklmnopqrstuvwxyz"});pa({prefix:"K",name:"base36upper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"});const ga=pa({name:"base58btc",prefix:"z",alphabet:"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"});pa({name:"base58flickr",prefix:"Z",alphabet:"123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"});var ha=function e(t,n,r){n=n||[];var a=r=r||0;for(;t>=xa;)n[r++]=255&t|ma,t/=128;for(;t&Aa;)n[r++]=255&t|ma,t>>>=7;return n[r]=0|t,e.bytes=r-a+1,n},ma=128,Aa=-128,xa=Math.pow(2,31);var Ia=function e(t,n){var r,a=0,s=0,o=n=n||0,i=t.length;do{if(o>=i)throw e.bytes=0,new RangeError("Could not decode varint");r=t[o++],a+=s<28?(r&ya)<=va);return e.bytes=o-n,a},va=128,ya=127;var wa=Math.pow(2,7),ba=Math.pow(2,14),Ta=Math.pow(2,21),ka=Math.pow(2,28),Ea=Math.pow(2,35),Na=Math.pow(2,42),Sa=Math.pow(2,49),Pa=Math.pow(2,56),Da=Math.pow(2,63),_a={encode:ha,decode:Ia,encodingLength:function(e){return e{const[n,r]=Ba(e.subarray(t));return t+=r,n};let r=n(),a=Ma;if(18===r?(r=0,t=0):a=n(),0!==r&&1!==r)throw new RangeError(`Invalid CID version ${r}`);const s=t,o=n(),i=n(),u=t+i;return{version:r,codec:a,multihashCode:o,digestSize:i,multihashSize:u-s,size:u}}static parse(e,t){const[n,r]=function(e,t){switch(e[0]){case"Q":{const n=t??ga;return[ga.prefix,n.decode(`${ga.prefix}${e}`)]}case ga.prefix:{const n=t??ga;return[ga.prefix,n.decode(e)]}case da.prefix:{const n=t??da;return[da.prefix,n.decode(e)]}case fa.prefix:{const n=t??fa;return[fa.prefix,n.decode(e)]}default:if(null==t)throw Error("To parse non base32, base36 or base58btc encoded CID multibase decoder must be provided");return[e[0],t.decode(e)]}}(e,t),a=Ua.decode(r);if(0===a.version&&"Q"!==e[0])throw Error("Version 0 CID string must not include multibase prefix");return Va(a).set(n,e),a}}const Ma=112,ja=18;function Ga(e,t,n){const r=Ra(e),a=r+Ra(t),s=new Uint8Array(a+n.byteLength);return Oa(e,s,0),Oa(t,s,r),s.set(n,a),s}const Xa=Symbol.for("@ipld/js-cid/CID");class Wa{name;code;encode;constructor(e,t,n){this.name=e,this.code=t,this.encode=n}digest(e){if(e instanceof Uint8Array){const t=this.encode(e);return t instanceof Uint8Array?Fa(this.code,t):t.then((e=>Fa(this.code,e)))}throw Error("Unknown type, must be binary type")}}const za=85,Ya=function({name:e,code:t,encode:n}){return new Wa(e,t,n)}({name:"sha2-256",code:18,encode:e=>ta(n.createHash("sha256").update(e).digest())});var Ja=126144e3,qa=1e7,Za=Math.pow(2,64),Ha=48,Ka=21,$a=48,es=ne("tp"),ts=ne("sc"),ns=28100,rs=12900,as=421700,ss=409700;function os(e){var t=e/Yr;return(arguments.length>1&&void 0!==arguments[1]&&arguments[1]?Math.floor(t):Math.ceil(t))*Yr}function is(e,t){if(e>t)throw new Error("Old timestamp must be less than or equal to new timestamp");for(var n=[],r=os(e)+Yr;re?r=t?e*e*Za/(2*t):0:r=(e+(e-r))*n/2;return r}function gs(e,t){return hs.apply(this,arguments)}function hs(){return(hs=i(s().mark((function e(t,n){var r;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t.getApplicationByID(n).do();case 2:return r=e.sent,e.abrupt("return",ms(r));case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ms(e){var t,n,r={},a=w(null!==(t=e.params.globalState)&&void 0!==t?t:[]);try{for(a.s();!(n=a.n()).done;){var s=n.value,o=Buffer.from(s.key).toString(),i=void 0;i=1===s.value.type?s.value.bytes:s.value.uint,r[o]=i}}catch(e){a.e(e)}finally{a.f()}return r}function As(){return(As=i(s().mark((function e(t){var n,r,a;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=(new TextEncoder).encode(t),e.next=3,Ya.digest(n);case 3:return r=e.sent,a=Ua.createV1(za,r),e.abrupt("return",a.toString(da));case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function xs(){for(var t=arguments.length,n=new Array(t),r=0;r0?Ka-e:0}},{key:"lastAccountPowerBoxIndex",get:function(){return Cs(BigInt(this.powerCount))[0]}},{key:"lastAccountPowerArrayIndex",get:function(){return Cs(BigInt(this.powerCount))[1]}}])}(),Ss=function(){return p((function e(t,n,r,a){u(this,e),this.bias=t,this.timestamp=n,this.slope=r,this.cumulativePower=a}),[{key:"lockEndTimestamp",get:function(){var e=this.bias*Math.pow(2,64)/this.slope;return this.timestamp+e}},{key:"cumulativePowerAt",value:function(e){var t=e-this.timestamp;if(t<0)throw new Error("Time delta must be greater than or equal to 0");return this.cumulativePower+fs(this.bias,this.slope,t)}}])}(),Ps=p((function e(t,n,r,a){u(this,e),this.bias=t,this.timestamp=n,this.slope=r,this.cumulativePower=a})),Ds=p((function e(t){u(this,e),this.slopeDelta=t})),_s=function(){return p((function e(t,n,r,a){u(this,e),this.totalLockedAmount=t,this.totalPowerCount=n,this.lastTotalPowerTimestamp=Number(r),this.tinyAssetId=Number(a)}),[{key:"freeTotalPowerSpaceCount",get:function(){var e=Number(this.totalPowerCount%BigInt(Ka));return e>0?Ka-e:0}},{key:"lastTotalPowerBoxIndex",get:function(){return Cs(this.totalPowerCount)[0]}},{key:"lastTotalPowerArrayIndex",get:function(){return Cs(this.totalPowerCount)[1]}}])}();function Bs(){return(Bs=i(s().mark((function e(t,n,r){var a,o;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a=Rs(r),e.prev=1,e.next=4,us(t,n,a);case 4:if(!(o=e.sent)){e.next=7;break}return e.abrupt("return",Os(o));case 7:return e.abrupt("return",null);case 10:return e.prev=10,e.t0=e.catch(1),console.log(e.t0),e.abrupt("return",null);case 14:case"end":return e.stop()}}),e,null,[[1,10]])})))).apply(this,arguments)}function Os(e){var t=Buffer.from(e);return new Ns(t.readUIntBE(0,8),t.readUIntBE(8,8),t.readUIntBE(16,8),t.readUIntBE(24,8))}function Rs(t){return e.decodeAddress(t).publicKey}function Fs(e){var t=ee(e),n=new Uint8Array(es.length+t.length);return n.set(es,0),n.set(t,es.length),n}function Cs(e){var t=e-1n;return[Number(t/BigInt(Ka)),Number(t%BigInt(Ka))]}function Qs(t,n){var r=e.decodeAddress(t).publicKey,a=ee(n),s=new Uint8Array(r.length+a.length);return s.set(r,0),s.set(a,r.length),s}function Ls(e,t,n){return Vs.apply(this,arguments)}function Vs(){return(Vs=i(s().mark((function e(t,n,r){var a,o;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a=Ms(r),e.next=3,us(t,n,a);case 3:if(o=e.sent){e.next=6;break}return e.abrupt("return",null);case 6:return e.abrupt("return",Us(o));case 7:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Us(t){return new Ds(Number(e.bytesToBigInt(t.slice(t.length-16,t.length))))}function Ms(e){return M(ts,ee(e))}function js(e,t,n){return Gs.apply(this,arguments)}function Gs(){return(Gs=i(s().mark((function e(t,n,r){var a,o,i,u,c;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:a=0,r&&(a=Number((r+BigInt(Ka-1))/BigInt(Ka))),o=[],i=0;case 4:if(!(i=e[r].timestamp))break;n=r}return n}function Js(e){for(var t,n=Ha,r=[],a=0;a=11)throw new Error("Boxes' length cannot be larger than 10");var b=d.slice(0,6),T=[e.makeApplicationNoOpTxnFromObject({sender:s,suggestedParams:c,appIndex:n,appArgs:[ne("claim_rewards"),ee(o),ee(i),M.apply(void 0,I(u.map((function(e){return ee(e)}))))],foreignApps:[r],foreignAssets:[a],boxes:b,note:l?ne(l):void 0})];T[0].fee=T[0].fee*BigInt(i+2);var k=0,E=92+865*i,N=700+700*i;if(E>N&&(k=Math.floor((E-N)/666)+1),k||d.length>6){var S=d.slice(6),P=ho({sender:s,suggestedParams:c,extraAppArgs:[ee(Math.max(k-1,0))],index:n,foreignApps:[r],boxes:S});P.fee*=BigInt(Math.max(k,1)),T.unshift(P)}if(p){var D=e.makePaymentTxnWithSuggestedParamsFromObject({sender:s,receiver:e.getApplicationAddress(n),amount:to,suggestedParams:c});T.unshift(D)}return e.assignGroupID(T)}function Ao(e,t){return 0===Buffer.compare(e,t)}function xo(e){for(var t=0n,n=0;nIo)throw new Error("You cannot cast vote for more than ".concat(Io," different pools"));if(100!==i.reduce((function(e,t){return e+t}),0))throw new Error("The sum of the votes must equal 100%");var g,h=M.apply(void 0,I(i.map((function(e){return ee(e)})))),m=M.apply(void 0,I(u.map((function(e){return ee(e)})))),A=function(e){return M(vo,ne(e))}(s),x=Eo(a,Math.floor(o.index/8192)),v=!p.some((function(e){return Ao(e,x)})),y=Rs(a),b=Math.floor(c/Ka),T=Qs(a,b),k=Qs(a,b+1),E=0,N=[],S=w(u);try{var P=function(){var e=g.value,t=function(e,t){return M(wo,ee(e),ee(t))}(o.index,e);N.push({appIndex:n,name:t}),p.some((function(e){return Ao(e,t)}))||(E+=1)};for(S.s();!(g=S.n()).done;)P()}catch(e){S.e(e)}finally{S.f()}var D=[{appIndex:n,name:A},{appIndex:n,name:x}].concat(N,[{appIndex:r,name:y},{appIndex:r,name:T},{appIndex:r,name:k}]),_=[e.makeApplicationNoOpTxnFromObject({sender:a,suggestedParams:l,appIndex:n,appArgs:[ne("cast_vote"),ne(s),h,m,ee(c)],foreignApps:[r],boxes:D.slice(0,7),note:f?ne(f):void 0})];_[0].fee*=2n,D.length>=7&&_.push(ho({sender:a,suggestedParams:l,index:r,foreignApps:[n],boxes:D.slice(7,14)})),D.length>=14&&_.push(ho({sender:a,suggestedParams:l,index:r,foreignApps:[n],boxes:D.slice(14)}));var B=Number(v)*bo+E*To;return B&&(_=[e.makePaymentTxnWithSuggestedParamsFromObject({sender:a,receiver:e.getApplicationAddress(n),suggestedParams:l,amount:B})].concat(I(_))),e.assignGroupID(_)}function Do(t){var n=t.accountState,r=t.lockEndTime,a=t.lockedAmount,s=t.network,o=t.sender,i=t.vaultAppGlobalState,u=t.suggestedParams,c=t.slopeChangeAtLockEndTime,p=t.appCallNote;if(ai.freeTotalPowerSpaceCount&&(T+=ss),c||(T+=rs);var k=[e.makeAssetTransferTxnWithSuggestedParamsFromObject({amount:a,assetIndex:ve[s],sender:o,receiver:e.getApplicationAddress(l),suggestedParams:u}),e.makeApplicationNoOpTxnFromObject({appIndex:l,sender:o,suggestedParams:u,appArgs:[ne("create_lock"),ee(r)],boxes:d.slice(0,8),note:p}),ho({sender:o,suggestedParams:u,index:l,boxes:d.slice(8)})];if(T){var E=e.makePaymentTxnWithSuggestedParamsFromObject({sender:o,receiver:e.getApplicationAddress(l),amount:T,suggestedParams:u});k.unshift(E)}return e.assignGroupID(k)}function _o(t){var n=t.accountState,r=t.lockedAmount,a=t.network,s=t.sender,o=t.vaultAppGlobalState,i=t.suggestedParams,u=t.appCallNote;if(ro.freeTotalPowerSpaceCount&&(v+=ss),!n.freeAccountPowerSpaceCount){var y=Qs(s,n.lastAccountPowerBoxIndex+1);h.push({appIndex:Mr[a],name:y}),v+=as}var b=[e.makeAssetTransferTxnWithSuggestedParamsFromObject({assetIndex:ve[a],sender:s,receiver:e.getApplicationAddress(Mr[a]),amount:r,suggestedParams:i}),e.makeApplicationNoOpTxnFromObject({appIndex:Mr[a],sender:s,suggestedParams:i,appArgs:[ne("increase_lock_amount")],boxes:h,note:u}),ho({sender:s,suggestedParams:i,index:Mr[a]})];if(v){var T=e.makePaymentTxnWithSuggestedParamsFromObject({sender:s,receiver:e.getApplicationAddress(Mr[a]),amount:v,suggestedParams:i});b.unshift(T)}return e.assignGroupID(b)}function Bo(t){var n=t.accountState,r=t.network,a=t.newLockEndTime,s=t.slopeChangeAtNewLockEndTime,o=t.sender,i=t.vaultAppGlobalState,u=t.suggestedParams,c=t.appCallNote;if(a%Yr)throw new Error("Invalid lock end time");if(a<=n.lockEndTime)throw new Error("New lock end time must be greater than current lock end time");var p=Rs(o),l=Qs(o,n.lastAccountPowerBoxIndex),d=Fs(i.lastTotalPowerBoxIndex),f=Fs(i.lastTotalPowerBoxIndex+1),g=Ms(n.lockEndTime),h=Ms(a),m=[{appIndex:Mr[r],name:p},{appIndex:Mr[r],name:l},{appIndex:Mr[r],name:d},{appIndex:Mr[r],name:f},{appIndex:Mr[r],name:g},{appIndex:Mr[r],name:h}];if(!n.freeAccountPowerSpaceCount){var A=Qs(o,n.lastAccountPowerBoxIndex+1);m.push({appIndex:Mr[r],name:A})}var x,I=is(i.lastTotalPowerTimestamp,Math.floor(Date.now()/1e3)),v=I.length,y=w(I);try{for(y.s();!(x=y.n()).done;){var b=x.value;if(b%Yr==0){var T=Ms(b);m.push({appIndex:Mr[r],name:T})}}}catch(e){y.e(e)}finally{y.f()}var k=0;s||(k+=rs),n.freeAccountPowerSpaceCount||(k+=as),v>i.freeTotalPowerSpaceCount&&(k+=ss);var E=[e.makeApplicationNoOpTxnFromObject({appIndex:Mr[r],sender:o,suggestedParams:u,appArgs:[ne("extend_lock_end_time"),ee(a)],boxes:m.slice(0,8),note:c}),ho({sender:o,suggestedParams:u,index:Mr[r],boxes:m.slice(8)})];if(k){var N=e.makePaymentTxnWithSuggestedParamsFromObject({sender:o,receiver:e.getApplicationAddress(Mr[r]),amount:k,suggestedParams:u});E.unshift(N)}return e.assignGroupID(E)}function Oo(t){var n=t.accountState,r=t.network,a=t.sender,s=t.suggestedParams,o=t.appCallNote,i=Rs(a),u=Qs(a,n.lastAccountPowerBoxIndex),c=Qs(a,n.lastAccountPowerBoxIndex+1),p=[{appIndex:Mr[r],name:i},{appIndex:Mr[r],name:u},{appIndex:Mr[r],name:c}],l=e.makeApplicationNoOpTxnFromObject({appIndex:Mr[r],sender:a,suggestedParams:s,appArgs:[ne("withdraw")],foreignAssets:[ve[r]],boxes:p,note:o});l.fee*=2n;var d=[l];if(!n.freeAccountPowerSpaceCount){var f=e.makePaymentTxnWithSuggestedParamsFromObject({sender:a,receiver:e.getApplicationAddress(Mr[r]),amount:as,suggestedParams:s});d.unshift(f)}return e.assignGroupID(d)}var Ro=function(){return p((function e(t,n,r){u(this,e),this.algodClient=t,this.userAddress=n,this.network=r}),[{key:"getTinyPower",value:(y=i(s().mark((function e(){var t,n,r,a,o,i,u,c=arguments;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=c.length>0&&void 0!==c[0]?c[0]:Math.floor(Date.now()/Ur),e.next=3,this.fetchAccountState();case 3:if(n=e.sent){e.next=6;break}return e.abrupt("return",0);case 6:return e.next=8,Ws({algodClient:this.algodClient,address:this.userAddress,appId:Mr[this.network],powerCount:n.powerCount});case 8:if(r=e.sent,null!==(a=Ys(r,t))){e.next=12;break}return e.abrupt("return",0);case 12:return o=r[a],i=t-o.timestamp,u=Math.max(o.bias-ds(o.slope,i),0),e.abrupt("return",u);case 16:case"end":return e.stop()}}),e,this)}))),function(){return y.apply(this,arguments)})},{key:"getTotalTinyPower",value:(v=i(s().mark((function e(){var t,n,r,a,o,i,u,c,p,l,d,f,g,h,m,A,x,I,v=arguments;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=v.length>0&&void 0!==v[0]?v[0]:Math.floor(Date.now()/Ur),e.next=3,this.fetchVaultAppGlobalState();case 3:if(n=e.sent){e.next=6;break}return e.abrupt("return",0);case 6:return e.next=8,js(this.algodClient,Mr[this.network],n.totalPowerCount);case 8:if(r=e.sent,a=Ys(r,t)){e.next=12;break}return e.abrupt("return",0);case 12:o=r[a],i=Math.floor(o.timestamp/Yr),u=Math.floor(t/Yr)-i,c=Array.from({length:u},(function(e,t){return(i+t)*Yr})),p=c.map((function(e,t){return[0===t?o.timestamp:c[t-1],e]})),l=o.slope,d=o.bias,f=w(p),e.prev=19,f.s();case 21:if((g=f.n()).done){e.next=34;break}return h=g.value,m=h[1]-h[0],A=ds(l,m),d=Math.max(d-A,0),e.next=28,Ls(this.algodClient,Mr[this.network],h[1]);case 28:x=e.sent,I=(null==x?void 0:x.slopeDelta)||0,l=Math.max(l-I,0),0!==d&&0!==l||(d=0,l=0);case 32:e.next=21;break;case 34:e.next=39;break;case 36:e.prev=36,e.t0=e.catch(19),f.e(e.t0);case 39:return e.prev=39,f.f(),e.finish(39);case 42:return e.abrupt("return",d);case 43:case"end":return e.stop()}}),e,this,[[19,36,39,42]])}))),function(){return v.apply(this,arguments)})},{key:"getCumulativeTinyPower",value:(x=i(s().mark((function e(){var t,n,r,a,o,i,u,c,p=arguments;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=p.length>0&&void 0!==p[0]?p[0]:Math.floor(Date.now()/Ur),e.next=3,this.fetchAccountState();case 3:if(n=e.sent){e.next=6;break}return e.abrupt("return",0);case 6:return e.next=8,Ws({algodClient:this.algodClient,address:this.userAddress,appId:Mr[this.network],powerCount:n.powerCount});case 8:if(r=e.sent,null!==(a=Ys(r,t))){e.next=12;break}return e.abrupt("return",0);case 12:return o=r[a],i=t-o.timestamp,u=fs(o.bias,o.slope,i),c=o.cumulativePower-u,e.abrupt("return",c);case 17:case"end":return e.stop()}}),e,this)}))),function(){return x.apply(this,arguments)})},{key:"fetchVaultAppGlobalState",value:(A=i(s().mark((function e(){var t;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,gs(this.algodClient,Mr[this.network]);case 3:return t=e.sent,e.abrupt("return",new _s(t.total_locked_amount,t.total_power_count,t.last_total_power_timestamp,t.tiny_asset_id));case 7:return e.prev=7,e.t0=e.catch(0),console.error(e.t0),e.abrupt("return",null);case 11:case"end":return e.stop()}}),e,this,[[0,7]])}))),function(){return A.apply(this,arguments)})},{key:"generateCreateLockTransactions",value:(m=i(s().mark((function e(t){var n,r,a,o,i,u,c,p,l;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.lockedAmount,r=t.lockEndTime,a=t.userAddress,o=t.suggestedParams,i=a||this.userAddress,e.next=4,this.fetchAccountState();case 4:return u=e.sent,e.next=7,this.fetchVaultAppGlobalState();case 7:if(c=e.sent,p=o,c){e.next=11;break}throw new Error("There was an error while fetching vault app global state");case 11:if(p){e.next=15;break}return e.next=14,this.algodClient.getTransactionParams().do();case 14:p=e.sent;case 15:return e.next=17,Ls(this.algodClient,Mr[this.network],r);case 17:return l=e.sent,e.abrupt("return",Do({lockedAmount:n,lockEndTime:r,vaultAppGlobalState:c,slopeChangeAtLockEndTime:l,sender:i,network:this.network,accountState:u,suggestedParams:p}));case 19:case"end":return e.stop()}}),e,this)}))),function(e){return m.apply(this,arguments)})},{key:"generateIncreaseLockAmountTransactions",value:(h=i(s().mark((function e(t){var n,r,a,o,i,u,c;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.lockedAmount,r=t.userAddress,a=t.suggestedParams,o=r||this.userAddress,e.next=4,this.fetchAccountState();case 4:return i=e.sent,e.next=7,this.fetchVaultAppGlobalState();case 7:if(u=e.sent,c=a,u){e.next=11;break}throw new Error("There was an error while fetching vault app global state");case 11:if(i){e.next=13;break}throw new Error("There was an error while fetcing the account state");case 13:if(c){e.next=17;break}return e.next=16,this.algodClient.getTransactionParams().do();case 16:c=e.sent;case 17:return e.abrupt("return",_o({accountState:i,lockedAmount:n,network:this.network,sender:o,vaultAppGlobalState:u,suggestedParams:c}));case 18:case"end":return e.stop()}}),e,this)}))),function(e){return h.apply(this,arguments)})},{key:"generateExtendLockTimeTransactions",value:(g=i(s().mark((function e(t){var n,r,a,o,i,u,c,p;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.newLockEndTime,r=t.userAddress,a=t.suggestedParams,o=r||this.userAddress,e.next=4,this.fetchAccountState();case 4:return i=e.sent,e.next=7,this.fetchVaultAppGlobalState();case 7:if(u=e.sent,c=a,u){e.next=11;break}throw new Error("There was an error while fetching vault app global state");case 11:if(i){e.next=13;break}throw new Error("There was an error while fetcing the account state");case 13:if(c){e.next=17;break}return e.next=16,this.algodClient.getTransactionParams().do();case 16:c=e.sent;case 17:return e.next=19,Ls(this.algodClient,Mr[this.network],n);case 19:return p=e.sent,e.abrupt("return",Bo({accountState:i,network:this.network,newLockEndTime:n,sender:o,vaultAppGlobalState:u,suggestedParams:c,slopeChangeAtNewLockEndTime:null==p?void 0:p.slopeDelta}));case 21:case"end":return e.stop()}}),e,this)}))),function(e){return g.apply(this,arguments)})},{key:"generateIncreaseLockAmountAndExtendLockEndTimeTransactions",value:(f=i(s().mark((function e(t){var n,r,a,o,i,u,c,p,l,d,f,g;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.lockAmount,r=t.lockEndTime,a=t.userAddress,o=t.suggestedParams,i=a||this.userAddress,e.next=4,this.fetchAccountState();case 4:return u=e.sent,e.next=7,this.fetchVaultAppGlobalState();case 7:if(c=e.sent,p=[],l=[],d=o,c){e.next=13;break}throw new Error("There was an error while fetching vault app global state");case 13:if(u){e.next=15;break}throw new Error("There was an error while fetcing the account state");case 15:if(d){e.next=19;break}return e.next=18,this.algodClient.getTransactionParams().do();case 18:d=e.sent;case 19:return p=_o({accountState:u,lockedAmount:n,network:this.network,sender:i,vaultAppGlobalState:c,suggestedParams:d}),u.powerCount+=1,c.totalPowerCount+=1n,e.next=24,Ls(this.algodClient,Mr[this.network],r);case 24:return f=e.sent,l=Bo({accountState:u,network:this.network,newLockEndTime:r,sender:i,vaultAppGlobalState:c,suggestedParams:d,slopeChangeAtNewLockEndTime:null==f?void 0:f.slopeDelta}),g=[].concat(I(p),I(l)),e.abrupt("return",Boolean(p.length)&&Boolean(l.length)?xs(p,l):g);case 28:case"end":return e.stop()}}),e,this)}))),function(e){return f.apply(this,arguments)})},{key:"generateWithdrawTransactions",value:(d=i(s().mark((function e(t,n,r){var a,o,i,u,c;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a=t||this.userAddress,e.next=3,this.fetchAccountState();case 3:if(o=e.sent,i=r,o){e.next=7;break}throw new Error("There was an error while fetcing the account state");case 7:if(i){e.next=11;break}return e.next=10,this.algodClient.getTransactionParams().do();case 10:i=e.sent;case 11:if(u=Oo({accountState:o,network:this.network,sender:a,suggestedParams:i,client:this.algodClient}),!n){e.next=17;break}return e.next=15,be({client:this.algodClient,initiatorAddr:a,assetID:ve[this.network]});case 15:c=e.sent,u=xs([c[0].txn],u);case 17:return e.abrupt("return",u);case 18:case"end":return e.stop()}}),e,this)}))),function(e,t,n){return d.apply(this,arguments)})},{key:"fetchAccountState",value:function(){return function(e,t,n){return Bs.apply(this,arguments)}(this.algodClient,Mr[this.network],this.userAddress)}},{key:"fetchStakingDistributionProposal",value:function(e){return function(e,t,n){return So.apply(this,arguments)}(this.algodClient,jr[this.network],e)}},{key:"generateCastVoteForStakingDistributionProposalTransactions",value:(l=i(s().mark((function e(t){var n,r,a,o,i,u,c,p,l,d,f,g,h;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=t.proposalId,a=t.votes,o=t.assetIds,i=t.userAddress,u=t.suggestedParams,c=null!=i?i:this.userAddress,p=u,e.next=5,this.fetchStakingDistributionProposal(r);case 5:if(l=e.sent){e.next=8;break}throw new Error("There was an error while fetching staking distribution proposal");case 8:if(p){e.next=12;break}return e.next=11,this.algodClient.getTransactionParams().do();case 11:p=e.sent;case 12:return e.next=14,this.fetchAccountState();case 14:return d=e.sent,e.next=17,Is(this.algodClient,jr[this.network]);case 17:return f=e.sent,e.next=20,Ws({algodClient:this.algodClient,address:c,appId:Mr[this.network],powerCount:null!==(n=null==d?void 0:d.powerCount)&&void 0!==n?n:null});case 20:if(g=e.sent,null!==(h=Ys(g,l.creationTimestamp))){e.next=24;break}throw new Error("It is required to have an account power at the staking distribution proposal creation timestamp");case 24:return e.abrupt("return",Po({stakingVotingAppId:jr[this.network],vaultAppId:Mr[this.network],sender:c,proposalId:r,proposal:l,votes:a,assetIds:o,accountPowerIndex:h,appBoxNames:f,suggestedParams:p,appCallNote:null}));case 25:case"end":return e.stop()}}),e,this)}))),function(e){return l.apply(this,arguments)})},{key:"fetchRewardsAppGlobalState",value:(c=i(s().mark((function t(){var n;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,gs(this.algodClient,Gr[this.network]);case 3:return n=t.sent,t.abrupt("return",new no(n.tiny_asset_id,n.vault_app_id,n.reward_history_count,n.first_period_timestamp,n.reward_period_count,e.encodeAddress(n.manager),e.encodeAddress(n.rewards_manager)));case 7:return t.prev=7,t.t0=t.catch(0),console.error(t.t0),t.abrupt("return",null);case 11:case"end":return t.stop()}}),t,this,[[0,7]])}))),function(){return c.apply(this,arguments)})},{key:"generateClaimRewardTransactions",value:(o=i(s().mark((function e(t){var n,r,a,o,i,u,c,p,l,d,f,g,h,m,A,x,I,v,y,w,b,T,k;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(r=t.periodIndexStart,a=t.periodCount,o=t.userAddress,i=t.suggestedParams,u=t.shouldOptIntoTINY,c=null!=o?o:this.userAddress,p=i){e.next=7;break}return e.next=6,this.algodClient.getTransactionParams().do();case 6:p=e.sent;case 7:return e.next=9,this.fetchAccountState();case 9:return l=e.sent,e.next=12,this.fetchRewardsAppGlobalState();case 12:if(d=e.sent){e.next=15;break}throw new Error("There was an error while fetching rewards app global state");case 15:if(!(r+a>d.rewardPeriodCount)){e.next=17;break}throw new Error("The reward period index to be claimed cannot be larger than the latest reward period index");case 17:return e.next=19,Ws({algodClient:this.algodClient,address:c,appId:Mr[this.network],powerCount:null!==(n=null==l?void 0:l.powerCount)&&void 0!==n?n:null});case 19:for(f=e.sent,g=d.firstPeriodTimestamp+r*Vr,h=d.firstPeriodTimestamp+(r+a)*Vr,m=[],A=g;A=Math.floor(Date.now()/Ur)||c.votingEndTimestamp<=Math.floor(Date.now()/Ur))){e.next=23;break}throw new Error("Voting period is not active");case 23:return e.next=25,Ws({algodClient:this.algodClient,address:i,appId:Mr[this.network],powerCount:p.powerCount});case 25:if(l=e.sent,null!==(d=Ys(l,c.creationTimestamp))){e.next=29;break}throw new Error("Account power index not found");case 29:return f=Math.floor(c.index/(8*Zr)),g=Eo(i,f),e.next=33,ps(this.algodClient,Xr[this.network],g);case 33:return h=!e.sent,e.abrupt("return",Zs({proposalVotingAppId:Xr[this.network],vaultAppId:Mr[this.network],sender:i,proposalId:n,proposal:c,vote:a,accountPowerIndex:d,createAttendanceSheetBox:h,suggestedParams:u}));case 35:case"end":return e.stop()}}),e,this)}))),function(e){return r.apply(this,arguments)})},{key:"fetchProposalVotingAppGlobalState",value:(n=i(s().mark((function e(){var t;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,gs(this.algodClient,Xr[this.network]);case 2:return t=e.sent,e.abrupt("return",new ws(t.vault_app_id,t.proposal_index_counter,t.voting_delay,t.voting_duration,t.proposal_threshold,t.proposal_threshold_numerator,t.quorum_threshold,t.approval_requirement,t.manager,t.proposal_manager));case 4:case"end":return e.stop()}}),e,this)}))),function(){return n.apply(this,arguments)})},{key:"getRequiredTinyPowerToCreateProposal",value:(t=i(s().mark((function e(t){var n,r,a;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(null==t){e.next=4;break}e.t0=t,e.next=7;break;case 4:return e.next=6,this.getTotalTinyPower();case 6:e.t0=e.sent;case 7:return n=e.t0,e.next=10,this.fetchProposalVotingAppGlobalState();case 10:return r=e.sent,a=r.proposalThreshold,r.proposalThresholdNumerator&&(a=Math.max(a,Math.floor(n*r.proposalThresholdNumerator/100)+1)),e.abrupt("return",a);case 14:case"end":return e.stop()}}),e,this)}))),function(e){return t.apply(this,arguments)})}]);var t,n,r,a,o,c,l,d,f,g,h,m,A,x,v,y}(),Fo=2500,Co=400,Qo=function(){return p((function e(t,n){u(this,e),l(this,"data",null),this.name=t,this.structReference=n,this.size=n[t].size,this.fields=n[t].fields}),[{key:"apply",value:function(e){var t=e;return t||(t=Buffer.alloc(this.size)),this.data=new DataView(t.buffer,t.byteOffset,t.byteLength),this}},{key:"getField",value:function(e){var t;if(!this.data)throw new Error("Data is not initialized");var n=this.fields[e];if(!n)throw new Error("Field ".concat(e," does not exist in struct ").concat(this.name));var r=n.offset,a=n.offset+n.size,s=null===(t=this.data)||void 0===t?void 0:t.buffer.slice(r,a);return Mo(n.type,this.structReference).apply(Buffer.from(s))}}])}(),Lo=function(){return p((function e(t,n){u(this,e),l(this,"data",null),this.struct=t,this.length=n}),[{key:"apply",value:function(e){var t=e;return t||(t=Buffer.alloc(this.struct.size*this.length)),this.data=new DataView(t.buffer,t.byteOffset,t.byteLength),this}},{key:"getField",value:function(e){var t,n=this.struct.size*e,r=n+this.struct.size,a=null===(t=this.data)||void 0===t?void 0:t.buffer.slice(n,r);return this.struct.apply(a?Buffer.from(a):void 0)}}])}(),Vo=function(){return p((function e(){u(this,e)}),[{key:"apply",value:function(e){for(var t=BigInt(0),n=0;n2&&void 0!==arguments[2]?arguments[2]:0,n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:8,r=new Array(arguments.length>1&&void 0!==arguments[1]?arguments[1]:8).fill(t);return r.splice.apply(r,[0,e.length].concat(I(e))),M.apply(void 0,I(r.map((function(e){return ee(e,n)}))))}var gi=new Qo(di.Entry,ti),hi=new Qo(di.Trigger,ti),mi=new Qo(di.Recurring,ti),Ai=function(t){function n(t,r,a,s){var o,i,c,p;return u(this,n),i=this,p=[t,r,a,ti],c=f(c=n),(o=A(i,function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){return!1}}()?Reflect.construct(c,p||[],f(i).constructor):c.apply(i,p))).algod=t,o.registryAppId=oi[a],o.registryApplicationAddress=e.getApplicationAddress(o.registryAppId).toString(),o.routerAppId=ui[a],o.routerApplicationAddress=e.getApplicationAddress(o.routerAppId).toString(),o.vaultAppId=ii[a],o.vaultApplicationAddress=e.getApplicationAddress(o.vaultAppId).toString(),o.userAddress=s,o}return d(n,zo),p(n,[{key:"shouldUpdateOrderingApp",value:(E=i(s().mark((function e(){var t,n;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(this.appId){e.next=2;break}return e.abrupt("return",Promise.resolve(!1));case 2:return e.next=4,this.getLatestOrderAppVersion();case 4:if(t=e.sent){e.next=7;break}throw new Error("Registry app has no approved version. Unable to compare.");case 7:return e.next=9,this.getGlobal(ei,void 0,this.appId);case 9:return n=e.sent,e.abrupt("return",t!==n);case 11:case"end":return e.stop()}}),e,this)}))),function(){return E.apply(this,arguments)})},{key:"prepareUpdateOrderingAppTransactions",value:(k=i(s().mark((function t(){var n,r,a;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(this.appId){t.next=2;break}throw new Error("Application ID not provided");case 2:return t.next=4,this.getLatestOrderAppVersion();case 4:if(n=t.sent){t.next=7;break}throw new Error("Registry app has no approved version. Unable to update order app.");case 7:return t.next=9,this.getSuggestedParams();case 9:return r=t.sent,a=[e.makeApplicationUpdateTxnFromObject({sender:this.userAddress,suggestedParams:r,appIndex:this.appId,appArgs:[ne("update_application"),e.bigIntToBytes(n,8)],approvalProgram:e.base64ToBytes(ci),clearProgram:e.base64ToBytes(pi)}),e.makeApplicationNoOpTxnFromObject({sender:this.userAddress,suggestedParams:r,appIndex:this.registryAppId,appArgs:[ne("verify_update"),e.bigIntToBytes(n,8)],boxes:[{appIndex:this.registryAppId,name:this.getAppVersionBoxName(n)}]}),e.makeApplicationNoOpTxnFromObject({sender:this.userAddress,suggestedParams:r,appIndex:this.appId,appArgs:[ne("post_update")]})],t.abrupt("return",this.setupTxnFeeAndAssignGroupId({txns:a}));case 12:case"end":return t.stop()}}),t,this)}))),function(){return k.apply(this,arguments)})},{key:"calculateCreateOrderAppMinBalanceIncreaseAmount",value:function(){return P*BigInt(4)+BigInt(ri)*D+BigInt(ni)*_}},{key:"prepareCreateOrderAppTransactions",value:(T=i(s().mark((function t(r){var a,o,i,u,c;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,this.getLatestOrderAppVersion();case 2:if(a=t.sent){t.next=5;break}throw new Error("Registry app has no approved version. Unable to create order app.");case 5:return t.next=7,this.getSuggestedParams();case 7:return o=t.sent,i=n.getRegistryEntryBoxName(r),u={},c=[],t.next=13,this.boxExists(i,this.registryAppId);case 13:if(t.sent){t.next=16;break}u=l({},e.bytesToBase64(i),gi),c.push(e.makePaymentTxnWithSuggestedParamsFromObject({sender:r,receiver:this.registryApplicationAddress,amount:this.calculateMinBalance({accounts:1,assets:1,boxes:u}),suggestedParams:o}));case 16:return c.push(e.makeApplicationCreateTxnFromObject({sender:r,suggestedParams:o,onComplete:e.OnApplicationComplete.NoOpOC,appArgs:[ne("create_application"),ee(this.registryAppId)],approvalProgram:e.base64ToBytes(ci),clearProgram:e.base64ToBytes(pi),numGlobalByteSlices:ri,numGlobalInts:ni,numLocalByteSlices:si,numLocalInts:ai,extraPages:3}),e.makeApplicationNoOpTxnFromObject({sender:r,suggestedParams:o,appIndex:this.registryAppId,appArgs:[ne("create_entry")],boxes:[{appIndex:0,name:i},{appIndex:this.registryAppId,name:this.getAppVersionBoxName(a)}]})),t.abrupt("return",this.setupTxnFeeAndAssignGroupId({txns:c}));case 18:case"end":return t.stop()}}),t,this)}))),function(e){return T.apply(this,arguments)})},{key:"checkOrderAppAvailability",value:(b=i(s().mark((function t(r){var a;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(this.appId||this.applicationAddress){t.next=15;break}if(!r){t.next=6;break}this.appId=r,this.applicationAddress=e.getApplicationAddress(r),t.next=15;break;case 6:return t.next=8,n.getOrderApplicationId(this.algod,this.network,this.userAddress);case 8:if(!(a=t.sent)){t.next=14;break}this.appId=Number(a),this.applicationAddress=e.getApplicationAddress(this.appId),t.next=15;break;case 14:throw new Error("Ordering client is not found for this account address. Please create an order app first.");case 15:case"end":return t.stop()}}),t,this)}))),function(e){return b.apply(this,arguments)})},{key:"getPutTriggerOrderTransactionFee",value:(y=i(s().mark((function t(n){var r,a,o,i,u,c,p,d,f;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(r=n.assetInId,a=n.assetOutId,o=n.type,i=0n,this.applicationAddress){t.next=4;break}return t.abrupt("return",i);case 4:return t.prev=4,t.next=7,this.getSuggestedParams();case 7:return u=t.sent.minFee,t.next=10,this.getAssetsToOptInToOrderingClient(this.applicationAddress,[r,a]);case 10:return c=t.sent,t.next=13,this.getOrderCount();case 13:p=t.sent,d=this.getOrderBoxName(p,o),f=l({},e.bytesToBase64(d),hi),i+=BigInt(5+c.length+Number(Boolean(c.length)))*u+BigInt(this.calculateMinBalance({boxes:f,assets:c.length})),t.next=21;break;case 19:t.prev=19,t.t0=t.catch(4);case 21:return t.abrupt("return",i);case 22:case"end":return t.stop()}}),t,this,[[4,19]])}))),function(e){return y.apply(this,arguments)})},{key:"preparePutTriggerOrderTransactions",value:(v=i(s().mark((function t(n){var r,o,i,u,c,p,d,f,g,h,m,A,x,v;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.assetInId,o=n.assetOutId,i=n.assetInAmount,u=n.assetOutAmount,c=n.isPartialAllowed,p=n.duration,t.next=3,this.checkOrderAppAvailability();case 3:return t.next=5,this.getSuggestedParams();case 5:return d=t.sent,t.next=8,this.getOrderCount();case 8:return f=t.sent,g=this.getOrderBoxName(f,li.Trigger),h={},m=[],t.next=14,this.getAssetsToOptInToOrderingClient(this.applicationAddress,[r,o]);case 14:return A=t.sent,t.next=17,this.boxExists(g);case 17:if(t.sent){t.next=24;break}return h=a(a({},h),{},l({},e.bytesToBase64(g),hi)),t.next=21,this.algod.accountInformation(this.applicationAddress).do();case 21:x=t.sent,v=Math.max(0,Number(x.minBalance-x.amount)),m.push(e.makePaymentTxnWithSuggestedParamsFromObject({sender:this.userAddress,receiver:this.applicationAddress,amount:v+this.calculateMinBalance({boxes:h,assets:A.length}),suggestedParams:d}));case 24:return m.push.apply(m,I(this.prepareOrderAppAssetOptinTransactionsIfNeeded(A,d)).concat([r===Ae?e.makePaymentTxnWithSuggestedParamsFromObject({sender:this.userAddress,receiver:this.applicationAddress,amount:i,suggestedParams:d}):e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:this.userAddress,receiver:this.applicationAddress,assetIndex:r,amount:i,suggestedParams:d}),e.makeApplicationNoOpTxnFromObject({sender:this.userAddress,suggestedParams:d,appIndex:this.appId,appArgs:[ne("put_trigger_order"),ee(r),e.bigIntToBytes(i,8),ee(o),e.bigIntToBytes(u,8),ee(Number(c)),ee(p)],foreignAssets:[o],foreignApps:[this.registryAppId,this.vaultAppId],boxes:[{appIndex:0,name:g},{appIndex:this.vaultAppId,name:e.decodeAddress(this.userAddress).publicKey},{appIndex:this.registryAppId,name:this.getRegistryEntryBoxName(this.userAddress)}]})])),t.abrupt("return",this.setupTxnFeeAndAssignGroupId({txns:m,additionalFeeCount:2+A.length}));case 26:case"end":return t.stop()}}),t,this)}))),function(e){return v.apply(this,arguments)})},{key:"preparePutRecurringOrderTransactions",value:(x=i(s().mark((function t(n){var r,o,i,u,c,p,d,f,g,h,m,A,x,v,y,w;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return r=n.amount,o=n.assetId,i=n.targetAssetId,u=n.targetRecurrence,c=n.interval,p=n.maxTargetPrice,d=n.minTargetPrice,t.next=3,this.checkOrderAppAvailability();case 3:return t.next=5,this.getOrderCount();case 5:return f=t.sent,g=this.getOrderBoxName(f,li.Recurring),h=[],m={},t.next=11,this.getSuggestedParams();case 11:return A=t.sent,t.next=14,this.getAssetsToOptInToOrderingClient(this.applicationAddress,[o,i]);case 14:return x=t.sent,v=r*BigInt(u),t.next=18,this.boxExists(g);case 18:if(t.sent){t.next=25;break}return m=a(a({},m),{},l({},e.bytesToBase64(g),mi)),t.next=22,this.algod.accountInformation(this.applicationAddress).do();case 22:y=t.sent,w=Math.max(0,Number(y.minBalance-BigInt(y.amount))),h.push(e.makePaymentTxnWithSuggestedParamsFromObject({sender:this.userAddress,receiver:this.applicationAddress,amount:w+this.calculateMinBalance({boxes:m,assets:x.length}),suggestedParams:A}));case 25:return h.push.apply(h,I(this.prepareOrderAppAssetOptinTransactionsIfNeeded(x,A)).concat([o===Ae?e.makePaymentTxnWithSuggestedParamsFromObject({sender:this.userAddress,receiver:this.applicationAddress,amount:v,suggestedParams:A}):e.makeAssetTransferTxnWithSuggestedParamsFromObject({sender:this.userAddress,receiver:this.applicationAddress,assetIndex:o,amount:v,suggestedParams:A}),e.makeApplicationNoOpTxnFromObject({sender:this.userAddress,suggestedParams:A,appIndex:this.appId,foreignApps:[this.registryAppId,this.vaultAppId],foreignAssets:[i],boxes:[{appIndex:0,name:g},{appIndex:this.vaultAppId,name:e.decodeAddress(this.userAddress).publicKey},{appIndex:this.registryAppId,name:this.getRegistryEntryBoxName(this.userAddress)}],appArgs:[ne("put_recurring_order"),ee(o),e.bigIntToBytes(r,8),ee(i),ee(p?Math.floor(Number(r)/p):0),ee(d?Math.floor(Number(r)/d):0),ee(u),ee(c)]})])),t.abrupt("return",this.setupTxnFeeAndAssignGroupId({txns:h,additionalFeeCount:2+x.length}));case 27:case"end":return t.stop()}}),t,this)}))),function(e){return x.apply(this,arguments)})},{key:"prepareCancelOrderTransactions",value:(m=i(s().mark((function t(n,r){var a,o,i,u;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(this.appId){t.next=2;break}throw new Error("Application ID not provided");case 2:return a=this.getOrderBoxName(n,r),t.next=5,this.getBox(a,r===li.Trigger?di.Trigger:di.Recurring);case 5:if(o=t.sent){t.next=8;break}throw new Error("Order not found");case 8:return t.next=10,this.getSuggestedParams();case 10:return i=t.sent,u=[e.makeApplicationNoOpTxnFromObject({sender:this.userAddress,suggestedParams:i,appIndex:this.appId,appArgs:[ne(r===li.Trigger?"cancel_trigger_order":"cancel_recurring_order"),ee(n)],boxes:[{appIndex:0,name:a},{appIndex:this.registryAppId,name:this.getRegistryEntryBoxName(this.userAddress)}],foreignAssets:[Number(o.getField("asset_id"))],foreignApps:[this.registryAppId]})],t.abrupt("return",this.setupTxnFeeAndAssignGroupId({txns:u,additionalFeeCount:2}));case 13:case"end":return t.stop()}}),t,this)}))),function(e,t){return m.apply(this,arguments)})},{key:"prepareClaimCollectedTargetAmount",value:(h=i(s().mark((function t(n,r){var a,o,i,u;return s().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(this.appId){t.next=2;break}throw new Error("Application ID not provided");case 2:return t.next=4,this.getSuggestedParams();case 4:return a=t.sent,o=this.getOrderBoxName(n,r),t.next=8,this.getBox(o,r===li.Trigger?di.Trigger:di.Recurring);case 8:if(i=t.sent){t.next=11;break}throw new Error("Order not found");case 11:return u=[e.makeApplicationNoOpTxnFromObject({sender:this.userAddress,suggestedParams:a,appIndex:this.appId,appArgs:[ne("collect"),ee(n),ne(r===li.Trigger?"o":"r")],boxes:[{appIndex:0,name:o}],foreignAssets:[Number(i.getField("target_asset_id"))],foreignApps:[this.registryAppId]})],t.abrupt("return",this.setupTxnFeeAndAssignGroupId({txns:u,additionalFeeCount:2}));case 13:case"end":return t.stop()}}),t,this)}))),function(e,t){return h.apply(this,arguments)})},{key:"getPlatformFeeRate",value:(g=i(s().mark((function e(t){var n;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,this.getGlobal(Zo,0,this.registryAppId);case 2:if(n=e.sent,!(t&&t>=n)){e.next=5;break}return e.abrupt("return",this.getGlobal(Ho,0,this.registryAppId));case 5:return e.abrupt("return",this.getGlobal(Ko,0,this.registryAppId));case 6:case"end":return e.stop()}}),e,this)}))),function(e){return g.apply(this,arguments)})},{key:"getOrderCount",value:function(){return this.appId?this.getGlobal(Zo,0,this.appId):Promise.resolve(0)}},{key:"getOrderBoxName",value:function(e,t){return M(ne(t===li.Trigger?"o":"r"),ee(e))}},{key:"getRegistryEntryBoxName",value:function(t){return M(ne("e"),e.decodeAddress(t).publicKey)}},{key:"prepareOrderAppAssetOptInTransaction",value:function(t,n,r,a){return e.makeApplicationNoOpTxnFromObject({sender:t,appIndex:n,appArgs:[ne("asset_opt_in"),fi(r)],suggestedParams:a})}},{key:"prepareOrderAppAssetOptinTransactionsIfNeeded",value:function(e,t){if(!this.appId||!this.applicationAddress)throw new Error("Application ID not provided");return e.length?[this.prepareOrderAppAssetOptInTransaction(this.userAddress,this.appId,e,t)]:[]}},{key:"getAssetsToOptInToOrderingClient",value:(c=i(s().mark((function e(t,n){var r,a,o,i;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:r=[],a=w(n),e.prev=2,a.s();case 4:if((o=a.n()).done){e.next=17;break}if(!Ne(i=o.value)){e.next=10;break}e.t0=!1,e.next=13;break;case 10:return e.next=12,this.isOptedIn(t,i);case 12:e.t0=!e.sent;case 13:e.t0&&r.push(i);case 15:e.next=4;break;case 17:e.next=22;break;case 19:e.prev=19,e.t1=e.catch(2),a.e(e.t1);case 22:return e.prev=22,a.f(),e.finish(22);case 25:return e.abrupt("return",r);case 26:case"end":return e.stop()}}),e,this,[[2,19,22,25]])}))),function(e,t){return c.apply(this,arguments)})},{key:"getLatestOrderAppVersion",value:function(){return this.getGlobal($o,void 0,this.registryAppId)}},{key:"getAppVersionBoxName",value:function(t){return M(ne("v"),e.bigIntToBytes(t,8))}}],[{key:"getRegistryEntryBoxName",value:function(t){var n=e.decodeAddress(t).publicKey;return new Uint8Array([].concat(I(ne("e")),I(n)))}},{key:"getOrderApplicationId",value:(o=i(s().mark((function e(t,r,a){var o,i,u,c;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return o=n.getRegistryEntryBoxName(a),i=oi[r],u=null,e.prev=3,e.next=6,t.getApplicationBoxByName(i,o).do();case 6:c=e.sent,u=Buffer.from(c.value),e.next=12;break;case 10:e.prev=10,e.t0=e.catch(3);case 12:return e.abrupt("return",u?gi.apply(u).getField("app_id"):null);case 13:case"end":return e.stop()}}),e,null,[[3,10]])}))),function(e,t,n){return o.apply(this,arguments)})},{key:"initializeOrderingClient",value:(r=i(s().mark((function e(t,r,a){var o,i;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,n.getOrderApplicationId(t,r,a);case 2:return o=e.sent,i=new n(t,o?Number(o.toString()):null,r,a),e.abrupt("return",i);case 5:case"end":return e.stop()}}),e)}))),function(e,t,n){return r.apply(this,arguments)})}]);var r,o,c,g,h,m,x,v,y,b,T,k,E}();exports.ALGO_ASSET=xe,exports.ALGO_ASSET_ID=Ae,exports.ASSET_OPT_IN_PROCESS_TXN_COUNT=1,exports.AccountState=Ns,exports.AddLiquidity=Nn,exports.BASE_MINIMUM_BALANCE=N,exports.Bootstrap=$t,exports.CONTRACT_VERSION=se,exports.LendingPool=Cr,exports.MINIMUM_ADD_LIQUIDITY_AMOUNT=B,exports.MINIMUM_BALANCE_REQUIRED_PER_APP=P,exports.MINIMUM_BALANCE_REQUIRED_PER_ASSET=S,exports.MINIMUM_BALANCE_REQUIRED_PER_BYTE_SCHEMA=D,exports.MINIMUM_BALANCE_REQUIRED_PER_INT_SCHEMA_VALUE=_,exports.OPT_IN_VALIDATOR_APP_PROCESS_TXN_COUNT=1,exports.OPT_OUT_VALIDATOR_APP_PROCESS_TXN_COUNT=1,exports.OrderingClient=Ai,exports.POOL_TOKEN_UNIT_NAME=Ie,exports.PoolStatus=dt,exports.ProposalVote=$r,exports.REDEEM_PROCESS_TXN_COUNT=3,exports.RemoveLiquidity=er,exports.Swap=Ar,exports.SwapQuoteError=k,exports.SwapQuoteErrorType=T,exports.SwapQuoteType=Pe,exports.SwapType=re,exports.TinymanGovernanceClient=Ro,exports.TinymanSTAlgoClient=Jo,exports.TinymanTAlgoClient=qo,exports.V1_1AddLiquidityTxnIndices=nn,exports.V1_1_ADD_LIQUIDITY_PROCESS_TXN_COUNT=rn,exports.V1_1_REMOVE_LIQUIDITY_TXN_COUNT=Pn,exports.V2AddLiquidityTxnIndices=pn,exports.V2AddLiquidityType=cn,exports.V2_REMOVE_LIQUIDITY_APP_CALL_INNER_TXN_COUNT=zn,exports.applySlippageToAmount=W,exports.calculatePriceImpact=Me,exports.calculateSwapRate=Ue,exports.calculateTinyPower=function(e,t){var n,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:Math.floor(Date.now()/1e3),a=(n=e,Math.floor(n*Za/Ja)),s=t-r;return s<0?0:ds(a,s)},exports.combineAndRegroupSignerTxns=function(){for(var t=arguments.length,n=new Array(t),r=0;r=e.minBalance},exports.intToBytes=ee,exports.isAccountOptedIntoApp=function(e){var t=e.appID,n=e.accountAppsLocalState;return!!n&&n.some((function(e){return e.id===BigInt(t)}))},exports.isSwapAssetInAmountLow=Le,exports.isSwapQuoteErrorCausedByAmount=Ye,exports.joinByteArrays=M,exports.poolUtils=Pt,exports.prepareCommitTransactions=function(e){return Lr.apply(this,arguments)},exports.redeemAllExcessAsset=function(e){return yr.apply(this,arguments)},exports.redeemExcessAsset=function(e){return xr.apply(this,arguments)},exports.sendAndWaitRawTransaction=Z,exports.sumUpTxnFees=K,exports.tinymanContract_v1_1=nt,exports.tinymanContract_v2=st,exports.tinymanJSSDKConfig=oe; diff --git a/dist/liquid-stake/stAlgoClient.d.ts b/dist/liquid-stake/stAlgoClient.d.ts index 94c823a1..302a0888 100644 --- a/dist/liquid-stake/stAlgoClient.d.ts +++ b/dist/liquid-stake/stAlgoClient.d.ts @@ -1,7 +1,7 @@ import algosdk from "algosdk"; -import TinymanBaseClient from "../util/client/base/baseClient"; import { SupportedNetwork } from "../util/commonTypes"; -declare class TinymanSTAlgoClient extends TinymanBaseClient { +import TinymanBaseClient from "../util/client/base/baseClient"; +declare class TinymanSTAlgoClient extends TinymanBaseClient { vaultAppId: number; constructor(algod: algosdk.Algodv2, network: SupportedNetwork); increaseStake(amount: bigint, userAddress: string): Promise; diff --git a/dist/liquid-stake/tAlgoClient.d.ts b/dist/liquid-stake/tAlgoClient.d.ts index 40771b72..032dc8e7 100644 --- a/dist/liquid-stake/tAlgoClient.d.ts +++ b/dist/liquid-stake/tAlgoClient.d.ts @@ -1,7 +1,7 @@ import algosdk from "algosdk"; -import TinymanBaseClient from "../util/client/base/baseClient"; import { SupportedNetwork } from "../util/commonTypes"; -declare class TinymanTAlgoClient extends TinymanBaseClient { +import TinymanBaseClient from "../util/client/base/baseClient"; +declare class TinymanTAlgoClient extends TinymanBaseClient { constructor(algod: algosdk.Algodv2, network: SupportedNetwork); sync(userAddress: string): Promise; mint(amount: bigint, userAddress: string): Promise; diff --git a/dist/order/constants.d.ts b/dist/order/constants.d.ts new file mode 100644 index 00000000..2a221523 --- /dev/null +++ b/dist/order/constants.d.ts @@ -0,0 +1,27 @@ +import { StructDefinition } from "../util/client/base/types"; +import { SupportedNetwork } from "../util/commonTypes"; +import { OrderStruct } from "./types"; +declare const TOTAL_ORDER_COUNT_KEY: Uint8Array; +declare const GOVERNOR_ORDER_FEE_RATE_KEY: Uint8Array; +declare const GOVERNOR_FEE_RATE_POWER_THRESHOLD_KEY: Uint8Array; +declare const ORDER_FEE_RATE_KEY: Uint8Array; +declare const APP_LATEST_VERSION_KEY: Uint8Array; +declare const APP_VERSION_KEY: Uint8Array; +declare const ORDER_STRUCTS: Record; +declare const ORDER_APP_GLOBAL_SCHEMA: { + numUint: number; + numByteSlice: number; +}; +declare const ORDER_APP_LOCAL_SCHEMA: { + numUint: number; + numByteSlice: number; +}; +declare const ORDER_APP_EXTRA_PAGES = 3; +declare const REGISTRY_APP_ID: Record; +declare const VAULT_APP_ID: Record; +declare const ROUTER_APP_ID: Record; +declare const MINIMUM_BALANCE_REQUIREMENT_PER_APP = 100000; +declare const MINIMUM_PUT_ORDER_TRANSACTION_COUNT = 5; +declare const APPROVAL_PROGRAM = "CoASY3JlYXRlX2FwcGxpY2F0aW9ugBJ1cGRhdGVfYXBwbGljYXRpb26AC3Bvc3RfdXBkYXRlgAxhc3NldF9vcHRfaW6AEXB1dF90cmlnZ2VyX29yZGVygBRjYW5jZWxfdHJpZ2dlcl9vcmRlcoAbc3RhcnRfZXhlY3V0ZV90cmlnZ2VyX29yZGVygBllbmRfZXhlY3V0ZV90cmlnZ2VyX29yZGVygBNwdXRfcmVjdXJyaW5nX29yZGVygBZjYW5jZWxfcmVjdXJyaW5nX29yZGVygBdleGVjdXRlX3JlY3VycmluZ19vcmRlcoAHY29sbGVjdDYaAI4MAAEAEQAhAC0AQgBmAHYAjgCmAM4A3gEFADEYgQASRDYaAReIARCBAUMxGYEEEkQ2GgEXiAG6gQFDMRmBABJEiAI5gQFDMRmBABJENhoBSRWBQBJEiALBgQFDMRmBABJENhoBFzYaAhc2GgMXNhoEFzYaBRc2GgYXiALbgQFDMRmBABJENhoBF4gEF4EBQzEZgQASRDYaARc2GgIXNhoDF4gE/IEBQzEZgQASRDYaARc2GgIXNhoDF4gFmoEBQzEZgQASRDYaARc2GgIXNhoDFzYaBBc2GgUXNhoGFzYaBxeIB+OBAUMxGYEAEkQ2GgEXiAk5gQFDMRmBABJENhoBFzYaAkkVgUASRDYaA0kVgYACEkQ2GgQXiAmwgQFDMRmBABJENhoBFzYaAkkVgQESRIgGtYEBQzUBgAx1c2VyX2FkZHJlc3MxAGeAD3JlZ2lzdHJ5X2FwcF9pZDQBZzQBcghINQKAHHJlZ2lzdHJ5X2FwcF9hY2NvdW50X2FkZHJlc3M0Amc0AYAMdmF1bHRfYXBwX2lkZUg1A4AMdmF1bHRfYXBwX2lkNANnNAGADXJvdXRlcl9hcHBfaWRlSDUEgA1yb3V0ZXJfYXBwX2lkNARngAd2ZXJzaW9ugQJngAQPPg00MQA0ARY0AxZQUFCwiTUFgAx1c2VyX2FkZHJlc3NkNQYxADQGEkQxFoEBCDgYgA9yZWdpc3RyeV9hcHBfaWRkEkQxFoEBCDkaAIANdmVyaWZ5X3VwZGF0ZRJEMRaBAQg5GgE0BRYSRDEWgQIIOBgyCBJEMRaBAgg5GgCAC3Bvc3RfdXBkYXRlEkSABEZ071kxADQFFlBQsImADHVzZXJfYWRkcmVzc2Q1BzEANAcSRIECgAd2ZXJzaW9uZA1EgA9yZWdpc3RyeV9hcHBfaWRkNQg0CIAMdmF1bHRfYXBwX2lkZUg1CYAMdmF1bHRfYXBwX2lkNAlnNAiADXJvdXRlcl9hcHBfaWRlSDUKgA1yb3V0ZXJfYXBwX2lkNApngAd2ZXJzaW9ugQJngAT8pjz+gQIWULCJNQuADHVzZXJfYWRkcmVzc2Q1DDEANAwSRIEANQ00DYEIEkAAGDQLgQg0DQuBCFgXiAsyNA2BAQg1DUL/4Ik1DjUPNRA1ETUSNROADHVzZXJfYWRkcmVzc2Q1FDEANBQSRIALb3JkZXJfY291bnRkNRWAAW80FRZQSYFQuUQ1FjQSgQANRDQQgQANRDQTNBETRDQOFEEAEIH///////////8BNRdCAAcyBzQOCDUXNBFBAAwyCjQRcAA1GEg0GEQxFoEBCTIKNBM0EogKvIgJmTUZNBMWNBaBAE8CuzQSFjQWgQhPArs0ERY0FoEQTwK7NBAWNBaBGE8Cu4EAFjQWgSBPAruBABY0FoEoTwK7NA8WNBaBME8CuzQZFjQWgThPArsyBxY0FoFATwK7NBcWNBaBSE8Cu4ALb3JkZXJfY291bnQ0FYEBCGc0Fr5INRqAEXB1dF90cmlnZ2VyX29yZGVyNBQ0FRY0GlCICwiABBN6A8M0FDQVFjQaUFBQsIAEoI8xYzQVFlCwiTUbgAx1c2VyX2FkZHJlc3NkNRwxADQcEkSAAW80GxZQSb1EgVASRDUdNB2BCIEIuhc1HjQdgTCBCLoXQQANNB40HYEggQi6Fwk1HjQdgSiBCLoXFEQ0HYEAgQi6FzQeMgo0HIgKOzQdvkg1H4AUY2FuY2VsX3RyaWdnZXJfb3JkZXI0HDQbFogKYYAEE3oDwzQcNBsWNB9QUFCwgATZpb9wNBsWULA0HbxIiTUgNSE1IjUjNSQ0JDgAMQASRDQkOBCBBhJENCQ4GYEAEkQ0JDgYMggSRDQkORoANCMSRDQkORoBNCIWEkQ0JDkaAjQhFhJENCQ5GgM0IBYSRIk1JTUmNSeAAW80JxZQSb1EgVASRDUoNCWBAg9ENCiBCIEIuhc1KTQogTCBCLoXQQAWNCk0KIEggQi6Fwk1KTQmNCkOREIABjQmNCkSRDIHNCiBSIEIuhcORDEWNCUINSo0KoAZZW5kX2V4ZWN1dGVfdHJpZ2dlcl9vcmRlcjQnNCY0JYj/KDQogQCBCLoXNCYyCjEAiAkNgARteEGbgAx1c2VyX2FkZHJlc3NkNCcWMQBQUFCwiTUrNSw1LYAMdXNlcl9hZGRyZXNzZDUugAFvNC0WUEm9RIFQEkQ1LzEWNCsJNTA0MIAbc3RhcnRfZXhlY3V0ZV90cmlnZ2VyX29yZGVyNC00LDQriP6iNC+BMIEIuhcUQQANNC+BGIEIuhc1MUIAFzQvgQiBCLoXNC+BGIEIuhc0LIgGYTUxMRaBAQkyCjQvgRCBCLoXNDGIB/w1MjQvgSCBCLoXNCwIFjQvgSBPArs0MjQvgTiBCLoXiAZeNTM0M0Q0L4EogQi6FzQyNDMJCBY0L4EoTwK7NC++SDU0gBR1cGRhdGVfdHJpZ2dlcl9vcmRlcjQuNC0WNDRQiAg6gAQTegPDNC40LRY0NFBQULCABK4KflKADHVzZXJfYWRkcmVzc2Q0LRYxADQsFjQyFlBQUFBQsDQvgRCBCLoXNDMyCoAccmVnaXN0cnlfYXBwX2FjY291bnRfYWRkcmVzc2SIB4s0L4EIgQi6FzQvgSCBCLoXEkEAGzQvgRCBCLoXNC+BKIEIuhcyCjQuiAdgNC+8SIk1NTU2gAx1c2VyX2FkZHJlc3NkNTcxADQ3EkQ0NYABbxJBAEiAAW80NhZQSb1EgVASRDU6NDqBEIEIuhc1ODQ6gSiBCLoXNTmBABY0OoEoTwK7NDq+SDU7gAQTegPDNDc0NhY0O1BQULBCAFQ0NYABchJBAEiAAXI0NhZQSb1EgVgSRDU8NDyBEIEIuhc1ODQ8gRiBCLoXNTmBABY0PIEYTwK7NDy+SDU9gARvi/yfNDc0NhY0PVBQULBCAAOBAUM0OUQ0ODQ5Mgo0N4gGjYAEKgYeKzQ2FjQ5FlBQsIk1PjU/NUA1QTVCNUM1RIAMdXNlcl9hZGRyZXNzZDVFMQA0RRJEgAtvcmRlcl9jb3VudGQ1RoABcjRGFlBJgVi5RDVHNEOBAA1ENEQ0QhNEND+BAA1END6BPA9END6BPBgURDRAFEEADYH///////////8BNUA0QTRADkQ0QkEADDIKNEJwADVISDRIRDEWgQEJMgo0RDRDND8LiAU+iAQbNUk0RBY0R4EATwK7NEMWNEeBCE8CuzRCFjRHgRBPAruBABY0R4EYTwK7NEEWNEeBIE8CuzRAFjRHgShPArs0PxY0R4EwTwK7ND4WNEeBOE8CuzRJFjRHgUBPAruBABY0R4FITwK7MgcWNEeBUE8Cu4ALb3JkZXJfY291bnQ0RoEBCGc0R75INUqAE3B1dF9yZWN1cnJpbmdfb3JkZXI0RTRGFjRKUIgFfoAEb4v8nzRFNEYWNEpQUFCwgASH6GpLNEYWULCJNUuADHVzZXJfYWRkcmVzc2Q1TDEANEwSRIABcjRLFlBJvUSBWBJENU00TYEYgQi6FxRENE2BCIEIuhc0TYEwgQi6Fws1TjRNgQCBCLoXNE4yCjRMiATANE2+SDVPgBZjYW5jZWxfcmVjdXJyaW5nX29yZGVyNEw0SxaIBOSABG+L/J80TDRLFjRPUFBQsIAEPnsMZjRLFlCwNE28SIk1UDVRNVI1U4ABcjRTFlBJvUSBWBJENVSADHVzZXJfYWRkcmVzc2Q1VTEWgQASRDINgQASRDEAiAIDMgc0VIFIgQi6FzRUgTiBCLoXCA9ENFKBCIEAC4EIWBc0VIEAgQi6FxJENFKBCDRQC4EIWBc0VIEQgQi6FxJENFSBCIEIuhc0VIEggQi6FzRSNFE0UIgBDjVWNFY0VIEggQi6Fw80VjRUgSiBCLoXDhBENFY0VIFAgQi6F4gB7DVXNFdENFSBMIEIuheBAQkWNFSBME8CuzIHFjRUgUhPArs0VIEYgQi6FzRWNFcJCBY0VIEYTwK7NFS+SDVYgBZ1cGRhdGVfcmVjdXJyaW5nX29yZGVyNFU0UxY0WFCIA6mABG+L/J80VTRTFjRYUFBQsIAEoPcklTRVNFMWMQA0VIEIgQi6FxY0VhZQUFBQULA0VIEQgQi6FzRXMgqAHHJlZ2lzdHJ5X2FwcF9hY2NvdW50X2FkZHJlc3NkiAMBNFSBMIEIuhcUQQAbNFSBEIEIuhc0VIEYgQi6FzIKNFWIAt40VLxIiTVZNVo1WzVcNV2ADXJvdXRlcl9hcHBfaWRkcghINV40W4EINFkLgQhYFzVfMgo0X4gDMzVgiANUNFuBCIEAC4EIWBc0XTIKNF6IAo2IA0aBBrIQgQCyAYANcm91dGVyX2FwcF9pZGSyGIAEc3dhcLIaNF0Wsho0XBayGjRbsho0WrIaNFkWshqIAx+IAyQyCjRfiALRNGAJNWE0YYk1YjRigA9yZWdpc3RyeV9hcHBfaWRkgAtpc19lbmRvcnNlZGM1YzVkNGNENGQ1ZTRlRIk1ZjVnNWg0ZxaB////////////ARajNGgWojVpNGYWNGmjgf///////////wEWohc1ajRqiTVrNWw0bDRrC4GQTgo1bTRtiYAMdXNlcl9hZGRyZXNzZIgApjVxgA9yZWdpc3RyeV9hcHBfaWRkgCFnb3Zlcm5vcl9mZWVfcmF0ZV9wb3dlcl90aHJlc2hvbGRlSDVuNG41cjRxNHINQQAygA9yZWdpc3RyeV9hcHBfaWRkgBdnb3Zlcm5vcl9vcmRlcl9mZWVfcmF0ZWVINW9CACaAD3JlZ2lzdHJ5X2FwcF9pZGSADm9yZGVyX2ZlZV9yYXRlZUg1bzRvNXA0cIk1c4gBwYEGshCADHZhdWx0X2FwcF9pZGSyGIARZ2V0X3RpbnlfcG93ZXJfb2ayGjRzshqBALIBiAGhtD6BBFs1dDR0iTV1NHVBABwyCjR1cAA1dkg0doEAEkEACzR1gQAyCjIKiACjiTV3NXg1eTV6NHgUQQAbNHo4EIEBEkQ0ejgHNHkSRDR6OAg0dxJEQgAgNHo4EIEEEkQ0ejgUNHkSRDR6OBE0eBJENHo4EjR3EkSJNXs1fDV9NX40fBRBACE0fjgQgQESRDR+OAc0fRJENH44CDR7D0Q0fjgINX9CACY0fjgQgQQSRDR+OBQ0fRJENH44ETR8EkQ0fjgSNHsPRDR+OBI1fzR/iTWANYE1gjWDNIMUQQAdiACrgQGyEDSBsgA0gLIHNIKyCIEAsgGIAKlCAB6IAI6BBLIQNIGyADSAshQ0grISNIOyEYEAsgGIAIiJNYQ1hTWGiABpgQayEIEAsgGAD3JlZ2lzdHJ5X2FwcF9pZGSyGIAKZW1pdF9ldmVudLIaNIayGjSFsho0hLIaiABFiTWHNYiBADWJNIcUQQAMNIhgNIh4CTWJQgAJNIg0h3AASDWJNImJNIoURIEBNYqJNIqNAwABAAMACQCxibGBAjWKibaJNIpBAAGJs4mzgQA1iok="; +declare const CLEAR_PROGRAM = "CoEBQw=="; +export { ORDER_APP_EXTRA_PAGES, ORDER_APP_GLOBAL_SCHEMA, ORDER_APP_LOCAL_SCHEMA, REGISTRY_APP_ID, ORDER_STRUCTS, TOTAL_ORDER_COUNT_KEY, VAULT_APP_ID, MINIMUM_BALANCE_REQUIREMENT_PER_APP, GOVERNOR_ORDER_FEE_RATE_KEY, GOVERNOR_FEE_RATE_POWER_THRESHOLD_KEY, ORDER_FEE_RATE_KEY, MINIMUM_PUT_ORDER_TRANSACTION_COUNT, APPROVAL_PROGRAM, CLEAR_PROGRAM, ROUTER_APP_ID, APP_LATEST_VERSION_KEY, APP_VERSION_KEY }; diff --git a/dist/order/index.d.ts b/dist/order/index.d.ts new file mode 100644 index 00000000..1d7b0672 --- /dev/null +++ b/dist/order/index.d.ts @@ -0,0 +1,104 @@ +import algosdk, { Algodv2, Transaction } from "algosdk"; +import { OrderType, PutTriggerOrderParams, PutRecurringOrderParams } from "./types"; +import { SupportedNetwork } from "../util/commonTypes"; +import TinymanBaseClient from "../util/client/base/baseClient"; +declare class OrderingClient extends TinymanBaseClient { + registryAppId: number; + registryApplicationAddress: string; + vaultAppId: number; + vaultApplicationAddress: string; + routerAppId: number; + routerApplicationAddress: string; + userAddress: string; + private constructor(); + private static getRegistryEntryBoxName; + private static getOrderApplicationId; + /** + * Initializes the OrderingClient by fetching the personal app id from global state. + * Until the user creates an application, the app id will be set as null + */ + static initializeOrderingClient(algod: Algodv2, network: SupportedNetwork, userAddress: string): Promise; + /** + * Compares the contracts between the user's order app and the latest available contract. + * + * @returns A boolean indicating if the order app needs to be updated. + */ + shouldUpdateOrderingApp(): Promise; + /** + * Prepares transactions to update the ordering app using the latest contracts. + * @returns A promise that resolves the transaction array. + */ + prepareUpdateOrderingAppTransactions(): Promise; + calculateCreateOrderAppMinBalanceIncreaseAmount(): bigint; + /** + * Prepares transactions to create the order app for a user. + * @param userAddress - The address of the user. + * @returns A promise that resolves the transaction array. + */ + prepareCreateOrderAppTransactions(userAddress: string): Promise; + checkOrderAppAvailability(orderAppId?: number): Promise; + getPutTriggerOrderTransactionFee({ assetInId, assetOutId, type }: { + assetInId: number; + assetOutId: number; + type: OrderType; + }): Promise; + /** + * Prepares an array of transactions to place a limit order. + * + * @param {PutTriggerOrderParams} params - The parameters for the put order operation. + * @param params.assetInId - The ID of the input asset. + * @param params.assetOutId - The ID of the output asset. + * @param params.assetInAmount - The amount of the input asset in base units. + * @param params.assetOutAmount - The amount of the output asset in base units. + * @param params.isPartialAllowed - Whether partial fills are allowed. + * @param params.duration - The duration of the order in seconds. + * @param [params.orderAppId] - (Optional) The application ID for the order. + * @returns A promise that resolves the transaction array. + */ + preparePutTriggerOrderTransactions({ assetInId, assetOutId, assetInAmount, assetOutAmount, isPartialAllowed, duration }: PutTriggerOrderParams): Promise; + /** + * Prepares an array of transactions to place a recurring order. + * + * @param {PutRecurringOrderParams} params - The parameters for the recurring order. + * @param params.amount - The amount per order to be used for the recurring order. + * @param params.assetId - The ID of the asset being used for the order. + * @param params.targetAssetId - The ID of the target asset for the order. + * @param params.targetRecurrence - The number of times the order should recur. + * @param params.interval - The interval between each recurrence in seconds. + * @param params.maxTargetPrice - (Optional) The maximum price per unit of the target asset to be accepted. + * @param params.minTargetPrice - (Optional) The minimum price per unit of the target asset to be accepted. + * @returns A promise that resolves the transaction array. + */ + preparePutRecurringOrderTransactions({ amount, assetId, targetAssetId, targetRecurrence, interval, maxTargetPrice, minTargetPrice }: PutRecurringOrderParams): Promise; + /** + * Prepares an array of transactions to cancel an order. + * + * @param orderId - The ID of the order to cancel. + * @param type - The type of the order to cancel. + * @returns A promise that resolves the transaction array. + */ + prepareCancelOrderTransactions(orderId: number, type: OrderType): Promise; + /** + * Prepares an array of transactions to claim the collected target amount for an order. + * @param orderId - The ID of the order for which to claim the collected target amount. + * @param type - The type of the order (OrderType.Trigger or OrderType.Recurring). + * @returns A promise that resolves the transaction array. + */ + prepareClaimCollectedTargetAmount(orderId: number, type: OrderType): Promise; + /** + * Gets the platform fee rate based on the provided tiny power from the global state. + * + * @param tinyPower - The tiny power to check against the threshold. + * @returns The platform fee rate. + */ + getPlatformFeeRate(tinyPower: number | null): Promise; + private getOrderCount; + private getOrderBoxName; + private getRegistryEntryBoxName; + private prepareOrderAppAssetOptInTransaction; + private prepareOrderAppAssetOptinTransactionsIfNeeded; + private getAssetsToOptInToOrderingClient; + private getLatestOrderAppVersion; + private getAppVersionBoxName; +} +export { OrderingClient }; diff --git a/dist/order/types.d.ts b/dist/order/types.d.ts new file mode 100644 index 00000000..9e141518 --- /dev/null +++ b/dist/order/types.d.ts @@ -0,0 +1,27 @@ +export interface PutTriggerOrderParams { + assetInId: number; + assetOutId: number; + assetInAmount: bigint; + assetOutAmount: bigint; + isPartialAllowed: boolean; + duration: number; + orderAppId?: number; +} +export interface PutRecurringOrderParams { + assetId: number; + amount: bigint; + targetAssetId: number; + targetRecurrence: number; + interval: number; + minTargetPrice: number; + maxTargetPrice: number; +} +export declare enum OrderType { + Trigger = "trigger_order", + Recurring = "recurring_order" +} +export declare enum OrderStruct { + Trigger = "TriggerOrder", + Recurring = "RecurringOrder", + Entry = "Entry" +} diff --git a/dist/order/utils.d.ts b/dist/order/utils.d.ts new file mode 100644 index 00000000..8649ae81 --- /dev/null +++ b/dist/order/utils.d.ts @@ -0,0 +1,4 @@ +import { joinByteArrays } from "../util/util"; +declare function createPaddedByteArray(elements: number[], length?: number, paddingValue?: number, byteSize?: number): Uint8Array; +declare function computeSHA512(fileArrayBuffer: Uint8Array): Promise; +export { computeSHA512, createPaddedByteArray, joinByteArrays }; diff --git a/dist/util/client/base/appClient.d.ts b/dist/util/client/base/appClient.d.ts new file mode 100644 index 00000000..3f1e9ac5 --- /dev/null +++ b/dist/util/client/base/appClient.d.ts @@ -0,0 +1,32 @@ +import { Algodv2 } from "algosdk"; +import { StructDefinition } from "./types"; +import TinymanBaseClient from "./baseClient"; +import { SupportedNetwork } from "../../commonTypes"; +/** + * Abstract client for Tinyman applications that may not have an app ID initially + * This class overrides the base non-nullable properties to allow null values + */ +declare abstract class TinymanNullableAppClient extends TinymanBaseClient { + constructor(algod: Algodv2, appId: number | null, network: SupportedNetwork, structs?: Record); + /** + * Helper method to check if the app ID is available + */ + protected isAppIdAvailable(): boolean; + /** + * Helper method that throws an error if the app ID is not available + */ + protected requireAppId(): void; + /** + * Override getGlobal to add null check + */ + protected getGlobal(key: Uint8Array, defaultValue?: any, appId?: number): Promise; + /** + * Override boxExists to add null check + */ + protected boxExists(boxName: Uint8Array, appId?: number): Promise; + /** + * Override getBox to add null check + */ + protected getBox(boxName: Uint8Array, structName: string, appId?: number): Promise; +} +export default TinymanNullableAppClient; diff --git a/dist/util/client/base/baseClient.d.ts b/dist/util/client/base/baseClient.d.ts index f2fde585..e1d006b7 100644 --- a/dist/util/client/base/baseClient.d.ts +++ b/dist/util/client/base/baseClient.d.ts @@ -1,14 +1,14 @@ -import algosdk, { Algodv2 } from "algosdk"; -import { SupportedNetwork } from "../../commonTypes"; +import algosdk, { Algodv2, Transaction } from "algosdk"; +import { SignerTransaction, SupportedNetwork } from "../../commonTypes"; import { StructDefinition } from "./types"; import { Struct } from "./utils"; -declare abstract class TinymanBaseClient { - algod: Algodv2; - appId: number; - applicationAddress: algosdk.Address; - network: SupportedNetwork; +declare abstract class TinymanBaseClient { + protected algod: Algodv2; + protected applicationAddress: AppAddress; + protected network: SupportedNetwork; + appId: AppId; readonly structs: Record | undefined; - constructor(algod: Algodv2, appId: number, network: SupportedNetwork, structs?: Record); + constructor(algod: Algodv2, appId: AppId, network: SupportedNetwork, structs?: Record); protected setupTxnFeeAndAssignGroupId({ txns, additionalFeeCount }: { txns: algosdk.Transaction[]; additionalFeeCount?: number; @@ -20,9 +20,10 @@ declare abstract class TinymanBaseClient { boxes?: Record; }): number; protected boxExists(boxName: Uint8Array, appId?: number): Promise; - protected getBox(boxName: Uint8Array, structName: string, appId?: number): Promise; + protected getBox(boxName: Uint8Array, structName: string, appId?: number, structs?: Record): Promise; protected getOptinTxnIfNeeded(sender: string, assetId: number): Promise; - protected isOptedIn(accountAddress: string, assetId: number): Promise; + protected isOptedIn(accountAddress: string | algosdk.Address, assetId: number): Promise; protected getSuggestedParams(): Promise; + convertStandardTransactionsToSignerTransactions(txns: Transaction[], signer: string | string[]): SignerTransaction[]; } export default TinymanBaseClient; diff --git a/dist/util/client/base/constants.d.ts b/dist/util/client/base/constants.d.ts index cb276e17..2b9b4f86 100644 --- a/dist/util/client/base/constants.d.ts +++ b/dist/util/client/base/constants.d.ts @@ -2,4 +2,5 @@ declare const MINIMUM_BALANCE_REQUIREMENT_PER_BOX = 2500; declare const MINIMUM_BALANCE_REQUIREMENT_PER_BOX_BYTE = 400; declare const MINIMUM_BALANCE_REQUIREMENT_PER_ACCOUNT = 100000; declare const MINIMUM_BALANCE_REQUIREMENT_PER_ASSET = 100000; -export { MINIMUM_BALANCE_REQUIREMENT_PER_ACCOUNT, MINIMUM_BALANCE_REQUIREMENT_PER_ASSET, MINIMUM_BALANCE_REQUIREMENT_PER_BOX, MINIMUM_BALANCE_REQUIREMENT_PER_BOX_BYTE }; +declare const HTTP_NOT_FOUND_STATUS = 404; +export { MINIMUM_BALANCE_REQUIREMENT_PER_ACCOUNT, MINIMUM_BALANCE_REQUIREMENT_PER_ASSET, MINIMUM_BALANCE_REQUIREMENT_PER_BOX, MINIMUM_BALANCE_REQUIREMENT_PER_BOX_BYTE, HTTP_NOT_FOUND_STATUS }; diff --git a/dist/util/client/base/nullableBaseClient.d.ts b/dist/util/client/base/nullableBaseClient.d.ts new file mode 100644 index 00000000..af2c326e --- /dev/null +++ b/dist/util/client/base/nullableBaseClient.d.ts @@ -0,0 +1,32 @@ +import { Algodv2 } from "algosdk"; +import { StructDefinition } from "./types"; +import TinymanBaseClient from "./baseClient"; +import { SupportedNetwork } from "../../commonTypes"; +/** + * Abstract client for Tinyman applications that may not have an app ID initially + * This class overrides the base non-nullable properties to allow null values + */ +declare abstract class TinymanNullableBaseClient extends TinymanBaseClient { + constructor(algod: Algodv2, appId: number | null, network: SupportedNetwork, structs?: Record); + /** + * Helper method to check if the app ID is available + */ + protected isAppIdAvailable(): boolean; + /** + * Helper method that throws an error if the app ID is not available + */ + protected requireAppId(): void; + /** + * Override getGlobal to add null check + */ + protected getGlobal(key: Uint8Array, defaultValue?: any, appId?: number): Promise; + /** + * Override boxExists to add null check + */ + protected boxExists(boxName: Uint8Array, appId?: number): Promise; + /** + * Override getBox to add null check + */ + protected getBox(boxName: Uint8Array, structName: string, appId?: number): Promise; +} +export default TinymanNullableBaseClient; diff --git a/dist/util/client/base/utils.d.ts b/dist/util/client/base/utils.d.ts index 6534e25b..632c365b 100644 --- a/dist/util/client/base/utils.d.ts +++ b/dist/util/client/base/utils.d.ts @@ -19,5 +19,4 @@ declare class ArrayData { getField(index: number): Struct; } declare function getBoxCosts(boxes: Record): number; -declare function getStruct(name: string, structReference: Record): Struct; -export { ArrayData, getBoxCosts, Struct, getStruct }; +export { ArrayData, getBoxCosts, Struct }; diff --git a/dist/util/pool/common/index.d.ts b/dist/util/pool/common/index.d.ts index 3e0a131a..eded1a2b 100644 --- a/dist/util/pool/common/index.d.ts +++ b/dist/util/pool/common/index.d.ts @@ -10,14 +10,14 @@ export declare function getPoolShare(totalLiquidity: bigint, ownedLiquidity: big /** * Calculates the pair ratio for the pool reserves */ -export declare function getPoolPairRatio(reserves: null | PoolReserves): null | number; +export declare function getPoolPairRatio(reserves: null | Pick): null | number; /** * Checks if the pool is empty * * @param poolReserves - Pool reserves * @returns true if pool is empty, otherwise returns false */ -export declare function isPoolEmpty(poolReserves: undefined | null | PoolReserves): boolean; +export declare function isPoolEmpty(poolReserves: undefined | null | Pick): boolean; /** * @param pool - Pool info * @returns true if pool's status is NOT_CREATED, otherwise returns false diff --git a/dist/util/pool/index.d.ts b/dist/util/pool/index.d.ts index 436b549a..c6c72124 100644 --- a/dist/util/pool/index.d.ts +++ b/dist/util/pool/index.d.ts @@ -1,7 +1,7 @@ export declare const poolUtils: { getPoolShare(totalLiquidity: bigint, ownedLiquidity: bigint): number; - getPoolPairRatio(reserves: import("./poolTypes").PoolReserves | null): number | null; - isPoolEmpty(poolReserves: import("./poolTypes").PoolReserves | null | undefined): boolean; + getPoolPairRatio(reserves: Pick | null): number | null; + isPoolEmpty(poolReserves: Pick | null | undefined): boolean; isPoolNotCreated(pool: import("./poolTypes").V1PoolInfo | import("./poolTypes").V2PoolInfo | null | undefined): boolean; isPoolReady(pool: import("./poolTypes").V1PoolInfo | import("./poolTypes").V2PoolInfo | null | undefined): boolean; getPoolsForPair(params: { @@ -12,8 +12,8 @@ export declare const poolUtils: { }): Promise<[import("./poolTypes").V1PoolInfo, import("./poolTypes").V2PoolInfo]>; v1_1: { getPoolShare(totalLiquidity: bigint, ownedLiquidity: bigint): number; - getPoolPairRatio(reserves: import("./poolTypes").PoolReserves | null): number | null; - isPoolEmpty(poolReserves: import("./poolTypes").PoolReserves | null | undefined): boolean; + getPoolPairRatio(reserves: Pick | null): number | null; + isPoolEmpty(poolReserves: Pick | null | undefined): boolean; isPoolNotCreated(pool: import("./poolTypes").V1PoolInfo | import("./poolTypes").V2PoolInfo | null | undefined): boolean; isPoolReady(pool: import("./poolTypes").V1PoolInfo | import("./poolTypes").V2PoolInfo | null | undefined): boolean; getPoolsForPair(params: { @@ -37,8 +37,8 @@ export declare const poolUtils: { }; v2: { getPoolShare(totalLiquidity: bigint, ownedLiquidity: bigint): number; - getPoolPairRatio(reserves: import("./poolTypes").PoolReserves | null): number | null; - isPoolEmpty(poolReserves: import("./poolTypes").PoolReserves | null | undefined): boolean; + getPoolPairRatio(reserves: Pick | null): number | null; + isPoolEmpty(poolReserves: Pick | null | undefined): boolean; isPoolNotCreated(pool: import("./poolTypes").V1PoolInfo | import("./poolTypes").V2PoolInfo | null | undefined): boolean; isPoolReady(pool: import("./poolTypes").V1PoolInfo | import("./poolTypes").V2PoolInfo | null | undefined): boolean; getPoolsForPair(params: { diff --git a/dist/util/util.d.ts b/dist/util/util.d.ts index 4afae1dc..1f0c36d8 100644 --- a/dist/util/util.d.ts +++ b/dist/util/util.d.ts @@ -50,6 +50,7 @@ export declare function sendAndWaitRawTransaction(client: Algodv2, signedTxnGrou }[]>; export declare function sumUpTxnFees(txns: SignerTransaction[]): number; export declare function getTxnGroupID(txns: SignerTransaction[]): string; +export declare function intToBytes(num: number, length?: number): Uint8Array; export declare function encodeInteger(number: bigint): number[]; /** * Converts a text into bytes diff --git a/examples/package-lock.json b/examples/package-lock.json index 9ec113c6..845f53a3 100644 --- a/examples/package-lock.json +++ b/examples/package-lock.json @@ -9,8 +9,8 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "@tinymanorg/tinyman-js-sdk": "^2.0.1", - "algosdk": "^1.22.0" + "@tinymanorg/tinyman-js-sdk": "github:tinymanorg/tinyman-js-sdk#63cc668726f515564a6d237f113cad617c63870e", + "algosdk": "^3.3.0" }, "devDependencies": { "@types/node": "^18.8.5", @@ -56,12 +56,15 @@ } }, "node_modules/@tinymanorg/tinyman-js-sdk": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@tinymanorg/tinyman-js-sdk/-/tinyman-js-sdk-2.0.5.tgz", - "integrity": "sha512-8juQVqTYu0Ov9guPuSYL+Uy1YGwtvtROxItUwf9Un8XsYdjT1BZEM7C9H4YvKWgoi1sFtFM1zg5h9raJBj14yw==", + "version": "5.0.3", + "resolved": "git+ssh://git@github.com/tinymanorg/tinyman-js-sdk.git#63cc668726f515564a6d237f113cad617c63870e", + "integrity": "sha512-047AEybWIXHbf2NJVAp+gk9yYnqfIbdts/evCAfAsETpjGMx3HzL+bxvEIgfdTsJRlDY4kSh7FzQCMtwubzCAA==", + "license": "MIT", "dependencies": { - "algosdk": "^1.20.0", - "base64-js": "^1.5.1" + "algosdk": "^3.2.0", + "base64-js": "^1.5.1", + "multiformats": "^13.2.2", + "uuid": "^10.0.0" } }, "node_modules/@tsconfig/node10": { @@ -115,22 +118,20 @@ "node": ">=0.4.0" } }, - "node_modules/algo-msgpack-with-bigint": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/algo-msgpack-with-bigint/-/algo-msgpack-with-bigint-2.1.1.tgz", - "integrity": "sha512-F1tGh056XczEaEAqu7s+hlZUDWwOBT70Eq0lfMpBP2YguSQVyxRbprLq5rELXKQOyOaixTWYhMeMQMzP0U5FoQ==", + "node_modules/algorand-msgpack": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/algorand-msgpack/-/algorand-msgpack-1.1.0.tgz", + "integrity": "sha512-08k7pBQnkaUB5p+jL7f1TRaUIlTSDE0cesFu1mD7llLao+1cAhtvvZmGE3OnisTd0xOn118QMw74SRqddqaYvw==", "engines": { - "node": ">= 10" + "node": ">= 14" } }, "node_modules/algosdk": { - "version": "1.24.1", - "resolved": "https://registry.npmjs.org/algosdk/-/algosdk-1.24.1.tgz", - "integrity": "sha512-9moZxdqeJ6GdE4N6fA/GlUP4LrbLZMYcYkt141J4Ss68OfEgH9qW0wBuZ3ZOKEx/xjc5bg7mLP2Gjg7nwrkmww==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/algosdk/-/algosdk-3.3.0.tgz", + "integrity": "sha512-pswTNxTE12Ni0TXbUCgf679XzLs/vuIsRKQhZgWGf2QiwUfNE3t47tCRW4XEz7MHix9lpu8y39FJN8lsZzVU4g==", "dependencies": { - "algo-msgpack-with-bigint": "^2.1.1", - "buffer": "^6.0.2", - "cross-fetch": "^3.1.5", + "algorand-msgpack": "^1.1.0", "hi-base32": "^0.5.1", "js-sha256": "^0.9.0", "js-sha3": "^0.8.0", @@ -140,7 +141,7 @@ "vlq": "^2.0.4" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, "node_modules/arg": { @@ -169,50 +170,19 @@ ] }, "node_modules/bignumber.js": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", - "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.0.tgz", + "integrity": "sha512-EM7aMFTXbptt/wZdMlBv2t8IViwQL+h6SLHosp8Yf0dqJMTnY6iL32opnAB6kAdL0SZPuvcAzFr31o0c/R3/RA==", "engines": { "node": "*" } }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, - "node_modules/cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", - "dependencies": { - "node-fetch": "2.6.7" - } - }, "node_modules/diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", @@ -227,25 +197,6 @@ "resolved": "https://registry.npmjs.org/hi-base32/-/hi-base32-0.5.1.tgz", "integrity": "sha512-EmBBpvdYh/4XxsnUybsPag6VikPYnN30td+vQk+GI3qpahVEG9+gTkG0aXVxTjBqQ5T6ijbWIu77O+C5WFWsnA==" }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/js-sha256": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz", @@ -275,29 +226,10 @@ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, - "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "node_modules/multiformats": { + "version": "13.3.6", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.3.6.tgz", + "integrity": "sha512-yakbt9cPYj8d3vi/8o/XWm61MrOILo7fsTL0qxNx6zS0Nso6K5JqqS2WV7vK/KSuDBvrW3KfCwAdAgarAgOmww==" }, "node_modules/ts-node": { "version": "10.9.1", @@ -360,6 +292,18 @@ "node": ">=4.2.0" } }, + "node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", @@ -371,20 +315,6 @@ "resolved": "https://registry.npmjs.org/vlq/-/vlq-2.0.4.tgz", "integrity": "sha512-aodjPa2wPQFkra1G8CzJBTHXhgk3EVSwxSWXNPr1fgdFLUb8kvLV1iEb6rFgasIsjP82HWI6dsb5Io26DDnasA==" }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", @@ -428,12 +358,14 @@ } }, "@tinymanorg/tinyman-js-sdk": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@tinymanorg/tinyman-js-sdk/-/tinyman-js-sdk-2.0.5.tgz", - "integrity": "sha512-8juQVqTYu0Ov9guPuSYL+Uy1YGwtvtROxItUwf9Un8XsYdjT1BZEM7C9H4YvKWgoi1sFtFM1zg5h9raJBj14yw==", + "version": "git+ssh://git@github.com/tinymanorg/tinyman-js-sdk.git#63cc668726f515564a6d237f113cad617c63870e", + "integrity": "sha512-047AEybWIXHbf2NJVAp+gk9yYnqfIbdts/evCAfAsETpjGMx3HzL+bxvEIgfdTsJRlDY4kSh7FzQCMtwubzCAA==", + "from": "@tinymanorg/tinyman-js-sdk@github:tinymanorg/tinyman-js-sdk#63cc668726f515564a6d237f113cad617c63870e", "requires": { - "algosdk": "^1.20.0", - "base64-js": "^1.5.1" + "algosdk": "^3.2.0", + "base64-js": "^1.5.1", + "multiformats": "^13.2.2", + "uuid": "^10.0.0" } }, "@tsconfig/node10": { @@ -478,19 +410,17 @@ "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "dev": true }, - "algo-msgpack-with-bigint": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/algo-msgpack-with-bigint/-/algo-msgpack-with-bigint-2.1.1.tgz", - "integrity": "sha512-F1tGh056XczEaEAqu7s+hlZUDWwOBT70Eq0lfMpBP2YguSQVyxRbprLq5rELXKQOyOaixTWYhMeMQMzP0U5FoQ==" + "algorand-msgpack": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/algorand-msgpack/-/algorand-msgpack-1.1.0.tgz", + "integrity": "sha512-08k7pBQnkaUB5p+jL7f1TRaUIlTSDE0cesFu1mD7llLao+1cAhtvvZmGE3OnisTd0xOn118QMw74SRqddqaYvw==" }, "algosdk": { - "version": "1.24.1", - "resolved": "https://registry.npmjs.org/algosdk/-/algosdk-1.24.1.tgz", - "integrity": "sha512-9moZxdqeJ6GdE4N6fA/GlUP4LrbLZMYcYkt141J4Ss68OfEgH9qW0wBuZ3ZOKEx/xjc5bg7mLP2Gjg7nwrkmww==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/algosdk/-/algosdk-3.3.0.tgz", + "integrity": "sha512-pswTNxTE12Ni0TXbUCgf679XzLs/vuIsRKQhZgWGf2QiwUfNE3t47tCRW4XEz7MHix9lpu8y39FJN8lsZzVU4g==", "requires": { - "algo-msgpack-with-bigint": "^2.1.1", - "buffer": "^6.0.2", - "cross-fetch": "^3.1.5", + "algorand-msgpack": "^1.1.0", "hi-base32": "^0.5.1", "js-sha256": "^0.9.0", "js-sha3": "^0.8.0", @@ -512,18 +442,9 @@ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, "bignumber.js": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", - "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==" - }, - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.0.tgz", + "integrity": "sha512-EM7aMFTXbptt/wZdMlBv2t8IViwQL+h6SLHosp8Yf0dqJMTnY6iL32opnAB6kAdL0SZPuvcAzFr31o0c/R3/RA==" }, "create-require": { "version": "1.1.1", @@ -531,14 +452,6 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, - "cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", - "requires": { - "node-fetch": "2.6.7" - } - }, "diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", @@ -550,11 +463,6 @@ "resolved": "https://registry.npmjs.org/hi-base32/-/hi-base32-0.5.1.tgz", "integrity": "sha512-EmBBpvdYh/4XxsnUybsPag6VikPYnN30td+vQk+GI3qpahVEG9+gTkG0aXVxTjBqQ5T6ijbWIu77O+C5WFWsnA==" }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, "js-sha256": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz", @@ -584,18 +492,10 @@ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "multiformats": { + "version": "13.3.6", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.3.6.tgz", + "integrity": "sha512-yakbt9cPYj8d3vi/8o/XWm61MrOILo7fsTL0qxNx6zS0Nso6K5JqqS2WV7vK/KSuDBvrW3KfCwAdAgarAgOmww==" }, "ts-node": { "version": "10.9.1", @@ -629,6 +529,11 @@ "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true }, + "uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==" + }, "v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", @@ -640,20 +545,6 @@ "resolved": "https://registry.npmjs.org/vlq/-/vlq-2.0.4.tgz", "integrity": "sha512-aodjPa2wPQFkra1G8CzJBTHXhgk3EVSwxSWXNPr1fgdFLUb8kvLV1iEb6rFgasIsjP82HWI6dsb5Io26DDnasA==" }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", diff --git a/examples/package.json b/examples/package.json index 19164de8..39a154fe 100644 --- a/examples/package.json +++ b/examples/package.json @@ -9,8 +9,8 @@ "author": "Tinyman Core Team", "license": "ISC", "dependencies": { - "algosdk": "^1.22.0", - "@tinymanorg/tinyman-js-sdk": "^2.0.1" + "algosdk": "^3.3.0", + "@tinymanorg/tinyman-js-sdk": "github:tinymanorg/tinyman-js-sdk#63cc668726f515564a6d237f113cad617c63870e" }, "devDependencies": { "@types/node": "^18.8.5", diff --git a/examples/src/operation/add-liquidity/addFlexibleLiquidity.ts b/examples/src/operation/add-liquidity/addFlexibleLiquidity.ts index 031c3c45..9846441a 100644 --- a/examples/src/operation/add-liquidity/addFlexibleLiquidity.ts +++ b/examples/src/operation/add-liquidity/addFlexibleLiquidity.ts @@ -23,7 +23,7 @@ export async function addFlexibleLiquidity({ asset_1: {id: string; unit_name: string}; asset_2: {id: string; unit_name: string}; }) { - const initiatorAddr = account.addr; + const initiatorAddr = account.addr.toString(); const poolInfo = await poolUtils.v2.getPoolInfo({ network: "testnet" as SupportedNetwork, client: algodClient, @@ -35,11 +35,11 @@ export async function addFlexibleLiquidity({ const quote = AddLiquidity.v2.flexible.getQuote({ pool: poolInfo, asset1: { - amount: 25_000_000, + amount: 25_000_000n, decimals: 6 }, asset2: { - amount: 75_000_000, + amount: 75_000_000n, decimals: 6 } }); @@ -48,7 +48,7 @@ export async function addFlexibleLiquidity({ network: "testnet" as SupportedNetwork, client: algodClient, initiatorAddr, - poolAddress: poolInfo.account.address(), + poolAddress: poolInfo.account.address().toString(), asset1In: quote.asset1In, asset2In: quote.asset2In, poolTokenOut: quote.poolTokenOut, diff --git a/examples/src/operation/add-liquidity/addInitialLiquidity.ts b/examples/src/operation/add-liquidity/addInitialLiquidity.ts index 45cf0ce8..b098808a 100644 --- a/examples/src/operation/add-liquidity/addInitialLiquidity.ts +++ b/examples/src/operation/add-liquidity/addInitialLiquidity.ts @@ -22,7 +22,7 @@ export async function addInitialLiquidity({ asset_1: {id: string; unit_name: string}; asset_2: {id: string; unit_name: string}; }) { - const initiatorAddr = account.addr; + const initiatorAddr = account.addr.toString(); const poolInfo = await poolUtils.v2.getPoolInfo({ network: "testnet" as SupportedNetwork, client: algodClient, @@ -34,11 +34,11 @@ export async function addInitialLiquidity({ const quote = AddLiquidity.v2.initial.getQuote({ pool: poolInfo, asset1: { - amount: 10_000_000, + amount: 10_000_000n, decimals: 6 }, asset2: { - amount: 25_000_000, + amount: 25_000_000n, decimals: 6 } }); @@ -50,7 +50,7 @@ export async function addInitialLiquidity({ initiatorAddr, asset1In: quote.asset1In, asset2In: quote.asset2In, - poolAddress: poolInfo.account.address(), + poolAddress: poolInfo.account.address().toString(), poolTokenId: poolInfo.poolTokenID! }); diff --git a/examples/src/operation/add-liquidity/addSingleAssetLiquidity.ts b/examples/src/operation/add-liquidity/addSingleAssetLiquidity.ts index 07f0a342..4bcc7286 100644 --- a/examples/src/operation/add-liquidity/addSingleAssetLiquidity.ts +++ b/examples/src/operation/add-liquidity/addSingleAssetLiquidity.ts @@ -23,7 +23,7 @@ export async function addSingleAssetLiquidity({ asset_1: {id: string; unit_name: string}; asset_2: {id: string; unit_name: string}; }) { - const initiatorAddr = account.addr; + const initiatorAddr = account.addr.toString(); const poolInfo = await poolUtils.v2.getPoolInfo({ network: "testnet" as SupportedNetwork, client: algodClient, @@ -37,7 +37,7 @@ export async function addSingleAssetLiquidity({ assetIn: { // Add liquidity only using asset1 id: Number(asset_1.id), - amount: 25_000_000 + amount: 25_000_000n }, decimals: { asset1: 6, @@ -49,7 +49,7 @@ export async function addSingleAssetLiquidity({ network: "testnet" as SupportedNetwork, client: algodClient, initiatorAddr, - poolAddress: poolInfo.account.address(), + poolAddress: poolInfo.account.address().toString(), assetIn: quote.assetIn, poolTokenId: poolInfo.poolTokenID!, minPoolTokenAssetAmount: quote.minPoolTokenAssetAmountWithSlippage diff --git a/examples/src/operation/bootstrap/bootstrapPool.ts b/examples/src/operation/bootstrap/bootstrapPool.ts index e6d86656..8e2cd910 100644 --- a/examples/src/operation/bootstrap/bootstrapPool.ts +++ b/examples/src/operation/bootstrap/bootstrapPool.ts @@ -29,7 +29,7 @@ export async function bootstrapPool({ client: algodClient, asset_1, asset_2, - initiatorAddr + initiatorAddr: initiatorAddr.toString() }); const signedTxns = await Bootstrap.v2.signTxns({ diff --git a/examples/src/operation/order/order.ts b/examples/src/operation/order/order.ts new file mode 100644 index 00000000..e29e9909 --- /dev/null +++ b/examples/src/operation/order/order.ts @@ -0,0 +1,177 @@ +import { + InitiatorSigner, + OrderingClient, + OrderType, + PutRecurringOrderParams, + PutTriggerOrderParams, + sendAndWaitRawTransaction, + SupportedNetwork +} from "@tinymanorg/tinyman-js-sdk"; + +import {algodClient} from "../../util/client"; + +export function initializeOrderingClient( + selectedAccountAddress: string, + network: SupportedNetwork +) { + return OrderingClient.initializeOrderingClient( + algodClient, + network, + selectedAccountAddress + ); +} + +export async function createOrderApplication( + orderingClient: OrderingClient, + selectedAccountAddress: string, + initiatorSigner: InitiatorSigner, + network: SupportedNetwork +) { + try { + const createOrderTxns = await orderingClient.prepareCreateOrderAppTransactions( + selectedAccountAddress + ); + + const signedTxns = await initiatorSigner([ + orderingClient.convertStandardTransactionsToSignerTransactions( + createOrderTxns, + selectedAccountAddress + ) + ]); + + const response = await sendAndWaitRawTransaction(algodClient, [signedTxns]); + + // Once the order app is created re-instantiate the OrderingClient to set the app id + await initializeOrderingClient(selectedAccountAddress, network); + return response; + } catch (error: any) { + return Promise.reject(new Error(error?.message)); + } +} + +export async function updateOrderApplicationIfNecessary( + orderingClient: OrderingClient, + selectedAccountAddress: string, + initiatorSigner: InitiatorSigner +) { + try { + const shouldUpdateOrderApp = await orderingClient.shouldUpdateOrderingApp(); + + if (!shouldUpdateOrderApp) { + return; + } + + const txns = await orderingClient.prepareUpdateOrderingAppTransactions(); + + const signedTxns = await initiatorSigner([ + orderingClient.convertStandardTransactionsToSignerTransactions( + txns, + selectedAccountAddress + ) + ]); + + await sendAndWaitRawTransaction(algodClient, [signedTxns]); + + console.log("Order app updated successfully"); + } catch (error: any) { + console.log(error.message); + } +} + +export async function placeTriggerOrder( + orderParams: PutTriggerOrderParams, + orderingClient: OrderingClient, + selectedAccountAddress: string, + initiatorSigner: InitiatorSigner +) { + try { + const txns = await orderingClient.preparePutTriggerOrderTransactions(orderParams); + + const signedTxns = await initiatorSigner([ + orderingClient.convertStandardTransactionsToSignerTransactions( + txns, + selectedAccountAddress + ) + ]); + + const response = await sendAndWaitRawTransaction(algodClient, [signedTxns]); + + return response; + } catch (error: any) { + return Promise.reject(new Error(error?.message)); + } +} + +export async function placeRecurringOrder( + orderParams: PutRecurringOrderParams, + orderingClient: OrderingClient, + selectedAccountAddress: string, + initiatorSigner: InitiatorSigner +) { + try { + const txns = await orderingClient.preparePutRecurringOrderTransactions(orderParams); + + const signedTxns = await initiatorSigner([ + orderingClient.convertStandardTransactionsToSignerTransactions( + txns, + selectedAccountAddress + ) + ]); + + const response = await sendAndWaitRawTransaction(algodClient, [signedTxns]); + + return response; + } catch (error: any) { + return Promise.reject(new Error(error?.message)); + } +} + +export async function claimPartialOrder( + orderingClient: OrderingClient, + selectedAccountAddress: string, + initiatorSigner: InitiatorSigner, + orderId: number, + type: OrderType +) { + try { + const txns = await orderingClient.prepareClaimCollectedTargetAmount(orderId, type); + + const signedTxns = await initiatorSigner([ + orderingClient.convertStandardTransactionsToSignerTransactions( + txns, + selectedAccountAddress + ) + ]); + + const res = await sendAndWaitRawTransaction(algodClient, [signedTxns]); + + return Promise.resolve(res); + } catch (error: any) { + return Promise.reject(error.message); + } +} + +export async function cancelOrder( + orderingClient: OrderingClient, + selectedAccountAddress: string, + initiatorSigner: InitiatorSigner, + orderId: number, + type: OrderType +) { + try { + const txns = await orderingClient.prepareCancelOrderTransactions(orderId, type); + + const signedTxns = await initiatorSigner([ + orderingClient.convertStandardTransactionsToSignerTransactions( + txns, + selectedAccountAddress + ) + ]); + + const response = await sendAndWaitRawTransaction(algodClient, [signedTxns]); + + return response; + } catch (error: any) { + return Promise.reject(new Error(error?.message)); + } +} diff --git a/examples/src/operation/remove-liquidity/removeLiquidity.ts b/examples/src/operation/remove-liquidity/removeLiquidity.ts index 72389521..eb7e1204 100644 --- a/examples/src/operation/remove-liquidity/removeLiquidity.ts +++ b/examples/src/operation/remove-liquidity/removeLiquidity.ts @@ -17,7 +17,7 @@ export async function removeLiquidity({ asset_1: {id: string; unit_name: string}; asset_2: {id: string; unit_name: string}; }) { - const initiatorAddr = account.addr; + const initiatorAddr = account.addr.toString(); const poolInfo = await poolUtils.v2.getPoolInfo({ network: "testnet" as SupportedNetwork, client: algodClient, @@ -29,14 +29,14 @@ export async function removeLiquidity({ // Get the owned pool token amount, so we can decide how much to remove const ownedPoolTokenAssetAmount = await getOwnedAssetAmount( initiatorAddr, - poolInfo.poolTokenID! + BigInt(poolInfo.poolTokenID!) ); /** * For testing purposes, we will remove 1/4 of the owned pool tokens, * it can be any amount that is lower than the owned amount */ - const poolTokenAmountToBeRemoved = Math.floor(ownedPoolTokenAssetAmount / 4); + const poolTokenAmountToBeRemoved = ownedPoolTokenAssetAmount / 4n; // Get a quote for the desired removal amount const quote = RemoveLiquidity.v2.getQuote({ diff --git a/examples/src/operation/remove-liquidity/removeLiquidityWithSingleAssetOut.ts b/examples/src/operation/remove-liquidity/removeLiquidityWithSingleAssetOut.ts index 6b7cdf4a..0774ec3b 100644 --- a/examples/src/operation/remove-liquidity/removeLiquidityWithSingleAssetOut.ts +++ b/examples/src/operation/remove-liquidity/removeLiquidityWithSingleAssetOut.ts @@ -17,7 +17,7 @@ export async function removeLiquidityWithSingleAssetOut({ asset_1: {id: string; unit_name: string}; asset_2: {id: string; unit_name: string}; }) { - const initiatorAddr = account.addr; + const initiatorAddr = account.addr.toString(); const poolInfo = await poolUtils.v2.getPoolInfo({ network: "testnet" as SupportedNetwork, client: algodClient, @@ -29,14 +29,14 @@ export async function removeLiquidityWithSingleAssetOut({ // Get the owned pool token amount, so we can decide how much to remove const ownedPoolTokenAssetAmount = await getOwnedAssetAmount( initiatorAddr, - poolInfo.poolTokenID! + BigInt(poolInfo.poolTokenID!) ); /** * For testing purposes, we will remove 1/4 of the owned pool tokens, * it can be any amount that is lower than the owned amount */ - const poolTokenAmountToBeRemoved = Math.floor(ownedPoolTokenAssetAmount / 4); + const poolTokenAmountToBeRemoved = ownedPoolTokenAssetAmount / 4n; // Get a quote for the desired removal amount const quote = RemoveLiquidity.v2.getSingleAssetRemoveLiquidityQuote({ diff --git a/examples/src/operation/swap/fixedInputSwap.ts b/examples/src/operation/swap/fixedInputSwap.ts index c3703761..9803171b 100644 --- a/examples/src/operation/swap/fixedInputSwap.ts +++ b/examples/src/operation/swap/fixedInputSwap.ts @@ -17,42 +17,38 @@ export async function fixedInputSwap({ asset_1: {id: string; unit_name: string}; asset_2: {id: string; unit_name: string}; }) { - const initiatorAddr = account.addr; + const initiatorAddr = account.addr.toString(); const pool = await poolUtils.v2.getPoolInfo({ network: "testnet" as SupportedNetwork, client: algodClient, asset1ID: Number(asset_1.id), asset2ID: Number(asset_2.id) }); + const slippage = 0.05; /** * This example uses only v2 quote. Similarly, we can use * Swap.getQuote method, which will return the best quote (highest rate) * after checking both v1 and v2 */ - const fixedInputSwapQuote = Swap.v2.getQuote( - SwapType.FixedInput, + + const fixedInputSwapQuote = await Swap.v2.getQuote({ + type: SwapType.FixedInput, pool, - {id: pool.asset1ID, amount: 1_000_000}, - {assetIn: 6, assetOut: 6} - ); - const assetIn = { - id: fixedInputSwapQuote.assetInID, - amount: fixedInputSwapQuote.assetInAmount - }; - const assetOut = { - id: fixedInputSwapQuote.assetOutID, - amount: fixedInputSwapQuote.assetOutAmount - }; + amount: 1_000_000n, + assetIn: {id: pool.asset1ID, decimals: 6}, + assetOut: {id: pool.asset2ID, decimals: 6}, + network: "testnet", + slippage + }); const fixedInputSwapTxns = await Swap.v2.generateTxns({ client: algodClient, + network: "testnet", + quote: fixedInputSwapQuote, swapType: SwapType.FixedInput, - pool, - initiatorAddr, - assetIn, - assetOut, - slippage: 0.05 + slippage, + initiatorAddr }); const signedTxns = await Swap.v2.signTxns({ @@ -61,14 +57,75 @@ export async function fixedInputSwap({ }); const swapExecutionResponse = await Swap.v2.execute({ - network: "testnet" as SupportedNetwork, + quote: fixedInputSwapQuote, client: algodClient, signedTxns, + txGroup: fixedInputSwapTxns + }); + + console.log("✅ Fixed Input Swap executed successfully!"); + console.log({txnID: swapExecutionResponse.txnID}); +} + +/** + * Executes a swap with a fixed input amount + * (Input amount is entered by the user, output amount is to be calculated by the SDK) + */ +export async function fixedInputSwapWithoutSwapRouter({ + account, + asset_1, + asset_2 +}: { + account: Account; + asset_1: {id: string; unit_name: string}; + asset_2: {id: string; unit_name: string}; +}) { + const initiatorAddr = account.addr.toString(); + const pool = await poolUtils.v2.getPoolInfo({ + network: "testnet" as SupportedNetwork, + client: algodClient, + asset1ID: Number(asset_1.id), + asset2ID: Number(asset_2.id) + }); + const slippage = 0.05; + + /** + * This example uses only v2 quote. Similarly, we can use + * Swap.getQuote method, which will return the best quote (highest rate) + * after checking both v1 and v2, without using the swap router + */ + + const fixedInputSwapQuote = await Swap.v2.getQuote({ + type: SwapType.FixedInput, pool, + amount: 1_000_000n, + assetIn: {id: pool.asset1ID, decimals: 6}, + assetOut: {id: pool.asset2ID, decimals: 6}, + network: "testnet", + slippage + }); + + const fixedInputSwapTxns = await Swap.v2.generateTxns({ + client: algodClient, + network: "testnet", + quote: fixedInputSwapQuote, + swapType: SwapType.FixedInput, + slippage, + initiatorAddr + }); + + const signedTxns = await Swap.v2.signTxns({ txGroup: fixedInputSwapTxns, - assetIn + initiatorSigner: signerWithSecretKey(account) }); - console.log("✅ Fixed Input Swap executed successfully!"); + const swapExecutionResponse = await Swap.v2.execute({ + quote: fixedInputSwapQuote, + client: algodClient, + signedTxns, + txGroup: fixedInputSwapTxns + }); + + console.log("✅ Fixed Input Swap with disabled Swap Router executed successfully!"); console.log({txnID: swapExecutionResponse.txnID}); } diff --git a/examples/src/operation/swap/fixedOutputSwap.ts b/examples/src/operation/swap/fixedOutputSwap.ts index eb673561..62521226 100644 --- a/examples/src/operation/swap/fixedOutputSwap.ts +++ b/examples/src/operation/swap/fixedOutputSwap.ts @@ -17,57 +17,103 @@ export async function fixedOutputSwap({ asset_1: {id: string; unit_name: string}; asset_2: {id: string; unit_name: string}; }) { - const initiatorAddr = account.addr; + const initiatorAddr = account.addr.toString(); const pool = await poolUtils.v2.getPoolInfo({ network: "testnet" as SupportedNetwork, client: algodClient, asset1ID: Number(asset_1.id), asset2ID: Number(asset_2.id) }); + const slippage = 0.05; /** * This example uses only v2 quote. Similarly, we can use * Swap.getQuote method, which will return the best quote (highest rate) * after checking both v1 and v2 */ - const fixedOutputSwapQuote = Swap.v2.getQuote( - SwapType.FixedOutput, + const fixedOutputSwapQuote = await Swap.v2.getQuote({ + type: SwapType.FixedOutput, pool, - {id: pool.asset2ID, amount: 1_000_000}, - {assetIn: 6, assetOut: 6} - ); - - const assetIn = { - id: fixedOutputSwapQuote.assetInID, - amount: fixedOutputSwapQuote.assetInAmount - }; - const assetOut = { - id: fixedOutputSwapQuote.assetOutID, - amount: fixedOutputSwapQuote.assetOutAmount - }; + amount: 1_000_000n, + assetIn: {id: pool.asset1ID, decimals: 6}, + assetOut: {id: pool.asset2ID, decimals: 6}, + network: "testnet", + slippage + }); const fixedOutputSwapTxns = await Swap.v2.generateTxns({ client: algodClient, + network: "testnet", + quote: fixedOutputSwapQuote, swapType: SwapType.FixedOutput, - pool, - initiatorAddr, - assetIn, - assetOut, - slippage: 0.05 + slippage: 0.05, + initiatorAddr }); const signedTxns = await Swap.v2.signTxns({ txGroup: fixedOutputSwapTxns, initiatorSigner: signerWithSecretKey(account) }); const swapExecutionResponse = await Swap.v2.execute({ - network: "testnet" as SupportedNetwork, + quote: fixedOutputSwapQuote!, client: algodClient, signedTxns, - txGroup: fixedOutputSwapTxns, - pool, - assetIn + txGroup: fixedOutputSwapTxns }); console.log("✅ Fixed Output Swap executed successfully!"); console.log({txnID: swapExecutionResponse.txnID}); } + +/** + * Executes a swap with a fixed output amount without using the swap router + */ +export async function fixedOutputSwapWithoutSwapRouter({ + account, + asset_1, + asset_2 +}: { + account: Account; + asset_1: {id: string; unit_name: string}; + asset_2: {id: string; unit_name: string}; +}) { + const initiatorAddr = account.addr.toString(); + const pool = await poolUtils.v2.getPoolInfo({ + network: "testnet" as SupportedNetwork, + client: algodClient, + asset1ID: Number(asset_1.id), + asset2ID: Number(asset_2.id) + }); + const slippage = 0.05; + + const fixedOutputSwapQuote = await Swap.v2.getQuote({ + type: SwapType.FixedOutput, + pool, + amount: 1_000_000n, + assetIn: {id: pool.asset1ID, decimals: 6}, + assetOut: {id: pool.asset2ID, decimals: 6}, + network: "testnet", + slippage + }); + + const fixedOutputSwapTxns = await Swap.v2.generateTxns({ + client: algodClient, + network: "testnet", + quote: fixedOutputSwapQuote, + swapType: SwapType.FixedOutput, + slippage: 0.05, + initiatorAddr + }); + const signedTxns = await Swap.v2.signTxns({ + txGroup: fixedOutputSwapTxns, + initiatorSigner: signerWithSecretKey(account) + }); + const swapExecutionResponse = await Swap.v2.execute({ + quote: fixedOutputSwapQuote!, + client: algodClient, + signedTxns, + txGroup: fixedOutputSwapTxns + }); + + console.log("✅ Fixed Output Swap with disabled Swap Router executed successfully!"); + console.log({txnID: swapExecutionResponse.txnID}); +} diff --git a/examples/src/util/account.ts b/examples/src/util/account.ts index 0c7641ad..a66a9f00 100644 --- a/examples/src/util/account.ts +++ b/examples/src/util/account.ts @@ -22,7 +22,7 @@ export async function getAccount(): Promise { } try { - await assertAccountHasBalance(account.addr); + await assertAccountHasBalance(account.addr.toString()); } catch (error) { console.log(error); } @@ -52,10 +52,10 @@ function tryGetAccountFromJson() { /** * @returns the amount of the asset (with the given `assetId`) owned by the account */ -export async function getOwnedAssetAmount(accountAddress: string, assetId: number) { +export async function getOwnedAssetAmount(accountAddress: string, assetId: bigint) { const {assets} = (await algodClient .accountInformation(accountAddress) .do()) as modelsv2.Account; - return assets?.find((asset) => asset.assetId === assetId)?.amount || 0; + return assets?.find((asset) => asset.assetId === assetId)?.amount || 0n; } diff --git a/package-lock.json b/package-lock.json index 8388900d..a74f7f8a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@tinymanorg/tinyman-js-sdk", - "version": "5.0.3", + "version": "5.1.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@tinymanorg/tinyman-js-sdk", - "version": "5.0.3", + "version": "5.1.0", "license": "MIT", "dependencies": { "algosdk": "^3.2.0", diff --git a/package.json b/package.json index 2d10af1c..9309064d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@tinymanorg/tinyman-js-sdk", - "version": "5.0.3", + "version": "5.1.0", "description": "Tinyman JS SDK", "author": "Tinyman Core Team", "license": "MIT", diff --git a/src/governance/proposal-voting/storage.ts b/src/governance/proposal-voting/storage.ts index a81f9700..29834cf5 100644 --- a/src/governance/proposal-voting/storage.ts +++ b/src/governance/proposal-voting/storage.ts @@ -1,9 +1,8 @@ import {Algodv2, decodeAddress, encodeAddress} from "algosdk"; -import {intToBytes} from "../util/utils"; import {getRawBoxValue} from "../utils"; import {ATTENDANCE_SHEET_BOX_PREFIX, PROPOSAL_BOX_PREFIX} from "./constants"; -import {encodeString, joinByteArrays} from "../../util/util"; +import {encodeString, intToBytes, joinByteArrays} from "../../util/util"; export class Proposal { index: number; diff --git a/src/governance/proposal-voting/transactions.ts b/src/governance/proposal-voting/transactions.ts index a972fdb4..89e14adc 100644 --- a/src/governance/proposal-voting/transactions.ts +++ b/src/governance/proposal-voting/transactions.ts @@ -1,8 +1,7 @@ import algosdk, {decodeAddress, getApplicationAddress, SuggestedParams} from "algosdk"; import {EXECUTOR_FALLBACK_ADDRESS} from "../../util/account/accountConstants"; -import {encodeString} from "../../util/util"; -import {intToBytes} from "../util/utils"; +import {encodeString, intToBytes} from "../../util/util"; import {ACCOUNT_POWER_BOX_ARRAY_LEN} from "../vault/constants"; import { getAccountPowerBoxName, diff --git a/src/governance/rewards/constants.ts b/src/governance/rewards/constants.ts index e2076e67..c03b0392 100644 --- a/src/governance/rewards/constants.ts +++ b/src/governance/rewards/constants.ts @@ -10,7 +10,6 @@ const REWARD_PERIOD_BOX_SIZE = 1008; const REWARD_PERIOD_BOX_ARRAY_LEN = 42; const REWARD_CLAIM_SHEET_BOX_COST = - // eslint-disable-next-line no-magic-numbers BOX_FLAT_MIN_BALANCE + BOX_BYTE_MIN_BALANCE * (41 + REWARD_CLAIM_SHEET_BOX_SIZE); export { diff --git a/src/governance/rewards/storage.ts b/src/governance/rewards/storage.ts index d455b940..5b4b9b33 100644 --- a/src/governance/rewards/storage.ts +++ b/src/governance/rewards/storage.ts @@ -1,8 +1,8 @@ import {Algodv2, decodeAddress} from "algosdk"; -import {intToBytes} from "../util/utils"; import {getRawBoxValue} from "../utils"; import {REWARD_CLAIM_SHEET_BOX_PREFIX, REWARD_PERIOD_BOX_PREFIX} from "./constants"; +import {intToBytes} from "../../util/util"; class RewardsAppGlobalState { tinyAssetId: number; diff --git a/src/governance/rewards/transactions.ts b/src/governance/rewards/transactions.ts index 05631ba4..b7319397 100644 --- a/src/governance/rewards/transactions.ts +++ b/src/governance/rewards/transactions.ts @@ -1,8 +1,7 @@ import algosdk, {SuggestedParams, Transaction, getApplicationAddress} from "algosdk"; -import {encodeString, joinByteArrays} from "../../util/util"; +import {encodeString, intToBytes, joinByteArrays} from "../../util/util"; import {prepareBudgetIncreaseTxn} from "../transactions"; -import {intToBytes} from "../util/utils"; import {ACCOUNT_POWER_BOX_ARRAY_LEN} from "../vault/constants"; import {getAccountPowerBoxName, getAccountStateBoxName} from "../vault/storage"; import { diff --git a/src/governance/staking-voting/storage.ts b/src/governance/staking-voting/storage.ts index 29d0e934..9c035d79 100644 --- a/src/governance/staking-voting/storage.ts +++ b/src/governance/staking-voting/storage.ts @@ -1,8 +1,8 @@ import {Algodv2, decodeAddress} from "algosdk"; -import {encodeString, joinByteArrays} from "../../util/util"; +import {encodeString, intToBytes, joinByteArrays} from "../../util/util"; import {getProposalBoxName} from "../proposal-voting/storage"; -import {bytesToInt, intToBytes} from "../util/utils"; +import {bytesToInt} from "../util/utils"; import {getRawBoxValue} from "../utils"; import { PROPOSAL_BOX_PREFIX, diff --git a/src/governance/staking-voting/transactions.ts b/src/governance/staking-voting/transactions.ts index 11a23ec0..06a3fe49 100644 --- a/src/governance/staking-voting/transactions.ts +++ b/src/governance/staking-voting/transactions.ts @@ -7,9 +7,9 @@ import { makePaymentTxnWithSuggestedParamsFromObject } from "algosdk"; -import {encodeString, joinByteArrays} from "../../util/util"; +import {encodeString, intToBytes, joinByteArrays} from "../../util/util"; import {prepareBudgetIncreaseTxn} from "../transactions"; -import {areBuffersEqual, intToBytes, sum} from "../util/utils"; +import {areBuffersEqual, sum} from "../util/utils"; import {ACCOUNT_POWER_BOX_ARRAY_LEN} from "../vault/constants"; import {getAccountPowerBoxName, getAccountStateBoxName} from "../vault/storage"; import { diff --git a/src/governance/util/utils.ts b/src/governance/util/utils.ts index 478fa9fb..7b9fd42a 100644 --- a/src/governance/util/utils.ts +++ b/src/governance/util/utils.ts @@ -1,16 +1,3 @@ -/* eslint-disable no-bitwise */ -export function intToBytes(num: number, length = 8): Uint8Array { - const byteArray = new Uint8Array(length); - let newNum = BigInt(num); - - for (let i = length - 1; i >= 0; i--) { - byteArray[i] = Number(newNum & BigInt(0xff)); - newNum >>= BigInt(8); - } - - return byteArray; -} - export function areBuffersEqual(buf1: Uint8Array, buf2: Uint8Array) { return Buffer.compare(buf1, buf2) === 0; } diff --git a/src/governance/vault/storage.ts b/src/governance/vault/storage.ts index fb86bf9f..050ab2a2 100644 --- a/src/governance/vault/storage.ts +++ b/src/governance/vault/storage.ts @@ -1,7 +1,6 @@ import {Algodv2, bytesToBigInt, decodeAddress} from "algosdk"; -import {joinByteArrays} from "../../util/util"; -import {intToBytes} from "../util/utils"; +import {joinByteArrays, intToBytes} from "../../util/util"; import {getCumulativePowerDelta, getRawBoxValue} from "../utils"; import { ACCOUNT_POWER_BOX_ARRAY_LEN, diff --git a/src/governance/vault/transactions.ts b/src/governance/vault/transactions.ts index f0f95fa7..2275697b 100644 --- a/src/governance/vault/transactions.ts +++ b/src/governance/vault/transactions.ts @@ -19,9 +19,8 @@ import { } from "./storage"; import {prepareBudgetIncreaseTxn} from "../transactions"; import {getNewTotalPowerTimestamps} from "./utils"; -import {intToBytes} from "../util/utils"; import {SupportedNetwork} from "../../util/commonTypes"; -import {encodeString} from "../../util/util"; +import {encodeString, intToBytes} from "../../util/util"; import {TINY_ASSET_ID} from "../../util/asset/assetConstants"; function prepareCreateLockTransactions({ diff --git a/src/index.ts b/src/index.ts index 7ce5229d..140074b2 100644 --- a/src/index.ts +++ b/src/index.ts @@ -27,7 +27,8 @@ export { getTxnGroupID, sendAndWaitRawTransaction, sumUpTxnFees, - joinByteArrays + joinByteArrays, + intToBytes } from "./util/util"; export {generateOptIntoAssetTxns} from "./util/asset/assetUtils"; @@ -148,7 +149,6 @@ export {TinymanTAlgoClient} from "./liquid-stake/tAlgoClient"; export {ProposalVote} from "./governance/proposal-voting/constants"; export {generateProposalMetadata} from "./governance/proposal-voting/transactions"; export type {GenerateProposalMetadataPayload} from "./governance/proposal-voting/types"; -export {intToBytes} from "./governance/util/utils"; export {AccountState} from "./governance/vault/storage"; export {getStartTimestampOfWeek} from "./governance/vault/utils"; @@ -157,3 +157,10 @@ export { combineAndRegroupTxns, generateCidFromProposalMetadata } from "./governance/utils"; + +export {OrderingClient} from "./order/index"; +export type { + PutTriggerOrderParams, + PutRecurringOrderParams, + OrderType +} from "./order/types"; diff --git a/src/liquid-stake/stAlgoClient.ts b/src/liquid-stake/stAlgoClient.ts index 8816a519..a1d5ab1b 100644 --- a/src/liquid-stake/stAlgoClient.ts +++ b/src/liquid-stake/stAlgoClient.ts @@ -7,8 +7,7 @@ import { TALGO_ASSET_ID, TINY_ASSET_ID } from "../util/asset/assetConstants"; -import TinymanBaseClient from "../util/client/base/baseClient"; -import {getStruct, Struct} from "../util/client/base/utils"; +import {Struct} from "../util/client/base/utils"; import {SupportedNetwork} from "../util/commonTypes"; import {encodeString} from "../util/util"; import { @@ -17,10 +16,11 @@ import { STRUCTS, VAULT_APP_ID } from "./constants"; +import TinymanBaseClient from "../util/client/base/baseClient"; -const USER_STATE = getStruct("UserState", STRUCTS); +const USER_STATE = new Struct("UserState", STRUCTS); -class TinymanSTAlgoClient extends TinymanBaseClient { +class TinymanSTAlgoClient extends TinymanBaseClient { vaultAppId: number; constructor(algod: algosdk.Algodv2, network: SupportedNetwork) { super(algod, RESTAKE_APP_ID[network], network, STRUCTS); diff --git a/src/liquid-stake/tAlgoClient.test.ts b/src/liquid-stake/tAlgoClient.test.ts index 98a25f78..400a5845 100644 --- a/src/liquid-stake/tAlgoClient.test.ts +++ b/src/liquid-stake/tAlgoClient.test.ts @@ -30,7 +30,7 @@ describe("TinymanTAlgoClient", () => { if (accountInfo.amount < accountInfo.minBalance + mintAmount * 2n) { // Wait for the user to fund the account console.log( - `Go to https://bank.testnet.algorand.network/?account=${TEST_ACCOUNT.addr} and fund your account.` + "Go to https://bank.testnet.algorand.network/?account=XNG5OX7MMUTYVJN4AR7YU27Z6PM7FRRILMXOXWAIXMVPTTW5I7INN7AEPE and fund your account." ); await waitUntilAccountIsFunded(TEST_ACCOUNT.addr); } diff --git a/src/liquid-stake/tAlgoClient.ts b/src/liquid-stake/tAlgoClient.ts index f50af168..53260e6b 100644 --- a/src/liquid-stake/tAlgoClient.ts +++ b/src/liquid-stake/tAlgoClient.ts @@ -1,12 +1,12 @@ import algosdk, {bigIntToBytes, encodeAddress} from "algosdk"; import {TALGO_ASSET_ID} from "../util/asset/assetConstants"; -import TinymanBaseClient from "../util/client/base/baseClient"; import {SupportedNetwork} from "../util/commonTypes"; import {encodeString} from "../util/util"; import {STAKE_APP_ID, STAKE_RATIO_COEFFICIENT} from "./constants"; +import TinymanBaseClient from "../util/client/base/baseClient"; -class TinymanTAlgoClient extends TinymanBaseClient { +class TinymanTAlgoClient extends TinymanBaseClient { constructor(algod: algosdk.Algodv2, network: SupportedNetwork) { super(algod, STAKE_APP_ID[network], network); } diff --git a/src/order/constants.ts b/src/order/constants.ts new file mode 100644 index 00000000..983968e5 --- /dev/null +++ b/src/order/constants.ts @@ -0,0 +1,194 @@ +import {StructDefinition} from "../util/client/base/types"; +import {SupportedNetwork} from "../util/commonTypes"; +import {encodeString} from "../util/util"; +import {OrderStruct} from "./types"; + +const TOTAL_ORDER_COUNT_KEY = encodeString("order_count"); +const GOVERNOR_ORDER_FEE_RATE_KEY = encodeString("governor_order_fee_rate"); +const GOVERNOR_FEE_RATE_POWER_THRESHOLD_KEY = encodeString( + "governor_fee_rate_power_threshold" +); +const ORDER_FEE_RATE_KEY = encodeString("order_fee_rate"); +const APP_LATEST_VERSION_KEY = encodeString("latest_version"); +const APP_VERSION_KEY = encodeString("version"); + +const ORDER_STRUCTS: Record = { + TriggerOrder: { + size: 80, + fields: { + asset_id: { + type: "int", + size: 8, + offset: 0 + }, + amount: { + type: "int", + size: 8, + offset: 8 + }, + target_asset_id: { + type: "int", + size: 8, + offset: 16 + }, + target_amount: { + type: "int", + size: 8, + offset: 24 + }, + filled_amount: { + type: "int", + size: 8, + offset: 32 + }, + collected_target_amount: { + type: "int", + size: 8, + offset: 40 + }, + is_partial_allowed: { + type: "int", + size: 8, + offset: 48 + }, + fee_rate: { + type: "int", + size: 8, + offset: 56 + }, + creation_timestamp: { + type: "int", + size: 8, + offset: 64 + }, + expiration_timestamp: { + type: "int", + size: 8, + offset: 72 + } + } + }, + RecurringOrder: { + size: 88, + fields: { + asset_id: { + type: "int", + size: 8, + offset: 0 + }, + amount: { + type: "int", + size: 8, + offset: 8 + }, + target_asset_id: { + type: "int", + size: 8, + offset: 16 + }, + collected_target_amount: { + type: "int", + size: 8, + offset: 24 + }, + min_target_amount: { + type: "int", + size: 8, + offset: 32 + }, + max_target_amount: { + type: "int", + size: 8, + offset: 40 + }, + remaining_recurrences: { + type: "int", + size: 8, + offset: 48 + }, + interval: { + type: "int", + size: 8, + offset: 56 + }, + fee_rate: { + type: "int", + size: 8, + offset: 64 + }, + last_fill_timestamp: { + type: "int", + size: 8, + offset: 72 + }, + creation_timestamp: { + type: "int", + size: 8, + offset: 80 + } + } + }, + Entry: { + size: 8, + fields: { + app_id: { + type: "int", + size: 8, + offset: 0 + } + } + } +} as const; + +const ORDER_APP_GLOBAL_SCHEMA = { + numUint: 16, + numByteSlice: 16 +}; +const ORDER_APP_LOCAL_SCHEMA = { + numUint: 0, + numByteSlice: 0 +}; +const ORDER_APP_EXTRA_PAGES = 3; + +const REGISTRY_APP_ID: Record = { + mainnet: 3019195131, + testnet: 739800082 +}; + +const VAULT_APP_ID: Record = { + mainnet: 2200606875, + testnet: 480164661 +}; + +const ROUTER_APP_ID: Record = { + mainnet: 2614712672, + testnet: 730573191 +}; + +const MINIMUM_BALANCE_REQUIREMENT_PER_APP = 100_000; + +const MINIMUM_PUT_ORDER_TRANSACTION_COUNT = 5; + +const APPROVAL_PROGRAM = + "CoASY3JlYXRlX2FwcGxpY2F0aW9ugBJ1cGRhdGVfYXBwbGljYXRpb26AC3Bvc3RfdXBkYXRlgAxhc3NldF9vcHRfaW6AEXB1dF90cmlnZ2VyX29yZGVygBRjYW5jZWxfdHJpZ2dlcl9vcmRlcoAbc3RhcnRfZXhlY3V0ZV90cmlnZ2VyX29yZGVygBllbmRfZXhlY3V0ZV90cmlnZ2VyX29yZGVygBNwdXRfcmVjdXJyaW5nX29yZGVygBZjYW5jZWxfcmVjdXJyaW5nX29yZGVygBdleGVjdXRlX3JlY3VycmluZ19vcmRlcoAHY29sbGVjdDYaAI4MAAEAEQAhAC0AQgBmAHYAjgCmAM4A3gEFADEYgQASRDYaAReIARCBAUMxGYEEEkQ2GgEXiAG6gQFDMRmBABJEiAI5gQFDMRmBABJENhoBSRWBQBJEiALBgQFDMRmBABJENhoBFzYaAhc2GgMXNhoEFzYaBRc2GgYXiALbgQFDMRmBABJENhoBF4gEF4EBQzEZgQASRDYaARc2GgIXNhoDF4gE/IEBQzEZgQASRDYaARc2GgIXNhoDF4gFmoEBQzEZgQASRDYaARc2GgIXNhoDFzYaBBc2GgUXNhoGFzYaBxeIB+OBAUMxGYEAEkQ2GgEXiAk5gQFDMRmBABJENhoBFzYaAkkVgUASRDYaA0kVgYACEkQ2GgQXiAmwgQFDMRmBABJENhoBFzYaAkkVgQESRIgGtYEBQzUBgAx1c2VyX2FkZHJlc3MxAGeAD3JlZ2lzdHJ5X2FwcF9pZDQBZzQBcghINQKAHHJlZ2lzdHJ5X2FwcF9hY2NvdW50X2FkZHJlc3M0Amc0AYAMdmF1bHRfYXBwX2lkZUg1A4AMdmF1bHRfYXBwX2lkNANnNAGADXJvdXRlcl9hcHBfaWRlSDUEgA1yb3V0ZXJfYXBwX2lkNARngAd2ZXJzaW9ugQJngAQPPg00MQA0ARY0AxZQUFCwiTUFgAx1c2VyX2FkZHJlc3NkNQYxADQGEkQxFoEBCDgYgA9yZWdpc3RyeV9hcHBfaWRkEkQxFoEBCDkaAIANdmVyaWZ5X3VwZGF0ZRJEMRaBAQg5GgE0BRYSRDEWgQIIOBgyCBJEMRaBAgg5GgCAC3Bvc3RfdXBkYXRlEkSABEZ071kxADQFFlBQsImADHVzZXJfYWRkcmVzc2Q1BzEANAcSRIECgAd2ZXJzaW9uZA1EgA9yZWdpc3RyeV9hcHBfaWRkNQg0CIAMdmF1bHRfYXBwX2lkZUg1CYAMdmF1bHRfYXBwX2lkNAlnNAiADXJvdXRlcl9hcHBfaWRlSDUKgA1yb3V0ZXJfYXBwX2lkNApngAd2ZXJzaW9ugQJngAT8pjz+gQIWULCJNQuADHVzZXJfYWRkcmVzc2Q1DDEANAwSRIEANQ00DYEIEkAAGDQLgQg0DQuBCFgXiAsyNA2BAQg1DUL/4Ik1DjUPNRA1ETUSNROADHVzZXJfYWRkcmVzc2Q1FDEANBQSRIALb3JkZXJfY291bnRkNRWAAW80FRZQSYFQuUQ1FjQSgQANRDQQgQANRDQTNBETRDQOFEEAEIH///////////8BNRdCAAcyBzQOCDUXNBFBAAwyCjQRcAA1GEg0GEQxFoEBCTIKNBM0EogKvIgJmTUZNBMWNBaBAE8CuzQSFjQWgQhPArs0ERY0FoEQTwK7NBAWNBaBGE8Cu4EAFjQWgSBPAruBABY0FoEoTwK7NA8WNBaBME8CuzQZFjQWgThPArsyBxY0FoFATwK7NBcWNBaBSE8Cu4ALb3JkZXJfY291bnQ0FYEBCGc0Fr5INRqAEXB1dF90cmlnZ2VyX29yZGVyNBQ0FRY0GlCICwiABBN6A8M0FDQVFjQaUFBQsIAEoI8xYzQVFlCwiTUbgAx1c2VyX2FkZHJlc3NkNRwxADQcEkSAAW80GxZQSb1EgVASRDUdNB2BCIEIuhc1HjQdgTCBCLoXQQANNB40HYEggQi6Fwk1HjQdgSiBCLoXFEQ0HYEAgQi6FzQeMgo0HIgKOzQdvkg1H4AUY2FuY2VsX3RyaWdnZXJfb3JkZXI0HDQbFogKYYAEE3oDwzQcNBsWNB9QUFCwgATZpb9wNBsWULA0HbxIiTUgNSE1IjUjNSQ0JDgAMQASRDQkOBCBBhJENCQ4GYEAEkQ0JDgYMggSRDQkORoANCMSRDQkORoBNCIWEkQ0JDkaAjQhFhJENCQ5GgM0IBYSRIk1JTUmNSeAAW80JxZQSb1EgVASRDUoNCWBAg9ENCiBCIEIuhc1KTQogTCBCLoXQQAWNCk0KIEggQi6Fwk1KTQmNCkOREIABjQmNCkSRDIHNCiBSIEIuhcORDEWNCUINSo0KoAZZW5kX2V4ZWN1dGVfdHJpZ2dlcl9vcmRlcjQnNCY0JYj/KDQogQCBCLoXNCYyCjEAiAkNgARteEGbgAx1c2VyX2FkZHJlc3NkNCcWMQBQUFCwiTUrNSw1LYAMdXNlcl9hZGRyZXNzZDUugAFvNC0WUEm9RIFQEkQ1LzEWNCsJNTA0MIAbc3RhcnRfZXhlY3V0ZV90cmlnZ2VyX29yZGVyNC00LDQriP6iNC+BMIEIuhcUQQANNC+BGIEIuhc1MUIAFzQvgQiBCLoXNC+BGIEIuhc0LIgGYTUxMRaBAQkyCjQvgRCBCLoXNDGIB/w1MjQvgSCBCLoXNCwIFjQvgSBPArs0MjQvgTiBCLoXiAZeNTM0M0Q0L4EogQi6FzQyNDMJCBY0L4EoTwK7NC++SDU0gBR1cGRhdGVfdHJpZ2dlcl9vcmRlcjQuNC0WNDRQiAg6gAQTegPDNC40LRY0NFBQULCABK4KflKADHVzZXJfYWRkcmVzc2Q0LRYxADQsFjQyFlBQUFBQsDQvgRCBCLoXNDMyCoAccmVnaXN0cnlfYXBwX2FjY291bnRfYWRkcmVzc2SIB4s0L4EIgQi6FzQvgSCBCLoXEkEAGzQvgRCBCLoXNC+BKIEIuhcyCjQuiAdgNC+8SIk1NTU2gAx1c2VyX2FkZHJlc3NkNTcxADQ3EkQ0NYABbxJBAEiAAW80NhZQSb1EgVASRDU6NDqBEIEIuhc1ODQ6gSiBCLoXNTmBABY0OoEoTwK7NDq+SDU7gAQTegPDNDc0NhY0O1BQULBCAFQ0NYABchJBAEiAAXI0NhZQSb1EgVgSRDU8NDyBEIEIuhc1ODQ8gRiBCLoXNTmBABY0PIEYTwK7NDy+SDU9gARvi/yfNDc0NhY0PVBQULBCAAOBAUM0OUQ0ODQ5Mgo0N4gGjYAEKgYeKzQ2FjQ5FlBQsIk1PjU/NUA1QTVCNUM1RIAMdXNlcl9hZGRyZXNzZDVFMQA0RRJEgAtvcmRlcl9jb3VudGQ1RoABcjRGFlBJgVi5RDVHNEOBAA1ENEQ0QhNEND+BAA1END6BPA9END6BPBgURDRAFEEADYH///////////8BNUA0QTRADkQ0QkEADDIKNEJwADVISDRIRDEWgQEJMgo0RDRDND8LiAU+iAQbNUk0RBY0R4EATwK7NEMWNEeBCE8CuzRCFjRHgRBPAruBABY0R4EYTwK7NEEWNEeBIE8CuzRAFjRHgShPArs0PxY0R4EwTwK7ND4WNEeBOE8CuzRJFjRHgUBPAruBABY0R4FITwK7MgcWNEeBUE8Cu4ALb3JkZXJfY291bnQ0RoEBCGc0R75INUqAE3B1dF9yZWN1cnJpbmdfb3JkZXI0RTRGFjRKUIgFfoAEb4v8nzRFNEYWNEpQUFCwgASH6GpLNEYWULCJNUuADHVzZXJfYWRkcmVzc2Q1TDEANEwSRIABcjRLFlBJvUSBWBJENU00TYEYgQi6FxRENE2BCIEIuhc0TYEwgQi6Fws1TjRNgQCBCLoXNE4yCjRMiATANE2+SDVPgBZjYW5jZWxfcmVjdXJyaW5nX29yZGVyNEw0SxaIBOSABG+L/J80TDRLFjRPUFBQsIAEPnsMZjRLFlCwNE28SIk1UDVRNVI1U4ABcjRTFlBJvUSBWBJENVSADHVzZXJfYWRkcmVzc2Q1VTEWgQASRDINgQASRDEAiAIDMgc0VIFIgQi6FzRUgTiBCLoXCA9ENFKBCIEAC4EIWBc0VIEAgQi6FxJENFKBCDRQC4EIWBc0VIEQgQi6FxJENFSBCIEIuhc0VIEggQi6FzRSNFE0UIgBDjVWNFY0VIEggQi6Fw80VjRUgSiBCLoXDhBENFY0VIFAgQi6F4gB7DVXNFdENFSBMIEIuheBAQkWNFSBME8CuzIHFjRUgUhPArs0VIEYgQi6FzRWNFcJCBY0VIEYTwK7NFS+SDVYgBZ1cGRhdGVfcmVjdXJyaW5nX29yZGVyNFU0UxY0WFCIA6mABG+L/J80VTRTFjRYUFBQsIAEoPcklTRVNFMWMQA0VIEIgQi6FxY0VhZQUFBQULA0VIEQgQi6FzRXMgqAHHJlZ2lzdHJ5X2FwcF9hY2NvdW50X2FkZHJlc3NkiAMBNFSBMIEIuhcUQQAbNFSBEIEIuhc0VIEYgQi6FzIKNFWIAt40VLxIiTVZNVo1WzVcNV2ADXJvdXRlcl9hcHBfaWRkcghINV40W4EINFkLgQhYFzVfMgo0X4gDMzVgiANUNFuBCIEAC4EIWBc0XTIKNF6IAo2IA0aBBrIQgQCyAYANcm91dGVyX2FwcF9pZGSyGIAEc3dhcLIaNF0Wsho0XBayGjRbsho0WrIaNFkWshqIAx+IAyQyCjRfiALRNGAJNWE0YYk1YjRigA9yZWdpc3RyeV9hcHBfaWRkgAtpc19lbmRvcnNlZGM1YzVkNGNENGQ1ZTRlRIk1ZjVnNWg0ZxaB////////////ARajNGgWojVpNGYWNGmjgf///////////wEWohc1ajRqiTVrNWw0bDRrC4GQTgo1bTRtiYAMdXNlcl9hZGRyZXNzZIgApjVxgA9yZWdpc3RyeV9hcHBfaWRkgCFnb3Zlcm5vcl9mZWVfcmF0ZV9wb3dlcl90aHJlc2hvbGRlSDVuNG41cjRxNHINQQAygA9yZWdpc3RyeV9hcHBfaWRkgBdnb3Zlcm5vcl9vcmRlcl9mZWVfcmF0ZWVINW9CACaAD3JlZ2lzdHJ5X2FwcF9pZGSADm9yZGVyX2ZlZV9yYXRlZUg1bzRvNXA0cIk1c4gBwYEGshCADHZhdWx0X2FwcF9pZGSyGIARZ2V0X3RpbnlfcG93ZXJfb2ayGjRzshqBALIBiAGhtD6BBFs1dDR0iTV1NHVBABwyCjR1cAA1dkg0doEAEkEACzR1gQAyCjIKiACjiTV3NXg1eTV6NHgUQQAbNHo4EIEBEkQ0ejgHNHkSRDR6OAg0dxJEQgAgNHo4EIEEEkQ0ejgUNHkSRDR6OBE0eBJENHo4EjR3EkSJNXs1fDV9NX40fBRBACE0fjgQgQESRDR+OAc0fRJENH44CDR7D0Q0fjgINX9CACY0fjgQgQQSRDR+OBQ0fRJENH44ETR8EkQ0fjgSNHsPRDR+OBI1fzR/iTWANYE1gjWDNIMUQQAdiACrgQGyEDSBsgA0gLIHNIKyCIEAsgGIAKlCAB6IAI6BBLIQNIGyADSAshQ0grISNIOyEYEAsgGIAIiJNYQ1hTWGiABpgQayEIEAsgGAD3JlZ2lzdHJ5X2FwcF9pZGSyGIAKZW1pdF9ldmVudLIaNIayGjSFsho0hLIaiABFiTWHNYiBADWJNIcUQQAMNIhgNIh4CTWJQgAJNIg0h3AASDWJNImJNIoURIEBNYqJNIqNAwABAAMACQCxibGBAjWKibaJNIpBAAGJs4mzgQA1iok="; +const CLEAR_PROGRAM = "CoEBQw=="; + +export { + ORDER_APP_EXTRA_PAGES, + ORDER_APP_GLOBAL_SCHEMA, + ORDER_APP_LOCAL_SCHEMA, + REGISTRY_APP_ID, + ORDER_STRUCTS, + TOTAL_ORDER_COUNT_KEY, + VAULT_APP_ID, + MINIMUM_BALANCE_REQUIREMENT_PER_APP, + GOVERNOR_ORDER_FEE_RATE_KEY, + GOVERNOR_FEE_RATE_POWER_THRESHOLD_KEY, + ORDER_FEE_RATE_KEY, + MINIMUM_PUT_ORDER_TRANSACTION_COUNT, + APPROVAL_PROGRAM, + CLEAR_PROGRAM, + ROUTER_APP_ID, + APP_LATEST_VERSION_KEY, + APP_VERSION_KEY +}; diff --git a/src/order/index.ts b/src/order/index.ts new file mode 100644 index 00000000..01073acb --- /dev/null +++ b/src/order/index.ts @@ -0,0 +1,780 @@ +import algosdk, { + Algodv2, + base64ToBytes, + bigIntToBytes, + bytesToBase64, + decodeAddress, + getApplicationAddress, + Transaction +} from "algosdk"; + +import { + APP_VERSION_KEY, + APPROVAL_PROGRAM, + CLEAR_PROGRAM, + GOVERNOR_ORDER_FEE_RATE_KEY, + MINIMUM_PUT_ORDER_TRANSACTION_COUNT, + ORDER_APP_EXTRA_PAGES, + ORDER_APP_GLOBAL_SCHEMA, + ORDER_APP_LOCAL_SCHEMA, + ORDER_FEE_RATE_KEY, + REGISTRY_APP_ID, + ROUTER_APP_ID, + ORDER_STRUCTS, + TOTAL_ORDER_COUNT_KEY, + VAULT_APP_ID, + APP_LATEST_VERSION_KEY +} from "./constants"; +import { + OrderType, + PutTriggerOrderParams, + PutRecurringOrderParams, + OrderStruct +} from "./types"; +import {createPaddedByteArray, joinByteArrays} from "./utils"; +import {SupportedNetwork} from "../util/commonTypes"; +import {encodeString, intToBytes} from "../util/util"; +import { + MINIMUM_BALANCE_REQUIRED_PER_APP, + MINIMUM_BALANCE_REQUIRED_PER_BYTE_SCHEMA, + MINIMUM_BALANCE_REQUIRED_PER_INT_SCHEMA_VALUE +} from "../util/constant"; +import {Struct} from "../util/client/base/utils"; +import {ALGO_ASSET_ID} from "../util/asset/assetConstants"; +import TinymanBaseClient from "../util/client/base/baseClient"; +import {isAlgo} from "../util/asset/assetUtils"; + +const ENTRY_STRUCT = new Struct(OrderStruct.Entry, ORDER_STRUCTS); +const TRIGGER_STRUCT = new Struct(OrderStruct.Trigger, ORDER_STRUCTS); +const RECURRING_STRUCT = new Struct(OrderStruct.Recurring, ORDER_STRUCTS); + +class OrderingClient extends TinymanBaseClient { + registryAppId: number; + registryApplicationAddress: string; + vaultAppId: number; + vaultApplicationAddress: string; + routerAppId: number; + routerApplicationAddress: string; + userAddress: string; + + private constructor( + algod: Algodv2, + orderAppId: number | null, + network: SupportedNetwork, + userAddress: string + ) { + super(algod, orderAppId, network, ORDER_STRUCTS); + + this.algod = algod; + this.registryAppId = REGISTRY_APP_ID[network]; + this.registryApplicationAddress = getApplicationAddress( + this.registryAppId + ).toString(); + this.routerAppId = ROUTER_APP_ID[network]; + this.routerApplicationAddress = getApplicationAddress(this.routerAppId).toString(); + this.vaultAppId = VAULT_APP_ID[network]; + this.vaultApplicationAddress = getApplicationAddress(this.vaultAppId).toString(); + this.userAddress = userAddress; + } + + private static getRegistryEntryBoxName(userAddress: string): Uint8Array { + const decodedAddress = decodeAddress(userAddress).publicKey; + + return new Uint8Array([...encodeString("e"), ...decodedAddress]); + } + + private static async getOrderApplicationId( + algod: Algodv2, + network: SupportedNetwork, + userAddress: string + ) { + const boxName = OrderingClient.getRegistryEntryBoxName(userAddress); + + const registryAppId = REGISTRY_APP_ID[network]; + + let boxValue: Buffer | null = null; + + try { + const appBox = await algod.getApplicationBoxByName(registryAppId, boxName).do(); + + boxValue = Buffer.from(appBox.value); + } catch (error: any) { + // Ignore the error if the box is not found + } + + return boxValue ? (ENTRY_STRUCT.apply(boxValue).getField("app_id") as bigint) : null; + } + + /** + * Initializes the OrderingClient by fetching the personal app id from global state. + * Until the user creates an application, the app id will be set as null + */ + static async initializeOrderingClient( + algod: Algodv2, + network: SupportedNetwork, + userAddress: string + ) { + const orderApplicationId = await OrderingClient.getOrderApplicationId( + algod, + network, + userAddress + ); + + const client = new OrderingClient( + algod, + orderApplicationId ? Number(orderApplicationId.toString()) : null, + network, + userAddress + ); + + return client; + } + + /** + * Compares the contracts between the user's order app and the latest available contract. + * + * @returns A boolean indicating if the order app needs to be updated. + */ + async shouldUpdateOrderingApp(): Promise { + if (!this.appId) { + return Promise.resolve(false); + } + + const latestVersion = await this.getLatestOrderAppVersion(); + + if (!latestVersion) { + throw new Error("Registry app has no approved version. Unable to compare."); + } + + const currentVersion = (await this.getGlobal( + APP_VERSION_KEY, + undefined, + this.appId + )) as bigint | undefined; + + return latestVersion !== currentVersion; + } + + /** + * Prepares transactions to update the ordering app using the latest contracts. + * @returns A promise that resolves the transaction array. + */ + // TODO: Once the contracts are public, use getCompiledPrograms for approval and clear programs + async prepareUpdateOrderingAppTransactions(): Promise { + if (!this.appId) { + throw new Error("Application ID not provided"); + } + + const version = await this.getLatestOrderAppVersion(); + + if (!version) { + throw new Error( + "Registry app has no approved version. Unable to update order app." + ); + } + + const suggestedParams = await this.getSuggestedParams(); + + const transactions = [ + algosdk.makeApplicationUpdateTxnFromObject({ + sender: this.userAddress, + suggestedParams, + appIndex: this.appId, + appArgs: [encodeString("update_application"), bigIntToBytes(version, 8)], + approvalProgram: base64ToBytes(APPROVAL_PROGRAM), + clearProgram: base64ToBytes(CLEAR_PROGRAM) + }), + algosdk.makeApplicationNoOpTxnFromObject({ + sender: this.userAddress, + suggestedParams, + appIndex: this.registryAppId, + appArgs: [encodeString("verify_update"), bigIntToBytes(version, 8)], + boxes: [{appIndex: this.registryAppId, name: this.getAppVersionBoxName(version)}] + }), + algosdk.makeApplicationNoOpTxnFromObject({ + sender: this.userAddress, + suggestedParams, + appIndex: this.appId, + appArgs: [encodeString("post_update")] + }) + ]; + + return this.setupTxnFeeAndAssignGroupId({txns: transactions}); + } + + calculateCreateOrderAppMinBalanceIncreaseAmount() { + return ( + MINIMUM_BALANCE_REQUIRED_PER_APP * BigInt(1 + ORDER_APP_EXTRA_PAGES) + + BigInt(ORDER_APP_GLOBAL_SCHEMA.numByteSlice) * + MINIMUM_BALANCE_REQUIRED_PER_BYTE_SCHEMA + + BigInt(ORDER_APP_GLOBAL_SCHEMA.numUint) * + MINIMUM_BALANCE_REQUIRED_PER_INT_SCHEMA_VALUE + ); + } + + /** + * Prepares transactions to create the order app for a user. + * @param userAddress - The address of the user. + * @returns A promise that resolves the transaction array. + */ + async prepareCreateOrderAppTransactions(userAddress: string) { + const version = await this.getLatestOrderAppVersion(); + + if (!version) { + throw new Error( + "Registry app has no approved version. Unable to create order app." + ); + } + + const sp = await this.getSuggestedParams(); + + const entryBoxName = OrderingClient.getRegistryEntryBoxName(userAddress); + + let newBoxes: Record = {}; + + const transactions: Transaction[] = []; + + if (!(await this.boxExists(entryBoxName, this.registryAppId))) { + newBoxes = {[bytesToBase64(entryBoxName)]: ENTRY_STRUCT}; + + transactions.push( + algosdk.makePaymentTxnWithSuggestedParamsFromObject({ + sender: userAddress, + receiver: this.registryApplicationAddress, + amount: this.calculateMinBalance({accounts: 1, assets: 1, boxes: newBoxes}), + suggestedParams: sp + }) + ); + } + + transactions.push( + algosdk.makeApplicationCreateTxnFromObject({ + sender: userAddress, + suggestedParams: sp, + onComplete: algosdk.OnApplicationComplete.NoOpOC, + appArgs: [encodeString("create_application"), intToBytes(this.registryAppId)], + approvalProgram: base64ToBytes(APPROVAL_PROGRAM), + clearProgram: base64ToBytes(CLEAR_PROGRAM), + numGlobalByteSlices: ORDER_APP_GLOBAL_SCHEMA.numByteSlice, + numGlobalInts: ORDER_APP_GLOBAL_SCHEMA.numUint, + numLocalByteSlices: ORDER_APP_LOCAL_SCHEMA.numByteSlice, + numLocalInts: ORDER_APP_LOCAL_SCHEMA.numUint, + extraPages: ORDER_APP_EXTRA_PAGES + }), + algosdk.makeApplicationNoOpTxnFromObject({ + sender: userAddress, + suggestedParams: sp, + appIndex: this.registryAppId, + appArgs: [encodeString("create_entry")], + boxes: [ + {appIndex: 0, name: entryBoxName}, + { + appIndex: this.registryAppId, + name: this.getAppVersionBoxName(version) + } + ] + }) + ); + + return this.setupTxnFeeAndAssignGroupId({txns: transactions}); + } + + async checkOrderAppAvailability(orderAppId?: number) { + if (!this.appId && !this.applicationAddress) { + if (orderAppId) { + this.appId = orderAppId; + this.applicationAddress = getApplicationAddress(orderAppId); + } else { + const applicationId = await OrderingClient.getOrderApplicationId( + this.algod, + this.network, + this.userAddress + ); + + if (applicationId) { + this.appId = Number(applicationId); + this.applicationAddress = getApplicationAddress(this.appId); + } else { + throw new Error( + "Ordering client is not found for this account address. Please create an order app first." + ); + } + } + } + } + + async getPutTriggerOrderTransactionFee({ + assetInId, + assetOutId, + type + }: { + assetInId: number; + assetOutId: number; + type: OrderType; + }) { + let totalFee = 0n; + + // If the application ID is not set yet, ignore the fee calculation + if (!this.applicationAddress) { + return totalFee; + } + + try { + const suggestedMinFee = (await this.getSuggestedParams()).minFee; + const assetsToOptin = await this.getAssetsToOptInToOrderingClient( + this.applicationAddress, + [assetInId, assetOutId] + ); + + const newOrderId = await this.getOrderCount(); + const orderBoxName = this.getOrderBoxName(newOrderId, type); + + // We can assume that the order box is not created with a new order id yet. + const newBoxes: Record = { + [bytesToBase64(orderBoxName)]: TRIGGER_STRUCT + }; + + totalFee += + BigInt( + MINIMUM_PUT_ORDER_TRANSACTION_COUNT + + assetsToOptin.length + + Number(Boolean(assetsToOptin.length)) + ) * + suggestedMinFee + + BigInt( + this.calculateMinBalance({ + boxes: newBoxes, + assets: assetsToOptin.length + }) + ); + } catch (error: any) { + // Ignore errors + } + + return totalFee; + } + + /** + * Prepares an array of transactions to place a limit order. + * + * @param {PutTriggerOrderParams} params - The parameters for the put order operation. + * @param params.assetInId - The ID of the input asset. + * @param params.assetOutId - The ID of the output asset. + * @param params.assetInAmount - The amount of the input asset in base units. + * @param params.assetOutAmount - The amount of the output asset in base units. + * @param params.isPartialAllowed - Whether partial fills are allowed. + * @param params.duration - The duration of the order in seconds. + * @param [params.orderAppId] - (Optional) The application ID for the order. + * @returns A promise that resolves the transaction array. + */ + async preparePutTriggerOrderTransactions({ + assetInId, + assetOutId, + assetInAmount, + assetOutAmount, + isPartialAllowed, + duration + }: PutTriggerOrderParams) { + await this.checkOrderAppAvailability(); + + const sp = await this.getSuggestedParams(); + const newOrderId = await this.getOrderCount(); + + const orderBoxName = this.getOrderBoxName(newOrderId, OrderType.Trigger); + let newBoxes: Record = {}; + const transactions: Transaction[] = []; + + const assetsToOptin = await this.getAssetsToOptInToOrderingClient( + this.applicationAddress!, + [assetInId, assetOutId] + ); + + if (!(await this.boxExists(orderBoxName))) { + newBoxes = { + ...newBoxes, + [bytesToBase64(orderBoxName)]: TRIGGER_STRUCT + }; + + const accountInfo = await this.algod + .accountInformation(this.applicationAddress!) + .do(); + + const requiredAmountToCoverMinBalance = Math.max( + 0, + Number(accountInfo.minBalance - accountInfo.amount) + ); + + transactions.push( + algosdk.makePaymentTxnWithSuggestedParamsFromObject({ + sender: this.userAddress, + receiver: this.applicationAddress!, + amount: + requiredAmountToCoverMinBalance + + this.calculateMinBalance({ + boxes: newBoxes, + assets: assetsToOptin.length + }), + suggestedParams: sp + }) + ); + } + + transactions.push( + ...this.prepareOrderAppAssetOptinTransactionsIfNeeded(assetsToOptin, sp), + assetInId === ALGO_ASSET_ID + ? algosdk.makePaymentTxnWithSuggestedParamsFromObject({ + sender: this.userAddress, + receiver: this.applicationAddress!, + amount: assetInAmount, + suggestedParams: sp + }) + : algosdk.makeAssetTransferTxnWithSuggestedParamsFromObject({ + sender: this.userAddress, + receiver: this.applicationAddress!, + assetIndex: assetInId, + amount: assetInAmount, + suggestedParams: sp + }), + algosdk.makeApplicationNoOpTxnFromObject({ + sender: this.userAddress, + suggestedParams: sp, + appIndex: this.appId!, + appArgs: [ + encodeString("put_trigger_order"), + intToBytes(assetInId), + bigIntToBytes(assetInAmount, 8), + intToBytes(assetOutId), + bigIntToBytes(assetOutAmount, 8), + intToBytes(Number(isPartialAllowed)), + intToBytes(duration) + ], + foreignAssets: [assetOutId], + foreignApps: [this.registryAppId, this.vaultAppId], + boxes: [ + {appIndex: 0, name: orderBoxName}, + {appIndex: this.vaultAppId, name: decodeAddress(this.userAddress).publicKey}, + { + appIndex: this.registryAppId, + name: this.getRegistryEntryBoxName(this.userAddress) + } + ] + }) + ); + + return this.setupTxnFeeAndAssignGroupId({ + txns: transactions, + additionalFeeCount: 2 + assetsToOptin.length + }); + } + + /** + * Prepares an array of transactions to place a recurring order. + * + * @param {PutRecurringOrderParams} params - The parameters for the recurring order. + * @param params.amount - The amount per order to be used for the recurring order. + * @param params.assetId - The ID of the asset being used for the order. + * @param params.targetAssetId - The ID of the target asset for the order. + * @param params.targetRecurrence - The number of times the order should recur. + * @param params.interval - The interval between each recurrence in seconds. + * @param params.maxTargetPrice - (Optional) The maximum price per unit of the target asset to be accepted. + * @param params.minTargetPrice - (Optional) The minimum price per unit of the target asset to be accepted. + * @returns A promise that resolves the transaction array. + */ + async preparePutRecurringOrderTransactions({ + amount, + assetId, + targetAssetId, + targetRecurrence, + interval, + maxTargetPrice, + minTargetPrice + }: PutRecurringOrderParams) { + await this.checkOrderAppAvailability(); + + const orderId = await this.getOrderCount(); + const orderBoxName = this.getOrderBoxName(orderId, OrderType.Recurring); + const transactions: Transaction[] = []; + let newBoxes: Record = {}; + const suggestedParams = await this.getSuggestedParams(); + const assetsToOptin = await this.getAssetsToOptInToOrderingClient( + this.applicationAddress!, + [assetId, targetAssetId] + ); + const totalAmount = amount * BigInt(targetRecurrence); + + if (!(await this.boxExists(orderBoxName))) { + newBoxes = { + ...newBoxes, + [bytesToBase64(orderBoxName)]: RECURRING_STRUCT + }; + + const accountInfo = await this.algod + .accountInformation(this.applicationAddress!) + .do(); + + const requiredAmountToCoverMinBalance = Math.max( + 0, + Number(accountInfo.minBalance - BigInt(accountInfo.amount)) + ); + + transactions.push( + algosdk.makePaymentTxnWithSuggestedParamsFromObject({ + sender: this.userAddress, + receiver: this.applicationAddress!, + amount: + requiredAmountToCoverMinBalance + + this.calculateMinBalance({ + boxes: newBoxes, + assets: assetsToOptin.length + }), + suggestedParams + }) + ); + } + + transactions.push( + ...this.prepareOrderAppAssetOptinTransactionsIfNeeded( + assetsToOptin, + suggestedParams + ), + assetId === ALGO_ASSET_ID + ? algosdk.makePaymentTxnWithSuggestedParamsFromObject({ + sender: this.userAddress, + receiver: this.applicationAddress!, + amount: totalAmount, + suggestedParams + }) + : algosdk.makeAssetTransferTxnWithSuggestedParamsFromObject({ + sender: this.userAddress, + receiver: this.applicationAddress!, + assetIndex: assetId, + amount: totalAmount, + suggestedParams + }), + algosdk.makeApplicationNoOpTxnFromObject({ + sender: this.userAddress, + suggestedParams, + appIndex: this.appId!, + foreignApps: [this.registryAppId, this.vaultAppId], + foreignAssets: [targetAssetId], + boxes: [ + {appIndex: 0, name: orderBoxName}, + {appIndex: this.vaultAppId, name: decodeAddress(this.userAddress).publicKey}, + { + appIndex: this.registryAppId, + name: this.getRegistryEntryBoxName(this.userAddress) + } + ], + appArgs: [ + encodeString("put_recurring_order"), + intToBytes(assetId), + bigIntToBytes(amount, 8), + intToBytes(targetAssetId), + // Min received target amount per order + intToBytes(maxTargetPrice ? Math.floor(Number(amount) / maxTargetPrice) : 0), + // Max received target amount per order + intToBytes(minTargetPrice ? Math.floor(Number(amount) / minTargetPrice) : 0), + intToBytes(targetRecurrence), + intToBytes(interval) + ] + }) + ); + + return this.setupTxnFeeAndAssignGroupId({ + txns: transactions, + additionalFeeCount: 2 + assetsToOptin.length + }); + } + + /** + * Prepares an array of transactions to cancel an order. + * + * @param orderId - The ID of the order to cancel. + * @param type - The type of the order to cancel. + * @returns A promise that resolves the transaction array. + */ + async prepareCancelOrderTransactions(orderId: number, type: OrderType) { + if (!this.appId) { + throw new Error("Application ID not provided"); + } + + const orderBoxName = this.getOrderBoxName(orderId, type); + + const order = await this.getBox( + orderBoxName, + type === OrderType.Trigger ? OrderStruct.Trigger : OrderStruct.Recurring + ); + + if (!order) { + throw new Error("Order not found"); + } + + const sp = await this.getSuggestedParams(); + const transactions = [ + algosdk.makeApplicationNoOpTxnFromObject({ + sender: this.userAddress, + suggestedParams: sp, + appIndex: this.appId, + appArgs: [ + encodeString( + type === OrderType.Trigger ? "cancel_trigger_order" : "cancel_recurring_order" + ), + intToBytes(orderId) + ], + boxes: [ + {appIndex: 0, name: orderBoxName}, + { + appIndex: this.registryAppId, + name: this.getRegistryEntryBoxName(this.userAddress) + } + ], + foreignAssets: [Number(order.getField("asset_id"))], + foreignApps: [this.registryAppId] + }) + ]; + + return this.setupTxnFeeAndAssignGroupId({txns: transactions, additionalFeeCount: 2}); + } + + /** + * Prepares an array of transactions to claim the collected target amount for an order. + * @param orderId - The ID of the order for which to claim the collected target amount. + * @param type - The type of the order (OrderType.Trigger or OrderType.Recurring). + * @returns A promise that resolves the transaction array. + */ + async prepareClaimCollectedTargetAmount(orderId: number, type: OrderType) { + if (!this.appId) { + throw new Error("Application ID not provided"); + } + + const sp = await this.getSuggestedParams(); + + const orderBoxName = this.getOrderBoxName(orderId, type); + const order = await this.getBox( + orderBoxName, + type === OrderType.Trigger ? OrderStruct.Trigger : OrderStruct.Recurring + ); + + if (!order) { + throw new Error("Order not found"); + } + + const txns = [ + algosdk.makeApplicationNoOpTxnFromObject({ + sender: this.userAddress, + suggestedParams: sp, + appIndex: this.appId, + appArgs: [ + encodeString("collect"), + intToBytes(orderId), + encodeString(type === OrderType.Trigger ? "o" : "r") + ], + boxes: [{appIndex: 0, name: orderBoxName}], + foreignAssets: [Number(order.getField("target_asset_id") as bigint)], + foreignApps: [this.registryAppId] + }) + ]; + + return this.setupTxnFeeAndAssignGroupId({txns, additionalFeeCount: 2}); + } + + /** + * Gets the platform fee rate based on the provided tiny power from the global state. + * + * @param tinyPower - The tiny power to check against the threshold. + * @returns The platform fee rate. + */ + async getPlatformFeeRate(tinyPower: number | null): Promise { + const thresholdTinyPower = await this.getGlobal( + TOTAL_ORDER_COUNT_KEY, + 0, + this.registryAppId + ); + + if (tinyPower && tinyPower >= thresholdTinyPower) { + return this.getGlobal(GOVERNOR_ORDER_FEE_RATE_KEY, 0, this.registryAppId); + } + + return this.getGlobal(ORDER_FEE_RATE_KEY, 0, this.registryAppId); + } + + private getOrderCount(): Promise { + return this.appId + ? this.getGlobal(TOTAL_ORDER_COUNT_KEY, 0, this.appId) + : Promise.resolve(0); + } + + private getOrderBoxName(id: number, type: OrderType) { + const orderPrefix = encodeString(type === OrderType.Trigger ? "o" : "r"); + const orderIdBytes = intToBytes(id); + + return joinByteArrays(orderPrefix, orderIdBytes); + } + + private getRegistryEntryBoxName(userAddress: string) { + return joinByteArrays(encodeString("e"), decodeAddress(userAddress).publicKey); + } + + private prepareOrderAppAssetOptInTransaction( + userAddress: string, + appId: number, + assetIds: number[], + suggestedParams: algosdk.SuggestedParams + ) { + return algosdk.makeApplicationNoOpTxnFromObject({ + sender: userAddress, + appIndex: appId, + appArgs: [encodeString("asset_opt_in"), createPaddedByteArray(assetIds)], + suggestedParams + }); + } + + private prepareOrderAppAssetOptinTransactionsIfNeeded( + assetIds: number[], + suggestedParams: algosdk.SuggestedParams + ) { + if (!this.appId || !this.applicationAddress) { + throw new Error("Application ID not provided"); + } + + if (!assetIds.length) { + return []; + } + + return [ + this.prepareOrderAppAssetOptInTransaction( + this.userAddress, + this.appId, + assetIds, + suggestedParams + ) + ]; + } + + private async getAssetsToOptInToOrderingClient( + appId: string | algosdk.Address, + assetIds: number[] + ) { + const assetsToOptin: number[] = []; + + for (const asset of assetIds) { + const shouldOptIn = isAlgo(asset) ? false : !(await this.isOptedIn(appId, asset)); + + if (shouldOptIn) { + assetsToOptin.push(asset); + } + } + + return assetsToOptin; + } + + private getLatestOrderAppVersion(): Promise { + return this.getGlobal(APP_LATEST_VERSION_KEY, undefined, this.registryAppId); + } + + private getAppVersionBoxName(version: bigint) { + return joinByteArrays(encodeString("v"), bigIntToBytes(version, 8)); + } +} + +export {OrderingClient}; diff --git a/src/order/types.ts b/src/order/types.ts new file mode 100644 index 00000000..a2d307de --- /dev/null +++ b/src/order/types.ts @@ -0,0 +1,31 @@ +export interface PutTriggerOrderParams { + assetInId: number; + assetOutId: number; + assetInAmount: bigint; + assetOutAmount: bigint; + isPartialAllowed: boolean; + duration: number; + // This field is needed the first time the order app is created by the user + orderAppId?: number; +} + +export interface PutRecurringOrderParams { + assetId: number; + amount: bigint; + targetAssetId: number; + targetRecurrence: number; + interval: number; + minTargetPrice: number; + maxTargetPrice: number; +} + +export enum OrderType { + Trigger = "trigger_order", + Recurring = "recurring_order" +} + +export enum OrderStruct { + Trigger = "TriggerOrder", + Recurring = "RecurringOrder", + Entry = "Entry" +} diff --git a/src/order/utils.ts b/src/order/utils.ts new file mode 100644 index 00000000..be9a46d6 --- /dev/null +++ b/src/order/utils.ts @@ -0,0 +1,31 @@ +import {intToBytes, joinByteArrays} from "../util/util"; + +function createPaddedByteArray( + elements: number[], + length = 8, + paddingValue = 0, + byteSize = 8 +) { + const array = new Array(length).fill(paddingValue); + + array.splice(0, elements.length, ...elements); + + return joinByteArrays(...array.map((num) => intToBytes(num, byteSize))); +} + +async function computeSHA512(fileArrayBuffer: Uint8Array) { + const hashBuffer = await crypto.subtle.digest("SHA-512", fileArrayBuffer); + const hashArray = Array.from(new Uint8Array(hashBuffer)); + + // Extract the first 32 bytes (256 bits) + const sha512_256HashArray = hashArray.slice(0, 32); + + // Convert the byte array to a hexadecimal string + const hashHex = Array.from(sha512_256HashArray) + .map((byte) => byte.toString(16).padStart(2, "0")) + .join(""); + + return hashHex; +} + +export {computeSHA512, createPaddedByteArray, joinByteArrays}; diff --git a/src/util/client/base/baseClient.ts b/src/util/client/base/baseClient.ts index d7e09184..70ab4349 100644 --- a/src/util/client/base/baseClient.ts +++ b/src/util/client/base/baseClient.ts @@ -1,30 +1,35 @@ import algosdk, {Algodv2, getApplicationAddress, Transaction} from "algosdk"; -import {SupportedNetwork} from "../../commonTypes"; +import {SignerTransaction, SupportedNetwork} from "../../commonTypes"; import { MINIMUM_BALANCE_REQUIREMENT_PER_ACCOUNT, MINIMUM_BALANCE_REQUIREMENT_PER_ASSET } from "./constants"; import {StructDefinition} from "./types"; -import {getBoxCosts, getStruct, Struct} from "./utils"; +import {getBoxCosts, Struct} from "./utils"; import {areBuffersEqual} from "../../../governance/util/utils"; -abstract class TinymanBaseClient { - algod: Algodv2; - appId: number; - applicationAddress: algosdk.Address; - network: SupportedNetwork; +abstract class TinymanBaseClient< + AppId extends number | null, + AppAddress extends algosdk.Address | null +> { + protected algod: Algodv2; + protected applicationAddress: AppAddress; + protected network: SupportedNetwork; + public appId: AppId; readonly structs: Record | undefined; constructor( algod: Algodv2, - appId: number, + appId: AppId, network: SupportedNetwork, structs?: Record ) { this.algod = algod; this.appId = appId; - this.applicationAddress = getApplicationAddress(this.appId); + this.applicationAddress = ( + this.appId ? getApplicationAddress(this.appId) : null + ) as AppAddress; this.network = network; this.structs = structs; } @@ -52,6 +57,10 @@ abstract class TinymanBaseClient { protected async getGlobal(key: Uint8Array, defaultValue?: any, appId?: number) { const applicationId = appId || this.appId; + if (!applicationId) { + throw new Error("Application ID not provided"); + } + const applicationInfo = await this.algod.getApplicationByID(applicationId).do(); const globalState = applicationInfo.params.globalState ?? []; @@ -91,6 +100,10 @@ abstract class TinymanBaseClient { protected async boxExists(boxName: Uint8Array, appId?: number) { const applicationId = appId || this.appId; + if (!applicationId) { + throw new Error("Application ID not provided"); + } + try { const box = await this.algod.getApplicationBoxByName(applicationId, boxName).do(); @@ -100,18 +113,29 @@ abstract class TinymanBaseClient { } } - protected async getBox(boxName: Uint8Array, structName: string, appId?: number) { + protected async getBox( + boxName: Uint8Array, + structName: string, + appId?: number, + structs?: Record + ) { try { const applicationId = appId || this.appId; + const structure = structs ?? this.structs; + + if (!applicationId) { + throw new Error("Application ID not provided"); + } + const boxValue = ( await this.algod.getApplicationBoxByName(applicationId, boxName).do() ).value; - if (!this.structs) { + if (!structure) { throw new Error("structs not defined"); } - const structClass = getStruct(structName, this.structs); + const structClass = new Struct(structName, structure); return structClass.apply(Buffer.from(boxValue)); } catch (error: any) { @@ -143,7 +167,7 @@ abstract class TinymanBaseClient { return txn; } - protected async isOptedIn(accountAddress: string, assetId: number) { + protected async isOptedIn(accountAddress: string | algosdk.Address, assetId: number) { try { await this.algod.accountAssetInformation(accountAddress, assetId).do(); @@ -156,6 +180,22 @@ abstract class TinymanBaseClient { protected getSuggestedParams() { return this.algod.getTransactionParams().do(); } + + public convertStandardTransactionsToSignerTransactions( + txns: Transaction[], + signer: string | string[] + ): SignerTransaction[] { + if (Array.isArray(signer) && signer.length !== txns.length) { + throw new Error("Signer length does not match transaction length"); + } + + return txns.map((txn, index) => { + return { + txn, + signers: Array.isArray(signer) ? [signer[index]] : [signer] + }; + }); + } } export default TinymanBaseClient; diff --git a/src/util/client/base/constants.ts b/src/util/client/base/constants.ts index 987518c1..31a4b684 100644 --- a/src/util/client/base/constants.ts +++ b/src/util/client/base/constants.ts @@ -4,9 +4,12 @@ const MINIMUM_BALANCE_REQUIREMENT_PER_BOX_BYTE = 400; const MINIMUM_BALANCE_REQUIREMENT_PER_ACCOUNT = 100_000; const MINIMUM_BALANCE_REQUIREMENT_PER_ASSET = 100_000; +const HTTP_NOT_FOUND_STATUS = 404; + export { MINIMUM_BALANCE_REQUIREMENT_PER_ACCOUNT, MINIMUM_BALANCE_REQUIREMENT_PER_ASSET, MINIMUM_BALANCE_REQUIREMENT_PER_BOX, - MINIMUM_BALANCE_REQUIREMENT_PER_BOX_BYTE + MINIMUM_BALANCE_REQUIREMENT_PER_BOX_BYTE, + HTTP_NOT_FOUND_STATUS }; diff --git a/src/util/client/base/utils.ts b/src/util/client/base/utils.ts index f80418a0..917bfdff 100644 --- a/src/util/client/base/utils.ts +++ b/src/util/client/base/utils.ts @@ -91,7 +91,7 @@ class TealistInt { // Read bytes in big-endian order for (let i = 0; i < buffer.length; i++) { - // eslint-disable-next-line no-bitwise, no-magic-numbers + // eslint-disable-next-line no-bitwise value = (value << BigInt(8)) + BigInt(buffer[i]); } @@ -146,8 +146,4 @@ function getBoxCosts(boxes: Record) { }, MINIMUM_BALANCE_REQUIREMENT_PER_BOX); } -function getStruct(name: string, structReference: Record) { - return new Struct(name, structReference); -} - -export {ArrayData, getBoxCosts, Struct, getStruct}; +export {ArrayData, getBoxCosts, Struct}; diff --git a/src/util/pool/common/index.ts b/src/util/pool/common/index.ts index b2fb018b..e926f78f 100644 --- a/src/util/pool/common/index.ts +++ b/src/util/pool/common/index.ts @@ -23,7 +23,9 @@ export function getPoolShare(totalLiquidity: bigint, ownedLiquidity: bigint) { /** * Calculates the pair ratio for the pool reserves */ -export function getPoolPairRatio(reserves: null | PoolReserves): null | number { +export function getPoolPairRatio( + reserves: null | Pick +): null | number { const isEmpty = isPoolEmpty(reserves); let pairRatio: null | number = null; @@ -40,7 +42,9 @@ export function getPoolPairRatio(reserves: null | PoolReserves): null | number { * @param poolReserves - Pool reserves * @returns true if pool is empty, otherwise returns false */ -export function isPoolEmpty(poolReserves: undefined | null | PoolReserves) { +export function isPoolEmpty( + poolReserves: undefined | null | Pick +): boolean { return Boolean(poolReserves && !(poolReserves.asset1 + poolReserves.asset2)); } diff --git a/src/util/util.ts b/src/util/util.ts index a37753c8..cd193282 100644 --- a/src/util/util.ts +++ b/src/util/util.ts @@ -265,6 +265,20 @@ export function getTxnGroupID(txns: SignerTransaction[]) { return bufferToBase64(txns[0].txn.group?.buffer); } +/* eslint-disable no-bitwise */ +export function intToBytes(num: number, length = 8): Uint8Array { + const byteArray = new Uint8Array(length); + let newNum = BigInt(num); + + for (let i = length - 1; i >= 0; i--) { + byteArray[i] = Number(newNum & BigInt(0xff)); + newNum >>= BigInt(8); + } + + return byteArray; +} +/* eslint-enable no-bitwise */ + export function encodeInteger(number: bigint) { let buf: number[] = [];