@avalabs/fusion-sdk 0.22.0 → 0.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/constants.cjs +1 -1
- package/dist/constants.cjs.map +1 -1
- package/dist/constants.d.cts +9 -1
- package/dist/constants.d.ts +9 -1
- package/dist/constants.js +1 -1
- package/dist/constants.js.map +1 -1
- package/dist/transfer-service/markr/recurring/_frequency.cjs.map +1 -1
- package/dist/transfer-service/markr/recurring/_frequency.d.cts +1 -1
- package/dist/transfer-service/markr/recurring/_frequency.d.ts +1 -1
- package/dist/transfer-service/markr/recurring/_frequency.js.map +1 -1
- package/dist/transfer-service/markr/recurring/_namespace.cjs +1 -1
- package/dist/transfer-service/markr/recurring/_namespace.cjs.map +1 -1
- package/dist/transfer-service/markr/recurring/_namespace.js +1 -1
- package/dist/transfer-service/markr/recurring/_namespace.js.map +1 -1
- package/dist/transfer-service/markr/recurring/types.cjs.map +1 -1
- package/dist/transfer-service/markr/recurring/types.d.cts +16 -0
- package/dist/transfer-service/markr/recurring/types.d.ts +16 -0
- package/dist/transfer-service/markr/recurring/types.js.map +1 -1
- package/dist/types/transfer.d.cts +8 -0
- package/dist/types/transfer.d.ts +8 -0
- package/package.json +3 -3
package/dist/constants.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
let e=function(e){return e.DEV=`dev`,e.PROD=`production`,e.TEST=`test`,e}({}),t=function(e){return e.NATIVE=`native`,e.ERC20=`erc20`,e.SPL=`spl`,e}({}),n=function(e){return e.AVALANCHE_CCT=`avalanche-cct`,e.AVALANCHE_EVM=`avalanche-evm`,e.LOMBARD_BTC_TO_BTCB=`lombard-btc-to-btcb`,e.LOMBARD_BTCB_TO_BTC=`lombard-btcb-to-btc`,e.MARKR=`markr`,e.WRAP_UNWRAP=`wrap-unwrap`,e}({});const r=[n.LOMBARD_BTCB_TO_BTC,n.LOMBARD_BTC_TO_BTCB],i=[n.AVALANCHE_EVM,n.WRAP_UNWRAP];let a=function(e){return e.AddressOwnership=`address-ownership`,e.AllowanceApproval=`allowance-approval`,e.AvalancheCrossChainExport=`avalanche-cross-chain-export`,e.AvalancheCrossChainImport=`avalanche-cross-chain-import`,e.TokensTransfer=`tokens-transfer`,e.WrapToken=`wrap-token`,e.HyperliquidAuthorize=`hyperliquid-authorize`,e.HyperliquidSendAsset=`hyperliquid-send-asset`,e}({}),o=function(e){return e.FUJI=`eip155:43113`,e.MAINNET=`eip155:43114`,e}({}),s=function(e){return e.MAINNET=`eip155:1`,e.SEPOLIA=`eip155:11155111`,e}({}),c=function(e){return e.MAINNET=`bip122:000000000019d6689c085ae165831e93`,e.TESTNET=`bip122:000000000933ea01ad0ee984209779ba`,e}({}),l=function(e){return e.MAINNET=`solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp`,e.DEVNET=`solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1`,e}({}),u=function(e){return e.MAINNET=`eip155:1337`,e}({});const d={C:o.MAINNET,P:`avax:Rr9hnPVPxuUvrdCul-vjEsU1zmqKqRDo`,X:`avax:imji8papUf2EhV3le337w1vgFauqkJg-`},f={C:o.FUJI,P:`avax:Sj7NVE3jXTbJvwFAiu7OEUo_8g8ctXMG`,X:`avax:8AJTpRj3SAqv1e80Mtl9em08LhvKEbkl`},p={C:`2q9e4r6Mu3U68nU1fYjgbR6JvwrRx36CohpAX5UQxse55x1Q5`,P:`11111111111111111111111111111111LpoYY`,X:`2oYMBNV4eNHyqk2fjjV5nVQLDbtmNJzq5s3qs3Lo6ftnC6FByM`},m={C:`yH8D7ThNJkxmtkuv2jgBa4P1Rn3Qpr4pPr7QYNfcdoS6k6HWp`,P:`11111111111111111111111111111111LpoYY`,X:`2JVSBoinj9C2J33VntvzYtVJNZdN2NKiwwKjcumHUWEb5DbBrm`},h={mainnet:{[d.C]:p.C,[d.P]:p.P,[d.X]:p.X},fuji:{[f.C]:m.C,[f.P]:m.P,[f.X]:m.X}},g={chainId:o.FUJI,chainName:`Avalanche Fuji (C-Chain)`,networkToken:{type:t.NATIVE,name:`AVAX`,symbol:`AVAX`,decimals:18},rpcUrl:`https://api.avax-test.network/ext/bc/C/rpc`},_={chainId:o.MAINNET,chainName:`Avalanche Mainnet (C-Chain)`,rpcUrl:`https://api.avax.network/ext/bc/C/rpc`,networkToken:{type:t.NATIVE,name:`AVAX`,symbol:`AVAX`,decimals:18}},v={chainId:d.P,chainName:`Avalanche Mainnet (P-Chain)`,rpcUrl:`https://api.avax.network/ext/bc/P`,networkToken:{type:t.NATIVE,name:`AVAX`,symbol:`AVAX`,decimals:9}},y={chainId:f.P,chainName:`Avalanche Fuji (P-Chain)`,rpcUrl:`https://api.avax-test.network/ext/bc/P`,networkToken:{type:t.NATIVE,name:`AVAX`,symbol:`AVAX`,decimals:9}},b={chainId:d.X,chainName:`Avalanche Mainnet (X-Chain)`,rpcUrl:`https://api.avax.network/ext/bc/X`,networkToken:{type:t.NATIVE,name:`AVAX`,symbol:`AVAX`,decimals:9}},x={chainId:f.X,chainName:`Avalanche Fuji (X-Chain)`,rpcUrl:`https://api.avax-test.network/ext/bc/X`,networkToken:{type:t.NATIVE,name:`AVAX`,symbol:`AVAX`,decimals:9}},S={chainId:s.SEPOLIA,chainName:`Ethereum Sepolia`,rpcUrl:`https://proxy-api.avax.network/proxy/infura/sepolia`,networkToken:{type:t.NATIVE,name:`ETH`,symbol:`ETH`,decimals:18}},C={chainId:s.MAINNET,chainName:`Ethereum Mainnet`,rpcUrl:`https://proxy-api.avax.network/proxy/infura/mainnet`,networkToken:{type:t.NATIVE,name:`ETH`,symbol:`ETH`,decimals:18}},w={chainId:c.TESTNET,chainName:`Bitcoin Testnet`,rpcUrl:``,networkToken:{type:t.NATIVE,name:`Bitcoin`,symbol:`BTC`,decimals:8}},T={chainId:c.MAINNET,chainName:`Bitcoin Mainnet`,rpcUrl:``,networkToken:{type:t.NATIVE,name:`Bitcoin`,symbol:`BTC`,decimals:8}},E={chainId:l.MAINNET,chainName:`Solana`,rpcUrl:`https://proxy-api.avax.network/proxy/nownodes/sol`,networkToken:{type:t.NATIVE,name:`SOL`,symbol:`SOL`,decimals:9}},D={chainId:l.DEVNET,chainName:`Solana (Devnet)`,rpcUrl:`https://api.devnet.solana.com`,networkToken:{type:t.NATIVE,name:`SOL`,symbol:`SOL`,decimals:9}},O={type:t.NATIVE,name:`Avalanche`,symbol:`AVAX`,decimals:18,logoUri:`https://images.ctfassets.net/gcj8jwzm6086/5VHupNKwnDYJvqMENeV7iJ/fdd6326b7a82c8388e4ee9d4be7062d4/avalanche-avax-logo.svg`},k={type:t.NATIVE,name:`Ether`,symbol:`ETH`,decimals:18,logoUri:`https://images.ctfassets.net/gcj8jwzm6086/6l56QLVZmvacuBfjHBTThP/791d743dd2c526692562780c2325fedf/eth-circle__1_.svg`};let A=function(e){return e.AVALANCHE=`avalanche`,e.BITCOIN=`bitcoin`,e.ETHEREUM=`ethereum`,e.SOLANA=`solana`,e.UNKNOWN=`_unknown`,e}({}),j=function(e){return e[e.AVALANCHE_MAINNET=43114]=`AVALANCHE_MAINNET`,e[e.AVALANCHE_TESTNET=43113]=`AVALANCHE_TESTNET`,e[e.ETHEREUM_HOMESTEAD=1]=`ETHEREUM_HOMESTEAD`,e[e.ETHEREUM_TEST_SEPOLIA=11155111]=`ETHEREUM_TEST_SEPOLIA`,e[e.BITCOIN=0xfffffffffffeb]=`BITCOIN`,e[e.BITCOIN_TESTNET=0xfffffffffffea]=`BITCOIN_TESTNET`,e}({});const M={slow:`low`,normal:`medium`,fast:`high`};exports.AVALANCHE_CAIP2_TO_BLOCKCHAIN_ID_BY_NETWORK=h,exports.AVALANCHE_FUJI_CHAIN=g,exports.AVALANCHE_FUJI_P_CHAIN=y,exports.AVALANCHE_FUJI_X_CHAIN=x,exports.AVALANCHE_MAINNET_CHAIN=_,exports.AVALANCHE_MAINNET_P_CHAIN=v,exports.AVALANCHE_MAINNET_X_CHAIN=b,exports.AvalancheChainIds=o,exports.AvalancheFujiBlockchainChainIds=f,exports.AvalancheFujiBlockchainIds=m,exports.AvalancheMainnetBlockchainChainIds=d,exports.AvalancheMainnetBlockchainIds=p,exports.BITCOIN_MAINNET_CHAIN=T,exports.BITCOIN_TESTNET_CHAIN=w,exports.BTC_SERVICE_TYPES=r,exports.BitcoinChainIds=c,exports.Blockchain=A,exports.ERC_ZERO_ADDRESS=`0x0000000000000000000000000000000000000000`,exports.ETHEREUM_MAINNET_CHAIN=C,exports.ETHEREUM_SEPOLIA_CHAIN=S,exports.EVM_SERVICE_TYPES=i,exports.Environment=e,exports.EthereumChainIds=s,exports.EvmChainId=j,exports.FEE_RATE_TIER_TO_BITCOIN=M,exports.HyperliquidChainIds=u,exports.NATIVE_AVAX=O,exports.NATIVE_ETH=k,exports.NATIVE_SOL_ADDRESS=`11111111111111111111111111111111`,exports.SOLANA_DEVNET_CHAIN=D,exports.SOLANA_MAINNET_CHAIN=E,exports.ServiceType=n,exports.SolanaChainIds=l,exports.TokenType=t,exports.TransferSignatureReason=a;
|
|
1
|
+
let e=function(e){return e.DEV=`dev`,e.PROD=`production`,e.TEST=`test`,e}({}),t=function(e){return e.NATIVE=`native`,e.ERC20=`erc20`,e.SPL=`spl`,e}({}),n=function(e){return e.AVALANCHE_CCT=`avalanche-cct`,e.AVALANCHE_EVM=`avalanche-evm`,e.LOMBARD_BTC_TO_BTCB=`lombard-btc-to-btcb`,e.LOMBARD_BTCB_TO_BTC=`lombard-btcb-to-btc`,e.MARKR=`markr`,e.WRAP_UNWRAP=`wrap-unwrap`,e}({});const r=[n.LOMBARD_BTCB_TO_BTC,n.LOMBARD_BTC_TO_BTCB],i=[n.AVALANCHE_EVM,n.WRAP_UNWRAP];let a=function(e){return e.AddressOwnership=`address-ownership`,e.AllowanceApproval=`allowance-approval`,e.AvalancheCrossChainExport=`avalanche-cross-chain-export`,e.AvalancheCrossChainImport=`avalanche-cross-chain-import`,e.TokensTransfer=`tokens-transfer`,e.WrapToken=`wrap-token`,e.HyperliquidAuthorize=`hyperliquid-authorize`,e.HyperliquidSendAsset=`hyperliquid-send-asset`,e.ScheduleRecurringSwap=`schedule-recurring-swap`,e.PauseRecurringSwap=`pause-recurring-swap`,e.ResumeRecurringSwap=`resume-recurring-swap`,e.CancelRecurringSwap=`cancel-recurring-swap`,e}({}),o=function(e){return e.FUJI=`eip155:43113`,e.MAINNET=`eip155:43114`,e}({}),s=function(e){return e.MAINNET=`eip155:1`,e.SEPOLIA=`eip155:11155111`,e}({}),c=function(e){return e.MAINNET=`bip122:000000000019d6689c085ae165831e93`,e.TESTNET=`bip122:000000000933ea01ad0ee984209779ba`,e}({}),l=function(e){return e.MAINNET=`solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp`,e.DEVNET=`solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1`,e}({}),u=function(e){return e.MAINNET=`eip155:1337`,e}({});const d={C:o.MAINNET,P:`avax:Rr9hnPVPxuUvrdCul-vjEsU1zmqKqRDo`,X:`avax:imji8papUf2EhV3le337w1vgFauqkJg-`},f={C:o.FUJI,P:`avax:Sj7NVE3jXTbJvwFAiu7OEUo_8g8ctXMG`,X:`avax:8AJTpRj3SAqv1e80Mtl9em08LhvKEbkl`},p={C:`2q9e4r6Mu3U68nU1fYjgbR6JvwrRx36CohpAX5UQxse55x1Q5`,P:`11111111111111111111111111111111LpoYY`,X:`2oYMBNV4eNHyqk2fjjV5nVQLDbtmNJzq5s3qs3Lo6ftnC6FByM`},m={C:`yH8D7ThNJkxmtkuv2jgBa4P1Rn3Qpr4pPr7QYNfcdoS6k6HWp`,P:`11111111111111111111111111111111LpoYY`,X:`2JVSBoinj9C2J33VntvzYtVJNZdN2NKiwwKjcumHUWEb5DbBrm`},h={mainnet:{[d.C]:p.C,[d.P]:p.P,[d.X]:p.X},fuji:{[f.C]:m.C,[f.P]:m.P,[f.X]:m.X}},g={chainId:o.FUJI,chainName:`Avalanche Fuji (C-Chain)`,networkToken:{type:t.NATIVE,name:`AVAX`,symbol:`AVAX`,decimals:18},rpcUrl:`https://api.avax-test.network/ext/bc/C/rpc`},_={chainId:o.MAINNET,chainName:`Avalanche Mainnet (C-Chain)`,rpcUrl:`https://api.avax.network/ext/bc/C/rpc`,networkToken:{type:t.NATIVE,name:`AVAX`,symbol:`AVAX`,decimals:18}},v={chainId:d.P,chainName:`Avalanche Mainnet (P-Chain)`,rpcUrl:`https://api.avax.network/ext/bc/P`,networkToken:{type:t.NATIVE,name:`AVAX`,symbol:`AVAX`,decimals:9}},y={chainId:f.P,chainName:`Avalanche Fuji (P-Chain)`,rpcUrl:`https://api.avax-test.network/ext/bc/P`,networkToken:{type:t.NATIVE,name:`AVAX`,symbol:`AVAX`,decimals:9}},b={chainId:d.X,chainName:`Avalanche Mainnet (X-Chain)`,rpcUrl:`https://api.avax.network/ext/bc/X`,networkToken:{type:t.NATIVE,name:`AVAX`,symbol:`AVAX`,decimals:9}},x={chainId:f.X,chainName:`Avalanche Fuji (X-Chain)`,rpcUrl:`https://api.avax-test.network/ext/bc/X`,networkToken:{type:t.NATIVE,name:`AVAX`,symbol:`AVAX`,decimals:9}},S={chainId:s.SEPOLIA,chainName:`Ethereum Sepolia`,rpcUrl:`https://proxy-api.avax.network/proxy/infura/sepolia`,networkToken:{type:t.NATIVE,name:`ETH`,symbol:`ETH`,decimals:18}},C={chainId:s.MAINNET,chainName:`Ethereum Mainnet`,rpcUrl:`https://proxy-api.avax.network/proxy/infura/mainnet`,networkToken:{type:t.NATIVE,name:`ETH`,symbol:`ETH`,decimals:18}},w={chainId:c.TESTNET,chainName:`Bitcoin Testnet`,rpcUrl:``,networkToken:{type:t.NATIVE,name:`Bitcoin`,symbol:`BTC`,decimals:8}},T={chainId:c.MAINNET,chainName:`Bitcoin Mainnet`,rpcUrl:``,networkToken:{type:t.NATIVE,name:`Bitcoin`,symbol:`BTC`,decimals:8}},E={chainId:l.MAINNET,chainName:`Solana`,rpcUrl:`https://proxy-api.avax.network/proxy/nownodes/sol`,networkToken:{type:t.NATIVE,name:`SOL`,symbol:`SOL`,decimals:9}},D={chainId:l.DEVNET,chainName:`Solana (Devnet)`,rpcUrl:`https://api.devnet.solana.com`,networkToken:{type:t.NATIVE,name:`SOL`,symbol:`SOL`,decimals:9}},O={type:t.NATIVE,name:`Avalanche`,symbol:`AVAX`,decimals:18,logoUri:`https://images.ctfassets.net/gcj8jwzm6086/5VHupNKwnDYJvqMENeV7iJ/fdd6326b7a82c8388e4ee9d4be7062d4/avalanche-avax-logo.svg`},k={type:t.NATIVE,name:`Ether`,symbol:`ETH`,decimals:18,logoUri:`https://images.ctfassets.net/gcj8jwzm6086/6l56QLVZmvacuBfjHBTThP/791d743dd2c526692562780c2325fedf/eth-circle__1_.svg`};let A=function(e){return e.AVALANCHE=`avalanche`,e.BITCOIN=`bitcoin`,e.ETHEREUM=`ethereum`,e.SOLANA=`solana`,e.UNKNOWN=`_unknown`,e}({}),j=function(e){return e[e.AVALANCHE_MAINNET=43114]=`AVALANCHE_MAINNET`,e[e.AVALANCHE_TESTNET=43113]=`AVALANCHE_TESTNET`,e[e.ETHEREUM_HOMESTEAD=1]=`ETHEREUM_HOMESTEAD`,e[e.ETHEREUM_TEST_SEPOLIA=11155111]=`ETHEREUM_TEST_SEPOLIA`,e[e.BITCOIN=0xfffffffffffeb]=`BITCOIN`,e[e.BITCOIN_TESTNET=0xfffffffffffea]=`BITCOIN_TESTNET`,e}({});const M={slow:`low`,normal:`medium`,fast:`high`};exports.AVALANCHE_CAIP2_TO_BLOCKCHAIN_ID_BY_NETWORK=h,exports.AVALANCHE_FUJI_CHAIN=g,exports.AVALANCHE_FUJI_P_CHAIN=y,exports.AVALANCHE_FUJI_X_CHAIN=x,exports.AVALANCHE_MAINNET_CHAIN=_,exports.AVALANCHE_MAINNET_P_CHAIN=v,exports.AVALANCHE_MAINNET_X_CHAIN=b,exports.AvalancheChainIds=o,exports.AvalancheFujiBlockchainChainIds=f,exports.AvalancheFujiBlockchainIds=m,exports.AvalancheMainnetBlockchainChainIds=d,exports.AvalancheMainnetBlockchainIds=p,exports.BITCOIN_MAINNET_CHAIN=T,exports.BITCOIN_TESTNET_CHAIN=w,exports.BTC_SERVICE_TYPES=r,exports.BitcoinChainIds=c,exports.Blockchain=A,exports.ERC_ZERO_ADDRESS=`0x0000000000000000000000000000000000000000`,exports.ETHEREUM_MAINNET_CHAIN=C,exports.ETHEREUM_SEPOLIA_CHAIN=S,exports.EVM_SERVICE_TYPES=i,exports.Environment=e,exports.EthereumChainIds=s,exports.EvmChainId=j,exports.FEE_RATE_TIER_TO_BITCOIN=M,exports.HyperliquidChainIds=u,exports.NATIVE_AVAX=O,exports.NATIVE_ETH=k,exports.NATIVE_SOL_ADDRESS=`11111111111111111111111111111111`,exports.SOLANA_DEVNET_CHAIN=D,exports.SOLANA_MAINNET_CHAIN=E,exports.ServiceType=n,exports.SolanaChainIds=l,exports.TokenType=t,exports.TransferSignatureReason=a;
|
|
2
2
|
//# sourceMappingURL=constants.cjs.map
|
package/dist/constants.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.cjs","names":[],"sources":["../src/constants.ts"],"sourcesContent":["import type { Address as SolAddress } from '@solana/kit';\nimport type { Address as EvmAddress } from 'viem';\nimport type { NativeAsset } from './types/asset';\nimport type { BitcoinFeeRateTier } from './types/bitcoin';\nimport type { Caip2ChainId } from './types/caip';\nimport type { Chain } from './types/chain';\nimport type { FeeRateTier } from './types/fee';\n\nexport enum Environment {\n DEV = 'dev',\n PROD = 'production',\n TEST = 'test',\n}\n\nexport enum TokenType {\n NATIVE = 'native',\n ERC20 = 'erc20',\n SPL = 'spl',\n}\n\nexport enum ServiceType {\n /** Avalanche Cross-chain transfer service. Export/import between C/P/X Avalanche chains. */\n AVALANCHE_CCT = 'avalanche-cct',\n /** Bridge between EVM chains within Avalanche (or EVM-compatible flows). */\n AVALANCHE_EVM = 'avalanche-evm',\n /** Bitcoin → Avalanche. */\n LOMBARD_BTC_TO_BTCB = 'lombard-btc-to-btcb',\n /** Avalanche → Bitcoin. */\n LOMBARD_BTCB_TO_BTC = 'lombard-btcb-to-btc',\n MARKR = 'markr',\n /** Same-chain wrap/unwrap of native ETH ↔ WETH and AVAX ↔ WAVAX. */\n WRAP_UNWRAP = 'wrap-unwrap',\n}\n\nexport const BTC_SERVICE_TYPES: readonly [ServiceType.LOMBARD_BTCB_TO_BTC, ServiceType.LOMBARD_BTC_TO_BTCB] = [\n ServiceType.LOMBARD_BTCB_TO_BTC,\n ServiceType.LOMBARD_BTC_TO_BTCB,\n];\n\nexport const EVM_SERVICE_TYPES: readonly [ServiceType.AVALANCHE_EVM, ServiceType.WRAP_UNWRAP] = [\n ServiceType.AVALANCHE_EVM,\n ServiceType.WRAP_UNWRAP,\n];\n\n/** Reasons for user signatures during execution. */\nexport enum TransferSignatureReason {\n AddressOwnership = 'address-ownership',\n /** ERC-20 allowance approval for router/bridge. */\n AllowanceApproval = 'allowance-approval',\n /** Primary signature for cross-chain export transaction. */\n AvalancheCrossChainExport = 'avalanche-cross-chain-export',\n /** Primary signature for cross-chain import transaction. */\n AvalancheCrossChainImport = 'avalanche-cross-chain-import',\n /** The primary token movement call (swap or bridge submit). */\n TokensTransfer = 'tokens-transfer',\n /** Optional wrap/unwrap step for native token handling. */\n WrapToken = 'wrap-token',\n /** Hyperliquid 2-phase withdrawal: step 1, nonce-mapping authorization (Relay protocol). */\n HyperliquidAuthorize = 'hyperliquid-authorize',\n /** Hyperliquid 2-phase withdrawal: step 2, the `sendAsset` transfer. */\n HyperliquidSendAsset = 'hyperliquid-send-asset',\n}\n\nexport const ERC_ZERO_ADDRESS: EvmAddress = '0x0000000000000000000000000000000000000000';\nexport const NATIVE_SOL_ADDRESS: SolAddress = '11111111111111111111111111111111' as SolAddress;\n\nexport enum AvalancheChainIds {\n FUJI = 'eip155:43113',\n MAINNET = 'eip155:43114',\n}\n\nexport enum EthereumChainIds {\n MAINNET = 'eip155:1',\n SEPOLIA = 'eip155:11155111',\n}\n\nexport enum BitcoinChainIds {\n MAINNET = 'bip122:000000000019d6689c085ae165831e93',\n TESTNET = 'bip122:000000000933ea01ad0ee984209779ba',\n}\n\nexport enum SolanaChainIds {\n MAINNET = 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',\n DEVNET = 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1',\n}\n\n/**\n * Hyperliquid is identified by CAIP-2 `eip155:1337` per Relay's convention.\n * It's an EVM-namespaced chain ID but has no real EVM execution — withdrawals\n * use a two-signature EIP-712 flow against Hyperliquid's `/exchange` API.\n */\nexport enum HyperliquidChainIds {\n MAINNET = 'eip155:1337',\n}\n\nexport type AvalancheBlockchainAlias = 'C' | 'P' | 'X';\n\nexport const AvalancheMainnetBlockchainChainIds: Readonly<Record<AvalancheBlockchainAlias, Caip2ChainId>> = {\n C: AvalancheChainIds.MAINNET,\n P: 'avax:Rr9hnPVPxuUvrdCul-vjEsU1zmqKqRDo',\n X: 'avax:imji8papUf2EhV3le337w1vgFauqkJg-',\n};\n\nexport const AvalancheFujiBlockchainChainIds: Readonly<Record<AvalancheBlockchainAlias, Caip2ChainId>> = {\n C: AvalancheChainIds.FUJI,\n P: 'avax:Sj7NVE3jXTbJvwFAiu7OEUo_8g8ctXMG',\n X: 'avax:8AJTpRj3SAqv1e80Mtl9em08LhvKEbkl',\n};\n\nexport const AvalancheMainnetBlockchainIds: Readonly<Record<AvalancheBlockchainAlias, string>> = {\n C: '2q9e4r6Mu3U68nU1fYjgbR6JvwrRx36CohpAX5UQxse55x1Q5',\n P: '11111111111111111111111111111111LpoYY',\n X: '2oYMBNV4eNHyqk2fjjV5nVQLDbtmNJzq5s3qs3Lo6ftnC6FByM',\n};\n\nexport const AvalancheFujiBlockchainIds: Readonly<Record<AvalancheBlockchainAlias, string>> = {\n C: 'yH8D7ThNJkxmtkuv2jgBa4P1Rn3Qpr4pPr7QYNfcdoS6k6HWp',\n P: '11111111111111111111111111111111LpoYY',\n X: '2JVSBoinj9C2J33VntvzYtVJNZdN2NKiwwKjcumHUWEb5DbBrm',\n};\n\nexport const AVALANCHE_CAIP2_TO_BLOCKCHAIN_ID_BY_NETWORK: Readonly<{\n mainnet: Readonly<Record<Caip2ChainId, string>>;\n fuji: Readonly<Record<Caip2ChainId, string>>;\n}> = {\n mainnet: {\n [AvalancheMainnetBlockchainChainIds.C]: AvalancheMainnetBlockchainIds.C,\n [AvalancheMainnetBlockchainChainIds.P]: AvalancheMainnetBlockchainIds.P,\n [AvalancheMainnetBlockchainChainIds.X]: AvalancheMainnetBlockchainIds.X,\n },\n fuji: {\n [AvalancheFujiBlockchainChainIds.C]: AvalancheFujiBlockchainIds.C,\n [AvalancheFujiBlockchainChainIds.P]: AvalancheFujiBlockchainIds.P,\n [AvalancheFujiBlockchainChainIds.X]: AvalancheFujiBlockchainIds.X,\n },\n};\n\nexport const AVALANCHE_FUJI_CHAIN: Chain = {\n chainId: AvalancheChainIds.FUJI,\n chainName: 'Avalanche Fuji (C-Chain)',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'AVAX',\n symbol: 'AVAX',\n decimals: 18,\n },\n rpcUrl: 'https://api.avax-test.network/ext/bc/C/rpc',\n};\n\nexport const AVALANCHE_MAINNET_CHAIN: Chain = {\n chainId: AvalancheChainIds.MAINNET,\n chainName: 'Avalanche Mainnet (C-Chain)',\n rpcUrl: 'https://api.avax.network/ext/bc/C/rpc',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'AVAX',\n symbol: 'AVAX',\n decimals: 18,\n },\n};\n\nexport const AVALANCHE_MAINNET_P_CHAIN: Chain = {\n chainId: AvalancheMainnetBlockchainChainIds.P,\n chainName: 'Avalanche Mainnet (P-Chain)',\n rpcUrl: 'https://api.avax.network/ext/bc/P',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'AVAX',\n symbol: 'AVAX',\n decimals: 9,\n },\n};\n\nexport const AVALANCHE_FUJI_P_CHAIN: Chain = {\n chainId: AvalancheFujiBlockchainChainIds.P,\n chainName: 'Avalanche Fuji (P-Chain)',\n rpcUrl: 'https://api.avax-test.network/ext/bc/P',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'AVAX',\n symbol: 'AVAX',\n decimals: 9,\n },\n};\n\nexport const AVALANCHE_MAINNET_X_CHAIN: Chain = {\n chainId: AvalancheMainnetBlockchainChainIds.X,\n chainName: 'Avalanche Mainnet (X-Chain)',\n rpcUrl: 'https://api.avax.network/ext/bc/X',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'AVAX',\n symbol: 'AVAX',\n decimals: 9,\n },\n};\n\nexport const AVALANCHE_FUJI_X_CHAIN: Chain = {\n chainId: AvalancheFujiBlockchainChainIds.X,\n chainName: 'Avalanche Fuji (X-Chain)',\n rpcUrl: 'https://api.avax-test.network/ext/bc/X',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'AVAX',\n symbol: 'AVAX',\n decimals: 9,\n },\n};\n\nexport const ETHEREUM_SEPOLIA_CHAIN: Chain = {\n chainId: EthereumChainIds.SEPOLIA,\n chainName: 'Ethereum Sepolia',\n rpcUrl: 'https://proxy-api.avax.network/proxy/infura/sepolia',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'ETH',\n symbol: 'ETH',\n decimals: 18,\n },\n};\n\nexport const ETHEREUM_MAINNET_CHAIN: Chain = {\n chainId: EthereumChainIds.MAINNET,\n chainName: 'Ethereum Mainnet',\n rpcUrl: 'https://proxy-api.avax.network/proxy/infura/mainnet',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'ETH',\n symbol: 'ETH',\n decimals: 18,\n },\n};\n\nexport const BITCOIN_TESTNET_CHAIN: Chain = {\n chainId: BitcoinChainIds.TESTNET,\n chainName: 'Bitcoin Testnet',\n rpcUrl: '',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'Bitcoin',\n symbol: 'BTC',\n decimals: 8,\n },\n};\n\nexport const BITCOIN_MAINNET_CHAIN: Chain = {\n chainId: BitcoinChainIds.MAINNET,\n chainName: 'Bitcoin Mainnet',\n rpcUrl: '',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'Bitcoin',\n symbol: 'BTC',\n decimals: 8,\n },\n};\n\nexport const SOLANA_MAINNET_CHAIN: Chain = {\n chainId: SolanaChainIds.MAINNET,\n chainName: 'Solana',\n rpcUrl: 'https://proxy-api.avax.network/proxy/nownodes/sol',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'SOL',\n symbol: 'SOL',\n decimals: 9,\n },\n};\n\nexport const SOLANA_DEVNET_CHAIN: Chain = {\n chainId: SolanaChainIds.DEVNET,\n chainName: 'Solana (Devnet)',\n rpcUrl: 'https://api.devnet.solana.com',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'SOL',\n symbol: 'SOL',\n decimals: 9,\n },\n};\nexport const NATIVE_AVAX: NativeAsset = {\n type: TokenType.NATIVE,\n name: 'Avalanche',\n symbol: 'AVAX',\n decimals: 18,\n logoUri:\n 'https://images.ctfassets.net/gcj8jwzm6086/5VHupNKwnDYJvqMENeV7iJ/fdd6326b7a82c8388e4ee9d4be7062d4/avalanche-avax-logo.svg',\n};\nexport const NATIVE_ETH: NativeAsset = {\n type: TokenType.NATIVE,\n name: 'Ether',\n symbol: 'ETH',\n decimals: 18,\n logoUri:\n 'https://images.ctfassets.net/gcj8jwzm6086/6l56QLVZmvacuBfjHBTThP/791d743dd2c526692562780c2325fedf/eth-circle__1_.svg',\n};\n\nexport enum Blockchain {\n AVALANCHE = 'avalanche',\n BITCOIN = 'bitcoin',\n ETHEREUM = 'ethereum',\n SOLANA = 'solana',\n UNKNOWN = '_unknown',\n}\n\nexport enum EvmChainId {\n AVALANCHE_MAINNET = 43114,\n AVALANCHE_TESTNET = 43113,\n ETHEREUM_HOMESTEAD = 1,\n ETHEREUM_TEST_SEPOLIA = 11155111,\n /**\n * This is not a real chain ID, as Bitcoin does not have a chain ID.\n * It is used internally to represent Bitcoin in a way that avoids\n * conflicts with real EVM chain IDs.\n */\n BITCOIN = 4_503_599_627_370_476 - 1,\n /**\n * This is not a real chain ID, as Bitcoin does not have a chain ID.\n * It is used internally to represent Bitcoin in a way that avoids\n * conflicts with real EVM chain IDs.\n */\n BITCOIN_TESTNET = 4_503_599_627_370_476 - 2,\n}\n\n/**\n * Maps the unified {@link FeeRateTier} to the Bitcoin-specific\n * {@link BitcoinFeeRateTier} (`low | medium | high`).\n */\nexport const FEE_RATE_TIER_TO_BITCOIN: Record<FeeRateTier, BitcoinFeeRateTier> = {\n slow: 'low',\n normal: 'medium',\n fast: 'high',\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"constants.cjs","names":[],"sources":["../src/constants.ts"],"sourcesContent":["import type { Address as SolAddress } from '@solana/kit';\nimport type { Address as EvmAddress } from 'viem';\nimport type { NativeAsset } from './types/asset';\nimport type { BitcoinFeeRateTier } from './types/bitcoin';\nimport type { Caip2ChainId } from './types/caip';\nimport type { Chain } from './types/chain';\nimport type { FeeRateTier } from './types/fee';\n\nexport enum Environment {\n DEV = 'dev',\n PROD = 'production',\n TEST = 'test',\n}\n\nexport enum TokenType {\n NATIVE = 'native',\n ERC20 = 'erc20',\n SPL = 'spl',\n}\n\nexport enum ServiceType {\n /** Avalanche Cross-chain transfer service. Export/import between C/P/X Avalanche chains. */\n AVALANCHE_CCT = 'avalanche-cct',\n /** Bridge between EVM chains within Avalanche (or EVM-compatible flows). */\n AVALANCHE_EVM = 'avalanche-evm',\n /** Bitcoin → Avalanche. */\n LOMBARD_BTC_TO_BTCB = 'lombard-btc-to-btcb',\n /** Avalanche → Bitcoin. */\n LOMBARD_BTCB_TO_BTC = 'lombard-btcb-to-btc',\n MARKR = 'markr',\n /** Same-chain wrap/unwrap of native ETH ↔ WETH and AVAX ↔ WAVAX. */\n WRAP_UNWRAP = 'wrap-unwrap',\n}\n\nexport const BTC_SERVICE_TYPES: readonly [ServiceType.LOMBARD_BTCB_TO_BTC, ServiceType.LOMBARD_BTC_TO_BTCB] = [\n ServiceType.LOMBARD_BTCB_TO_BTC,\n ServiceType.LOMBARD_BTC_TO_BTCB,\n];\n\nexport const EVM_SERVICE_TYPES: readonly [ServiceType.AVALANCHE_EVM, ServiceType.WRAP_UNWRAP] = [\n ServiceType.AVALANCHE_EVM,\n ServiceType.WRAP_UNWRAP,\n];\n\n/** Reasons for user signatures during execution. */\nexport enum TransferSignatureReason {\n AddressOwnership = 'address-ownership',\n /** ERC-20 allowance approval for router/bridge. */\n AllowanceApproval = 'allowance-approval',\n /** Primary signature for cross-chain export transaction. */\n AvalancheCrossChainExport = 'avalanche-cross-chain-export',\n /** Primary signature for cross-chain import transaction. */\n AvalancheCrossChainImport = 'avalanche-cross-chain-import',\n /** The primary token movement call (swap or bridge submit). */\n TokensTransfer = 'tokens-transfer',\n /** Optional wrap/unwrap step for native token handling. */\n WrapToken = 'wrap-token',\n /** Hyperliquid 2-phase withdrawal: step 1, nonce-mapping authorization (Relay protocol). */\n HyperliquidAuthorize = 'hyperliquid-authorize',\n /** Hyperliquid 2-phase withdrawal: step 2, the `sendAsset` transfer. */\n HyperliquidSendAsset = 'hyperliquid-send-asset',\n /** Markr recurring: first-fill swap that schedules the recurring order on-chain. */\n ScheduleRecurringSwap = 'schedule-recurring-swap',\n /** Markr recurring: pause an active schedule (preserves allowance). */\n PauseRecurringSwap = 'pause-recurring-swap',\n /** Markr recurring: resume (unpause) a paused schedule. */\n ResumeRecurringSwap = 'resume-recurring-swap',\n /** Markr recurring: cancel an active or paused schedule. */\n CancelRecurringSwap = 'cancel-recurring-swap',\n}\n\nexport const ERC_ZERO_ADDRESS: EvmAddress = '0x0000000000000000000000000000000000000000';\nexport const NATIVE_SOL_ADDRESS: SolAddress = '11111111111111111111111111111111' as SolAddress;\n\nexport enum AvalancheChainIds {\n FUJI = 'eip155:43113',\n MAINNET = 'eip155:43114',\n}\n\nexport enum EthereumChainIds {\n MAINNET = 'eip155:1',\n SEPOLIA = 'eip155:11155111',\n}\n\nexport enum BitcoinChainIds {\n MAINNET = 'bip122:000000000019d6689c085ae165831e93',\n TESTNET = 'bip122:000000000933ea01ad0ee984209779ba',\n}\n\nexport enum SolanaChainIds {\n MAINNET = 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',\n DEVNET = 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1',\n}\n\n/**\n * Hyperliquid is identified by CAIP-2 `eip155:1337` per Relay's convention.\n * It's an EVM-namespaced chain ID but has no real EVM execution — withdrawals\n * use a two-signature EIP-712 flow against Hyperliquid's `/exchange` API.\n */\nexport enum HyperliquidChainIds {\n MAINNET = 'eip155:1337',\n}\n\nexport type AvalancheBlockchainAlias = 'C' | 'P' | 'X';\n\nexport const AvalancheMainnetBlockchainChainIds: Readonly<Record<AvalancheBlockchainAlias, Caip2ChainId>> = {\n C: AvalancheChainIds.MAINNET,\n P: 'avax:Rr9hnPVPxuUvrdCul-vjEsU1zmqKqRDo',\n X: 'avax:imji8papUf2EhV3le337w1vgFauqkJg-',\n};\n\nexport const AvalancheFujiBlockchainChainIds: Readonly<Record<AvalancheBlockchainAlias, Caip2ChainId>> = {\n C: AvalancheChainIds.FUJI,\n P: 'avax:Sj7NVE3jXTbJvwFAiu7OEUo_8g8ctXMG',\n X: 'avax:8AJTpRj3SAqv1e80Mtl9em08LhvKEbkl',\n};\n\nexport const AvalancheMainnetBlockchainIds: Readonly<Record<AvalancheBlockchainAlias, string>> = {\n C: '2q9e4r6Mu3U68nU1fYjgbR6JvwrRx36CohpAX5UQxse55x1Q5',\n P: '11111111111111111111111111111111LpoYY',\n X: '2oYMBNV4eNHyqk2fjjV5nVQLDbtmNJzq5s3qs3Lo6ftnC6FByM',\n};\n\nexport const AvalancheFujiBlockchainIds: Readonly<Record<AvalancheBlockchainAlias, string>> = {\n C: 'yH8D7ThNJkxmtkuv2jgBa4P1Rn3Qpr4pPr7QYNfcdoS6k6HWp',\n P: '11111111111111111111111111111111LpoYY',\n X: '2JVSBoinj9C2J33VntvzYtVJNZdN2NKiwwKjcumHUWEb5DbBrm',\n};\n\nexport const AVALANCHE_CAIP2_TO_BLOCKCHAIN_ID_BY_NETWORK: Readonly<{\n mainnet: Readonly<Record<Caip2ChainId, string>>;\n fuji: Readonly<Record<Caip2ChainId, string>>;\n}> = {\n mainnet: {\n [AvalancheMainnetBlockchainChainIds.C]: AvalancheMainnetBlockchainIds.C,\n [AvalancheMainnetBlockchainChainIds.P]: AvalancheMainnetBlockchainIds.P,\n [AvalancheMainnetBlockchainChainIds.X]: AvalancheMainnetBlockchainIds.X,\n },\n fuji: {\n [AvalancheFujiBlockchainChainIds.C]: AvalancheFujiBlockchainIds.C,\n [AvalancheFujiBlockchainChainIds.P]: AvalancheFujiBlockchainIds.P,\n [AvalancheFujiBlockchainChainIds.X]: AvalancheFujiBlockchainIds.X,\n },\n};\n\nexport const AVALANCHE_FUJI_CHAIN: Chain = {\n chainId: AvalancheChainIds.FUJI,\n chainName: 'Avalanche Fuji (C-Chain)',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'AVAX',\n symbol: 'AVAX',\n decimals: 18,\n },\n rpcUrl: 'https://api.avax-test.network/ext/bc/C/rpc',\n};\n\nexport const AVALANCHE_MAINNET_CHAIN: Chain = {\n chainId: AvalancheChainIds.MAINNET,\n chainName: 'Avalanche Mainnet (C-Chain)',\n rpcUrl: 'https://api.avax.network/ext/bc/C/rpc',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'AVAX',\n symbol: 'AVAX',\n decimals: 18,\n },\n};\n\nexport const AVALANCHE_MAINNET_P_CHAIN: Chain = {\n chainId: AvalancheMainnetBlockchainChainIds.P,\n chainName: 'Avalanche Mainnet (P-Chain)',\n rpcUrl: 'https://api.avax.network/ext/bc/P',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'AVAX',\n symbol: 'AVAX',\n decimals: 9,\n },\n};\n\nexport const AVALANCHE_FUJI_P_CHAIN: Chain = {\n chainId: AvalancheFujiBlockchainChainIds.P,\n chainName: 'Avalanche Fuji (P-Chain)',\n rpcUrl: 'https://api.avax-test.network/ext/bc/P',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'AVAX',\n symbol: 'AVAX',\n decimals: 9,\n },\n};\n\nexport const AVALANCHE_MAINNET_X_CHAIN: Chain = {\n chainId: AvalancheMainnetBlockchainChainIds.X,\n chainName: 'Avalanche Mainnet (X-Chain)',\n rpcUrl: 'https://api.avax.network/ext/bc/X',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'AVAX',\n symbol: 'AVAX',\n decimals: 9,\n },\n};\n\nexport const AVALANCHE_FUJI_X_CHAIN: Chain = {\n chainId: AvalancheFujiBlockchainChainIds.X,\n chainName: 'Avalanche Fuji (X-Chain)',\n rpcUrl: 'https://api.avax-test.network/ext/bc/X',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'AVAX',\n symbol: 'AVAX',\n decimals: 9,\n },\n};\n\nexport const ETHEREUM_SEPOLIA_CHAIN: Chain = {\n chainId: EthereumChainIds.SEPOLIA,\n chainName: 'Ethereum Sepolia',\n rpcUrl: 'https://proxy-api.avax.network/proxy/infura/sepolia',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'ETH',\n symbol: 'ETH',\n decimals: 18,\n },\n};\n\nexport const ETHEREUM_MAINNET_CHAIN: Chain = {\n chainId: EthereumChainIds.MAINNET,\n chainName: 'Ethereum Mainnet',\n rpcUrl: 'https://proxy-api.avax.network/proxy/infura/mainnet',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'ETH',\n symbol: 'ETH',\n decimals: 18,\n },\n};\n\nexport const BITCOIN_TESTNET_CHAIN: Chain = {\n chainId: BitcoinChainIds.TESTNET,\n chainName: 'Bitcoin Testnet',\n rpcUrl: '',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'Bitcoin',\n symbol: 'BTC',\n decimals: 8,\n },\n};\n\nexport const BITCOIN_MAINNET_CHAIN: Chain = {\n chainId: BitcoinChainIds.MAINNET,\n chainName: 'Bitcoin Mainnet',\n rpcUrl: '',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'Bitcoin',\n symbol: 'BTC',\n decimals: 8,\n },\n};\n\nexport const SOLANA_MAINNET_CHAIN: Chain = {\n chainId: SolanaChainIds.MAINNET,\n chainName: 'Solana',\n rpcUrl: 'https://proxy-api.avax.network/proxy/nownodes/sol',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'SOL',\n symbol: 'SOL',\n decimals: 9,\n },\n};\n\nexport const SOLANA_DEVNET_CHAIN: Chain = {\n chainId: SolanaChainIds.DEVNET,\n chainName: 'Solana (Devnet)',\n rpcUrl: 'https://api.devnet.solana.com',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'SOL',\n symbol: 'SOL',\n decimals: 9,\n },\n};\nexport const NATIVE_AVAX: NativeAsset = {\n type: TokenType.NATIVE,\n name: 'Avalanche',\n symbol: 'AVAX',\n decimals: 18,\n logoUri:\n 'https://images.ctfassets.net/gcj8jwzm6086/5VHupNKwnDYJvqMENeV7iJ/fdd6326b7a82c8388e4ee9d4be7062d4/avalanche-avax-logo.svg',\n};\nexport const NATIVE_ETH: NativeAsset = {\n type: TokenType.NATIVE,\n name: 'Ether',\n symbol: 'ETH',\n decimals: 18,\n logoUri:\n 'https://images.ctfassets.net/gcj8jwzm6086/6l56QLVZmvacuBfjHBTThP/791d743dd2c526692562780c2325fedf/eth-circle__1_.svg',\n};\n\nexport enum Blockchain {\n AVALANCHE = 'avalanche',\n BITCOIN = 'bitcoin',\n ETHEREUM = 'ethereum',\n SOLANA = 'solana',\n UNKNOWN = '_unknown',\n}\n\nexport enum EvmChainId {\n AVALANCHE_MAINNET = 43114,\n AVALANCHE_TESTNET = 43113,\n ETHEREUM_HOMESTEAD = 1,\n ETHEREUM_TEST_SEPOLIA = 11155111,\n /**\n * This is not a real chain ID, as Bitcoin does not have a chain ID.\n * It is used internally to represent Bitcoin in a way that avoids\n * conflicts with real EVM chain IDs.\n */\n BITCOIN = 4_503_599_627_370_476 - 1,\n /**\n * This is not a real chain ID, as Bitcoin does not have a chain ID.\n * It is used internally to represent Bitcoin in a way that avoids\n * conflicts with real EVM chain IDs.\n */\n BITCOIN_TESTNET = 4_503_599_627_370_476 - 2,\n}\n\n/**\n * Maps the unified {@link FeeRateTier} to the Bitcoin-specific\n * {@link BitcoinFeeRateTier} (`low | medium | high`).\n */\nexport const FEE_RATE_TIER_TO_BITCOIN: Record<FeeRateTier, BitcoinFeeRateTier> = {\n slow: 'low',\n normal: 'medium',\n fast: 'high',\n};\n"],"mappings":"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"}
|
package/dist/constants.d.cts
CHANGED
|
@@ -48,7 +48,15 @@ declare enum TransferSignatureReason {
|
|
|
48
48
|
/** Hyperliquid 2-phase withdrawal: step 1, nonce-mapping authorization (Relay protocol). */
|
|
49
49
|
HyperliquidAuthorize = "hyperliquid-authorize",
|
|
50
50
|
/** Hyperliquid 2-phase withdrawal: step 2, the `sendAsset` transfer. */
|
|
51
|
-
HyperliquidSendAsset = "hyperliquid-send-asset"
|
|
51
|
+
HyperliquidSendAsset = "hyperliquid-send-asset",
|
|
52
|
+
/** Markr recurring: first-fill swap that schedules the recurring order on-chain. */
|
|
53
|
+
ScheduleRecurringSwap = "schedule-recurring-swap",
|
|
54
|
+
/** Markr recurring: pause an active schedule (preserves allowance). */
|
|
55
|
+
PauseRecurringSwap = "pause-recurring-swap",
|
|
56
|
+
/** Markr recurring: resume (unpause) a paused schedule. */
|
|
57
|
+
ResumeRecurringSwap = "resume-recurring-swap",
|
|
58
|
+
/** Markr recurring: cancel an active or paused schedule. */
|
|
59
|
+
CancelRecurringSwap = "cancel-recurring-swap"
|
|
52
60
|
}
|
|
53
61
|
declare const ERC_ZERO_ADDRESS: Address;
|
|
54
62
|
declare const NATIVE_SOL_ADDRESS: Address$1;
|
package/dist/constants.d.ts
CHANGED
|
@@ -48,7 +48,15 @@ declare enum TransferSignatureReason {
|
|
|
48
48
|
/** Hyperliquid 2-phase withdrawal: step 1, nonce-mapping authorization (Relay protocol). */
|
|
49
49
|
HyperliquidAuthorize = "hyperliquid-authorize",
|
|
50
50
|
/** Hyperliquid 2-phase withdrawal: step 2, the `sendAsset` transfer. */
|
|
51
|
-
HyperliquidSendAsset = "hyperliquid-send-asset"
|
|
51
|
+
HyperliquidSendAsset = "hyperliquid-send-asset",
|
|
52
|
+
/** Markr recurring: first-fill swap that schedules the recurring order on-chain. */
|
|
53
|
+
ScheduleRecurringSwap = "schedule-recurring-swap",
|
|
54
|
+
/** Markr recurring: pause an active schedule (preserves allowance). */
|
|
55
|
+
PauseRecurringSwap = "pause-recurring-swap",
|
|
56
|
+
/** Markr recurring: resume (unpause) a paused schedule. */
|
|
57
|
+
ResumeRecurringSwap = "resume-recurring-swap",
|
|
58
|
+
/** Markr recurring: cancel an active or paused schedule. */
|
|
59
|
+
CancelRecurringSwap = "cancel-recurring-swap"
|
|
52
60
|
}
|
|
53
61
|
declare const ERC_ZERO_ADDRESS: Address;
|
|
54
62
|
declare const NATIVE_SOL_ADDRESS: Address$1;
|
package/dist/constants.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
let e=function(e){return e.DEV=`dev`,e.PROD=`production`,e.TEST=`test`,e}({}),t=function(e){return e.NATIVE=`native`,e.ERC20=`erc20`,e.SPL=`spl`,e}({}),n=function(e){return e.AVALANCHE_CCT=`avalanche-cct`,e.AVALANCHE_EVM=`avalanche-evm`,e.LOMBARD_BTC_TO_BTCB=`lombard-btc-to-btcb`,e.LOMBARD_BTCB_TO_BTC=`lombard-btcb-to-btc`,e.MARKR=`markr`,e.WRAP_UNWRAP=`wrap-unwrap`,e}({});const r=[n.LOMBARD_BTCB_TO_BTC,n.LOMBARD_BTC_TO_BTCB],i=[n.AVALANCHE_EVM,n.WRAP_UNWRAP];let a=function(e){return e.AddressOwnership=`address-ownership`,e.AllowanceApproval=`allowance-approval`,e.AvalancheCrossChainExport=`avalanche-cross-chain-export`,e.AvalancheCrossChainImport=`avalanche-cross-chain-import`,e.TokensTransfer=`tokens-transfer`,e.WrapToken=`wrap-token`,e.HyperliquidAuthorize=`hyperliquid-authorize`,e.HyperliquidSendAsset=`hyperliquid-send-asset`,e}({});const o=`0x0000000000000000000000000000000000000000`,s=`11111111111111111111111111111111`;let c=function(e){return e.FUJI=`eip155:43113`,e.MAINNET=`eip155:43114`,e}({}),l=function(e){return e.MAINNET=`eip155:1`,e.SEPOLIA=`eip155:11155111`,e}({}),u=function(e){return e.MAINNET=`bip122:000000000019d6689c085ae165831e93`,e.TESTNET=`bip122:000000000933ea01ad0ee984209779ba`,e}({}),d=function(e){return e.MAINNET=`solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp`,e.DEVNET=`solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1`,e}({}),f=function(e){return e.MAINNET=`eip155:1337`,e}({});const p={C:c.MAINNET,P:`avax:Rr9hnPVPxuUvrdCul-vjEsU1zmqKqRDo`,X:`avax:imji8papUf2EhV3le337w1vgFauqkJg-`},m={C:c.FUJI,P:`avax:Sj7NVE3jXTbJvwFAiu7OEUo_8g8ctXMG`,X:`avax:8AJTpRj3SAqv1e80Mtl9em08LhvKEbkl`},h={C:`2q9e4r6Mu3U68nU1fYjgbR6JvwrRx36CohpAX5UQxse55x1Q5`,P:`11111111111111111111111111111111LpoYY`,X:`2oYMBNV4eNHyqk2fjjV5nVQLDbtmNJzq5s3qs3Lo6ftnC6FByM`},g={C:`yH8D7ThNJkxmtkuv2jgBa4P1Rn3Qpr4pPr7QYNfcdoS6k6HWp`,P:`11111111111111111111111111111111LpoYY`,X:`2JVSBoinj9C2J33VntvzYtVJNZdN2NKiwwKjcumHUWEb5DbBrm`},_={mainnet:{[p.C]:h.C,[p.P]:h.P,[p.X]:h.X},fuji:{[m.C]:g.C,[m.P]:g.P,[m.X]:g.X}},v={chainId:c.FUJI,chainName:`Avalanche Fuji (C-Chain)`,networkToken:{type:t.NATIVE,name:`AVAX`,symbol:`AVAX`,decimals:18},rpcUrl:`https://api.avax-test.network/ext/bc/C/rpc`},y={chainId:c.MAINNET,chainName:`Avalanche Mainnet (C-Chain)`,rpcUrl:`https://api.avax.network/ext/bc/C/rpc`,networkToken:{type:t.NATIVE,name:`AVAX`,symbol:`AVAX`,decimals:18}},b={chainId:p.P,chainName:`Avalanche Mainnet (P-Chain)`,rpcUrl:`https://api.avax.network/ext/bc/P`,networkToken:{type:t.NATIVE,name:`AVAX`,symbol:`AVAX`,decimals:9}},x={chainId:m.P,chainName:`Avalanche Fuji (P-Chain)`,rpcUrl:`https://api.avax-test.network/ext/bc/P`,networkToken:{type:t.NATIVE,name:`AVAX`,symbol:`AVAX`,decimals:9}},S={chainId:p.X,chainName:`Avalanche Mainnet (X-Chain)`,rpcUrl:`https://api.avax.network/ext/bc/X`,networkToken:{type:t.NATIVE,name:`AVAX`,symbol:`AVAX`,decimals:9}},C={chainId:m.X,chainName:`Avalanche Fuji (X-Chain)`,rpcUrl:`https://api.avax-test.network/ext/bc/X`,networkToken:{type:t.NATIVE,name:`AVAX`,symbol:`AVAX`,decimals:9}},w={chainId:l.SEPOLIA,chainName:`Ethereum Sepolia`,rpcUrl:`https://proxy-api.avax.network/proxy/infura/sepolia`,networkToken:{type:t.NATIVE,name:`ETH`,symbol:`ETH`,decimals:18}},T={chainId:l.MAINNET,chainName:`Ethereum Mainnet`,rpcUrl:`https://proxy-api.avax.network/proxy/infura/mainnet`,networkToken:{type:t.NATIVE,name:`ETH`,symbol:`ETH`,decimals:18}},E={chainId:u.TESTNET,chainName:`Bitcoin Testnet`,rpcUrl:``,networkToken:{type:t.NATIVE,name:`Bitcoin`,symbol:`BTC`,decimals:8}},D={chainId:u.MAINNET,chainName:`Bitcoin Mainnet`,rpcUrl:``,networkToken:{type:t.NATIVE,name:`Bitcoin`,symbol:`BTC`,decimals:8}},O={chainId:d.MAINNET,chainName:`Solana`,rpcUrl:`https://proxy-api.avax.network/proxy/nownodes/sol`,networkToken:{type:t.NATIVE,name:`SOL`,symbol:`SOL`,decimals:9}},k={chainId:d.DEVNET,chainName:`Solana (Devnet)`,rpcUrl:`https://api.devnet.solana.com`,networkToken:{type:t.NATIVE,name:`SOL`,symbol:`SOL`,decimals:9}},A={type:t.NATIVE,name:`Avalanche`,symbol:`AVAX`,decimals:18,logoUri:`https://images.ctfassets.net/gcj8jwzm6086/5VHupNKwnDYJvqMENeV7iJ/fdd6326b7a82c8388e4ee9d4be7062d4/avalanche-avax-logo.svg`},j={type:t.NATIVE,name:`Ether`,symbol:`ETH`,decimals:18,logoUri:`https://images.ctfassets.net/gcj8jwzm6086/6l56QLVZmvacuBfjHBTThP/791d743dd2c526692562780c2325fedf/eth-circle__1_.svg`};let M=function(e){return e.AVALANCHE=`avalanche`,e.BITCOIN=`bitcoin`,e.ETHEREUM=`ethereum`,e.SOLANA=`solana`,e.UNKNOWN=`_unknown`,e}({}),N=function(e){return e[e.AVALANCHE_MAINNET=43114]=`AVALANCHE_MAINNET`,e[e.AVALANCHE_TESTNET=43113]=`AVALANCHE_TESTNET`,e[e.ETHEREUM_HOMESTEAD=1]=`ETHEREUM_HOMESTEAD`,e[e.ETHEREUM_TEST_SEPOLIA=11155111]=`ETHEREUM_TEST_SEPOLIA`,e[e.BITCOIN=0xfffffffffffeb]=`BITCOIN`,e[e.BITCOIN_TESTNET=0xfffffffffffea]=`BITCOIN_TESTNET`,e}({});const P={slow:`low`,normal:`medium`,fast:`high`};export{_ as AVALANCHE_CAIP2_TO_BLOCKCHAIN_ID_BY_NETWORK,v as AVALANCHE_FUJI_CHAIN,x as AVALANCHE_FUJI_P_CHAIN,C as AVALANCHE_FUJI_X_CHAIN,y as AVALANCHE_MAINNET_CHAIN,b as AVALANCHE_MAINNET_P_CHAIN,S as AVALANCHE_MAINNET_X_CHAIN,c as AvalancheChainIds,m as AvalancheFujiBlockchainChainIds,g as AvalancheFujiBlockchainIds,p as AvalancheMainnetBlockchainChainIds,h as AvalancheMainnetBlockchainIds,D as BITCOIN_MAINNET_CHAIN,E as BITCOIN_TESTNET_CHAIN,r as BTC_SERVICE_TYPES,u as BitcoinChainIds,M as Blockchain,o as ERC_ZERO_ADDRESS,T as ETHEREUM_MAINNET_CHAIN,w as ETHEREUM_SEPOLIA_CHAIN,i as EVM_SERVICE_TYPES,e as Environment,l as EthereumChainIds,N as EvmChainId,P as FEE_RATE_TIER_TO_BITCOIN,f as HyperliquidChainIds,A as NATIVE_AVAX,j as NATIVE_ETH,s as NATIVE_SOL_ADDRESS,k as SOLANA_DEVNET_CHAIN,O as SOLANA_MAINNET_CHAIN,n as ServiceType,d as SolanaChainIds,t as TokenType,a as TransferSignatureReason};
|
|
1
|
+
let e=function(e){return e.DEV=`dev`,e.PROD=`production`,e.TEST=`test`,e}({}),t=function(e){return e.NATIVE=`native`,e.ERC20=`erc20`,e.SPL=`spl`,e}({}),n=function(e){return e.AVALANCHE_CCT=`avalanche-cct`,e.AVALANCHE_EVM=`avalanche-evm`,e.LOMBARD_BTC_TO_BTCB=`lombard-btc-to-btcb`,e.LOMBARD_BTCB_TO_BTC=`lombard-btcb-to-btc`,e.MARKR=`markr`,e.WRAP_UNWRAP=`wrap-unwrap`,e}({});const r=[n.LOMBARD_BTCB_TO_BTC,n.LOMBARD_BTC_TO_BTCB],i=[n.AVALANCHE_EVM,n.WRAP_UNWRAP];let a=function(e){return e.AddressOwnership=`address-ownership`,e.AllowanceApproval=`allowance-approval`,e.AvalancheCrossChainExport=`avalanche-cross-chain-export`,e.AvalancheCrossChainImport=`avalanche-cross-chain-import`,e.TokensTransfer=`tokens-transfer`,e.WrapToken=`wrap-token`,e.HyperliquidAuthorize=`hyperliquid-authorize`,e.HyperliquidSendAsset=`hyperliquid-send-asset`,e.ScheduleRecurringSwap=`schedule-recurring-swap`,e.PauseRecurringSwap=`pause-recurring-swap`,e.ResumeRecurringSwap=`resume-recurring-swap`,e.CancelRecurringSwap=`cancel-recurring-swap`,e}({});const o=`0x0000000000000000000000000000000000000000`,s=`11111111111111111111111111111111`;let c=function(e){return e.FUJI=`eip155:43113`,e.MAINNET=`eip155:43114`,e}({}),l=function(e){return e.MAINNET=`eip155:1`,e.SEPOLIA=`eip155:11155111`,e}({}),u=function(e){return e.MAINNET=`bip122:000000000019d6689c085ae165831e93`,e.TESTNET=`bip122:000000000933ea01ad0ee984209779ba`,e}({}),d=function(e){return e.MAINNET=`solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp`,e.DEVNET=`solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1`,e}({}),f=function(e){return e.MAINNET=`eip155:1337`,e}({});const p={C:c.MAINNET,P:`avax:Rr9hnPVPxuUvrdCul-vjEsU1zmqKqRDo`,X:`avax:imji8papUf2EhV3le337w1vgFauqkJg-`},m={C:c.FUJI,P:`avax:Sj7NVE3jXTbJvwFAiu7OEUo_8g8ctXMG`,X:`avax:8AJTpRj3SAqv1e80Mtl9em08LhvKEbkl`},h={C:`2q9e4r6Mu3U68nU1fYjgbR6JvwrRx36CohpAX5UQxse55x1Q5`,P:`11111111111111111111111111111111LpoYY`,X:`2oYMBNV4eNHyqk2fjjV5nVQLDbtmNJzq5s3qs3Lo6ftnC6FByM`},g={C:`yH8D7ThNJkxmtkuv2jgBa4P1Rn3Qpr4pPr7QYNfcdoS6k6HWp`,P:`11111111111111111111111111111111LpoYY`,X:`2JVSBoinj9C2J33VntvzYtVJNZdN2NKiwwKjcumHUWEb5DbBrm`},_={mainnet:{[p.C]:h.C,[p.P]:h.P,[p.X]:h.X},fuji:{[m.C]:g.C,[m.P]:g.P,[m.X]:g.X}},v={chainId:c.FUJI,chainName:`Avalanche Fuji (C-Chain)`,networkToken:{type:t.NATIVE,name:`AVAX`,symbol:`AVAX`,decimals:18},rpcUrl:`https://api.avax-test.network/ext/bc/C/rpc`},y={chainId:c.MAINNET,chainName:`Avalanche Mainnet (C-Chain)`,rpcUrl:`https://api.avax.network/ext/bc/C/rpc`,networkToken:{type:t.NATIVE,name:`AVAX`,symbol:`AVAX`,decimals:18}},b={chainId:p.P,chainName:`Avalanche Mainnet (P-Chain)`,rpcUrl:`https://api.avax.network/ext/bc/P`,networkToken:{type:t.NATIVE,name:`AVAX`,symbol:`AVAX`,decimals:9}},x={chainId:m.P,chainName:`Avalanche Fuji (P-Chain)`,rpcUrl:`https://api.avax-test.network/ext/bc/P`,networkToken:{type:t.NATIVE,name:`AVAX`,symbol:`AVAX`,decimals:9}},S={chainId:p.X,chainName:`Avalanche Mainnet (X-Chain)`,rpcUrl:`https://api.avax.network/ext/bc/X`,networkToken:{type:t.NATIVE,name:`AVAX`,symbol:`AVAX`,decimals:9}},C={chainId:m.X,chainName:`Avalanche Fuji (X-Chain)`,rpcUrl:`https://api.avax-test.network/ext/bc/X`,networkToken:{type:t.NATIVE,name:`AVAX`,symbol:`AVAX`,decimals:9}},w={chainId:l.SEPOLIA,chainName:`Ethereum Sepolia`,rpcUrl:`https://proxy-api.avax.network/proxy/infura/sepolia`,networkToken:{type:t.NATIVE,name:`ETH`,symbol:`ETH`,decimals:18}},T={chainId:l.MAINNET,chainName:`Ethereum Mainnet`,rpcUrl:`https://proxy-api.avax.network/proxy/infura/mainnet`,networkToken:{type:t.NATIVE,name:`ETH`,symbol:`ETH`,decimals:18}},E={chainId:u.TESTNET,chainName:`Bitcoin Testnet`,rpcUrl:``,networkToken:{type:t.NATIVE,name:`Bitcoin`,symbol:`BTC`,decimals:8}},D={chainId:u.MAINNET,chainName:`Bitcoin Mainnet`,rpcUrl:``,networkToken:{type:t.NATIVE,name:`Bitcoin`,symbol:`BTC`,decimals:8}},O={chainId:d.MAINNET,chainName:`Solana`,rpcUrl:`https://proxy-api.avax.network/proxy/nownodes/sol`,networkToken:{type:t.NATIVE,name:`SOL`,symbol:`SOL`,decimals:9}},k={chainId:d.DEVNET,chainName:`Solana (Devnet)`,rpcUrl:`https://api.devnet.solana.com`,networkToken:{type:t.NATIVE,name:`SOL`,symbol:`SOL`,decimals:9}},A={type:t.NATIVE,name:`Avalanche`,symbol:`AVAX`,decimals:18,logoUri:`https://images.ctfassets.net/gcj8jwzm6086/5VHupNKwnDYJvqMENeV7iJ/fdd6326b7a82c8388e4ee9d4be7062d4/avalanche-avax-logo.svg`},j={type:t.NATIVE,name:`Ether`,symbol:`ETH`,decimals:18,logoUri:`https://images.ctfassets.net/gcj8jwzm6086/6l56QLVZmvacuBfjHBTThP/791d743dd2c526692562780c2325fedf/eth-circle__1_.svg`};let M=function(e){return e.AVALANCHE=`avalanche`,e.BITCOIN=`bitcoin`,e.ETHEREUM=`ethereum`,e.SOLANA=`solana`,e.UNKNOWN=`_unknown`,e}({}),N=function(e){return e[e.AVALANCHE_MAINNET=43114]=`AVALANCHE_MAINNET`,e[e.AVALANCHE_TESTNET=43113]=`AVALANCHE_TESTNET`,e[e.ETHEREUM_HOMESTEAD=1]=`ETHEREUM_HOMESTEAD`,e[e.ETHEREUM_TEST_SEPOLIA=11155111]=`ETHEREUM_TEST_SEPOLIA`,e[e.BITCOIN=0xfffffffffffeb]=`BITCOIN`,e[e.BITCOIN_TESTNET=0xfffffffffffea]=`BITCOIN_TESTNET`,e}({});const P={slow:`low`,normal:`medium`,fast:`high`};export{_ as AVALANCHE_CAIP2_TO_BLOCKCHAIN_ID_BY_NETWORK,v as AVALANCHE_FUJI_CHAIN,x as AVALANCHE_FUJI_P_CHAIN,C as AVALANCHE_FUJI_X_CHAIN,y as AVALANCHE_MAINNET_CHAIN,b as AVALANCHE_MAINNET_P_CHAIN,S as AVALANCHE_MAINNET_X_CHAIN,c as AvalancheChainIds,m as AvalancheFujiBlockchainChainIds,g as AvalancheFujiBlockchainIds,p as AvalancheMainnetBlockchainChainIds,h as AvalancheMainnetBlockchainIds,D as BITCOIN_MAINNET_CHAIN,E as BITCOIN_TESTNET_CHAIN,r as BTC_SERVICE_TYPES,u as BitcoinChainIds,M as Blockchain,o as ERC_ZERO_ADDRESS,T as ETHEREUM_MAINNET_CHAIN,w as ETHEREUM_SEPOLIA_CHAIN,i as EVM_SERVICE_TYPES,e as Environment,l as EthereumChainIds,N as EvmChainId,P as FEE_RATE_TIER_TO_BITCOIN,f as HyperliquidChainIds,A as NATIVE_AVAX,j as NATIVE_ETH,s as NATIVE_SOL_ADDRESS,k as SOLANA_DEVNET_CHAIN,O as SOLANA_MAINNET_CHAIN,n as ServiceType,d as SolanaChainIds,t as TokenType,a as TransferSignatureReason};
|
|
2
2
|
//# sourceMappingURL=constants.js.map
|
package/dist/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","names":[],"sources":["../src/constants.ts"],"sourcesContent":["import type { Address as SolAddress } from '@solana/kit';\nimport type { Address as EvmAddress } from 'viem';\nimport type { NativeAsset } from './types/asset';\nimport type { BitcoinFeeRateTier } from './types/bitcoin';\nimport type { Caip2ChainId } from './types/caip';\nimport type { Chain } from './types/chain';\nimport type { FeeRateTier } from './types/fee';\n\nexport enum Environment {\n DEV = 'dev',\n PROD = 'production',\n TEST = 'test',\n}\n\nexport enum TokenType {\n NATIVE = 'native',\n ERC20 = 'erc20',\n SPL = 'spl',\n}\n\nexport enum ServiceType {\n /** Avalanche Cross-chain transfer service. Export/import between C/P/X Avalanche chains. */\n AVALANCHE_CCT = 'avalanche-cct',\n /** Bridge between EVM chains within Avalanche (or EVM-compatible flows). */\n AVALANCHE_EVM = 'avalanche-evm',\n /** Bitcoin → Avalanche. */\n LOMBARD_BTC_TO_BTCB = 'lombard-btc-to-btcb',\n /** Avalanche → Bitcoin. */\n LOMBARD_BTCB_TO_BTC = 'lombard-btcb-to-btc',\n MARKR = 'markr',\n /** Same-chain wrap/unwrap of native ETH ↔ WETH and AVAX ↔ WAVAX. */\n WRAP_UNWRAP = 'wrap-unwrap',\n}\n\nexport const BTC_SERVICE_TYPES: readonly [ServiceType.LOMBARD_BTCB_TO_BTC, ServiceType.LOMBARD_BTC_TO_BTCB] = [\n ServiceType.LOMBARD_BTCB_TO_BTC,\n ServiceType.LOMBARD_BTC_TO_BTCB,\n];\n\nexport const EVM_SERVICE_TYPES: readonly [ServiceType.AVALANCHE_EVM, ServiceType.WRAP_UNWRAP] = [\n ServiceType.AVALANCHE_EVM,\n ServiceType.WRAP_UNWRAP,\n];\n\n/** Reasons for user signatures during execution. */\nexport enum TransferSignatureReason {\n AddressOwnership = 'address-ownership',\n /** ERC-20 allowance approval for router/bridge. */\n AllowanceApproval = 'allowance-approval',\n /** Primary signature for cross-chain export transaction. */\n AvalancheCrossChainExport = 'avalanche-cross-chain-export',\n /** Primary signature for cross-chain import transaction. */\n AvalancheCrossChainImport = 'avalanche-cross-chain-import',\n /** The primary token movement call (swap or bridge submit). */\n TokensTransfer = 'tokens-transfer',\n /** Optional wrap/unwrap step for native token handling. */\n WrapToken = 'wrap-token',\n /** Hyperliquid 2-phase withdrawal: step 1, nonce-mapping authorization (Relay protocol). */\n HyperliquidAuthorize = 'hyperliquid-authorize',\n /** Hyperliquid 2-phase withdrawal: step 2, the `sendAsset` transfer. */\n HyperliquidSendAsset = 'hyperliquid-send-asset',\n}\n\nexport const ERC_ZERO_ADDRESS: EvmAddress = '0x0000000000000000000000000000000000000000';\nexport const NATIVE_SOL_ADDRESS: SolAddress = '11111111111111111111111111111111' as SolAddress;\n\nexport enum AvalancheChainIds {\n FUJI = 'eip155:43113',\n MAINNET = 'eip155:43114',\n}\n\nexport enum EthereumChainIds {\n MAINNET = 'eip155:1',\n SEPOLIA = 'eip155:11155111',\n}\n\nexport enum BitcoinChainIds {\n MAINNET = 'bip122:000000000019d6689c085ae165831e93',\n TESTNET = 'bip122:000000000933ea01ad0ee984209779ba',\n}\n\nexport enum SolanaChainIds {\n MAINNET = 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',\n DEVNET = 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1',\n}\n\n/**\n * Hyperliquid is identified by CAIP-2 `eip155:1337` per Relay's convention.\n * It's an EVM-namespaced chain ID but has no real EVM execution — withdrawals\n * use a two-signature EIP-712 flow against Hyperliquid's `/exchange` API.\n */\nexport enum HyperliquidChainIds {\n MAINNET = 'eip155:1337',\n}\n\nexport type AvalancheBlockchainAlias = 'C' | 'P' | 'X';\n\nexport const AvalancheMainnetBlockchainChainIds: Readonly<Record<AvalancheBlockchainAlias, Caip2ChainId>> = {\n C: AvalancheChainIds.MAINNET,\n P: 'avax:Rr9hnPVPxuUvrdCul-vjEsU1zmqKqRDo',\n X: 'avax:imji8papUf2EhV3le337w1vgFauqkJg-',\n};\n\nexport const AvalancheFujiBlockchainChainIds: Readonly<Record<AvalancheBlockchainAlias, Caip2ChainId>> = {\n C: AvalancheChainIds.FUJI,\n P: 'avax:Sj7NVE3jXTbJvwFAiu7OEUo_8g8ctXMG',\n X: 'avax:8AJTpRj3SAqv1e80Mtl9em08LhvKEbkl',\n};\n\nexport const AvalancheMainnetBlockchainIds: Readonly<Record<AvalancheBlockchainAlias, string>> = {\n C: '2q9e4r6Mu3U68nU1fYjgbR6JvwrRx36CohpAX5UQxse55x1Q5',\n P: '11111111111111111111111111111111LpoYY',\n X: '2oYMBNV4eNHyqk2fjjV5nVQLDbtmNJzq5s3qs3Lo6ftnC6FByM',\n};\n\nexport const AvalancheFujiBlockchainIds: Readonly<Record<AvalancheBlockchainAlias, string>> = {\n C: 'yH8D7ThNJkxmtkuv2jgBa4P1Rn3Qpr4pPr7QYNfcdoS6k6HWp',\n P: '11111111111111111111111111111111LpoYY',\n X: '2JVSBoinj9C2J33VntvzYtVJNZdN2NKiwwKjcumHUWEb5DbBrm',\n};\n\nexport const AVALANCHE_CAIP2_TO_BLOCKCHAIN_ID_BY_NETWORK: Readonly<{\n mainnet: Readonly<Record<Caip2ChainId, string>>;\n fuji: Readonly<Record<Caip2ChainId, string>>;\n}> = {\n mainnet: {\n [AvalancheMainnetBlockchainChainIds.C]: AvalancheMainnetBlockchainIds.C,\n [AvalancheMainnetBlockchainChainIds.P]: AvalancheMainnetBlockchainIds.P,\n [AvalancheMainnetBlockchainChainIds.X]: AvalancheMainnetBlockchainIds.X,\n },\n fuji: {\n [AvalancheFujiBlockchainChainIds.C]: AvalancheFujiBlockchainIds.C,\n [AvalancheFujiBlockchainChainIds.P]: AvalancheFujiBlockchainIds.P,\n [AvalancheFujiBlockchainChainIds.X]: AvalancheFujiBlockchainIds.X,\n },\n};\n\nexport const AVALANCHE_FUJI_CHAIN: Chain = {\n chainId: AvalancheChainIds.FUJI,\n chainName: 'Avalanche Fuji (C-Chain)',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'AVAX',\n symbol: 'AVAX',\n decimals: 18,\n },\n rpcUrl: 'https://api.avax-test.network/ext/bc/C/rpc',\n};\n\nexport const AVALANCHE_MAINNET_CHAIN: Chain = {\n chainId: AvalancheChainIds.MAINNET,\n chainName: 'Avalanche Mainnet (C-Chain)',\n rpcUrl: 'https://api.avax.network/ext/bc/C/rpc',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'AVAX',\n symbol: 'AVAX',\n decimals: 18,\n },\n};\n\nexport const AVALANCHE_MAINNET_P_CHAIN: Chain = {\n chainId: AvalancheMainnetBlockchainChainIds.P,\n chainName: 'Avalanche Mainnet (P-Chain)',\n rpcUrl: 'https://api.avax.network/ext/bc/P',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'AVAX',\n symbol: 'AVAX',\n decimals: 9,\n },\n};\n\nexport const AVALANCHE_FUJI_P_CHAIN: Chain = {\n chainId: AvalancheFujiBlockchainChainIds.P,\n chainName: 'Avalanche Fuji (P-Chain)',\n rpcUrl: 'https://api.avax-test.network/ext/bc/P',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'AVAX',\n symbol: 'AVAX',\n decimals: 9,\n },\n};\n\nexport const AVALANCHE_MAINNET_X_CHAIN: Chain = {\n chainId: AvalancheMainnetBlockchainChainIds.X,\n chainName: 'Avalanche Mainnet (X-Chain)',\n rpcUrl: 'https://api.avax.network/ext/bc/X',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'AVAX',\n symbol: 'AVAX',\n decimals: 9,\n },\n};\n\nexport const AVALANCHE_FUJI_X_CHAIN: Chain = {\n chainId: AvalancheFujiBlockchainChainIds.X,\n chainName: 'Avalanche Fuji (X-Chain)',\n rpcUrl: 'https://api.avax-test.network/ext/bc/X',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'AVAX',\n symbol: 'AVAX',\n decimals: 9,\n },\n};\n\nexport const ETHEREUM_SEPOLIA_CHAIN: Chain = {\n chainId: EthereumChainIds.SEPOLIA,\n chainName: 'Ethereum Sepolia',\n rpcUrl: 'https://proxy-api.avax.network/proxy/infura/sepolia',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'ETH',\n symbol: 'ETH',\n decimals: 18,\n },\n};\n\nexport const ETHEREUM_MAINNET_CHAIN: Chain = {\n chainId: EthereumChainIds.MAINNET,\n chainName: 'Ethereum Mainnet',\n rpcUrl: 'https://proxy-api.avax.network/proxy/infura/mainnet',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'ETH',\n symbol: 'ETH',\n decimals: 18,\n },\n};\n\nexport const BITCOIN_TESTNET_CHAIN: Chain = {\n chainId: BitcoinChainIds.TESTNET,\n chainName: 'Bitcoin Testnet',\n rpcUrl: '',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'Bitcoin',\n symbol: 'BTC',\n decimals: 8,\n },\n};\n\nexport const BITCOIN_MAINNET_CHAIN: Chain = {\n chainId: BitcoinChainIds.MAINNET,\n chainName: 'Bitcoin Mainnet',\n rpcUrl: '',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'Bitcoin',\n symbol: 'BTC',\n decimals: 8,\n },\n};\n\nexport const SOLANA_MAINNET_CHAIN: Chain = {\n chainId: SolanaChainIds.MAINNET,\n chainName: 'Solana',\n rpcUrl: 'https://proxy-api.avax.network/proxy/nownodes/sol',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'SOL',\n symbol: 'SOL',\n decimals: 9,\n },\n};\n\nexport const SOLANA_DEVNET_CHAIN: Chain = {\n chainId: SolanaChainIds.DEVNET,\n chainName: 'Solana (Devnet)',\n rpcUrl: 'https://api.devnet.solana.com',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'SOL',\n symbol: 'SOL',\n decimals: 9,\n },\n};\nexport const NATIVE_AVAX: NativeAsset = {\n type: TokenType.NATIVE,\n name: 'Avalanche',\n symbol: 'AVAX',\n decimals: 18,\n logoUri:\n 'https://images.ctfassets.net/gcj8jwzm6086/5VHupNKwnDYJvqMENeV7iJ/fdd6326b7a82c8388e4ee9d4be7062d4/avalanche-avax-logo.svg',\n};\nexport const NATIVE_ETH: NativeAsset = {\n type: TokenType.NATIVE,\n name: 'Ether',\n symbol: 'ETH',\n decimals: 18,\n logoUri:\n 'https://images.ctfassets.net/gcj8jwzm6086/6l56QLVZmvacuBfjHBTThP/791d743dd2c526692562780c2325fedf/eth-circle__1_.svg',\n};\n\nexport enum Blockchain {\n AVALANCHE = 'avalanche',\n BITCOIN = 'bitcoin',\n ETHEREUM = 'ethereum',\n SOLANA = 'solana',\n UNKNOWN = '_unknown',\n}\n\nexport enum EvmChainId {\n AVALANCHE_MAINNET = 43114,\n AVALANCHE_TESTNET = 43113,\n ETHEREUM_HOMESTEAD = 1,\n ETHEREUM_TEST_SEPOLIA = 11155111,\n /**\n * This is not a real chain ID, as Bitcoin does not have a chain ID.\n * It is used internally to represent Bitcoin in a way that avoids\n * conflicts with real EVM chain IDs.\n */\n BITCOIN = 4_503_599_627_370_476 - 1,\n /**\n * This is not a real chain ID, as Bitcoin does not have a chain ID.\n * It is used internally to represent Bitcoin in a way that avoids\n * conflicts with real EVM chain IDs.\n */\n BITCOIN_TESTNET = 4_503_599_627_370_476 - 2,\n}\n\n/**\n * Maps the unified {@link FeeRateTier} to the Bitcoin-specific\n * {@link BitcoinFeeRateTier} (`low | medium | high`).\n */\nexport const FEE_RATE_TIER_TO_BITCOIN: Record<FeeRateTier, BitcoinFeeRateTier> = {\n slow: 'low',\n normal: 'medium',\n fast: 'high',\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"constants.js","names":[],"sources":["../src/constants.ts"],"sourcesContent":["import type { Address as SolAddress } from '@solana/kit';\nimport type { Address as EvmAddress } from 'viem';\nimport type { NativeAsset } from './types/asset';\nimport type { BitcoinFeeRateTier } from './types/bitcoin';\nimport type { Caip2ChainId } from './types/caip';\nimport type { Chain } from './types/chain';\nimport type { FeeRateTier } from './types/fee';\n\nexport enum Environment {\n DEV = 'dev',\n PROD = 'production',\n TEST = 'test',\n}\n\nexport enum TokenType {\n NATIVE = 'native',\n ERC20 = 'erc20',\n SPL = 'spl',\n}\n\nexport enum ServiceType {\n /** Avalanche Cross-chain transfer service. Export/import between C/P/X Avalanche chains. */\n AVALANCHE_CCT = 'avalanche-cct',\n /** Bridge between EVM chains within Avalanche (or EVM-compatible flows). */\n AVALANCHE_EVM = 'avalanche-evm',\n /** Bitcoin → Avalanche. */\n LOMBARD_BTC_TO_BTCB = 'lombard-btc-to-btcb',\n /** Avalanche → Bitcoin. */\n LOMBARD_BTCB_TO_BTC = 'lombard-btcb-to-btc',\n MARKR = 'markr',\n /** Same-chain wrap/unwrap of native ETH ↔ WETH and AVAX ↔ WAVAX. */\n WRAP_UNWRAP = 'wrap-unwrap',\n}\n\nexport const BTC_SERVICE_TYPES: readonly [ServiceType.LOMBARD_BTCB_TO_BTC, ServiceType.LOMBARD_BTC_TO_BTCB] = [\n ServiceType.LOMBARD_BTCB_TO_BTC,\n ServiceType.LOMBARD_BTC_TO_BTCB,\n];\n\nexport const EVM_SERVICE_TYPES: readonly [ServiceType.AVALANCHE_EVM, ServiceType.WRAP_UNWRAP] = [\n ServiceType.AVALANCHE_EVM,\n ServiceType.WRAP_UNWRAP,\n];\n\n/** Reasons for user signatures during execution. */\nexport enum TransferSignatureReason {\n AddressOwnership = 'address-ownership',\n /** ERC-20 allowance approval for router/bridge. */\n AllowanceApproval = 'allowance-approval',\n /** Primary signature for cross-chain export transaction. */\n AvalancheCrossChainExport = 'avalanche-cross-chain-export',\n /** Primary signature for cross-chain import transaction. */\n AvalancheCrossChainImport = 'avalanche-cross-chain-import',\n /** The primary token movement call (swap or bridge submit). */\n TokensTransfer = 'tokens-transfer',\n /** Optional wrap/unwrap step for native token handling. */\n WrapToken = 'wrap-token',\n /** Hyperliquid 2-phase withdrawal: step 1, nonce-mapping authorization (Relay protocol). */\n HyperliquidAuthorize = 'hyperliquid-authorize',\n /** Hyperliquid 2-phase withdrawal: step 2, the `sendAsset` transfer. */\n HyperliquidSendAsset = 'hyperliquid-send-asset',\n /** Markr recurring: first-fill swap that schedules the recurring order on-chain. */\n ScheduleRecurringSwap = 'schedule-recurring-swap',\n /** Markr recurring: pause an active schedule (preserves allowance). */\n PauseRecurringSwap = 'pause-recurring-swap',\n /** Markr recurring: resume (unpause) a paused schedule. */\n ResumeRecurringSwap = 'resume-recurring-swap',\n /** Markr recurring: cancel an active or paused schedule. */\n CancelRecurringSwap = 'cancel-recurring-swap',\n}\n\nexport const ERC_ZERO_ADDRESS: EvmAddress = '0x0000000000000000000000000000000000000000';\nexport const NATIVE_SOL_ADDRESS: SolAddress = '11111111111111111111111111111111' as SolAddress;\n\nexport enum AvalancheChainIds {\n FUJI = 'eip155:43113',\n MAINNET = 'eip155:43114',\n}\n\nexport enum EthereumChainIds {\n MAINNET = 'eip155:1',\n SEPOLIA = 'eip155:11155111',\n}\n\nexport enum BitcoinChainIds {\n MAINNET = 'bip122:000000000019d6689c085ae165831e93',\n TESTNET = 'bip122:000000000933ea01ad0ee984209779ba',\n}\n\nexport enum SolanaChainIds {\n MAINNET = 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',\n DEVNET = 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1',\n}\n\n/**\n * Hyperliquid is identified by CAIP-2 `eip155:1337` per Relay's convention.\n * It's an EVM-namespaced chain ID but has no real EVM execution — withdrawals\n * use a two-signature EIP-712 flow against Hyperliquid's `/exchange` API.\n */\nexport enum HyperliquidChainIds {\n MAINNET = 'eip155:1337',\n}\n\nexport type AvalancheBlockchainAlias = 'C' | 'P' | 'X';\n\nexport const AvalancheMainnetBlockchainChainIds: Readonly<Record<AvalancheBlockchainAlias, Caip2ChainId>> = {\n C: AvalancheChainIds.MAINNET,\n P: 'avax:Rr9hnPVPxuUvrdCul-vjEsU1zmqKqRDo',\n X: 'avax:imji8papUf2EhV3le337w1vgFauqkJg-',\n};\n\nexport const AvalancheFujiBlockchainChainIds: Readonly<Record<AvalancheBlockchainAlias, Caip2ChainId>> = {\n C: AvalancheChainIds.FUJI,\n P: 'avax:Sj7NVE3jXTbJvwFAiu7OEUo_8g8ctXMG',\n X: 'avax:8AJTpRj3SAqv1e80Mtl9em08LhvKEbkl',\n};\n\nexport const AvalancheMainnetBlockchainIds: Readonly<Record<AvalancheBlockchainAlias, string>> = {\n C: '2q9e4r6Mu3U68nU1fYjgbR6JvwrRx36CohpAX5UQxse55x1Q5',\n P: '11111111111111111111111111111111LpoYY',\n X: '2oYMBNV4eNHyqk2fjjV5nVQLDbtmNJzq5s3qs3Lo6ftnC6FByM',\n};\n\nexport const AvalancheFujiBlockchainIds: Readonly<Record<AvalancheBlockchainAlias, string>> = {\n C: 'yH8D7ThNJkxmtkuv2jgBa4P1Rn3Qpr4pPr7QYNfcdoS6k6HWp',\n P: '11111111111111111111111111111111LpoYY',\n X: '2JVSBoinj9C2J33VntvzYtVJNZdN2NKiwwKjcumHUWEb5DbBrm',\n};\n\nexport const AVALANCHE_CAIP2_TO_BLOCKCHAIN_ID_BY_NETWORK: Readonly<{\n mainnet: Readonly<Record<Caip2ChainId, string>>;\n fuji: Readonly<Record<Caip2ChainId, string>>;\n}> = {\n mainnet: {\n [AvalancheMainnetBlockchainChainIds.C]: AvalancheMainnetBlockchainIds.C,\n [AvalancheMainnetBlockchainChainIds.P]: AvalancheMainnetBlockchainIds.P,\n [AvalancheMainnetBlockchainChainIds.X]: AvalancheMainnetBlockchainIds.X,\n },\n fuji: {\n [AvalancheFujiBlockchainChainIds.C]: AvalancheFujiBlockchainIds.C,\n [AvalancheFujiBlockchainChainIds.P]: AvalancheFujiBlockchainIds.P,\n [AvalancheFujiBlockchainChainIds.X]: AvalancheFujiBlockchainIds.X,\n },\n};\n\nexport const AVALANCHE_FUJI_CHAIN: Chain = {\n chainId: AvalancheChainIds.FUJI,\n chainName: 'Avalanche Fuji (C-Chain)',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'AVAX',\n symbol: 'AVAX',\n decimals: 18,\n },\n rpcUrl: 'https://api.avax-test.network/ext/bc/C/rpc',\n};\n\nexport const AVALANCHE_MAINNET_CHAIN: Chain = {\n chainId: AvalancheChainIds.MAINNET,\n chainName: 'Avalanche Mainnet (C-Chain)',\n rpcUrl: 'https://api.avax.network/ext/bc/C/rpc',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'AVAX',\n symbol: 'AVAX',\n decimals: 18,\n },\n};\n\nexport const AVALANCHE_MAINNET_P_CHAIN: Chain = {\n chainId: AvalancheMainnetBlockchainChainIds.P,\n chainName: 'Avalanche Mainnet (P-Chain)',\n rpcUrl: 'https://api.avax.network/ext/bc/P',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'AVAX',\n symbol: 'AVAX',\n decimals: 9,\n },\n};\n\nexport const AVALANCHE_FUJI_P_CHAIN: Chain = {\n chainId: AvalancheFujiBlockchainChainIds.P,\n chainName: 'Avalanche Fuji (P-Chain)',\n rpcUrl: 'https://api.avax-test.network/ext/bc/P',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'AVAX',\n symbol: 'AVAX',\n decimals: 9,\n },\n};\n\nexport const AVALANCHE_MAINNET_X_CHAIN: Chain = {\n chainId: AvalancheMainnetBlockchainChainIds.X,\n chainName: 'Avalanche Mainnet (X-Chain)',\n rpcUrl: 'https://api.avax.network/ext/bc/X',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'AVAX',\n symbol: 'AVAX',\n decimals: 9,\n },\n};\n\nexport const AVALANCHE_FUJI_X_CHAIN: Chain = {\n chainId: AvalancheFujiBlockchainChainIds.X,\n chainName: 'Avalanche Fuji (X-Chain)',\n rpcUrl: 'https://api.avax-test.network/ext/bc/X',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'AVAX',\n symbol: 'AVAX',\n decimals: 9,\n },\n};\n\nexport const ETHEREUM_SEPOLIA_CHAIN: Chain = {\n chainId: EthereumChainIds.SEPOLIA,\n chainName: 'Ethereum Sepolia',\n rpcUrl: 'https://proxy-api.avax.network/proxy/infura/sepolia',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'ETH',\n symbol: 'ETH',\n decimals: 18,\n },\n};\n\nexport const ETHEREUM_MAINNET_CHAIN: Chain = {\n chainId: EthereumChainIds.MAINNET,\n chainName: 'Ethereum Mainnet',\n rpcUrl: 'https://proxy-api.avax.network/proxy/infura/mainnet',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'ETH',\n symbol: 'ETH',\n decimals: 18,\n },\n};\n\nexport const BITCOIN_TESTNET_CHAIN: Chain = {\n chainId: BitcoinChainIds.TESTNET,\n chainName: 'Bitcoin Testnet',\n rpcUrl: '',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'Bitcoin',\n symbol: 'BTC',\n decimals: 8,\n },\n};\n\nexport const BITCOIN_MAINNET_CHAIN: Chain = {\n chainId: BitcoinChainIds.MAINNET,\n chainName: 'Bitcoin Mainnet',\n rpcUrl: '',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'Bitcoin',\n symbol: 'BTC',\n decimals: 8,\n },\n};\n\nexport const SOLANA_MAINNET_CHAIN: Chain = {\n chainId: SolanaChainIds.MAINNET,\n chainName: 'Solana',\n rpcUrl: 'https://proxy-api.avax.network/proxy/nownodes/sol',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'SOL',\n symbol: 'SOL',\n decimals: 9,\n },\n};\n\nexport const SOLANA_DEVNET_CHAIN: Chain = {\n chainId: SolanaChainIds.DEVNET,\n chainName: 'Solana (Devnet)',\n rpcUrl: 'https://api.devnet.solana.com',\n networkToken: {\n type: TokenType.NATIVE,\n name: 'SOL',\n symbol: 'SOL',\n decimals: 9,\n },\n};\nexport const NATIVE_AVAX: NativeAsset = {\n type: TokenType.NATIVE,\n name: 'Avalanche',\n symbol: 'AVAX',\n decimals: 18,\n logoUri:\n 'https://images.ctfassets.net/gcj8jwzm6086/5VHupNKwnDYJvqMENeV7iJ/fdd6326b7a82c8388e4ee9d4be7062d4/avalanche-avax-logo.svg',\n};\nexport const NATIVE_ETH: NativeAsset = {\n type: TokenType.NATIVE,\n name: 'Ether',\n symbol: 'ETH',\n decimals: 18,\n logoUri:\n 'https://images.ctfassets.net/gcj8jwzm6086/6l56QLVZmvacuBfjHBTThP/791d743dd2c526692562780c2325fedf/eth-circle__1_.svg',\n};\n\nexport enum Blockchain {\n AVALANCHE = 'avalanche',\n BITCOIN = 'bitcoin',\n ETHEREUM = 'ethereum',\n SOLANA = 'solana',\n UNKNOWN = '_unknown',\n}\n\nexport enum EvmChainId {\n AVALANCHE_MAINNET = 43114,\n AVALANCHE_TESTNET = 43113,\n ETHEREUM_HOMESTEAD = 1,\n ETHEREUM_TEST_SEPOLIA = 11155111,\n /**\n * This is not a real chain ID, as Bitcoin does not have a chain ID.\n * It is used internally to represent Bitcoin in a way that avoids\n * conflicts with real EVM chain IDs.\n */\n BITCOIN = 4_503_599_627_370_476 - 1,\n /**\n * This is not a real chain ID, as Bitcoin does not have a chain ID.\n * It is used internally to represent Bitcoin in a way that avoids\n * conflicts with real EVM chain IDs.\n */\n BITCOIN_TESTNET = 4_503_599_627_370_476 - 2,\n}\n\n/**\n * Maps the unified {@link FeeRateTier} to the Bitcoin-specific\n * {@link BitcoinFeeRateTier} (`low | medium | high`).\n */\nexport const FEE_RATE_TIER_TO_BITCOIN: Record<FeeRateTier, BitcoinFeeRateTier> = {\n slow: 'low',\n normal: 'medium',\n fast: 'high',\n};\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_frequency.cjs","names":[],"sources":["../../../../src/transfer-service/markr/recurring/_frequency.ts"],"sourcesContent":["import type { RecurringFrequency, RecurringFrequencyUnit } from './types';\n\n/**\n * Seconds-per-unit lookup. The \"month\" entry uses 30 days; Markr's `/recurring/quote`\n * returns the server-derived `intervalSeconds`, so this helper is a client-side\n * estimator (used for the picker's \"below-minimum\" greying), not the source of truth.\n */\nconst SECONDS_BY_UNIT: Readonly<Record<RecurringFrequencyUnit, number>> = {\n minute: 60,\n hour: 3600,\n day: 86_400,\n week: 604_800,\n month: 2_592_000,\n};\n\nexport function deriveIntervalSeconds(frequency: RecurringFrequency): number {\n return SECONDS_BY_UNIT[frequency.unit] * frequency.value;\n}\n\nexport type FrequencyValidationResult =\n | { ok: true; intervalSeconds: number }\n | { ok: false; reason: 'below-minimum' | 'invalid-unit' | 'invalid-value' };\n\n/** Server-enforced upper bound on `RecurringFrequency.value` (per Markr API docs). */\nexport const RECURRING_FREQUENCY_VALUE_MAX = 365;\n\nexport function validateFrequency(\n frequency: RecurringFrequency,\n minFrequencySeconds: number,\n): FrequencyValidationResult {\n if (!(frequency.unit in SECONDS_BY_UNIT)) {\n return { ok: false, reason: 'invalid-unit' };\n }\n\n // `1 ≤ value ≤ 365` mirrors the server-side bound. Catching it here lets\n // picker UIs surface the error inline instead of waiting for the\n // `/recurring/quote` HTTP round-trip to fail.\n if (!Number.isInteger(frequency.value) || frequency.value < 1 || frequency.value > RECURRING_FREQUENCY_VALUE_MAX) {\n return { ok: false, reason: 'invalid-value' };\n }\n\n const intervalSeconds = deriveIntervalSeconds(frequency);\n\n if (intervalSeconds < minFrequencySeconds) {\n return { ok: false, reason: 'below-minimum' };\n }\n\n return { ok: true, intervalSeconds };\n}\n"],"mappings":"AAOA,MAAM,EAAoE,CACxE,OAAQ,GACR,KAAM,KACN,IAAK,MACL,KAAM,OACN,MAAO,OACR,CAED,SAAgB,EAAsB,EAAuC,CAC3E,OAAO,EAAgB,EAAU,MAAQ,EAAU,MAUrD,SAAgB,EACd,EACA,EAC2B,CAC3B,GAAI,EAAE,EAAU,QAAQ,GACtB,MAAO,CAAE,GAAI,GAAO,OAAQ,eAAgB,CAM9C,GAAI,CAAC,OAAO,UAAU,EAAU,MAAM,EAAI,EAAU,MAAQ,GAAK,EAAU,MAAA,IACzE,MAAO,CAAE,GAAI,GAAO,OAAQ,gBAAiB,CAG/C,IAAM,EAAkB,EAAsB,EAAU,CAMxD,OAJI,EAAkB,EACb,CAAE,GAAI,GAAO,OAAQ,gBAAiB,CAGxC,CAAE,GAAI,GAAM,kBAAiB"}
|
|
1
|
+
{"version":3,"file":"_frequency.cjs","names":[],"sources":["../../../../src/transfer-service/markr/recurring/_frequency.ts"],"sourcesContent":["import type { RecurringFrequency, RecurringFrequencyUnit } from './types';\n\n/**\n * Seconds-per-unit lookup. The \"month\" entry uses 30 days; Markr's `/recurring/quote`\n * returns the server-derived `intervalSeconds`, so this helper is a client-side\n * estimator (used for the picker's \"below-minimum\" greying), not the source of truth.\n */\nconst SECONDS_BY_UNIT: Readonly<Record<RecurringFrequencyUnit, number>> = {\n minute: 60,\n hour: 3600,\n day: 86_400,\n week: 604_800,\n month: 2_592_000,\n};\n\nexport function deriveIntervalSeconds(frequency: RecurringFrequency): number {\n return SECONDS_BY_UNIT[frequency.unit] * frequency.value;\n}\n\nexport type FrequencyValidationResult =\n | { ok: true; intervalSeconds: number }\n | { ok: false; reason: 'below-minimum' | 'invalid-unit' | 'invalid-value' };\n\n/** Server-enforced upper bound on `RecurringFrequency.value` (per Markr API docs). */\nexport const RECURRING_FREQUENCY_VALUE_MAX: number = 365;\n\nexport function validateFrequency(\n frequency: RecurringFrequency,\n minFrequencySeconds: number,\n): FrequencyValidationResult {\n if (!(frequency.unit in SECONDS_BY_UNIT)) {\n return { ok: false, reason: 'invalid-unit' };\n }\n\n // `1 ≤ value ≤ 365` mirrors the server-side bound. Catching it here lets\n // picker UIs surface the error inline instead of waiting for the\n // `/recurring/quote` HTTP round-trip to fail.\n if (!Number.isInteger(frequency.value) || frequency.value < 1 || frequency.value > RECURRING_FREQUENCY_VALUE_MAX) {\n return { ok: false, reason: 'invalid-value' };\n }\n\n const intervalSeconds = deriveIntervalSeconds(frequency);\n\n if (intervalSeconds < minFrequencySeconds) {\n return { ok: false, reason: 'below-minimum' };\n }\n\n return { ok: true, intervalSeconds };\n}\n"],"mappings":"AAOA,MAAM,EAAoE,CACxE,OAAQ,GACR,KAAM,KACN,IAAK,MACL,KAAM,OACN,MAAO,OACR,CAED,SAAgB,EAAsB,EAAuC,CAC3E,OAAO,EAAgB,EAAU,MAAQ,EAAU,MAUrD,SAAgB,EACd,EACA,EAC2B,CAC3B,GAAI,EAAE,EAAU,QAAQ,GACtB,MAAO,CAAE,GAAI,GAAO,OAAQ,eAAgB,CAM9C,GAAI,CAAC,OAAO,UAAU,EAAU,MAAM,EAAI,EAAU,MAAQ,GAAK,EAAU,MAAA,IACzE,MAAO,CAAE,GAAI,GAAO,OAAQ,gBAAiB,CAG/C,IAAM,EAAkB,EAAsB,EAAU,CAMxD,OAJI,EAAkB,EACb,CAAE,GAAI,GAAO,OAAQ,gBAAiB,CAGxC,CAAE,GAAI,GAAM,kBAAiB"}
|
|
@@ -10,7 +10,7 @@ type FrequencyValidationResult = {
|
|
|
10
10
|
reason: "below-minimum" | "invalid-unit" | "invalid-value";
|
|
11
11
|
};
|
|
12
12
|
/** Server-enforced upper bound on `RecurringFrequency.value` (per Markr API docs). */
|
|
13
|
-
declare const RECURRING_FREQUENCY_VALUE_MAX
|
|
13
|
+
declare const RECURRING_FREQUENCY_VALUE_MAX: number;
|
|
14
14
|
declare function validateFrequency(frequency: RecurringFrequency, minFrequencySeconds: number): FrequencyValidationResult;
|
|
15
15
|
//#endregion
|
|
16
16
|
export { FrequencyValidationResult, RECURRING_FREQUENCY_VALUE_MAX, deriveIntervalSeconds, validateFrequency };
|
|
@@ -10,7 +10,7 @@ type FrequencyValidationResult = {
|
|
|
10
10
|
reason: "below-minimum" | "invalid-unit" | "invalid-value";
|
|
11
11
|
};
|
|
12
12
|
/** Server-enforced upper bound on `RecurringFrequency.value` (per Markr API docs). */
|
|
13
|
-
declare const RECURRING_FREQUENCY_VALUE_MAX
|
|
13
|
+
declare const RECURRING_FREQUENCY_VALUE_MAX: number;
|
|
14
14
|
declare function validateFrequency(frequency: RecurringFrequency, minFrequencySeconds: number): FrequencyValidationResult;
|
|
15
15
|
//#endregion
|
|
16
16
|
export { FrequencyValidationResult, RECURRING_FREQUENCY_VALUE_MAX, deriveIntervalSeconds, validateFrequency };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_frequency.js","names":[],"sources":["../../../../src/transfer-service/markr/recurring/_frequency.ts"],"sourcesContent":["import type { RecurringFrequency, RecurringFrequencyUnit } from './types';\n\n/**\n * Seconds-per-unit lookup. The \"month\" entry uses 30 days; Markr's `/recurring/quote`\n * returns the server-derived `intervalSeconds`, so this helper is a client-side\n * estimator (used for the picker's \"below-minimum\" greying), not the source of truth.\n */\nconst SECONDS_BY_UNIT: Readonly<Record<RecurringFrequencyUnit, number>> = {\n minute: 60,\n hour: 3600,\n day: 86_400,\n week: 604_800,\n month: 2_592_000,\n};\n\nexport function deriveIntervalSeconds(frequency: RecurringFrequency): number {\n return SECONDS_BY_UNIT[frequency.unit] * frequency.value;\n}\n\nexport type FrequencyValidationResult =\n | { ok: true; intervalSeconds: number }\n | { ok: false; reason: 'below-minimum' | 'invalid-unit' | 'invalid-value' };\n\n/** Server-enforced upper bound on `RecurringFrequency.value` (per Markr API docs). */\nexport const RECURRING_FREQUENCY_VALUE_MAX = 365;\n\nexport function validateFrequency(\n frequency: RecurringFrequency,\n minFrequencySeconds: number,\n): FrequencyValidationResult {\n if (!(frequency.unit in SECONDS_BY_UNIT)) {\n return { ok: false, reason: 'invalid-unit' };\n }\n\n // `1 ≤ value ≤ 365` mirrors the server-side bound. Catching it here lets\n // picker UIs surface the error inline instead of waiting for the\n // `/recurring/quote` HTTP round-trip to fail.\n if (!Number.isInteger(frequency.value) || frequency.value < 1 || frequency.value > RECURRING_FREQUENCY_VALUE_MAX) {\n return { ok: false, reason: 'invalid-value' };\n }\n\n const intervalSeconds = deriveIntervalSeconds(frequency);\n\n if (intervalSeconds < minFrequencySeconds) {\n return { ok: false, reason: 'below-minimum' };\n }\n\n return { ok: true, intervalSeconds };\n}\n"],"mappings":"AAOA,MAAM,EAAoE,CACxE,OAAQ,GACR,KAAM,KACN,IAAK,MACL,KAAM,OACN,MAAO,OACR,CAED,SAAgB,EAAsB,EAAuC,CAC3E,OAAO,EAAgB,EAAU,MAAQ,EAAU,MAQrD,MAAa,
|
|
1
|
+
{"version":3,"file":"_frequency.js","names":[],"sources":["../../../../src/transfer-service/markr/recurring/_frequency.ts"],"sourcesContent":["import type { RecurringFrequency, RecurringFrequencyUnit } from './types';\n\n/**\n * Seconds-per-unit lookup. The \"month\" entry uses 30 days; Markr's `/recurring/quote`\n * returns the server-derived `intervalSeconds`, so this helper is a client-side\n * estimator (used for the picker's \"below-minimum\" greying), not the source of truth.\n */\nconst SECONDS_BY_UNIT: Readonly<Record<RecurringFrequencyUnit, number>> = {\n minute: 60,\n hour: 3600,\n day: 86_400,\n week: 604_800,\n month: 2_592_000,\n};\n\nexport function deriveIntervalSeconds(frequency: RecurringFrequency): number {\n return SECONDS_BY_UNIT[frequency.unit] * frequency.value;\n}\n\nexport type FrequencyValidationResult =\n | { ok: true; intervalSeconds: number }\n | { ok: false; reason: 'below-minimum' | 'invalid-unit' | 'invalid-value' };\n\n/** Server-enforced upper bound on `RecurringFrequency.value` (per Markr API docs). */\nexport const RECURRING_FREQUENCY_VALUE_MAX: number = 365;\n\nexport function validateFrequency(\n frequency: RecurringFrequency,\n minFrequencySeconds: number,\n): FrequencyValidationResult {\n if (!(frequency.unit in SECONDS_BY_UNIT)) {\n return { ok: false, reason: 'invalid-unit' };\n }\n\n // `1 ≤ value ≤ 365` mirrors the server-side bound. Catching it here lets\n // picker UIs surface the error inline instead of waiting for the\n // `/recurring/quote` HTTP round-trip to fail.\n if (!Number.isInteger(frequency.value) || frequency.value < 1 || frequency.value > RECURRING_FREQUENCY_VALUE_MAX) {\n return { ok: false, reason: 'invalid-value' };\n }\n\n const intervalSeconds = deriveIntervalSeconds(frequency);\n\n if (intervalSeconds < minFrequencySeconds) {\n return { ok: false, reason: 'below-minimum' };\n }\n\n return { ok: true, intervalSeconds };\n}\n"],"mappings":"AAOA,MAAM,EAAoE,CACxE,OAAQ,GACR,KAAM,KACN,IAAK,MACL,KAAM,OACN,MAAO,OACR,CAED,SAAgB,EAAsB,EAAuC,CAC3E,OAAO,EAAgB,EAAU,MAAQ,EAAU,MAQrD,MAAa,EAAwC,IAErD,SAAgB,EACd,EACA,EAC2B,CAC3B,GAAI,EAAE,EAAU,QAAQ,GACtB,MAAO,CAAE,GAAI,GAAO,OAAQ,eAAgB,CAM9C,GAAI,CAAC,OAAO,UAAU,EAAU,MAAM,EAAI,EAAU,MAAQ,GAAK,EAAU,MAAA,IACzE,MAAO,CAAE,GAAI,GAAO,OAAQ,gBAAiB,CAG/C,IAAM,EAAkB,EAAsB,EAAU,CAMxD,OAJI,EAAkB,EACb,CAAE,GAAI,GAAO,OAAQ,gBAAiB,CAGxC,CAAE,GAAI,GAAM,kBAAiB"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../constants.cjs`),t=require(`../../../errors.cjs`),n=require(`../../../utils/caip.cjs`),r=require(`../../_utils.cjs`),i=require(`../../_evm-errors.cjs`),a=require(`../../_evm-approval.cjs`),o=require(`../_api.cjs`),s=require(`../_utils.cjs`),c=require(`./_api.cjs`),l=require(`./_eligibility.cjs`);let u=require(`viem`);function d({apiOptions:
|
|
1
|
+
require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../constants.cjs`),t=require(`../../../errors.cjs`),n=require(`../../../utils/caip.cjs`),r=require(`../../_utils.cjs`),i=require(`../../_evm-errors.cjs`),a=require(`../../_evm-approval.cjs`),o=require(`../_api.cjs`),s=require(`../_utils.cjs`),c=require(`./_api.cjs`),l=require(`./_eligibility.cjs`);let u=require(`viem`);function d({apiOptions:t,appId:n,evmSigner:r,recurringChainInfo:i}){return{quote:e=>c.markrRecurringQuote(t,{...e,appId:n}),executeFirstFill:e=>f({...e,apiOptions:t,appId:n,evmSigner:r}),listOrders:e=>c.markrListRecurringOrders(t,e),executeCancellation:n=>m({...n,signatureReason:e.TransferSignatureReason.CancelRecurringSwap,apiOptions:t,evmSigner:r,fetchCalldata:c.markrPrepareCancellation}),executePause:n=>m({...n,signatureReason:e.TransferSignatureReason.PauseRecurringSwap,apiOptions:t,evmSigner:r,fetchCalldata:c.markrPreparePause}),executeUnpause:n=>m({...n,signatureReason:e.TransferSignatureReason.ResumeRecurringSwap,apiOptions:t,evmSigner:r,fetchCalldata:c.markrPrepareUnpause}),checkEligibility:e=>l.checkRecurringEligibility({...e,recurringChainInfo:i}),getRecurringChainInfo:()=>i}}async function f({apiOptions:l,appId:u,evmSigner:d,fallbackToDefaultOnBatchFailure:f,fromAddress:p,gasSettings:m,quote:g,signerContext:_,sourceChain:v}){let y=Math.floor(Date.now()/1e3);if(g.expiredAt<=y){let e=y-g.expiredAt;throw new t.InvalidParamsError(t.ErrorReason.QUOTE_EXPIRED,`Recurring quote expired ${e} seconds ago.`)}let b=n.caip2ToEip155ChainId(v.chainId);if(b!==g.chainId)throw new t.InvalidParamsError(`sourceChain does not match quote.chainId`,`sourceChain.chainId=${v.chainId} resolves to ${b}, but quote.chainId=${g.chainId}.`);let x=r.getEvmClientForChain({chain:v}),S=n.caip2ToEip155HexChainId(v.chainId),{address:C}=await o.markrGetSpenderAddress(l,{chainId:g.chainId,crossChainSwap:!1,quoteId:g.uuid});if(!C)throw new t.SdkError(t.ErrorReason.CHAIN_NOT_SUPPORTED,t.ErrorCode.INVALID_PARAMS,{details:`Missing Markr spender address for source chain ${v.chainId}.`});let w=await a.buildErc20ApprovalRequest({chainIdHex:S,client:x,gasSettings:m,owner:p,requiredAllowance:g.totalAmountIn,spender:C,token:g.tokenIn}),T=h({fromAddress:p,quote:g,sourceChain:v}),E=await c.markrRecurringSwap(l,{uuid:g.uuid,appId:u});if(w!==void 0&&typeof d.signBatch==`function`){let n={currentSignature:1,currentSignatureReason:e.TransferSignatureReason.ScheduleRecurringSwap,quote:T,requiredSignatures:1,signerContext:_},i={chainId:S,data:E.data,from:p,gas:void 0,to:E.to,value:E.value,...r.maybe1559(m)};try{let e=(await d.signBatch([w,i],e=>x.sendRawTransaction({serializedTransaction:e}),n)).at(-1);if(!e)throw new t.SdkError(`One-click batch signing returned no transaction hashes.`,t.ErrorCode.SIGNING_FAILED);return{txHash:e}}catch(e){if(!f)throw e}}w&&await a.signApprovalAndAssertConfirmed({client:x,evmSigner:d,request:w,step:{currentSignature:1,currentSignatureReason:e.TransferSignatureReason.AllowanceApproval,quote:T,requiredSignatures:2,signerContext:_}});let D=await s.getMarkrSwapWrapperAbi(!1),O=await i.estimateGasWithRevert(x,{account:p,to:E.to,data:E.data,value:E.value},D,`Failed to estimate gas for recurring first-fill swap transaction.`),k={chainId:S,data:E.data,from:p,gas:r.applyFeeUnitsBpsMargin(O,m?.estimateGasMarginBps),to:E.to,value:E.value,...r.maybe1559(m)},A={currentSignature:w?2:1,currentSignatureReason:e.TransferSignatureReason.ScheduleRecurringSwap,quote:T,requiredSignatures:w?2:1,signerContext:_};return{txHash:await d.sign(k,e=>x.sendRawTransaction({serializedTransaction:e}),A)}}const p={[e.TransferSignatureReason.PauseRecurringSwap]:`pause`,[e.TransferSignatureReason.ResumeRecurringSwap]:`resume`,[e.TransferSignatureReason.CancelRecurringSwap]:`cancel`};async function m({signatureReason:e,address:t,apiOptions:a,evmSigner:o,fetchCalldata:s,gasSettings:c,orderId:l,signerContext:d,sourceChain:f}){let m=r.getEvmClientForChain({chain:f}),h=n.caip2ToEip155ChainId(f.chainId),_=n.caip2ToEip155HexChainId(f.chainId),v=await s(a,{orderId:l,address:t,chainId:h}),y=await i.estimateGasWithRevert(m,{account:t,to:v.to,data:v.data,value:v.value},u.erc20Abi,`Failed to estimate gas for recurring ${p[e]} transaction.`),b={chainId:_,data:v.data,from:t,gas:r.applyFeeUnitsBpsMargin(y,c?.estimateGasMarginBps),to:v.to,value:v.value,...r.maybe1559(c)},x={currentSignature:1,currentSignatureReason:e,quote:g({address:t,signatureReason:e,orderId:l,sourceChain:f}),requiredSignatures:1,signerContext:d};return{txHash:await o.sign(b,e=>m.sendRawTransaction({serializedTransaction:e}),x)}}function h({fromAddress:t,quote:n,sourceChain:r}){return{aggregator:{id:`markr-recurring`,name:`Markr recurring`},amountIn:n.amount,amountOut:n.amountOut,assetIn:{type:e.TokenType.ERC20,address:n.tokenIn,name:``,symbol:``,decimals:0},assetOut:{type:e.TokenType.ERC20,address:n.tokenOut,name:``,symbol:``,decimals:0},expiresAt:n.expiredAt,fees:[],fromAddress:t,id:n.uuid,partnerFeeBps:null,serviceType:e.ServiceType.MARKR,slippageBps:n.recommendedSlippage,sourceChain:r,targetChain:r,toAddress:t}}function g({signatureReason:t,address:n,orderId:r,sourceChain:i}){let a=p[t];return{aggregator:{id:`markr-recurring-${a}`,name:`Markr recurring (${a})`},amountIn:0n,amountOut:0n,assetIn:_(),assetOut:_(),expiresAt:0,fees:[],fromAddress:n,id:r,partnerFeeBps:null,serviceType:e.ServiceType.MARKR,slippageBps:0,sourceChain:i,targetChain:i,toAddress:n}}function _(){return{type:e.TokenType.NATIVE,name:``,symbol:``,decimals:0}}exports.createRecurringNamespace=d;
|
|
2
2
|
//# sourceMappingURL=_namespace.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_namespace.cjs","names":["markrRecurringQuote","markrListRecurringOrders","markrPrepareCancellation","markrPreparePause","markrPrepareUnpause","checkRecurringEligibility","InvalidParamsError","ErrorReason","caip2ToEip155ChainId","getEvmClientForChain","caip2ToEip155HexChainId","markrGetSpenderAddress","SdkError","ErrorCode","buildErc20ApprovalRequest","markrRecurringSwap","TransferSignatureReason","maybe1559","signApprovalAndAssertConfirmed","getMarkrSwapWrapperAbi","estimateGasWithRevert","applyFeeUnitsBpsMargin","erc20Abi","TokenType","ServiceType"],"sources":["../../../../src/transfer-service/markr/recurring/_namespace.ts"],"sourcesContent":["import { erc20Abi } from 'viem';\nimport { ServiceType, TokenType, TransferSignatureReason } from '../../../constants';\nimport { ErrorCode, ErrorReason, InvalidParamsError, SdkError } from '../../../errors';\nimport type { Chain } from '../../../types/chain';\nimport type { Quote } from '../../../types/quote';\nimport type { EvmSigner, EvmTransactionRequest } from '../../../types/signer';\nimport type { TransferStepDetails } from '../../../types/transfer';\nimport { caip2ToEip155ChainId, caip2ToEip155HexChainId } from '../../../utils/caip';\nimport { applyFeeUnitsBpsMargin, getEvmClientForChain, maybe1559 } from '../../_utils';\nimport { buildErc20ApprovalRequest, signApprovalAndAssertConfirmed } from '../../_evm-approval';\nimport { estimateGasWithRevert } from '../../_evm-errors';\nimport type { WrappedSwapTransactionResponse } from '../_schema';\nimport { markrGetSpenderAddress, type ApiOptions } from '../_api';\nimport { getMarkrSwapWrapperAbi } from '../_utils';\nimport {\n markrListRecurringOrders,\n markrPrepareCancellation,\n markrPreparePause,\n markrPrepareUnpause,\n markrRecurringQuote,\n markrRecurringSwap,\n} from './_api';\nimport { checkRecurringEligibility } from './_eligibility';\nimport type {\n RecurringChainInfoMap,\n RecurringExecuteFirstFillParams,\n RecurringExecuteOrderActionParams,\n RecurringExecuteResult,\n RecurringNamespace,\n RecurringQuoteResponse,\n} from './types';\n\nexport interface CreateRecurringNamespaceOptions {\n apiOptions: ApiOptions;\n appId: string;\n evmSigner: EvmSigner;\n /**\n * The cached `/info/chains` recurring metadata. Captured by value at\n * namespace construction time — matches how `partnerFeeBps`,\n * `supportedChains`, and `supportedTokens` are also frozen at\n * `createMarkrService` init. If staleness ever becomes a real consumer\n * concern, the fix is a top-level `manager.refresh()` (not a per-namespace\n * lazy-read pattern).\n */\n recurringChainInfo: RecurringChainInfoMap;\n}\n\nexport function createRecurringNamespace({\n apiOptions,\n appId,\n evmSigner,\n recurringChainInfo,\n}: CreateRecurringNamespaceOptions): RecurringNamespace {\n return {\n quote: (props) => markrRecurringQuote(apiOptions, { ...props, appId }),\n\n executeFirstFill: (props) => executeFirstFillImpl({ ...props, apiOptions, appId, evmSigner }),\n\n listOrders: (props) => markrListRecurringOrders(apiOptions, props),\n\n executeCancellation: (props) =>\n executeOrderActionImpl({\n ...props,\n action: 'cancel',\n apiOptions,\n evmSigner,\n fetchCalldata: markrPrepareCancellation,\n }),\n\n executePause: (props) =>\n executeOrderActionImpl({\n ...props,\n action: 'pause',\n apiOptions,\n evmSigner,\n fetchCalldata: markrPreparePause,\n }),\n\n executeUnpause: (props) =>\n executeOrderActionImpl({\n ...props,\n action: 'unpause',\n apiOptions,\n evmSigner,\n fetchCalldata: markrPrepareUnpause,\n }),\n\n checkEligibility: (props) => checkRecurringEligibility({ ...props, recurringChainInfo }),\n\n getRecurringChainInfo: () => recurringChainInfo,\n };\n}\n\n// ---------------------------------------------------------------------------\n// First-fill execution (allowance check + approve-if-needed + first-fill swap)\n// ---------------------------------------------------------------------------\n\ninterface ExecuteFirstFillImplParams extends RecurringExecuteFirstFillParams {\n apiOptions: ApiOptions;\n appId: string;\n evmSigner: EvmSigner;\n}\n\nasync function executeFirstFillImpl({\n apiOptions,\n appId,\n evmSigner,\n fallbackToDefaultOnBatchFailure,\n fromAddress,\n gasSettings,\n quote,\n sourceChain,\n}: ExecuteFirstFillImplParams): Promise<RecurringExecuteResult> {\n // Mirror the one-shot guard at `TransferManager.estimateNativeFee` — fail at\n // the SDK boundary with `QUOTE_EXPIRED` instead of an opaque `HttpError`\n // from `/recurring/swap` for a slow-to-approve user.\n const now = Math.floor(Date.now() / 1_000);\n if (quote.expiredAt <= now) {\n const expiredSecondsAgo = now - quote.expiredAt;\n throw new InvalidParamsError(\n ErrorReason.QUOTE_EXPIRED,\n `Recurring quote expired ${expiredSecondsAgo} seconds ago.`,\n );\n }\n\n // Wiring-mistake guard: the passed `sourceChain.chainId` (CAIP-2) must agree\n // with the `chainId` (numeric) the quote was issued against. Otherwise the\n // allowance / gas reads hit the wrong chain.\n const sourceChainIdNumeric = caip2ToEip155ChainId(sourceChain.chainId);\n if (sourceChainIdNumeric !== quote.chainId) {\n throw new InvalidParamsError(\n 'sourceChain does not match quote.chainId',\n `sourceChain.chainId=${sourceChain.chainId} resolves to ${sourceChainIdNumeric}, but quote.chainId=${quote.chainId}.`,\n );\n }\n\n const sourceClient = getEvmClientForChain({ chain: sourceChain });\n const chainIdHex = caip2ToEip155HexChainId(sourceChain.chainId);\n\n const { address: spenderAddress } = await markrGetSpenderAddress(apiOptions, {\n chainId: quote.chainId,\n crossChainSwap: false,\n quoteId: quote.uuid,\n });\n\n if (!spenderAddress) {\n throw new SdkError(ErrorReason.CHAIN_NOT_SUPPORTED, ErrorCode.INVALID_PARAMS, {\n details: `Missing Markr spender address for source chain ${sourceChain.chainId}.`,\n });\n }\n\n const approvalRequest = await buildErc20ApprovalRequest({\n chainIdHex,\n client: sourceClient,\n gasSettings,\n owner: fromAddress,\n requiredAllowance: quote.totalAmountIn,\n spender: spenderAddress,\n token: quote.tokenIn,\n });\n\n const syntheticQuote = buildSyntheticQuoteForFirstFill({ fromAddress, quote, sourceChain });\n\n const swap = await markrRecurringSwap(apiOptions, { uuid: quote.uuid, appId });\n\n // One-click batch path: same-chain DCA, approval required, signer exposes\n // `signBatch`. Matches `_executeEvmTransfer`'s eligibility check (recurring\n // is always same-chain so the cross-chain check there collapses to true).\n if (approvalRequest !== undefined && typeof evmSigner.signBatch === 'function') {\n const batchStep: TransferStepDetails = {\n currentSignature: 1,\n currentSignatureReason: TransferSignatureReason.TokensTransfer,\n quote: syntheticQuote,\n requiredSignatures: 1,\n };\n\n // Gas is left undefined on the swap leg — the wallet handles batched gas\n // estimation since the approval hasn't executed yet.\n const swapRequest: EvmTransactionRequest = {\n chainId: chainIdHex,\n data: swap.data,\n from: fromAddress,\n gas: undefined,\n to: swap.to,\n value: swap.value,\n ...maybe1559(gasSettings),\n };\n\n try {\n const txHashes = await evmSigner.signBatch(\n [approvalRequest, swapRequest],\n (signedTxHash) => sourceClient.sendRawTransaction({ serializedTransaction: signedTxHash }),\n batchStep,\n );\n const swapTxHash = txHashes.at(-1);\n if (!swapTxHash) {\n throw new SdkError('One-click batch signing returned no transaction hashes.', ErrorCode.SIGNING_FAILED);\n }\n return { txHash: swapTxHash };\n } catch (error) {\n if (!fallbackToDefaultOnBatchFailure) {\n throw error;\n }\n // Fall through to the two-signature path below.\n }\n }\n\n if (approvalRequest) {\n await signApprovalAndAssertConfirmed({\n client: sourceClient,\n evmSigner,\n request: approvalRequest,\n step: {\n currentSignature: 1,\n currentSignatureReason: TransferSignatureReason.AllowanceApproval,\n quote: syntheticQuote,\n requiredSignatures: 2,\n },\n });\n }\n\n // Use the Markr same-chain swap wrapper ABI for best-effort revert decoding\n // — matches `_estimateGasFromSwapResponse` in `estimate-native-fee.ts`.\n // Recurring is always same-chain, so `crossChain: false`. Built-in\n // `Error(string)` / `Panic(uint256)` are decoded regardless of ABI.\n const markrAbi = await getMarkrSwapWrapperAbi(false);\n const swapGasEstimate = await estimateGasWithRevert(\n sourceClient,\n { account: fromAddress, to: swap.to, data: swap.data, value: swap.value },\n markrAbi,\n 'Failed to estimate gas for recurring first-fill swap transaction.',\n );\n\n const swapRequest: EvmTransactionRequest = {\n chainId: chainIdHex,\n data: swap.data,\n from: fromAddress,\n gas: applyFeeUnitsBpsMargin(swapGasEstimate, gasSettings?.estimateGasMarginBps),\n to: swap.to,\n value: swap.value,\n ...maybe1559(gasSettings),\n };\n\n const swapStep: TransferStepDetails = {\n currentSignature: approvalRequest ? 2 : 1,\n currentSignatureReason: TransferSignatureReason.TokensTransfer,\n quote: syntheticQuote,\n requiredSignatures: approvalRequest ? 2 : 1,\n };\n\n const txHash = await evmSigner.sign(\n swapRequest,\n (signedTxHash) => sourceClient.sendRawTransaction({ serializedTransaction: signedTxHash }),\n swapStep,\n );\n\n return { txHash };\n}\n\n// ---------------------------------------------------------------------------\n// Order-action execution (cancel / pause / unpause — single-tx state change)\n// ---------------------------------------------------------------------------\n\ninterface ExecuteOrderActionImplParams extends RecurringExecuteOrderActionParams {\n action: 'cancel' | 'pause' | 'unpause';\n apiOptions: ApiOptions;\n evmSigner: EvmSigner;\n fetchCalldata: (\n apiOptions: ApiOptions,\n params: { orderId: `0x${string}`; address: `0x${string}`; chainId: number },\n ) => Promise<WrappedSwapTransactionResponse>;\n}\n\nasync function executeOrderActionImpl({\n action,\n address,\n apiOptions,\n evmSigner,\n fetchCalldata,\n gasSettings,\n orderId,\n sourceChain,\n}: ExecuteOrderActionImplParams): Promise<RecurringExecuteResult> {\n const sourceClient = getEvmClientForChain({ chain: sourceChain });\n const chainIdNumeric = caip2ToEip155ChainId(sourceChain.chainId);\n const chainIdHex = caip2ToEip155HexChainId(sourceChain.chainId);\n\n const calldata = await fetchCalldata(apiOptions, { orderId, address, chainId: chainIdNumeric });\n\n const gasEstimate = await estimateGasWithRevert(\n sourceClient,\n { account: address, to: calldata.to, data: calldata.data, value: calldata.value },\n erc20Abi,\n `Failed to estimate gas for recurring ${action} transaction.`,\n );\n\n const request: EvmTransactionRequest = {\n chainId: chainIdHex,\n data: calldata.data,\n from: address,\n gas: applyFeeUnitsBpsMargin(gasEstimate, gasSettings?.estimateGasMarginBps),\n to: calldata.to,\n value: calldata.value,\n ...maybe1559(gasSettings),\n };\n\n const step: TransferStepDetails = {\n currentSignature: 1,\n currentSignatureReason: TransferSignatureReason.TokensTransfer,\n quote: buildSyntheticQuoteForOrderAction({ address, action, orderId, sourceChain }),\n requiredSignatures: 1,\n };\n\n const txHash = await evmSigner.sign(\n request,\n (signedTxHash) => sourceClient.sendRawTransaction({ serializedTransaction: signedTxHash }),\n step,\n );\n\n return { txHash };\n}\n\n// ---------------------------------------------------------------------------\n// Internal: synthetic Quote objects for `TransferStepDetails.quote`\n// ---------------------------------------------------------------------------\n\n/**\n * Builds a minimum-viable {@link Quote} for the signer step so consumer\n * `EvmSigner` impls can render meaningful wallet prompts for a recurring\n * action (which has no real `Quote` in the swap-quoter sense). The synthetic\n * value carries enough recurring context (uuid, chain, amounts, tokens) for\n * a wallet UI to label the popup; the `aggregator.id` (`'markr-recurring'`)\n * lets advanced signers detect the recurring path explicitly.\n *\n * Asset fields use placeholder `name`/`symbol`/`decimals` because the\n * recurring quote doesn't echo those — consumers needing rich asset display\n * should resolve token metadata against their own asset map keyed by\n * `quote.tokenIn`/`tokenOut`.\n */\nfunction buildSyntheticQuoteForFirstFill({\n fromAddress,\n quote,\n sourceChain,\n}: {\n fromAddress: `0x${string}`;\n quote: RecurringQuoteResponse;\n sourceChain: Chain;\n}): Quote {\n return {\n aggregator: { id: 'markr-recurring', name: 'Markr Recurring' },\n amountIn: quote.amount,\n amountOut: quote.amountOut,\n assetIn: { type: TokenType.ERC20, address: quote.tokenIn, name: '', symbol: '', decimals: 0 },\n assetOut: { type: TokenType.ERC20, address: quote.tokenOut, name: '', symbol: '', decimals: 0 },\n expiresAt: quote.expiredAt,\n fees: [],\n fromAddress,\n id: quote.uuid,\n partnerFeeBps: null,\n serviceType: ServiceType.MARKR,\n slippageBps: quote.recommendedSlippage,\n // Pass the caller-provided `Chain` straight through — recurring is always\n // same-chain, so source === target. Avoids stripping `chainName` /\n // `networkToken` / `rpcUrl` that consumer signers may use for display.\n sourceChain,\n targetChain: sourceChain,\n toAddress: fromAddress,\n };\n}\n\nfunction buildSyntheticQuoteForOrderAction({\n action,\n address,\n orderId,\n sourceChain,\n}: {\n action: 'cancel' | 'pause' | 'unpause';\n address: `0x${string}`;\n orderId: `0x${string}`;\n sourceChain: Chain;\n}): Quote {\n return {\n aggregator: { id: `markr-recurring-${action}`, name: `Markr Recurring (${action})` },\n amountIn: 0n,\n amountOut: 0n,\n assetIn: emptyNativeAsset(),\n assetOut: emptyNativeAsset(),\n expiresAt: 0,\n fees: [],\n fromAddress: address,\n id: orderId,\n partnerFeeBps: null,\n serviceType: ServiceType.MARKR,\n slippageBps: 0,\n // See `buildSyntheticQuoteForFirstFill` — pass the real `Chain` through.\n sourceChain,\n targetChain: sourceChain,\n toAddress: address,\n };\n}\n\nfunction emptyNativeAsset() {\n return { type: TokenType.NATIVE, name: '', symbol: '', decimals: 0 } as const;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"_namespace.cjs","names":["markrRecurringQuote","markrListRecurringOrders","TransferSignatureReason","markrPrepareCancellation","markrPreparePause","markrPrepareUnpause","checkRecurringEligibility","InvalidParamsError","ErrorReason","caip2ToEip155ChainId","getEvmClientForChain","caip2ToEip155HexChainId","markrGetSpenderAddress","SdkError","ErrorCode","buildErc20ApprovalRequest","markrRecurringSwap","maybe1559","signApprovalAndAssertConfirmed","getMarkrSwapWrapperAbi","estimateGasWithRevert","applyFeeUnitsBpsMargin","erc20Abi","TokenType","ServiceType"],"sources":["../../../../src/transfer-service/markr/recurring/_namespace.ts"],"sourcesContent":["import { erc20Abi } from 'viem';\nimport { ServiceType, TokenType, TransferSignatureReason } from '../../../constants';\nimport { ErrorCode, ErrorReason, InvalidParamsError, SdkError } from '../../../errors';\nimport type { Chain } from '../../../types/chain';\nimport type { Quote } from '../../../types/quote';\nimport type { EvmSigner, EvmTransactionRequest } from '../../../types/signer';\nimport type { TransferStepDetails } from '../../../types/transfer';\nimport { caip2ToEip155ChainId, caip2ToEip155HexChainId } from '../../../utils/caip';\nimport { applyFeeUnitsBpsMargin, getEvmClientForChain, maybe1559 } from '../../_utils';\nimport { buildErc20ApprovalRequest, signApprovalAndAssertConfirmed } from '../../_evm-approval';\nimport { estimateGasWithRevert } from '../../_evm-errors';\nimport type { WrappedSwapTransactionResponse } from '../_schema';\nimport { markrGetSpenderAddress, type ApiOptions } from '../_api';\nimport { getMarkrSwapWrapperAbi } from '../_utils';\nimport {\n markrListRecurringOrders,\n markrPrepareCancellation,\n markrPreparePause,\n markrPrepareUnpause,\n markrRecurringQuote,\n markrRecurringSwap,\n} from './_api';\nimport { checkRecurringEligibility } from './_eligibility';\nimport type {\n RecurringChainInfoMap,\n RecurringExecuteFirstFillParams,\n RecurringExecuteOrderActionParams,\n RecurringExecuteResult,\n RecurringNamespace,\n RecurringQuoteResponse,\n} from './types';\n\nexport interface CreateRecurringNamespaceOptions {\n apiOptions: ApiOptions;\n appId: string;\n evmSigner: EvmSigner;\n /**\n * The cached `/info/chains` recurring metadata. Captured by value at\n * namespace construction time — matches how `partnerFeeBps`,\n * `supportedChains`, and `supportedTokens` are also frozen at\n * `createMarkrService` init. If staleness ever becomes a real consumer\n * concern, the fix is a top-level `manager.refresh()` (not a per-namespace\n * lazy-read pattern).\n */\n recurringChainInfo: RecurringChainInfoMap;\n}\n\nexport function createRecurringNamespace({\n apiOptions,\n appId,\n evmSigner,\n recurringChainInfo,\n}: CreateRecurringNamespaceOptions): RecurringNamespace {\n return {\n quote: (props) => markrRecurringQuote(apiOptions, { ...props, appId }),\n\n executeFirstFill: (props) => executeFirstFillImpl({ ...props, apiOptions, appId, evmSigner }),\n\n listOrders: (props) => markrListRecurringOrders(apiOptions, props),\n\n executeCancellation: (props) =>\n executeOrderActionImpl({\n ...props,\n signatureReason: TransferSignatureReason.CancelRecurringSwap,\n apiOptions,\n evmSigner,\n fetchCalldata: markrPrepareCancellation,\n }),\n\n executePause: (props) =>\n executeOrderActionImpl({\n ...props,\n signatureReason: TransferSignatureReason.PauseRecurringSwap,\n apiOptions,\n evmSigner,\n fetchCalldata: markrPreparePause,\n }),\n\n executeUnpause: (props) =>\n executeOrderActionImpl({\n ...props,\n signatureReason: TransferSignatureReason.ResumeRecurringSwap,\n apiOptions,\n evmSigner,\n fetchCalldata: markrPrepareUnpause,\n }),\n\n checkEligibility: (props) => checkRecurringEligibility({ ...props, recurringChainInfo }),\n\n getRecurringChainInfo: () => recurringChainInfo,\n };\n}\n\n// ---------------------------------------------------------------------------\n// First-fill execution (allowance check + approve-if-needed + first-fill swap)\n// ---------------------------------------------------------------------------\n\ninterface ExecuteFirstFillImplParams extends RecurringExecuteFirstFillParams {\n apiOptions: ApiOptions;\n appId: string;\n evmSigner: EvmSigner;\n}\n\nasync function executeFirstFillImpl({\n apiOptions,\n appId,\n evmSigner,\n fallbackToDefaultOnBatchFailure,\n fromAddress,\n gasSettings,\n quote,\n signerContext,\n sourceChain,\n}: ExecuteFirstFillImplParams): Promise<RecurringExecuteResult> {\n // Mirror the one-shot guard at `TransferManager.estimateNativeFee` — fail at\n // the SDK boundary with `QUOTE_EXPIRED` instead of an opaque `HttpError`\n // from `/recurring/swap` for a slow-to-approve user.\n const now = Math.floor(Date.now() / 1_000);\n if (quote.expiredAt <= now) {\n const expiredSecondsAgo = now - quote.expiredAt;\n throw new InvalidParamsError(\n ErrorReason.QUOTE_EXPIRED,\n `Recurring quote expired ${expiredSecondsAgo} seconds ago.`,\n );\n }\n\n // Wiring-mistake guard: the passed `sourceChain.chainId` (CAIP-2) must agree\n // with the `chainId` (numeric) the quote was issued against. Otherwise the\n // allowance / gas reads hit the wrong chain.\n const sourceChainIdNumeric = caip2ToEip155ChainId(sourceChain.chainId);\n if (sourceChainIdNumeric !== quote.chainId) {\n throw new InvalidParamsError(\n 'sourceChain does not match quote.chainId',\n `sourceChain.chainId=${sourceChain.chainId} resolves to ${sourceChainIdNumeric}, but quote.chainId=${quote.chainId}.`,\n );\n }\n\n const sourceClient = getEvmClientForChain({ chain: sourceChain });\n const chainIdHex = caip2ToEip155HexChainId(sourceChain.chainId);\n\n const { address: spenderAddress } = await markrGetSpenderAddress(apiOptions, {\n chainId: quote.chainId,\n crossChainSwap: false,\n quoteId: quote.uuid,\n });\n\n if (!spenderAddress) {\n throw new SdkError(ErrorReason.CHAIN_NOT_SUPPORTED, ErrorCode.INVALID_PARAMS, {\n details: `Missing Markr spender address for source chain ${sourceChain.chainId}.`,\n });\n }\n\n const approvalRequest = await buildErc20ApprovalRequest({\n chainIdHex,\n client: sourceClient,\n gasSettings,\n owner: fromAddress,\n requiredAllowance: quote.totalAmountIn,\n spender: spenderAddress,\n token: quote.tokenIn,\n });\n\n const syntheticQuote = buildSyntheticQuoteForFirstFill({ fromAddress, quote, sourceChain });\n\n const swap = await markrRecurringSwap(apiOptions, { uuid: quote.uuid, appId });\n\n // One-click batch path: same-chain DCA, approval required, signer exposes\n // `signBatch`. Matches `_executeEvmTransfer`'s eligibility check (recurring\n // is always same-chain so the cross-chain check there collapses to true).\n if (approvalRequest !== undefined && typeof evmSigner.signBatch === 'function') {\n const batchStep: TransferStepDetails = {\n currentSignature: 1,\n currentSignatureReason: TransferSignatureReason.ScheduleRecurringSwap,\n quote: syntheticQuote,\n requiredSignatures: 1,\n signerContext,\n };\n\n // Gas is left undefined on the swap leg — the wallet handles batched gas\n // estimation since the approval hasn't executed yet.\n const swapRequest: EvmTransactionRequest = {\n chainId: chainIdHex,\n data: swap.data,\n from: fromAddress,\n gas: undefined,\n to: swap.to,\n value: swap.value,\n ...maybe1559(gasSettings),\n };\n\n try {\n const txHashes = await evmSigner.signBatch(\n [approvalRequest, swapRequest],\n (signedTxHash) => sourceClient.sendRawTransaction({ serializedTransaction: signedTxHash }),\n batchStep,\n );\n const swapTxHash = txHashes.at(-1);\n if (!swapTxHash) {\n throw new SdkError('One-click batch signing returned no transaction hashes.', ErrorCode.SIGNING_FAILED);\n }\n return { txHash: swapTxHash };\n } catch (error) {\n if (!fallbackToDefaultOnBatchFailure) {\n throw error;\n }\n // Fall through to the two-signature path below.\n }\n }\n\n if (approvalRequest) {\n await signApprovalAndAssertConfirmed({\n client: sourceClient,\n evmSigner,\n request: approvalRequest,\n step: {\n currentSignature: 1,\n currentSignatureReason: TransferSignatureReason.AllowanceApproval,\n quote: syntheticQuote,\n requiredSignatures: 2,\n signerContext,\n },\n });\n }\n\n // Use the Markr same-chain swap wrapper ABI for best-effort revert decoding\n // — matches `_estimateGasFromSwapResponse` in `estimate-native-fee.ts`.\n // Recurring is always same-chain, so `crossChain: false`. Built-in\n // `Error(string)` / `Panic(uint256)` are decoded regardless of ABI.\n const markrAbi = await getMarkrSwapWrapperAbi(false);\n const swapGasEstimate = await estimateGasWithRevert(\n sourceClient,\n { account: fromAddress, to: swap.to, data: swap.data, value: swap.value },\n markrAbi,\n 'Failed to estimate gas for recurring first-fill swap transaction.',\n );\n\n const swapRequest: EvmTransactionRequest = {\n chainId: chainIdHex,\n data: swap.data,\n from: fromAddress,\n gas: applyFeeUnitsBpsMargin(swapGasEstimate, gasSettings?.estimateGasMarginBps),\n to: swap.to,\n value: swap.value,\n ...maybe1559(gasSettings),\n };\n\n const swapStep: TransferStepDetails = {\n currentSignature: approvalRequest ? 2 : 1,\n currentSignatureReason: TransferSignatureReason.ScheduleRecurringSwap,\n quote: syntheticQuote,\n requiredSignatures: approvalRequest ? 2 : 1,\n signerContext,\n };\n\n const txHash = await evmSigner.sign(\n swapRequest,\n (signedTxHash) => sourceClient.sendRawTransaction({ serializedTransaction: signedTxHash }),\n swapStep,\n );\n\n return { txHash };\n}\n\n// ---------------------------------------------------------------------------\n// Order-action execution (cancel / pause / unpause — single-tx state change)\n// ---------------------------------------------------------------------------\n\ninterface ExecuteOrderActionImplParams extends RecurringExecuteOrderActionParams {\n signatureReason:\n | TransferSignatureReason.PauseRecurringSwap\n | TransferSignatureReason.ResumeRecurringSwap\n | TransferSignatureReason.CancelRecurringSwap;\n apiOptions: ApiOptions;\n evmSigner: EvmSigner;\n fetchCalldata: (\n apiOptions: ApiOptions,\n params: { orderId: `0x${string}`; address: `0x${string}`; chainId: number },\n ) => Promise<WrappedSwapTransactionResponse>;\n}\n\n// Short verbs for error-message interpolation — avoids the doubled-\"recurring\"\n// + kebab-case-in-prose readout you'd get from interpolating the raw enum\n// wire value (e.g. `recurring pause-recurring-swap transaction`).\nconst ORDER_ACTION_LABEL: Record<ExecuteOrderActionImplParams['signatureReason'], string> = {\n [TransferSignatureReason.PauseRecurringSwap]: 'pause',\n [TransferSignatureReason.ResumeRecurringSwap]: 'resume',\n [TransferSignatureReason.CancelRecurringSwap]: 'cancel',\n};\n\nasync function executeOrderActionImpl({\n signatureReason,\n address,\n apiOptions,\n evmSigner,\n fetchCalldata,\n gasSettings,\n orderId,\n signerContext,\n sourceChain,\n}: ExecuteOrderActionImplParams): Promise<RecurringExecuteResult> {\n const sourceClient = getEvmClientForChain({ chain: sourceChain });\n const chainIdNumeric = caip2ToEip155ChainId(sourceChain.chainId);\n const chainIdHex = caip2ToEip155HexChainId(sourceChain.chainId);\n\n const calldata = await fetchCalldata(apiOptions, { orderId, address, chainId: chainIdNumeric });\n\n const gasEstimate = await estimateGasWithRevert(\n sourceClient,\n { account: address, to: calldata.to, data: calldata.data, value: calldata.value },\n erc20Abi,\n `Failed to estimate gas for recurring ${ORDER_ACTION_LABEL[signatureReason]} transaction.`,\n );\n\n const request: EvmTransactionRequest = {\n chainId: chainIdHex,\n data: calldata.data,\n from: address,\n gas: applyFeeUnitsBpsMargin(gasEstimate, gasSettings?.estimateGasMarginBps),\n to: calldata.to,\n value: calldata.value,\n ...maybe1559(gasSettings),\n };\n\n const step: TransferStepDetails = {\n currentSignature: 1,\n currentSignatureReason: signatureReason,\n quote: buildSyntheticQuoteForOrderAction({ address, signatureReason, orderId, sourceChain }),\n requiredSignatures: 1,\n signerContext,\n };\n\n const txHash = await evmSigner.sign(\n request,\n (signedTxHash) => sourceClient.sendRawTransaction({ serializedTransaction: signedTxHash }),\n step,\n );\n\n return { txHash };\n}\n\n// ---------------------------------------------------------------------------\n// Internal: synthetic Quote objects for `TransferStepDetails.quote`\n// ---------------------------------------------------------------------------\n\n/**\n * Builds a minimum-viable {@link Quote} for the signer step so consumer\n * `EvmSigner` impls can render meaningful wallet prompts for a recurring\n * action (which has no real `Quote` in the swap-quoter sense). The synthetic\n * value carries enough recurring context (uuid, chain, amounts, tokens) for\n * a wallet UI to label the popup; the `aggregator.id` (`'markr-recurring'`)\n * lets advanced signers detect the recurring path explicitly.\n *\n * Asset fields use placeholder `name`/`symbol`/`decimals` because the\n * recurring quote doesn't echo those — consumers needing rich asset display\n * should resolve token metadata against their own asset map keyed by\n * `quote.tokenIn`/`tokenOut`.\n */\nfunction buildSyntheticQuoteForFirstFill({\n fromAddress,\n quote,\n sourceChain,\n}: {\n fromAddress: `0x${string}`;\n quote: RecurringQuoteResponse;\n sourceChain: Chain;\n}): Quote {\n return {\n // Keep the stable `'markr-recurring'` marker (shipped in #240) — consumer\n // signers may detect the recurring path via `quote.aggregator.id`. The\n // typed `TransferStepDetails.currentSignatureReason` is now the preferred\n // discriminant for new integrations, but this id stays for back-compat.\n aggregator: { id: 'markr-recurring', name: 'Markr recurring' },\n amountIn: quote.amount,\n amountOut: quote.amountOut,\n assetIn: { type: TokenType.ERC20, address: quote.tokenIn, name: '', symbol: '', decimals: 0 },\n assetOut: { type: TokenType.ERC20, address: quote.tokenOut, name: '', symbol: '', decimals: 0 },\n expiresAt: quote.expiredAt,\n fees: [],\n fromAddress,\n id: quote.uuid,\n partnerFeeBps: null,\n serviceType: ServiceType.MARKR,\n slippageBps: quote.recommendedSlippage,\n // Pass the caller-provided `Chain` straight through — recurring is always\n // same-chain, so source === target. Avoids stripping `chainName` /\n // `networkToken` / `rpcUrl` that consumer signers may use for display.\n sourceChain,\n targetChain: sourceChain,\n toAddress: fromAddress,\n };\n}\n\nfunction buildSyntheticQuoteForOrderAction({\n signatureReason,\n address,\n orderId,\n sourceChain,\n}: {\n signatureReason:\n | TransferSignatureReason.PauseRecurringSwap\n | TransferSignatureReason.ResumeRecurringSwap\n | TransferSignatureReason.CancelRecurringSwap;\n address: `0x${string}`;\n orderId: `0x${string}`;\n sourceChain: Chain;\n}): Quote {\n const action = ORDER_ACTION_LABEL[signatureReason];\n return {\n // Same back-compat rationale as `buildSyntheticQuoteForFirstFill` — preserve\n // the original lowercase `markr-recurring-${action}` id shape (shipped in\n // #240) so consumers keying off `quote.aggregator.id` keep working.\n aggregator: {\n id: `markr-recurring-${action}`,\n name: `Markr recurring (${action})`,\n },\n amountIn: 0n,\n amountOut: 0n,\n assetIn: emptyNativeAsset(),\n assetOut: emptyNativeAsset(),\n expiresAt: 0,\n fees: [],\n fromAddress: address,\n id: orderId,\n partnerFeeBps: null,\n serviceType: ServiceType.MARKR,\n slippageBps: 0,\n // See `buildSyntheticQuoteForFirstFill` — pass the real `Chain` through.\n sourceChain,\n targetChain: sourceChain,\n toAddress: address,\n };\n}\n\nfunction emptyNativeAsset() {\n return { type: TokenType.NATIVE, name: '', symbol: '', decimals: 0 } as const;\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ServiceType as e,TokenType as t,TransferSignatureReason as n}from"../../../constants.js";import{ErrorCode as r,ErrorReason as i,InvalidParamsError as a,SdkError as o}from"../../../errors.js";import{caip2ToEip155ChainId as s,caip2ToEip155HexChainId as c}from"../../../utils/caip.js";import{applyFeeUnitsBpsMargin as l,getEvmClientForChain as u,maybe1559 as d}from"../../_utils.js";import{estimateGasWithRevert as f}from"../../_evm-errors.js";import{buildErc20ApprovalRequest as p,signApprovalAndAssertConfirmed as m}from"../../_evm-approval.js";import{markrGetSpenderAddress as h}from"../_api.js";import{getMarkrSwapWrapperAbi as g}from"../_utils.js";import{markrListRecurringOrders as _,markrPrepareCancellation as v,markrPreparePause as y,markrPrepareUnpause as b,markrRecurringQuote as x,markrRecurringSwap as S}from"./_api.js";import{checkRecurringEligibility as C}from"./_eligibility.js";import{erc20Abi as w}from"viem";function T({apiOptions:e,appId:t,evmSigner:
|
|
1
|
+
import{ServiceType as e,TokenType as t,TransferSignatureReason as n}from"../../../constants.js";import{ErrorCode as r,ErrorReason as i,InvalidParamsError as a,SdkError as o}from"../../../errors.js";import{caip2ToEip155ChainId as s,caip2ToEip155HexChainId as c}from"../../../utils/caip.js";import{applyFeeUnitsBpsMargin as l,getEvmClientForChain as u,maybe1559 as d}from"../../_utils.js";import{estimateGasWithRevert as f}from"../../_evm-errors.js";import{buildErc20ApprovalRequest as p,signApprovalAndAssertConfirmed as m}from"../../_evm-approval.js";import{markrGetSpenderAddress as h}from"../_api.js";import{getMarkrSwapWrapperAbi as g}from"../_utils.js";import{markrListRecurringOrders as _,markrPrepareCancellation as v,markrPreparePause as y,markrPrepareUnpause as b,markrRecurringQuote as x,markrRecurringSwap as S}from"./_api.js";import{checkRecurringEligibility as C}from"./_eligibility.js";import{erc20Abi as w}from"viem";function T({apiOptions:e,appId:t,evmSigner:r,recurringChainInfo:i}){return{quote:n=>x(e,{...n,appId:t}),executeFirstFill:n=>E({...n,apiOptions:e,appId:t,evmSigner:r}),listOrders:t=>_(e,t),executeCancellation:t=>O({...t,signatureReason:n.CancelRecurringSwap,apiOptions:e,evmSigner:r,fetchCalldata:v}),executePause:t=>O({...t,signatureReason:n.PauseRecurringSwap,apiOptions:e,evmSigner:r,fetchCalldata:y}),executeUnpause:t=>O({...t,signatureReason:n.ResumeRecurringSwap,apiOptions:e,evmSigner:r,fetchCalldata:b}),checkEligibility:e=>C({...e,recurringChainInfo:i}),getRecurringChainInfo:()=>i}}async function E({apiOptions:e,appId:t,evmSigner:_,fallbackToDefaultOnBatchFailure:v,fromAddress:y,gasSettings:b,quote:x,signerContext:C,sourceChain:w}){let T=Math.floor(Date.now()/1e3);if(x.expiredAt<=T){let e=T-x.expiredAt;throw new a(i.QUOTE_EXPIRED,`Recurring quote expired ${e} seconds ago.`)}let E=s(w.chainId);if(E!==x.chainId)throw new a(`sourceChain does not match quote.chainId`,`sourceChain.chainId=${w.chainId} resolves to ${E}, but quote.chainId=${x.chainId}.`);let D=u({chain:w}),O=c(w.chainId),{address:A}=await h(e,{chainId:x.chainId,crossChainSwap:!1,quoteId:x.uuid});if(!A)throw new o(i.CHAIN_NOT_SUPPORTED,r.INVALID_PARAMS,{details:`Missing Markr spender address for source chain ${w.chainId}.`});let j=await p({chainIdHex:O,client:D,gasSettings:b,owner:y,requiredAllowance:x.totalAmountIn,spender:A,token:x.tokenIn}),M=k({fromAddress:y,quote:x,sourceChain:w}),N=await S(e,{uuid:x.uuid,appId:t});if(j!==void 0&&typeof _.signBatch==`function`){let e={currentSignature:1,currentSignatureReason:n.ScheduleRecurringSwap,quote:M,requiredSignatures:1,signerContext:C},t={chainId:O,data:N.data,from:y,gas:void 0,to:N.to,value:N.value,...d(b)};try{let n=(await _.signBatch([j,t],e=>D.sendRawTransaction({serializedTransaction:e}),e)).at(-1);if(!n)throw new o(`One-click batch signing returned no transaction hashes.`,r.SIGNING_FAILED);return{txHash:n}}catch(e){if(!v)throw e}}j&&await m({client:D,evmSigner:_,request:j,step:{currentSignature:1,currentSignatureReason:n.AllowanceApproval,quote:M,requiredSignatures:2,signerContext:C}});let P=await g(!1),F=await f(D,{account:y,to:N.to,data:N.data,value:N.value},P,`Failed to estimate gas for recurring first-fill swap transaction.`),I={chainId:O,data:N.data,from:y,gas:l(F,b?.estimateGasMarginBps),to:N.to,value:N.value,...d(b)},L={currentSignature:j?2:1,currentSignatureReason:n.ScheduleRecurringSwap,quote:M,requiredSignatures:j?2:1,signerContext:C};return{txHash:await _.sign(I,e=>D.sendRawTransaction({serializedTransaction:e}),L)}}const D={[n.PauseRecurringSwap]:`pause`,[n.ResumeRecurringSwap]:`resume`,[n.CancelRecurringSwap]:`cancel`};async function O({signatureReason:e,address:t,apiOptions:n,evmSigner:r,fetchCalldata:i,gasSettings:a,orderId:o,signerContext:p,sourceChain:m}){let h=u({chain:m}),g=s(m.chainId),_=c(m.chainId),v=await i(n,{orderId:o,address:t,chainId:g}),y=await f(h,{account:t,to:v.to,data:v.data,value:v.value},w,`Failed to estimate gas for recurring ${D[e]} transaction.`),b={chainId:_,data:v.data,from:t,gas:l(y,a?.estimateGasMarginBps),to:v.to,value:v.value,...d(a)},x={currentSignature:1,currentSignatureReason:e,quote:A({address:t,signatureReason:e,orderId:o,sourceChain:m}),requiredSignatures:1,signerContext:p};return{txHash:await r.sign(b,e=>h.sendRawTransaction({serializedTransaction:e}),x)}}function k({fromAddress:n,quote:r,sourceChain:i}){return{aggregator:{id:`markr-recurring`,name:`Markr recurring`},amountIn:r.amount,amountOut:r.amountOut,assetIn:{type:t.ERC20,address:r.tokenIn,name:``,symbol:``,decimals:0},assetOut:{type:t.ERC20,address:r.tokenOut,name:``,symbol:``,decimals:0},expiresAt:r.expiredAt,fees:[],fromAddress:n,id:r.uuid,partnerFeeBps:null,serviceType:e.MARKR,slippageBps:r.recommendedSlippage,sourceChain:i,targetChain:i,toAddress:n}}function A({signatureReason:t,address:n,orderId:r,sourceChain:i}){let a=D[t];return{aggregator:{id:`markr-recurring-${a}`,name:`Markr recurring (${a})`},amountIn:0n,amountOut:0n,assetIn:j(),assetOut:j(),expiresAt:0,fees:[],fromAddress:n,id:r,partnerFeeBps:null,serviceType:e.MARKR,slippageBps:0,sourceChain:i,targetChain:i,toAddress:n}}function j(){return{type:t.NATIVE,name:``,symbol:``,decimals:0}}export{T as createRecurringNamespace};
|
|
2
2
|
//# sourceMappingURL=_namespace.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_namespace.js","names":[],"sources":["../../../../src/transfer-service/markr/recurring/_namespace.ts"],"sourcesContent":["import { erc20Abi } from 'viem';\nimport { ServiceType, TokenType, TransferSignatureReason } from '../../../constants';\nimport { ErrorCode, ErrorReason, InvalidParamsError, SdkError } from '../../../errors';\nimport type { Chain } from '../../../types/chain';\nimport type { Quote } from '../../../types/quote';\nimport type { EvmSigner, EvmTransactionRequest } from '../../../types/signer';\nimport type { TransferStepDetails } from '../../../types/transfer';\nimport { caip2ToEip155ChainId, caip2ToEip155HexChainId } from '../../../utils/caip';\nimport { applyFeeUnitsBpsMargin, getEvmClientForChain, maybe1559 } from '../../_utils';\nimport { buildErc20ApprovalRequest, signApprovalAndAssertConfirmed } from '../../_evm-approval';\nimport { estimateGasWithRevert } from '../../_evm-errors';\nimport type { WrappedSwapTransactionResponse } from '../_schema';\nimport { markrGetSpenderAddress, type ApiOptions } from '../_api';\nimport { getMarkrSwapWrapperAbi } from '../_utils';\nimport {\n markrListRecurringOrders,\n markrPrepareCancellation,\n markrPreparePause,\n markrPrepareUnpause,\n markrRecurringQuote,\n markrRecurringSwap,\n} from './_api';\nimport { checkRecurringEligibility } from './_eligibility';\nimport type {\n RecurringChainInfoMap,\n RecurringExecuteFirstFillParams,\n RecurringExecuteOrderActionParams,\n RecurringExecuteResult,\n RecurringNamespace,\n RecurringQuoteResponse,\n} from './types';\n\nexport interface CreateRecurringNamespaceOptions {\n apiOptions: ApiOptions;\n appId: string;\n evmSigner: EvmSigner;\n /**\n * The cached `/info/chains` recurring metadata. Captured by value at\n * namespace construction time — matches how `partnerFeeBps`,\n * `supportedChains`, and `supportedTokens` are also frozen at\n * `createMarkrService` init. If staleness ever becomes a real consumer\n * concern, the fix is a top-level `manager.refresh()` (not a per-namespace\n * lazy-read pattern).\n */\n recurringChainInfo: RecurringChainInfoMap;\n}\n\nexport function createRecurringNamespace({\n apiOptions,\n appId,\n evmSigner,\n recurringChainInfo,\n}: CreateRecurringNamespaceOptions): RecurringNamespace {\n return {\n quote: (props) => markrRecurringQuote(apiOptions, { ...props, appId }),\n\n executeFirstFill: (props) => executeFirstFillImpl({ ...props, apiOptions, appId, evmSigner }),\n\n listOrders: (props) => markrListRecurringOrders(apiOptions, props),\n\n executeCancellation: (props) =>\n executeOrderActionImpl({\n ...props,\n action: 'cancel',\n apiOptions,\n evmSigner,\n fetchCalldata: markrPrepareCancellation,\n }),\n\n executePause: (props) =>\n executeOrderActionImpl({\n ...props,\n action: 'pause',\n apiOptions,\n evmSigner,\n fetchCalldata: markrPreparePause,\n }),\n\n executeUnpause: (props) =>\n executeOrderActionImpl({\n ...props,\n action: 'unpause',\n apiOptions,\n evmSigner,\n fetchCalldata: markrPrepareUnpause,\n }),\n\n checkEligibility: (props) => checkRecurringEligibility({ ...props, recurringChainInfo }),\n\n getRecurringChainInfo: () => recurringChainInfo,\n };\n}\n\n// ---------------------------------------------------------------------------\n// First-fill execution (allowance check + approve-if-needed + first-fill swap)\n// ---------------------------------------------------------------------------\n\ninterface ExecuteFirstFillImplParams extends RecurringExecuteFirstFillParams {\n apiOptions: ApiOptions;\n appId: string;\n evmSigner: EvmSigner;\n}\n\nasync function executeFirstFillImpl({\n apiOptions,\n appId,\n evmSigner,\n fallbackToDefaultOnBatchFailure,\n fromAddress,\n gasSettings,\n quote,\n sourceChain,\n}: ExecuteFirstFillImplParams): Promise<RecurringExecuteResult> {\n // Mirror the one-shot guard at `TransferManager.estimateNativeFee` — fail at\n // the SDK boundary with `QUOTE_EXPIRED` instead of an opaque `HttpError`\n // from `/recurring/swap` for a slow-to-approve user.\n const now = Math.floor(Date.now() / 1_000);\n if (quote.expiredAt <= now) {\n const expiredSecondsAgo = now - quote.expiredAt;\n throw new InvalidParamsError(\n ErrorReason.QUOTE_EXPIRED,\n `Recurring quote expired ${expiredSecondsAgo} seconds ago.`,\n );\n }\n\n // Wiring-mistake guard: the passed `sourceChain.chainId` (CAIP-2) must agree\n // with the `chainId` (numeric) the quote was issued against. Otherwise the\n // allowance / gas reads hit the wrong chain.\n const sourceChainIdNumeric = caip2ToEip155ChainId(sourceChain.chainId);\n if (sourceChainIdNumeric !== quote.chainId) {\n throw new InvalidParamsError(\n 'sourceChain does not match quote.chainId',\n `sourceChain.chainId=${sourceChain.chainId} resolves to ${sourceChainIdNumeric}, but quote.chainId=${quote.chainId}.`,\n );\n }\n\n const sourceClient = getEvmClientForChain({ chain: sourceChain });\n const chainIdHex = caip2ToEip155HexChainId(sourceChain.chainId);\n\n const { address: spenderAddress } = await markrGetSpenderAddress(apiOptions, {\n chainId: quote.chainId,\n crossChainSwap: false,\n quoteId: quote.uuid,\n });\n\n if (!spenderAddress) {\n throw new SdkError(ErrorReason.CHAIN_NOT_SUPPORTED, ErrorCode.INVALID_PARAMS, {\n details: `Missing Markr spender address for source chain ${sourceChain.chainId}.`,\n });\n }\n\n const approvalRequest = await buildErc20ApprovalRequest({\n chainIdHex,\n client: sourceClient,\n gasSettings,\n owner: fromAddress,\n requiredAllowance: quote.totalAmountIn,\n spender: spenderAddress,\n token: quote.tokenIn,\n });\n\n const syntheticQuote = buildSyntheticQuoteForFirstFill({ fromAddress, quote, sourceChain });\n\n const swap = await markrRecurringSwap(apiOptions, { uuid: quote.uuid, appId });\n\n // One-click batch path: same-chain DCA, approval required, signer exposes\n // `signBatch`. Matches `_executeEvmTransfer`'s eligibility check (recurring\n // is always same-chain so the cross-chain check there collapses to true).\n if (approvalRequest !== undefined && typeof evmSigner.signBatch === 'function') {\n const batchStep: TransferStepDetails = {\n currentSignature: 1,\n currentSignatureReason: TransferSignatureReason.TokensTransfer,\n quote: syntheticQuote,\n requiredSignatures: 1,\n };\n\n // Gas is left undefined on the swap leg — the wallet handles batched gas\n // estimation since the approval hasn't executed yet.\n const swapRequest: EvmTransactionRequest = {\n chainId: chainIdHex,\n data: swap.data,\n from: fromAddress,\n gas: undefined,\n to: swap.to,\n value: swap.value,\n ...maybe1559(gasSettings),\n };\n\n try {\n const txHashes = await evmSigner.signBatch(\n [approvalRequest, swapRequest],\n (signedTxHash) => sourceClient.sendRawTransaction({ serializedTransaction: signedTxHash }),\n batchStep,\n );\n const swapTxHash = txHashes.at(-1);\n if (!swapTxHash) {\n throw new SdkError('One-click batch signing returned no transaction hashes.', ErrorCode.SIGNING_FAILED);\n }\n return { txHash: swapTxHash };\n } catch (error) {\n if (!fallbackToDefaultOnBatchFailure) {\n throw error;\n }\n // Fall through to the two-signature path below.\n }\n }\n\n if (approvalRequest) {\n await signApprovalAndAssertConfirmed({\n client: sourceClient,\n evmSigner,\n request: approvalRequest,\n step: {\n currentSignature: 1,\n currentSignatureReason: TransferSignatureReason.AllowanceApproval,\n quote: syntheticQuote,\n requiredSignatures: 2,\n },\n });\n }\n\n // Use the Markr same-chain swap wrapper ABI for best-effort revert decoding\n // — matches `_estimateGasFromSwapResponse` in `estimate-native-fee.ts`.\n // Recurring is always same-chain, so `crossChain: false`. Built-in\n // `Error(string)` / `Panic(uint256)` are decoded regardless of ABI.\n const markrAbi = await getMarkrSwapWrapperAbi(false);\n const swapGasEstimate = await estimateGasWithRevert(\n sourceClient,\n { account: fromAddress, to: swap.to, data: swap.data, value: swap.value },\n markrAbi,\n 'Failed to estimate gas for recurring first-fill swap transaction.',\n );\n\n const swapRequest: EvmTransactionRequest = {\n chainId: chainIdHex,\n data: swap.data,\n from: fromAddress,\n gas: applyFeeUnitsBpsMargin(swapGasEstimate, gasSettings?.estimateGasMarginBps),\n to: swap.to,\n value: swap.value,\n ...maybe1559(gasSettings),\n };\n\n const swapStep: TransferStepDetails = {\n currentSignature: approvalRequest ? 2 : 1,\n currentSignatureReason: TransferSignatureReason.TokensTransfer,\n quote: syntheticQuote,\n requiredSignatures: approvalRequest ? 2 : 1,\n };\n\n const txHash = await evmSigner.sign(\n swapRequest,\n (signedTxHash) => sourceClient.sendRawTransaction({ serializedTransaction: signedTxHash }),\n swapStep,\n );\n\n return { txHash };\n}\n\n// ---------------------------------------------------------------------------\n// Order-action execution (cancel / pause / unpause — single-tx state change)\n// ---------------------------------------------------------------------------\n\ninterface ExecuteOrderActionImplParams extends RecurringExecuteOrderActionParams {\n action: 'cancel' | 'pause' | 'unpause';\n apiOptions: ApiOptions;\n evmSigner: EvmSigner;\n fetchCalldata: (\n apiOptions: ApiOptions,\n params: { orderId: `0x${string}`; address: `0x${string}`; chainId: number },\n ) => Promise<WrappedSwapTransactionResponse>;\n}\n\nasync function executeOrderActionImpl({\n action,\n address,\n apiOptions,\n evmSigner,\n fetchCalldata,\n gasSettings,\n orderId,\n sourceChain,\n}: ExecuteOrderActionImplParams): Promise<RecurringExecuteResult> {\n const sourceClient = getEvmClientForChain({ chain: sourceChain });\n const chainIdNumeric = caip2ToEip155ChainId(sourceChain.chainId);\n const chainIdHex = caip2ToEip155HexChainId(sourceChain.chainId);\n\n const calldata = await fetchCalldata(apiOptions, { orderId, address, chainId: chainIdNumeric });\n\n const gasEstimate = await estimateGasWithRevert(\n sourceClient,\n { account: address, to: calldata.to, data: calldata.data, value: calldata.value },\n erc20Abi,\n `Failed to estimate gas for recurring ${action} transaction.`,\n );\n\n const request: EvmTransactionRequest = {\n chainId: chainIdHex,\n data: calldata.data,\n from: address,\n gas: applyFeeUnitsBpsMargin(gasEstimate, gasSettings?.estimateGasMarginBps),\n to: calldata.to,\n value: calldata.value,\n ...maybe1559(gasSettings),\n };\n\n const step: TransferStepDetails = {\n currentSignature: 1,\n currentSignatureReason: TransferSignatureReason.TokensTransfer,\n quote: buildSyntheticQuoteForOrderAction({ address, action, orderId, sourceChain }),\n requiredSignatures: 1,\n };\n\n const txHash = await evmSigner.sign(\n request,\n (signedTxHash) => sourceClient.sendRawTransaction({ serializedTransaction: signedTxHash }),\n step,\n );\n\n return { txHash };\n}\n\n// ---------------------------------------------------------------------------\n// Internal: synthetic Quote objects for `TransferStepDetails.quote`\n// ---------------------------------------------------------------------------\n\n/**\n * Builds a minimum-viable {@link Quote} for the signer step so consumer\n * `EvmSigner` impls can render meaningful wallet prompts for a recurring\n * action (which has no real `Quote` in the swap-quoter sense). The synthetic\n * value carries enough recurring context (uuid, chain, amounts, tokens) for\n * a wallet UI to label the popup; the `aggregator.id` (`'markr-recurring'`)\n * lets advanced signers detect the recurring path explicitly.\n *\n * Asset fields use placeholder `name`/`symbol`/`decimals` because the\n * recurring quote doesn't echo those — consumers needing rich asset display\n * should resolve token metadata against their own asset map keyed by\n * `quote.tokenIn`/`tokenOut`.\n */\nfunction buildSyntheticQuoteForFirstFill({\n fromAddress,\n quote,\n sourceChain,\n}: {\n fromAddress: `0x${string}`;\n quote: RecurringQuoteResponse;\n sourceChain: Chain;\n}): Quote {\n return {\n aggregator: { id: 'markr-recurring', name: 'Markr Recurring' },\n amountIn: quote.amount,\n amountOut: quote.amountOut,\n assetIn: { type: TokenType.ERC20, address: quote.tokenIn, name: '', symbol: '', decimals: 0 },\n assetOut: { type: TokenType.ERC20, address: quote.tokenOut, name: '', symbol: '', decimals: 0 },\n expiresAt: quote.expiredAt,\n fees: [],\n fromAddress,\n id: quote.uuid,\n partnerFeeBps: null,\n serviceType: ServiceType.MARKR,\n slippageBps: quote.recommendedSlippage,\n // Pass the caller-provided `Chain` straight through — recurring is always\n // same-chain, so source === target. Avoids stripping `chainName` /\n // `networkToken` / `rpcUrl` that consumer signers may use for display.\n sourceChain,\n targetChain: sourceChain,\n toAddress: fromAddress,\n };\n}\n\nfunction buildSyntheticQuoteForOrderAction({\n action,\n address,\n orderId,\n sourceChain,\n}: {\n action: 'cancel' | 'pause' | 'unpause';\n address: `0x${string}`;\n orderId: `0x${string}`;\n sourceChain: Chain;\n}): Quote {\n return {\n aggregator: { id: `markr-recurring-${action}`, name: `Markr Recurring (${action})` },\n amountIn: 0n,\n amountOut: 0n,\n assetIn: emptyNativeAsset(),\n assetOut: emptyNativeAsset(),\n expiresAt: 0,\n fees: [],\n fromAddress: address,\n id: orderId,\n partnerFeeBps: null,\n serviceType: ServiceType.MARKR,\n slippageBps: 0,\n // See `buildSyntheticQuoteForFirstFill` — pass the real `Chain` through.\n sourceChain,\n targetChain: sourceChain,\n toAddress: address,\n };\n}\n\nfunction emptyNativeAsset() {\n return { type: TokenType.NATIVE, name: '', symbol: '', decimals: 0 } as const;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"_namespace.js","names":[],"sources":["../../../../src/transfer-service/markr/recurring/_namespace.ts"],"sourcesContent":["import { erc20Abi } from 'viem';\nimport { ServiceType, TokenType, TransferSignatureReason } from '../../../constants';\nimport { ErrorCode, ErrorReason, InvalidParamsError, SdkError } from '../../../errors';\nimport type { Chain } from '../../../types/chain';\nimport type { Quote } from '../../../types/quote';\nimport type { EvmSigner, EvmTransactionRequest } from '../../../types/signer';\nimport type { TransferStepDetails } from '../../../types/transfer';\nimport { caip2ToEip155ChainId, caip2ToEip155HexChainId } from '../../../utils/caip';\nimport { applyFeeUnitsBpsMargin, getEvmClientForChain, maybe1559 } from '../../_utils';\nimport { buildErc20ApprovalRequest, signApprovalAndAssertConfirmed } from '../../_evm-approval';\nimport { estimateGasWithRevert } from '../../_evm-errors';\nimport type { WrappedSwapTransactionResponse } from '../_schema';\nimport { markrGetSpenderAddress, type ApiOptions } from '../_api';\nimport { getMarkrSwapWrapperAbi } from '../_utils';\nimport {\n markrListRecurringOrders,\n markrPrepareCancellation,\n markrPreparePause,\n markrPrepareUnpause,\n markrRecurringQuote,\n markrRecurringSwap,\n} from './_api';\nimport { checkRecurringEligibility } from './_eligibility';\nimport type {\n RecurringChainInfoMap,\n RecurringExecuteFirstFillParams,\n RecurringExecuteOrderActionParams,\n RecurringExecuteResult,\n RecurringNamespace,\n RecurringQuoteResponse,\n} from './types';\n\nexport interface CreateRecurringNamespaceOptions {\n apiOptions: ApiOptions;\n appId: string;\n evmSigner: EvmSigner;\n /**\n * The cached `/info/chains` recurring metadata. Captured by value at\n * namespace construction time — matches how `partnerFeeBps`,\n * `supportedChains`, and `supportedTokens` are also frozen at\n * `createMarkrService` init. If staleness ever becomes a real consumer\n * concern, the fix is a top-level `manager.refresh()` (not a per-namespace\n * lazy-read pattern).\n */\n recurringChainInfo: RecurringChainInfoMap;\n}\n\nexport function createRecurringNamespace({\n apiOptions,\n appId,\n evmSigner,\n recurringChainInfo,\n}: CreateRecurringNamespaceOptions): RecurringNamespace {\n return {\n quote: (props) => markrRecurringQuote(apiOptions, { ...props, appId }),\n\n executeFirstFill: (props) => executeFirstFillImpl({ ...props, apiOptions, appId, evmSigner }),\n\n listOrders: (props) => markrListRecurringOrders(apiOptions, props),\n\n executeCancellation: (props) =>\n executeOrderActionImpl({\n ...props,\n signatureReason: TransferSignatureReason.CancelRecurringSwap,\n apiOptions,\n evmSigner,\n fetchCalldata: markrPrepareCancellation,\n }),\n\n executePause: (props) =>\n executeOrderActionImpl({\n ...props,\n signatureReason: TransferSignatureReason.PauseRecurringSwap,\n apiOptions,\n evmSigner,\n fetchCalldata: markrPreparePause,\n }),\n\n executeUnpause: (props) =>\n executeOrderActionImpl({\n ...props,\n signatureReason: TransferSignatureReason.ResumeRecurringSwap,\n apiOptions,\n evmSigner,\n fetchCalldata: markrPrepareUnpause,\n }),\n\n checkEligibility: (props) => checkRecurringEligibility({ ...props, recurringChainInfo }),\n\n getRecurringChainInfo: () => recurringChainInfo,\n };\n}\n\n// ---------------------------------------------------------------------------\n// First-fill execution (allowance check + approve-if-needed + first-fill swap)\n// ---------------------------------------------------------------------------\n\ninterface ExecuteFirstFillImplParams extends RecurringExecuteFirstFillParams {\n apiOptions: ApiOptions;\n appId: string;\n evmSigner: EvmSigner;\n}\n\nasync function executeFirstFillImpl({\n apiOptions,\n appId,\n evmSigner,\n fallbackToDefaultOnBatchFailure,\n fromAddress,\n gasSettings,\n quote,\n signerContext,\n sourceChain,\n}: ExecuteFirstFillImplParams): Promise<RecurringExecuteResult> {\n // Mirror the one-shot guard at `TransferManager.estimateNativeFee` — fail at\n // the SDK boundary with `QUOTE_EXPIRED` instead of an opaque `HttpError`\n // from `/recurring/swap` for a slow-to-approve user.\n const now = Math.floor(Date.now() / 1_000);\n if (quote.expiredAt <= now) {\n const expiredSecondsAgo = now - quote.expiredAt;\n throw new InvalidParamsError(\n ErrorReason.QUOTE_EXPIRED,\n `Recurring quote expired ${expiredSecondsAgo} seconds ago.`,\n );\n }\n\n // Wiring-mistake guard: the passed `sourceChain.chainId` (CAIP-2) must agree\n // with the `chainId` (numeric) the quote was issued against. Otherwise the\n // allowance / gas reads hit the wrong chain.\n const sourceChainIdNumeric = caip2ToEip155ChainId(sourceChain.chainId);\n if (sourceChainIdNumeric !== quote.chainId) {\n throw new InvalidParamsError(\n 'sourceChain does not match quote.chainId',\n `sourceChain.chainId=${sourceChain.chainId} resolves to ${sourceChainIdNumeric}, but quote.chainId=${quote.chainId}.`,\n );\n }\n\n const sourceClient = getEvmClientForChain({ chain: sourceChain });\n const chainIdHex = caip2ToEip155HexChainId(sourceChain.chainId);\n\n const { address: spenderAddress } = await markrGetSpenderAddress(apiOptions, {\n chainId: quote.chainId,\n crossChainSwap: false,\n quoteId: quote.uuid,\n });\n\n if (!spenderAddress) {\n throw new SdkError(ErrorReason.CHAIN_NOT_SUPPORTED, ErrorCode.INVALID_PARAMS, {\n details: `Missing Markr spender address for source chain ${sourceChain.chainId}.`,\n });\n }\n\n const approvalRequest = await buildErc20ApprovalRequest({\n chainIdHex,\n client: sourceClient,\n gasSettings,\n owner: fromAddress,\n requiredAllowance: quote.totalAmountIn,\n spender: spenderAddress,\n token: quote.tokenIn,\n });\n\n const syntheticQuote = buildSyntheticQuoteForFirstFill({ fromAddress, quote, sourceChain });\n\n const swap = await markrRecurringSwap(apiOptions, { uuid: quote.uuid, appId });\n\n // One-click batch path: same-chain DCA, approval required, signer exposes\n // `signBatch`. Matches `_executeEvmTransfer`'s eligibility check (recurring\n // is always same-chain so the cross-chain check there collapses to true).\n if (approvalRequest !== undefined && typeof evmSigner.signBatch === 'function') {\n const batchStep: TransferStepDetails = {\n currentSignature: 1,\n currentSignatureReason: TransferSignatureReason.ScheduleRecurringSwap,\n quote: syntheticQuote,\n requiredSignatures: 1,\n signerContext,\n };\n\n // Gas is left undefined on the swap leg — the wallet handles batched gas\n // estimation since the approval hasn't executed yet.\n const swapRequest: EvmTransactionRequest = {\n chainId: chainIdHex,\n data: swap.data,\n from: fromAddress,\n gas: undefined,\n to: swap.to,\n value: swap.value,\n ...maybe1559(gasSettings),\n };\n\n try {\n const txHashes = await evmSigner.signBatch(\n [approvalRequest, swapRequest],\n (signedTxHash) => sourceClient.sendRawTransaction({ serializedTransaction: signedTxHash }),\n batchStep,\n );\n const swapTxHash = txHashes.at(-1);\n if (!swapTxHash) {\n throw new SdkError('One-click batch signing returned no transaction hashes.', ErrorCode.SIGNING_FAILED);\n }\n return { txHash: swapTxHash };\n } catch (error) {\n if (!fallbackToDefaultOnBatchFailure) {\n throw error;\n }\n // Fall through to the two-signature path below.\n }\n }\n\n if (approvalRequest) {\n await signApprovalAndAssertConfirmed({\n client: sourceClient,\n evmSigner,\n request: approvalRequest,\n step: {\n currentSignature: 1,\n currentSignatureReason: TransferSignatureReason.AllowanceApproval,\n quote: syntheticQuote,\n requiredSignatures: 2,\n signerContext,\n },\n });\n }\n\n // Use the Markr same-chain swap wrapper ABI for best-effort revert decoding\n // — matches `_estimateGasFromSwapResponse` in `estimate-native-fee.ts`.\n // Recurring is always same-chain, so `crossChain: false`. Built-in\n // `Error(string)` / `Panic(uint256)` are decoded regardless of ABI.\n const markrAbi = await getMarkrSwapWrapperAbi(false);\n const swapGasEstimate = await estimateGasWithRevert(\n sourceClient,\n { account: fromAddress, to: swap.to, data: swap.data, value: swap.value },\n markrAbi,\n 'Failed to estimate gas for recurring first-fill swap transaction.',\n );\n\n const swapRequest: EvmTransactionRequest = {\n chainId: chainIdHex,\n data: swap.data,\n from: fromAddress,\n gas: applyFeeUnitsBpsMargin(swapGasEstimate, gasSettings?.estimateGasMarginBps),\n to: swap.to,\n value: swap.value,\n ...maybe1559(gasSettings),\n };\n\n const swapStep: TransferStepDetails = {\n currentSignature: approvalRequest ? 2 : 1,\n currentSignatureReason: TransferSignatureReason.ScheduleRecurringSwap,\n quote: syntheticQuote,\n requiredSignatures: approvalRequest ? 2 : 1,\n signerContext,\n };\n\n const txHash = await evmSigner.sign(\n swapRequest,\n (signedTxHash) => sourceClient.sendRawTransaction({ serializedTransaction: signedTxHash }),\n swapStep,\n );\n\n return { txHash };\n}\n\n// ---------------------------------------------------------------------------\n// Order-action execution (cancel / pause / unpause — single-tx state change)\n// ---------------------------------------------------------------------------\n\ninterface ExecuteOrderActionImplParams extends RecurringExecuteOrderActionParams {\n signatureReason:\n | TransferSignatureReason.PauseRecurringSwap\n | TransferSignatureReason.ResumeRecurringSwap\n | TransferSignatureReason.CancelRecurringSwap;\n apiOptions: ApiOptions;\n evmSigner: EvmSigner;\n fetchCalldata: (\n apiOptions: ApiOptions,\n params: { orderId: `0x${string}`; address: `0x${string}`; chainId: number },\n ) => Promise<WrappedSwapTransactionResponse>;\n}\n\n// Short verbs for error-message interpolation — avoids the doubled-\"recurring\"\n// + kebab-case-in-prose readout you'd get from interpolating the raw enum\n// wire value (e.g. `recurring pause-recurring-swap transaction`).\nconst ORDER_ACTION_LABEL: Record<ExecuteOrderActionImplParams['signatureReason'], string> = {\n [TransferSignatureReason.PauseRecurringSwap]: 'pause',\n [TransferSignatureReason.ResumeRecurringSwap]: 'resume',\n [TransferSignatureReason.CancelRecurringSwap]: 'cancel',\n};\n\nasync function executeOrderActionImpl({\n signatureReason,\n address,\n apiOptions,\n evmSigner,\n fetchCalldata,\n gasSettings,\n orderId,\n signerContext,\n sourceChain,\n}: ExecuteOrderActionImplParams): Promise<RecurringExecuteResult> {\n const sourceClient = getEvmClientForChain({ chain: sourceChain });\n const chainIdNumeric = caip2ToEip155ChainId(sourceChain.chainId);\n const chainIdHex = caip2ToEip155HexChainId(sourceChain.chainId);\n\n const calldata = await fetchCalldata(apiOptions, { orderId, address, chainId: chainIdNumeric });\n\n const gasEstimate = await estimateGasWithRevert(\n sourceClient,\n { account: address, to: calldata.to, data: calldata.data, value: calldata.value },\n erc20Abi,\n `Failed to estimate gas for recurring ${ORDER_ACTION_LABEL[signatureReason]} transaction.`,\n );\n\n const request: EvmTransactionRequest = {\n chainId: chainIdHex,\n data: calldata.data,\n from: address,\n gas: applyFeeUnitsBpsMargin(gasEstimate, gasSettings?.estimateGasMarginBps),\n to: calldata.to,\n value: calldata.value,\n ...maybe1559(gasSettings),\n };\n\n const step: TransferStepDetails = {\n currentSignature: 1,\n currentSignatureReason: signatureReason,\n quote: buildSyntheticQuoteForOrderAction({ address, signatureReason, orderId, sourceChain }),\n requiredSignatures: 1,\n signerContext,\n };\n\n const txHash = await evmSigner.sign(\n request,\n (signedTxHash) => sourceClient.sendRawTransaction({ serializedTransaction: signedTxHash }),\n step,\n );\n\n return { txHash };\n}\n\n// ---------------------------------------------------------------------------\n// Internal: synthetic Quote objects for `TransferStepDetails.quote`\n// ---------------------------------------------------------------------------\n\n/**\n * Builds a minimum-viable {@link Quote} for the signer step so consumer\n * `EvmSigner` impls can render meaningful wallet prompts for a recurring\n * action (which has no real `Quote` in the swap-quoter sense). The synthetic\n * value carries enough recurring context (uuid, chain, amounts, tokens) for\n * a wallet UI to label the popup; the `aggregator.id` (`'markr-recurring'`)\n * lets advanced signers detect the recurring path explicitly.\n *\n * Asset fields use placeholder `name`/`symbol`/`decimals` because the\n * recurring quote doesn't echo those — consumers needing rich asset display\n * should resolve token metadata against their own asset map keyed by\n * `quote.tokenIn`/`tokenOut`.\n */\nfunction buildSyntheticQuoteForFirstFill({\n fromAddress,\n quote,\n sourceChain,\n}: {\n fromAddress: `0x${string}`;\n quote: RecurringQuoteResponse;\n sourceChain: Chain;\n}): Quote {\n return {\n // Keep the stable `'markr-recurring'` marker (shipped in #240) — consumer\n // signers may detect the recurring path via `quote.aggregator.id`. The\n // typed `TransferStepDetails.currentSignatureReason` is now the preferred\n // discriminant for new integrations, but this id stays for back-compat.\n aggregator: { id: 'markr-recurring', name: 'Markr recurring' },\n amountIn: quote.amount,\n amountOut: quote.amountOut,\n assetIn: { type: TokenType.ERC20, address: quote.tokenIn, name: '', symbol: '', decimals: 0 },\n assetOut: { type: TokenType.ERC20, address: quote.tokenOut, name: '', symbol: '', decimals: 0 },\n expiresAt: quote.expiredAt,\n fees: [],\n fromAddress,\n id: quote.uuid,\n partnerFeeBps: null,\n serviceType: ServiceType.MARKR,\n slippageBps: quote.recommendedSlippage,\n // Pass the caller-provided `Chain` straight through — recurring is always\n // same-chain, so source === target. Avoids stripping `chainName` /\n // `networkToken` / `rpcUrl` that consumer signers may use for display.\n sourceChain,\n targetChain: sourceChain,\n toAddress: fromAddress,\n };\n}\n\nfunction buildSyntheticQuoteForOrderAction({\n signatureReason,\n address,\n orderId,\n sourceChain,\n}: {\n signatureReason:\n | TransferSignatureReason.PauseRecurringSwap\n | TransferSignatureReason.ResumeRecurringSwap\n | TransferSignatureReason.CancelRecurringSwap;\n address: `0x${string}`;\n orderId: `0x${string}`;\n sourceChain: Chain;\n}): Quote {\n const action = ORDER_ACTION_LABEL[signatureReason];\n return {\n // Same back-compat rationale as `buildSyntheticQuoteForFirstFill` — preserve\n // the original lowercase `markr-recurring-${action}` id shape (shipped in\n // #240) so consumers keying off `quote.aggregator.id` keep working.\n aggregator: {\n id: `markr-recurring-${action}`,\n name: `Markr recurring (${action})`,\n },\n amountIn: 0n,\n amountOut: 0n,\n assetIn: emptyNativeAsset(),\n assetOut: emptyNativeAsset(),\n expiresAt: 0,\n fees: [],\n fromAddress: address,\n id: orderId,\n partnerFeeBps: null,\n serviceType: ServiceType.MARKR,\n slippageBps: 0,\n // See `buildSyntheticQuoteForFirstFill` — pass the real `Chain` through.\n sourceChain,\n targetChain: sourceChain,\n toAddress: address,\n };\n}\n\nfunction emptyNativeAsset() {\n return { type: TokenType.NATIVE, name: '', symbol: '', decimals: 0 } as const;\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.cjs","names":[],"sources":["../../../../src/transfer-service/markr/recurring/types.ts"],"sourcesContent":["import type { Address as EvmAddress } from 'viem';\nimport type { Chain } from '../../../types/chain';\nimport type { GasSettings } from '../../../types/service';\nimport type { Hex } from '../../../types/signer';\n\n/**\n * Frequency units accepted by Markr's `/recurring/quote` and `/recurring/orders` endpoints.\n *\n * @see https://orchestrator-docs.markr.io/#/paths/~1recurring~1quote/post\n */\nexport const RECURRING_FREQUENCY_UNITS = ['minute', 'hour', 'day', 'week', 'month'] as const;\n\nexport type RecurringFrequencyUnit = (typeof RECURRING_FREQUENCY_UNITS)[number];\n\nexport interface RecurringFrequency {\n unit: RecurringFrequencyUnit;\n /**\n * Integer in `[1, 365]` (server-enforced upper bound). `validateFrequency`\n * surfaces violations as `{ ok: false, reason: 'invalid-value' }`.\n */\n value: number;\n}\n\n/**\n * Markr's \"unlimited orders\" sentinel. Sent to the server as `-1`, which the\n * router expands to `uint256` max on-chain. Callers can also pass `Infinity`\n * to {@link RecurringQuoteParams.numberOfOrders} for the same effect; the API\n * helpers translate to `-1` at the wire boundary.\n */\nexport const RECURRING_UNLIMITED_ORDERS_SENTINEL = -1;\n\n/**\n * Status values emitted by Markr for a recurring schedule. Treated as a\n * closed set — if Markr ever adds a new value server-side, the schema\n * will reject it loudly so the SDK update gates rendering changes\n * (instead of silently passing an unhandled state through to the UI).\n *\n * Mirrors the existing `TransferSignatureReason` enum pattern in\n * `constants.ts`: PascalCase members with kebab/lowercase wire values.\n */\nexport enum RecurringOrderStatus {\n Active = 'active',\n Completed = 'completed',\n Cancelled = 'cancelled',\n Paused = 'paused',\n}\n\nexport interface RecurringOrderFailure {\n /** 1-based index of the failed scheduled swap. */\n executionIndex: number;\n /** Reason strings supplied by the orchestrator (e.g. `\"Slippage tolerance exceeded\"`). */\n reasons: ReadonlyArray<string>;\n /** On-chain attempts before the execution was marked failed. */\n tryCount: number;\n /** Unix seconds. */\n failedAt: number;\n}\n\n/**\n * Server-side recurring-swap order returned by `GET /recurring/orders` and\n * `POST /recurring/orders/{orderId}/cancel`.\n *\n * @see https://orchestrator-docs.markr.io/#/Recurring%20Swaps\n */\nexport interface RecurringOrder {\n /**\n * bytes32 hex (`0x` + 64 hex chars). Used as the path param for cancellation.\n * Typed as a template-literal `0x`-prefixed string to catch the obvious\n * \"I forgot the `0x`\" mistake at compile time; the wire-level regex check\n * (in `markrCancelRecurringOrder`) enforces the full bytes32 shape.\n */\n orderId: `0x${string}`;\n /** EVM wallet that created the schedule. */\n owner: EvmAddress;\n chainId: number;\n tokenIn: EvmAddress;\n tokenOut: EvmAddress;\n /** Per-order input amount, in `tokenIn`'s smallest unit. */\n amount: bigint;\n /** -1 when unlimited; otherwise a positive integer (server-clamped to ≤ 365). */\n numberOfOrders: number;\n executedOrders: number;\n /**\n * `numberOfOrders - executedOrders` on finite schedules. `null` on\n * unlimited schedules (`numberOfOrders === -1`) — they have no finite\n * remainder to report. Per the Markr OpenAPI spec the field is\n * nullable; the schema also normalizes `undefined` to `null` so a\n * `=== null` check is sufficient.\n */\n remainingOrders: number | null;\n frequency: RecurringFrequency;\n /** `amount × numberOfOrders` — the ERC-20 allowance granted at setup. */\n totalAmountIn: bigint;\n /** Retry count for the *next* pending execution. `0` when none is pending. */\n tryCount: number;\n /** History of failed `executionIndex` values, newest last. */\n failures: ReadonlyArray<RecurringOrderFailure>;\n status: RecurringOrderStatus;\n /** Unix seconds. */\n createdAt: number;\n /**\n * Unix seconds. `null` once the schedule is completed / cancelled /\n * inactive. Per the Markr OpenAPI spec this field is optional + nullable;\n * the schema normalizes an omitted-field response to `null` so consumers\n * can branch on a single `=== null` check.\n */\n nextExecutionAt: number | null;\n /**\n * Unix seconds when the order was cancelled; `null` otherwise. Populated\n * with a number when `status === 'cancelled'`. Per the Markr OpenAPI spec\n * this field is optional + nullable; the schema normalizes both wire\n * shapes (`null` and omitted) to `null` for consumer ergonomics.\n */\n cancelledAt: number | null;\n}\n\n/**\n * Known fee types emitted by Markr today. Open at runtime — the schema\n * tolerates unknown values so a new fee category from the orchestrator doesn't\n * fail quote parsing. See {@link RecurringOrderStatus} for the widening\n * pattern.\n */\nexport type RecurringQuoteFeeType =\n | 'gas'\n | 'recurring'\n | 'protocol'\n | 'bridge'\n | 'slippage'\n | 'swap'\n | 'other'\n // See `RecurringOrderStatus` for why `Record<never, never>` replaces `{}`.\n | (string & Record<never, never>);\n\nexport interface RecurringQuoteFee {\n type: RecurringQuoteFeeType;\n name: string;\n amount: bigint;\n token: { chainId: number; address: EvmAddress };\n /**\n * Docs document `extra` as `boolean or object`. The boolean form is the\n * legacy \"additive one-time charge\" flag (e.g. the one-time native\n * schedule fee with `type: 'recurring'`); the object form is reserved\n * for future structured metadata. Consumers should treat any truthy\n * value as \"additive — balance-check separately.\"\n */\n extra?: boolean | Record<string, unknown>;\n}\n\nexport interface RecurringQuoteResponse {\n uuid: string;\n chainId: number;\n tokenIn: EvmAddress;\n tokenOut: EvmAddress;\n /** Per-order input. */\n amount: bigint;\n /** Server-side clamped value (may be 365 if the request was unlimited). */\n numberOfOrders: number;\n frequency: RecurringFrequency;\n /** Server-derived from `frequency`. */\n intervalSeconds: number;\n /** `amount × numberOfOrders` — the ERC-20 allowance the caller must grant. */\n totalAmountIn: bigint;\n /** First-fill output estimate. */\n amountOut: bigint;\n /** First-fill `minAmountOut` (slippage applied). */\n minAmountOut: bigint;\n fees: ReadonlyArray<RecurringQuoteFee>;\n /** Basis points. */\n recommendedSlippage: number;\n /** Unix seconds. */\n expiredAt: number;\n}\n\nexport interface RecurringQuoteParams {\n appId: string;\n chainId: number;\n tokenIn: EvmAddress;\n tokenInDecimals: number;\n tokenOut: EvmAddress;\n tokenOutDecimals: number;\n /**\n * Per-order input in smallest unit. `bigint` only — matches the rest of the\n * SDK's internal amount types (response amounts, `Quote.amountIn`, etc.).\n * Callers holding a decimal string should coerce with `BigInt(s)` at the\n * call site.\n */\n amount: bigint;\n /**\n * Number of orders. Accepts:\n * - `Infinity` or `-1` — translated to the unlimited sentinel (`-1`) on the wire.\n * - Integer in `[2, 365]` — Markr's documented finite bound.\n *\n * Anything else (`NaN`, `0`, `1`, negatives other than `-1`, non-integers,\n * values > 365) throws `InvalidParamsError` at the SDK boundary so a\n * misbehaving form parse (`parseInt('')` → `NaN`, or a stale \"minimum is 1\"\n * assumption) can't silently become an unlimited schedule or a guaranteed\n * server-side rejection.\n */\n numberOfOrders: number;\n frequency: RecurringFrequency;\n /** Basis points (matches `/quote` semantics). */\n slippage?: number;\n}\n\nexport interface RecurringSwapParams {\n uuid: string;\n appId: string;\n}\n\nexport interface ListRecurringOrdersParams {\n address: EvmAddress;\n chainId?: number;\n status?: RecurringOrderStatus;\n}\n\nexport interface ListRecurringOrdersResponse {\n address: EvmAddress;\n count: number;\n orders: ReadonlyArray<RecurringOrder>;\n}\n\n/**\n * Wire-level params for the internal `_api.ts` cancel/pause/unpause helpers\n * (`markrPrepareCancellation` etc.). Public consumers reach the same endpoints\n * via {@link RecurringNamespace.executeCancellation}/`executePause`/\n * `executeUnpause`, which take {@link RecurringExecuteOrderActionParams}\n * instead and derive `chainId` from the passed `sourceChain`.\n */\nexport interface RecurringOrderActionApiParams {\n /** See {@link RecurringOrder.orderId} for the shape. */\n orderId: `0x${string}`;\n address: EvmAddress;\n /**\n * Chain the schedule lives on — required by Markr's\n * `POST /recurring/orders/{orderId}/{action}` endpoints (the orchestrator\n * scopes orderIds per chain, so the same bytes32 could in principle exist\n * on multiple chains).\n */\n chainId: number;\n}\n\n/**\n * Shared params for the three order-action execute methods\n * ({@link RecurringNamespace.executeCancellation},\n * {@link RecurringNamespace.executePause},\n * {@link RecurringNamespace.executeUnpause}). The SDK derives the wire-level\n * `chainId` from `sourceChain`, estimates gas via the chain's RPC, then signs\n * and broadcasts via the configured `evmSigner`.\n */\nexport interface RecurringExecuteOrderActionParams {\n /** See {@link RecurringOrder.orderId} for the shape. */\n orderId: `0x${string}`;\n /** Owner address of the schedule — must match the order's `owner`. */\n address: EvmAddress;\n /**\n * Source chain the schedule lives on — pass the same `Chain` that backs\n * `sourceChain` on the recurring order (the SDK reads `rpcUrl` + multicall\n * for the on-chain gas estimate and uses `chainId` for the wire request).\n */\n sourceChain: Chain;\n /** Optional fee-margin + 1559 overrides forwarded to the signed TX. */\n gasSettings?: GasSettings;\n}\n\n/**\n * Params for {@link RecurringNamespace.executeFirstFill}. Replaces the\n * pre-signer `prepareFirstFill` shape; the SDK now reads the on-chain\n * allowance against `totalAmountIn`, signs an `approve` if needed (batched\n * one-click when `evmSigner.signBatch` is available and the swap is\n * same-chain), then signs and broadcasts the first-fill swap.\n */\nexport interface RecurringExecuteFirstFillParams {\n /** Full recurring quote — carries `uuid`, `totalAmountIn`, `expiredAt`. */\n quote: RecurringQuoteResponse;\n /** EVM address creating the schedule (and signing the first fill). */\n fromAddress: EvmAddress;\n /**\n * Source chain — same `Chain` used to obtain the recurring quote. The SDK\n * reads `rpcUrl` for allowance + gas calls; `chainId` is cross-checked\n * against `quote.chainId` to catch obvious wiring mistakes.\n */\n sourceChain: Chain;\n /** Optional fee-margin + 1559 overrides. */\n gasSettings?: GasSettings;\n /**\n * Mirrors the same flag on `TransferService.transferAsset`: when the\n * one-click batch (approval + first-fill) is attempted and the consumer's\n * wallet rejects the batch, fall back to two sequential signatures\n * (`approve`, then `swap`) instead of bubbling the batch error up.\n */\n fallbackToDefaultOnBatchFailure?: boolean;\n}\n\n/** Result of any `recurring.execute*` method — broadcast TX hash. */\nexport interface RecurringExecuteResult {\n txHash: Hex;\n}\n\nexport interface RecurringChainInfoEntry {\n /** Server-published lower bound for `intervalSeconds` (today: 300s on enabled chains). */\n minFrequencySeconds: number;\n supportedTokens: ReadonlyArray<{\n address: EvmAddress;\n /**\n * Smallest-unit decimal string — must be `BigInt()`-parseable (i.e.\n * matches `/^\\d+$/`). The Zod schema enforces this on the wire, but the\n * TS type alone is plain `string`; consumers constructing this map by\n * hand (caching, tests) should pass a digits-only decimal string or\n * `BigInt(minimumAmount)` will throw downstream in `checkEligibility`.\n */\n minimumAmount: string;\n }>;\n}\n\n/**\n * Cached `/info/chains` recurring metadata keyed by EVM chainId. SVM chains\n * are omitted — Markr supports recurring on same-chain EVM only.\n */\nexport type RecurringChainInfoMap = ReadonlyMap<number, RecurringChainInfoEntry>;\n\n/**\n * Reasons surfaced when {@link checkRecurringEligibility} returns\n * `{ eligible: false, … }`. Mirrors the existing `TransferSignatureReason`\n * enum pattern (PascalCase member, kebab-case wire value) so external\n * consumers comparing the raw string still match.\n */\nexport enum RecurringEligibilityReason {\n CrossChain = 'cross-chain',\n UnsupportedSourceChain = 'unsupported-source-chain',\n UnsupportedToken = 'unsupported-token',\n NoEvmAddress = 'no-evm-address',\n AmountBelowMinimum = 'amount-below-minimum',\n}\n\nexport type RecurringEligibility =\n | { eligible: true; minimumAmount: string; minIntervalSeconds: number }\n // `AmountBelowMinimum` carries the floor so error UIs can say \"Min is X\"\n // without a second `getRecurringChainInfo()` lookup. The value is the same\n // smallest-unit decimal string as the success branch's `minimumAmount`.\n | { eligible: false; reason: RecurringEligibilityReason.AmountBelowMinimum; minimumAmount: string }\n | { eligible: false; reason: Exclude<RecurringEligibilityReason, RecurringEligibilityReason.AmountBelowMinimum> };\n\nexport interface CheckRecurringEligibilityParams {\n recurringChainInfo: RecurringChainInfoMap;\n fromTokenAddress: EvmAddress;\n toTokenAddress: EvmAddress;\n sourceChainId: number;\n targetChainId: number;\n ownerAddress?: EvmAddress;\n /** Per-order amount; when present, enables the `amount-below-minimum` check. */\n amount?: bigint;\n}\n\n/**\n * Params passed to `RecurringNamespace.checkEligibility`. Same as\n * `CheckRecurringEligibilityParams` minus the chain-info map, which the\n * namespace closure injects.\n */\nexport type RecurringNamespaceCheckEligibilityParams = Omit<CheckRecurringEligibilityParams, 'recurringChainInfo'>;\n\n/**\n * Params passed to `RecurringNamespace.quote`. Same as `RecurringQuoteParams`\n * minus `appId`, which the namespace closure injects.\n */\nexport type RecurringNamespaceQuoteParams = Omit<RecurringQuoteParams, 'appId'>;\n\n/**\n * High-level wrapper exposed as `MarkrService.recurring`. Methods curry\n * `apiOptions`, `appId`, and the cached `recurringChainInfo` so callers only\n * pass per-call inputs.\n */\nexport interface RecurringNamespace {\n /** POST `/recurring/quote` — full quote with `totalAmountIn`, fees, expiry, uuid. */\n quote(props: RecurringNamespaceQuoteParams): Promise<RecurringQuoteResponse>;\n\n /**\n * Creates the schedule on-chain by signing and broadcasting the first\n * `/recurring/swap` fill via the configured `evmSigner`. Mirrors\n * `TransferService.transferAsset`:\n *\n * 1. Reads on-chain `allowance(tokenIn → router)` against `quote.totalAmountIn`.\n * 2. If allowance is short, builds an `approve(router, totalAmountIn)` TX.\n * When the consumer's signer exposes `signBatch`, the SDK attempts a\n * one-click batch (approve + swap) — set\n * {@link RecurringExecuteFirstFillParams.fallbackToDefaultOnBatchFailure}\n * to fall back to two sequential signatures if the wallet rejects the\n * batch.\n * 3. Estimates gas (with `gasSettings.estimateGasMarginBps` margin) for\n * each TX before signing, and dispatches the signed serialized TX via\n * the chain's RPC.\n *\n * Quote-expiry guard mirrors the previous `prepareFirstFill` behavior —\n * `quote.expiredAt <= now` throws `InvalidParamsError(QUOTE_EXPIRED)` at\n * the SDK boundary before any HTTP / on-chain call.\n *\n * Returns the broadcast first-fill TX hash; the schedule transitions to\n * `'active'` once Markr observes the on-chain event (poll `listOrders`).\n */\n executeFirstFill(props: RecurringExecuteFirstFillParams): Promise<RecurringExecuteResult>;\n\n /**\n * GET `/recurring/orders?address=…&chainId?=…&status?=…` — returns the\n * full response (`{ address, count, orders }`) so callers can render the\n * server-echoed `address` (e.g. confirming the queried wallet matches the\n * current EVM signer) and `count` (pagination / \"you have N schedules\"\n * affordances) without an extra lookup. Consumers that only care about the\n * orders array can destructure: `const { orders } = await listOrders(…)`.\n */\n listOrders(props: ListRecurringOrdersParams): Promise<ListRecurringOrdersResponse>;\n\n /**\n * Cancels the recurring schedule identified by `orderId`: fetches the\n * `/recurring/orders/{orderId}/cancel` calldata, estimates gas, then signs\n * and broadcasts via the configured `evmSigner`. The schedule transitions\n * to `status: 'cancelled'` only once the TX confirms and Markr observes\n * the on-chain event.\n *\n * Eligibility: only `'active'` and `'paused'` orders can be cancelled per\n * Markr's docs. An attempt to cancel a `'completed'` order surfaces as\n * `HttpError(400)` from the orchestrator before signing.\n */\n executeCancellation(props: RecurringExecuteOrderActionParams): Promise<RecurringExecuteResult>;\n\n /**\n * Pauses the recurring schedule identified by `orderId`: fetches the\n * `/recurring/orders/{orderId}/pause` calldata, estimates gas, then signs\n * and broadcasts via the configured `evmSigner`. The schedule transitions\n * to `status: 'paused'` only once the TX confirms and Markr observes the\n * on-chain event.\n *\n * Eligibility: only `'active'` orders can be paused per Markr's docs.\n * Attempting to pause a non-`active` order surfaces as `HttpError(400)`.\n *\n * Pausing preserves the schedule's existing ERC-20 allowance — when the\n * user later unpauses, no re-approval and no new native schedule fee are\n * required (this is the key UX benefit of pause over cancel-and-recreate).\n *\n * @see https://orchestrator-docs.markr.io/#tag/Recurring-Swaps/paths/~1recurring~1orders~1{orderId}~1pause/post\n */\n executePause(props: RecurringExecuteOrderActionParams): Promise<RecurringExecuteResult>;\n\n /**\n * Unpauses (resumes) the recurring schedule identified by `orderId`:\n * fetches the `/recurring/orders/{orderId}/unpause` calldata, estimates\n * gas, then signs and broadcasts via the configured `evmSigner`. The\n * schedule transitions back to `status: 'active'` only once the TX\n * confirms and Markr observes the on-chain event.\n *\n * Eligibility: only `'paused'` orders can be unpaused per Markr's docs.\n * Attempting to unpause a non-`paused` order surfaces as `HttpError(400)`.\n *\n * Resumes execution from where the schedule left off — remaining fills\n * continue on the original `frequency` cadence. The orchestrator recomputes\n * `nextExecutionAt` after the TX confirms.\n *\n * @see https://orchestrator-docs.markr.io/#tag/Recurring-Swaps/paths/~1recurring~1orders~1{orderId}~1unpause/post\n */\n executeUnpause(props: RecurringExecuteOrderActionParams): Promise<RecurringExecuteResult>;\n\n /**\n * Pure (no fetch) — uses the cached `/info/chains` recurring metadata.\n *\n * **Covers:** chain support, token support, EVM-address presence, same-chain\n * (cross-chain rejected), and per-order minimum (when `amount` is passed —\n * failure carries `minimumAmount`).\n *\n * **Does NOT cover wallet balance.** This helper has no wallet/RPC context.\n * Checking that the user holds `amount × numberOfOrders` of `tokenIn` (plus\n * native gas for the first fill) is the consumer's responsibility, same as\n * the one-shot swap flow. There is no `InsufficientBalance` reason on\n * {@link RecurringEligibilityReason} by design.\n *\n * **Does NOT cover post-fill failures.** Once a schedule is live, on-chain\n * reverts (slippage, runtime insufficient balance, etc.) surface server-side\n * as open-ended strings on `RecurringOrder.failures[].reasons` — substring-\n * match those for client-driven auto-cancel (AC4 pattern) and call\n * {@link RecurringNamespace.prepareCancellation} when applicable.\n *\n * **Does NOT cover server-side quote rejection.** Slippage, target-token\n * unsupported, liquidity, etc. are decided at `/recurring/quote` time and\n * surface as `HttpError` from {@link RecurringNamespace.quote}.\n */\n checkEligibility(props: RecurringNamespaceCheckEligibilityParams): RecurringEligibility;\n\n /** Returns the cached `/info/chains` recurring metadata. */\n getRecurringChainInfo(): RecurringChainInfoMap;\n}\n"],"mappings":"AAUA,MAAa,EAA4B,CAAC,SAAU,OAAQ,MAAO,OAAQ,QAAQ,CA8BnF,IAAY,EAAL,SAAA,EAAA,OACL,GAAA,OAAA,SACA,EAAA,UAAA,YACA,EAAA,UAAA,YACA,EAAA,OAAA,eACD,CAyRW,EAAL,SAAA,EAAA,OACL,GAAA,WAAA,cACA,EAAA,uBAAA,2BACA,EAAA,iBAAA,oBACA,EAAA,aAAA,iBACA,EAAA,mBAAA,6BACD"}
|
|
1
|
+
{"version":3,"file":"types.cjs","names":[],"sources":["../../../../src/transfer-service/markr/recurring/types.ts"],"sourcesContent":["import type { Address as EvmAddress } from 'viem';\nimport type { Chain } from '../../../types/chain';\nimport type { GasSettings } from '../../../types/service';\nimport type { Hex } from '../../../types/signer';\n\n/**\n * Frequency units accepted by Markr's `/recurring/quote` and `/recurring/orders` endpoints.\n *\n * @see https://orchestrator-docs.markr.io/#/paths/~1recurring~1quote/post\n */\nexport const RECURRING_FREQUENCY_UNITS = ['minute', 'hour', 'day', 'week', 'month'] as const;\n\nexport type RecurringFrequencyUnit = (typeof RECURRING_FREQUENCY_UNITS)[number];\n\nexport interface RecurringFrequency {\n unit: RecurringFrequencyUnit;\n /**\n * Integer in `[1, 365]` (server-enforced upper bound). `validateFrequency`\n * surfaces violations as `{ ok: false, reason: 'invalid-value' }`.\n */\n value: number;\n}\n\n/**\n * Markr's \"unlimited orders\" sentinel. Sent to the server as `-1`, which the\n * router expands to `uint256` max on-chain. Callers can also pass `Infinity`\n * to {@link RecurringQuoteParams.numberOfOrders} for the same effect; the API\n * helpers translate to `-1` at the wire boundary.\n */\nexport const RECURRING_UNLIMITED_ORDERS_SENTINEL = -1;\n\n/**\n * Status values emitted by Markr for a recurring schedule. Treated as a\n * closed set — if Markr ever adds a new value server-side, the schema\n * will reject it loudly so the SDK update gates rendering changes\n * (instead of silently passing an unhandled state through to the UI).\n *\n * Mirrors the existing `TransferSignatureReason` enum pattern in\n * `constants.ts`: PascalCase members with kebab/lowercase wire values.\n */\nexport enum RecurringOrderStatus {\n Active = 'active',\n Completed = 'completed',\n Cancelled = 'cancelled',\n Paused = 'paused',\n}\n\nexport interface RecurringOrderFailure {\n /** 1-based index of the failed scheduled swap. */\n executionIndex: number;\n /** Reason strings supplied by the orchestrator (e.g. `\"Slippage tolerance exceeded\"`). */\n reasons: ReadonlyArray<string>;\n /** On-chain attempts before the execution was marked failed. */\n tryCount: number;\n /** Unix seconds. */\n failedAt: number;\n}\n\n/**\n * Server-side recurring-swap order returned by `GET /recurring/orders` and\n * `POST /recurring/orders/{orderId}/cancel`.\n *\n * @see https://orchestrator-docs.markr.io/#/Recurring%20Swaps\n */\nexport interface RecurringOrder {\n /**\n * bytes32 hex (`0x` + 64 hex chars). Used as the path param for cancellation.\n * Typed as a template-literal `0x`-prefixed string to catch the obvious\n * \"I forgot the `0x`\" mistake at compile time; the wire-level regex check\n * (in `markrCancelRecurringOrder`) enforces the full bytes32 shape.\n */\n orderId: `0x${string}`;\n /** EVM wallet that created the schedule. */\n owner: EvmAddress;\n chainId: number;\n tokenIn: EvmAddress;\n tokenOut: EvmAddress;\n /** Per-order input amount, in `tokenIn`'s smallest unit. */\n amount: bigint;\n /** -1 when unlimited; otherwise a positive integer (server-clamped to ≤ 365). */\n numberOfOrders: number;\n executedOrders: number;\n /**\n * `numberOfOrders - executedOrders` on finite schedules. `null` on\n * unlimited schedules (`numberOfOrders === -1`) — they have no finite\n * remainder to report. Per the Markr OpenAPI spec the field is\n * nullable; the schema also normalizes `undefined` to `null` so a\n * `=== null` check is sufficient.\n */\n remainingOrders: number | null;\n frequency: RecurringFrequency;\n /** `amount × numberOfOrders` — the ERC-20 allowance granted at setup. */\n totalAmountIn: bigint;\n /** Retry count for the *next* pending execution. `0` when none is pending. */\n tryCount: number;\n /** History of failed `executionIndex` values, newest last. */\n failures: ReadonlyArray<RecurringOrderFailure>;\n status: RecurringOrderStatus;\n /** Unix seconds. */\n createdAt: number;\n /**\n * Unix seconds. `null` once the schedule is completed / cancelled /\n * inactive. Per the Markr OpenAPI spec this field is optional + nullable;\n * the schema normalizes an omitted-field response to `null` so consumers\n * can branch on a single `=== null` check.\n */\n nextExecutionAt: number | null;\n /**\n * Unix seconds when the order was cancelled; `null` otherwise. Populated\n * with a number when `status === 'cancelled'`. Per the Markr OpenAPI spec\n * this field is optional + nullable; the schema normalizes both wire\n * shapes (`null` and omitted) to `null` for consumer ergonomics.\n */\n cancelledAt: number | null;\n}\n\n/**\n * Known fee types emitted by Markr today. Open at runtime — the schema\n * tolerates unknown values so a new fee category from the orchestrator doesn't\n * fail quote parsing. See {@link RecurringOrderStatus} for the widening\n * pattern.\n */\nexport type RecurringQuoteFeeType =\n | 'gas'\n | 'recurring'\n | 'protocol'\n | 'bridge'\n | 'slippage'\n | 'swap'\n | 'other'\n // See `RecurringOrderStatus` for why `Record<never, never>` replaces `{}`.\n | (string & Record<never, never>);\n\nexport interface RecurringQuoteFee {\n type: RecurringQuoteFeeType;\n name: string;\n amount: bigint;\n token: { chainId: number; address: EvmAddress };\n /**\n * Docs document `extra` as `boolean or object`. The boolean form is the\n * legacy \"additive one-time charge\" flag (e.g. the one-time native\n * schedule fee with `type: 'recurring'`); the object form is reserved\n * for future structured metadata. Consumers should treat any truthy\n * value as \"additive — balance-check separately.\"\n */\n extra?: boolean | Record<string, unknown>;\n}\n\nexport interface RecurringQuoteResponse {\n uuid: string;\n chainId: number;\n tokenIn: EvmAddress;\n tokenOut: EvmAddress;\n /** Per-order input. */\n amount: bigint;\n /** Server-side clamped value (may be 365 if the request was unlimited). */\n numberOfOrders: number;\n frequency: RecurringFrequency;\n /** Server-derived from `frequency`. */\n intervalSeconds: number;\n /** `amount × numberOfOrders` — the ERC-20 allowance the caller must grant. */\n totalAmountIn: bigint;\n /** First-fill output estimate. */\n amountOut: bigint;\n /** First-fill `minAmountOut` (slippage applied). */\n minAmountOut: bigint;\n fees: ReadonlyArray<RecurringQuoteFee>;\n /** Basis points. */\n recommendedSlippage: number;\n /** Unix seconds. */\n expiredAt: number;\n}\n\nexport interface RecurringQuoteParams {\n appId: string;\n chainId: number;\n tokenIn: EvmAddress;\n tokenInDecimals: number;\n tokenOut: EvmAddress;\n tokenOutDecimals: number;\n /**\n * Per-order input in smallest unit. `bigint` only — matches the rest of the\n * SDK's internal amount types (response amounts, `Quote.amountIn`, etc.).\n * Callers holding a decimal string should coerce with `BigInt(s)` at the\n * call site.\n */\n amount: bigint;\n /**\n * Number of orders. Accepts:\n * - `Infinity` or `-1` — translated to the unlimited sentinel (`-1`) on the wire.\n * - Integer in `[2, 365]` — Markr's documented finite bound.\n *\n * Anything else (`NaN`, `0`, `1`, negatives other than `-1`, non-integers,\n * values > 365) throws `InvalidParamsError` at the SDK boundary so a\n * misbehaving form parse (`parseInt('')` → `NaN`, or a stale \"minimum is 1\"\n * assumption) can't silently become an unlimited schedule or a guaranteed\n * server-side rejection.\n */\n numberOfOrders: number;\n frequency: RecurringFrequency;\n /** Basis points (matches `/quote` semantics). */\n slippage?: number;\n}\n\nexport interface RecurringSwapParams {\n uuid: string;\n appId: string;\n}\n\nexport interface ListRecurringOrdersParams {\n address: EvmAddress;\n chainId?: number;\n status?: RecurringOrderStatus;\n}\n\nexport interface ListRecurringOrdersResponse {\n address: EvmAddress;\n count: number;\n orders: ReadonlyArray<RecurringOrder>;\n}\n\n/**\n * Wire-level params for the internal `_api.ts` cancel/pause/unpause helpers\n * (`markrPrepareCancellation` etc.). Public consumers reach the same endpoints\n * via {@link RecurringNamespace.executeCancellation}/`executePause`/\n * `executeUnpause`, which take {@link RecurringExecuteOrderActionParams}\n * instead and derive `chainId` from the passed `sourceChain`.\n */\nexport interface RecurringOrderActionApiParams {\n /** See {@link RecurringOrder.orderId} for the shape. */\n orderId: `0x${string}`;\n address: EvmAddress;\n /**\n * Chain the schedule lives on — required by Markr's\n * `POST /recurring/orders/{orderId}/{action}` endpoints (the orchestrator\n * scopes orderIds per chain, so the same bytes32 could in principle exist\n * on multiple chains).\n */\n chainId: number;\n}\n\n/**\n * Shared params for the three order-action execute methods\n * ({@link RecurringNamespace.executeCancellation},\n * {@link RecurringNamespace.executePause},\n * {@link RecurringNamespace.executeUnpause}). The SDK derives the wire-level\n * `chainId` from `sourceChain`, estimates gas via the chain's RPC, then signs\n * and broadcasts via the configured `evmSigner`.\n */\nexport interface RecurringExecuteOrderActionParams {\n /** See {@link RecurringOrder.orderId} for the shape. */\n orderId: `0x${string}`;\n /** Owner address of the schedule — must match the order's `owner`. */\n address: EvmAddress;\n /**\n * Source chain the schedule lives on — pass the same `Chain` that backs\n * `sourceChain` on the recurring order (the SDK reads `rpcUrl` + multicall\n * for the on-chain gas estimate and uses `chainId` for the wire request).\n */\n sourceChain: Chain;\n /** Optional fee-margin + 1559 overrides forwarded to the signed TX. */\n gasSettings?: GasSettings;\n /**\n * Opaque payload forwarded unchanged onto the `step.signerContext` field\n * seen by the configured `EvmSigner`. Lets consumers correlate the wallet\n * prompt back to the specific cancel / pause / unpause request that\n * produced it (e.g. UI slot id, display label) without relying on an\n * action-type-keyed lookup map that two concurrent same-type actions\n * could clobber.\n */\n signerContext?: unknown;\n}\n\n/**\n * Params for {@link RecurringNamespace.executeFirstFill}. Replaces the\n * pre-signer `prepareFirstFill` shape; the SDK now reads the on-chain\n * allowance against `totalAmountIn`, signs an `approve` if needed (batched\n * one-click when `evmSigner.signBatch` is available and the swap is\n * same-chain), then signs and broadcasts the first-fill swap.\n */\nexport interface RecurringExecuteFirstFillParams {\n /** Full recurring quote — carries `uuid`, `totalAmountIn`, `expiredAt`. */\n quote: RecurringQuoteResponse;\n /** EVM address creating the schedule (and signing the first fill). */\n fromAddress: EvmAddress;\n /**\n * Source chain — same `Chain` used to obtain the recurring quote. The SDK\n * reads `rpcUrl` for allowance + gas calls; `chainId` is cross-checked\n * against `quote.chainId` to catch obvious wiring mistakes.\n */\n sourceChain: Chain;\n /** Optional fee-margin + 1559 overrides. */\n gasSettings?: GasSettings;\n /**\n * Mirrors the same flag on `TransferService.transferAsset`: when the\n * one-click batch (approval + first-fill) is attempted and the consumer's\n * wallet rejects the batch, fall back to two sequential signatures\n * (`approve`, then `swap`) instead of bubbling the batch error up.\n */\n fallbackToDefaultOnBatchFailure?: boolean;\n /**\n * Opaque payload forwarded unchanged onto the `step.signerContext` field\n * seen by the configured `EvmSigner` for both the optional approval step\n * and the first-fill swap step. See\n * {@link RecurringExecuteOrderActionParams.signerContext}.\n */\n signerContext?: unknown;\n}\n\n/** Result of any `recurring.execute*` method — broadcast TX hash. */\nexport interface RecurringExecuteResult {\n txHash: Hex;\n}\n\nexport interface RecurringChainInfoEntry {\n /** Server-published lower bound for `intervalSeconds` (today: 300s on enabled chains). */\n minFrequencySeconds: number;\n supportedTokens: ReadonlyArray<{\n address: EvmAddress;\n /**\n * Smallest-unit decimal string — must be `BigInt()`-parseable (i.e.\n * matches `/^\\d+$/`). The Zod schema enforces this on the wire, but the\n * TS type alone is plain `string`; consumers constructing this map by\n * hand (caching, tests) should pass a digits-only decimal string or\n * `BigInt(minimumAmount)` will throw downstream in `checkEligibility`.\n */\n minimumAmount: string;\n }>;\n}\n\n/**\n * Cached `/info/chains` recurring metadata keyed by EVM chainId. SVM chains\n * are omitted — Markr supports recurring on same-chain EVM only.\n */\nexport type RecurringChainInfoMap = ReadonlyMap<number, RecurringChainInfoEntry>;\n\n/**\n * Reasons surfaced when {@link checkRecurringEligibility} returns\n * `{ eligible: false, … }`. Mirrors the existing `TransferSignatureReason`\n * enum pattern (PascalCase member, kebab-case wire value) so external\n * consumers comparing the raw string still match.\n */\nexport enum RecurringEligibilityReason {\n CrossChain = 'cross-chain',\n UnsupportedSourceChain = 'unsupported-source-chain',\n UnsupportedToken = 'unsupported-token',\n NoEvmAddress = 'no-evm-address',\n AmountBelowMinimum = 'amount-below-minimum',\n}\n\nexport type RecurringEligibility =\n | { eligible: true; minimumAmount: string; minIntervalSeconds: number }\n // `AmountBelowMinimum` carries the floor so error UIs can say \"Min is X\"\n // without a second `getRecurringChainInfo()` lookup. The value is the same\n // smallest-unit decimal string as the success branch's `minimumAmount`.\n | { eligible: false; reason: RecurringEligibilityReason.AmountBelowMinimum; minimumAmount: string }\n | { eligible: false; reason: Exclude<RecurringEligibilityReason, RecurringEligibilityReason.AmountBelowMinimum> };\n\nexport interface CheckRecurringEligibilityParams {\n recurringChainInfo: RecurringChainInfoMap;\n fromTokenAddress: EvmAddress;\n toTokenAddress: EvmAddress;\n sourceChainId: number;\n targetChainId: number;\n ownerAddress?: EvmAddress;\n /** Per-order amount; when present, enables the `amount-below-minimum` check. */\n amount?: bigint;\n}\n\n/**\n * Params passed to `RecurringNamespace.checkEligibility`. Same as\n * `CheckRecurringEligibilityParams` minus the chain-info map, which the\n * namespace closure injects.\n */\nexport type RecurringNamespaceCheckEligibilityParams = Omit<CheckRecurringEligibilityParams, 'recurringChainInfo'>;\n\n/**\n * Params passed to `RecurringNamespace.quote`. Same as `RecurringQuoteParams`\n * minus `appId`, which the namespace closure injects.\n */\nexport type RecurringNamespaceQuoteParams = Omit<RecurringQuoteParams, 'appId'>;\n\n/**\n * High-level wrapper exposed as `MarkrService.recurring`. Methods curry\n * `apiOptions`, `appId`, and the cached `recurringChainInfo` so callers only\n * pass per-call inputs.\n */\nexport interface RecurringNamespace {\n /** POST `/recurring/quote` — full quote with `totalAmountIn`, fees, expiry, uuid. */\n quote(props: RecurringNamespaceQuoteParams): Promise<RecurringQuoteResponse>;\n\n /**\n * Creates the schedule on-chain by signing and broadcasting the first\n * `/recurring/swap` fill via the configured `evmSigner`. Mirrors\n * `TransferService.transferAsset`:\n *\n * 1. Reads on-chain `allowance(tokenIn → router)` against `quote.totalAmountIn`.\n * 2. If allowance is short, builds an `approve(router, totalAmountIn)` TX.\n * When the consumer's signer exposes `signBatch`, the SDK attempts a\n * one-click batch (approve + swap) — set\n * {@link RecurringExecuteFirstFillParams.fallbackToDefaultOnBatchFailure}\n * to fall back to two sequential signatures if the wallet rejects the\n * batch.\n * 3. Estimates gas (with `gasSettings.estimateGasMarginBps` margin) for\n * each TX before signing, and dispatches the signed serialized TX via\n * the chain's RPC.\n *\n * Quote-expiry guard mirrors the previous `prepareFirstFill` behavior —\n * `quote.expiredAt <= now` throws `InvalidParamsError(QUOTE_EXPIRED)` at\n * the SDK boundary before any HTTP / on-chain call.\n *\n * Returns the broadcast first-fill TX hash; the schedule transitions to\n * `'active'` once Markr observes the on-chain event (poll `listOrders`).\n */\n executeFirstFill(props: RecurringExecuteFirstFillParams): Promise<RecurringExecuteResult>;\n\n /**\n * GET `/recurring/orders?address=…&chainId?=…&status?=…` — returns the\n * full response (`{ address, count, orders }`) so callers can render the\n * server-echoed `address` (e.g. confirming the queried wallet matches the\n * current EVM signer) and `count` (pagination / \"you have N schedules\"\n * affordances) without an extra lookup. Consumers that only care about the\n * orders array can destructure: `const { orders } = await listOrders(…)`.\n */\n listOrders(props: ListRecurringOrdersParams): Promise<ListRecurringOrdersResponse>;\n\n /**\n * Cancels the recurring schedule identified by `orderId`: fetches the\n * `/recurring/orders/{orderId}/cancel` calldata, estimates gas, then signs\n * and broadcasts via the configured `evmSigner`. The schedule transitions\n * to `status: 'cancelled'` only once the TX confirms and Markr observes\n * the on-chain event.\n *\n * Eligibility: only `'active'` and `'paused'` orders can be cancelled per\n * Markr's docs. An attempt to cancel a `'completed'` order surfaces as\n * `HttpError(400)` from the orchestrator before signing.\n */\n executeCancellation(props: RecurringExecuteOrderActionParams): Promise<RecurringExecuteResult>;\n\n /**\n * Pauses the recurring schedule identified by `orderId`: fetches the\n * `/recurring/orders/{orderId}/pause` calldata, estimates gas, then signs\n * and broadcasts via the configured `evmSigner`. The schedule transitions\n * to `status: 'paused'` only once the TX confirms and Markr observes the\n * on-chain event.\n *\n * Eligibility: only `'active'` orders can be paused per Markr's docs.\n * Attempting to pause a non-`active` order surfaces as `HttpError(400)`.\n *\n * Pausing preserves the schedule's existing ERC-20 allowance — when the\n * user later unpauses, no re-approval and no new native schedule fee are\n * required (this is the key UX benefit of pause over cancel-and-recreate).\n *\n * @see https://orchestrator-docs.markr.io/#tag/Recurring-Swaps/paths/~1recurring~1orders~1{orderId}~1pause/post\n */\n executePause(props: RecurringExecuteOrderActionParams): Promise<RecurringExecuteResult>;\n\n /**\n * Unpauses (resumes) the recurring schedule identified by `orderId`:\n * fetches the `/recurring/orders/{orderId}/unpause` calldata, estimates\n * gas, then signs and broadcasts via the configured `evmSigner`. The\n * schedule transitions back to `status: 'active'` only once the TX\n * confirms and Markr observes the on-chain event.\n *\n * Eligibility: only `'paused'` orders can be unpaused per Markr's docs.\n * Attempting to unpause a non-`paused` order surfaces as `HttpError(400)`.\n *\n * Resumes execution from where the schedule left off — remaining fills\n * continue on the original `frequency` cadence. The orchestrator recomputes\n * `nextExecutionAt` after the TX confirms.\n *\n * @see https://orchestrator-docs.markr.io/#tag/Recurring-Swaps/paths/~1recurring~1orders~1{orderId}~1unpause/post\n */\n executeUnpause(props: RecurringExecuteOrderActionParams): Promise<RecurringExecuteResult>;\n\n /**\n * Pure (no fetch) — uses the cached `/info/chains` recurring metadata.\n *\n * **Covers:** chain support, token support, EVM-address presence, same-chain\n * (cross-chain rejected), and per-order minimum (when `amount` is passed —\n * failure carries `minimumAmount`).\n *\n * **Does NOT cover wallet balance.** This helper has no wallet/RPC context.\n * Checking that the user holds `amount × numberOfOrders` of `tokenIn` (plus\n * native gas for the first fill) is the consumer's responsibility, same as\n * the one-shot swap flow. There is no `InsufficientBalance` reason on\n * {@link RecurringEligibilityReason} by design.\n *\n * **Does NOT cover post-fill failures.** Once a schedule is live, on-chain\n * reverts (slippage, runtime insufficient balance, etc.) surface server-side\n * as open-ended strings on `RecurringOrder.failures[].reasons` — substring-\n * match those for client-driven auto-cancel (AC4 pattern) and call\n * {@link RecurringNamespace.prepareCancellation} when applicable.\n *\n * **Does NOT cover server-side quote rejection.** Slippage, target-token\n * unsupported, liquidity, etc. are decided at `/recurring/quote` time and\n * surface as `HttpError` from {@link RecurringNamespace.quote}.\n */\n checkEligibility(props: RecurringNamespaceCheckEligibilityParams): RecurringEligibility;\n\n /** Returns the cached `/info/chains` recurring metadata. */\n getRecurringChainInfo(): RecurringChainInfoMap;\n}\n"],"mappings":"AAUA,MAAa,EAA4B,CAAC,SAAU,OAAQ,MAAO,OAAQ,QAAQ,CA8BnF,IAAY,EAAL,SAAA,EAAA,OACL,GAAA,OAAA,SACA,EAAA,UAAA,YACA,EAAA,UAAA,YACA,EAAA,OAAA,eACD,CAySW,EAAL,SAAA,EAAA,OACL,GAAA,WAAA,cACA,EAAA,uBAAA,2BACA,EAAA,iBAAA,oBACA,EAAA,aAAA,iBACA,EAAA,mBAAA,6BACD"}
|
|
@@ -221,6 +221,15 @@ interface RecurringExecuteOrderActionParams {
|
|
|
221
221
|
sourceChain: Chain;
|
|
222
222
|
/** Optional fee-margin + 1559 overrides forwarded to the signed TX. */
|
|
223
223
|
gasSettings?: GasSettings;
|
|
224
|
+
/**
|
|
225
|
+
* Opaque payload forwarded unchanged onto the `step.signerContext` field
|
|
226
|
+
* seen by the configured `EvmSigner`. Lets consumers correlate the wallet
|
|
227
|
+
* prompt back to the specific cancel / pause / unpause request that
|
|
228
|
+
* produced it (e.g. UI slot id, display label) without relying on an
|
|
229
|
+
* action-type-keyed lookup map that two concurrent same-type actions
|
|
230
|
+
* could clobber.
|
|
231
|
+
*/
|
|
232
|
+
signerContext?: unknown;
|
|
224
233
|
}
|
|
225
234
|
/**
|
|
226
235
|
* Params for {@link RecurringNamespace.executeFirstFill}. Replaces the
|
|
@@ -249,6 +258,13 @@ interface RecurringExecuteFirstFillParams {
|
|
|
249
258
|
* (`approve`, then `swap`) instead of bubbling the batch error up.
|
|
250
259
|
*/
|
|
251
260
|
fallbackToDefaultOnBatchFailure?: boolean;
|
|
261
|
+
/**
|
|
262
|
+
* Opaque payload forwarded unchanged onto the `step.signerContext` field
|
|
263
|
+
* seen by the configured `EvmSigner` for both the optional approval step
|
|
264
|
+
* and the first-fill swap step. See
|
|
265
|
+
* {@link RecurringExecuteOrderActionParams.signerContext}.
|
|
266
|
+
*/
|
|
267
|
+
signerContext?: unknown;
|
|
252
268
|
}
|
|
253
269
|
/** Result of any `recurring.execute*` method — broadcast TX hash. */
|
|
254
270
|
interface RecurringExecuteResult {
|
|
@@ -221,6 +221,15 @@ interface RecurringExecuteOrderActionParams {
|
|
|
221
221
|
sourceChain: Chain;
|
|
222
222
|
/** Optional fee-margin + 1559 overrides forwarded to the signed TX. */
|
|
223
223
|
gasSettings?: GasSettings;
|
|
224
|
+
/**
|
|
225
|
+
* Opaque payload forwarded unchanged onto the `step.signerContext` field
|
|
226
|
+
* seen by the configured `EvmSigner`. Lets consumers correlate the wallet
|
|
227
|
+
* prompt back to the specific cancel / pause / unpause request that
|
|
228
|
+
* produced it (e.g. UI slot id, display label) without relying on an
|
|
229
|
+
* action-type-keyed lookup map that two concurrent same-type actions
|
|
230
|
+
* could clobber.
|
|
231
|
+
*/
|
|
232
|
+
signerContext?: unknown;
|
|
224
233
|
}
|
|
225
234
|
/**
|
|
226
235
|
* Params for {@link RecurringNamespace.executeFirstFill}. Replaces the
|
|
@@ -249,6 +258,13 @@ interface RecurringExecuteFirstFillParams {
|
|
|
249
258
|
* (`approve`, then `swap`) instead of bubbling the batch error up.
|
|
250
259
|
*/
|
|
251
260
|
fallbackToDefaultOnBatchFailure?: boolean;
|
|
261
|
+
/**
|
|
262
|
+
* Opaque payload forwarded unchanged onto the `step.signerContext` field
|
|
263
|
+
* seen by the configured `EvmSigner` for both the optional approval step
|
|
264
|
+
* and the first-fill swap step. See
|
|
265
|
+
* {@link RecurringExecuteOrderActionParams.signerContext}.
|
|
266
|
+
*/
|
|
267
|
+
signerContext?: unknown;
|
|
252
268
|
}
|
|
253
269
|
/** Result of any `recurring.execute*` method — broadcast TX hash. */
|
|
254
270
|
interface RecurringExecuteResult {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","names":[],"sources":["../../../../src/transfer-service/markr/recurring/types.ts"],"sourcesContent":["import type { Address as EvmAddress } from 'viem';\nimport type { Chain } from '../../../types/chain';\nimport type { GasSettings } from '../../../types/service';\nimport type { Hex } from '../../../types/signer';\n\n/**\n * Frequency units accepted by Markr's `/recurring/quote` and `/recurring/orders` endpoints.\n *\n * @see https://orchestrator-docs.markr.io/#/paths/~1recurring~1quote/post\n */\nexport const RECURRING_FREQUENCY_UNITS = ['minute', 'hour', 'day', 'week', 'month'] as const;\n\nexport type RecurringFrequencyUnit = (typeof RECURRING_FREQUENCY_UNITS)[number];\n\nexport interface RecurringFrequency {\n unit: RecurringFrequencyUnit;\n /**\n * Integer in `[1, 365]` (server-enforced upper bound). `validateFrequency`\n * surfaces violations as `{ ok: false, reason: 'invalid-value' }`.\n */\n value: number;\n}\n\n/**\n * Markr's \"unlimited orders\" sentinel. Sent to the server as `-1`, which the\n * router expands to `uint256` max on-chain. Callers can also pass `Infinity`\n * to {@link RecurringQuoteParams.numberOfOrders} for the same effect; the API\n * helpers translate to `-1` at the wire boundary.\n */\nexport const RECURRING_UNLIMITED_ORDERS_SENTINEL = -1;\n\n/**\n * Status values emitted by Markr for a recurring schedule. Treated as a\n * closed set — if Markr ever adds a new value server-side, the schema\n * will reject it loudly so the SDK update gates rendering changes\n * (instead of silently passing an unhandled state through to the UI).\n *\n * Mirrors the existing `TransferSignatureReason` enum pattern in\n * `constants.ts`: PascalCase members with kebab/lowercase wire values.\n */\nexport enum RecurringOrderStatus {\n Active = 'active',\n Completed = 'completed',\n Cancelled = 'cancelled',\n Paused = 'paused',\n}\n\nexport interface RecurringOrderFailure {\n /** 1-based index of the failed scheduled swap. */\n executionIndex: number;\n /** Reason strings supplied by the orchestrator (e.g. `\"Slippage tolerance exceeded\"`). */\n reasons: ReadonlyArray<string>;\n /** On-chain attempts before the execution was marked failed. */\n tryCount: number;\n /** Unix seconds. */\n failedAt: number;\n}\n\n/**\n * Server-side recurring-swap order returned by `GET /recurring/orders` and\n * `POST /recurring/orders/{orderId}/cancel`.\n *\n * @see https://orchestrator-docs.markr.io/#/Recurring%20Swaps\n */\nexport interface RecurringOrder {\n /**\n * bytes32 hex (`0x` + 64 hex chars). Used as the path param for cancellation.\n * Typed as a template-literal `0x`-prefixed string to catch the obvious\n * \"I forgot the `0x`\" mistake at compile time; the wire-level regex check\n * (in `markrCancelRecurringOrder`) enforces the full bytes32 shape.\n */\n orderId: `0x${string}`;\n /** EVM wallet that created the schedule. */\n owner: EvmAddress;\n chainId: number;\n tokenIn: EvmAddress;\n tokenOut: EvmAddress;\n /** Per-order input amount, in `tokenIn`'s smallest unit. */\n amount: bigint;\n /** -1 when unlimited; otherwise a positive integer (server-clamped to ≤ 365). */\n numberOfOrders: number;\n executedOrders: number;\n /**\n * `numberOfOrders - executedOrders` on finite schedules. `null` on\n * unlimited schedules (`numberOfOrders === -1`) — they have no finite\n * remainder to report. Per the Markr OpenAPI spec the field is\n * nullable; the schema also normalizes `undefined` to `null` so a\n * `=== null` check is sufficient.\n */\n remainingOrders: number | null;\n frequency: RecurringFrequency;\n /** `amount × numberOfOrders` — the ERC-20 allowance granted at setup. */\n totalAmountIn: bigint;\n /** Retry count for the *next* pending execution. `0` when none is pending. */\n tryCount: number;\n /** History of failed `executionIndex` values, newest last. */\n failures: ReadonlyArray<RecurringOrderFailure>;\n status: RecurringOrderStatus;\n /** Unix seconds. */\n createdAt: number;\n /**\n * Unix seconds. `null` once the schedule is completed / cancelled /\n * inactive. Per the Markr OpenAPI spec this field is optional + nullable;\n * the schema normalizes an omitted-field response to `null` so consumers\n * can branch on a single `=== null` check.\n */\n nextExecutionAt: number | null;\n /**\n * Unix seconds when the order was cancelled; `null` otherwise. Populated\n * with a number when `status === 'cancelled'`. Per the Markr OpenAPI spec\n * this field is optional + nullable; the schema normalizes both wire\n * shapes (`null` and omitted) to `null` for consumer ergonomics.\n */\n cancelledAt: number | null;\n}\n\n/**\n * Known fee types emitted by Markr today. Open at runtime — the schema\n * tolerates unknown values so a new fee category from the orchestrator doesn't\n * fail quote parsing. See {@link RecurringOrderStatus} for the widening\n * pattern.\n */\nexport type RecurringQuoteFeeType =\n | 'gas'\n | 'recurring'\n | 'protocol'\n | 'bridge'\n | 'slippage'\n | 'swap'\n | 'other'\n // See `RecurringOrderStatus` for why `Record<never, never>` replaces `{}`.\n | (string & Record<never, never>);\n\nexport interface RecurringQuoteFee {\n type: RecurringQuoteFeeType;\n name: string;\n amount: bigint;\n token: { chainId: number; address: EvmAddress };\n /**\n * Docs document `extra` as `boolean or object`. The boolean form is the\n * legacy \"additive one-time charge\" flag (e.g. the one-time native\n * schedule fee with `type: 'recurring'`); the object form is reserved\n * for future structured metadata. Consumers should treat any truthy\n * value as \"additive — balance-check separately.\"\n */\n extra?: boolean | Record<string, unknown>;\n}\n\nexport interface RecurringQuoteResponse {\n uuid: string;\n chainId: number;\n tokenIn: EvmAddress;\n tokenOut: EvmAddress;\n /** Per-order input. */\n amount: bigint;\n /** Server-side clamped value (may be 365 if the request was unlimited). */\n numberOfOrders: number;\n frequency: RecurringFrequency;\n /** Server-derived from `frequency`. */\n intervalSeconds: number;\n /** `amount × numberOfOrders` — the ERC-20 allowance the caller must grant. */\n totalAmountIn: bigint;\n /** First-fill output estimate. */\n amountOut: bigint;\n /** First-fill `minAmountOut` (slippage applied). */\n minAmountOut: bigint;\n fees: ReadonlyArray<RecurringQuoteFee>;\n /** Basis points. */\n recommendedSlippage: number;\n /** Unix seconds. */\n expiredAt: number;\n}\n\nexport interface RecurringQuoteParams {\n appId: string;\n chainId: number;\n tokenIn: EvmAddress;\n tokenInDecimals: number;\n tokenOut: EvmAddress;\n tokenOutDecimals: number;\n /**\n * Per-order input in smallest unit. `bigint` only — matches the rest of the\n * SDK's internal amount types (response amounts, `Quote.amountIn`, etc.).\n * Callers holding a decimal string should coerce with `BigInt(s)` at the\n * call site.\n */\n amount: bigint;\n /**\n * Number of orders. Accepts:\n * - `Infinity` or `-1` — translated to the unlimited sentinel (`-1`) on the wire.\n * - Integer in `[2, 365]` — Markr's documented finite bound.\n *\n * Anything else (`NaN`, `0`, `1`, negatives other than `-1`, non-integers,\n * values > 365) throws `InvalidParamsError` at the SDK boundary so a\n * misbehaving form parse (`parseInt('')` → `NaN`, or a stale \"minimum is 1\"\n * assumption) can't silently become an unlimited schedule or a guaranteed\n * server-side rejection.\n */\n numberOfOrders: number;\n frequency: RecurringFrequency;\n /** Basis points (matches `/quote` semantics). */\n slippage?: number;\n}\n\nexport interface RecurringSwapParams {\n uuid: string;\n appId: string;\n}\n\nexport interface ListRecurringOrdersParams {\n address: EvmAddress;\n chainId?: number;\n status?: RecurringOrderStatus;\n}\n\nexport interface ListRecurringOrdersResponse {\n address: EvmAddress;\n count: number;\n orders: ReadonlyArray<RecurringOrder>;\n}\n\n/**\n * Wire-level params for the internal `_api.ts` cancel/pause/unpause helpers\n * (`markrPrepareCancellation` etc.). Public consumers reach the same endpoints\n * via {@link RecurringNamespace.executeCancellation}/`executePause`/\n * `executeUnpause`, which take {@link RecurringExecuteOrderActionParams}\n * instead and derive `chainId` from the passed `sourceChain`.\n */\nexport interface RecurringOrderActionApiParams {\n /** See {@link RecurringOrder.orderId} for the shape. */\n orderId: `0x${string}`;\n address: EvmAddress;\n /**\n * Chain the schedule lives on — required by Markr's\n * `POST /recurring/orders/{orderId}/{action}` endpoints (the orchestrator\n * scopes orderIds per chain, so the same bytes32 could in principle exist\n * on multiple chains).\n */\n chainId: number;\n}\n\n/**\n * Shared params for the three order-action execute methods\n * ({@link RecurringNamespace.executeCancellation},\n * {@link RecurringNamespace.executePause},\n * {@link RecurringNamespace.executeUnpause}). The SDK derives the wire-level\n * `chainId` from `sourceChain`, estimates gas via the chain's RPC, then signs\n * and broadcasts via the configured `evmSigner`.\n */\nexport interface RecurringExecuteOrderActionParams {\n /** See {@link RecurringOrder.orderId} for the shape. */\n orderId: `0x${string}`;\n /** Owner address of the schedule — must match the order's `owner`. */\n address: EvmAddress;\n /**\n * Source chain the schedule lives on — pass the same `Chain` that backs\n * `sourceChain` on the recurring order (the SDK reads `rpcUrl` + multicall\n * for the on-chain gas estimate and uses `chainId` for the wire request).\n */\n sourceChain: Chain;\n /** Optional fee-margin + 1559 overrides forwarded to the signed TX. */\n gasSettings?: GasSettings;\n}\n\n/**\n * Params for {@link RecurringNamespace.executeFirstFill}. Replaces the\n * pre-signer `prepareFirstFill` shape; the SDK now reads the on-chain\n * allowance against `totalAmountIn`, signs an `approve` if needed (batched\n * one-click when `evmSigner.signBatch` is available and the swap is\n * same-chain), then signs and broadcasts the first-fill swap.\n */\nexport interface RecurringExecuteFirstFillParams {\n /** Full recurring quote — carries `uuid`, `totalAmountIn`, `expiredAt`. */\n quote: RecurringQuoteResponse;\n /** EVM address creating the schedule (and signing the first fill). */\n fromAddress: EvmAddress;\n /**\n * Source chain — same `Chain` used to obtain the recurring quote. The SDK\n * reads `rpcUrl` for allowance + gas calls; `chainId` is cross-checked\n * against `quote.chainId` to catch obvious wiring mistakes.\n */\n sourceChain: Chain;\n /** Optional fee-margin + 1559 overrides. */\n gasSettings?: GasSettings;\n /**\n * Mirrors the same flag on `TransferService.transferAsset`: when the\n * one-click batch (approval + first-fill) is attempted and the consumer's\n * wallet rejects the batch, fall back to two sequential signatures\n * (`approve`, then `swap`) instead of bubbling the batch error up.\n */\n fallbackToDefaultOnBatchFailure?: boolean;\n}\n\n/** Result of any `recurring.execute*` method — broadcast TX hash. */\nexport interface RecurringExecuteResult {\n txHash: Hex;\n}\n\nexport interface RecurringChainInfoEntry {\n /** Server-published lower bound for `intervalSeconds` (today: 300s on enabled chains). */\n minFrequencySeconds: number;\n supportedTokens: ReadonlyArray<{\n address: EvmAddress;\n /**\n * Smallest-unit decimal string — must be `BigInt()`-parseable (i.e.\n * matches `/^\\d+$/`). The Zod schema enforces this on the wire, but the\n * TS type alone is plain `string`; consumers constructing this map by\n * hand (caching, tests) should pass a digits-only decimal string or\n * `BigInt(minimumAmount)` will throw downstream in `checkEligibility`.\n */\n minimumAmount: string;\n }>;\n}\n\n/**\n * Cached `/info/chains` recurring metadata keyed by EVM chainId. SVM chains\n * are omitted — Markr supports recurring on same-chain EVM only.\n */\nexport type RecurringChainInfoMap = ReadonlyMap<number, RecurringChainInfoEntry>;\n\n/**\n * Reasons surfaced when {@link checkRecurringEligibility} returns\n * `{ eligible: false, … }`. Mirrors the existing `TransferSignatureReason`\n * enum pattern (PascalCase member, kebab-case wire value) so external\n * consumers comparing the raw string still match.\n */\nexport enum RecurringEligibilityReason {\n CrossChain = 'cross-chain',\n UnsupportedSourceChain = 'unsupported-source-chain',\n UnsupportedToken = 'unsupported-token',\n NoEvmAddress = 'no-evm-address',\n AmountBelowMinimum = 'amount-below-minimum',\n}\n\nexport type RecurringEligibility =\n | { eligible: true; minimumAmount: string; minIntervalSeconds: number }\n // `AmountBelowMinimum` carries the floor so error UIs can say \"Min is X\"\n // without a second `getRecurringChainInfo()` lookup. The value is the same\n // smallest-unit decimal string as the success branch's `minimumAmount`.\n | { eligible: false; reason: RecurringEligibilityReason.AmountBelowMinimum; minimumAmount: string }\n | { eligible: false; reason: Exclude<RecurringEligibilityReason, RecurringEligibilityReason.AmountBelowMinimum> };\n\nexport interface CheckRecurringEligibilityParams {\n recurringChainInfo: RecurringChainInfoMap;\n fromTokenAddress: EvmAddress;\n toTokenAddress: EvmAddress;\n sourceChainId: number;\n targetChainId: number;\n ownerAddress?: EvmAddress;\n /** Per-order amount; when present, enables the `amount-below-minimum` check. */\n amount?: bigint;\n}\n\n/**\n * Params passed to `RecurringNamespace.checkEligibility`. Same as\n * `CheckRecurringEligibilityParams` minus the chain-info map, which the\n * namespace closure injects.\n */\nexport type RecurringNamespaceCheckEligibilityParams = Omit<CheckRecurringEligibilityParams, 'recurringChainInfo'>;\n\n/**\n * Params passed to `RecurringNamespace.quote`. Same as `RecurringQuoteParams`\n * minus `appId`, which the namespace closure injects.\n */\nexport type RecurringNamespaceQuoteParams = Omit<RecurringQuoteParams, 'appId'>;\n\n/**\n * High-level wrapper exposed as `MarkrService.recurring`. Methods curry\n * `apiOptions`, `appId`, and the cached `recurringChainInfo` so callers only\n * pass per-call inputs.\n */\nexport interface RecurringNamespace {\n /** POST `/recurring/quote` — full quote with `totalAmountIn`, fees, expiry, uuid. */\n quote(props: RecurringNamespaceQuoteParams): Promise<RecurringQuoteResponse>;\n\n /**\n * Creates the schedule on-chain by signing and broadcasting the first\n * `/recurring/swap` fill via the configured `evmSigner`. Mirrors\n * `TransferService.transferAsset`:\n *\n * 1. Reads on-chain `allowance(tokenIn → router)` against `quote.totalAmountIn`.\n * 2. If allowance is short, builds an `approve(router, totalAmountIn)` TX.\n * When the consumer's signer exposes `signBatch`, the SDK attempts a\n * one-click batch (approve + swap) — set\n * {@link RecurringExecuteFirstFillParams.fallbackToDefaultOnBatchFailure}\n * to fall back to two sequential signatures if the wallet rejects the\n * batch.\n * 3. Estimates gas (with `gasSettings.estimateGasMarginBps` margin) for\n * each TX before signing, and dispatches the signed serialized TX via\n * the chain's RPC.\n *\n * Quote-expiry guard mirrors the previous `prepareFirstFill` behavior —\n * `quote.expiredAt <= now` throws `InvalidParamsError(QUOTE_EXPIRED)` at\n * the SDK boundary before any HTTP / on-chain call.\n *\n * Returns the broadcast first-fill TX hash; the schedule transitions to\n * `'active'` once Markr observes the on-chain event (poll `listOrders`).\n */\n executeFirstFill(props: RecurringExecuteFirstFillParams): Promise<RecurringExecuteResult>;\n\n /**\n * GET `/recurring/orders?address=…&chainId?=…&status?=…` — returns the\n * full response (`{ address, count, orders }`) so callers can render the\n * server-echoed `address` (e.g. confirming the queried wallet matches the\n * current EVM signer) and `count` (pagination / \"you have N schedules\"\n * affordances) without an extra lookup. Consumers that only care about the\n * orders array can destructure: `const { orders } = await listOrders(…)`.\n */\n listOrders(props: ListRecurringOrdersParams): Promise<ListRecurringOrdersResponse>;\n\n /**\n * Cancels the recurring schedule identified by `orderId`: fetches the\n * `/recurring/orders/{orderId}/cancel` calldata, estimates gas, then signs\n * and broadcasts via the configured `evmSigner`. The schedule transitions\n * to `status: 'cancelled'` only once the TX confirms and Markr observes\n * the on-chain event.\n *\n * Eligibility: only `'active'` and `'paused'` orders can be cancelled per\n * Markr's docs. An attempt to cancel a `'completed'` order surfaces as\n * `HttpError(400)` from the orchestrator before signing.\n */\n executeCancellation(props: RecurringExecuteOrderActionParams): Promise<RecurringExecuteResult>;\n\n /**\n * Pauses the recurring schedule identified by `orderId`: fetches the\n * `/recurring/orders/{orderId}/pause` calldata, estimates gas, then signs\n * and broadcasts via the configured `evmSigner`. The schedule transitions\n * to `status: 'paused'` only once the TX confirms and Markr observes the\n * on-chain event.\n *\n * Eligibility: only `'active'` orders can be paused per Markr's docs.\n * Attempting to pause a non-`active` order surfaces as `HttpError(400)`.\n *\n * Pausing preserves the schedule's existing ERC-20 allowance — when the\n * user later unpauses, no re-approval and no new native schedule fee are\n * required (this is the key UX benefit of pause over cancel-and-recreate).\n *\n * @see https://orchestrator-docs.markr.io/#tag/Recurring-Swaps/paths/~1recurring~1orders~1{orderId}~1pause/post\n */\n executePause(props: RecurringExecuteOrderActionParams): Promise<RecurringExecuteResult>;\n\n /**\n * Unpauses (resumes) the recurring schedule identified by `orderId`:\n * fetches the `/recurring/orders/{orderId}/unpause` calldata, estimates\n * gas, then signs and broadcasts via the configured `evmSigner`. The\n * schedule transitions back to `status: 'active'` only once the TX\n * confirms and Markr observes the on-chain event.\n *\n * Eligibility: only `'paused'` orders can be unpaused per Markr's docs.\n * Attempting to unpause a non-`paused` order surfaces as `HttpError(400)`.\n *\n * Resumes execution from where the schedule left off — remaining fills\n * continue on the original `frequency` cadence. The orchestrator recomputes\n * `nextExecutionAt` after the TX confirms.\n *\n * @see https://orchestrator-docs.markr.io/#tag/Recurring-Swaps/paths/~1recurring~1orders~1{orderId}~1unpause/post\n */\n executeUnpause(props: RecurringExecuteOrderActionParams): Promise<RecurringExecuteResult>;\n\n /**\n * Pure (no fetch) — uses the cached `/info/chains` recurring metadata.\n *\n * **Covers:** chain support, token support, EVM-address presence, same-chain\n * (cross-chain rejected), and per-order minimum (when `amount` is passed —\n * failure carries `minimumAmount`).\n *\n * **Does NOT cover wallet balance.** This helper has no wallet/RPC context.\n * Checking that the user holds `amount × numberOfOrders` of `tokenIn` (plus\n * native gas for the first fill) is the consumer's responsibility, same as\n * the one-shot swap flow. There is no `InsufficientBalance` reason on\n * {@link RecurringEligibilityReason} by design.\n *\n * **Does NOT cover post-fill failures.** Once a schedule is live, on-chain\n * reverts (slippage, runtime insufficient balance, etc.) surface server-side\n * as open-ended strings on `RecurringOrder.failures[].reasons` — substring-\n * match those for client-driven auto-cancel (AC4 pattern) and call\n * {@link RecurringNamespace.prepareCancellation} when applicable.\n *\n * **Does NOT cover server-side quote rejection.** Slippage, target-token\n * unsupported, liquidity, etc. are decided at `/recurring/quote` time and\n * surface as `HttpError` from {@link RecurringNamespace.quote}.\n */\n checkEligibility(props: RecurringNamespaceCheckEligibilityParams): RecurringEligibility;\n\n /** Returns the cached `/info/chains` recurring metadata. */\n getRecurringChainInfo(): RecurringChainInfoMap;\n}\n"],"mappings":"AAUA,MAAa,EAA4B,CAAC,SAAU,OAAQ,MAAO,OAAQ,QAAQ,CAmBtE,EAAsC,GAWnD,IAAY,EAAL,SAAA,EAAA,OACL,GAAA,OAAA,SACA,EAAA,UAAA,YACA,EAAA,UAAA,YACA,EAAA,OAAA,eACD,CAyRW,EAAL,SAAA,EAAA,OACL,GAAA,WAAA,cACA,EAAA,uBAAA,2BACA,EAAA,iBAAA,oBACA,EAAA,aAAA,iBACA,EAAA,mBAAA,6BACD"}
|
|
1
|
+
{"version":3,"file":"types.js","names":[],"sources":["../../../../src/transfer-service/markr/recurring/types.ts"],"sourcesContent":["import type { Address as EvmAddress } from 'viem';\nimport type { Chain } from '../../../types/chain';\nimport type { GasSettings } from '../../../types/service';\nimport type { Hex } from '../../../types/signer';\n\n/**\n * Frequency units accepted by Markr's `/recurring/quote` and `/recurring/orders` endpoints.\n *\n * @see https://orchestrator-docs.markr.io/#/paths/~1recurring~1quote/post\n */\nexport const RECURRING_FREQUENCY_UNITS = ['minute', 'hour', 'day', 'week', 'month'] as const;\n\nexport type RecurringFrequencyUnit = (typeof RECURRING_FREQUENCY_UNITS)[number];\n\nexport interface RecurringFrequency {\n unit: RecurringFrequencyUnit;\n /**\n * Integer in `[1, 365]` (server-enforced upper bound). `validateFrequency`\n * surfaces violations as `{ ok: false, reason: 'invalid-value' }`.\n */\n value: number;\n}\n\n/**\n * Markr's \"unlimited orders\" sentinel. Sent to the server as `-1`, which the\n * router expands to `uint256` max on-chain. Callers can also pass `Infinity`\n * to {@link RecurringQuoteParams.numberOfOrders} for the same effect; the API\n * helpers translate to `-1` at the wire boundary.\n */\nexport const RECURRING_UNLIMITED_ORDERS_SENTINEL = -1;\n\n/**\n * Status values emitted by Markr for a recurring schedule. Treated as a\n * closed set — if Markr ever adds a new value server-side, the schema\n * will reject it loudly so the SDK update gates rendering changes\n * (instead of silently passing an unhandled state through to the UI).\n *\n * Mirrors the existing `TransferSignatureReason` enum pattern in\n * `constants.ts`: PascalCase members with kebab/lowercase wire values.\n */\nexport enum RecurringOrderStatus {\n Active = 'active',\n Completed = 'completed',\n Cancelled = 'cancelled',\n Paused = 'paused',\n}\n\nexport interface RecurringOrderFailure {\n /** 1-based index of the failed scheduled swap. */\n executionIndex: number;\n /** Reason strings supplied by the orchestrator (e.g. `\"Slippage tolerance exceeded\"`). */\n reasons: ReadonlyArray<string>;\n /** On-chain attempts before the execution was marked failed. */\n tryCount: number;\n /** Unix seconds. */\n failedAt: number;\n}\n\n/**\n * Server-side recurring-swap order returned by `GET /recurring/orders` and\n * `POST /recurring/orders/{orderId}/cancel`.\n *\n * @see https://orchestrator-docs.markr.io/#/Recurring%20Swaps\n */\nexport interface RecurringOrder {\n /**\n * bytes32 hex (`0x` + 64 hex chars). Used as the path param for cancellation.\n * Typed as a template-literal `0x`-prefixed string to catch the obvious\n * \"I forgot the `0x`\" mistake at compile time; the wire-level regex check\n * (in `markrCancelRecurringOrder`) enforces the full bytes32 shape.\n */\n orderId: `0x${string}`;\n /** EVM wallet that created the schedule. */\n owner: EvmAddress;\n chainId: number;\n tokenIn: EvmAddress;\n tokenOut: EvmAddress;\n /** Per-order input amount, in `tokenIn`'s smallest unit. */\n amount: bigint;\n /** -1 when unlimited; otherwise a positive integer (server-clamped to ≤ 365). */\n numberOfOrders: number;\n executedOrders: number;\n /**\n * `numberOfOrders - executedOrders` on finite schedules. `null` on\n * unlimited schedules (`numberOfOrders === -1`) — they have no finite\n * remainder to report. Per the Markr OpenAPI spec the field is\n * nullable; the schema also normalizes `undefined` to `null` so a\n * `=== null` check is sufficient.\n */\n remainingOrders: number | null;\n frequency: RecurringFrequency;\n /** `amount × numberOfOrders` — the ERC-20 allowance granted at setup. */\n totalAmountIn: bigint;\n /** Retry count for the *next* pending execution. `0` when none is pending. */\n tryCount: number;\n /** History of failed `executionIndex` values, newest last. */\n failures: ReadonlyArray<RecurringOrderFailure>;\n status: RecurringOrderStatus;\n /** Unix seconds. */\n createdAt: number;\n /**\n * Unix seconds. `null` once the schedule is completed / cancelled /\n * inactive. Per the Markr OpenAPI spec this field is optional + nullable;\n * the schema normalizes an omitted-field response to `null` so consumers\n * can branch on a single `=== null` check.\n */\n nextExecutionAt: number | null;\n /**\n * Unix seconds when the order was cancelled; `null` otherwise. Populated\n * with a number when `status === 'cancelled'`. Per the Markr OpenAPI spec\n * this field is optional + nullable; the schema normalizes both wire\n * shapes (`null` and omitted) to `null` for consumer ergonomics.\n */\n cancelledAt: number | null;\n}\n\n/**\n * Known fee types emitted by Markr today. Open at runtime — the schema\n * tolerates unknown values so a new fee category from the orchestrator doesn't\n * fail quote parsing. See {@link RecurringOrderStatus} for the widening\n * pattern.\n */\nexport type RecurringQuoteFeeType =\n | 'gas'\n | 'recurring'\n | 'protocol'\n | 'bridge'\n | 'slippage'\n | 'swap'\n | 'other'\n // See `RecurringOrderStatus` for why `Record<never, never>` replaces `{}`.\n | (string & Record<never, never>);\n\nexport interface RecurringQuoteFee {\n type: RecurringQuoteFeeType;\n name: string;\n amount: bigint;\n token: { chainId: number; address: EvmAddress };\n /**\n * Docs document `extra` as `boolean or object`. The boolean form is the\n * legacy \"additive one-time charge\" flag (e.g. the one-time native\n * schedule fee with `type: 'recurring'`); the object form is reserved\n * for future structured metadata. Consumers should treat any truthy\n * value as \"additive — balance-check separately.\"\n */\n extra?: boolean | Record<string, unknown>;\n}\n\nexport interface RecurringQuoteResponse {\n uuid: string;\n chainId: number;\n tokenIn: EvmAddress;\n tokenOut: EvmAddress;\n /** Per-order input. */\n amount: bigint;\n /** Server-side clamped value (may be 365 if the request was unlimited). */\n numberOfOrders: number;\n frequency: RecurringFrequency;\n /** Server-derived from `frequency`. */\n intervalSeconds: number;\n /** `amount × numberOfOrders` — the ERC-20 allowance the caller must grant. */\n totalAmountIn: bigint;\n /** First-fill output estimate. */\n amountOut: bigint;\n /** First-fill `minAmountOut` (slippage applied). */\n minAmountOut: bigint;\n fees: ReadonlyArray<RecurringQuoteFee>;\n /** Basis points. */\n recommendedSlippage: number;\n /** Unix seconds. */\n expiredAt: number;\n}\n\nexport interface RecurringQuoteParams {\n appId: string;\n chainId: number;\n tokenIn: EvmAddress;\n tokenInDecimals: number;\n tokenOut: EvmAddress;\n tokenOutDecimals: number;\n /**\n * Per-order input in smallest unit. `bigint` only — matches the rest of the\n * SDK's internal amount types (response amounts, `Quote.amountIn`, etc.).\n * Callers holding a decimal string should coerce with `BigInt(s)` at the\n * call site.\n */\n amount: bigint;\n /**\n * Number of orders. Accepts:\n * - `Infinity` or `-1` — translated to the unlimited sentinel (`-1`) on the wire.\n * - Integer in `[2, 365]` — Markr's documented finite bound.\n *\n * Anything else (`NaN`, `0`, `1`, negatives other than `-1`, non-integers,\n * values > 365) throws `InvalidParamsError` at the SDK boundary so a\n * misbehaving form parse (`parseInt('')` → `NaN`, or a stale \"minimum is 1\"\n * assumption) can't silently become an unlimited schedule or a guaranteed\n * server-side rejection.\n */\n numberOfOrders: number;\n frequency: RecurringFrequency;\n /** Basis points (matches `/quote` semantics). */\n slippage?: number;\n}\n\nexport interface RecurringSwapParams {\n uuid: string;\n appId: string;\n}\n\nexport interface ListRecurringOrdersParams {\n address: EvmAddress;\n chainId?: number;\n status?: RecurringOrderStatus;\n}\n\nexport interface ListRecurringOrdersResponse {\n address: EvmAddress;\n count: number;\n orders: ReadonlyArray<RecurringOrder>;\n}\n\n/**\n * Wire-level params for the internal `_api.ts` cancel/pause/unpause helpers\n * (`markrPrepareCancellation` etc.). Public consumers reach the same endpoints\n * via {@link RecurringNamespace.executeCancellation}/`executePause`/\n * `executeUnpause`, which take {@link RecurringExecuteOrderActionParams}\n * instead and derive `chainId` from the passed `sourceChain`.\n */\nexport interface RecurringOrderActionApiParams {\n /** See {@link RecurringOrder.orderId} for the shape. */\n orderId: `0x${string}`;\n address: EvmAddress;\n /**\n * Chain the schedule lives on — required by Markr's\n * `POST /recurring/orders/{orderId}/{action}` endpoints (the orchestrator\n * scopes orderIds per chain, so the same bytes32 could in principle exist\n * on multiple chains).\n */\n chainId: number;\n}\n\n/**\n * Shared params for the three order-action execute methods\n * ({@link RecurringNamespace.executeCancellation},\n * {@link RecurringNamespace.executePause},\n * {@link RecurringNamespace.executeUnpause}). The SDK derives the wire-level\n * `chainId` from `sourceChain`, estimates gas via the chain's RPC, then signs\n * and broadcasts via the configured `evmSigner`.\n */\nexport interface RecurringExecuteOrderActionParams {\n /** See {@link RecurringOrder.orderId} for the shape. */\n orderId: `0x${string}`;\n /** Owner address of the schedule — must match the order's `owner`. */\n address: EvmAddress;\n /**\n * Source chain the schedule lives on — pass the same `Chain` that backs\n * `sourceChain` on the recurring order (the SDK reads `rpcUrl` + multicall\n * for the on-chain gas estimate and uses `chainId` for the wire request).\n */\n sourceChain: Chain;\n /** Optional fee-margin + 1559 overrides forwarded to the signed TX. */\n gasSettings?: GasSettings;\n /**\n * Opaque payload forwarded unchanged onto the `step.signerContext` field\n * seen by the configured `EvmSigner`. Lets consumers correlate the wallet\n * prompt back to the specific cancel / pause / unpause request that\n * produced it (e.g. UI slot id, display label) without relying on an\n * action-type-keyed lookup map that two concurrent same-type actions\n * could clobber.\n */\n signerContext?: unknown;\n}\n\n/**\n * Params for {@link RecurringNamespace.executeFirstFill}. Replaces the\n * pre-signer `prepareFirstFill` shape; the SDK now reads the on-chain\n * allowance against `totalAmountIn`, signs an `approve` if needed (batched\n * one-click when `evmSigner.signBatch` is available and the swap is\n * same-chain), then signs and broadcasts the first-fill swap.\n */\nexport interface RecurringExecuteFirstFillParams {\n /** Full recurring quote — carries `uuid`, `totalAmountIn`, `expiredAt`. */\n quote: RecurringQuoteResponse;\n /** EVM address creating the schedule (and signing the first fill). */\n fromAddress: EvmAddress;\n /**\n * Source chain — same `Chain` used to obtain the recurring quote. The SDK\n * reads `rpcUrl` for allowance + gas calls; `chainId` is cross-checked\n * against `quote.chainId` to catch obvious wiring mistakes.\n */\n sourceChain: Chain;\n /** Optional fee-margin + 1559 overrides. */\n gasSettings?: GasSettings;\n /**\n * Mirrors the same flag on `TransferService.transferAsset`: when the\n * one-click batch (approval + first-fill) is attempted and the consumer's\n * wallet rejects the batch, fall back to two sequential signatures\n * (`approve`, then `swap`) instead of bubbling the batch error up.\n */\n fallbackToDefaultOnBatchFailure?: boolean;\n /**\n * Opaque payload forwarded unchanged onto the `step.signerContext` field\n * seen by the configured `EvmSigner` for both the optional approval step\n * and the first-fill swap step. See\n * {@link RecurringExecuteOrderActionParams.signerContext}.\n */\n signerContext?: unknown;\n}\n\n/** Result of any `recurring.execute*` method — broadcast TX hash. */\nexport interface RecurringExecuteResult {\n txHash: Hex;\n}\n\nexport interface RecurringChainInfoEntry {\n /** Server-published lower bound for `intervalSeconds` (today: 300s on enabled chains). */\n minFrequencySeconds: number;\n supportedTokens: ReadonlyArray<{\n address: EvmAddress;\n /**\n * Smallest-unit decimal string — must be `BigInt()`-parseable (i.e.\n * matches `/^\\d+$/`). The Zod schema enforces this on the wire, but the\n * TS type alone is plain `string`; consumers constructing this map by\n * hand (caching, tests) should pass a digits-only decimal string or\n * `BigInt(minimumAmount)` will throw downstream in `checkEligibility`.\n */\n minimumAmount: string;\n }>;\n}\n\n/**\n * Cached `/info/chains` recurring metadata keyed by EVM chainId. SVM chains\n * are omitted — Markr supports recurring on same-chain EVM only.\n */\nexport type RecurringChainInfoMap = ReadonlyMap<number, RecurringChainInfoEntry>;\n\n/**\n * Reasons surfaced when {@link checkRecurringEligibility} returns\n * `{ eligible: false, … }`. Mirrors the existing `TransferSignatureReason`\n * enum pattern (PascalCase member, kebab-case wire value) so external\n * consumers comparing the raw string still match.\n */\nexport enum RecurringEligibilityReason {\n CrossChain = 'cross-chain',\n UnsupportedSourceChain = 'unsupported-source-chain',\n UnsupportedToken = 'unsupported-token',\n NoEvmAddress = 'no-evm-address',\n AmountBelowMinimum = 'amount-below-minimum',\n}\n\nexport type RecurringEligibility =\n | { eligible: true; minimumAmount: string; minIntervalSeconds: number }\n // `AmountBelowMinimum` carries the floor so error UIs can say \"Min is X\"\n // without a second `getRecurringChainInfo()` lookup. The value is the same\n // smallest-unit decimal string as the success branch's `minimumAmount`.\n | { eligible: false; reason: RecurringEligibilityReason.AmountBelowMinimum; minimumAmount: string }\n | { eligible: false; reason: Exclude<RecurringEligibilityReason, RecurringEligibilityReason.AmountBelowMinimum> };\n\nexport interface CheckRecurringEligibilityParams {\n recurringChainInfo: RecurringChainInfoMap;\n fromTokenAddress: EvmAddress;\n toTokenAddress: EvmAddress;\n sourceChainId: number;\n targetChainId: number;\n ownerAddress?: EvmAddress;\n /** Per-order amount; when present, enables the `amount-below-minimum` check. */\n amount?: bigint;\n}\n\n/**\n * Params passed to `RecurringNamespace.checkEligibility`. Same as\n * `CheckRecurringEligibilityParams` minus the chain-info map, which the\n * namespace closure injects.\n */\nexport type RecurringNamespaceCheckEligibilityParams = Omit<CheckRecurringEligibilityParams, 'recurringChainInfo'>;\n\n/**\n * Params passed to `RecurringNamespace.quote`. Same as `RecurringQuoteParams`\n * minus `appId`, which the namespace closure injects.\n */\nexport type RecurringNamespaceQuoteParams = Omit<RecurringQuoteParams, 'appId'>;\n\n/**\n * High-level wrapper exposed as `MarkrService.recurring`. Methods curry\n * `apiOptions`, `appId`, and the cached `recurringChainInfo` so callers only\n * pass per-call inputs.\n */\nexport interface RecurringNamespace {\n /** POST `/recurring/quote` — full quote with `totalAmountIn`, fees, expiry, uuid. */\n quote(props: RecurringNamespaceQuoteParams): Promise<RecurringQuoteResponse>;\n\n /**\n * Creates the schedule on-chain by signing and broadcasting the first\n * `/recurring/swap` fill via the configured `evmSigner`. Mirrors\n * `TransferService.transferAsset`:\n *\n * 1. Reads on-chain `allowance(tokenIn → router)` against `quote.totalAmountIn`.\n * 2. If allowance is short, builds an `approve(router, totalAmountIn)` TX.\n * When the consumer's signer exposes `signBatch`, the SDK attempts a\n * one-click batch (approve + swap) — set\n * {@link RecurringExecuteFirstFillParams.fallbackToDefaultOnBatchFailure}\n * to fall back to two sequential signatures if the wallet rejects the\n * batch.\n * 3. Estimates gas (with `gasSettings.estimateGasMarginBps` margin) for\n * each TX before signing, and dispatches the signed serialized TX via\n * the chain's RPC.\n *\n * Quote-expiry guard mirrors the previous `prepareFirstFill` behavior —\n * `quote.expiredAt <= now` throws `InvalidParamsError(QUOTE_EXPIRED)` at\n * the SDK boundary before any HTTP / on-chain call.\n *\n * Returns the broadcast first-fill TX hash; the schedule transitions to\n * `'active'` once Markr observes the on-chain event (poll `listOrders`).\n */\n executeFirstFill(props: RecurringExecuteFirstFillParams): Promise<RecurringExecuteResult>;\n\n /**\n * GET `/recurring/orders?address=…&chainId?=…&status?=…` — returns the\n * full response (`{ address, count, orders }`) so callers can render the\n * server-echoed `address` (e.g. confirming the queried wallet matches the\n * current EVM signer) and `count` (pagination / \"you have N schedules\"\n * affordances) without an extra lookup. Consumers that only care about the\n * orders array can destructure: `const { orders } = await listOrders(…)`.\n */\n listOrders(props: ListRecurringOrdersParams): Promise<ListRecurringOrdersResponse>;\n\n /**\n * Cancels the recurring schedule identified by `orderId`: fetches the\n * `/recurring/orders/{orderId}/cancel` calldata, estimates gas, then signs\n * and broadcasts via the configured `evmSigner`. The schedule transitions\n * to `status: 'cancelled'` only once the TX confirms and Markr observes\n * the on-chain event.\n *\n * Eligibility: only `'active'` and `'paused'` orders can be cancelled per\n * Markr's docs. An attempt to cancel a `'completed'` order surfaces as\n * `HttpError(400)` from the orchestrator before signing.\n */\n executeCancellation(props: RecurringExecuteOrderActionParams): Promise<RecurringExecuteResult>;\n\n /**\n * Pauses the recurring schedule identified by `orderId`: fetches the\n * `/recurring/orders/{orderId}/pause` calldata, estimates gas, then signs\n * and broadcasts via the configured `evmSigner`. The schedule transitions\n * to `status: 'paused'` only once the TX confirms and Markr observes the\n * on-chain event.\n *\n * Eligibility: only `'active'` orders can be paused per Markr's docs.\n * Attempting to pause a non-`active` order surfaces as `HttpError(400)`.\n *\n * Pausing preserves the schedule's existing ERC-20 allowance — when the\n * user later unpauses, no re-approval and no new native schedule fee are\n * required (this is the key UX benefit of pause over cancel-and-recreate).\n *\n * @see https://orchestrator-docs.markr.io/#tag/Recurring-Swaps/paths/~1recurring~1orders~1{orderId}~1pause/post\n */\n executePause(props: RecurringExecuteOrderActionParams): Promise<RecurringExecuteResult>;\n\n /**\n * Unpauses (resumes) the recurring schedule identified by `orderId`:\n * fetches the `/recurring/orders/{orderId}/unpause` calldata, estimates\n * gas, then signs and broadcasts via the configured `evmSigner`. The\n * schedule transitions back to `status: 'active'` only once the TX\n * confirms and Markr observes the on-chain event.\n *\n * Eligibility: only `'paused'` orders can be unpaused per Markr's docs.\n * Attempting to unpause a non-`paused` order surfaces as `HttpError(400)`.\n *\n * Resumes execution from where the schedule left off — remaining fills\n * continue on the original `frequency` cadence. The orchestrator recomputes\n * `nextExecutionAt` after the TX confirms.\n *\n * @see https://orchestrator-docs.markr.io/#tag/Recurring-Swaps/paths/~1recurring~1orders~1{orderId}~1unpause/post\n */\n executeUnpause(props: RecurringExecuteOrderActionParams): Promise<RecurringExecuteResult>;\n\n /**\n * Pure (no fetch) — uses the cached `/info/chains` recurring metadata.\n *\n * **Covers:** chain support, token support, EVM-address presence, same-chain\n * (cross-chain rejected), and per-order minimum (when `amount` is passed —\n * failure carries `minimumAmount`).\n *\n * **Does NOT cover wallet balance.** This helper has no wallet/RPC context.\n * Checking that the user holds `amount × numberOfOrders` of `tokenIn` (plus\n * native gas for the first fill) is the consumer's responsibility, same as\n * the one-shot swap flow. There is no `InsufficientBalance` reason on\n * {@link RecurringEligibilityReason} by design.\n *\n * **Does NOT cover post-fill failures.** Once a schedule is live, on-chain\n * reverts (slippage, runtime insufficient balance, etc.) surface server-side\n * as open-ended strings on `RecurringOrder.failures[].reasons` — substring-\n * match those for client-driven auto-cancel (AC4 pattern) and call\n * {@link RecurringNamespace.prepareCancellation} when applicable.\n *\n * **Does NOT cover server-side quote rejection.** Slippage, target-token\n * unsupported, liquidity, etc. are decided at `/recurring/quote` time and\n * surface as `HttpError` from {@link RecurringNamespace.quote}.\n */\n checkEligibility(props: RecurringNamespaceCheckEligibilityParams): RecurringEligibility;\n\n /** Returns the cached `/info/chains` recurring metadata. */\n getRecurringChainInfo(): RecurringChainInfoMap;\n}\n"],"mappings":"AAUA,MAAa,EAA4B,CAAC,SAAU,OAAQ,MAAO,OAAQ,QAAQ,CAmBtE,EAAsC,GAWnD,IAAY,EAAL,SAAA,EAAA,OACL,GAAA,OAAA,SACA,EAAA,UAAA,YACA,EAAA,UAAA,YACA,EAAA,OAAA,eACD,CAySW,EAAL,SAAA,EAAA,OACL,GAAA,WAAA,cACA,EAAA,uBAAA,2BACA,EAAA,iBAAA,oBACA,EAAA,aAAA,iBACA,EAAA,mBAAA,6BACD"}
|
|
@@ -16,6 +16,14 @@ interface TransferStepDetails {
|
|
|
16
16
|
readonly requiredSignatures: number;
|
|
17
17
|
/** The original quote */
|
|
18
18
|
readonly quote: Quote;
|
|
19
|
+
/**
|
|
20
|
+
* Opaque per-request payload supplied by the caller on the originating
|
|
21
|
+
* execute call; the SDK forwards it unchanged. Lets consumers correlate
|
|
22
|
+
* a signer prompt back to the specific request that produced it without
|
|
23
|
+
* relying on out-of-band state keyed by action type (which can collide
|
|
24
|
+
* when two same-type actions are in flight).
|
|
25
|
+
*/
|
|
26
|
+
readonly signerContext?: unknown;
|
|
19
27
|
}
|
|
20
28
|
/**
|
|
21
29
|
* Unified transfer lifecycle states (bridge and swap).
|
package/dist/types/transfer.d.ts
CHANGED
|
@@ -16,6 +16,14 @@ interface TransferStepDetails {
|
|
|
16
16
|
readonly requiredSignatures: number;
|
|
17
17
|
/** The original quote */
|
|
18
18
|
readonly quote: Quote;
|
|
19
|
+
/**
|
|
20
|
+
* Opaque per-request payload supplied by the caller on the originating
|
|
21
|
+
* execute call; the SDK forwards it unchanged. Lets consumers correlate
|
|
22
|
+
* a signer prompt back to the specific request that produced it without
|
|
23
|
+
* relying on out-of-band state keyed by action type (which can collide
|
|
24
|
+
* when two same-type actions are in flight).
|
|
25
|
+
*/
|
|
26
|
+
readonly signerContext?: unknown;
|
|
19
27
|
}
|
|
20
28
|
/**
|
|
21
29
|
* Unified transfer lifecycle states (bridge and swap).
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@avalabs/fusion-sdk",
|
|
3
3
|
"license": "Limited Ecosystem License",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.23.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/mod.cjs",
|
|
7
7
|
"module": "./dist/mod.js",
|
|
@@ -49,8 +49,8 @@
|
|
|
49
49
|
"vitest": "4.0.6",
|
|
50
50
|
"tsdown": "0.21.4",
|
|
51
51
|
"zod": "4.1.12",
|
|
52
|
-
"
|
|
53
|
-
"
|
|
52
|
+
"eslint-config-custom": "0.1.0",
|
|
53
|
+
"@internal/tsdown-config": "0.0.1"
|
|
54
54
|
},
|
|
55
55
|
"sideEffects": false,
|
|
56
56
|
"scripts": {
|