{"_id":"@automark/sdk","name":"@automark/sdk","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"@automark/sdk","version":"0.1.0","description":"TypeScript SDK for interacting with Automark vaults on Sui. Builds PTBs and reads on-chain state. Does not custody keys or submit transactions — wallets/apps do that.","license":"MIT","keywords":["sui","automark","vault","defi","predict","ptb"],"type":"module","sideEffects":false,"engines":{"node":">=20"},"main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./duration":{"types":"./dist/duration.d.ts","import":"./dist/duration.js"},"./errors":{"types":"./dist/errors.d.ts","import":"./dist/errors.js"},"./market":{"types":"./dist/market.d.ts","import":"./dist/market.js"},"./math":{"types":"./dist/math.d.ts","import":"./dist/math.js"},"./network":{"types":"./dist/network.d.ts","import":"./dist/network.js"},"./oracle":{"types":"./dist/oracle.d.ts","import":"./dist/oracle.js"},"./permissions":{"types":"./dist/permissions.d.ts","import":"./dist/permissions.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./vault":{"types":"./dist/vault.d.ts","import":"./dist/vault.js"},"./package.json":"./package.json"},"repository":{"type":"git","url":"git+https://github.com/automark-protocol/automark-sdk.git"},"homepage":"https://github.com/automark-protocol/automark-sdk#readme","bugs":{"url":"https://github.com/automark-protocol/automark-sdk/issues"},"publishConfig":{"access":"public"},"scripts":{"build":"tsup","typecheck":"tsc --noEmit","test":"node --import tsx --test src/__tests__/*.test.ts","prepublishOnly":"npm run typecheck && npm run test && npm run build"},"peerDependencies":{"@mysten/sui":"^1.30.0"},"devDependencies":{"@mysten/sui":"^1.30.0","@types/node":"^20.19.41","tsup":"^8.3.0","tsx":"^4.19.0","typescript":"^5.7.2"},"_id":"@automark/sdk@0.1.0","gitHead":"431bbcd09ba398a876fc2ce0f4905f43aba48932","_nodeVersion":"22.22.1","_npmVersion":"10.9.4","dist":{"integrity":"sha512-qGp6jOn0whne9RXjlTDbq2VTWviVkejLAajUGkqNbBrUIbo+kiG6cilo3hlOKxZuNoca5kiy6HCNE0HFAzhx7A==","shasum":"9ca074dfbfc7cbd103907b5ff4cf6add673a14c6","tarball":"https://registry.npmjs.org/@automark/sdk/-/sdk-0.1.0.tgz","fileCount":69,"unpackedSize":381823,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIBumu46T/ktQ64HXBQyvpbVyJ+6tEH3prGDer48vNs8fAiEA80TR0JPBbNc00CEhIHkYLuF8aTVI0Q9NvmmVwzyq17U="}]},"_npmUser":{"name":"automarkfin","email":"automarkfin@gmail.com"},"directories":{},"maintainers":[{"name":"automarkfin","email":"automarkfin@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sdk_0.1.0_1781110733493_0.05879391958346303"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-10T16:58:53.342Z","0.1.0":"2026-06-10T16:58:53.630Z","modified":"2026-06-10T16:58:53.850Z"},"maintainers":[{"name":"automarkfin","email":"automarkfin@gmail.com"}],"description":"TypeScript SDK for interacting with Automark vaults on Sui. Builds PTBs and reads on-chain state. Does not custody keys or submit transactions — wallets/apps do that.","homepage":"https://github.com/automark-protocol/automark-sdk#readme","keywords":["sui","automark","vault","defi","predict","ptb"],"repository":{"type":"git","url":"git+https://github.com/automark-protocol/automark-sdk.git"},"bugs":{"url":"https://github.com/automark-protocol/automark-sdk/issues"},"license":"MIT","readme":"# @automark/sdk\n\nTypeScript SDK for interacting with Automark vaults on Sui. Builds PTBs and reads on-chain state — the SDK never custodies keys or submits transactions, your wallet does that.\n\n> **Status:** early-access. The current surface is stable in shape, but the package is pre-`v1.0` and minor versions may introduce breaking changes until the contract API freezes. See [Roadmap](#roadmap) for what is already shipped vs planned.\n\n## Install\n\n```bash\nnpm install @automark/sdk @mysten/sui\n# or\npnpm add @automark/sdk @mysten/sui\n```\n\n`@mysten/sui` is a peer dependency.\n\n## Quick start\n\n### Discover a market and read its live price\n\n```ts\nimport { SuiClient } from \"@mysten/sui/client\";\nimport { Market } from \"@automark/sdk\";\n\nconst suiClient = new SuiClient({ url: \"https://fullnode.testnet.sui.io\" });\n\n// Find the nearest BTC market expiring more than 5 minutes from now.\nconst btc = await Market.find({\n  asset: \"BTC\",\n  expiryAfterMs: Date.now() + 5 * 60 * 1000,\n  client: suiClient,\n});\n\n// One read-only RPC, ~200-400ms typical, no gas.\nconst p = await btc.price();\nconsole.log({\n  spot: p.spotUsd,        // live BTC spot in USD\n  forward: p.forwardUsd,  // SVI forward (probabilistic center)\n});\n\n// Strikes snapped to the on-chain tick grid, ready for mintBinary/mintRange.\nconst upper = btc.strikeAbove(p.forwardRaw, { pctBps: 300 });   // 3% above forward\nconst atm   = btc.strikeNear(p.forwardRaw);                     // ATM\n```\n\n### Read vault state\n\n```ts\nimport { Vault } from \"@automark/sdk\";\n\nconst vault = await Vault.fetch(vaultId, { suiClient });\n\nconsole.log({\n  nav: vault.nav,\n  navPerShare: vault.navPerShare,\n  totalShares: vault.totalShares,\n  paused: vault.paused,\n});\n```\n\n### Refresh NAV + crystallize fees (permissionless)\n\n```ts\nimport { Transaction } from \"@mysten/sui/transactions\";\nimport { Vault } from \"@automark/sdk\";\n\nconst vault = await Vault.fetch(vaultId, { suiClient });\n\nconst tx = new Transaction();\n// Auto-picks update_nav_snapshot vs the begin/add_oracle/finalize builder\n// depending on whether the vault has open positions.\nvault.crystallizeFees(tx, {\n  refs: { predictPackageId, predictObjectId },\n});\n\nawait wallet.signAndExecuteTransaction({ transaction: tx });\n```\n\n### Compose trade ops in a single PTB\n\n```ts\nimport { Transaction } from \"@mysten/sui/transactions\";\nimport { Vault, Market } from \"@automark/sdk\";\n\nconst vault = await Vault.fetch(vaultId, { suiClient });\nconst { packageId: strategyPackageId, module: strategyModule } =\n  vault.parseStrategyType();\n\n// Discover the target market and its current price.\nconst btc = await Market.find({ asset: \"BTC\", expiryAfterMs: Date.now() + 5*60_000, client: suiClient });\nconst p = await btc.price();\n\nconst tx = new Transaction();\n\n// Fund PM first, then mint — same PTB for atomicity\nvault.pmDeposit(tx, { strategyPackageId, strategyModule, amount: 500_000_000n });\nvault.mintBinary(tx, {\n  strategyPackageId, strategyModule,\n  predictPackageId, predictObjectId,\n  oracleId: btc.id,\n  strike: btc.strikeAbove(p.forwardRaw, { pctBps: 300 }),\n  isUp: true,\n  quantity: 100_000_000n,\n});\n\nawait wallet.signAndExecuteTransaction({ transaction: tx });\n```\n\n### Create a vault (3 sequential transactions)\n\n```ts\nimport { Vault } from \"@automark/sdk\";\n\n// TX 1 — publish share-token package\nconst tx1 = Vault.publishShareTokenTx({ modules, dependencies, sender });\nconst res1 = await wallet.signAndExecuteTransaction({ transaction: tx1 });\nconst share = Vault.parsePublishedShareToken(res1, moduleName, structName);\n\n// TX 2 — finalize Currency registration (promotes to shared)\nconst tx2 = Vault.finalizeShareRegistrationTx({\n  sender,\n  shareType: share.shareType,\n  currencyReceivingId: share.currencyReceivingId,\n  currencyReceivingVersion,\n  currencyReceivingDigest,\n});\nawait wallet.signAndExecuteTransaction({ transaction: tx2 });\n\n// TX 3 — atomic PredictManager + Vault creation\nconst tx3 = Vault.create({\n  sender,\n  vaultPackageId,\n  predictPackageId,\n  shareType: share.shareType,\n  quoteType,\n  treasuryCapId: share.treasuryCapId,\n  shareCurrencyId: share.currencyReceivingId,\n  witnessType,\n  initialQuoteCoinId,\n  initialQuoteAmountMicros,\n  riskParams,\n  feeParams,\n  navParams,\n  governanceAdmin,\n  emergencyAdmin,\n  creatorAddress,\n  platformTreasury,\n  initialPermissions,\n  operatorAddress,\n});\nconst res3 = await wallet.signAndExecuteTransaction({ transaction: tx3 });\nconst created = Vault.parseCreatedVault(res3);\n// → { vaultId, vaultPackageId, predictManagerId, strategyPackageId, strategyModuleName, shareType }\n```\n\n### Map Move-abort codes to names\n\n```ts\nimport { parseMoveAbort } from \"@automark/sdk\";\n\ntry {\n  await wallet.signAndExecuteTransaction({ transaction: tx });\n} catch (err) {\n  const info = parseMoveAbort(err);\n  if (info) {\n    console.log(info.code, info.name); // e.g. 9, \"E_SNAPSHOT_STALE\"\n  } else {\n    // not a MoveAbort (RPC, user reject, network) — handle separately\n  }\n}\n```\n\n### Permission bits\n\n```ts\nimport { PERMISSIONS, combinePermissions, decomposePermissions } from \"@automark/sdk\";\n\nconst perms = combinePermissions(\n  PERMISSIONS.MINT_BINARY,\n  PERMISSIONS.REDEEM_BINARY,\n  PERMISSIONS.PM_DEPOSIT,\n  PERMISSIONS.PM_WITHDRAW,\n); // → 195\n\ndecomposePermissions(perms);\n// → [\"MINT_BINARY\", \"REDEEM_BINARY\", \"PM_DEPOSIT\", \"PM_WITHDRAW\"]\n```\n\n## Subpath exports\n\n```ts\nimport { Vault }            from \"@automark/sdk/vault\";\nimport { Market }           from \"@automark/sdk/market\";\nimport { Oracle }           from \"@automark/sdk/oracle\";\nimport { days, hours }      from \"@automark/sdk/duration\";\nimport { usdFromRaw }       from \"@automark/sdk/math\";\nimport { getNetworkConfig } from \"@automark/sdk/network\";\nimport { PERMISSIONS,\n         hasPermission }    from \"@automark/sdk/permissions\";\nimport { parseMoveAbort,\n         VAULT_ERROR_CODES } from \"@automark/sdk/errors\";\nimport type { VaultState,\n              MarketKey }   from \"@automark/sdk/types\";\n```\n\nThe main barrel re-exports everything, but subpath imports help tree-shaking when bundle size matters.\n\n## Roadmap\n\nWhat's available today:\n\n| Surface | Status |\n|---|---|\n| `Vault.fetch`, `refresh`, full state getters | ✅ |\n| `uniqueOracleIds` getter | ✅ |\n| Creation flow: `publishShareTokenTx`, `publishStrategyTx`, `finalizeShareRegistrationTx`, `create` + parsers | ✅ |\n| Trade ops on the vault: `mintBinary`, `mintRange`, `pmDeposit`, `pmWithdraw` | ✅ |\n| NAV snapshot: `refreshNavSnapshot` (auto-select), `updateNavSnapshot` | ✅ |\n| Fees: `crystallizeFees` + `Vault.crystallizeFeesTx` + `parseCrystallizedFees` | ✅ |\n| `Market` — discovery + live price + strike helpers (`strikeNear`, `strikeAbove`, `strikeBelow`, `strikeAtSigma`) | ✅ |\n| `Oracle` — lower-level Predict vocabulary (`listActive`, `findActive`, `getById`, `getSnapshot`) | ✅ |\n| Duration helpers (`days`, `hours`, `minutes`, `seconds`) | ✅ |\n| Math helpers (`usdFromRaw`, `usdToRaw`, `bigintMin/Max/Clamp`) | ✅ |\n| Network refs (`getNetworkConfig`, `NETWORK_CONFIG`, default RPC + predict-server URLs) | ✅ |\n| `PERMISSIONS` constants + helpers | ✅ |\n| `parseMoveAbort`, `VAULT_ERROR_CODES`, `getErrorName` | ✅ |\n| Re-exported types: `VaultState`, `MarketKey`, `RangeKey`, `NavParams`, `RiskParamsState`, `FeeParamsState`, `PMPositionSummary`, `OracleState` | ✅ |\n\nPlanned:\n\n| Surface | Status |\n|---|---|\n| LP-facing tx builders (`requestDeposit`, `requestWithdrawal`, cancels, process_*) | ⏳ |\n| Standalone `Strategy` class with operator-facing ops (`redeemBinary`/`redeemRange`/`supplyPlp`/`withdrawPlp`/`tick`) | ⏳ |\n| Strategy authoring helpers (`createStrategyDeployment`, witness setup, `replace_strategy` boilerplate) | ⏳ |\n| Keeper helpers (`listPendingDeposits`/`listPendingWithdrawals`, scheduler) | ⏳ |\n| Governance ops (`proposeXUpgrade`, `activatePendingUpgrade`) | ⏳ |\n| React hooks (`useVault`, `useNav`, `usePositions`) — likely a `@automark/sdk/react` subpath | ⏳ |\n| Batch reads (`Vault.fetchMany`) | ⏳ |\n\n## Design notes\n\n- **Methods accept a `Transaction`**, not return one. This is intentional: PTB requires every moveCall in a single tx, so the SDK never wraps `Transaction` — you compose freely.\n- **`bigint` for every on-chain quantity** (u64 exceeds `Number.MAX_SAFE_INTEGER`). The SDK converts to `tx.pure.u64()` internally.\n- **`static fetch()` instead of `new Vault(id)`**: a Vault constructed without on-chain reads would be incomplete (no NAV, params, admins). Forcing `fetch` guarantees the object always carries a real snapshot.\n- **`Vault.refresh()` mutates in place** for ergonomics. If you want immutability, just call `Vault.fetch()` again — same RPC cost.\n- **`Market` wraps `Oracle`** with vocabulary that fits builders. Internally they delegate; use whichever feels right for the layer you're at.\n\n## Error handling\n\nThe SDK throws on:\n- Missing `predict_manager_id` when calling `mintBinary`/`mintRange`/`pmDeposit`/`pmWithdraw`\n- `higherStrike <= lowerStrike` in `mintRange`\n- `refreshNavSnapshot` called without `refs` on a vault with positions\n- `refreshNavSnapshot` exceeding 10 unique oracles (split into multiple PTBs)\n- Malformed object types or parse failures in `parseVaultType` / `parseStrategyType`\n- `Market.price()` without a `SuiClient` (passed at `find/list/byId` time or to `price()`)\n- `Oracle.findActive` when no active oracle matches the time filters\n- `bigintClamp` with `min > max` (swapped args)\n\nFor on-chain failures (Move aborts), use `parseMoveAbort(err)` to get a structured `{ code, name, raw }` object.\n\n## License\n\nMIT.\n","readmeFilename":"README.md","_rev":"1-ef31399161a955b479d47af49e5494f1"}