@anywalletkit/protocol-swap2-chainflip 0.2.2 → 0.2.4
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/{chunk-XF7BEBET.js → chunk-5WPJP2F5.js} +2 -2
- package/dist/{chunk-ZFCYBCOT.js → chunk-LZARKA3C.js} +2 -2
- package/dist/{chunk-R6EYDH5N.js → chunk-SJ6UVIVY.js} +15 -7
- package/dist/chunk-SJ6UVIVY.js.map +1 -0
- package/dist/codec.cjs +14 -6
- package/dist/codec.cjs.map +1 -1
- package/dist/codec.js +1 -1
- package/dist/index.cjs +14 -6
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +3 -3
- package/dist/protocol.cjs +14 -6
- package/dist/protocol.cjs.map +1 -1
- package/dist/protocol.js +3 -3
- package/dist/provider.cjs +14 -6
- package/dist/provider.cjs.map +1 -1
- package/dist/provider.js +2 -2
- package/package.json +10 -7
- package/dist/chunk-R6EYDH5N.js.map +0 -1
- /package/dist/{chunk-XF7BEBET.js.map → chunk-5WPJP2F5.js.map} +0 -0
- /package/dist/{chunk-ZFCYBCOT.js.map → chunk-LZARKA3C.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/codec.ts"],"sourcesContent":["/**\n * Decoders for what Chainflip's encoder returns, so a vault swap is checked byte by byte before anyone signs it:\n * - VersionedCfParameters (SCALE): retry window, refund address, minimum price (X128), oracle slippage, DCA, boost,\n * broker + its fee, affiliates — the EVM vault call's `cfParameters` and the tail of the Tron note;\n * - the Tron note: output asset id, encoded destination address, CCM option, then the length-prefixed parameters;\n * - the EVM vault calls xSwapNative / xSwapToken.\n * Layouts were decoded from live encoder outputs (2026-10-20) and match the state chain's types.\n */\nimport {base58} from \"@scure/base\";\nimport {sha256} from \"@noble/hashes/sha2.js\";\nimport {decodeFunctionData, parseAbi, type Hex} from \"viem\";\n\nexport interface CfParameters {\n version: number;\n retryDurationBlocks: number;\n /** raw refund address bytes (20 for EVM / Tron, 32 for Solana) as 0x-hex */\n refundAddress: Hex;\n /** minimum output price × 2^128, scaled by 10^(destDecimals − srcDecimals) */\n minPriceX128: bigint;\n refundCcm: boolean;\n maxOraclePriceSlippageBps: number | null;\n dca: {chunks: number; intervalBlocks: number} | null;\n boostFeeBps: number;\n broker: {account: Hex; feeBps: number};\n affiliates: {account: number; feeBps: number}[];\n}\n\nclass Reader {\n i = 0;\n constructor(readonly b: Uint8Array) {}\n need(n: number) { if (this.i + n > this.b.length) throw new Error(`chainflip codec: truncated at ${this.i} (+${n} of ${this.b.length})`); }\n u8() { this.need(1); return this.b[this.i++]!; }\n bytes(n: number) { this.need(n); const out = this.b.slice(this.i, this.i + n); this.i += n; return out; }\n uLE(n: number): bigint { const x = this.bytes(n); let v = 0n; for (let k = n - 1; k >= 0; k--) v = (v << 8n) | BigInt(x[k]!); return v; }\n /** SCALE compact integer */\n compact(): number {\n const first = this.u8();\n const mode = first & 3;\n if (mode === 0) return first >> 2;\n if (mode === 1) return ((this.u8() << 8) | first) >> 2;\n if (mode === 2) { const rest = Number(this.uLE(3)); return ((rest << 8) | first) >>> 2; }\n throw new Error(\"chainflip codec: big compact integers are not used here\");\n }\n done() { if (this.i !== this.b.length) throw new Error(`chainflip codec: ${this.b.length - this.i} trailing bytes`); }\n}\n\nexport const toHex = (b: Uint8Array): Hex => `0x${[...b].map((x) => x.toString(16).padStart(2, \"0\")).join(\"\")}` as Hex;\nexport function fromHex(h: string): Uint8Array {\n const s = h.startsWith(\"0x\") ? h.slice(2) : h;\n if (s.length % 2 || /[^0-9a-f]/i.test(s)) throw new Error(\"chainflip codec: not hex\");\n return Uint8Array.from(s.match(/../g) ?? [], (x) => Number.parseInt(x, 16));\n}\n\n/** VersionedCfParameters V1. `refundLen` = 20 for EVM / Tron sources, 32 for Solana. */\nexport function decodeCfParameters(bytes: Uint8Array, refundLen: 20 | 32): CfParameters {\n const r = new Reader(bytes);\n const p = readCfParameters(r, refundLen);\n r.done();\n return p;\n}\n\nfunction readCfParameters(r: Reader, refundLen: number): CfParameters {\n const version = r.u8();\n if (version !== 1) throw new Error(`chainflip codec: cf parameters version ${version}`);\n // ccm_additional_data is `()` for non-CCM swaps: zero bytes\n const retryDurationBlocks = Number(r.uLE(4));\n const refundAddress = toHex(r.bytes(refundLen));\n const minPriceX128 = r.uLE(32);\n const refundCcm = r.u8() !== 0;\n if (refundCcm) throw new Error(\"chainflip codec: refund CCM metadata is not expected\");\n const maxOraclePriceSlippageBps = r.u8() ? Number(r.uLE(2)) : null;\n const dca = r.u8() ? {chunks: Number(r.uLE(4)), intervalBlocks: Number(r.uLE(4))} : null;\n const boostFeeBps = r.u8();\n const broker = {account: toHex(r.bytes(32)), feeBps: Number(r.uLE(2))};\n const n = r.compact();\n const affiliates = Array.from({length: n}, () => ({account: r.u8(), feeBps: Number(r.uLE(2))}));\n return {version, retryDurationBlocks, refundAddress, minPriceX128, refundCcm, maxOraclePriceSlippageBps, dca, boostFeeBps, broker, affiliates};\n}\n\nexport interface TronNote {\n outputAsset: number;\n /** EncodedAddress variant of the destination (Eth 0, Dot 1, Btc 2, Arb 3, Sol 4, Hub 5, Tron 6) and its raw bytes */\n destTag: number;\n destAddress: Uint8Array;\n ccm: boolean;\n params: CfParameters;\n}\n\n/** Address byte length per encoded-address tag (EncodedAddress enum: Eth, Dot, Btc, Arb, Sol, Hub, Tron …). */\nconst TAG_LEN: Record<number, number | \"vec\"> = {0: 20, 1: 32, 2: \"vec\", 3: 20, 4: 32, 5: 32, 6: 20};\n\n/** The note a Tron vault swap carries in raw_data.data. */\nexport function decodeTronNote(note: string): TronNote {\n const r = new Reader(fromHex(note));\n const outputAsset = r.u8();\n const destTag = r.u8();\n const len = TAG_LEN[destTag];\n if (len === undefined) throw new Error(`chainflip codec: unknown address tag ${destTag}`);\n const destAddress = len === \"vec\" ? r.bytes(r.compact()) : r.bytes(len);\n const ccm = r.u8() !== 0;\n if (ccm) throw new Error(\"chainflip codec: CCM swaps are not expected\");\n const paramsLen = r.compact();\n const start = r.i;\n const params = readCfParameters(r, 20);\n if (r.i - start !== paramsLen) throw new Error(`chainflip codec: cf parameters length ${r.i - start} ≠ declared ${paramsLen}`);\n r.done();\n return {outputAsset, destTag, destAddress, ccm, params};\n}\n\nconst VAULT_ABI = parseAbi([\n \"function xSwapNative(uint32 dstChain, bytes dstAddress, uint32 dstToken, bytes cfParameters) payable\",\n \"function xSwapToken(uint32 dstChain, bytes dstAddress, uint32 dstToken, address srcToken, uint256 amount, bytes cfParameters)\",\n]);\n\nexport interface EvmVaultCall {\n native: boolean;\n dstChain: number;\n dstAddress: Uint8Array;\n dstToken: number;\n srcToken: string | null;\n amount: bigint | null;\n params: CfParameters;\n}\n\nexport function decodeEvmVaultCall(data: string): EvmVaultCall {\n const d = decodeFunctionData({abi: VAULT_ABI, data: data as Hex});\n if (d.functionName === \"xSwapNative\") {\n const [dstChain, dstAddress, dstToken, cf] = d.args;\n return {native: true, dstChain, dstAddress: fromHex(dstAddress), dstToken, srcToken: null, amount: null, params: decodeCfParameters(fromHex(cf), 20)};\n }\n const [dstChain, dstAddress, dstToken, srcToken, amount, cf] = d.args;\n return {native: false, dstChain, dstAddress: fromHex(dstAddress), dstToken, srcToken, amount, params: decodeCfParameters(fromHex(cf), 20)};\n}\n\n/** Tron base58check `T…` ↔ the 20 raw bytes Chainflip encodes (0x41 prefix dropped). */\nexport function tronToBytes(address: string): Uint8Array {\n const b = base58.decode(address);\n if (b.length !== 25 || b[0] !== 0x41) throw new Error(`not a Tron address: ${address}`);\n const check = sha256(sha256(b.subarray(0, 21))).subarray(0, 4);\n if (toHex(check) !== toHex(b.subarray(21))) throw new Error(`bad Tron checksum: ${address}`);\n return b.subarray(1, 21);\n}\n\n/** The raw bytes a destination address is encoded with, per destination chain (EVM / Tron 20, Solana 32, BTC ASCII). */\nexport function destAddressBytes(chain: string, address: string): Uint8Array {\n if (chain.startsWith(\"eip155:\")) return fromHex(address);\n if (chain.startsWith(\"tron:\")) return tronToBytes(address);\n if (chain.startsWith(\"solana:\")) { const b = base58.decode(address); if (b.length !== 32) throw new Error(`not a Solana address: ${address}`); return b; }\n if (chain.startsWith(\"bitcoin:\")) return new TextEncoder().encode(address);\n throw new Error(`chainflip: no address encoding for ${chain}`);\n}\n\nexport const sameBytes = (a: Uint8Array, b: Uint8Array) => a.length === b.length && a.every((x, i) => x === b[i]);\n\n/** minPriceX128 for a guaranteed output: ceil(minOut × 2^128 / amountIn) (base units on both sides carry the decimals). */\nexport function minPriceX128For(amountIn: bigint, minOut: bigint): bigint {\n return (minOut * 2n ** 128n + amountIn - 1n) / amountIn;\n}\n/** The output a min price guarantees for `amountIn` (floor). */\nexport function minOutOf(amountIn: bigint, minPriceX128: bigint): bigint {\n return (amountIn * minPriceX128) / 2n ** 128n;\n}\n"],"mappings":"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","names":["dstChain","dstAddress","dstToken","cf"]}
|
|
File without changes
|
|
File without changes
|