divy-sdk 0.1.1 → 0.1.2

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/README.md CHANGED
@@ -54,10 +54,12 @@ console.log('harvested', harvestTx);
54
54
 
55
55
  ## Fee split
56
56
 
57
- Every trade pays a 1% curve fee. Pons keeps 30% of it. The rest forwards through your agent's
58
- split contract every harvest, no claim step: **60% to the agent's payout wallet, 30% to Pons,
59
- 10% to Divy.** Any creator tax you set (`creatorTaxBps`, up to `maxCreatorTaxBps`) goes to the
60
- agent on top of that, in full.
57
+ Every trade pays a 1% curve fee. Pons keeps 30% of it. The other 70%, plus any creator tax you
58
+ set (`creatorTaxBps`, up to `maxCreatorTaxBps`), lands in your agent's split contract. On every
59
+ harvest the split keeps `divyBps` (1428, so 14.28%) for Divy and sends the rest to the agent:
60
+ of the base fee that is 60% to the agent, 30% to Pons, 10% to Divy, and of the creator tax
61
+ 85.72% to the agent. Self-custody agents are paid at their own address. Hosted wallets are paid
62
+ at the hosted address and then swept to the `payout` you set. No claim step either way.
61
63
 
62
64
  ## API surface
63
65
 
package/dist/index.cjs CHANGED
@@ -178,6 +178,7 @@ function parseAgentLaunch(l) {
178
178
  recorded: l.recorded,
179
179
  retention: l.retention ?? null,
180
180
  retentionProvisional: l.retentionProvisional ?? false,
181
+ retentionPending: l.retentionPending ?? false,
181
182
  earlyHolders: l.earlyHolders ?? null,
182
183
  retained: l.retained ?? null
183
184
  };
@@ -222,12 +223,30 @@ function parseLaunches(j) {
222
223
  graduated: r.graduated,
223
224
  retention: r.retention ?? null,
224
225
  retentionProvisional: r.retentionProvisional ?? false,
226
+ retentionPending: r.retentionPending ?? false,
225
227
  earlyHolders: r.earlyHolders ?? null,
226
228
  retained: r.retained ?? null
227
229
  }));
228
230
  }
229
231
  function parseHealth(j) {
230
- return { ok: j.ok, indexedBlock: bigOrNull(j.indexedBlock), head: big(j.head), lag: bigOrNull(j.lag) };
232
+ const k = j.keeper ?? {};
233
+ return {
234
+ ok: j.ok,
235
+ rpc: j.rpc ?? true,
236
+ indexedBlock: bigOrNull(j.indexedBlock),
237
+ head: bigOrNull(j.head),
238
+ lag: bigOrNull(j.lag),
239
+ keeper: {
240
+ address: k.address ?? null,
241
+ enabled: !!k.enabled,
242
+ balanceWei: bigOrNull(k.balanceWei),
243
+ low: !!k.low,
244
+ spent24hWei: big(k.spent24hWei ?? "0"),
245
+ dailyBudgetWei: big(k.dailyBudgetWei ?? "0"),
246
+ lastTickAt: k.lastTickAt ?? null
247
+ },
248
+ warnings: Array.isArray(j.warnings) ? j.warnings : []
249
+ };
231
250
  }
