{"data":[{"shapeKey":"mainnet:tinyman:v2:addLiquidity:flexible","network":"mainnet","protocol":"tinyman","protocolVersion":"v2","action":"addLiquidity","variant":"flexible","shapeVersion":"1.0.0","title":"Tinyman v2 flexible add liquidity","description":"Adds two-sided liquidity to an existing Tinyman AMM v2 pool using flexible amounts. Generates the documented 3-transaction group (asset1 transfer, asset2 transfer/payment, add_liquidity app call) as unsigned transactions.","summary":"Adds two-sided liquidity to an existing Tinyman AMM v2 pool using flexible amounts. Generates the documented 3-transaction group (asset1 transfer, asset2 transfer/payment, add_liquidity app call) as unsigned transactions.","opportunityRole":"enter","supportedOpportunityTypes":["lp"],"requiredInputs":["userAddress","assetAId","assetAAmount","assetBId","assetBAmount","maxSlippageBps"],"sources":[{"kind":"sdk","description":"@tinymanorg/tinyman-js-sdk AddLiquidity.v2.flexible (getQuote/generateTxns)"},{"kind":"docs","description":"Tinyman v2 integration: add subsequent liquidity (flexible)","url":"https://docs.tinyman.org/v2-integration/protocol-methods/add-subsequent-liquidity"}],"docsPath":"protocol/docs/execution-shapes/tinyman-add-liquidity-flexible.md"},{"shapeKey":"mainnet:tinyman:v2:addLiquidity:initial","network":"mainnet","protocol":"tinyman","protocolVersion":"v2","action":"addLiquidity","variant":"initial","shapeVersion":"1.0.0","title":"Tinyman v2 initial add liquidity","description":"Adds the first liquidity to a bootstrapped but empty Tinyman AMM v2 pool. Generates the documented 3-transaction group (asset1 transfer, asset2 transfer/payment, add_initial_liquidity app call) as unsigned transactions.","summary":"Adds the first liquidity to a bootstrapped but empty Tinyman AMM v2 pool. Generates the documented 3-transaction group (asset1 transfer, asset2 transfer/payment, add_initial_liquidity app call) as unsigned transactions.","opportunityRole":"enter","supportedOpportunityTypes":["lp"],"requiredInputs":["userAddress","assetAId","assetAAmount","assetBId","assetBAmount","maxSlippageBps"],"sources":[{"kind":"sdk","description":"@tinymanorg/tinyman-js-sdk AddLiquidity.v2.initial (getQuote/generateTxns)"},{"kind":"docs","description":"Tinyman v2 integration: add initial liquidity","url":"https://docs.tinyman.org/v2-integration/protocol-methods/add-initial-liquidity"}],"docsPath":"protocol/docs/execution-shapes/tinyman-add-liquidity-initial.md"},{"shapeKey":"mainnet:tinyman:v2:addLiquidity:singleAsset","network":"mainnet","protocol":"tinyman","protocolVersion":"v2","action":"addLiquidity","variant":"singleAsset","shapeVersion":"1.0.0","title":"Tinyman v2 single-asset add liquidity","description":"Adds one-sided liquidity to an existing Tinyman AMM v2 pool. Tinyman performs an internal swap to balance the deposit and mints pool tokens. Generates the documented 2-transaction group (asset transfer/payment, add_liquidity app call) as unsigned transactions.","summary":"Adds one-sided liquidity to an existing Tinyman AMM v2 pool. Tinyman performs an internal swap to balance the deposit and mints pool tokens. Generates the documented 2-transaction group (asset transfer/payment, add_liquidity app call) as unsigned transactions.","opportunityRole":"enter","supportedOpportunityTypes":["lp"],"requiredInputs":["userAddress","assetAId","assetBId","depositAssetId","depositAmount","maxSlippageBps"],"sources":[{"kind":"sdk","description":"@tinymanorg/tinyman-js-sdk AddLiquidity.v2.withSingleAsset (getQuote/generateTxns)"},{"kind":"docs","description":"Tinyman v2 integration: add subsequent liquidity (single asset)","url":"https://docs.tinyman.org/v2-integration/protocol-methods/add-subsequent-liquidity"}],"docsPath":"protocol/docs/execution-shapes/tinyman-add-liquidity-single-asset.md"},{"shapeKey":"mainnet:tinyman:v2:removeLiquidity:multipleAssetsOut","network":"mainnet","protocol":"tinyman","protocolVersion":"v2","action":"removeLiquidity","variant":"multipleAssetsOut","shapeVersion":"1.0.0","title":"Tinyman v2 remove liquidity (multiple assets out)","description":"Removes liquidity from an existing Tinyman AMM v2 pool, returning both pool assets proportionally. Generates the documented 2-transaction group (pool token transfer, remove_liquidity app call) as unsigned transactions.","summary":"Removes liquidity from an existing Tinyman AMM v2 pool, returning both pool assets proportionally. Generates the documented 2-transaction group (pool token transfer, remove_liquidity app call) as unsigned transactions.","opportunityRole":"exit","supportedOpportunityTypes":["lp"],"requiredInputs":["userAddress","assetAId","assetBId","poolTokenAmount","maxSlippageBps"],"sources":[{"kind":"sdk","description":"@tinymanorg/tinyman-js-sdk RemoveLiquidity.v2 (getQuote/generateTxns)"},{"kind":"docs","description":"Tinyman v2 integration: remove liquidity (multiple assets out)","url":"https://docs.tinyman.org/v2-integration/protocol-methods/remove-liquidity"}],"docsPath":"protocol/docs/execution-shapes/tinyman-remove-liquidity-multiple-assets-out.md"},{"shapeKey":"mainnet:tinyman:v2:removeLiquidity:singleAssetOut","network":"mainnet","protocol":"tinyman","protocolVersion":"v2","action":"removeLiquidity","variant":"singleAssetOut","shapeVersion":"1.0.0","title":"Tinyman v2 remove liquidity (single asset out)","description":"Removes liquidity from an existing Tinyman AMM v2 pool, returning a single chosen pool asset via an internal swap. Generates the documented 2-transaction group (pool token transfer, remove_liquidity app call) as unsigned transactions.","summary":"Removes liquidity from an existing Tinyman AMM v2 pool, returning a single chosen pool asset via an internal swap. Generates the documented 2-transaction group (pool token transfer, remove_liquidity app call) as unsigned transactions.","opportunityRole":"exit","supportedOpportunityTypes":["lp"],"requiredInputs":["userAddress","assetAId","assetBId","outputAssetId","poolTokenAmount","maxSlippageBps"],"sources":[{"kind":"sdk","description":"@tinymanorg/tinyman-js-sdk RemoveLiquidity.v2 (getSingleAssetRemoveLiquidityQuote/generateSingleAssetOutTxns)"},{"kind":"docs","description":"Tinyman v2 integration: remove liquidity (single asset out)","url":"https://docs.tinyman.org/v2-integration/protocol-methods/remove-liquidity"}],"docsPath":"protocol/docs/execution-shapes/tinyman-remove-liquidity-single-asset-out.md"},{"shapeKey":"mainnet:tinyman:staking-v1:farm:commit","network":"mainnet","protocol":"tinyman","protocolVersion":"staking-v1","action":"farm","variant":"commit","shapeVersion":"1.0.0","title":"Tinyman farm commit (existing LP position)","description":"Commits an existing Tinyman LP-token position to a Tinyman farm (staking program). LP tokens never leave the wallet; the commit is a staking app call that records the committed amount, optionally followed by a log_balance call for a required asset.","summary":"Commits an existing Tinyman LP-token position to a Tinyman farm (staking program). LP tokens never leave the wallet; the commit is a staking app call that records the committed amount, optionally followed by a log_balance call for a required asset.","opportunityRole":"enter","supportedOpportunityTypes":["farm"],"requiredInputs":["userAddress","commitAmount"],"sources":[{"kind":"sdk","description":"@tinymanorg/tinyman-js-sdk prepareCommitTransactions/getStakingAppID"}],"docsPath":"protocol/docs/execution-shapes/tinyman-farm-commit.md"},{"shapeKey":"mainnet:tinyman:staking-v1:farm:uncommit","network":"mainnet","protocol":"tinyman","protocolVersion":"staking-v1","action":"farm","variant":"uncommit","shapeVersion":"1.0.0","title":"Tinyman farm uncommit (lower or clear LP commitment)","description":"Lowers or clears a Tinyman farm commitment by re-calling prepareCommitTransactions with an absolute commitment amount (typically 0 for a full uncommit). LP tokens stay in the wallet; mid-cycle eligibility loss is a product caveat.","summary":"Lowers or clears a Tinyman farm commitment by re-calling prepareCommitTransactions with an absolute commitment amount (typically 0 for a full uncommit). LP tokens stay in the wallet; mid-cycle eligibility loss is a product caveat.","opportunityRole":"exit","supportedOpportunityTypes":["farm"],"requiredInputs":["userAddress","commitAmount"],"sources":[{"kind":"sdk","description":"@tinymanorg/tinyman-js-sdk prepareCommitTransactions (absolute commit amount; 0 = uncommit)"}],"docsPath":"protocol/docs/execution-shapes/tinyman-farm-uncommit.md"},{"shapeKey":"mainnet:tinyman:staking-v1:farm:claimRewards","network":"mainnet","protocol":"tinyman","protocolVersion":"staking-v1","action":"farm","variant":"claimRewards","shapeVersion":"1.0.0","title":"Tinyman farm claim pending rewards","description":"Claims unpaid Tinyman farm rewards for a staking program. Transaction bytes are prepared by the Tinyman Analytics API (`POST /staking/rewards/prepare-claim-transactions/`); Canix normalizes and validates the unsigned group for local signing. Does not call the Analytics submit endpoint.","summary":"Claims unpaid Tinyman farm rewards for a staking program. Transaction bytes are prepared by the Tinyman Analytics API (`POST /staking/rewards/prepare-claim-transactions/`); Canix normalizes and validates the unsigned group for local signing. Does not call the Analytics submit endpoint.","opportunityRole":"manage","supportedOpportunityTypes":["farm"],"requiredInputs":["userAddress","programId","poolAddress"],"sources":[{"kind":"api","description":"Tinyman Analytics POST /api/v1/staking/rewards/prepare-claim-transactions/"}],"docsPath":"protocol/docs/execution-shapes/tinyman-farm-claim-rewards.md"},{"shapeKey":"mainnet:tinyman:v2:addLiquidityAndFarm:flexible","network":"mainnet","protocol":"tinyman","protocolVersion":"v2","action":"addLiquidityAndFarm","variant":"flexible","shapeVersion":"1.0.0","title":"Tinyman v2 flexible add liquidity and farm commit","description":"Adds two-sided flexible liquidity to a Tinyman AMM v2 pool and, in the same atomic group, commits the newly minted LP position to a Tinyman farm. LP tokens never leave the wallet; the farm commit is a staking app call. Returns the combined, regrouped unsigned transaction group.","summary":"Adds two-sided flexible liquidity to a Tinyman AMM v2 pool and, in the same atomic group, commits the newly minted LP position to a Tinyman farm. LP tokens never leave the wallet; the farm commit is a staking app call. Returns the combined, regrouped unsigned transaction group.","opportunityRole":"enter","supportedOpportunityTypes":["farm"],"requiredInputs":["userAddress","assetAId","assetAAmount","assetBId","assetBAmount","maxSlippageBps"],"sources":[{"kind":"sdk","description":"@tinymanorg/tinyman-js-sdk AddLiquidity.v2.flexible + prepareCommitTransactions + combineAndRegroupSignerTxns"},{"kind":"docs","description":"Tinyman v2 integration: add subsequent liquidity (flexible)","url":"https://docs.tinyman.org/v2-integration/protocol-methods/add-subsequent-liquidity"}],"docsPath":"protocol/docs/execution-shapes/tinyman-add-liquidity-and-farm-flexible.md"},{"shapeKey":"mainnet:tinyman:v2:addLiquidityAndFarm:singleAsset","network":"mainnet","protocol":"tinyman","protocolVersion":"v2","action":"addLiquidityAndFarm","variant":"singleAsset","shapeVersion":"1.0.0","title":"Tinyman v2 single-asset add liquidity and farm commit","description":"Adds one-sided liquidity to a Tinyman AMM v2 pool and, in the same atomic group, commits the newly minted LP position to a Tinyman farm. LP tokens never leave the wallet; the farm commit is a staking app call. Returns the combined, regrouped unsigned transaction group.","summary":"Adds one-sided liquidity to a Tinyman AMM v2 pool and, in the same atomic group, commits the newly minted LP position to a Tinyman farm. LP tokens never leave the wallet; the farm commit is a staking app call. Returns the combined, regrouped unsigned transaction group.","opportunityRole":"enter","supportedOpportunityTypes":["farm"],"requiredInputs":["userAddress","assetAId","assetBId","depositAssetId","depositAmount","maxSlippageBps"],"sources":[{"kind":"sdk","description":"@tinymanorg/tinyman-js-sdk AddLiquidity.v2.withSingleAsset + prepareCommitTransactions + combineAndRegroupSignerTxns"},{"kind":"docs","description":"Tinyman v2 integration: add subsequent liquidity (single asset)","url":"https://docs.tinyman.org/v2-integration/protocol-methods/add-subsequent-liquidity"}],"docsPath":"protocol/docs/execution-shapes/tinyman-add-liquidity-and-farm-single-asset.md"},{"shapeKey":"mainnet:tinyman:liquid-stake-v1:mint:tAlgo","network":"mainnet","protocol":"tinyman","protocolVersion":"liquid-stake-v1","action":"mint","variant":"tAlgo","shapeVersion":"1.0.0","title":"Tinyman liquid stake mint tALGO","description":"Stakes ALGO into Tinyman's liquid-staking app and mints tALGO. Builds the SDK mint group (optional tALGO opt-in, ALGO payment, mint app call) as unsigned transactions.","summary":"Stakes ALGO into Tinyman's liquid-staking app and mints tALGO. Builds the SDK mint group (optional tALGO opt-in, ALGO payment, mint app call) as unsigned transactions.","opportunityRole":"enter","supportedOpportunityTypes":["staking"],"requiredInputs":["userAddress","amount"],"sources":[{"kind":"sdk","description":"@tinymanorg/tinyman-js-sdk TinymanTAlgoClient.mint"}],"docsPath":"protocol/docs/execution-shapes/tinyman-mint-talgo.md"},{"shapeKey":"mainnet:tinyman:liquid-stake-v1:burn:tAlgo","network":"mainnet","protocol":"tinyman","protocolVersion":"liquid-stake-v1","action":"burn","variant":"tAlgo","shapeVersion":"1.0.0","title":"Tinyman liquid stake burn tALGO","description":"Burns tALGO to redeem ALGO from Tinyman's liquid-staking app. Builds the SDK burn group (tALGO transfer, burn app call) as unsigned transactions.","summary":"Burns tALGO to redeem ALGO from Tinyman's liquid-staking app. Builds the SDK burn group (tALGO transfer, burn app call) as unsigned transactions.","opportunityRole":"exit","supportedOpportunityTypes":["staking"],"requiredInputs":["userAddress","amount"],"sources":[{"kind":"sdk","description":"@tinymanorg/tinyman-js-sdk TinymanTAlgoClient.burn"}],"docsPath":"protocol/docs/execution-shapes/tinyman-burn-talgo.md"},{"shapeKey":"mainnet:tinyman:restake-v1:increaseStake:stAlgo","network":"mainnet","protocol":"tinyman","protocolVersion":"restake-v1","action":"increaseStake","variant":"stAlgo","shapeVersion":"1.0.0","title":"Tinyman restake increase stALGO","description":"Restakes tALGO into Tinyman's restaking app and mints stALGO. Builds the SDK increaseStake group (optional rate-change / box MBR / stALGO opt-in, tALGO transfer, increase_stake app call) as unsigned transactions.","summary":"Restakes tALGO into Tinyman's restaking app and mints stALGO. Builds the SDK increaseStake group (optional rate-change / box MBR / stALGO opt-in, tALGO transfer, increase_stake app call) as unsigned transactions.","opportunityRole":"enter","supportedOpportunityTypes":["staking"],"requiredInputs":["userAddress","amount"],"sources":[{"kind":"sdk","description":"@tinymanorg/tinyman-js-sdk TinymanSTAlgoClient.increaseStake"}],"docsPath":"protocol/docs/execution-shapes/tinyman-increase-stake-stalgo.md"},{"shapeKey":"mainnet:tinyman:restake-v1:decreaseStake:stAlgo","network":"mainnet","protocol":"tinyman","protocolVersion":"restake-v1","action":"decreaseStake","variant":"stAlgo","shapeVersion":"1.0.0","title":"Tinyman restake decrease stALGO","description":"Unrestakes stALGO from Tinyman's restaking app and returns tALGO. Builds the SDK decreaseStake group (optional rate-change / tALGO opt-in, decrease_stake app call) as unsigned transactions.","summary":"Unrestakes stALGO from Tinyman's restaking app and returns tALGO. Builds the SDK decreaseStake group (optional rate-change / tALGO opt-in, decrease_stake app call) as unsigned transactions.","opportunityRole":"exit","supportedOpportunityTypes":["staking"],"requiredInputs":["userAddress","amount"],"sources":[{"kind":"sdk","description":"@tinymanorg/tinyman-js-sdk TinymanSTAlgoClient.decreaseStake"}],"docsPath":"protocol/docs/execution-shapes/tinyman-decrease-stake-stalgo.md"},{"shapeKey":"mainnet:tinyman:restake-v1:claimRewards:stAlgo","network":"mainnet","protocol":"tinyman","protocolVersion":"restake-v1","action":"claimRewards","variant":"stAlgo","shapeVersion":"1.0.0","title":"Tinyman restake claim TINY rewards","description":"Claims accrued TINY rewards from Tinyman's tALGO restaking app. Builds the SDK claimRewards group (optional rate-change / TINY opt-in, claim_rewards app call) as unsigned transactions.","summary":"Claims accrued TINY rewards from Tinyman's tALGO restaking app. Builds the SDK claimRewards group (optional rate-change / TINY opt-in, claim_rewards app call) as unsigned transactions.","opportunityRole":"manage","supportedOpportunityTypes":["staking"],"requiredInputs":["userAddress"],"sources":[{"kind":"sdk","description":"@tinymanorg/tinyman-js-sdk TinymanSTAlgoClient.claimRewards"}],"docsPath":"protocol/docs/execution-shapes/tinyman-claim-rewards-stalgo.md"},{"shapeKey":"mainnet:folks-finance:v2:setup:depositEscrow","network":"mainnet","protocol":"folks-finance","protocolVersion":"v2","action":"setup","variant":"depositEscrow","shapeVersion":"1.1.0","title":"Folks Finance v2 add deposit escrow","description":"Creates and funds a new Folks Finance deposit escrow for the user. Returns a 3-transaction group that must be signed by both the user and the generated escrow account.","summary":"Creates and funds a new Folks Finance deposit escrow for the user. Returns a 3-transaction group that must be signed by both the user and the generated escrow account.","opportunityRole":"enter","supportedOpportunityTypes":["lending"],"requiredInputs":["userAddress"],"sources":[{"kind":"sdk","description":"@folks-finance/algorand-sdk prepareAddDepositEscrowToDeposits"},{"kind":"docs","description":"Folks Finance recoverable deposit escrow minimum-balance funding","url":"https://docs.folks.finance/introduction/need-help/fees"}],"docsPath":"protocol/docs/execution-shapes/folks-finance-setup-deposit-escrow.md"},{"shapeKey":"mainnet:folks-finance:v2:setup:optEscrowAsset","network":"mainnet","protocol":"folks-finance","protocolVersion":"v2","action":"setup","variant":"optEscrowAsset","shapeVersion":"1.1.0","title":"Folks Finance v2 opt deposit escrow into pool fAsset","description":"Funds and opts an existing Folks Finance deposit escrow into a pool fAsset so it can receive deposits.","summary":"Funds and opts an existing Folks Finance deposit escrow into a pool fAsset so it can receive deposits.","opportunityRole":"enter","supportedOpportunityTypes":["lending"],"requiredInputs":["userAddress","escrowAddress"],"sources":[{"kind":"sdk","description":"@folks-finance/algorand-sdk prepareOptDepositEscrowIntoAssetInDeposits"},{"kind":"docs","description":"Folks Finance recoverable per-asset minimum-balance funding","url":"https://docs.folks.finance/introduction/need-help/fees"}],"docsPath":"protocol/docs/execution-shapes/folks-finance-setup-opt-escrow-asset.md"},{"shapeKey":"mainnet:folks-finance:v2:deposit:escrow","network":"mainnet","protocol":"folks-finance","protocolVersion":"v2","action":"deposit","variant":"escrow","shapeVersion":"1.0.0","title":"Folks Finance v2 escrow deposit","description":"Deposits an underlying asset into a Folks Finance lending pool via a deposit escrow. fAssets accrue in the escrow rather than the user's wallet. Generates the SDK deposit group (asset transfer + deposit app call), optionally prefixed with OpUp.","summary":"Deposits an underlying asset into a Folks Finance lending pool via a deposit escrow. fAssets accrue in the escrow rather than the user's wallet. Generates the SDK deposit group (asset transfer + deposit app call), optionally prefixed with OpUp.","opportunityRole":"enter","supportedOpportunityTypes":["lending"],"requiredInputs":["userAddress","assetAmount"],"sources":[{"kind":"sdk","description":"@folks-finance/algorand-sdk prepareDepositIntoPool (escrow receiver) + prefixWithOpUp"}],"docsPath":"protocol/docs/execution-shapes/folks-finance-deposit-escrow.md"},{"shapeKey":"mainnet:folks-finance:v2:withdraw:escrow","network":"mainnet","protocol":"folks-finance","protocolVersion":"v2","action":"withdraw","variant":"escrow","shapeVersion":"1.0.0","title":"Folks Finance v2 escrow withdraw","description":"Withdraws underlying assets from a Folks Finance lending pool via a deposit escrow. Generates the SDK deposits-app withdraw call; assets are sent to the user wallet.","summary":"Withdraws underlying assets from a Folks Finance lending pool via a deposit escrow. Generates the SDK deposits-app withdraw call; assets are sent to the user wallet.","opportunityRole":"exit","supportedOpportunityTypes":["lending"],"requiredInputs":["userAddress","amount","amountDenomination"],"sources":[{"kind":"sdk","description":"@folks-finance/algorand-sdk prepareWithdrawFromDepositEscrowInDeposits"}],"docsPath":"protocol/docs/execution-shapes/folks-finance-withdraw-escrow.md"},{"shapeKey":"mainnet:folks-finance:xalgo-v1:stake:immediate","network":"mainnet","protocol":"folks-finance","protocolVersion":"xalgo-v1","action":"stake","variant":"immediate","shapeVersion":"1.0.0","title":"Folks Finance xALGO immediate stake","description":"Stakes ALGO into Folks Finance liquid staking and mints xALGO immediately. Builds the SDK immediate_mint group (ALGO payment + consensus app call, with optional OpUp and resource-allocation dummy calls) as unsigned transactions.","summary":"Stakes ALGO into Folks Finance liquid staking and mints xALGO immediately. Builds the SDK immediate_mint group (ALGO payment + consensus app call, with optional OpUp and resource-allocation dummy calls) as unsigned transactions.","opportunityRole":"enter","supportedOpportunityTypes":["staking"],"requiredInputs":["userAddress","amount"],"sources":[{"kind":"sdk","description":"@folks-finance/algorand-sdk prepareImmediateStakeTransactions + prefixWithOpUp"}],"docsPath":"protocol/docs/execution-shapes/folks-finance-stake-immediate.md"},{"shapeKey":"mainnet:folks-finance:xalgo-v1:unstake:immediate","network":"mainnet","protocol":"folks-finance","protocolVersion":"xalgo-v1","action":"unstake","variant":"immediate","shapeVersion":"1.0.0","title":"Folks Finance xALGO immediate unstake","description":"Burns xALGO to redeem ALGO from Folks Finance liquid staking immediately. Builds the SDK burn group (xALGO transfer + consensus app call, with optional OpUp and resource-allocation dummy calls) as unsigned transactions.","summary":"Burns xALGO to redeem ALGO from Folks Finance liquid staking immediately. Builds the SDK burn group (xALGO transfer + consensus app call, with optional OpUp and resource-allocation dummy calls) as unsigned transactions.","opportunityRole":"exit","supportedOpportunityTypes":["staking"],"requiredInputs":["userAddress","amount"],"sources":[{"kind":"sdk","description":"@folks-finance/algorand-sdk prepareUnstakeTransactions + prefixWithOpUp"}],"docsPath":"protocol/docs/execution-shapes/folks-finance-unstake-immediate.md"},{"shapeKey":"mainnet:pact:v1:addLiquidity:twoSided","network":"mainnet","protocol":"pact","protocolVersion":"v1","action":"addLiquidity","variant":"twoSided","shapeVersion":"1.0.0","title":"Pact v1 two-sided add liquidity","description":"Adds two-sided liquidity to an existing Pact AMM pool. Generates the documented 3-transaction group (primary asset deposit, secondary asset deposit, ADDLIQ app call) as unsigned transactions.","summary":"Adds two-sided liquidity to an existing Pact AMM pool. Generates the documented 3-transaction group (primary asset deposit, secondary asset deposit, ADDLIQ app call) as unsigned transactions.","opportunityRole":"enter","supportedOpportunityTypes":["lp"],"requiredInputs":["userAddress","poolAppId","assetAId","assetAAmount","assetBId","assetBAmount","maxSlippageBps"],"sources":[{"kind":"sdk","description":"@pactfi/pactsdk Pool.prepareAddLiquidity / buildAddLiquidityTxs"},{"kind":"docs","description":"Pact JS SDK pool liquidity management","url":"https://pactfi.github.io/pact-js-sdk/latest/classes/Pool.html"}],"docsPath":"protocol/docs/execution-shapes/pact-add-liquidity-two-sided.md"},{"shapeKey":"mainnet:pact:v1:removeLiquidity:proportional","network":"mainnet","protocol":"pact","protocolVersion":"v1","action":"removeLiquidity","variant":"proportional","shapeVersion":"1.0.0","title":"Pact v1 proportional remove liquidity","description":"Removes liquidity from an existing Pact AMM pool proportionally. Generates the documented 2-transaction group (LP token deposit, REMLIQ app call) as unsigned transactions.","summary":"Removes liquidity from an existing Pact AMM pool proportionally. Generates the documented 2-transaction group (LP token deposit, REMLIQ app call) as unsigned transactions.","opportunityRole":"exit","supportedOpportunityTypes":["lp"],"requiredInputs":["userAddress","poolAppId","poolTokenAmount"],"sources":[{"kind":"sdk","description":"@pactfi/pactsdk Pool.buildRemoveLiquidityTxs"},{"kind":"docs","description":"Pact JS SDK pool liquidity management","url":"https://pactfi.github.io/pact-js-sdk/latest/classes/Pool.html"}],"docsPath":"protocol/docs/execution-shapes/pact-remove-liquidity-proportional.md"},{"shapeKey":"mainnet:pact:v1:farm:deployEscrow","network":"mainnet","protocol":"pact","protocolVersion":"v1","action":"farm","variant":"deployEscrow","shapeVersion":"1.0.0","title":"Pact farm deploy escrow (first-time setup)","description":"Deploys a per-user Pact Micro Farming escrow application for a farm and opts the wallet into the farm app. Escrow creation must confirm before staking; the escrow app id is unknown until this group confirms, so stake cannot be atomic with deploy.","summary":"Deploys a per-user Pact Micro Farming escrow application for a farm and opts the wallet into the farm app. Escrow creation must confirm before staking; the escrow app id is unknown until this group confirms, so stake cannot be atomic with deploy.","opportunityRole":"enter","supportedOpportunityTypes":["farm"],"requiredInputs":["userAddress","farmAppId"],"sources":[{"kind":"sdk","description":"@pactfi/pactsdk Farm.prepareDeployEscrowTxs / buildDeployEscrowTxs"},{"kind":"docs","description":"Pact Micro Farming escrow pattern","url":"https://pactfi.github.io/pact-js-sdk/latest/classes/Farm.html"}],"docsPath":"protocol/docs/execution-shapes/pact-farm-deploy-escrow.md"},{"shapeKey":"mainnet:pact:v1:farm:stake","network":"mainnet","protocol":"pact","protocolVersion":"v1","action":"farm","variant":"stake","shapeVersion":"1.0.0","title":"Pact farm stake (existing LP into escrow)","description":"Stakes an existing Pact LP-token balance into a Pact farm escrow. LP tokens leave the wallet via an ASA transfer to the user's farm escrow, followed by farm update app call(s). Requires a previously deployed escrow (farm:deployEscrow).","summary":"Stakes an existing Pact LP-token balance into a Pact farm escrow. LP tokens leave the wallet via an ASA transfer to the user's farm escrow, followed by farm update app call(s). Requires a previously deployed escrow (farm:deployEscrow).","opportunityRole":"enter","supportedOpportunityTypes":["farm"],"requiredInputs":["userAddress","farmAppId","amount"],"sources":[{"kind":"sdk","description":"@pactfi/pactsdk Escrow.buildStakeTxs"},{"kind":"docs","description":"Pact Escrow stake","url":"https://pactfi.github.io/pact-js-sdk/latest/classes/Escrow.html"}],"docsPath":"protocol/docs/execution-shapes/pact-farm-stake.md"},{"shapeKey":"mainnet:pact:v1:farm:unstake","network":"mainnet","protocol":"pact","protocolVersion":"v1","action":"farm","variant":"unstake","shapeVersion":"1.0.0","title":"Pact farm unstake (return LP from escrow)","description":"Unstakes LP tokens from a Pact farm escrow back to the wallet. Calls the user's escrow application, which returns the staked LP ASA to the user.","summary":"Unstakes LP tokens from a Pact farm escrow back to the wallet. Calls the user's escrow application, which returns the staked LP ASA to the user.","opportunityRole":"exit","supportedOpportunityTypes":["farm"],"requiredInputs":["userAddress","farmAppId","amount"],"sources":[{"kind":"sdk","description":"@pactfi/pactsdk Escrow.buildUnstakeTxs"}],"docsPath":"protocol/docs/execution-shapes/pact-farm-unstake.md"},{"shapeKey":"mainnet:pact:v1:farm:claimRewards","network":"mainnet","protocol":"pact","protocolVersion":"v1","action":"farm","variant":"claimRewards","shapeVersion":"1.0.0","title":"Pact farm claim rewards","description":"Claims accrued Pact farm reward ASAs into the wallet via the farm application, using the user's farm escrow reference. User must already be opted into each reward asset.","summary":"Claims accrued Pact farm reward ASAs into the wallet via the farm application, using the user's farm escrow reference. User must already be opted into each reward asset.","opportunityRole":"manage","supportedOpportunityTypes":["farm"],"requiredInputs":["userAddress","farmAppId"],"sources":[{"kind":"sdk","description":"@pactfi/pactsdk Escrow.buildClaimRewardsTx / Farm.buildClaimRewardsTx"}],"docsPath":"protocol/docs/execution-shapes/pact-farm-claim-rewards.md"},{"shapeKey":"mainnet:pact:v1:addLiquidityAndFarm:twoSided","network":"mainnet","protocol":"pact","protocolVersion":"v1","action":"addLiquidityAndFarm","variant":"twoSided","shapeVersion":"1.0.0","title":"Pact v1 two-sided add liquidity and farm stake","description":"Adds two-sided liquidity to a Pact AMM pool and, in the same atomic group, stakes the newly minted LP tokens into an existing Pact farm escrow (LP leaves the wallet). Requires a previously deployed farm escrow.","summary":"Adds two-sided liquidity to a Pact AMM pool and, in the same atomic group, stakes the newly minted LP tokens into an existing Pact farm escrow (LP leaves the wallet). Requires a previously deployed farm escrow.","opportunityRole":"enter","supportedOpportunityTypes":["farm"],"requiredInputs":["userAddress","farmAppId","poolAppId","assetAId","assetAAmount","assetBId","assetBAmount","maxSlippageBps"],"sources":[{"kind":"sdk","description":"@pactfi/pactsdk Pool.prepareAddLiquidity / buildAddLiquidityTxs + Escrow.buildStakeTxs"}],"docsPath":"protocol/docs/execution-shapes/pact-add-liquidity-and-farm-two-sided.md"},{"shapeKey":"mainnet:compx:v1:deposit:asa","network":"mainnet","protocol":"compx","protocolVersion":"v1","action":"deposit","variant":"asa","shapeVersion":"1.0.0","title":"CompX v1 ASA lending deposit","description":"Deposits a base ASA into a CompX lending market and receives LST tokens. Wraps @compx/sdk buildDepositTransactions, including the optional leading LST opt-in when needed.","summary":"Deposits a base ASA into a CompX lending market and receives LST tokens. Wraps @compx/sdk buildDepositTransactions, including the optional leading LST opt-in when needed.","opportunityRole":"enter","supportedOpportunityTypes":["lending"],"requiredInputs":["userAddress","marketAppId","amount"],"sources":[{"kind":"sdk","description":"@compx/sdk buildDepositTransactions / depositASA(axfer,uint64)void"}],"docsPath":"protocol/docs/execution-shapes/compx-deposit-asa.md"},{"shapeKey":"mainnet:compx:v1:withdraw:asa","network":"mainnet","protocol":"compx","protocolVersion":"v1","action":"withdraw","variant":"asa","shapeVersion":"1.0.0","title":"CompX v1 ASA lending withdraw","description":"Withdraws base ASA from a CompX lending market by burning LST tokens. The amount is LST-denominated. Wraps @compx/sdk buildWithdrawTransactions, including the optional leading base-asset opt-in when needed.","summary":"Withdraws base ASA from a CompX lending market by burning LST tokens. The amount is LST-denominated. Wraps @compx/sdk buildWithdrawTransactions, including the optional leading base-asset opt-in when needed.","opportunityRole":"exit","supportedOpportunityTypes":["lending"],"requiredInputs":["userAddress","marketAppId","amount"],"sources":[{"kind":"sdk","description":"@compx/sdk buildWithdrawTransactions / withdrawDeposit(axfer,uint64)void"}],"docsPath":"protocol/docs/execution-shapes/compx-withdraw-asa.md"},{"shapeKey":"mainnet:compx:v1:stake:asa","network":"mainnet","protocol":"compx","protocolVersion":"v1","action":"stake","variant":"asa","shapeVersion":"1.0.0","title":"CompX v1 ASA staking deposit","description":"Stakes an ASA into a CompX staking pool. Builds stake(axfer,uint64,pay)void from the ARC-56 spec: staked-asset transfer, optional staker-box MBR payment, and stake app call.","summary":"Stakes an ASA into a CompX staking pool. Builds stake(axfer,uint64,pay)void from the ARC-56 spec: staked-asset transfer, optional staker-box MBR payment, and stake app call.","opportunityRole":"enter","supportedOpportunityTypes":["staking"],"requiredInputs":["userAddress","poolAppId","amount"],"sources":[{"kind":"arc56","description":"protocol/src/staking.arc56.json stake(axfer,uint64,pay)void"}],"docsPath":"protocol/docs/execution-shapes/compx-stake-asa.md"},{"shapeKey":"mainnet:compx:v1:unstake:asa","network":"mainnet","protocol":"compx","protocolVersion":"v1","action":"unstake","variant":"asa","shapeVersion":"1.0.0","title":"CompX v1 ASA staking withdraw","description":"Unstakes ASA from a CompX staking pool via unstake(uint64)void. Optionally prefixes a reward-asset opt-in when the user is not yet opted in.","summary":"Unstakes ASA from a CompX staking pool via unstake(uint64)void. Optionally prefixes a reward-asset opt-in when the user is not yet opted in.","opportunityRole":"exit","supportedOpportunityTypes":["staking"],"requiredInputs":["userAddress","poolAppId","amount"],"sources":[{"kind":"arc56","description":"protocol/src/staking.arc56.json unstake(uint64)void"}],"docsPath":"protocol/docs/execution-shapes/compx-unstake-asa.md"},{"shapeKey":"mainnet:compx:v1:claim:rewards","network":"mainnet","protocol":"compx","protocolVersion":"v1","action":"claim","variant":"rewards","shapeVersion":"1.0.0","title":"CompX v1 staking reward claim","description":"Claims accrued staking rewards via claimRewards()void. Optionally prefixes a reward-asset opt-in when the user is not yet opted in.","summary":"Claims accrued staking rewards via claimRewards()void. Optionally prefixes a reward-asset opt-in when the user is not yet opted in.","opportunityRole":"manage","supportedOpportunityTypes":["staking"],"requiredInputs":["userAddress","poolAppId"],"sources":[{"kind":"arc56","description":"protocol/src/staking.arc56.json claimRewards()void"}],"docsPath":"protocol/docs/execution-shapes/compx-claim-rewards.md"},{"shapeKey":"mainnet:dorkfi:v1:deposit:asa","network":"mainnet","protocol":"dorkfi","protocolVersion":"v1","action":"deposit","variant":"asa","shapeVersion":"1.0.0","title":"Dork.fi v1 ASA lending deposit","description":"Deposits an ASA into a Dork.fi lending market by wrapping through nt200, approving the pool, and calling lending.deposit. Amount is underlying ASA base units.","summary":"Deposits an ASA into a Dork.fi lending market by wrapping through nt200, approving the pool, and calling lending.deposit. Amount is underlying ASA base units.","opportunityRole":"enter","supportedOpportunityTypes":["lending"],"requiredInputs":["userAddress","poolAppId","marketAppId","assetId","amount"],"sources":[{"kind":"docs","description":"Dork.fi lending pool ABI and DorkFiMCP ASA supply builder flow","url":"https://github.com/NautilusOSS/DorkFiMCP"}],"docsPath":"protocol/docs/execution-shapes/dorkfi-deposit-asa.md"},{"shapeKey":"mainnet:dorkfi:v1:withdraw:asa","network":"mainnet","protocol":"dorkfi","protocolVersion":"v1","action":"withdraw","variant":"asa","shapeVersion":"1.0.0","title":"Dork.fi v1 ASA lending withdraw","description":"Withdraws supplied ASA from a Dork.fi lending market. Amount is nToken-denominated; the builder unwraps nt200 after the lending.withdraw call.","summary":"Withdraws supplied ASA from a Dork.fi lending market. Amount is nToken-denominated; the builder unwraps nt200 after the lending.withdraw call.","opportunityRole":"exit","supportedOpportunityTypes":["lending"],"requiredInputs":["userAddress","poolAppId","marketAppId","assetId","amount"],"sources":[{"kind":"docs","description":"Dork.fi lending pool ABI and DorkFiMCP ASA withdraw builder flow","url":"https://github.com/NautilusOSS/DorkFiMCP"}],"docsPath":"protocol/docs/execution-shapes/dorkfi-withdraw-asa.md"},{"shapeKey":"mainnet:myth-finance:dualstake-v1:mint:lst","network":"mainnet","protocol":"myth-finance","protocolVersion":"dualstake-v1","action":"mint","variant":"lst","shapeVersion":"1.0.0","title":"Myth Finance dualSTAKE mint LST","description":"Mints a Myth Finance dualSTAKE liquid-staking token by depositing ALGO and a small paired-ASA leg (receipt is not a pure ALGO 1:1 LST). Builds an unsigned group: optional LST opt-in, mint app call, ALGO payment, ASA transfer. ASA deposit is derived from the on-chain rate for the requested ALGO amount.","summary":"Mints a Myth Finance dualSTAKE liquid-staking token by depositing ALGO and a small paired-ASA leg (receipt is not a pure ALGO 1:1 LST). Builds an unsigned group: optional LST opt-in, mint app call, ALGO payment, ASA transfer. ASA deposit is derived from the on-chain rate for the requested ALGO amount.","opportunityRole":"enter","supportedOpportunityTypes":["staking","farm"],"requiredInputs":["userAddress","amount","appId"],"sources":[{"kind":"sdk","description":"@myth-finance/dualstake-ts-sdk DualStakeClient mint app call + algosdk v3 payment/axfer builders"}],"docsPath":"protocol/docs/execution-shapes/myth-finance-mint-lst.md"},{"shapeKey":"mainnet:myth-finance:dualstake-v1:redeem:lst","network":"mainnet","protocol":"myth-finance","protocolVersion":"dualstake-v1","action":"redeem","variant":"lst","shapeVersion":"1.0.0","title":"Myth Finance dualSTAKE redeem LST","description":"Redeems a Myth Finance dualSTAKE liquid-staking token for mostly ALGO plus a small amount of the paired ASA (not 1:1 ALGO). Builds an unsigned group: optional ASA opt-in, LST transfer, redeem app call.","summary":"Redeems a Myth Finance dualSTAKE liquid-staking token for mostly ALGO plus a small amount of the paired ASA (not 1:1 ALGO). Builds an unsigned group: optional ASA opt-in, LST transfer, redeem app call.","opportunityRole":"exit","supportedOpportunityTypes":["staking","farm"],"requiredInputs":["userAddress","amount","appId"],"sources":[{"kind":"sdk","description":"@myth-finance/dualstake-ts-sdk DualStakeClient redeem app call + algosdk v3 axfer builders"}],"docsPath":"protocol/docs/execution-shapes/myth-finance-redeem-lst.md"},{"shapeKey":"mainnet:haystack:v1:stake:hay","network":"mainnet","protocol":"haystack","protocolVersion":"v1","action":"stake","variant":"hay","shapeVersion":"1.0.0","title":"Haystack v1 HAY staking deposit","description":"Stakes HAY into the Haystack staking pool. Builds stakeHay(axfer)void from the ARC-56 spec: an optional staker-box MBR payment (first stake only), the HAY asset transfer (the ABI arg), and the stakeHay app call.","summary":"Stakes HAY into the Haystack staking pool. Builds stakeHay(axfer)void from the ARC-56 spec: an optional staker-box MBR payment (first stake only), the HAY asset transfer (the ABI arg), and the stakeHay app call.","opportunityRole":"enter","supportedOpportunityTypes":["staking"],"requiredInputs":["userAddress","amount"],"sources":[{"kind":"arc56","description":"protocol/src/haystack-staking.arc56.json stakeHay(axfer)void"}],"docsPath":"protocol/docs/execution-shapes/haystack-stake-hay.md"},{"shapeKey":"mainnet:haystack:v1:unstake:hay","network":"mainnet","protocol":"haystack","protocolVersion":"v1","action":"unstake","variant":"hay","shapeVersion":"1.0.0","title":"Haystack v1 HAY staking withdraw","description":"Unstakes HAY from the Haystack staking pool and claims pending USDC and HAY rewards via unstakeHayAndClaim(uint64)(uint64,uint64). Prefixes a USDC opt-in when the user is not yet opted into USDC.","summary":"Unstakes HAY from the Haystack staking pool and claims pending USDC and HAY rewards via unstakeHayAndClaim(uint64)(uint64,uint64). Prefixes a USDC opt-in when the user is not yet opted into USDC.","opportunityRole":"exit","supportedOpportunityTypes":["staking"],"requiredInputs":["userAddress","amount"],"sources":[{"kind":"arc56","description":"protocol/src/haystack-staking.arc56.json unstakeHayAndClaim(uint64)(uint64,uint64)"}],"docsPath":"protocol/docs/execution-shapes/haystack-unstake-hay.md"},{"shapeKey":"mainnet:haystack:v1:claim:rewards","network":"mainnet","protocol":"haystack","protocolVersion":"v1","action":"claim","variant":"rewards","shapeVersion":"1.0.0","title":"Haystack v1 staking reward claim","description":"Claims accrued USDC and HAY staking rewards via claim()(uint64,uint64). Prefixes a USDC opt-in transfer when the user is not yet opted into USDC.","summary":"Claims accrued USDC and HAY staking rewards via claim()(uint64,uint64). Prefixes a USDC opt-in transfer when the user is not yet opted into USDC.","opportunityRole":"manage","supportedOpportunityTypes":["staking"],"requiredInputs":["userAddress"],"sources":[{"kind":"arc56","description":"protocol/src/haystack-staking.arc56.json claim()(uint64,uint64)"}],"docsPath":"protocol/docs/execution-shapes/haystack-claim-rewards.md"},{"shapeKey":"mainnet:reti:v1:stake:algo","network":"mainnet","protocol":"reti","protocolVersion":"v1","action":"stake","variant":"algo","shapeVersion":"1.0.0","title":"Réti ALGO stake to validator","description":"Stakes ALGO to a Réti validator via ValidatorRegistry.addStake. The registry allocates into one of the validator's pools. Builds gas ×2, ALGO payment to the registry, addStake, and optional reward-token opt-in. Enforces minEntryStake, capacity, and entry gates at quote time.","summary":"Stakes ALGO to a Réti validator via ValidatorRegistry.addStake. The registry allocates into one of the validator's pools. Builds gas ×2, ALGO payment to the registry, addStake, and optional reward-token opt-in. Enforces minEntryStake, capacity, and entry gates at quote time.","opportunityRole":"enter","supportedOpportunityTypes":["staking"],"requiredInputs":["userAddress","validatorId","amount"],"sources":[{"kind":"arc56","description":"algorandfoundation/reti ValidatorRegistry.addStake(pay,uint64,uint64)"}],"docsPath":"protocol/docs/execution-shapes/reti-stake-algo.md"},{"shapeKey":"mainnet:reti:v1:unstake:algo","network":"mainnet","protocol":"reti","protocolVersion":"v1","action":"unstake","variant":"algo","shapeVersion":"1.0.0","title":"Réti ALGO unstake from pool","description":"Removes ALGO stake from a Réti staking pool via StakingPool.removeStake. Builds gas ×2, removeStake, and optional reward-token opt-in. Partial unstake must leave at least minEntryStake (or unstake the full balance).","summary":"Removes ALGO stake from a Réti staking pool via StakingPool.removeStake. Builds gas ×2, removeStake, and optional reward-token opt-in. Partial unstake must leave at least minEntryStake (or unstake the full balance).","opportunityRole":"exit","supportedOpportunityTypes":["staking"],"requiredInputs":["userAddress","validatorId","poolAppId","amount"],"sources":[{"kind":"arc56","description":"algorandfoundation/reti StakingPool.removeStake(address,uint64)void"}],"docsPath":"protocol/docs/execution-shapes/reti-unstake-algo.md"}],"meta":{"paymentRequired":false,"shapeCount":42,"note":"Catalog metadata only. Compile unsigned groups via paid POST /execution/quotes."}}