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 +6 -4
- package/dist/index.cjs +25 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +24 -1
- package/dist/index.d.ts +24 -1
- package/dist/index.js +25 -1
- package/dist/index.js.map +1 -1
- package/package.json +5 -1
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
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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
|
-
|
|
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;
|
package/dist/index.cjs.map
CHANGED
|
@@ -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
|
-
|
|
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.
|
|
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
|
}
|