232
251
  function parseTx(t) {
233
252
  return { to: t.to, data: t.data, value: big(t.value) };
@@ -462,6 +481,11 @@ var Divy = class {
462
481
  const receipt = await this.sendLocal(built.tx);
463
482
  return { txHash: receipt.transactionHash };
464
483
  }
484
+ // Own-wallet launches only: tell the API about a launch tx you mined yourself so the record
485
+ // updates now instead of on the indexer's next pass.
486
+ async confirmLaunch(txHash) {
487
+ return apiRequest(this.apiUrl, "/launches/confirm", { body: { txHash } });
488
+ }
465
489
  async waitForRecord(token, options = {}) {
466
490
  const timeoutMs = options.timeoutMs ?? 6e4;
467
491
  const intervalMs = options.intervalMs ?? 3e3;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/client.ts","../src/chain.ts","../src/abi.ts","../src/errors.ts","../src/http.ts","../src/parse.ts"],"sourcesContent":["export { createDivy, Divy } from './client.js';\nexport { DivyError } from './errors.js';\nexport { addresses, defineDivyChain, explorerAddress, explorerTx, CHAIN_ID, DEFAULT_API_URL, DEFAULT_RPC_URL } from './chain.js';\nexport type {\n Address, Hex, Tx,\n CreateDivyOptions, CreateDivySelfCustody, CreateDivyHosted, CreateDivyReadOnly, DivyMode,\n CreateHostedAgentParams, CreateHostedAgentResult,\n InfoResult, FeePolicy, AgentRecord, AgentLaunch, LeaderboardEntry, LaunchListItem, HealthResult,\n QuoteParams, QuoteResult, RegisterResult, LaunchParams, LaunchResult, RecordResult,\n TradeParams, BuyParams, SellParams, TradeResult, HarvestResult, WaitForRecordOptions,\n} from './types.js';\n","import {\n createPublicClient, createWalletClient, http, encodeFunctionData, decodeEventLog, zeroAddress,\n} from 'viem';\nimport type { Address, Hex } from 'viem';\nimport { privateKeyToAccount } from 'viem/accounts';\nimport { addresses, defineDivyChain } from './chain.js';\nimport { curveAbi, factoryTokenLaunchedAbi } from './abi.js';\nimport { DivyError } from './errors.js';\nimport { apiRequest } from './http.js';\nimport {\n parseAgentRecord, parseHealth, parseInfo, parseLaunches, parseLeaderboard, parseQuote,\n} from './parse.js';\nimport type {\n AgentRecord, BuyParams, CreateDivyOptions, CreateHostedAgentParams, CreateHostedAgentResult, DivyMode, HarvestResult, HealthResult, InfoResult,\n LaunchListItem, LaunchParams, LaunchResult, LeaderboardEntry, QuoteParams, QuoteResult, RecordResult,\n RegisterResult, SellParams, TradeResult, Tx, WaitForRecordOptions,\n} from './types.js';\n\nconst PRIVATE_KEY_RE = /^0x[0-9a-fA-F]{64}$/;\nconst BPS_DENOM = 10000n;\n\nfunction readAmount(amount: bigint | string): bigint {\n return typeof amount === 'bigint' ? amount : BigInt(amount);\n}\n\nexport class Divy {\n readonly mode: DivyMode;\n readonly apiUrl: string;\n\n private readonly apiKey?: string;\n private readonly account?: ReturnType<typeof privateKeyToAccount>;\n // viem's client generics resist a clean stored type across the three constructor branches;\n // both are only ever touched through sendLocal(), which fixes the call shape in one place.\n private readonly wallet?: any;\n private readonly pub?: any;\n private readonly chain?: ReturnType<typeof defineDivyChain>;\n\n constructor(options: CreateDivyOptions) {\n const hasPrivateKey = 'privateKey' in options && options.privateKey !== undefined;\n const hasApiKey = 'apiKey' in options && options.apiKey !== undefined;\n if (hasPrivateKey && hasApiKey) {\n throw new Error('pass either privateKey or apiKey to createDivy, not both');\n }\n\n this.apiUrl = options.apiUrl ?? addresses.apiUrl;\n\n if (hasPrivateKey) {\n const { privateKey, rpcUrl } = options as { privateKey: Hex; rpcUrl?: string };\n if (!PRIVATE_KEY_RE.test(privateKey)) {\n throw new Error('privateKey must be a 0x-prefixed 32-byte hex string');\n }\n this.mode = 'self-custody';\n this.account = privateKeyToAccount(privateKey);\n this.chain = defineDivyChain(rpcUrl ?? addresses.rpcUrl);\n const transport = http(rpcUrl ?? addresses.rpcUrl);\n this.wallet = createWalletClient({ account: this.account, chain: this.chain, transport });\n this.pub = createPublicClient({ chain: this.chain, transport });\n } else if (hasApiKey) {\n const { apiKey } = options as { apiKey: string };\n if (typeof apiKey !== 'string' || apiKey.length === 0) {\n throw new Error('apiKey must be a non-empty string');\n }\n this.mode = 'hosted';\n this.apiKey = apiKey;\n } else {\n this.mode = 'read-only';\n }\n }\n\n private requireSigner(action: string): void {\n if (this.mode === 'read-only') {\n throw new Error(`${action} requires a privateKey (self-custody) or apiKey (hosted) — this client is read-only`);\n }\n }\n\n private async sendLocal(tx: Tx) {\n if (!this.wallet || !this.pub || !this.account) throw new Error('self-custody wallet is not configured');\n const hash = await this.wallet.sendTransaction({\n account: this.account, chain: this.chain, to: tx.to, data: tx.data, value: tx.value,\n });\n const receipt = await this.pub.waitForTransactionReceipt({ hash });\n if (receipt.status !== 'success') throw new Error(`transaction reverted on-chain: ${hash}`);\n return receipt;\n }\n\n async buildTx<T = Record<string, unknown>>(path: string, body?: object): Promise<T> {\n return apiRequest<T>(this.apiUrl, path, { body: body ?? {} });\n }\n\n async info(): Promise<InfoResult> {\n return parseInfo(await apiRequest(this.apiUrl, '/'));\n }\n\n async agent(address?: Address): Promise<AgentRecord> {\n if (!address) {\n if (this.mode === 'hosted') {\n return parseAgentRecord(await apiRequest(this.apiUrl, '/me', { apiKey: this.apiKey }));\n }\n if (this.mode === 'self-custody' && this.account) {\n address = this.account.address;\n } else {\n throw new Error('agent() requires an address in read-only mode');\n }\n }\n return parseAgentRecord(await apiRequest(this.apiUrl, `/agents/${address}`));\n }\n\n async leaderboard(): Promise<LeaderboardEntry[]> {\n return parseLeaderboard(await apiRequest(this.apiUrl, '/leaderboard'));\n }\n\n async launches(options: { limit?: number } = {}): Promise<LaunchListItem[]> {\n const qs = options.limit ? `?limit=${options.limit}` : '';\n return parseLaunches(await apiRequest(this.apiUrl, `/launches${qs}`));\n }\n\n async health(): Promise<HealthResult> {\n return parseHealth(await apiRequest(this.apiUrl, '/health'));\n }\n\n // Creates a fresh hosted wallet on the API. Needs no credential, so an agent can bootstrap\n // itself from a read-only client, then continue with createDivy({ apiKey }).\n async createHostedAgent(params: CreateHostedAgentParams = {}): Promise<CreateHostedAgentResult> {\n const body: Record<string, unknown> = {};\n if (params.payout) body.payout = params.payout;\n if (params.label) body.label = params.label;\n return apiRequest<CreateHostedAgentResult>(this.apiUrl, '/agents', { body });\n }\n\n async register(): Promise<RegisterResult> {\n this.requireSigner('register');\n\n if (this.mode === 'hosted') {\n const me = await apiRequest<{ registered: boolean; split: Address | null }>(this.apiUrl, '/me', { apiKey: this.apiKey });\n if (me.registered) return { registered: true, split: me.split };\n return { registered: false, split: null };\n }\n\n const address = this.account!.address;\n const first = await apiRequest<{ registered: boolean; split: Address; tx?: Tx }>(this.apiUrl, '/agents', {\n body: { address },\n });\n if (first.registered) return { registered: true, split: first.split };\n\n const receipt = await this.sendLocal({ to: first.tx!.to, data: first.tx!.data, value: BigInt(first.tx!.value ?? 0) });\n const after = await apiRequest<{ registered: boolean; split: Address }>(this.apiUrl, '/agents', { body: { address } });\n return { registered: after.registered, split: after.split, txHash: receipt.transactionHash };\n }\n\n async quote(params: QuoteParams): Promise<QuoteResult> {\n let recipient = params.recipient;\n if (!recipient && this.mode === 'self-custody' && this.account) recipient = this.account.address;\n return parseQuote(\n await apiRequest(this.apiUrl, '/quote', {\n body: {\n curve: params.curve, token: params.token, side: params.side,\n amount: readAmount(params.amount).toString(), recipient: recipient ?? zeroAddress,\n },\n }),\n );\n }\n\n async launch(params: LaunchParams): Promise<LaunchResult> {\n this.requireSigner('launch');\n\n if (this.mode === 'hosted') {\n const out = await apiRequest<{ token: Address; curve: Address; txHash: Hex }>(this.apiUrl, '/launch', {\n apiKey: this.apiKey, body: params,\n });\n return { token: out.token, curve: out.curve, txHash: out.txHash };\n }\n\n const address = this.account!.address;\n const built = await apiRequest<{ tx: Tx }>(this.apiUrl, '/launch', { body: { ...params, agent: address } });\n const receipt = await this.sendLocal(built.tx);\n\n let launched: { token: Address; curve: Address } | undefined;\n for (const log of receipt.logs) {\n try {\n const ev = decodeEventLog({ abi: factoryTokenLaunchedAbi, data: log.data, topics: log.topics });\n if (ev.eventName === 'TokenLaunched') { launched = ev.args as { token: Address; curve: Address }; break; }\n } catch { /* not a TokenLaunched log */ }\n }\n if (!launched) throw new Error(`launch mined (${receipt.transactionHash}) but no TokenLaunched event was found`);\n\n const result: LaunchResult = { token: launched.token, curve: launched.curve, txHash: receipt.transactionHash };\n try {\n const recorded = await this.record(launched.token);\n result.recordTxHash = recorded.txHash;\n } catch (e) {\n result.recordError = e instanceof Error ? e.message : String(e);\n }\n return result;\n }\n\n async record(token: Address): Promise<RecordResult> {\n if (this.mode !== 'self-custody') {\n throw new Error(\n 'record() requires self-custody (a privateKey): hosted and read-only launches are recorded '\n + 'automatically by Divy\\'s keeper within about a minute — use waitForRecord() to wait for it',\n );\n }\n const built = await apiRequest<{ tx: Tx }>(this.apiUrl, '/record', { body: { token } });\n const receipt = await this.sendLocal(built.tx);\n return { txHash: receipt.transactionHash };\n }\n\n async buy(params: BuyParams): Promise<TradeResult> {\n return this.trade('buy', readAmount(params.amountWei), params);\n }\n\n async sell(params: SellParams): Promise<TradeResult> {\n return this.trade('sell', readAmount(params.amountTokens), params);\n }\n\n private async trade(side: 'buy' | 'sell', amount: bigint, params: BuyParams | SellParams): Promise<TradeResult> {\n this.requireSigner(side);\n const slippageBps = params.slippageBps ?? 100;\n\n if (this.mode === 'hosted') {\n if (slippageBps !== 100) {\n throw new Error('slippageBps is not configurable in hosted mode: /trade hardcodes a 1% (100bps) slippage floor');\n }\n const out = await apiRequest<{ txHash: Hex; amountOut: string }>(this.apiUrl, '/trade', {\n apiKey: this.apiKey, body: { curve: params.curve, token: params.token, side, amount: amount.toString() },\n });\n return { txHash: out.txHash, amountOut: BigInt(out.amountOut) };\n }\n\n const address = this.account!.address;\n const q = await this.quote({ curve: params.curve, token: params.token, side, amount, recipient: address });\n\n let tradeTx = q.tx;\n if (slippageBps !== 100) {\n const minOut = (q.amountOut * (BPS_DENOM - BigInt(slippageBps))) / BPS_DENOM;\n const data = encodeFunctionData({ abi: curveAbi, functionName: side, args: [q.amountIn, minOut, address] });\n tradeTx = { ...q.tx, data };\n }\n\n if (q.approveTx) await this.sendLocal(q.approveTx);\n const receipt = await this.sendLocal(tradeTx);\n return { txHash: receipt.transactionHash, amountOut: q.amountOut };\n }\n\n async harvest(): Promise<HarvestResult> {\n this.requireSigner('harvest');\n\n if (this.mode === 'hosted') {\n const out = await apiRequest<{ txHash: Hex }>(this.apiUrl, '/harvest', { apiKey: this.apiKey, body: {} });\n return { txHash: out.txHash };\n }\n\n const address = this.account!.address;\n const built = await apiRequest<{ tx: Tx }>(this.apiUrl, '/harvest', { body: { agent: address } });\n const receipt = await this.sendLocal(built.tx);\n return { txHash: receipt.transactionHash };\n }\n\n async waitForRecord(token: Address, options: WaitForRecordOptions = {}): Promise<LaunchListItem> {\n const timeoutMs = options.timeoutMs ?? 60_000;\n const intervalMs = options.intervalMs ?? 3_000;\n const deadline = Date.now() + timeoutMs;\n const wanted = token.toLowerCase();\n\n for (;;) {\n const rows = await this.launches({ limit: 200 });\n const row = rows.find((r) => r.token.toLowerCase() === wanted);\n if (row?.recorded) return row;\n if (Date.now() >= deadline) {\n throw new DivyError(`timed out waiting for ${token} to be recorded`, 408);\n }\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n }\n }\n}\n\nexport function createDivy(options: CreateDivyOptions = {}): Divy {\n return new Divy(options);\n}\n","import { defineChain } from 'viem';\nimport type { Address } from 'viem';\n\nexport const CHAIN_ID = 4663;\nexport const DEFAULT_RPC_URL = 'https://rpc.mainnet.chain.robinhood.com';\nexport const DEFAULT_API_URL = 'https://divy-api-j8di.onrender.com';\nexport const EXPLORER_URL = 'https://robinhoodchain.blockscout.com';\n\nexport const addresses = {\n chainId: CHAIN_ID,\n registry: '0x0fEf638d8C88e6eD38eDcD9aB21BF39D083c8B1b' as Address,\n factory: '0x7eD598BcEf8bd9Edd8C97A195C6d13f40801EC7e' as Address,\n escrow: '0xd3AFEB2a57f70eF218Aa82451c51B2fb0416Ac9e' as Address,\n rpcUrl: DEFAULT_RPC_URL,\n apiUrl: DEFAULT_API_URL,\n explorerUrl: EXPLORER_URL,\n} as const;\n\nexport function defineDivyChain(rpcUrl: string = DEFAULT_RPC_URL) {\n return defineChain({\n id: CHAIN_ID,\n name: 'robinhood-chain',\n nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n rpcUrls: { default: { http: [rpcUrl] } },\n blockExplorers: { default: { name: 'Blockscout', url: EXPLORER_URL } },\n });\n}\n\nexport function explorerTx(hash: string): string {\n return `${EXPLORER_URL}/tx/${hash}`;\n}\n\nexport function explorerAddress(address: string): string {\n return `${EXPLORER_URL}/address/${address}`;\n}\n","// Minimal ABIs: the API returns pre-encoded {to, data, value} for every write, so the SDK\n// only needs to encode locally when overriding the API's default 1% slippage floor, and to\n// decode the TokenLaunched event off a launch receipt.\n\nexport const curveAbi = [\n {\n type: 'function',\n name: 'buy',\n stateMutability: 'payable',\n inputs: [\n { name: 'quoteIn', type: 'uint256' },\n { name: 'minTokensOut', type: 'uint256' },\n { name: 'recipient', type: 'address' },\n ],\n outputs: [{ name: 'tokensOut', type: 'uint256' }],\n },\n {\n type: 'function',\n name: 'sell',\n stateMutability: 'nonpayable',\n inputs: [\n { name: 'tokensIn', type: 'uint256' },\n { name: 'minQuoteOut', type: 'uint256' },\n { name: 'recipient', type: 'address' },\n ],\n outputs: [{ name: 'quoteOut', type: 'uint256' }],\n },\n] as const;\n\nexport const factoryTokenLaunchedAbi = [\n {\n type: 'event',\n name: 'TokenLaunched',\n inputs: [\n { indexed: true, name: 'token', type: 'address' },\n { indexed: true, name: 'curve', type: 'address' },\n { indexed: true, name: 'deployer', type: 'address' },\n { indexed: false, name: 'pairToken', type: 'address' },\n { indexed: false, name: 'launchConfigId', type: 'uint256' },\n { indexed: false, name: 'graduationThreshold', type: 'uint256' },\n ],\n },\n] as const;\n","export class DivyError extends Error {\n readonly status: number;\n\n constructor(message: string, status: number) {\n super(message);\n this.name = 'DivyError';\n this.status = status;\n }\n}\n","import { DivyError } from './errors.js';\n\nconst stringify = (body: unknown): string =>\n JSON.stringify(body, (_key, value) => (typeof value === 'bigint' ? value.toString() : value));\n\nexport interface RequestOptions {\n method?: 'GET' | 'POST' | 'PATCH';\n body?: unknown;\n apiKey?: string;\n}\n\nexport async function apiRequest<T = unknown>(apiUrl: string, path: string, options: RequestOptions = {}): Promise<T> {\n const headers: Record<string, string> = {};\n if (options.body !== undefined) headers['content-type'] = 'application/json';\n if (options.apiKey) headers.authorization = `Bearer ${options.apiKey}`;\n\n const res = await fetch(`${apiUrl}${path}`, {\n method: options.method ?? (options.body !== undefined ? 'POST' : 'GET'),\n headers,\n body: options.body !== undefined ? stringify(options.body) : undefined,\n });\n\n const text = await res.text();\n let json: any;\n try {\n json = text ? JSON.parse(text) : {};\n } catch {\n // A gateway or proxy in front of the API (Render, Cloudflare, ...) can return an HTML\n // error page instead of JSON, typically on a 502/504 while the API is cold-starting or down.\n throw new DivyError(`${apiUrl} returned a non-JSON response (HTTP ${res.status} ${res.statusText}): the API may be down or restarting`, res.status);\n }\n if (!res.ok) {\n throw new DivyError(typeof json.error === 'string' ? json.error : res.statusText, res.status);\n }\n return json as T;\n}\n","import type {\n AgentLaunch, AgentRecord, HealthResult, InfoResult, LaunchListItem, LeaderboardEntry, QuoteResult, Tx,\n} from './types.js';\n\nconst big = (v: unknown): bigint => BigInt(v as string);\nconst bigOrNull = (v: unknown): bigint | null => (v === null || v === undefined ? null : big(v));\n\nexport function parseInfo(j: any): InfoResult {\n return {\n chain: j.chain,\n registry: j.registry,\n factory: j.factory,\n escrow: j.escrow,\n hostedWallets: j.hostedWallets,\n feePolicy: {\n treasury: j.feePolicy.treasury,\n divyBps: j.feePolicy.divyBps === null || j.feePolicy.divyBps === undefined ? null : Number(j.feePolicy.divyBps),\n agentShareOfBaseFee: j.feePolicy.agentShareOfBaseFee,\n ponsShare: j.feePolicy.ponsShare,\n divyShare: j.feePolicy.divyShare,\n },\n launchFee: { wei: big(j.launchFee.wei), eth: j.launchFee.eth },\n maxCreatorTaxBps: j.maxCreatorTaxBps,\n economics: j.economics,\n indexedBlock: bigOrNull(j.indexedBlock),\n keeper: j.keeper,\n };\n}\n\nfunction parseAgentLaunch(l: any): AgentLaunch {\n return {\n token: l.token,\n symbol: l.symbol,\n name: l.name,\n curve: l.curve,\n pairToken: l.pairToken,\n graduated: l.graduated,\n launchedAt: l.launchedAt,\n recorded: l.recorded,\n retention: l.retention ?? null, retentionProvisional: l.retentionProvisional ?? false,\n earlyHolders: l.earlyHolders ?? null, retained: l.retained ?? null,\n };\n}\n\nexport function parseAgentRecord(j: any): AgentRecord {\n return {\n agent: j.agent,\n split: j.split,\n registered: j.registered,\n record: { launches: big(j.record.launches), graduated: big(j.record.graduated), score: j.record.score, graduationRate: j.record.graduationRate ?? j.record.score },\n fees: { agentEth: big(j.fees.agentEth), divyEth: big(j.fees.divyEth), pendingEscrowEth: big(j.fees.pendingEscrowEth) },\n launches: j.launches.map(parseAgentLaunch),\n ...(j.balanceEth !== undefined ? { balanceEth: j.balanceEth } : {}),\n ...(j.payout !== undefined ? { payout: j.payout } : {}),\n ...(j.label !== undefined ? { label: j.label } : {}),\n };\n}\n\nexport function parseLeaderboard(j: any[]): LeaderboardEntry[] {\n return j.map((r) => ({\n agent: r.agent, launches: r.launches, graduated: r.graduated, score: r.score,\n graduationRate: r.graduationRate ?? r.score, retention: r.retention ?? null,\n retentionProvisional: r.retentionProvisional ?? false, feesEth: big(r.feesEth),\n }));\n}\n\nexport function parseLaunches(j: any[]): LaunchListItem[] {\n return j.map((r) => ({\n token: r.token, agent: r.agent, split: r.split, curve: r.curve, pairToken: r.pairToken,\n name: r.name, symbol: r.symbol, launchedBlock: r.launchedBlock, launchedAt: r.launchedAt,\n recorded: r.recorded, graduated: r.graduated,\n retention: r.retention ?? null, retentionProvisional: r.retentionProvisional ?? false,\n earlyHolders: r.earlyHolders ?? null, retained: r.retained ?? null,\n }));\n}\n\nexport function parseHealth(j: any): HealthResult {\n return { ok: j.ok, indexedBlock: bigOrNull(j.indexedBlock), head: big(j.head), lag: bigOrNull(j.lag) };\n}\n\nfunction parseTx(t: any): Tx {\n return { to: t.to, data: t.data, value: big(t.value) };\n}\n\nexport function parseQuote(j: any): QuoteResult {\n return {\n curve: j.curve,\n amountIn: big(j.amountIn),\n amountOut: big(j.amountOut),\n minOut: big(j.minOut),\n feeBps: j.feeBps,\n creatorTaxBps: j.creatorTaxBps,\n snipeTaxBps: j.snipeTaxBps,\n tx: parseTx(j.tx),\n approveTx: j.approveTx ? parseTx(j.approveTx) : null,\n };\n}\n"],"mappings":"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","names":["import_viem"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/client.ts","../src/chain.ts","../src/abi.ts","../src/errors.ts","../src/http.ts","../src/parse.ts"],"sourcesContent":["export { createDivy, Divy } from './client.js';\nexport { DivyError } from './errors.js';\nexport { addresses, defineDivyChain, explorerAddress, explorerTx, CHAIN_ID, DEFAULT_API_URL, DEFAULT_RPC_URL } from './chain.js';\nexport type {\n Address, Hex, Tx,\n CreateDivyOptions, CreateDivySelfCustody, CreateDivyHosted, CreateDivyReadOnly, DivyMode,\n CreateHostedAgentParams, CreateHostedAgentResult,\n InfoResult, FeePolicy, AgentRecord, AgentLaunch, LeaderboardEntry, LaunchListItem, HealthResult,\n QuoteParams, QuoteResult, RegisterResult, LaunchParams, LaunchResult, RecordResult,\n TradeParams, BuyParams, SellParams, TradeResult, HarvestResult, WaitForRecordOptions,\n} from './types.js';\n","import {\n createPublicClient, createWalletClient, http, encodeFunctionData, decodeEventLog, zeroAddress,\n} from 'viem';\nimport type { Address, Hex } from 'viem';\nimport { privateKeyToAccount } from 'viem/accounts';\nimport { addresses, defineDivyChain } from './chain.js';\nimport { curveAbi, factoryTokenLaunchedAbi } from './abi.js';\nimport { DivyError } from './errors.js';\nimport { apiRequest } from './http.js';\nimport {\n parseAgentRecord, parseHealth, parseInfo, parseLaunches, parseLeaderboard, parseQuote,\n} from './parse.js';\nimport type {\n AgentRecord, BuyParams, CreateDivyOptions, CreateHostedAgentParams, CreateHostedAgentResult, DivyMode, HarvestResult, HealthResult, InfoResult,\n LaunchListItem, LaunchParams, LaunchResult, LeaderboardEntry, QuoteParams, QuoteResult, RecordResult,\n RegisterResult, SellParams, TradeResult, Tx, WaitForRecordOptions,\n} from './types.js';\n\nconst PRIVATE_KEY_RE = /^0x[0-9a-fA-F]{64}$/;\nconst BPS_DENOM = 10000n;\n\nfunction readAmount(amount: bigint | string): bigint {\n return typeof amount === 'bigint' ? amount : BigInt(amount);\n}\n\nexport class Divy {\n readonly mode: DivyMode;\n readonly apiUrl: string;\n\n private readonly apiKey?: string;\n private readonly account?: ReturnType<typeof privateKeyToAccount>;\n // viem's client generics resist a clean stored type across the three constructor branches;\n // both are only ever touched through sendLocal(), which fixes the call shape in one place.\n private readonly wallet?: any;\n private readonly pub?: any;\n private readonly chain?: ReturnType<typeof defineDivyChain>;\n\n constructor(options: CreateDivyOptions) {\n const hasPrivateKey = 'privateKey' in options && options.privateKey !== undefined;\n const hasApiKey = 'apiKey' in options && options.apiKey !== undefined;\n if (hasPrivateKey && hasApiKey) {\n throw new Error('pass either privateKey or apiKey to createDivy, not both');\n }\n\n this.apiUrl = options.apiUrl ?? addresses.apiUrl;\n\n if (hasPrivateKey) {\n const { privateKey, rpcUrl } = options as { privateKey: Hex; rpcUrl?: string };\n if (!PRIVATE_KEY_RE.test(privateKey)) {\n throw new Error('privateKey must be a 0x-prefixed 32-byte hex string');\n }\n this.mode = 'self-custody';\n this.account = privateKeyToAccount(privateKey);\n this.chain = defineDivyChain(rpcUrl ?? addresses.rpcUrl);\n const transport = http(rpcUrl ?? addresses.rpcUrl);\n this.wallet = createWalletClient({ account: this.account, chain: this.chain, transport });\n this.pub = createPublicClient({ chain: this.chain, transport });\n } else if (hasApiKey) {\n const { apiKey } = options as { apiKey: string };\n if (typeof apiKey !== 'string' || apiKey.length === 0) {\n throw new Error('apiKey must be a non-empty string');\n }\n this.mode = 'hosted';\n this.apiKey = apiKey;\n } else {\n this.mode = 'read-only';\n }\n }\n\n private requireSigner(action: string): void {\n if (this.mode === 'read-only') {\n throw new Error(`${action} requires a privateKey (self-custody) or apiKey (hosted) — this client is read-only`);\n }\n }\n\n private async sendLocal(tx: Tx) {\n if (!this.wallet || !this.pub || !this.account) throw new Error('self-custody wallet is not configured');\n const hash = await this.wallet.sendTransaction({\n account: this.account, chain: this.chain, to: tx.to, data: tx.data, value: tx.value,\n });\n const receipt = await this.pub.waitForTransactionReceipt({ hash });\n if (receipt.status !== 'success') throw new Error(`transaction reverted on-chain: ${hash}`);\n return receipt;\n }\n\n async buildTx<T = Record<string, unknown>>(path: string, body?: object): Promise<T> {\n return apiRequest<T>(this.apiUrl, path, { body: body ?? {} });\n }\n\n async info(): Promise<InfoResult> {\n return parseInfo(await apiRequest(this.apiUrl, '/'));\n }\n\n async agent(address?: Address): Promise<AgentRecord> {\n if (!address) {\n if (this.mode === 'hosted') {\n return parseAgentRecord(await apiRequest(this.apiUrl, '/me', { apiKey: this.apiKey }));\n }\n if (this.mode === 'self-custody' && this.account) {\n address = this.account.address;\n } else {\n throw new Error('agent() requires an address in read-only mode');\n }\n }\n return parseAgentRecord(await apiRequest(this.apiUrl, `/agents/${address}`));\n }\n\n async leaderboard(): Promise<LeaderboardEntry[]> {\n return parseLeaderboard(await apiRequest(this.apiUrl, '/leaderboard'));\n }\n\n async launches(options: { limit?: number } = {}): Promise<LaunchListItem[]> {\n const qs = options.limit ? `?limit=${options.limit}` : '';\n return parseLaunches(await apiRequest(this.apiUrl, `/launches${qs}`));\n }\n\n async health(): Promise<HealthResult> {\n return parseHealth(await apiRequest(this.apiUrl, '/health'));\n }\n\n // Creates a fresh hosted wallet on the API. Needs no credential, so an agent can bootstrap\n // itself from a read-only client, then continue with createDivy({ apiKey }).\n async createHostedAgent(params: CreateHostedAgentParams = {}): Promise<CreateHostedAgentResult> {\n const body: Record<string, unknown> = {};\n if (params.payout) body.payout = params.payout;\n if (params.label) body.label = params.label;\n return apiRequest<CreateHostedAgentResult>(this.apiUrl, '/agents', { body });\n }\n\n async register(): Promise<RegisterResult> {\n this.requireSigner('register');\n\n if (this.mode === 'hosted') {\n const me = await apiRequest<{ registered: boolean; split: Address | null }>(this.apiUrl, '/me', { apiKey: this.apiKey });\n if (me.registered) return { registered: true, split: me.split };\n return { registered: false, split: null };\n }\n\n const address = this.account!.address;\n const first = await apiRequest<{ registered: boolean; split: Address; tx?: Tx }>(this.apiUrl, '/agents', {\n body: { address },\n });\n if (first.registered) return { registered: true, split: first.split };\n\n const receipt = await this.sendLocal({ to: first.tx!.to, data: first.tx!.data, value: BigInt(first.tx!.value ?? 0) });\n const after = await apiRequest<{ registered: boolean; split: Address }>(this.apiUrl, '/agents', { body: { address } });\n return { registered: after.registered, split: after.split, txHash: receipt.transactionHash };\n }\n\n async quote(params: QuoteParams): Promise<QuoteResult> {\n let recipient = params.recipient;\n if (!recipient && this.mode === 'self-custody' && this.account) recipient = this.account.address;\n return parseQuote(\n await apiRequest(this.apiUrl, '/quote', {\n body: {\n curve: params.curve, token: params.token, side: params.side,\n amount: readAmount(params.amount).toString(), recipient: recipient ?? zeroAddress,\n },\n }),\n );\n }\n\n async launch(params: LaunchParams): Promise<LaunchResult> {\n this.requireSigner('launch');\n\n if (this.mode === 'hosted') {\n const out = await apiRequest<{ token: Address; curve: Address; txHash: Hex }>(this.apiUrl, '/launch', {\n apiKey: this.apiKey, body: params,\n });\n return { token: out.token, curve: out.curve, txHash: out.txHash };\n }\n\n const address = this.account!.address;\n const built = await apiRequest<{ tx: Tx }>(this.apiUrl, '/launch', { body: { ...params, agent: address } });\n const receipt = await this.sendLocal(built.tx);\n\n let launched: { token: Address; curve: Address } | undefined;\n for (const log of receipt.logs) {\n try {\n const ev = decodeEventLog({ abi: factoryTokenLaunchedAbi, data: log.data, topics: log.topics });\n if (ev.eventName === 'TokenLaunched') { launched = ev.args as { token: Address; curve: Address }; break; }\n } catch { /* not a TokenLaunched log */ }\n }\n if (!launched) throw new Error(`launch mined (${receipt.transactionHash}) but no TokenLaunched event was found`);\n\n const result: LaunchResult = { token: launched.token, curve: launched.curve, txHash: receipt.transactionHash };\n try {\n const recorded = await this.record(launched.token);\n result.recordTxHash = recorded.txHash;\n } catch (e) {\n result.recordError = e instanceof Error ? e.message : String(e);\n }\n return result;\n }\n\n async record(token: Address): Promise<RecordResult> {\n if (this.mode !== 'self-custody') {\n throw new Error(\n 'record() requires self-custody (a privateKey): hosted and read-only launches are recorded '\n + 'automatically by Divy\\'s keeper within about a minute — use waitForRecord() to wait for it',\n );\n }\n const built = await apiRequest<{ tx: Tx }>(this.apiUrl, '/record', { body: { token } });\n const receipt = await this.sendLocal(built.tx);\n return { txHash: receipt.transactionHash };\n }\n\n async buy(params: BuyParams): Promise<TradeResult> {\n return this.trade('buy', readAmount(params.amountWei), params);\n }\n\n async sell(params: SellParams): Promise<TradeResult> {\n return this.trade('sell', readAmount(params.amountTokens), params);\n }\n\n private async trade(side: 'buy' | 'sell', amount: bigint, params: BuyParams | SellParams): Promise<TradeResult> {\n this.requireSigner(side);\n const slippageBps = params.slippageBps ?? 100;\n\n if (this.mode === 'hosted') {\n if (slippageBps !== 100) {\n throw new Error('slippageBps is not configurable in hosted mode: /trade hardcodes a 1% (100bps) slippage floor');\n }\n const out = await apiRequest<{ txHash: Hex; amountOut: string }>(this.apiUrl, '/trade', {\n apiKey: this.apiKey, body: { curve: params.curve, token: params.token, side, amount: amount.toString() },\n });\n return { txHash: out.txHash, amountOut: BigInt(out.amountOut) };\n }\n\n const address = this.account!.address;\n const q = await this.quote({ curve: params.curve, token: params.token, side, amount, recipient: address });\n\n let tradeTx = q.tx;\n if (slippageBps !== 100) {\n const minOut = (q.amountOut * (BPS_DENOM - BigInt(slippageBps))) / BPS_DENOM;\n const data = encodeFunctionData({ abi: curveAbi, functionName: side, args: [q.amountIn, minOut, address] });\n tradeTx = { ...q.tx, data };\n }\n\n if (q.approveTx) await this.sendLocal(q.approveTx);\n const receipt = await this.sendLocal(tradeTx);\n return { txHash: receipt.transactionHash, amountOut: q.amountOut };\n }\n\n async harvest(): Promise<HarvestResult> {\n this.requireSigner('harvest');\n\n if (this.mode === 'hosted') {\n const out = await apiRequest<{ txHash: Hex }>(this.apiUrl, '/harvest', { apiKey: this.apiKey, body: {} });\n return { txHash: out.txHash };\n }\n\n const address = this.account!.address;\n const built = await apiRequest<{ tx: Tx }>(this.apiUrl, '/harvest', { body: { agent: address } });\n const receipt = await this.sendLocal(built.tx);\n return { txHash: receipt.transactionHash };\n }\n\n // Own-wallet launches only: tell the API about a launch tx you mined yourself so the record\n // updates now instead of on the indexer's next pass.\n async confirmLaunch(txHash: Hex): Promise<{ token: Address; curve: Address; txHash: Hex; agent: Address | null; recorded: boolean }> {\n return apiRequest(this.apiUrl, '/launches/confirm', { body: { txHash } });\n }\n\n async waitForRecord(token: Address, options: WaitForRecordOptions = {}): Promise<LaunchListItem> {\n const timeoutMs = options.timeoutMs ?? 60_000;\n const intervalMs = options.intervalMs ?? 3_000;\n const deadline = Date.now() + timeoutMs;\n const wanted = token.toLowerCase();\n\n for (;;) {\n const rows = await this.launches({ limit: 200 });\n const row = rows.find((r) => r.token.toLowerCase() === wanted);\n if (row?.recorded) return row;\n if (Date.now() >= deadline) {\n throw new DivyError(`timed out waiting for ${token} to be recorded`, 408);\n }\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n }\n }\n}\n\nexport function createDivy(options: CreateDivyOptions = {}): Divy {\n return new Divy(options);\n}\n","import { defineChain } from 'viem';\nimport type { Address } from 'viem';\n\nexport const CHAIN_ID = 4663;\nexport const DEFAULT_RPC_URL = 'https://rpc.mainnet.chain.robinhood.com';\nexport const DEFAULT_API_URL = 'https://divy-api-j8di.onrender.com';\nexport const EXPLORER_URL = 'https://robinhoodchain.blockscout.com';\n\nexport const addresses = {\n chainId: CHAIN_ID,\n registry: '0x0fEf638d8C88e6eD38eDcD9aB21BF39D083c8B1b' as Address,\n factory: '0x7eD598BcEf8bd9Edd8C97A195C6d13f40801EC7e' as Address,\n escrow: '0xd3AFEB2a57f70eF218Aa82451c51B2fb0416Ac9e' as Address,\n rpcUrl: DEFAULT_RPC_URL,\n apiUrl: DEFAULT_API_URL,\n explorerUrl: EXPLORER_URL,\n} as const;\n\nexport function defineDivyChain(rpcUrl: string = DEFAULT_RPC_URL) {\n return defineChain({\n id: CHAIN_ID,\n name: 'robinhood-chain',\n nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n rpcUrls: { default: { http: [rpcUrl] } },\n blockExplorers: { default: { name: 'Blockscout', url: EXPLORER_URL } },\n });\n}\n\nexport function explorerTx(hash: string): string {\n return `${EXPLORER_URL}/tx/${hash}`;\n}\n\nexport function explorerAddress(address: string): string {\n return `${EXPLORER_URL}/address/${address}`;\n}\n","// Minimal ABIs: the API returns pre-encoded {to, data, value} for every write, so the SDK\n// only needs to encode locally when overriding the API's default 1% slippage floor, and to\n// decode the TokenLaunched event off a launch receipt.\n\nexport const curveAbi = [\n {\n type: 'function',\n name: 'buy',\n stateMutability: 'payable',\n inputs: [\n { name: 'quoteIn', type: 'uint256' },\n { name: 'minTokensOut', type: 'uint256' },\n { name: 'recipient', type: 'address' },\n ],\n outputs: [{ name: 'tokensOut', type: 'uint256' }],\n },\n {\n type: 'function',\n name: 'sell',\n stateMutability: 'nonpayable',\n inputs: [\n { name: 'tokensIn', type: 'uint256' },\n { name: 'minQuoteOut', type: 'uint256' },\n { name: 'recipient', type: 'address' },\n ],\n outputs: [{ name: 'quoteOut', type: 'uint256' }],\n },\n] as const;\n\nexport const factoryTokenLaunchedAbi = [\n {\n type: 'event',\n name: 'TokenLaunched',\n inputs: [\n { indexed: true, name: 'token', type: 'address' },\n { indexed: true, name: 'curve', type: 'address' },\n { indexed: true, name: 'deployer', type: 'address' },\n { indexed: false, name: 'pairToken', type: 'address' },\n { indexed: false, name: 'launchConfigId', type: 'uint256' },\n { indexed: false, name: 'graduationThreshold', type: 'uint256' },\n ],\n },\n] as const;\n","export class DivyError extends Error {\n readonly status: number;\n\n constructor(message: string, status: number) {\n super(message);\n this.name = 'DivyError';\n this.status = status;\n }\n}\n","import { DivyError } from './errors.js';\n\nconst stringify = (body: unknown): string =>\n JSON.stringify(body, (_key, value) => (typeof value === 'bigint' ? value.toString() : value));\n\nexport interface RequestOptions {\n method?: 'GET' | 'POST' | 'PATCH';\n body?: unknown;\n apiKey?: string;\n}\n\nexport async function apiRequest<T = unknown>(apiUrl: string, path: string, options: RequestOptions = {}): Promise<T> {\n const headers: Record<string, string> = {};\n if (options.body !== undefined) headers['content-type'] = 'application/json';\n if (options.apiKey) headers.authorization = `Bearer ${options.apiKey}`;\n\n const res = await fetch(`${apiUrl}${path}`, {\n method: options.method ?? (options.body !== undefined ? 'POST' : 'GET'),\n headers,\n body: options.body !== undefined ? stringify(options.body) : undefined,\n });\n\n const text = await res.text();\n let json: any;\n try {\n json = text ? JSON.parse(text) : {};\n } catch {\n // A gateway or proxy in front of the API (Render, Cloudflare, ...) can return an HTML\n // error page instead of JSON, typically on a 502/504 while the API is cold-starting or down.\n throw new DivyError(`${apiUrl} returned a non-JSON response (HTTP ${res.status} ${res.statusText}): the API may be down or restarting`, res.status);\n }\n if (!res.ok) {\n throw new DivyError(typeof json.error === 'string' ? json.error : res.statusText, res.status);\n }\n return json as T;\n}\n","import type {\n AgentLaunch, AgentRecord, HealthResult, InfoResult, LaunchListItem, LeaderboardEntry, QuoteResult, Tx,\n} from './types.js';\n\nconst big = (v: unknown): bigint => BigInt(v as string);\nconst bigOrNull = (v: unknown): bigint | null => (v === null || v === undefined ? null : big(v));\n\nexport function parseInfo(j: any): InfoResult {\n return {\n chain: j.chain,\n registry: j.registry,\n factory: j.factory,\n escrow: j.escrow,\n hostedWallets: j.hostedWallets,\n feePolicy: {\n treasury: j.feePolicy.treasury,\n divyBps: j.feePolicy.divyBps === null || j.feePolicy.divyBps === undefined ? null : Number(j.feePolicy.divyBps),\n agentShareOfBaseFee: j.feePolicy.agentShareOfBaseFee,\n ponsShare: j.feePolicy.ponsShare,\n divyShare: j.feePolicy.divyShare,\n },\n launchFee: { wei: big(j.launchFee.wei), eth: j.launchFee.eth },\n maxCreatorTaxBps: j.maxCreatorTaxBps,\n economics: j.economics,\n indexedBlock: bigOrNull(j.indexedBlock),\n keeper: j.keeper,\n };\n}\n\nfunction parseAgentLaunch(l: any): AgentLaunch {\n return {\n token: l.token,\n symbol: l.symbol,\n name: l.name,\n curve: l.curve,\n pairToken: l.pairToken,\n graduated: l.graduated,\n launchedAt: l.launchedAt,\n recorded: l.recorded,\n retention: l.retention ?? null, retentionProvisional: l.retentionProvisional ?? false, retentionPending: l.retentionPending ?? false,\n earlyHolders: l.earlyHolders ?? null, retained: l.retained ?? null,\n };\n}\n\nexport function parseAgentRecord(j: any): AgentRecord {\n return {\n agent: j.agent,\n split: j.split,\n registered: j.registered,\n record: { launches: big(j.record.launches), graduated: big(j.record.graduated), score: j.record.score, graduationRate: j.record.graduationRate ?? j.record.score },\n fees: { agentEth: big(j.fees.agentEth), divyEth: big(j.fees.divyEth), pendingEscrowEth: big(j.fees.pendingEscrowEth) },\n launches: j.launches.map(parseAgentLaunch),\n ...(j.balanceEth !== undefined ? { balanceEth: j.balanceEth } : {}),\n ...(j.payout !== undefined ? { payout: j.payout } : {}),\n ...(j.label !== undefined ? { label: j.label } : {}),\n };\n}\n\nexport function parseLeaderboard(j: any[]): LeaderboardEntry[] {\n return j.map((r) => ({\n agent: r.agent, launches: r.launches, graduated: r.graduated, score: r.score,\n graduationRate: r.graduationRate ?? r.score, retention: r.retention ?? null,\n retentionProvisional: r.retentionProvisional ?? false, feesEth: big(r.feesEth),\n }));\n}\n\nexport function parseLaunches(j: any[]): LaunchListItem[] {\n return j.map((r) => ({\n token: r.token, agent: r.agent, split: r.split, curve: r.curve, pairToken: r.pairToken,\n name: r.name, symbol: r.symbol, launchedBlock: r.launchedBlock, launchedAt: r.launchedAt,\n recorded: r.recorded, graduated: r.graduated,\n retention: r.retention ?? null, retentionProvisional: r.retentionProvisional ?? false, retentionPending: r.retentionPending ?? false,\n earlyHolders: r.earlyHolders ?? null, retained: r.retained ?? null,\n }));\n}\n\nexport function parseHealth(j: any): HealthResult {\n const k = j.keeper ?? {};\n return {\n ok: j.ok, rpc: j.rpc ?? true,\n indexedBlock: bigOrNull(j.indexedBlock), head: bigOrNull(j.head), lag: bigOrNull(j.lag),\n keeper: {\n address: k.address ?? null, enabled: !!k.enabled, balanceWei: bigOrNull(k.balanceWei), low: !!k.low,\n spent24hWei: big(k.spent24hWei ?? '0'), dailyBudgetWei: big(k.dailyBudgetWei ?? '0'), lastTickAt: k.lastTickAt ?? null,\n },\n warnings: Array.isArray(j.warnings) ? j.warnings : [],\n };\n}\n\nfunction parseTx(t: any): Tx {\n return { to: t.to, data: t.data, value: big(t.value) };\n}\n\nexport function parseQuote(j: any): QuoteResult {\n return {\n curve: j.curve,\n amountIn: big(j.amountIn),\n amountOut: big(j.amountOut),\n minOut: big(j.minOut),\n feeBps: j.feeBps,\n creatorTaxBps: j.creatorTaxBps,\n snipeTaxBps: j.snipeTaxBps,\n tx: parseTx(j.tx),\n approveTx: j.approveTx ? parseTx(j.approveTx) : null,\n };\n}\n"],"mappings":"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","names":["import_viem"]}
package/dist/index.d.cts CHANGED
@@ -77,6 +77,8 @@ interface AgentLaunch {
77
77
  retention: number | null;
78
78
  /** True while measured against the chain head because the launch is younger than 30 days. */
79
79
  retentionProvisional: boolean;
80
+ /** Older than a day with no measurement yet; weighs zero in the record until measured. */
81
+ retentionPending: boolean;
80
82
  earlyHolders: number | null;
81
83
  retained: number | null;
82
84
  }
@@ -130,14 +132,28 @@ interface LaunchListItem {
130
132
  retention: number | null;
131
133
  /** True while measured against the chain head because the launch is younger than 30 days. */
132
134
  retentionProvisional: boolean;
135
+ /** Older than a day with no measurement yet; weighs zero in the record until measured. */
136
+ retentionPending: boolean;
133
137
  earlyHolders: number | null;
134
138
  retained: number | null;
135
139
  }
136
140
  interface HealthResult {
141
+ /** False whenever warnings is non-empty. The endpoint itself always answers 200 once the process is up. */
137
142
  ok: boolean;
143
+ rpc: boolean;
138
144
  indexedBlock: bigint | null;
139
- head: bigint;
145
+ head: bigint | null;
140
146
  lag: bigint | null;
147
+ keeper: {
148
+ address: Address | null;
149
+ enabled: boolean;
150
+ balanceWei: bigint | null;
151
+ low: boolean;
152
+ spent24hWei: bigint;
153
+ dailyBudgetWei: bigint;
154
+ lastTickAt: number | null;
155
+ };
156
+ warnings: string[];
141
157
  }
142
158
  interface QuoteParams {
143
159
  curve?: Address;
@@ -242,6 +258,13 @@ declare class Divy {
242
258
  sell(params: SellParams): Promise<TradeResult>;
243
259
  private trade;
244
260
  harvest(): Promise<HarvestResult>;
261
+ confirmLaunch(txHash: Hex): Promise<{
262
+ token: Address;
263
+ curve: Address;
264
+ txHash: Hex;
265
+ agent: Address | null;
266
+ recorded: boolean;
267
+ }>;
245
268
  waitForRecord(token: Address, options?: WaitForRecordOptions): Promise<LaunchListItem>;
246
269
  }
247
270
  declare function createDivy(options?: CreateDivyOptions): Divy;
package/dist/index.d.ts CHANGED
@@ -77,6 +77,8 @@ interface AgentLaunch {
77
77
  retention: number | null;
78
78
  /** True while measured against the chain head because the launch is younger than 30 days. */
79
79
  retentionProvisional: boolean;
80
+ /** Older than a day with no measurement yet; weighs zero in the record until measured. */
81
+ retentionPending: boolean;
80
82
  earlyHolders: number | null;
81
83
  retained: number | null;
82
84
  }
@@ -130,14 +132,28 @@ interface LaunchListItem {
130
132
  retention: number | null;
131
133
  /** True while measured against the chain head because the launch is younger than 30 days. */
132
134
  retentionProvisional: boolean;
135
+ /** Older than a day with no measurement yet; weighs zero in the record until measured. */
136
+ retentionPending: boolean;
133
137
  earlyHolders: number | null;
134
138
  retained: number | null;
135
139
  }
136
140
  interface HealthResult {
141
+ /** False whenever warnings is non-empty. The endpoint itself always answers 200 once the process is up. */
137
142
  ok: boolean;
143
+ rpc: boolean;
138
144
  indexedBlock: bigint | null;
139
- head: bigint;
145
+ head: bigint | null;
140
146
  lag: bigint | null;
147
+ keeper: {
148
+ address: Address | null;
149
+ enabled: boolean;
150
+ balanceWei: bigint | null;
151
+ low: boolean;
152
+ spent24hWei: bigint;
153
+ dailyBudgetWei: bigint;
154
+ lastTickAt: number | null;
155
+ };
156
+ warnings: string[];
141
157
  }
142
158
  interface QuoteParams {
143
159
  curve?: Address;
@@ -242,6 +258,13 @@ declare class Divy {
242
258
  sell(params: SellParams): Promise<TradeResult>;
243
259
  private trade;
244
260
  harvest(): Promise<HarvestResult>;
261
+ confirmLaunch(txHash: Hex): Promise<{
262
+ token: Address;
263
+ curve: Address;
264
+ txHash: Hex;
265
+ agent: Address | null;
266
+ recorded: boolean;
267
+ }>;
245
268
  waitForRecord(token: Address, options?: WaitForRecordOptions): Promise<LaunchListItem>;
246
269
  }
247
270
  declare function createDivy(options?: CreateDivyOptions): Divy;
package/dist/index.js CHANGED
@@ -150,6 +150,7 @@ function parseAgentLaunch(l) {
150
150
  recorded: l.recorded,
151
151
  retention: l.retention ?? null,
152
152
  retentionProvisional: l.retentionProvisional ?? false,
153
+ retentionPending: l.retentionPending ?? false,
153
154
  earlyHolders: l.earlyHolders ?? null,
154
155
  retained: l.retained ?? null
155
156
  };
@@ -194,12 +195,30 @@ function parseLaunches(j) {
194
195
  graduated: r.graduated,
195
196
  retention: r.retention ?? null,
196
197
  retentionProvisional: r.retentionProvisional ?? false,
198
+ retentionPending: r.retentionPending ?? false,
197
199
  earlyHolders: r.earlyHolders ?? null,
198
200
  retained: r.retained ?? null
199
201
  }));
200
202
  }
201
203
  function parseHealth(j) {
202
- return { ok: j.ok, indexedBlock: bigOrNull(j.indexedBlock), head: big(j.head), lag: bigOrNull(j.lag) };
204
+ const k = j.keeper ?? {};
205
+ return {
206
+ ok: j.ok,
207
+ rpc: j.rpc ?? true,
208
+ indexedBlock: bigOrNull(j.indexedBlock),
209
+ head: bigOrNull(j.head),
210
+ lag: bigOrNull(j.lag),
211
+ keeper: {
212
+ address: k.address ?? null,
213
+ enabled: !!k.enabled,
214
+ balanceWei: bigOrNull(k.balanceWei),
215
+ low: !!k.low,
216
+ spent24hWei: big(k.spent24hWei ?? "0"),
217
+ dailyBudgetWei: big(k.dailyBudgetWei ?? "0"),
218
+ lastTickAt: k.lastTickAt ?? null
219
+ },
220
+ warnings: Array.isArray(j.warnings) ? j.warnings : []
221
+ };
203
222
  }
204
223
  function parseTx(t) {
205
224
  return { to: t.to, data: t.data, value: big(t.value) };
@@ -434,6 +453,11 @@ var Divy = class {
434
453
  const receipt = await this.sendLocal(built.tx);
435
454
  return { txHash: receipt.transactionHash };
436
455
  }
456
+ // Own-wallet launches only: tell the API about a launch tx you mined yourself so the record
457
+ // updates now instead of on the indexer's next pass.
458
+ async confirmLaunch(txHash) {
459
+ return apiRequest(this.apiUrl, "/launches/confirm", { body: { txHash } });
460
+ }
437
461
  async waitForRecord(token, options = {}) {
438
462
  const timeoutMs = options.timeoutMs ?? 6e4;
439
463
  const intervalMs = options.intervalMs ?? 3e3;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client.ts","../src/chain.ts","../src/abi.ts","../src/errors.ts","../src/http.ts","../src/parse.ts"],"sourcesContent":["import {\n createPublicClient, createWalletClient, http, encodeFunctionData, decodeEventLog, zeroAddress,\n} from 'viem';\nimport type { Address, Hex } from 'viem';\nimport { privateKeyToAccount } from 'viem/accounts';\nimport { addresses, defineDivyChain } from './chain.js';\nimport { curveAbi, factoryTokenLaunchedAbi } from './abi.js';\nimport { DivyError } from './errors.js';\nimport { apiRequest } from './http.js';\nimport {\n parseAgentRecord, parseHealth, parseInfo, parseLaunches, parseLeaderboard, parseQuote,\n} from './parse.js';\nimport type {\n AgentRecord, BuyParams, CreateDivyOptions, CreateHostedAgentParams, CreateHostedAgentResult, DivyMode, HarvestResult, HealthResult, InfoResult,\n LaunchListItem, LaunchParams, LaunchResult, LeaderboardEntry, QuoteParams, QuoteResult, RecordResult,\n RegisterResult, SellParams, TradeResult, Tx, WaitForRecordOptions,\n} from './types.js';\n\nconst PRIVATE_KEY_RE = /^0x[0-9a-fA-F]{64}$/;\nconst BPS_DENOM = 10000n;\n\nfunction readAmount(amount: bigint | string): bigint {\n return typeof amount === 'bigint' ? amount : BigInt(amount);\n}\n\nexport class Divy {\n readonly mode: DivyMode;\n readonly apiUrl: string;\n\n private readonly apiKey?: string;\n private readonly account?: ReturnType<typeof privateKeyToAccount>;\n // viem's client generics resist a clean stored type across the three constructor branches;\n // both are only ever touched through sendLocal(), which fixes the call shape in one place.\n private readonly wallet?: any;\n private readonly pub?: any;\n private readonly chain?: ReturnType<typeof defineDivyChain>;\n\n constructor(options: CreateDivyOptions) {\n const hasPrivateKey = 'privateKey' in options && options.privateKey !== undefined;\n const hasApiKey = 'apiKey' in options && options.apiKey !== undefined;\n if (hasPrivateKey && hasApiKey) {\n throw new Error('pass either privateKey or apiKey to createDivy, not both');\n }\n\n this.apiUrl = options.apiUrl ?? addresses.apiUrl;\n\n if (hasPrivateKey) {\n const { privateKey, rpcUrl } = options as { privateKey: Hex; rpcUrl?: string };\n if (!PRIVATE_KEY_RE.test(privateKey)) {\n throw new Error('privateKey must be a 0x-prefixed 32-byte hex string');\n }\n this.mode = 'self-custody';\n this.account = privateKeyToAccount(privateKey);\n this.chain = defineDivyChain(rpcUrl ?? addresses.rpcUrl);\n const transport = http(rpcUrl ?? addresses.rpcUrl);\n this.wallet = createWalletClient({ account: this.account, chain: this.chain, transport });\n this.pub = createPublicClient({ chain: this.chain, transport });\n } else if (hasApiKey) {\n const { apiKey } = options as { apiKey: string };\n if (typeof apiKey !== 'string' || apiKey.length === 0) {\n throw new Error('apiKey must be a non-empty string');\n }\n this.mode = 'hosted';\n this.apiKey = apiKey;\n } else {\n this.mode = 'read-only';\n }\n }\n\n private requireSigner(action: string): void {\n if (this.mode === 'read-only') {\n throw new Error(`${action} requires a privateKey (self-custody) or apiKey (hosted) — this client is read-only`);\n }\n }\n\n private async sendLocal(tx: Tx) {\n if (!this.wallet || !this.pub || !this.account) throw new Error('self-custody wallet is not configured');\n const hash = await this.wallet.sendTransaction({\n account: this.account, chain: this.chain, to: tx.to, data: tx.data, value: tx.value,\n });\n const receipt = await this.pub.waitForTransactionReceipt({ hash });\n if (receipt.status !== 'success') throw new Error(`transaction reverted on-chain: ${hash}`);\n return receipt;\n }\n\n async buildTx<T = Record<string, unknown>>(path: string, body?: object): Promise<T> {\n return apiRequest<T>(this.apiUrl, path, { body: body ?? {} });\n }\n\n async info(): Promise<InfoResult> {\n return parseInfo(await apiRequest(this.apiUrl, '/'));\n }\n\n async agent(address?: Address): Promise<AgentRecord> {\n if (!address) {\n if (this.mode === 'hosted') {\n return parseAgentRecord(await apiRequest(this.apiUrl, '/me', { apiKey: this.apiKey }));\n }\n if (this.mode === 'self-custody' && this.account) {\n address = this.account.address;\n } else {\n throw new Error('agent() requires an address in read-only mode');\n }\n }\n return parseAgentRecord(await apiRequest(this.apiUrl, `/agents/${address}`));\n }\n\n async leaderboard(): Promise<LeaderboardEntry[]> {\n return parseLeaderboard(await apiRequest(this.apiUrl, '/leaderboard'));\n }\n\n async launches(options: { limit?: number } = {}): Promise<LaunchListItem[]> {\n const qs = options.limit ? `?limit=${options.limit}` : '';\n return parseLaunches(await apiRequest(this.apiUrl, `/launches${qs}`));\n }\n\n async health(): Promise<HealthResult> {\n return parseHealth(await apiRequest(this.apiUrl, '/health'));\n }\n\n // Creates a fresh hosted wallet on the API. Needs no credential, so an agent can bootstrap\n // itself from a read-only client, then continue with createDivy({ apiKey }).\n async createHostedAgent(params: CreateHostedAgentParams = {}): Promise<CreateHostedAgentResult> {\n const body: Record<string, unknown> = {};\n if (params.payout) body.payout = params.payout;\n if (params.label) body.label = params.label;\n return apiRequest<CreateHostedAgentResult>(this.apiUrl, '/agents', { body });\n }\n\n async register(): Promise<RegisterResult> {\n this.requireSigner('register');\n\n if (this.mode === 'hosted') {\n const me = await apiRequest<{ registered: boolean; split: Address | null }>(this.apiUrl, '/me', { apiKey: this.apiKey });\n if (me.registered) return { registered: true, split: me.split };\n return { registered: false, split: null };\n }\n\n const address = this.account!.address;\n const first = await apiRequest<{ registered: boolean; split: Address; tx?: Tx }>(this.apiUrl, '/agents', {\n body: { address },\n });\n if (first.registered) return { registered: true, split: first.split };\n\n const receipt = await this.sendLocal({ to: first.tx!.to, data: first.tx!.data, value: BigInt(first.tx!.value ?? 0) });\n const after = await apiRequest<{ registered: boolean; split: Address }>(this.apiUrl, '/agents', { body: { address } });\n return { registered: after.registered, split: after.split, txHash: receipt.transactionHash };\n }\n\n async quote(params: QuoteParams): Promise<QuoteResult> {\n let recipient = params.recipient;\n if (!recipient && this.mode === 'self-custody' && this.account) recipient = this.account.address;\n return parseQuote(\n await apiRequest(this.apiUrl, '/quote', {\n body: {\n curve: params.curve, token: params.token, side: params.side,\n amount: readAmount(params.amount).toString(), recipient: recipient ?? zeroAddress,\n },\n }),\n );\n }\n\n async launch(params: LaunchParams): Promise<LaunchResult> {\n this.requireSigner('launch');\n\n if (this.mode === 'hosted') {\n const out = await apiRequest<{ token: Address; curve: Address; txHash: Hex }>(this.apiUrl, '/launch', {\n apiKey: this.apiKey, body: params,\n });\n return { token: out.token, curve: out.curve, txHash: out.txHash };\n }\n\n const address = this.account!.address;\n const built = await apiRequest<{ tx: Tx }>(this.apiUrl, '/launch', { body: { ...params, agent: address } });\n const receipt = await this.sendLocal(built.tx);\n\n let launched: { token: Address; curve: Address } | undefined;\n for (const log of receipt.logs) {\n try {\n const ev = decodeEventLog({ abi: factoryTokenLaunchedAbi, data: log.data, topics: log.topics });\n if (ev.eventName === 'TokenLaunched') { launched = ev.args as { token: Address; curve: Address }; break; }\n } catch { /* not a TokenLaunched log */ }\n }\n if (!launched) throw new Error(`launch mined (${receipt.transactionHash}) but no TokenLaunched event was found`);\n\n const result: LaunchResult = { token: launched.token, curve: launched.curve, txHash: receipt.transactionHash };\n try {\n const recorded = await this.record(launched.token);\n result.recordTxHash = recorded.txHash;\n } catch (e) {\n result.recordError = e instanceof Error ? e.message : String(e);\n }\n return result;\n }\n\n async record(token: Address): Promise<RecordResult> {\n if (this.mode !== 'self-custody') {\n throw new Error(\n 'record() requires self-custody (a privateKey): hosted and read-only launches are recorded '\n + 'automatically by Divy\\'s keeper within about a minute — use waitForRecord() to wait for it',\n );\n }\n const built = await apiRequest<{ tx: Tx }>(this.apiUrl, '/record', { body: { token } });\n const receipt = await this.sendLocal(built.tx);\n return { txHash: receipt.transactionHash };\n }\n\n async buy(params: BuyParams): Promise<TradeResult> {\n return this.trade('buy', readAmount(params.amountWei), params);\n }\n\n async sell(params: SellParams): Promise<TradeResult> {\n return this.trade('sell', readAmount(params.amountTokens), params);\n }\n\n private async trade(side: 'buy' | 'sell', amount: bigint, params: BuyParams | SellParams): Promise<TradeResult> {\n this.requireSigner(side);\n const slippageBps = params.slippageBps ?? 100;\n\n if (this.mode === 'hosted') {\n if (slippageBps !== 100) {\n throw new Error('slippageBps is not configurable in hosted mode: /trade hardcodes a 1% (100bps) slippage floor');\n }\n const out = await apiRequest<{ txHash: Hex; amountOut: string }>(this.apiUrl, '/trade', {\n apiKey: this.apiKey, body: { curve: params.curve, token: params.token, side, amount: amount.toString() },\n });\n return { txHash: out.txHash, amountOut: BigInt(out.amountOut) };\n }\n\n const address = this.account!.address;\n const q = await this.quote({ curve: params.curve, token: params.token, side, amount, recipient: address });\n\n let tradeTx = q.tx;\n if (slippageBps !== 100) {\n const minOut = (q.amountOut * (BPS_DENOM - BigInt(slippageBps))) / BPS_DENOM;\n const data = encodeFunctionData({ abi: curveAbi, functionName: side, args: [q.amountIn, minOut, address] });\n tradeTx = { ...q.tx, data };\n }\n\n if (q.approveTx) await this.sendLocal(q.approveTx);\n const receipt = await this.sendLocal(tradeTx);\n return { txHash: receipt.transactionHash, amountOut: q.amountOut };\n }\n\n async harvest(): Promise<HarvestResult> {\n this.requireSigner('harvest');\n\n if (this.mode === 'hosted') {\n const out = await apiRequest<{ txHash: Hex }>(this.apiUrl, '/harvest', { apiKey: this.apiKey, body: {} });\n return { txHash: out.txHash };\n }\n\n const address = this.account!.address;\n const built = await apiRequest<{ tx: Tx }>(this.apiUrl, '/harvest', { body: { agent: address } });\n const receipt = await this.sendLocal(built.tx);\n return { txHash: receipt.transactionHash };\n }\n\n async waitForRecord(token: Address, options: WaitForRecordOptions = {}): Promise<LaunchListItem> {\n const timeoutMs = options.timeoutMs ?? 60_000;\n const intervalMs = options.intervalMs ?? 3_000;\n const deadline = Date.now() + timeoutMs;\n const wanted = token.toLowerCase();\n\n for (;;) {\n const rows = await this.launches({ limit: 200 });\n const row = rows.find((r) => r.token.toLowerCase() === wanted);\n if (row?.recorded) return row;\n if (Date.now() >= deadline) {\n throw new DivyError(`timed out waiting for ${token} to be recorded`, 408);\n }\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n }\n }\n}\n\nexport function createDivy(options: CreateDivyOptions = {}): Divy {\n return new Divy(options);\n}\n","import { defineChain } from 'viem';\nimport type { Address } from 'viem';\n\nexport const CHAIN_ID = 4663;\nexport const DEFAULT_RPC_URL = 'https://rpc.mainnet.chain.robinhood.com';\nexport const DEFAULT_API_URL = 'https://divy-api-j8di.onrender.com';\nexport const EXPLORER_URL = 'https://robinhoodchain.blockscout.com';\n\nexport const addresses = {\n chainId: CHAIN_ID,\n registry: '0x0fEf638d8C88e6eD38eDcD9aB21BF39D083c8B1b' as Address,\n factory: '0x7eD598BcEf8bd9Edd8C97A195C6d13f40801EC7e' as Address,\n escrow: '0xd3AFEB2a57f70eF218Aa82451c51B2fb0416Ac9e' as Address,\n rpcUrl: DEFAULT_RPC_URL,\n apiUrl: DEFAULT_API_URL,\n explorerUrl: EXPLORER_URL,\n} as const;\n\nexport function defineDivyChain(rpcUrl: string = DEFAULT_RPC_URL) {\n return defineChain({\n id: CHAIN_ID,\n name: 'robinhood-chain',\n nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n rpcUrls: { default: { http: [rpcUrl] } },\n blockExplorers: { default: { name: 'Blockscout', url: EXPLORER_URL } },\n });\n}\n\nexport function explorerTx(hash: string): string {\n return `${EXPLORER_URL}/tx/${hash}`;\n}\n\nexport function explorerAddress(address: string): string {\n return `${EXPLORER_URL}/address/${address}`;\n}\n","// Minimal ABIs: the API returns pre-encoded {to, data, value} for every write, so the SDK\n// only needs to encode locally when overriding the API's default 1% slippage floor, and to\n// decode the TokenLaunched event off a launch receipt.\n\nexport const curveAbi = [\n {\n type: 'function',\n name: 'buy',\n stateMutability: 'payable',\n inputs: [\n { name: 'quoteIn', type: 'uint256' },\n { name: 'minTokensOut', type: 'uint256' },\n { name: 'recipient', type: 'address' },\n ],\n outputs: [{ name: 'tokensOut', type: 'uint256' }],\n },\n {\n type: 'function',\n name: 'sell',\n stateMutability: 'nonpayable',\n inputs: [\n { name: 'tokensIn', type: 'uint256' },\n { name: 'minQuoteOut', type: 'uint256' },\n { name: 'recipient', type: 'address' },\n ],\n outputs: [{ name: 'quoteOut', type: 'uint256' }],\n },\n] as const;\n\nexport const factoryTokenLaunchedAbi = [\n {\n type: 'event',\n name: 'TokenLaunched',\n inputs: [\n { indexed: true, name: 'token', type: 'address' },\n { indexed: true, name: 'curve', type: 'address' },\n { indexed: true, name: 'deployer', type: 'address' },\n { indexed: false, name: 'pairToken', type: 'address' },\n { indexed: false, name: 'launchConfigId', type: 'uint256' },\n { indexed: false, name: 'graduationThreshold', type: 'uint256' },\n ],\n },\n] as const;\n","export class DivyError extends Error {\n readonly status: number;\n\n constructor(message: string, status: number) {\n super(message);\n this.name = 'DivyError';\n this.status = status;\n }\n}\n","import { DivyError } from './errors.js';\n\nconst stringify = (body: unknown): string =>\n JSON.stringify(body, (_key, value) => (typeof value === 'bigint' ? value.toString() : value));\n\nexport interface RequestOptions {\n method?: 'GET' | 'POST' | 'PATCH';\n body?: unknown;\n apiKey?: string;\n}\n\nexport async function apiRequest<T = unknown>(apiUrl: string, path: string, options: RequestOptions = {}): Promise<T> {\n const headers: Record<string, string> = {};\n if (options.body !== undefined) headers['content-type'] = 'application/json';\n if (options.apiKey) headers.authorization = `Bearer ${options.apiKey}`;\n\n const res = await fetch(`${apiUrl}${path}`, {\n method: options.method ?? (options.body !== undefined ? 'POST' : 'GET'),\n headers,\n body: options.body !== undefined ? stringify(options.body) : undefined,\n });\n\n const text = await res.text();\n let json: any;\n try {\n json = text ? JSON.parse(text) : {};\n } catch {\n // A gateway or proxy in front of the API (Render, Cloudflare, ...) can return an HTML\n // error page instead of JSON, typically on a 502/504 while the API is cold-starting or down.\n throw new DivyError(`${apiUrl} returned a non-JSON response (HTTP ${res.status} ${res.statusText}): the API may be down or restarting`, res.status);\n }\n if (!res.ok) {\n throw new DivyError(typeof json.error === 'string' ? json.error : res.statusText, res.status);\n }\n return json as T;\n}\n","import type {\n AgentLaunch, AgentRecord, HealthResult, InfoResult, LaunchListItem, LeaderboardEntry, QuoteResult, Tx,\n} from './types.js';\n\nconst big = (v: unknown): bigint => BigInt(v as string);\nconst bigOrNull = (v: unknown): bigint | null => (v === null || v === undefined ? null : big(v));\n\nexport function parseInfo(j: any): InfoResult {\n return {\n chain: j.chain,\n registry: j.registry,\n factory: j.factory,\n escrow: j.escrow,\n hostedWallets: j.hostedWallets,\n feePolicy: {\n treasury: j.feePolicy.treasury,\n divyBps: j.feePolicy.divyBps === null || j.feePolicy.divyBps === undefined ? null : Number(j.feePolicy.divyBps),\n agentShareOfBaseFee: j.feePolicy.agentShareOfBaseFee,\n ponsShare: j.feePolicy.ponsShare,\n divyShare: j.feePolicy.divyShare,\n },\n launchFee: { wei: big(j.launchFee.wei), eth: j.launchFee.eth },\n maxCreatorTaxBps: j.maxCreatorTaxBps,\n economics: j.economics,\n indexedBlock: bigOrNull(j.indexedBlock),\n keeper: j.keeper,\n };\n}\n\nfunction parseAgentLaunch(l: any): AgentLaunch {\n return {\n token: l.token,\n symbol: l.symbol,\n name: l.name,\n curve: l.curve,\n pairToken: l.pairToken,\n graduated: l.graduated,\n launchedAt: l.launchedAt,\n recorded: l.recorded,\n retention: l.retention ?? null, retentionProvisional: l.retentionProvisional ?? false,\n earlyHolders: l.earlyHolders ?? null, retained: l.retained ?? null,\n };\n}\n\nexport function parseAgentRecord(j: any): AgentRecord {\n return {\n agent: j.agent,\n split: j.split,\n registered: j.registered,\n record: { launches: big(j.record.launches), graduated: big(j.record.graduated), score: j.record.score, graduationRate: j.record.graduationRate ?? j.record.score },\n fees: { agentEth: big(j.fees.agentEth), divyEth: big(j.fees.divyEth), pendingEscrowEth: big(j.fees.pendingEscrowEth) },\n launches: j.launches.map(parseAgentLaunch),\n ...(j.balanceEth !== undefined ? { balanceEth: j.balanceEth } : {}),\n ...(j.payout !== undefined ? { payout: j.payout } : {}),\n ...(j.label !== undefined ? { label: j.label } : {}),\n };\n}\n\nexport function parseLeaderboard(j: any[]): LeaderboardEntry[] {\n return j.map((r) => ({\n agent: r.agent, launches: r.launches, graduated: r.graduated, score: r.score,\n graduationRate: r.graduationRate ?? r.score, retention: r.retention ?? null,\n retentionProvisional: r.retentionProvisional ?? false, feesEth: big(r.feesEth),\n }));\n}\n\nexport function parseLaunches(j: any[]): LaunchListItem[] {\n return j.map((r) => ({\n token: r.token, agent: r.agent, split: r.split, curve: r.curve, pairToken: r.pairToken,\n name: r.name, symbol: r.symbol, launchedBlock: r.launchedBlock, launchedAt: r.launchedAt,\n recorded: r.recorded, graduated: r.graduated,\n retention: r.retention ?? null, retentionProvisional: r.retentionProvisional ?? false,\n earlyHolders: r.earlyHolders ?? null, retained: r.retained ?? null,\n }));\n}\n\nexport function parseHealth(j: any): HealthResult {\n return { ok: j.ok, indexedBlock: bigOrNull(j.indexedBlock), head: big(j.head), lag: bigOrNull(j.lag) };\n}\n\nfunction parseTx(t: any): Tx {\n return { to: t.to, data: t.data, value: big(t.value) };\n}\n\nexport function parseQuote(j: any): QuoteResult {\n return {\n curve: j.curve,\n amountIn: big(j.amountIn),\n amountOut: big(j.amountOut),\n minOut: big(j.minOut),\n feeBps: j.feeBps,\n creatorTaxBps: j.creatorTaxBps,\n snipeTaxBps: j.snipeTaxBps,\n tx: parseTx(j.tx),\n approveTx: j.approveTx ? parseTx(j.approveTx) : null,\n };\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/client.ts","../src/chain.ts","../src/abi.ts","../src/errors.ts","../src/http.ts","../src/parse.ts"],"sourcesContent":["import {\n createPublicClient, createWalletClient, http, encodeFunctionData, decodeEventLog, zeroAddress,\n} from 'viem';\nimport type { Address, Hex } from 'viem';\nimport { privateKeyToAccount } from 'viem/accounts';\nimport { addresses, defineDivyChain } from './chain.js';\nimport { curveAbi, factoryTokenLaunchedAbi } from './abi.js';\nimport { DivyError } from './errors.js';\nimport { apiRequest } from './http.js';\nimport {\n parseAgentRecord, parseHealth, parseInfo, parseLaunches, parseLeaderboard, parseQuote,\n} from './parse.js';\nimport type {\n AgentRecord, BuyParams, CreateDivyOptions, CreateHostedAgentParams, CreateHostedAgentResult, DivyMode, HarvestResult, HealthResult, InfoResult,\n LaunchListItem, LaunchParams, LaunchResult, LeaderboardEntry, QuoteParams, QuoteResult, RecordResult,\n RegisterResult, SellParams, TradeResult, Tx, WaitForRecordOptions,\n} from './types.js';\n\nconst PRIVATE_KEY_RE = /^0x[0-9a-fA-F]{64}$/;\nconst BPS_DENOM = 10000n;\n\nfunction readAmount(amount: bigint | string): bigint {\n return typeof amount === 'bigint' ? amount : BigInt(amount);\n}\n\nexport class Divy {\n readonly mode: DivyMode;\n readonly apiUrl: string;\n\n private readonly apiKey?: string;\n private readonly account?: ReturnType<typeof privateKeyToAccount>;\n // viem's client generics resist a clean stored type across the three constructor branches;\n // both are only ever touched through sendLocal(), which fixes the call shape in one place.\n private readonly wallet?: any;\n private readonly pub?: any;\n private readonly chain?: ReturnType<typeof defineDivyChain>;\n\n constructor(options: CreateDivyOptions) {\n const hasPrivateKey = 'privateKey' in options && options.privateKey !== undefined;\n const hasApiKey = 'apiKey' in options && options.apiKey !== undefined;\n if (hasPrivateKey && hasApiKey) {\n throw new Error('pass either privateKey or apiKey to createDivy, not both');\n }\n\n this.apiUrl = options.apiUrl ?? addresses.apiUrl;\n\n if (hasPrivateKey) {\n const { privateKey, rpcUrl } = options as { privateKey: Hex; rpcUrl?: string };\n if (!PRIVATE_KEY_RE.test(privateKey)) {\n throw new Error('privateKey must be a 0x-prefixed 32-byte hex string');\n }\n this.mode = 'self-custody';\n this.account = privateKeyToAccount(privateKey);\n this.chain = defineDivyChain(rpcUrl ?? addresses.rpcUrl);\n const transport = http(rpcUrl ?? addresses.rpcUrl);\n this.wallet = createWalletClient({ account: this.account, chain: this.chain, transport });\n this.pub = createPublicClient({ chain: this.chain, transport });\n } else if (hasApiKey) {\n const { apiKey } = options as { apiKey: string };\n if (typeof apiKey !== 'string' || apiKey.length === 0) {\n throw new Error('apiKey must be a non-empty string');\n }\n this.mode = 'hosted';\n this.apiKey = apiKey;\n } else {\n this.mode = 'read-only';\n }\n }\n\n private requireSigner(action: string): void {\n if (this.mode === 'read-only') {\n throw new Error(`${action} requires a privateKey (self-custody) or apiKey (hosted) — this client is read-only`);\n }\n }\n\n private async sendLocal(tx: Tx) {\n if (!this.wallet || !this.pub || !this.account) throw new Error('self-custody wallet is not configured');\n const hash = await this.wallet.sendTransaction({\n account: this.account, chain: this.chain, to: tx.to, data: tx.data, value: tx.value,\n });\n const receipt = await this.pub.waitForTransactionReceipt({ hash });\n if (receipt.status !== 'success') throw new Error(`transaction reverted on-chain: ${hash}`);\n return receipt;\n }\n\n async buildTx<T = Record<string, unknown>>(path: string, body?: object): Promise<T> {\n return apiRequest<T>(this.apiUrl, path, { body: body ?? {} });\n }\n\n async info(): Promise<InfoResult> {\n return parseInfo(await apiRequest(this.apiUrl, '/'));\n }\n\n async agent(address?: Address): Promise<AgentRecord> {\n if (!address) {\n if (this.mode === 'hosted') {\n return parseAgentRecord(await apiRequest(this.apiUrl, '/me', { apiKey: this.apiKey }));\n }\n if (this.mode === 'self-custody' && this.account) {\n address = this.account.address;\n } else {\n throw new Error('agent() requires an address in read-only mode');\n }\n }\n return parseAgentRecord(await apiRequest(this.apiUrl, `/agents/${address}`));\n }\n\n async leaderboard(): Promise<LeaderboardEntry[]> {\n return parseLeaderboard(await apiRequest(this.apiUrl, '/leaderboard'));\n }\n\n async launches(options: { limit?: number } = {}): Promise<LaunchListItem[]> {\n const qs = options.limit ? `?limit=${options.limit}` : '';\n return parseLaunches(await apiRequest(this.apiUrl, `/launches${qs}`));\n }\n\n async health(): Promise<HealthResult> {\n return parseHealth(await apiRequest(this.apiUrl, '/health'));\n }\n\n // Creates a fresh hosted wallet on the API. Needs no credential, so an agent can bootstrap\n // itself from a read-only client, then continue with createDivy({ apiKey }).\n async createHostedAgent(params: CreateHostedAgentParams = {}): Promise<CreateHostedAgentResult> {\n const body: Record<string, unknown> = {};\n if (params.payout) body.payout = params.payout;\n if (params.label) body.label = params.label;\n return apiRequest<CreateHostedAgentResult>(this.apiUrl, '/agents', { body });\n }\n\n async register(): Promise<RegisterResult> {\n this.requireSigner('register');\n\n if (this.mode === 'hosted') {\n const me = await apiRequest<{ registered: boolean; split: Address | null }>(this.apiUrl, '/me', { apiKey: this.apiKey });\n if (me.registered) return { registered: true, split: me.split };\n return { registered: false, split: null };\n }\n\n const address = this.account!.address;\n const first = await apiRequest<{ registered: boolean; split: Address; tx?: Tx }>(this.apiUrl, '/agents', {\n body: { address },\n });\n if (first.registered) return { registered: true, split: first.split };\n\n const receipt = await this.sendLocal({ to: first.tx!.to, data: first.tx!.data, value: BigInt(first.tx!.value ?? 0) });\n const after = await apiRequest<{ registered: boolean; split: Address }>(this.apiUrl, '/agents', { body: { address } });\n return { registered: after.registered, split: after.split, txHash: receipt.transactionHash };\n }\n\n async quote(params: QuoteParams): Promise<QuoteResult> {\n let recipient = params.recipient;\n if (!recipient && this.mode === 'self-custody' && this.account) recipient = this.account.address;\n return parseQuote(\n await apiRequest(this.apiUrl, '/quote', {\n body: {\n curve: params.curve, token: params.token, side: params.side,\n amount: readAmount(params.amount).toString(), recipient: recipient ?? zeroAddress,\n },\n }),\n );\n }\n\n async launch(params: LaunchParams): Promise<LaunchResult> {\n this.requireSigner('launch');\n\n if (this.mode === 'hosted') {\n const out = await apiRequest<{ token: Address; curve: Address; txHash: Hex }>(this.apiUrl, '/launch', {\n apiKey: this.apiKey, body: params,\n });\n return { token: out.token, curve: out.curve, txHash: out.txHash };\n }\n\n const address = this.account!.address;\n const built = await apiRequest<{ tx: Tx }>(this.apiUrl, '/launch', { body: { ...params, agent: address } });\n const receipt = await this.sendLocal(built.tx);\n\n let launched: { token: Address; curve: Address } | undefined;\n for (const log of receipt.logs) {\n try {\n const ev = decodeEventLog({ abi: factoryTokenLaunchedAbi, data: log.data, topics: log.topics });\n if (ev.eventName === 'TokenLaunched') { launched = ev.args as { token: Address; curve: Address }; break; }\n } catch { /* not a TokenLaunched log */ }\n }\n if (!launched) throw new Error(`launch mined (${receipt.transactionHash}) but no TokenLaunched event was found`);\n\n const result: LaunchResult = { token: launched.token, curve: launched.curve, txHash: receipt.transactionHash };\n try {\n const recorded = await this.record(launched.token);\n result.recordTxHash = recorded.txHash;\n } catch (e) {\n result.recordError = e instanceof Error ? e.message : String(e);\n }\n return result;\n }\n\n async record(token: Address): Promise<RecordResult> {\n if (this.mode !== 'self-custody') {\n throw new Error(\n 'record() requires self-custody (a privateKey): hosted and read-only launches are recorded '\n + 'automatically by Divy\\'s keeper within about a minute — use waitForRecord() to wait for it',\n );\n }\n const built = await apiRequest<{ tx: Tx }>(this.apiUrl, '/record', { body: { token } });\n const receipt = await this.sendLocal(built.tx);\n return { txHash: receipt.transactionHash };\n }\n\n async buy(params: BuyParams): Promise<TradeResult> {\n return this.trade('buy', readAmount(params.amountWei), params);\n }\n\n async sell(params: SellParams): Promise<TradeResult> {\n return this.trade('sell', readAmount(params.amountTokens), params);\n }\n\n private async trade(side: 'buy' | 'sell', amount: bigint, params: BuyParams | SellParams): Promise<TradeResult> {\n this.requireSigner(side);\n const slippageBps = params.slippageBps ?? 100;\n\n if (this.mode === 'hosted') {\n if (slippageBps !== 100) {\n throw new Error('slippageBps is not configurable in hosted mode: /trade hardcodes a 1% (100bps) slippage floor');\n }\n const out = await apiRequest<{ txHash: Hex; amountOut: string }>(this.apiUrl, '/trade', {\n apiKey: this.apiKey, body: { curve: params.curve, token: params.token, side, amount: amount.toString() },\n });\n return { txHash: out.txHash, amountOut: BigInt(out.amountOut) };\n }\n\n const address = this.account!.address;\n const q = await this.quote({ curve: params.curve, token: params.token, side, amount, recipient: address });\n\n let tradeTx = q.tx;\n if (slippageBps !== 100) {\n const minOut = (q.amountOut * (BPS_DENOM - BigInt(slippageBps))) / BPS_DENOM;\n const data = encodeFunctionData({ abi: curveAbi, functionName: side, args: [q.amountIn, minOut, address] });\n tradeTx = { ...q.tx, data };\n }\n\n if (q.approveTx) await this.sendLocal(q.approveTx);\n const receipt = await this.sendLocal(tradeTx);\n return { txHash: receipt.transactionHash, amountOut: q.amountOut };\n }\n\n async harvest(): Promise<HarvestResult> {\n this.requireSigner('harvest');\n\n if (this.mode === 'hosted') {\n const out = await apiRequest<{ txHash: Hex }>(this.apiUrl, '/harvest', { apiKey: this.apiKey, body: {} });\n return { txHash: out.txHash };\n }\n\n const address = this.account!.address;\n const built = await apiRequest<{ tx: Tx }>(this.apiUrl, '/harvest', { body: { agent: address } });\n const receipt = await this.sendLocal(built.tx);\n return { txHash: receipt.transactionHash };\n }\n\n // Own-wallet launches only: tell the API about a launch tx you mined yourself so the record\n // updates now instead of on the indexer's next pass.\n async confirmLaunch(txHash: Hex): Promise<{ token: Address; curve: Address; txHash: Hex; agent: Address | null; recorded: boolean }> {\n return apiRequest(this.apiUrl, '/launches/confirm', { body: { txHash } });\n }\n\n async waitForRecord(token: Address, options: WaitForRecordOptions = {}): Promise<LaunchListItem> {\n const timeoutMs = options.timeoutMs ?? 60_000;\n const intervalMs = options.intervalMs ?? 3_000;\n const deadline = Date.now() + timeoutMs;\n const wanted = token.toLowerCase();\n\n for (;;) {\n const rows = await this.launches({ limit: 200 });\n const row = rows.find((r) => r.token.toLowerCase() === wanted);\n if (row?.recorded) return row;\n if (Date.now() >= deadline) {\n throw new DivyError(`timed out waiting for ${token} to be recorded`, 408);\n }\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n }\n }\n}\n\nexport function createDivy(options: CreateDivyOptions = {}): Divy {\n return new Divy(options);\n}\n","import { defineChain } from 'viem';\nimport type { Address } from 'viem';\n\nexport const CHAIN_ID = 4663;\nexport const DEFAULT_RPC_URL = 'https://rpc.mainnet.chain.robinhood.com';\nexport const DEFAULT_API_URL = 'https://divy-api-j8di.onrender.com';\nexport const EXPLORER_URL = 'https://robinhoodchain.blockscout.com';\n\nexport const addresses = {\n chainId: CHAIN_ID,\n registry: '0x0fEf638d8C88e6eD38eDcD9aB21BF39D083c8B1b' as Address,\n factory: '0x7eD598BcEf8bd9Edd8C97A195C6d13f40801EC7e' as Address,\n escrow: '0xd3AFEB2a57f70eF218Aa82451c51B2fb0416Ac9e' as Address,\n rpcUrl: DEFAULT_RPC_URL,\n apiUrl: DEFAULT_API_URL,\n explorerUrl: EXPLORER_URL,\n} as const;\n\nexport function defineDivyChain(rpcUrl: string = DEFAULT_RPC_URL) {\n return defineChain({\n id: CHAIN_ID,\n name: 'robinhood-chain',\n nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n rpcUrls: { default: { http: [rpcUrl] } },\n blockExplorers: { default: { name: 'Blockscout', url: EXPLORER_URL } },\n });\n}\n\nexport function explorerTx(hash: string): string {\n return `${EXPLORER_URL}/tx/${hash}`;\n}\n\nexport function explorerAddress(address: string): string {\n return `${EXPLORER_URL}/address/${address}`;\n}\n","// Minimal ABIs: the API returns pre-encoded {to, data, value} for every write, so the SDK\n// only needs to encode locally when overriding the API's default 1% slippage floor, and to\n// decode the TokenLaunched event off a launch receipt.\n\nexport const curveAbi = [\n {\n type: 'function',\n name: 'buy',\n stateMutability: 'payable',\n inputs: [\n { name: 'quoteIn', type: 'uint256' },\n { name: 'minTokensOut', type: 'uint256' },\n { name: 'recipient', type: 'address' },\n ],\n outputs: [{ name: 'tokensOut', type: 'uint256' }],\n },\n {\n type: 'function',\n name: 'sell',\n stateMutability: 'nonpayable',\n inputs: [\n { name: 'tokensIn', type: 'uint256' },\n { name: 'minQuoteOut', type: 'uint256' },\n { name: 'recipient', type: 'address' },\n ],\n outputs: [{ name: 'quoteOut', type: 'uint256' }],\n },\n] as const;\n\nexport const factoryTokenLaunchedAbi = [\n {\n type: 'event',\n name: 'TokenLaunched',\n inputs: [\n { indexed: true, name: 'token', type: 'address' },\n { indexed: true, name: 'curve', type: 'address' },\n { indexed: true, name: 'deployer', type: 'address' },\n { indexed: false, name: 'pairToken', type: 'address' },\n { indexed: false, name: 'launchConfigId', type: 'uint256' },\n { indexed: false, name: 'graduationThreshold', type: 'uint256' },\n ],\n },\n] as const;\n","export class DivyError extends Error {\n readonly status: number;\n\n constructor(message: string, status: number) {\n super(message);\n this.name = 'DivyError';\n this.status = status;\n }\n}\n","import { DivyError } from './errors.js';\n\nconst stringify = (body: unknown): string =>\n JSON.stringify(body, (_key, value) => (typeof value === 'bigint' ? value.toString() : value));\n\nexport interface RequestOptions {\n method?: 'GET' | 'POST' | 'PATCH';\n body?: unknown;\n apiKey?: string;\n}\n\nexport async function apiRequest<T = unknown>(apiUrl: string, path: string, options: RequestOptions = {}): Promise<T> {\n const headers: Record<string, string> = {};\n if (options.body !== undefined) headers['content-type'] = 'application/json';\n if (options.apiKey) headers.authorization = `Bearer ${options.apiKey}`;\n\n const res = await fetch(`${apiUrl}${path}`, {\n method: options.method ?? (options.body !== undefined ? 'POST' : 'GET'),\n headers,\n body: options.body !== undefined ? stringify(options.body) : undefined,\n });\n\n const text = await res.text();\n let json: any;\n try {\n json = text ? JSON.parse(text) : {};\n } catch {\n // A gateway or proxy in front of the API (Render, Cloudflare, ...) can return an HTML\n // error page instead of JSON, typically on a 502/504 while the API is cold-starting or down.\n throw new DivyError(`${apiUrl} returned a non-JSON response (HTTP ${res.status} ${res.statusText}): the API may be down or restarting`, res.status);\n }\n if (!res.ok) {\n throw new DivyError(typeof json.error === 'string' ? json.error : res.statusText, res.status);\n }\n return json as T;\n}\n","import type {\n AgentLaunch, AgentRecord, HealthResult, InfoResult, LaunchListItem, LeaderboardEntry, QuoteResult, Tx,\n} from './types.js';\n\nconst big = (v: unknown): bigint => BigInt(v as string);\nconst bigOrNull = (v: unknown): bigint | null => (v === null || v === undefined ? null : big(v));\n\nexport function parseInfo(j: any): InfoResult {\n return {\n chain: j.chain,\n registry: j.registry,\n factory: j.factory,\n escrow: j.escrow,\n hostedWallets: j.hostedWallets,\n feePolicy: {\n treasury: j.feePolicy.treasury,\n divyBps: j.feePolicy.divyBps === null || j.feePolicy.divyBps === undefined ? null : Number(j.feePolicy.divyBps),\n agentShareOfBaseFee: j.feePolicy.agentShareOfBaseFee,\n ponsShare: j.feePolicy.ponsShare,\n divyShare: j.feePolicy.divyShare,\n },\n launchFee: { wei: big(j.launchFee.wei), eth: j.launchFee.eth },\n maxCreatorTaxBps: j.maxCreatorTaxBps,\n economics: j.economics,\n indexedBlock: bigOrNull(j.indexedBlock),\n keeper: j.keeper,\n };\n}\n\nfunction parseAgentLaunch(l: any): AgentLaunch {\n return {\n token: l.token,\n symbol: l.symbol,\n name: l.name,\n curve: l.curve,\n pairToken: l.pairToken,\n graduated: l.graduated,\n launchedAt: l.launchedAt,\n recorded: l.recorded,\n retention: l.retention ?? null, retentionProvisional: l.retentionProvisional ?? false, retentionPending: l.retentionPending ?? false,\n earlyHolders: l.earlyHolders ?? null, retained: l.retained ?? null,\n };\n}\n\nexport function parseAgentRecord(j: any): AgentRecord {\n return {\n agent: j.agent,\n split: j.split,\n registered: j.registered,\n record: { launches: big(j.record.launches), graduated: big(j.record.graduated), score: j.record.score, graduationRate: j.record.graduationRate ?? j.record.score },\n fees: { agentEth: big(j.fees.agentEth), divyEth: big(j.fees.divyEth), pendingEscrowEth: big(j.fees.pendingEscrowEth) },\n launches: j.launches.map(parseAgentLaunch),\n ...(j.balanceEth !== undefined ? { balanceEth: j.balanceEth } : {}),\n ...(j.payout !== undefined ? { payout: j.payout } : {}),\n ...(j.label !== undefined ? { label: j.label } : {}),\n };\n}\n\nexport function parseLeaderboard(j: any[]): LeaderboardEntry[] {\n return j.map((r) => ({\n agent: r.agent, launches: r.launches, graduated: r.graduated, score: r.score,\n graduationRate: r.graduationRate ?? r.score, retention: r.retention ?? null,\n retentionProvisional: r.retentionProvisional ?? false, feesEth: big(r.feesEth),\n }));\n}\n\nexport function parseLaunches(j: any[]): LaunchListItem[] {\n return j.map((r) => ({\n token: r.token, agent: r.agent, split: r.split, curve: r.curve, pairToken: r.pairToken,\n name: r.name, symbol: r.symbol, launchedBlock: r.launchedBlock, launchedAt: r.launchedAt,\n recorded: r.recorded, graduated: r.graduated,\n retention: r.retention ?? null, retentionProvisional: r.retentionProvisional ?? false, retentionPending: r.retentionPending ?? false,\n earlyHolders: r.earlyHolders ?? null, retained: r.retained ?? null,\n }));\n}\n\nexport function parseHealth(j: any): HealthResult {\n const k = j.keeper ?? {};\n return {\n ok: j.ok, rpc: j.rpc ?? true,\n indexedBlock: bigOrNull(j.indexedBlock), head: bigOrNull(j.head), lag: bigOrNull(j.lag),\n keeper: {\n address: k.address ?? null, enabled: !!k.enabled, balanceWei: bigOrNull(k.balanceWei), low: !!k.low,\n spent24hWei: big(k.spent24hWei ?? '0'), dailyBudgetWei: big(k.dailyBudgetWei ?? '0'), lastTickAt: k.lastTickAt ?? null,\n },\n warnings: Array.isArray(j.warnings) ? j.warnings : [],\n };\n}\n\nfunction parseTx(t: any): Tx {\n return { to: t.to, data: t.data, value: big(t.value) };\n}\n\nexport function parseQuote(j: any): QuoteResult {\n return {\n curve: j.curve,\n amountIn: big(j.amountIn),\n amountOut: big(j.amountOut),\n minOut: big(j.minOut),\n feeBps: j.feeBps,\n creatorTaxBps: j.creatorTaxBps,\n snipeTaxBps: j.snipeTaxBps,\n tx: parseTx(j.tx),\n approveTx: j.approveTx ? parseTx(j.approveTx) : null,\n };\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "divy-sdk",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "Typed TypeScript SDK for Divy: register agents, launch tokens on Pons, trade, and harvest fees on Robinhood Chain.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -52,5 +52,9 @@
52
52
  "tsup": "^8.5.1",
53
53
  "typescript": "^5.9.3",
54
54
  "vitest": "^4.1.11"
55
+ },
56
+ "homepage": "https://rundivy.com/docs.html",
57
+ "bugs": {
58
+ "url": "https://github.com/ElizenDevVini/divy/issues"
55
59
  }
56
60
  }