@hodlmarkets/sdk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +121 -0
- package/dist/accounts.cjs +1893 -0
- package/dist/accounts.cjs.map +1 -0
- package/dist/accounts.d.cts +9 -0
- package/dist/accounts.d.ts +9 -0
- package/dist/accounts.js +1885 -0
- package/dist/accounts.js.map +1 -0
- package/dist/client.cjs +2161 -0
- package/dist/client.cjs.map +1 -0
- package/dist/client.d.cts +44 -0
- package/dist/client.d.ts +44 -0
- package/dist/client.js +2155 -0
- package/dist/client.js.map +1 -0
- package/dist/constants.cjs +68 -0
- package/dist/constants.cjs.map +1 -0
- package/dist/constants.d.cts +62 -0
- package/dist/constants.d.ts +62 -0
- package/dist/constants.js +50 -0
- package/dist/constants.js.map +1 -0
- package/dist/errors.cjs +43 -0
- package/dist/errors.cjs.map +1 -0
- package/dist/errors.d.cts +8 -0
- package/dist/errors.d.ts +8 -0
- package/dist/errors.js +39 -0
- package/dist/errors.js.map +1 -0
- package/dist/events.cjs +1923 -0
- package/dist/events.cjs.map +1 -0
- package/dist/events.d.cts +20 -0
- package/dist/events.d.ts +20 -0
- package/dist/events.js +1913 -0
- package/dist/events.js.map +1 -0
- package/dist/index.cjs +2357 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +12 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +2302 -0
- package/dist/index.js.map +1 -0
- package/dist/instructions.cjs +2022 -0
- package/dist/instructions.cjs.map +1 -0
- package/dist/instructions.d.cts +38 -0
- package/dist/instructions.d.ts +38 -0
- package/dist/instructions.js +2012 -0
- package/dist/instructions.js.map +1 -0
- package/dist/math.cjs +98 -0
- package/dist/math.cjs.map +1 -0
- package/dist/math.d.cts +58 -0
- package/dist/math.d.ts +58 -0
- package/dist/math.js +85 -0
- package/dist/math.js.map +1 -0
- package/dist/pda.cjs +52 -0
- package/dist/pda.cjs.map +1 -0
- package/dist/pda.d.cts +10 -0
- package/dist/pda.d.ts +10 -0
- package/dist/pda.js +41 -0
- package/dist/pda.js.map +1 -0
- package/dist/transaction.cjs +37 -0
- package/dist/transaction.cjs.map +1 -0
- package/dist/transaction.d.cts +11 -0
- package/dist/transaction.d.ts +11 -0
- package/dist/transaction.js +34 -0
- package/dist/transaction.js.map +1 -0
- package/dist/types.cjs +4 -0
- package/dist/types.cjs.map +1 -0
- package/dist/types.d.cts +153 -0
- package/dist/types.d.ts +153 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +96 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts","../src/pda.ts","../src/idl/hodl.json","../src/program.ts","../src/instructions.ts"],"names":["PublicKey"],"mappings":"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","file":"instructions.js","sourcesContent":["import { PublicKey } from '@solana/web3.js'\nimport BN from 'bn.js'\n\nexport const BPS_DENOMINATOR = 10_000\n\nexport const PROGRAM_ID = new PublicKey('hodLrUfwyK3Z7Td5hdZhyojyznG1rqbHVex11y5s4yG')\nexport const PROTOCOL_AUTHORITY = new PublicKey('EFAquDGAHjkoPB6TGKVibD3BYhbFXNDjuXKpiBHdYzji')\n\nexport const VIRTUAL_SOL = new BN('30000000000')\nexport const TOTAL_SUPPLY = new BN('1000000000000000')\nexport const PROTOCOL_MINT_FEE = new BN('100000000')\nexport const DECIMALS = 6\n\nexport const SEEDS = {\n POOL: Buffer.from('pool'),\n VAULT_AUTHORITY: Buffer.from('vault_authority'),\n SOL_VAULT: Buffer.from('sol_vault'),\n POSITION: Buffer.from('position'),\n PROTOCOL_FEES: Buffer.from('protocol_fees'),\n EVENT_AUTHORITY: Buffer.from('__event_authority'),\n} as const\n\nexport const MAINNET_CONFIG = {\n programId: PROGRAM_ID,\n virtualSol: VIRTUAL_SOL,\n protocolAuthority: PROTOCOL_AUTHORITY,\n protocolMintFee: PROTOCOL_MINT_FEE,\n decimals: DECIMALS,\n totalSupply: TOTAL_SUPPLY,\n} as const\n\nexport const DEVNET_CONFIG = {\n programId: PROGRAM_ID,\n virtualSol: VIRTUAL_SOL,\n protocolAuthority: PROTOCOL_AUTHORITY,\n protocolMintFee: PROTOCOL_MINT_FEE,\n decimals: DECIMALS,\n totalSupply: TOTAL_SUPPLY,\n} as const\n\n/** Trade fee in basis points (25 bps = 0.25%). Only applies after vest_duration has passed. */\nexport const TRADE_FEE_BPS = 25\n\n/** Allowed vest duration modes (in seconds). The program only accepts these values. */\nexport const VEST_DURATION = {\n ONE_MINUTE: 60,\n TEN_MINUTES: 600,\n} as const\n\nexport type VestDuration = typeof VEST_DURATION[keyof typeof VEST_DURATION]\n\nexport const LIMITS = {\n NAME: { min: 1, max: 32 },\n SYMBOL: { min: 1, max: 16 },\n URI: { min: 10, max: 100 },\n DESCRIPTION: { min: 0, max: 200 },\n} as const\n","import { PublicKey } from '@solana/web3.js'\nimport { SEEDS } from './constants'\n\nexport function getPoolStatePDA(mint: PublicKey, programId: PublicKey): [PublicKey, number] {\n return PublicKey.findProgramAddressSync([SEEDS.POOL, mint.toBuffer()], programId)\n}\n\nexport function getVaultAuthorityPDA(poolState: PublicKey, programId: PublicKey): [PublicKey, number] {\n return PublicKey.findProgramAddressSync([SEEDS.VAULT_AUTHORITY, poolState.toBuffer()], programId)\n}\n\nexport function getSolVaultPDA(poolState: PublicKey, programId: PublicKey): [PublicKey, number] {\n return PublicKey.findProgramAddressSync([SEEDS.SOL_VAULT, poolState.toBuffer()], programId)\n}\n\nexport function getPositionPDA(poolState: PublicKey, owner: PublicKey, programId: PublicKey): [PublicKey, number] {\n return PublicKey.findProgramAddressSync([SEEDS.POSITION, poolState.toBuffer(), owner.toBuffer()], programId)\n}\n\nexport function getProtocolFeesPDA(programId: PublicKey): [PublicKey, number] {\n return PublicKey.findProgramAddressSync([SEEDS.PROTOCOL_FEES], programId)\n}\n\nexport function getEventAuthorityPDA(programId: PublicKey): [PublicKey, number] {\n return PublicKey.findProgramAddressSync([SEEDS.EVENT_AUTHORITY], programId)\n}\n","{\n \"address\": \"hodLrUfwyK3Z7Td5hdZhyojyznG1rqbHVex11y5s4yG\",\n \"metadata\": {\n \"name\": \"hodl\",\n \"version\": \"0.1.0\",\n \"spec\": \"0.1.0\"\n },\n \"instructions\": [\n {\n \"name\": \"buy\",\n \"docs\": [\n \"Buy tokens from the vAMM\",\n \"\",\n \"Tokens are split into tradable (immediate) and vaulted (accrue linearly).\",\n \"Allocation is based on token-amount range bands: 40/60 at 0-50M, +5% per 50M band, 100/0 at 600M+.\",\n \"After vest_duration passes, all buys are 100% tradable.\"\n ],\n \"discriminator\": [\n 102,\n 6,\n 61,\n 18,\n 1,\n 218,\n 235,\n 234\n ],\n \"accounts\": [\n {\n \"name\": \"buyer\",\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"pool_state\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 112,\n 111,\n 111,\n 108\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"mint\"\n }\n ]\n }\n },\n {\n \"name\": \"token_vault\",\n \"writable\": true\n },\n {\n \"name\": \"vault_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 118,\n 97,\n 117,\n 108,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"pool_state\"\n }\n ]\n }\n },\n {\n \"name\": \"buyer_token_account\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"account\",\n \"path\": \"buyer\"\n },\n {\n \"kind\": \"const\",\n \"value\": [\n 6,\n 221,\n 246,\n 225,\n 215,\n 101,\n 161,\n 147,\n 217,\n 203,\n 225,\n 70,\n 206,\n 235,\n 121,\n 172,\n 28,\n 180,\n 133,\n 237,\n 95,\n 91,\n 55,\n 145,\n 58,\n 140,\n 245,\n 133,\n 126,\n 255,\n 0,\n 169\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"mint\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"pool_sol_account\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 115,\n 111,\n 108,\n 95,\n 118,\n 97,\n 117,\n 108,\n 116\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"pool_state\"\n }\n ]\n }\n },\n {\n \"name\": \"mint\"\n },\n {\n \"name\": \"token_program\",\n \"address\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\"\n },\n {\n \"name\": \"associated_token_program\",\n \"address\": \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\"\n },\n {\n \"name\": \"system_program\",\n \"address\": \"11111111111111111111111111111111\"\n },\n {\n \"name\": \"position\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 112,\n 111,\n 115,\n 105,\n 116,\n 105,\n 111,\n 110\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"pool_state\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"buyer\"\n }\n ]\n }\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"sol_amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"min_tokens_out\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"claim_accrued\",\n \"docs\": [\n \"Claim accrued tokens\",\n \"Transfers tokens that have accrued from vaulted to tradable from vault to wallet\"\n ],\n \"discriminator\": [\n 209,\n 92,\n 30,\n 216,\n 89,\n 249,\n 122,\n 243\n ],\n \"accounts\": [\n {\n \"name\": \"owner\",\n \"signer\": true\n },\n {\n \"name\": \"pool_state\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 112,\n 111,\n 111,\n 108\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"pool_state.mint\",\n \"account\": \"PoolState\"\n }\n ]\n }\n },\n {\n \"name\": \"position\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 112,\n 111,\n 115,\n 105,\n 116,\n 105,\n 111,\n 110\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"pool_state\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"owner\"\n }\n ]\n }\n },\n {\n \"name\": \"token_vault\",\n \"writable\": true\n },\n {\n \"name\": \"vault_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 118,\n 97,\n 117,\n 108,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"pool_state\"\n }\n ]\n }\n },\n {\n \"name\": \"user_token_account\",\n \"writable\": true\n },\n {\n \"name\": \"token_program\",\n \"address\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\"\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"close_position\",\n \"docs\": [\n \"Close an empty position account and reclaim rent\"\n ],\n \"discriminator\": [\n 123,\n 134,\n 81,\n 0,\n 49,\n 68,\n 98,\n 98\n ],\n \"accounts\": [\n {\n \"name\": \"owner\",\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"pool_state\",\n \"writable\": true\n },\n {\n \"name\": \"position\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 112,\n 111,\n 115,\n 105,\n 116,\n 105,\n 111,\n 110\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"pool_state\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"owner\"\n }\n ]\n }\n },\n {\n \"name\": \"user_token_account\",\n \"writable\": true\n },\n {\n \"name\": \"mint\"\n },\n {\n \"name\": \"token_program\",\n \"address\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\"\n },\n {\n \"name\": \"system_program\",\n \"address\": \"11111111111111111111111111111111\"\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"create_token\",\n \"docs\": [\n \"Create a new token and initialize vAMM pool\"\n ],\n \"discriminator\": [\n 84,\n 52,\n 204,\n 228,\n 24,\n 140,\n 234,\n 75\n ],\n \"accounts\": [\n {\n \"name\": \"creator\",\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"protocol_authority\"\n },\n {\n \"name\": \"mint\",\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"pool_state\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 112,\n 111,\n 111,\n 108\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"mint\"\n }\n ]\n }\n },\n {\n \"name\": \"token_vault\",\n \"writable\": true\n },\n {\n \"name\": \"vault_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 118,\n 97,\n 117,\n 108,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"pool_state\"\n }\n ]\n }\n },\n {\n \"name\": \"metadata\",\n \"writable\": true\n },\n {\n \"name\": \"pool_sol_account\",\n \"writable\": true\n },\n {\n \"name\": \"protocol_fee_wallet\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 112,\n 114,\n 111,\n 116,\n 111,\n 99,\n 111,\n 108,\n 95,\n 102,\n 101,\n 101,\n 115\n ]\n }\n ]\n }\n },\n {\n \"name\": \"token_program\",\n \"address\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\"\n },\n {\n \"name\": \"associated_token_program\",\n \"address\": \"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\"\n },\n {\n \"name\": \"system_program\",\n \"address\": \"11111111111111111111111111111111\"\n },\n {\n \"name\": \"rent\",\n \"address\": \"SysvarRent111111111111111111111111111111111\"\n },\n {\n \"name\": \"metadata_program\"\n },\n {\n \"name\": \"sysvar_instructions\"\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"name\",\n \"type\": \"string\"\n },\n {\n \"name\": \"symbol\",\n \"type\": \"string\"\n },\n {\n \"name\": \"uri\",\n \"type\": \"string\"\n },\n {\n \"name\": \"pool_description\",\n \"type\": \"string\"\n },\n {\n \"name\": \"vest_duration\",\n \"type\": \"i64\"\n }\n ]\n },\n {\n \"name\": \"emergency_withdraw_sol\",\n \"docs\": [\n \"Emergency withdraw SOL from a pool's sol_vault\"\n ],\n \"discriminator\": [\n 219,\n 156,\n 123,\n 176,\n 91,\n 105,\n 30,\n 160\n ],\n \"accounts\": [\n {\n \"name\": \"authority\",\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"pool_state\"\n },\n {\n \"name\": \"sol_vault\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 115,\n 111,\n 108,\n 95,\n 118,\n 97,\n 117,\n 108,\n 116\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"pool_state\"\n }\n ]\n }\n },\n {\n \"name\": \"system_program\",\n \"address\": \"11111111111111111111111111111111\"\n }\n ],\n \"args\": [\n {\n \"name\": \"amount\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"sell\",\n \"docs\": [\n \"Sell tokens back to the vAMM\",\n \"If sell_percentage is provided, it overrides token_amount\"\n ],\n \"discriminator\": [\n 51,\n 230,\n 133,\n 164,\n 1,\n 127,\n 131,\n 173\n ],\n \"accounts\": [\n {\n \"name\": \"seller\",\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"pool_state\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 112,\n 111,\n 111,\n 108\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"mint\"\n }\n ]\n }\n },\n {\n \"name\": \"position\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 112,\n 111,\n 115,\n 105,\n 116,\n 105,\n 111,\n 110\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"pool_state\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"seller\"\n }\n ]\n }\n },\n {\n \"name\": \"token_vault\",\n \"writable\": true\n },\n {\n \"name\": \"vault_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 118,\n 97,\n 117,\n 108,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"pool_state\"\n }\n ]\n }\n },\n {\n \"name\": \"seller_token_account\",\n \"writable\": true\n },\n {\n \"name\": \"pool_sol_account\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 115,\n 111,\n 108,\n 95,\n 118,\n 97,\n 117,\n 108,\n 116\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"pool_state\"\n }\n ]\n }\n },\n {\n \"name\": \"mint\"\n },\n {\n \"name\": \"token_program\",\n \"address\": \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\"\n },\n {\n \"name\": \"system_program\",\n \"address\": \"11111111111111111111111111111111\"\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"token_amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"min_sol_out\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"sell_percentage\",\n \"type\": {\n \"option\": \"u8\"\n }\n }\n ]\n },\n {\n \"name\": \"withdraw_protocol_fees\",\n \"docs\": [\n \"Withdraw accumulated protocol fees\"\n ],\n \"discriminator\": [\n 11,\n 68,\n 165,\n 98,\n 18,\n 208,\n 134,\n 73\n ],\n \"accounts\": [\n {\n \"name\": \"authority\",\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"protocol_fee_wallet\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 112,\n 114,\n 111,\n 116,\n 111,\n 99,\n 111,\n 108,\n 95,\n 102,\n 101,\n 101,\n 115\n ]\n }\n ]\n }\n },\n {\n \"name\": \"system_program\",\n \"address\": \"11111111111111111111111111111111\"\n }\n ],\n \"args\": [\n {\n \"name\": \"amount\",\n \"type\": \"u64\"\n }\n ]\n }\n ],\n \"accounts\": [\n {\n \"name\": \"PoolState\",\n \"discriminator\": [\n 247,\n 237,\n 227,\n 245,\n 215,\n 195,\n 222,\n 70\n ]\n },\n {\n \"name\": \"Position\",\n \"discriminator\": [\n 170,\n 188,\n 143,\n 228,\n 122,\n 64,\n 247,\n 208\n ]\n }\n ],\n \"events\": [\n {\n \"name\": \"AccrualClaimed\",\n \"discriminator\": [\n 86,\n 99,\n 51,\n 211,\n 226,\n 48,\n 235,\n 238\n ]\n },\n {\n \"name\": \"PositionClosed\",\n \"discriminator\": [\n 157,\n 163,\n 227,\n 228,\n 13,\n 97,\n 138,\n 121\n ]\n },\n {\n \"name\": \"TokenCreated\",\n \"discriminator\": [\n 236,\n 19,\n 41,\n 255,\n 130,\n 78,\n 147,\n 172\n ]\n },\n {\n \"name\": \"TokenPurchased\",\n \"discriminator\": [\n 3,\n 73,\n 186,\n 50,\n 15,\n 181,\n 213,\n 37\n ]\n },\n {\n \"name\": \"TokenSold\",\n \"discriminator\": [\n 88,\n 61,\n 1,\n 247,\n 185,\n 6,\n 252,\n 86\n ]\n }\n ],\n \"errors\": [\n {\n \"code\": 7005,\n \"name\": \"InsufficientTokens\",\n \"msg\": \"Insufficient token reserves in vault\"\n },\n {\n \"code\": 7100,\n \"name\": \"ArithmeticOverflow\",\n \"msg\": \"Arithmetic overflow\"\n },\n {\n \"code\": 7102,\n \"name\": \"DivisionError\",\n \"msg\": \"Division by zero or invalid division\"\n },\n {\n \"code\": 7104,\n \"name\": \"TokenOverflow\",\n \"msg\": \"Token calculation overflow\"\n },\n {\n \"code\": 7105,\n \"name\": \"TokenUnderflow\",\n \"msg\": \"Token calculation underflow\"\n },\n {\n \"code\": 7200,\n \"name\": \"SlippageExceeded\",\n \"msg\": \"Slippage exceeded: output below minimum threshold\"\n },\n {\n \"code\": 7312,\n \"name\": \"AccrualCalculationOverflow\",\n \"msg\": \"Accrual calculation overflow\"\n },\n {\n \"code\": 7315,\n \"name\": \"PositionNotEmpty\",\n \"msg\": \"Position is not empty, must sell all tokens first\"\n },\n {\n \"code\": 7319,\n \"name\": \"InvalidProtocolAuthority\",\n \"msg\": \"Invalid protocol authority - must match PROTOCOL_AUTHORITY constant\"\n },\n {\n \"code\": 7321,\n \"name\": \"MustHaveUnlockedPortion\",\n \"msg\": \"Position must have tokens to perform this operation\"\n },\n {\n \"code\": 7500,\n \"name\": \"PositionNotOwnedBySigner\",\n \"msg\": \"Position not owned by signer\"\n },\n {\n \"code\": 7505,\n \"name\": \"InvalidSolVaultPDA\",\n \"msg\": \"SOL vault PDA derivation mismatch\"\n },\n {\n \"code\": 7601,\n \"name\": \"InvalidVestingType\",\n \"msg\": \"Invalid vesting type\"\n },\n {\n \"code\": 7604,\n \"name\": \"InvalidPercentage\",\n \"msg\": \"Invalid percentage value (must be 0-100)\"\n },\n {\n \"code\": 7901,\n \"name\": \"NotAuthorized\",\n \"msg\": \"Not authorized\"\n },\n {\n \"code\": 8014,\n \"name\": \"InsufficientLiquidity\",\n \"msg\": \"Insufficient liquidity\"\n },\n {\n \"code\": 8018,\n \"name\": \"VammNotActive\",\n \"msg\": \"vAMM is not active\"\n },\n {\n \"code\": 8020,\n \"name\": \"InvalidAmount\",\n \"msg\": \"Invalid amount\"\n }\n ],\n \"types\": [\n {\n \"name\": \"AccrualClaimed\",\n \"docs\": [\n \"Event emitted when accrued tokens are claimed\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"owner\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"position\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"tokens_claimed\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"new_tradable_tokens\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"remaining_vaulted_tokens\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"tokens_transferred\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"initial_vaulted\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"timestamp\",\n \"type\": \"i64\"\n }\n ]\n }\n },\n {\n \"name\": \"PoolMetadata\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"name\",\n \"docs\": [\n \"Optional pool name\"\n ],\n \"type\": \"string\"\n },\n {\n \"name\": \"description\",\n \"docs\": [\n \"Optional pool description\"\n ],\n \"type\": \"string\"\n },\n {\n \"name\": \"version\",\n \"docs\": [\n \"Pool version\"\n ],\n \"type\": \"u8\"\n }\n ]\n }\n },\n {\n \"name\": \"PoolState\",\n \"docs\": [\n \"Pool state account - main state for a vAMM pool\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"authority\",\n \"docs\": [\n \"Pool authority (creator)\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"mint\",\n \"docs\": [\n \"Token mint for this pool\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"token_vault\",\n \"docs\": [\n \"Token vault (holds unsold tokens)\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"vault_authority\",\n \"docs\": [\n \"Vault authority (PDA)\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"sol_vault\",\n \"docs\": [\n \"Pool SOL vault (holds raised SOL)\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"total_positions\",\n \"docs\": [\n \"Total number of positions in this pool\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"creation_timestamp\",\n \"docs\": [\n \"Pool creation timestamp (Unix timestamp)\"\n ],\n \"type\": \"i64\"\n },\n {\n \"name\": \"last_update_timestamp\",\n \"docs\": [\n \"Last update timestamp (Unix timestamp)\"\n ],\n \"type\": \"i64\"\n },\n {\n \"name\": \"metadata\",\n \"docs\": [\n \"Pool metadata\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"PoolMetadata\"\n }\n }\n },\n {\n \"name\": \"vest_duration\",\n \"docs\": [\n \"=== ACCRUAL SYSTEM FIELDS ===\",\n \"Dev-set unlock duration in seconds (applies to all traders)\"\n ],\n \"type\": \"i64\"\n },\n {\n \"name\": \"next_position_number\",\n \"docs\": [\n \"Next position number to assign (sequential counter for display/identity)\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"vamm_active\",\n \"docs\": [\n \"=== VAMM STATE ===\",\n \"vAMM is active for trading\"\n ],\n \"type\": \"bool\"\n },\n {\n \"name\": \"vamm_real_sol\",\n \"docs\": [\n \"Real SOL in the vAMM\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"vamm_tokens\",\n \"docs\": [\n \"Real tokens in the vAMM\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"vamm_k\",\n \"docs\": [\n \"The invariant k (set at creation, never changes)\",\n \"k = (vamm_real_sol + VIRTUAL_SOL) * vamm_tokens\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"tokens_sold\",\n \"docs\": [\n \"Cumulative tokens bought from vAMM (increases on buy, decreases on sell)\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"tokens_reserved_for_claims\",\n \"docs\": [\n \"Vault tokens reserved for position claims (not available for vAMM liquidity)\",\n \"Incremented on buy (vaulted portion), decremented on claim_accrued\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"bump_vault_auth\",\n \"docs\": [\n \"Bump seeds for PDAs\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"bump_pool\",\n \"type\": \"u8\"\n }\n ]\n }\n },\n {\n \"name\": \"Position\",\n \"docs\": [\n \"Position in a vAMM pool\",\n \"Tokens split into tradable (immediate) and vaulted (accrue linearly over vest_duration)\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"owner\",\n \"docs\": [\n \"Owner's public key\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 32\n ]\n }\n },\n {\n \"name\": \"pool\",\n \"docs\": [\n \"Pool this position belongs to\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 32\n ]\n }\n },\n {\n \"name\": \"tradable_tokens\",\n \"docs\": [\n \"Tradable tokens (can be sold immediately)\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"vaulted_tokens\",\n \"docs\": [\n \"Vaulted tokens (accruing linearly to tradable)\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"sol_spent\",\n \"docs\": [\n \"SOL spent on this position\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"tokens_transferred\",\n \"docs\": [\n \"Cumulative tokens transferred to wallet (for claim_accrued tracking)\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"entry_timestamp\",\n \"docs\": [\n \"Entry timestamp (for accrual calculation)\"\n ],\n \"type\": \"i64\"\n },\n {\n \"name\": \"initial_vaulted\",\n \"docs\": [\n \"Cumulative initial vaulted tokens from all buys (for accrual calculation)\",\n \"This tracks the total vaulted amount at buy time, used to calculate accrual progress\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"position_number\",\n \"docs\": [\n \"Position number in the pool (sequential counter for display/identity)\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"last_update_timestamp\",\n \"docs\": [\n \"Last update timestamp\"\n ],\n \"type\": \"i64\"\n }\n ]\n }\n },\n {\n \"name\": \"PositionClosed\",\n \"docs\": [\n \"Event emitted when a position account is closed\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"owner\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"position\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"rent_reclaimed\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"timestamp\",\n \"type\": \"i64\"\n }\n ]\n }\n },\n {\n \"name\": \"TokenCreated\",\n \"docs\": [\n \"Event emitted when a new token and vAMM pool is created\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"mint\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"creator\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"name\",\n \"type\": \"string\"\n },\n {\n \"name\": \"symbol\",\n \"type\": \"string\"\n },\n {\n \"name\": \"total_supply\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"initial_k\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"vamm_tokens\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"vest_duration\",\n \"type\": \"i64\"\n },\n {\n \"name\": \"creation_timestamp\",\n \"type\": \"i64\"\n }\n ]\n }\n },\n {\n \"name\": \"TokenPurchased\",\n \"docs\": [\n \"Event emitted when tokens are bought\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"buyer\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"mint\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"sol_amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"tokens_received\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"vamm_real_sol\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"vamm_tokens\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"tokens_sold\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"position\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"position_number\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"vest_duration\",\n \"type\": \"i64\"\n },\n {\n \"name\": \"unlock_time_seconds\",\n \"type\": \"i64\"\n },\n {\n \"name\": \"tradable_tokens\",\n \"docs\": [\n \"Position state after buy\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"vaulted_tokens\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"sol_spent\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"tokens_transferred\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"initial_vaulted\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"timestamp\",\n \"type\": \"i64\"\n }\n ]\n }\n },\n {\n \"name\": \"TokenSold\",\n \"docs\": [\n \"Event emitted when tokens are sold\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"seller\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"mint\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"token_amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"sol_received\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"vamm_real_sol\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"vamm_tokens\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"tokens_sold\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"position\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"position_number\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"vest_duration\",\n \"type\": \"i64\"\n },\n {\n \"name\": \"unlock_time_seconds\",\n \"type\": \"i64\"\n },\n {\n \"name\": \"tradable_tokens\",\n \"docs\": [\n \"Position state after sell\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"vaulted_tokens\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"sol_spent\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"tokens_transferred\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"initial_vaulted\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"timestamp\",\n \"type\": \"i64\"\n }\n ]\n }\n }\n ]\n}","import { Connection, PublicKey } from '@solana/web3.js'\nimport { Program, AnchorProvider } from '@coral-xyz/anchor'\nimport type { Hodl } from './idl/hodl'\nimport IDL from './idl/hodl.json'\n\nconst DUMMY_WALLET = {\n publicKey: PublicKey.default,\n signTransaction: async <T>(tx: T): Promise<T> => tx,\n signAllTransactions: async <T>(txs: T[]): Promise<T[]> => txs,\n}\n\nexport function getProgram(connection: Connection): Program<Hodl> {\n const provider = new AnchorProvider(connection, DUMMY_WALLET as any, { commitment: 'confirmed' })\n return new Program<Hodl>(IDL as unknown as Hodl, provider)\n}\n","import {\n Connection,\n PublicKey,\n TransactionInstruction,\n SystemProgram,\n SYSVAR_RENT_PUBKEY,\n SYSVAR_INSTRUCTIONS_PUBKEY,\n} from '@solana/web3.js'\nimport { getAssociatedTokenAddressSync, TOKEN_PROGRAM_ID, ASSOCIATED_TOKEN_PROGRAM_ID } from '@solana/spl-token'\nimport type { SdkConfig, BuyParams, SellParams, CreateTokenParams } from './types'\n\nimport {\n getPoolStatePDA,\n getVaultAuthorityPDA,\n getSolVaultPDA,\n getPositionPDA,\n getEventAuthorityPDA,\n getProtocolFeesPDA,\n} from './pda'\nimport { getProgram } from './program'\n\nconst METADATA_PROGRAM_ID = new PublicKey('metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s')\n\nfunction getMetadataPDA(mint: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from('metadata'), METADATA_PROGRAM_ID.toBuffer(), mint.toBuffer()],\n METADATA_PROGRAM_ID,\n )\n return pda\n}\n\nexport async function buildBuyInstruction(params: BuyParams & {\n buyer: PublicKey\n mint: PublicKey\n connection: Connection\n config: SdkConfig\n}): Promise<TransactionInstruction> {\n const { buyer, mint, solAmount, minTokensOut, connection, config } = params\n const program = getProgram(connection)\n\n const [poolState] = getPoolStatePDA(mint, config.programId)\n const [vaultAuthority] = getVaultAuthorityPDA(poolState, config.programId)\n const tokenVault = getAssociatedTokenAddressSync(mint, vaultAuthority, true)\n const buyerTokenAccount = getAssociatedTokenAddressSync(mint, buyer)\n const [poolSolAccount] = getSolVaultPDA(poolState, config.programId)\n const [position] = getPositionPDA(poolState, buyer, config.programId)\n const [eventAuthority] = getEventAuthorityPDA(config.programId)\n\n return program.methods\n .buy(solAmount, minTokensOut)\n .accountsPartial({\n buyer,\n poolState,\n tokenVault,\n vaultAuthority,\n buyerTokenAccount,\n poolSolAccount,\n mint,\n tokenProgram: TOKEN_PROGRAM_ID,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n position,\n eventAuthority,\n program: config.programId,\n })\n .instruction()\n}\n\nexport async function buildSellInstruction(params: SellParams & {\n seller: PublicKey\n mint: PublicKey\n connection: Connection\n config: SdkConfig\n}): Promise<TransactionInstruction> {\n const { seller, mint, tokenAmount, minSolOut, sellPercentage, connection, config } = params\n const program = getProgram(connection)\n\n const [poolState] = getPoolStatePDA(mint, config.programId)\n const [vaultAuthority] = getVaultAuthorityPDA(poolState, config.programId)\n const tokenVault = getAssociatedTokenAddressSync(mint, vaultAuthority, true)\n const sellerTokenAccount = getAssociatedTokenAddressSync(mint, seller)\n const [poolSolAccount] = getSolVaultPDA(poolState, config.programId)\n const [position] = getPositionPDA(poolState, seller, config.programId)\n const [eventAuthority] = getEventAuthorityPDA(config.programId)\n\n return program.methods\n .sell(tokenAmount, minSolOut, sellPercentage ?? null)\n .accountsPartial({\n seller,\n poolState,\n position,\n tokenVault,\n vaultAuthority,\n sellerTokenAccount,\n poolSolAccount,\n mint,\n tokenProgram: TOKEN_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n eventAuthority,\n program: config.programId,\n })\n .instruction()\n}\n\nexport async function buildCreateTokenInstruction(params: CreateTokenParams & {\n creator: PublicKey\n mint: PublicKey\n connection: Connection\n config: SdkConfig\n}): Promise<TransactionInstruction> {\n const { creator, mint, name, symbol, uri, poolDescription, vestDuration, connection, config } = params\n const program = getProgram(connection)\n\n const [poolState] = getPoolStatePDA(mint, config.programId)\n const [vaultAuthority] = getVaultAuthorityPDA(poolState, config.programId)\n const tokenVault = getAssociatedTokenAddressSync(mint, vaultAuthority, true)\n const metadata = getMetadataPDA(mint)\n const [poolSolAccount] = getSolVaultPDA(poolState, config.programId)\n const [protocolFeeWallet] = getProtocolFeesPDA(config.programId)\n const [eventAuthority] = getEventAuthorityPDA(config.programId)\n\n return program.methods\n .createToken(name, symbol, uri, poolDescription, vestDuration)\n .accountsPartial({\n creator,\n protocolAuthority: config.protocolAuthority,\n mint,\n poolState,\n tokenVault,\n vaultAuthority,\n metadata,\n poolSolAccount,\n protocolFeeWallet,\n tokenProgram: TOKEN_PROGRAM_ID,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n rent: SYSVAR_RENT_PUBKEY,\n metadataProgram: METADATA_PROGRAM_ID,\n sysvarInstructions: SYSVAR_INSTRUCTIONS_PUBKEY,\n eventAuthority,\n program: config.programId,\n })\n .instruction()\n}\n\nexport async function buildClaimAccruedInstruction(params: {\n owner: PublicKey\n poolState: PublicKey\n connection: Connection\n config: SdkConfig\n}): Promise<TransactionInstruction> {\n const { owner, poolState, connection, config } = params\n const program = getProgram(connection)\n\n // Fetch pool state to get mint — needed for token vault and user ATA derivation\n const poolData = await program.account.poolState.fetch(poolState)\n const mint = poolData.mint\n\n const [vaultAuthority] = getVaultAuthorityPDA(poolState, config.programId)\n const tokenVault = getAssociatedTokenAddressSync(mint, vaultAuthority, true)\n const userTokenAccount = getAssociatedTokenAddressSync(mint, owner)\n const [position] = getPositionPDA(poolState, owner, config.programId)\n const [eventAuthority] = getEventAuthorityPDA(config.programId)\n\n return program.methods\n .claimAccrued()\n .accountsPartial({\n owner,\n poolState,\n position,\n tokenVault,\n vaultAuthority,\n userTokenAccount,\n tokenProgram: TOKEN_PROGRAM_ID,\n eventAuthority,\n program: config.programId,\n })\n .instruction()\n}\n\nexport async function buildClosePositionInstruction(params: {\n owner: PublicKey\n poolState: PublicKey\n mint: PublicKey\n userTokenAccount: PublicKey\n connection: Connection\n config: SdkConfig\n}): Promise<TransactionInstruction> {\n const { owner, poolState, mint, userTokenAccount, connection, config } = params\n const program = getProgram(connection)\n\n const [position] = getPositionPDA(poolState, owner, config.programId)\n const [eventAuthority] = getEventAuthorityPDA(config.programId)\n\n return program.methods\n .closePosition()\n .accountsPartial({\n owner,\n poolState,\n position,\n userTokenAccount,\n mint,\n tokenProgram: TOKEN_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n eventAuthority,\n program: config.programId,\n })\n .instruction()\n}\n"]}
|
package/dist/math.cjs
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var BN2 = require('bn.js');
|
|
4
|
+
var web3_js = require('@solana/web3.js');
|
|
5
|
+
|
|
6
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
7
|
+
|
|
8
|
+
var BN2__default = /*#__PURE__*/_interopDefault(BN2);
|
|
9
|
+
|
|
10
|
+
// src/math.ts
|
|
11
|
+
new web3_js.PublicKey("hodLrUfwyK3Z7Td5hdZhyojyznG1rqbHVex11y5s4yG");
|
|
12
|
+
new web3_js.PublicKey("EFAquDGAHjkoPB6TGKVibD3BYhbFXNDjuXKpiBHdYzji");
|
|
13
|
+
var VIRTUAL_SOL = new BN2__default.default("30000000000");
|
|
14
|
+
new BN2__default.default("1000000000000000");
|
|
15
|
+
new BN2__default.default("100000000");
|
|
16
|
+
({
|
|
17
|
+
POOL: Buffer.from("pool"),
|
|
18
|
+
VAULT_AUTHORITY: Buffer.from("vault_authority"),
|
|
19
|
+
SOL_VAULT: Buffer.from("sol_vault"),
|
|
20
|
+
POSITION: Buffer.from("position"),
|
|
21
|
+
PROTOCOL_FEES: Buffer.from("protocol_fees"),
|
|
22
|
+
EVENT_AUTHORITY: Buffer.from("__event_authority")
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
// src/math.ts
|
|
26
|
+
var ZERO = new BN2__default.default(0);
|
|
27
|
+
var BPS = new BN2__default.default(1e4);
|
|
28
|
+
var BASE_TRADABLE_PCT = 40;
|
|
29
|
+
var PCT_PER_BAND = 5;
|
|
30
|
+
var BAND_SIZE = new BN2__default.default("50000000000000");
|
|
31
|
+
var MAX_TRADABLE_PCT = 100;
|
|
32
|
+
function calculateBuyAmount(solIn, vammRealSol, vammTokens, vammK) {
|
|
33
|
+
if (solIn.isZero() || solIn.isNeg()) return ZERO;
|
|
34
|
+
const currentSolSide = vammRealSol.add(VIRTUAL_SOL);
|
|
35
|
+
const newSolSide = currentSolSide.add(solIn);
|
|
36
|
+
const newTokenSide = vammK.div(newSolSide);
|
|
37
|
+
return vammTokens.sub(newTokenSide);
|
|
38
|
+
}
|
|
39
|
+
function calculateSellAmount(tokensIn, vammRealSol, vammTokens, vammK) {
|
|
40
|
+
if (tokensIn.isZero() || tokensIn.isNeg()) return ZERO;
|
|
41
|
+
const newTokenSide = vammTokens.add(tokensIn);
|
|
42
|
+
const newRealSol = vammK.div(newTokenSide).sub(VIRTUAL_SOL);
|
|
43
|
+
return vammRealSol.sub(newRealSol);
|
|
44
|
+
}
|
|
45
|
+
function calculateSolForExactTokens(tokensOut, vammRealSol, vammTokens, vammK) {
|
|
46
|
+
if (tokensOut.isZero() || tokensOut.isNeg()) return ZERO;
|
|
47
|
+
if (tokensOut.gte(vammTokens)) throw new Error("tokensOut exceeds available vAMM liquidity");
|
|
48
|
+
const newTokenSide = vammTokens.sub(tokensOut);
|
|
49
|
+
const newSolSide = vammK.div(newTokenSide);
|
|
50
|
+
const currentSolSide = vammRealSol.add(VIRTUAL_SOL);
|
|
51
|
+
return newSolSide.sub(currentSolSide);
|
|
52
|
+
}
|
|
53
|
+
function applySlippage(amount, slippageBps) {
|
|
54
|
+
return amount.mul(new BN2__default.default(1e4 - slippageBps)).div(BPS);
|
|
55
|
+
}
|
|
56
|
+
function calculateTradableVaultedSplit(tokensOut, tokensSold, bandSize = BAND_SIZE) {
|
|
57
|
+
if (tokensOut.isZero()) return { tradable: ZERO, vaulted: ZERO, tradablePct: 0 };
|
|
58
|
+
const bandIndex = bandSize.isZero() ? 0 : tokensSold.div(bandSize).toNumber();
|
|
59
|
+
const tradablePct = Math.min(BASE_TRADABLE_PCT + PCT_PER_BAND * bandIndex, MAX_TRADABLE_PCT);
|
|
60
|
+
const tradable = tokensOut.mul(new BN2__default.default(tradablePct)).div(new BN2__default.default(100));
|
|
61
|
+
const vaulted = tokensOut.sub(tradable);
|
|
62
|
+
return { tradable, vaulted, tradablePct };
|
|
63
|
+
}
|
|
64
|
+
function calculateAccruedTokens(initialVaulted, tokensTransferred, entryTimestamp, vestDuration, currentTimestamp) {
|
|
65
|
+
if (initialVaulted.isZero()) return ZERO;
|
|
66
|
+
const remaining = initialVaulted.sub(tokensTransferred);
|
|
67
|
+
if (vestDuration.isZero()) return remaining;
|
|
68
|
+
const elapsed = currentTimestamp.sub(entryTimestamp);
|
|
69
|
+
if (elapsed.isNeg()) return ZERO;
|
|
70
|
+
if (elapsed.gte(vestDuration)) return remaining;
|
|
71
|
+
const totalAccrued = initialVaulted.mul(elapsed).div(vestDuration);
|
|
72
|
+
const claimable = totalAccrued.sub(tokensTransferred);
|
|
73
|
+
return claimable.isNeg() ? ZERO : claimable;
|
|
74
|
+
}
|
|
75
|
+
function calculateSpotPrice(vammRealSol, vammTokens) {
|
|
76
|
+
if (vammTokens.isZero()) return ZERO;
|
|
77
|
+
return vammRealSol.add(VIRTUAL_SOL).mul(new BN2__default.default(1e6)).div(vammTokens);
|
|
78
|
+
}
|
|
79
|
+
function calculatePriceImpact(solIn, tokensOut, vammRealSol, vammTokens) {
|
|
80
|
+
if (solIn.isZero() || tokensOut.isZero() || vammTokens.isZero()) return 0;
|
|
81
|
+
const solSide = vammRealSol.add(VIRTUAL_SOL);
|
|
82
|
+
const numerator = solIn.mul(vammTokens).mul(BPS);
|
|
83
|
+
const denominator = tokensOut.mul(solSide);
|
|
84
|
+
if (denominator.isZero()) return 0;
|
|
85
|
+
const ratioBps = numerator.div(denominator);
|
|
86
|
+
return ratioBps.sub(BPS).toNumber();
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
exports.applySlippage = applySlippage;
|
|
90
|
+
exports.calculateAccruedTokens = calculateAccruedTokens;
|
|
91
|
+
exports.calculateBuyAmount = calculateBuyAmount;
|
|
92
|
+
exports.calculatePriceImpact = calculatePriceImpact;
|
|
93
|
+
exports.calculateSellAmount = calculateSellAmount;
|
|
94
|
+
exports.calculateSolForExactTokens = calculateSolForExactTokens;
|
|
95
|
+
exports.calculateSpotPrice = calculateSpotPrice;
|
|
96
|
+
exports.calculateTradableVaultedSplit = calculateTradableVaultedSplit;
|
|
97
|
+
//# sourceMappingURL=math.cjs.map
|
|
98
|
+
//# sourceMappingURL=math.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts","../src/math.ts"],"names":["PublicKey","BN"],"mappings":"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","file":"math.cjs","sourcesContent":["import { PublicKey } from '@solana/web3.js'\nimport BN from 'bn.js'\n\nexport const BPS_DENOMINATOR = 10_000\n\nexport const PROGRAM_ID = new PublicKey('hodLrUfwyK3Z7Td5hdZhyojyznG1rqbHVex11y5s4yG')\nexport const PROTOCOL_AUTHORITY = new PublicKey('EFAquDGAHjkoPB6TGKVibD3BYhbFXNDjuXKpiBHdYzji')\n\nexport const VIRTUAL_SOL = new BN('30000000000')\nexport const TOTAL_SUPPLY = new BN('1000000000000000')\nexport const PROTOCOL_MINT_FEE = new BN('100000000')\nexport const DECIMALS = 6\n\nexport const SEEDS = {\n POOL: Buffer.from('pool'),\n VAULT_AUTHORITY: Buffer.from('vault_authority'),\n SOL_VAULT: Buffer.from('sol_vault'),\n POSITION: Buffer.from('position'),\n PROTOCOL_FEES: Buffer.from('protocol_fees'),\n EVENT_AUTHORITY: Buffer.from('__event_authority'),\n} as const\n\nexport const MAINNET_CONFIG = {\n programId: PROGRAM_ID,\n virtualSol: VIRTUAL_SOL,\n protocolAuthority: PROTOCOL_AUTHORITY,\n protocolMintFee: PROTOCOL_MINT_FEE,\n decimals: DECIMALS,\n totalSupply: TOTAL_SUPPLY,\n} as const\n\nexport const DEVNET_CONFIG = {\n programId: PROGRAM_ID,\n virtualSol: VIRTUAL_SOL,\n protocolAuthority: PROTOCOL_AUTHORITY,\n protocolMintFee: PROTOCOL_MINT_FEE,\n decimals: DECIMALS,\n totalSupply: TOTAL_SUPPLY,\n} as const\n\n/** Trade fee in basis points (25 bps = 0.25%). Only applies after vest_duration has passed. */\nexport const TRADE_FEE_BPS = 25\n\n/** Allowed vest duration modes (in seconds). The program only accepts these values. */\nexport const VEST_DURATION = {\n ONE_MINUTE: 60,\n TEN_MINUTES: 600,\n} as const\n\nexport type VestDuration = typeof VEST_DURATION[keyof typeof VEST_DURATION]\n\nexport const LIMITS = {\n NAME: { min: 1, max: 32 },\n SYMBOL: { min: 1, max: 16 },\n URI: { min: 10, max: 100 },\n DESCRIPTION: { min: 0, max: 200 },\n} as const\n","import BN from 'bn.js'\nimport { VIRTUAL_SOL } from './constants'\n\nconst ZERO = new BN(0)\nconst BPS = new BN(10_000)\n\n// Band logic from the program:\n// 40% tradable at 0-50M tokens sold, +5% per 50M band, 100% at 600M+\nconst BASE_TRADABLE_PCT = 40\nconst PCT_PER_BAND = 5\nconst BAND_SIZE = new BN('50000000000000') // 50M tokens × 10^6 decimals\nconst MAX_TRADABLE_PCT = 100\n\n/**\n * Calculate tokens out for a given SOL input using the vAMM constant product formula.\n * k = (vammRealSol + VIRTUAL_SOL) * vammTokens\n */\nexport function calculateBuyAmount(\n solIn: BN,\n vammRealSol: BN,\n vammTokens: BN,\n vammK: BN,\n): BN {\n if (solIn.isZero() || solIn.isNeg()) return ZERO\n const currentSolSide = vammRealSol.add(VIRTUAL_SOL)\n const newSolSide = currentSolSide.add(solIn)\n const newTokenSide = vammK.div(newSolSide)\n return vammTokens.sub(newTokenSide)\n}\n\n/**\n * Calculate SOL out for a given token input.\n */\nexport function calculateSellAmount(\n tokensIn: BN,\n vammRealSol: BN,\n vammTokens: BN,\n vammK: BN,\n): BN {\n if (tokensIn.isZero() || tokensIn.isNeg()) return ZERO\n const newTokenSide = vammTokens.add(tokensIn)\n const newRealSol = vammK.div(newTokenSide).sub(VIRTUAL_SOL)\n return vammRealSol.sub(newRealSol)\n}\n\n/**\n * Calculate SOL required to buy an exact number of tokens.\n * Inverse of calculateBuyAmount.\n */\nexport function calculateSolForExactTokens(\n tokensOut: BN,\n vammRealSol: BN,\n vammTokens: BN,\n vammK: BN,\n): BN {\n if (tokensOut.isZero() || tokensOut.isNeg()) return ZERO\n if (tokensOut.gte(vammTokens)) throw new Error('tokensOut exceeds available vAMM liquidity')\n const newTokenSide = vammTokens.sub(tokensOut)\n const newSolSide = vammK.div(newTokenSide)\n const currentSolSide = vammRealSol.add(VIRTUAL_SOL)\n return newSolSide.sub(currentSolSide)\n}\n\n/**\n * Apply slippage tolerance to a minimum output amount.\n * slippageBps: basis points, e.g. 100 = 1%\n */\nexport function applySlippage(amount: BN, slippageBps: number): BN {\n return amount.mul(new BN(10_000 - slippageBps)).div(BPS)\n}\n\n/**\n * Calculate the tradable/vaulted split for newly purchased tokens.\n *\n * Band logic (from the on-chain program):\n * 0–50M tokens sold: 40% tradable / 60% vaulted\n * each additional 50M band: +5% tradable\n * 600M+ tokens sold: 100% tradable / 0% vaulted\n *\n * After vest_duration has fully elapsed, all buys are 100% tradable.\n *\n * @param tokensOut tokens received from this buy\n * @param tokensSold cumulative tokens sold in the pool (before this buy)\n * @param bandSize band width in base token units (default 50M)\n */\nexport function calculateTradableVaultedSplit(\n tokensOut: BN,\n tokensSold: BN,\n bandSize: BN = BAND_SIZE,\n): { tradable: BN; vaulted: BN; tradablePct: number } {\n if (tokensOut.isZero()) return { tradable: ZERO, vaulted: ZERO, tradablePct: 0 }\n\n const bandIndex = bandSize.isZero() ? 0 : tokensSold.div(bandSize).toNumber()\n const tradablePct = Math.min(BASE_TRADABLE_PCT + PCT_PER_BAND * bandIndex, MAX_TRADABLE_PCT)\n const tradable = tokensOut.mul(new BN(tradablePct)).div(new BN(100))\n const vaulted = tokensOut.sub(tradable)\n\n return { tradable, vaulted, tradablePct }\n}\n\n/**\n * Calculate accrued (claimable) tokens for a position at a given timestamp.\n * Linear vesting: accrued = initialVaulted * elapsed / vestDuration\n * Capped at initialVaulted. Already-transferred tokens subtracted.\n */\nexport function calculateAccruedTokens(\n initialVaulted: BN,\n tokensTransferred: BN,\n entryTimestamp: BN,\n vestDuration: BN,\n currentTimestamp: BN,\n): BN {\n if (initialVaulted.isZero()) return ZERO\n const remaining = initialVaulted.sub(tokensTransferred)\n if (vestDuration.isZero()) return remaining\n const elapsed = currentTimestamp.sub(entryTimestamp)\n if (elapsed.isNeg()) return ZERO\n if (elapsed.gte(vestDuration)) return remaining\n const totalAccrued = initialVaulted.mul(elapsed).div(vestDuration)\n const claimable = totalAccrued.sub(tokensTransferred)\n return claimable.isNeg() ? ZERO : claimable\n}\n\n/**\n * Spot price: how much SOL (in lamports) one whole token costs at the current curve position.\n * Returns price scaled by 1e6 for precision (i.e. micro-lamports per base token unit).\n */\nexport function calculateSpotPrice(\n vammRealSol: BN,\n vammTokens: BN,\n): BN {\n if (vammTokens.isZero()) return ZERO\n return vammRealSol.add(VIRTUAL_SOL).mul(new BN(1_000_000)).div(vammTokens)\n}\n\n/**\n * Price impact of a buy, in basis points.\n * Compares the effective price of the trade to the current spot price.\n */\nexport function calculatePriceImpact(\n solIn: BN,\n tokensOut: BN,\n vammRealSol: BN,\n vammTokens: BN,\n): number {\n if (solIn.isZero() || tokensOut.isZero() || vammTokens.isZero()) return 0\n const solSide = vammRealSol.add(VIRTUAL_SOL)\n const numerator = solIn.mul(vammTokens).mul(BPS)\n const denominator = tokensOut.mul(solSide)\n if (denominator.isZero()) return 0\n const ratioBps = numerator.div(denominator)\n return ratioBps.sub(BPS).toNumber()\n}\n"]}
|
package/dist/math.d.cts
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import BN from 'bn.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Calculate tokens out for a given SOL input using the vAMM constant product formula.
|
|
5
|
+
* k = (vammRealSol + VIRTUAL_SOL) * vammTokens
|
|
6
|
+
*/
|
|
7
|
+
declare function calculateBuyAmount(solIn: BN, vammRealSol: BN, vammTokens: BN, vammK: BN): BN;
|
|
8
|
+
/**
|
|
9
|
+
* Calculate SOL out for a given token input.
|
|
10
|
+
*/
|
|
11
|
+
declare function calculateSellAmount(tokensIn: BN, vammRealSol: BN, vammTokens: BN, vammK: BN): BN;
|
|
12
|
+
/**
|
|
13
|
+
* Calculate SOL required to buy an exact number of tokens.
|
|
14
|
+
* Inverse of calculateBuyAmount.
|
|
15
|
+
*/
|
|
16
|
+
declare function calculateSolForExactTokens(tokensOut: BN, vammRealSol: BN, vammTokens: BN, vammK: BN): BN;
|
|
17
|
+
/**
|
|
18
|
+
* Apply slippage tolerance to a minimum output amount.
|
|
19
|
+
* slippageBps: basis points, e.g. 100 = 1%
|
|
20
|
+
*/
|
|
21
|
+
declare function applySlippage(amount: BN, slippageBps: number): BN;
|
|
22
|
+
/**
|
|
23
|
+
* Calculate the tradable/vaulted split for newly purchased tokens.
|
|
24
|
+
*
|
|
25
|
+
* Band logic (from the on-chain program):
|
|
26
|
+
* 0–50M tokens sold: 40% tradable / 60% vaulted
|
|
27
|
+
* each additional 50M band: +5% tradable
|
|
28
|
+
* 600M+ tokens sold: 100% tradable / 0% vaulted
|
|
29
|
+
*
|
|
30
|
+
* After vest_duration has fully elapsed, all buys are 100% tradable.
|
|
31
|
+
*
|
|
32
|
+
* @param tokensOut tokens received from this buy
|
|
33
|
+
* @param tokensSold cumulative tokens sold in the pool (before this buy)
|
|
34
|
+
* @param bandSize band width in base token units (default 50M)
|
|
35
|
+
*/
|
|
36
|
+
declare function calculateTradableVaultedSplit(tokensOut: BN, tokensSold: BN, bandSize?: BN): {
|
|
37
|
+
tradable: BN;
|
|
38
|
+
vaulted: BN;
|
|
39
|
+
tradablePct: number;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Calculate accrued (claimable) tokens for a position at a given timestamp.
|
|
43
|
+
* Linear vesting: accrued = initialVaulted * elapsed / vestDuration
|
|
44
|
+
* Capped at initialVaulted. Already-transferred tokens subtracted.
|
|
45
|
+
*/
|
|
46
|
+
declare function calculateAccruedTokens(initialVaulted: BN, tokensTransferred: BN, entryTimestamp: BN, vestDuration: BN, currentTimestamp: BN): BN;
|
|
47
|
+
/**
|
|
48
|
+
* Spot price: how much SOL (in lamports) one whole token costs at the current curve position.
|
|
49
|
+
* Returns price scaled by 1e6 for precision (i.e. micro-lamports per base token unit).
|
|
50
|
+
*/
|
|
51
|
+
declare function calculateSpotPrice(vammRealSol: BN, vammTokens: BN): BN;
|
|
52
|
+
/**
|
|
53
|
+
* Price impact of a buy, in basis points.
|
|
54
|
+
* Compares the effective price of the trade to the current spot price.
|
|
55
|
+
*/
|
|
56
|
+
declare function calculatePriceImpact(solIn: BN, tokensOut: BN, vammRealSol: BN, vammTokens: BN): number;
|
|
57
|
+
|
|
58
|
+
export { applySlippage, calculateAccruedTokens, calculateBuyAmount, calculatePriceImpact, calculateSellAmount, calculateSolForExactTokens, calculateSpotPrice, calculateTradableVaultedSplit };
|
package/dist/math.d.ts
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import BN from 'bn.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Calculate tokens out for a given SOL input using the vAMM constant product formula.
|
|
5
|
+
* k = (vammRealSol + VIRTUAL_SOL) * vammTokens
|
|
6
|
+
*/
|
|
7
|
+
declare function calculateBuyAmount(solIn: BN, vammRealSol: BN, vammTokens: BN, vammK: BN): BN;
|
|
8
|
+
/**
|
|
9
|
+
* Calculate SOL out for a given token input.
|
|
10
|
+
*/
|
|
11
|
+
declare function calculateSellAmount(tokensIn: BN, vammRealSol: BN, vammTokens: BN, vammK: BN): BN;
|
|
12
|
+
/**
|
|
13
|
+
* Calculate SOL required to buy an exact number of tokens.
|
|
14
|
+
* Inverse of calculateBuyAmount.
|
|
15
|
+
*/
|
|
16
|
+
declare function calculateSolForExactTokens(tokensOut: BN, vammRealSol: BN, vammTokens: BN, vammK: BN): BN;
|
|
17
|
+
/**
|
|
18
|
+
* Apply slippage tolerance to a minimum output amount.
|
|
19
|
+
* slippageBps: basis points, e.g. 100 = 1%
|
|
20
|
+
*/
|
|
21
|
+
declare function applySlippage(amount: BN, slippageBps: number): BN;
|
|
22
|
+
/**
|
|
23
|
+
* Calculate the tradable/vaulted split for newly purchased tokens.
|
|
24
|
+
*
|
|
25
|
+
* Band logic (from the on-chain program):
|
|
26
|
+
* 0–50M tokens sold: 40% tradable / 60% vaulted
|
|
27
|
+
* each additional 50M band: +5% tradable
|
|
28
|
+
* 600M+ tokens sold: 100% tradable / 0% vaulted
|
|
29
|
+
*
|
|
30
|
+
* After vest_duration has fully elapsed, all buys are 100% tradable.
|
|
31
|
+
*
|
|
32
|
+
* @param tokensOut tokens received from this buy
|
|
33
|
+
* @param tokensSold cumulative tokens sold in the pool (before this buy)
|
|
34
|
+
* @param bandSize band width in base token units (default 50M)
|
|
35
|
+
*/
|
|
36
|
+
declare function calculateTradableVaultedSplit(tokensOut: BN, tokensSold: BN, bandSize?: BN): {
|
|
37
|
+
tradable: BN;
|
|
38
|
+
vaulted: BN;
|
|
39
|
+
tradablePct: number;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Calculate accrued (claimable) tokens for a position at a given timestamp.
|
|
43
|
+
* Linear vesting: accrued = initialVaulted * elapsed / vestDuration
|
|
44
|
+
* Capped at initialVaulted. Already-transferred tokens subtracted.
|
|
45
|
+
*/
|
|
46
|
+
declare function calculateAccruedTokens(initialVaulted: BN, tokensTransferred: BN, entryTimestamp: BN, vestDuration: BN, currentTimestamp: BN): BN;
|
|
47
|
+
/**
|
|
48
|
+
* Spot price: how much SOL (in lamports) one whole token costs at the current curve position.
|
|
49
|
+
* Returns price scaled by 1e6 for precision (i.e. micro-lamports per base token unit).
|
|
50
|
+
*/
|
|
51
|
+
declare function calculateSpotPrice(vammRealSol: BN, vammTokens: BN): BN;
|
|
52
|
+
/**
|
|
53
|
+
* Price impact of a buy, in basis points.
|
|
54
|
+
* Compares the effective price of the trade to the current spot price.
|
|
55
|
+
*/
|
|
56
|
+
declare function calculatePriceImpact(solIn: BN, tokensOut: BN, vammRealSol: BN, vammTokens: BN): number;
|
|
57
|
+
|
|
58
|
+
export { applySlippage, calculateAccruedTokens, calculateBuyAmount, calculatePriceImpact, calculateSellAmount, calculateSolForExactTokens, calculateSpotPrice, calculateTradableVaultedSplit };
|
package/dist/math.js
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import BN2 from 'bn.js';
|
|
2
|
+
import { PublicKey } from '@solana/web3.js';
|
|
3
|
+
|
|
4
|
+
// src/math.ts
|
|
5
|
+
new PublicKey("hodLrUfwyK3Z7Td5hdZhyojyznG1rqbHVex11y5s4yG");
|
|
6
|
+
new PublicKey("EFAquDGAHjkoPB6TGKVibD3BYhbFXNDjuXKpiBHdYzji");
|
|
7
|
+
var VIRTUAL_SOL = new BN2("30000000000");
|
|
8
|
+
new BN2("1000000000000000");
|
|
9
|
+
new BN2("100000000");
|
|
10
|
+
({
|
|
11
|
+
POOL: Buffer.from("pool"),
|
|
12
|
+
VAULT_AUTHORITY: Buffer.from("vault_authority"),
|
|
13
|
+
SOL_VAULT: Buffer.from("sol_vault"),
|
|
14
|
+
POSITION: Buffer.from("position"),
|
|
15
|
+
PROTOCOL_FEES: Buffer.from("protocol_fees"),
|
|
16
|
+
EVENT_AUTHORITY: Buffer.from("__event_authority")
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
// src/math.ts
|
|
20
|
+
var ZERO = new BN2(0);
|
|
21
|
+
var BPS = new BN2(1e4);
|
|
22
|
+
var BASE_TRADABLE_PCT = 40;
|
|
23
|
+
var PCT_PER_BAND = 5;
|
|
24
|
+
var BAND_SIZE = new BN2("50000000000000");
|
|
25
|
+
var MAX_TRADABLE_PCT = 100;
|
|
26
|
+
function calculateBuyAmount(solIn, vammRealSol, vammTokens, vammK) {
|
|
27
|
+
if (solIn.isZero() || solIn.isNeg()) return ZERO;
|
|
28
|
+
const currentSolSide = vammRealSol.add(VIRTUAL_SOL);
|
|
29
|
+
const newSolSide = currentSolSide.add(solIn);
|
|
30
|
+
const newTokenSide = vammK.div(newSolSide);
|
|
31
|
+
return vammTokens.sub(newTokenSide);
|
|
32
|
+
}
|
|
33
|
+
function calculateSellAmount(tokensIn, vammRealSol, vammTokens, vammK) {
|
|
34
|
+
if (tokensIn.isZero() || tokensIn.isNeg()) return ZERO;
|
|
35
|
+
const newTokenSide = vammTokens.add(tokensIn);
|
|
36
|
+
const newRealSol = vammK.div(newTokenSide).sub(VIRTUAL_SOL);
|
|
37
|
+
return vammRealSol.sub(newRealSol);
|
|
38
|
+
}
|
|
39
|
+
function calculateSolForExactTokens(tokensOut, vammRealSol, vammTokens, vammK) {
|
|
40
|
+
if (tokensOut.isZero() || tokensOut.isNeg()) return ZERO;
|
|
41
|
+
if (tokensOut.gte(vammTokens)) throw new Error("tokensOut exceeds available vAMM liquidity");
|
|
42
|
+
const newTokenSide = vammTokens.sub(tokensOut);
|
|
43
|
+
const newSolSide = vammK.div(newTokenSide);
|
|
44
|
+
const currentSolSide = vammRealSol.add(VIRTUAL_SOL);
|
|
45
|
+
return newSolSide.sub(currentSolSide);
|
|
46
|
+
}
|
|
47
|
+
function applySlippage(amount, slippageBps) {
|
|
48
|
+
return amount.mul(new BN2(1e4 - slippageBps)).div(BPS);
|
|
49
|
+
}
|
|
50
|
+
function calculateTradableVaultedSplit(tokensOut, tokensSold, bandSize = BAND_SIZE) {
|
|
51
|
+
if (tokensOut.isZero()) return { tradable: ZERO, vaulted: ZERO, tradablePct: 0 };
|
|
52
|
+
const bandIndex = bandSize.isZero() ? 0 : tokensSold.div(bandSize).toNumber();
|
|
53
|
+
const tradablePct = Math.min(BASE_TRADABLE_PCT + PCT_PER_BAND * bandIndex, MAX_TRADABLE_PCT);
|
|
54
|
+
const tradable = tokensOut.mul(new BN2(tradablePct)).div(new BN2(100));
|
|
55
|
+
const vaulted = tokensOut.sub(tradable);
|
|
56
|
+
return { tradable, vaulted, tradablePct };
|
|
57
|
+
}
|
|
58
|
+
function calculateAccruedTokens(initialVaulted, tokensTransferred, entryTimestamp, vestDuration, currentTimestamp) {
|
|
59
|
+
if (initialVaulted.isZero()) return ZERO;
|
|
60
|
+
const remaining = initialVaulted.sub(tokensTransferred);
|
|
61
|
+
if (vestDuration.isZero()) return remaining;
|
|
62
|
+
const elapsed = currentTimestamp.sub(entryTimestamp);
|
|
63
|
+
if (elapsed.isNeg()) return ZERO;
|
|
64
|
+
if (elapsed.gte(vestDuration)) return remaining;
|
|
65
|
+
const totalAccrued = initialVaulted.mul(elapsed).div(vestDuration);
|
|
66
|
+
const claimable = totalAccrued.sub(tokensTransferred);
|
|
67
|
+
return claimable.isNeg() ? ZERO : claimable;
|
|
68
|
+
}
|
|
69
|
+
function calculateSpotPrice(vammRealSol, vammTokens) {
|
|
70
|
+
if (vammTokens.isZero()) return ZERO;
|
|
71
|
+
return vammRealSol.add(VIRTUAL_SOL).mul(new BN2(1e6)).div(vammTokens);
|
|
72
|
+
}
|
|
73
|
+
function calculatePriceImpact(solIn, tokensOut, vammRealSol, vammTokens) {
|
|
74
|
+
if (solIn.isZero() || tokensOut.isZero() || vammTokens.isZero()) return 0;
|
|
75
|
+
const solSide = vammRealSol.add(VIRTUAL_SOL);
|
|
76
|
+
const numerator = solIn.mul(vammTokens).mul(BPS);
|
|
77
|
+
const denominator = tokensOut.mul(solSide);
|
|
78
|
+
if (denominator.isZero()) return 0;
|
|
79
|
+
const ratioBps = numerator.div(denominator);
|
|
80
|
+
return ratioBps.sub(BPS).toNumber();
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export { applySlippage, calculateAccruedTokens, calculateBuyAmount, calculatePriceImpact, calculateSellAmount, calculateSolForExactTokens, calculateSpotPrice, calculateTradableVaultedSplit };
|
|
84
|
+
//# sourceMappingURL=math.js.map
|
|
85
|
+
//# sourceMappingURL=math.js.map
|
package/dist/math.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts","../src/math.ts"],"names":["BN"],"mappings":"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","file":"math.js","sourcesContent":["import { PublicKey } from '@solana/web3.js'\nimport BN from 'bn.js'\n\nexport const BPS_DENOMINATOR = 10_000\n\nexport const PROGRAM_ID = new PublicKey('hodLrUfwyK3Z7Td5hdZhyojyznG1rqbHVex11y5s4yG')\nexport const PROTOCOL_AUTHORITY = new PublicKey('EFAquDGAHjkoPB6TGKVibD3BYhbFXNDjuXKpiBHdYzji')\n\nexport const VIRTUAL_SOL = new BN('30000000000')\nexport const TOTAL_SUPPLY = new BN('1000000000000000')\nexport const PROTOCOL_MINT_FEE = new BN('100000000')\nexport const DECIMALS = 6\n\nexport const SEEDS = {\n POOL: Buffer.from('pool'),\n VAULT_AUTHORITY: Buffer.from('vault_authority'),\n SOL_VAULT: Buffer.from('sol_vault'),\n POSITION: Buffer.from('position'),\n PROTOCOL_FEES: Buffer.from('protocol_fees'),\n EVENT_AUTHORITY: Buffer.from('__event_authority'),\n} as const\n\nexport const MAINNET_CONFIG = {\n programId: PROGRAM_ID,\n virtualSol: VIRTUAL_SOL,\n protocolAuthority: PROTOCOL_AUTHORITY,\n protocolMintFee: PROTOCOL_MINT_FEE,\n decimals: DECIMALS,\n totalSupply: TOTAL_SUPPLY,\n} as const\n\nexport const DEVNET_CONFIG = {\n programId: PROGRAM_ID,\n virtualSol: VIRTUAL_SOL,\n protocolAuthority: PROTOCOL_AUTHORITY,\n protocolMintFee: PROTOCOL_MINT_FEE,\n decimals: DECIMALS,\n totalSupply: TOTAL_SUPPLY,\n} as const\n\n/** Trade fee in basis points (25 bps = 0.25%). Only applies after vest_duration has passed. */\nexport const TRADE_FEE_BPS = 25\n\n/** Allowed vest duration modes (in seconds). The program only accepts these values. */\nexport const VEST_DURATION = {\n ONE_MINUTE: 60,\n TEN_MINUTES: 600,\n} as const\n\nexport type VestDuration = typeof VEST_DURATION[keyof typeof VEST_DURATION]\n\nexport const LIMITS = {\n NAME: { min: 1, max: 32 },\n SYMBOL: { min: 1, max: 16 },\n URI: { min: 10, max: 100 },\n DESCRIPTION: { min: 0, max: 200 },\n} as const\n","import BN from 'bn.js'\nimport { VIRTUAL_SOL } from './constants'\n\nconst ZERO = new BN(0)\nconst BPS = new BN(10_000)\n\n// Band logic from the program:\n// 40% tradable at 0-50M tokens sold, +5% per 50M band, 100% at 600M+\nconst BASE_TRADABLE_PCT = 40\nconst PCT_PER_BAND = 5\nconst BAND_SIZE = new BN('50000000000000') // 50M tokens × 10^6 decimals\nconst MAX_TRADABLE_PCT = 100\n\n/**\n * Calculate tokens out for a given SOL input using the vAMM constant product formula.\n * k = (vammRealSol + VIRTUAL_SOL) * vammTokens\n */\nexport function calculateBuyAmount(\n solIn: BN,\n vammRealSol: BN,\n vammTokens: BN,\n vammK: BN,\n): BN {\n if (solIn.isZero() || solIn.isNeg()) return ZERO\n const currentSolSide = vammRealSol.add(VIRTUAL_SOL)\n const newSolSide = currentSolSide.add(solIn)\n const newTokenSide = vammK.div(newSolSide)\n return vammTokens.sub(newTokenSide)\n}\n\n/**\n * Calculate SOL out for a given token input.\n */\nexport function calculateSellAmount(\n tokensIn: BN,\n vammRealSol: BN,\n vammTokens: BN,\n vammK: BN,\n): BN {\n if (tokensIn.isZero() || tokensIn.isNeg()) return ZERO\n const newTokenSide = vammTokens.add(tokensIn)\n const newRealSol = vammK.div(newTokenSide).sub(VIRTUAL_SOL)\n return vammRealSol.sub(newRealSol)\n}\n\n/**\n * Calculate SOL required to buy an exact number of tokens.\n * Inverse of calculateBuyAmount.\n */\nexport function calculateSolForExactTokens(\n tokensOut: BN,\n vammRealSol: BN,\n vammTokens: BN,\n vammK: BN,\n): BN {\n if (tokensOut.isZero() || tokensOut.isNeg()) return ZERO\n if (tokensOut.gte(vammTokens)) throw new Error('tokensOut exceeds available vAMM liquidity')\n const newTokenSide = vammTokens.sub(tokensOut)\n const newSolSide = vammK.div(newTokenSide)\n const currentSolSide = vammRealSol.add(VIRTUAL_SOL)\n return newSolSide.sub(currentSolSide)\n}\n\n/**\n * Apply slippage tolerance to a minimum output amount.\n * slippageBps: basis points, e.g. 100 = 1%\n */\nexport function applySlippage(amount: BN, slippageBps: number): BN {\n return amount.mul(new BN(10_000 - slippageBps)).div(BPS)\n}\n\n/**\n * Calculate the tradable/vaulted split for newly purchased tokens.\n *\n * Band logic (from the on-chain program):\n * 0–50M tokens sold: 40% tradable / 60% vaulted\n * each additional 50M band: +5% tradable\n * 600M+ tokens sold: 100% tradable / 0% vaulted\n *\n * After vest_duration has fully elapsed, all buys are 100% tradable.\n *\n * @param tokensOut tokens received from this buy\n * @param tokensSold cumulative tokens sold in the pool (before this buy)\n * @param bandSize band width in base token units (default 50M)\n */\nexport function calculateTradableVaultedSplit(\n tokensOut: BN,\n tokensSold: BN,\n bandSize: BN = BAND_SIZE,\n): { tradable: BN; vaulted: BN; tradablePct: number } {\n if (tokensOut.isZero()) return { tradable: ZERO, vaulted: ZERO, tradablePct: 0 }\n\n const bandIndex = bandSize.isZero() ? 0 : tokensSold.div(bandSize).toNumber()\n const tradablePct = Math.min(BASE_TRADABLE_PCT + PCT_PER_BAND * bandIndex, MAX_TRADABLE_PCT)\n const tradable = tokensOut.mul(new BN(tradablePct)).div(new BN(100))\n const vaulted = tokensOut.sub(tradable)\n\n return { tradable, vaulted, tradablePct }\n}\n\n/**\n * Calculate accrued (claimable) tokens for a position at a given timestamp.\n * Linear vesting: accrued = initialVaulted * elapsed / vestDuration\n * Capped at initialVaulted. Already-transferred tokens subtracted.\n */\nexport function calculateAccruedTokens(\n initialVaulted: BN,\n tokensTransferred: BN,\n entryTimestamp: BN,\n vestDuration: BN,\n currentTimestamp: BN,\n): BN {\n if (initialVaulted.isZero()) return ZERO\n const remaining = initialVaulted.sub(tokensTransferred)\n if (vestDuration.isZero()) return remaining\n const elapsed = currentTimestamp.sub(entryTimestamp)\n if (elapsed.isNeg()) return ZERO\n if (elapsed.gte(vestDuration)) return remaining\n const totalAccrued = initialVaulted.mul(elapsed).div(vestDuration)\n const claimable = totalAccrued.sub(tokensTransferred)\n return claimable.isNeg() ? ZERO : claimable\n}\n\n/**\n * Spot price: how much SOL (in lamports) one whole token costs at the current curve position.\n * Returns price scaled by 1e6 for precision (i.e. micro-lamports per base token unit).\n */\nexport function calculateSpotPrice(\n vammRealSol: BN,\n vammTokens: BN,\n): BN {\n if (vammTokens.isZero()) return ZERO\n return vammRealSol.add(VIRTUAL_SOL).mul(new BN(1_000_000)).div(vammTokens)\n}\n\n/**\n * Price impact of a buy, in basis points.\n * Compares the effective price of the trade to the current spot price.\n */\nexport function calculatePriceImpact(\n solIn: BN,\n tokensOut: BN,\n vammRealSol: BN,\n vammTokens: BN,\n): number {\n if (solIn.isZero() || tokensOut.isZero() || vammTokens.isZero()) return 0\n const solSide = vammRealSol.add(VIRTUAL_SOL)\n const numerator = solIn.mul(vammTokens).mul(BPS)\n const denominator = tokensOut.mul(solSide)\n if (denominator.isZero()) return 0\n const ratioBps = numerator.div(denominator)\n return ratioBps.sub(BPS).toNumber()\n}\n"]}
|