@t2000/sdk 10.3.1 → 10.5.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.
@@ -299,7 +299,7 @@ type SponsoredCoinMergeCache = Map<string, {
299
299
  */
300
300
  declare function selectSuiCoin(tx: Transaction, client: SuiCoreClient, owner: string, amountMist: bigint, sponsoredContext: boolean, mergeCache?: SponsoredCoinMergeCache): Promise<SelectAndSplitResult>;
301
301
 
302
- type T2000ErrorCode = 'INSUFFICIENT_BALANCE' | 'ADDRESS_BALANCE_UNSPONSORABLE' | 'INSUFFICIENT_GAS' | 'INVALID_ADDRESS' | 'INVALID_AMOUNT' | 'WALLET_NOT_FOUND' | 'WALLET_LOCKED' | 'WALLET_EXISTS' | 'WALLET_CORRUPT' | 'INVALID_KEY' | 'SIMULATION_FAILED' | 'TRANSACTION_FAILED' | 'ASSET_NOT_SUPPORTED' | 'INVALID_ASSET' | 'PROTOCOL_UNAVAILABLE' | 'RPC_ERROR' | 'RPC_UNREACHABLE' | 'PRICE_EXCEEDS_LIMIT' | 'UNSUPPORTED_NETWORK' | 'PAYMENT_EXPIRED' | 'DUPLICATE_PAYMENT' | 'FACILITATOR_REJECTION' | 'CONTACT_NOT_FOUND' | 'INVALID_CONTACT_NAME' | 'SUINS_NOT_REGISTERED' | 'FACILITATOR_TIMEOUT' | 'SAFEGUARD_BLOCKED' | 'SWAP_NO_ROUTE' | 'SWAP_FAILED' | 'DIALECT_UNSUPPORTED' | 'ESCROW_REQUIRED' | 'CHAIN_MODE_INVALID' | 'INFERENCE_FAILED' | 'UNKNOWN';
302
+ type T2000ErrorCode = 'INSUFFICIENT_BALANCE' | 'ADDRESS_BALANCE_UNSPONSORABLE' | 'INSUFFICIENT_GAS' | 'INVALID_ADDRESS' | 'INVALID_AMOUNT' | 'INVALID_INPUT' | 'WALLET_NOT_FOUND' | 'WALLET_LOCKED' | 'WALLET_EXISTS' | 'WALLET_CORRUPT' | 'INVALID_KEY' | 'SIMULATION_FAILED' | 'TRANSACTION_FAILED' | 'ASSET_NOT_SUPPORTED' | 'INVALID_ASSET' | 'PROTOCOL_UNAVAILABLE' | 'RPC_ERROR' | 'RPC_UNREACHABLE' | 'PRICE_EXCEEDS_LIMIT' | 'UNSUPPORTED_NETWORK' | 'PAYMENT_EXPIRED' | 'DUPLICATE_PAYMENT' | 'FACILITATOR_REJECTION' | 'CONTACT_NOT_FOUND' | 'INVALID_CONTACT_NAME' | 'SUINS_NOT_REGISTERED' | 'FACILITATOR_TIMEOUT' | 'SAFEGUARD_BLOCKED' | 'SWAP_NO_ROUTE' | 'SWAP_FAILED' | 'DIALECT_UNSUPPORTED' | 'ESCROW_REQUIRED' | 'CHAIN_MODE_INVALID' | 'INFERENCE_FAILED' | 'UNKNOWN';
303
303
  interface T2000ErrorData {
304
304
  reason?: string;
305
305
  [key: string]: unknown;
@@ -299,7 +299,7 @@ type SponsoredCoinMergeCache = Map<string, {
299
299
  */
300
300
  declare function selectSuiCoin(tx: Transaction, client: SuiCoreClient, owner: string, amountMist: bigint, sponsoredContext: boolean, mergeCache?: SponsoredCoinMergeCache): Promise<SelectAndSplitResult>;
301
301
 
302
- type T2000ErrorCode = 'INSUFFICIENT_BALANCE' | 'ADDRESS_BALANCE_UNSPONSORABLE' | 'INSUFFICIENT_GAS' | 'INVALID_ADDRESS' | 'INVALID_AMOUNT' | 'WALLET_NOT_FOUND' | 'WALLET_LOCKED' | 'WALLET_EXISTS' | 'WALLET_CORRUPT' | 'INVALID_KEY' | 'SIMULATION_FAILED' | 'TRANSACTION_FAILED' | 'ASSET_NOT_SUPPORTED' | 'INVALID_ASSET' | 'PROTOCOL_UNAVAILABLE' | 'RPC_ERROR' | 'RPC_UNREACHABLE' | 'PRICE_EXCEEDS_LIMIT' | 'UNSUPPORTED_NETWORK' | 'PAYMENT_EXPIRED' | 'DUPLICATE_PAYMENT' | 'FACILITATOR_REJECTION' | 'CONTACT_NOT_FOUND' | 'INVALID_CONTACT_NAME' | 'SUINS_NOT_REGISTERED' | 'FACILITATOR_TIMEOUT' | 'SAFEGUARD_BLOCKED' | 'SWAP_NO_ROUTE' | 'SWAP_FAILED' | 'DIALECT_UNSUPPORTED' | 'ESCROW_REQUIRED' | 'CHAIN_MODE_INVALID' | 'INFERENCE_FAILED' | 'UNKNOWN';
302
+ type T2000ErrorCode = 'INSUFFICIENT_BALANCE' | 'ADDRESS_BALANCE_UNSPONSORABLE' | 'INSUFFICIENT_GAS' | 'INVALID_ADDRESS' | 'INVALID_AMOUNT' | 'INVALID_INPUT' | 'WALLET_NOT_FOUND' | 'WALLET_LOCKED' | 'WALLET_EXISTS' | 'WALLET_CORRUPT' | 'INVALID_KEY' | 'SIMULATION_FAILED' | 'TRANSACTION_FAILED' | 'ASSET_NOT_SUPPORTED' | 'INVALID_ASSET' | 'PROTOCOL_UNAVAILABLE' | 'RPC_ERROR' | 'RPC_UNREACHABLE' | 'PRICE_EXCEEDS_LIMIT' | 'UNSUPPORTED_NETWORK' | 'PAYMENT_EXPIRED' | 'DUPLICATE_PAYMENT' | 'FACILITATOR_REJECTION' | 'CONTACT_NOT_FOUND' | 'INVALID_CONTACT_NAME' | 'SUINS_NOT_REGISTERED' | 'FACILITATOR_TIMEOUT' | 'SAFEGUARD_BLOCKED' | 'SWAP_NO_ROUTE' | 'SWAP_FAILED' | 'DIALECT_UNSUPPORTED' | 'ESCROW_REQUIRED' | 'CHAIN_MODE_INVALID' | 'INFERENCE_FAILED' | 'UNKNOWN';
303
303
  interface T2000ErrorData {
304
304
  reason?: string;
305
305
  [key: string]: unknown;
package/dist/index.cjs CHANGED
@@ -19,6 +19,7 @@ var sha256 = require('@noble/hashes/sha256');
19
19
  var utils$1 = require('@noble/hashes/utils');
20
20
  var fs = require('fs');
21
21
  var suins = require('@mysten/suins');
22
+ var bcs = require('@mysten/sui/bcs');
22
23
 
23
24
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
24
25
 
@@ -3888,14 +3889,352 @@ function displayHandle(label, parentName = AUDRIC_PARENT_NAME) {
3888
3889
  // src/index.ts
3889
3890
  init_preflight();
3890
3891
 
3892
+ // src/capital/launch.ts
3893
+ init_errors();
3894
+ init_token_registry();
3895
+
3896
+ // src/protocols/cetus-clmm.ts
3897
+ var CETUS_CLMM_PACKAGE_ID = process.env.CETUS_CLMM_PACKAGE_ID ?? "0x1eabed72c53feb3805120a081dc15963c204dc8d091542592abaf7a35689b2fb";
3898
+ var CETUS_CLMM_PUBLISHED_AT = process.env.CETUS_CLMM_PUBLISHED_AT ?? "0x25ebb9a7c50eb17b3fa9c5a30fb8b5ad8f97caaf4928943acbcff7153dfee5e3";
3899
+ var CETUS_GLOBAL_CONFIG_ID = process.env.CETUS_GLOBAL_CONFIG_ID ?? "0xdaa46292632c3c4d8f31f23ea0f9b36a28ff3677e9684980e4438403a67a3d8f";
3900
+ var CETUS_POOLS_ID = process.env.CETUS_POOLS_ID ?? "0xf699e7f2276f5c9a75944b37a0c5b5d9ddfd2471bf6242483b03ab2887d198d0";
3901
+ var CETUS_POSITION_TYPE = `${CETUS_CLMM_PACKAGE_ID}::position::Position`;
3902
+ var AGENT_POOL_TICK_SPACING = 200;
3903
+ function sqrtPriceX64FromAmounts(rawA, rawB) {
3904
+ if (rawA <= 0n || rawB <= 0n) {
3905
+ throw new Error("sqrtPriceX64FromAmounts: amounts must be positive");
3906
+ }
3907
+ return bigintSqrt((rawB << 128n) / rawA);
3908
+ }
3909
+ function bigintSqrt(n) {
3910
+ if (n < 0n) throw new Error("bigintSqrt: negative input");
3911
+ if (n < 2n) return n;
3912
+ let x = 1n << BigInt(n.toString(2).length + 1) / 2n;
3913
+ let prev = x + 1n;
3914
+ while (x < prev) {
3915
+ prev = x;
3916
+ x = (x + n / x) / 2n;
3917
+ }
3918
+ return prev;
3919
+ }
3920
+ function createPoolV2(tx, args) {
3921
+ const [tickLower, tickUpper] = fullRangeTickRange(tx);
3922
+ return tx.moveCall({
3923
+ target: `${CETUS_CLMM_PUBLISHED_AT}::pool_creator::create_pool_v2`,
3924
+ typeArguments: [args.coinTypeA, args.coinTypeB],
3925
+ arguments: [
3926
+ tx.object(CETUS_GLOBAL_CONFIG_ID),
3927
+ tx.object(CETUS_POOLS_ID),
3928
+ tx.pure.u32(AGENT_POOL_TICK_SPACING),
3929
+ tx.pure.u128(args.sqrtPriceX64),
3930
+ tx.pure.string(args.url ?? ""),
3931
+ tickLower,
3932
+ tickUpper,
3933
+ args.coinA,
3934
+ args.coinB,
3935
+ tx.object(args.metadataA),
3936
+ tx.object(args.metadataB),
3937
+ tx.pure.bool(args.fixAmountA),
3938
+ tx.object.clock()
3939
+ ]
3940
+ });
3941
+ }
3942
+ function fullRangeTickRange(tx) {
3943
+ const result = tx.moveCall({
3944
+ target: `${CETUS_CLMM_PUBLISHED_AT}::pool_creator::full_range_tick_range`,
3945
+ arguments: [tx.pure.u32(AGENT_POOL_TICK_SPACING)]
3946
+ });
3947
+ return [result[0], result[1]];
3948
+ }
3949
+ function positionPoolId(tx, position) {
3950
+ return tx.moveCall({
3951
+ target: `${CETUS_CLMM_PUBLISHED_AT}::position::pool_id`,
3952
+ arguments: [position]
3953
+ });
3954
+ }
3955
+
3956
+ // src/capital/template.ts
3957
+ init_errors();
3958
+
3959
+ // src/capital/template-bytecode.json
3960
+ var template_bytecode_default = {
3961
+ modules: [
3962
+ "oRzrCwcAAAUKAQAMAgwkAzAoBFgMBWRoB8wBzwEImwNgBvsDiQEKhAUFDIkFNAARAQ0CBwISAhMCFAADAgABAgcBAAACAAwBAAECAQwBAAECBAwBAAEEBQIABQYHAAAKAAEAARAFBgEAAggICQECAgsKCwEAAw4FAQEMAw8NAQEMBQwDBAABBAIHAwcFDAQOBA8CCAAHCAUAAgsDAQgACwQBCAABCgIBCAYBCQABCwEBCQABCAAHCQACCgIKAgoCCwEBCAYHCAUCCwQBCQALAwEJAAMHCwQBCQADBwgFAQsCAQkAAQsCAQgAAgkABQELAwEIAAELBAEIAARDb2luDENvaW5NZXRhZGF0YQZPcHRpb24IVEVNUExBVEULVHJlYXN1cnlDYXAJVHhDb250ZXh0A1VybARjb2luD2NyZWF0ZV9jdXJyZW5jeQtkdW1teV9maWVsZARpbml0BG1pbnQVbmV3X3Vuc2FmZV9mcm9tX2J5dGVzBm9wdGlvbhRwdWJsaWNfZnJlZXplX29iamVjdA9wdWJsaWNfdHJhbnNmZXIEc29tZQh0ZW1wbGF0ZQh0cmFuc2Zlcgp0eF9jb250ZXh0A3VybAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgIBBgoCBQRUTVBMCgIODVRlbXBsYXRlIENvaW4KAh4dYnl0ZWNvZGUgdGVtcGxhdGUgcGxhY2Vob2xkZXIKAh0caHR0cHM6Ly9leGFtcGxlLmNvbS9pY29uLnN2ZwMIAIDGpH6NAwAFIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMr+AAIBCQEAAAAAAhcLAAcABwEHAgcDBwQRBjgACgE4AQwCDAMNAwcFCwE4AgcGOAMLAjgECwM4BQIAAA=="
3963
+ ],
3964
+ dependencies: [
3965
+ "0x0000000000000000000000000000000000000000000000000000000000000001",
3966
+ "0x0000000000000000000000000000000000000000000000000000000000000002"
3967
+ ]};
3968
+
3969
+ // src/capital/template.ts
3970
+ var TEMPLATE = {
3971
+ module: "template",
3972
+ otw: "TEMPLATE",
3973
+ symbol: "TMPL",
3974
+ name: "Template Coin",
3975
+ description: "bytecode template placeholder",
3976
+ iconUrl: "https://example.com/icon.svg",
3977
+ totalSupply: 1000000000000000n,
3978
+ recipient: utils.normalizeSuiAddress("0xCAFE")
3979
+ };
3980
+ var AGENT_TOKEN_DECIMALS = 6;
3981
+ var AGENT_TOKEN_TOTAL_SUPPLY = 1000000000000000n;
3982
+ var AGENT_TOKEN_LP_ALLOCATION = AGENT_TOKEN_TOTAL_SUPPLY / 2n;
3983
+ var AGENT_TOKEN_TREASURY_ALLOCATION = AGENT_TOKEN_TOTAL_SUPPLY - AGENT_TOKEN_LP_ALLOCATION;
3984
+ var SYMBOL_BLOCKLIST = /* @__PURE__ */ new Set([
3985
+ "SUI",
3986
+ "USDC",
3987
+ "USDT",
3988
+ "USDSUI",
3989
+ "WAL",
3990
+ "CETUS",
3991
+ "DEEP",
3992
+ "NS",
3993
+ "NAVX",
3994
+ "SCA",
3995
+ "AFSUI",
3996
+ "HASUI",
3997
+ "VSUI",
3998
+ "BUCK",
3999
+ "FUD",
4000
+ "BLUB",
4001
+ "HIPPO",
4002
+ "BTC",
4003
+ "WBTC",
4004
+ "ETH",
4005
+ "WETH",
4006
+ "SOL",
4007
+ "BNB",
4008
+ "XRP",
4009
+ "ADA",
4010
+ "DOGE",
4011
+ "AVAX",
4012
+ "LINK",
4013
+ "TRX",
4014
+ "TON",
4015
+ "SHIB",
4016
+ "PEPE",
4017
+ "USDE",
4018
+ "DAI",
4019
+ "GOLD",
4020
+ "XAUM",
4021
+ "T2000",
4022
+ "T2K",
4023
+ "AUDRIC"
4024
+ ]);
4025
+ var SYMBOL_RE = /^[A-Z][A-Z0-9]{1,7}$/;
4026
+ function validateAgentCoinParams(params) {
4027
+ const symbol = params.symbol.toUpperCase();
4028
+ if (!SYMBOL_RE.test(symbol)) {
4029
+ throw new exports.T2000Error(
4030
+ "INVALID_INPUT",
4031
+ `symbol must be 2-8 chars, A-Z then A-Z0-9 (got "${params.symbol}")`
4032
+ );
4033
+ }
4034
+ if (SYMBOL_BLOCKLIST.has(symbol)) {
4035
+ throw new exports.T2000Error(
4036
+ "INVALID_INPUT",
4037
+ `symbol ${symbol} impersonates an existing ticker`
4038
+ );
4039
+ }
4040
+ if (!params.name.trim() || params.name.length > 64) {
4041
+ throw new exports.T2000Error("INVALID_INPUT", "name must be 1-64 chars");
4042
+ }
4043
+ if (params.description.length > 256) {
4044
+ throw new exports.T2000Error("INVALID_INPUT", "description must be \u2264256 chars");
4045
+ }
4046
+ if (!/^https:\/\/.+/.test(params.iconUrl) || params.iconUrl.length > 256) {
4047
+ throw new exports.T2000Error("INVALID_INPUT", "iconUrl must be https and \u2264256 chars");
4048
+ }
4049
+ if (!utils.isValidSuiAddress(params.recipient)) {
4050
+ throw new exports.T2000Error("INVALID_ADDRESS", `bad recipient: ${params.recipient}`);
4051
+ }
4052
+ }
4053
+ async function buildAgentCoinModule(params) {
4054
+ const { deserialize, serialize, update_constants, update_identifiers } = await import('@mysten/move-bytecode-template');
4055
+ validateAgentCoinParams(params);
4056
+ const symbol = params.symbol.toUpperCase();
4057
+ const moduleName = symbol.toLowerCase();
4058
+ const recipient = utils.normalizeSuiAddress(params.recipient);
4059
+ let bytes = Uint8Array.from(
4060
+ Buffer.from(template_bytecode_default.modules[0], "base64")
4061
+ );
4062
+ deserialize(bytes);
4063
+ bytes = update_identifiers(bytes, {
4064
+ [TEMPLATE.module]: moduleName,
4065
+ [TEMPLATE.otw]: symbol
4066
+ });
4067
+ const str = (s) => bcs.bcs.string().serialize(s).toBytes();
4068
+ const rewrites = [
4069
+ [str(symbol), str(TEMPLATE.symbol), "Vector(U8)"],
4070
+ [str(params.name), str(TEMPLATE.name), "Vector(U8)"],
4071
+ [str(params.description), str(TEMPLATE.description), "Vector(U8)"],
4072
+ [str(params.iconUrl), str(TEMPLATE.iconUrl), "Vector(U8)"],
4073
+ [
4074
+ bcs.bcs.Address.serialize(recipient).toBytes(),
4075
+ bcs.bcs.Address.serialize(TEMPLATE.recipient).toBytes(),
4076
+ "Address"
4077
+ ],
4078
+ // Supply + decimals are LOCKED v1 constants — not caller-parameterized —
4079
+ // but rewritten anyway so a drifted template recompile can't silently
4080
+ // change the economics out from under this module's exported constants.
4081
+ [
4082
+ bcs.bcs.u64().serialize(AGENT_TOKEN_TOTAL_SUPPLY).toBytes(),
4083
+ bcs.bcs.u64().serialize(TEMPLATE.totalSupply).toBytes(),
4084
+ "U64"
4085
+ ]
4086
+ ];
4087
+ for (const [next, prev, type] of rewrites) {
4088
+ bytes = update_constants(bytes, next, prev, type);
4089
+ }
4090
+ serialize(deserialize(bytes));
4091
+ return {
4092
+ modules: [Array.from(bytes)],
4093
+ dependencies: template_bytecode_default.dependencies,
4094
+ moduleName,
4095
+ otw: symbol
4096
+ };
4097
+ }
4098
+
4099
+ // src/capital/launch.ts
4100
+ var AGENT_CAPITAL_PACKAGE_ID = process.env.AGENT_CAPITAL_PACKAGE_ID ?? "0x33a04c672381c1de7178f56221e4ebfc4712675feecc2a0b70c25efbb500fc25";
4101
+ var CAPITAL_REGISTRY_ID = process.env.CAPITAL_REGISTRY_ID ?? "0xd75a72e80c1a5181cc9bb095089cc236e3e20be11b5982ab21e76c54508bd2d7";
4102
+ var CAPITAL_REGISTRY_VERSION = Number(
4103
+ process.env.CAPITAL_REGISTRY_VERSION ?? 951301211
4104
+ );
4105
+ function assertDeployed() {
4106
+ if (!AGENT_CAPITAL_PACKAGE_ID || !CAPITAL_REGISTRY_ID) {
4107
+ throw new exports.T2000Error(
4108
+ "PROTOCOL_UNAVAILABLE",
4109
+ "agent_capital is not deployed on this network (set AGENT_CAPITAL_PACKAGE_ID + CAPITAL_REGISTRY_ID)"
4110
+ );
4111
+ }
4112
+ }
4113
+ var MIN_LP_SUI = 1000000000n;
4114
+ var REGISTRY_MODULE = "registry";
4115
+ var LP_LOCK_MODULE = "lp_lock";
4116
+ async function buildPublishAgentCoinTx(args) {
4117
+ if (!utils.isValidSuiAddress(args.launcher)) {
4118
+ throw new exports.T2000Error("INVALID_ADDRESS", `bad launcher: ${args.launcher}`);
4119
+ }
4120
+ if (args.coin.recipient !== args.launcher) {
4121
+ throw new exports.T2000Error(
4122
+ "INVALID_INPUT",
4123
+ "coin.recipient must equal launcher \u2014 the full supply lands with the launch signer, never a third party"
4124
+ );
4125
+ }
4126
+ const mod = await buildAgentCoinModule(args.coin);
4127
+ const tx = new transactions.Transaction();
4128
+ tx.setSender(args.launcher);
4129
+ const [upgradeCap] = tx.publish({
4130
+ modules: mod.modules,
4131
+ dependencies: mod.dependencies
4132
+ });
4133
+ tx.moveCall({
4134
+ target: "0x2::package::make_immutable",
4135
+ arguments: [upgradeCap]
4136
+ });
4137
+ return { tx, moduleName: mod.moduleName, otw: mod.otw };
4138
+ }
4139
+ var SUI_COIN_METADATA_ID = "0x9258181f5ceac8dbffb7030890243caed69a9599d2886d957a9cb7656af3bdb3";
4140
+ function buildTokenizeTx(args) {
4141
+ assertDeployed();
4142
+ if (!utils.isValidSuiAddress(args.agent)) {
4143
+ throw new exports.T2000Error("INVALID_ADDRESS", `bad agent: ${args.agent}`);
4144
+ }
4145
+ if (!utils.isValidSuiAddress(args.launcher)) {
4146
+ throw new exports.T2000Error("INVALID_ADDRESS", `bad launcher: ${args.launcher}`);
4147
+ }
4148
+ if (args.lpSuiAmount < MIN_LP_SUI) {
4149
+ throw new exports.T2000Error(
4150
+ "INVALID_AMOUNT",
4151
+ `lpSuiAmount ${args.lpSuiAmount} < minimum ${MIN_LP_SUI} MIST (1 SUI)`
4152
+ );
4153
+ }
4154
+ const tx = new transactions.Transaction();
4155
+ tx.setSender(args.launcher);
4156
+ const registryArg = () => tx.sharedObjectRef({
4157
+ objectId: CAPITAL_REGISTRY_ID,
4158
+ initialSharedVersion: CAPITAL_REGISTRY_VERSION,
4159
+ mutable: true
4160
+ });
4161
+ tx.moveCall({
4162
+ target: `${AGENT_CAPITAL_PACKAGE_ID}::${REGISTRY_MODULE}::bind`,
4163
+ typeArguments: [args.coinType],
4164
+ arguments: [
4165
+ registryArg(),
4166
+ tx.object(args.agentRegistryId),
4167
+ tx.pure.address(args.agent),
4168
+ tx.object.clock()
4169
+ ]
4170
+ });
4171
+ const supplyCoin = tx.object(args.supplyCoinId);
4172
+ const [lpCoin] = tx.splitCoins(supplyCoin, [
4173
+ tx.pure.u64(AGENT_TOKEN_LP_ALLOCATION)
4174
+ ]);
4175
+ const [lpSui] = tx.splitCoins(tx.gas, [tx.pure.u64(args.lpSuiAmount)]);
4176
+ const suiFirst = args.suiFirst ?? false;
4177
+ const sqrtPrice = suiFirst ? sqrtPriceX64FromAmounts(args.lpSuiAmount, AGENT_TOKEN_LP_ALLOCATION) : sqrtPriceX64FromAmounts(AGENT_TOKEN_LP_ALLOCATION, args.lpSuiAmount);
4178
+ const poolResult = createPoolV2(tx, {
4179
+ coinTypeA: suiFirst ? exports.SUI_TYPE : args.coinType,
4180
+ coinTypeB: suiFirst ? args.coinType : exports.SUI_TYPE,
4181
+ metadataA: suiFirst ? args.suiMetadataId ?? SUI_COIN_METADATA_ID : args.coinMetadataId,
4182
+ metadataB: suiFirst ? args.coinMetadataId : args.suiMetadataId ?? SUI_COIN_METADATA_ID,
4183
+ coinA: suiFirst ? lpSui : lpCoin,
4184
+ coinB: suiFirst ? lpCoin : lpSui,
4185
+ sqrtPriceX64: sqrtPrice,
4186
+ fixAmountA: !suiFirst,
4187
+ // always fix the AGENT side
4188
+ url: args.poolUrl
4189
+ });
4190
+ const position = poolResult[0];
4191
+ const refundA = poolResult[1];
4192
+ const refundB = poolResult[2];
4193
+ const poolId = positionPoolId(tx, position);
4194
+ const [lockId] = tx.moveCall({
4195
+ target: `${AGENT_CAPITAL_PACKAGE_ID}::${LP_LOCK_MODULE}::lock`,
4196
+ typeArguments: [CETUS_POSITION_TYPE],
4197
+ arguments: [position, tx.pure.address(args.agent), tx.object.clock()]
4198
+ });
4199
+ tx.moveCall({
4200
+ target: `${AGENT_CAPITAL_PACKAGE_ID}::${REGISTRY_MODULE}::finalize`,
4201
+ typeArguments: [args.coinType],
4202
+ arguments: [
4203
+ registryArg(),
4204
+ tx.object(args.agentRegistryId),
4205
+ tx.pure.address(args.agent),
4206
+ poolId,
4207
+ lockId,
4208
+ tx.object.clock()
4209
+ ]
4210
+ });
4211
+ const agentRefund = suiFirst ? refundB : refundA;
4212
+ const suiRefund = suiFirst ? refundA : refundB;
4213
+ tx.transferObjects([supplyCoin, agentRefund], tx.pure.address(args.agent));
4214
+ tx.transferObjects([suiRefund], tx.pure.address(args.launcher));
4215
+ return tx;
4216
+ }
4217
+
3891
4218
  exports.A2A_ESCROW_FEE_CONFIG_ID = A2A_ESCROW_FEE_CONFIG_ID;
3892
4219
  exports.A2A_ESCROW_PACKAGE_ID = A2A_ESCROW_PACKAGE_ID;
4220
+ exports.AGENT_CAPITAL_PACKAGE_ID = AGENT_CAPITAL_PACKAGE_ID;
3893
4221
  exports.AGENT_ID_PARENT = AGENT_ID_PARENT;
3894
4222
  exports.AGENT_ID_PARENT_NAME = AGENT_ID_PARENT_NAME;
3895
4223
  exports.AGENT_ID_PARENT_NFT_ID = AGENT_ID_PARENT_NFT_ID;
4224
+ exports.AGENT_POOL_TICK_SPACING = AGENT_POOL_TICK_SPACING;
4225
+ exports.AGENT_TOKEN_DECIMALS = AGENT_TOKEN_DECIMALS;
4226
+ exports.AGENT_TOKEN_LP_ALLOCATION = AGENT_TOKEN_LP_ALLOCATION;
4227
+ exports.AGENT_TOKEN_TOTAL_SUPPLY = AGENT_TOKEN_TOTAL_SUPPLY;
4228
+ exports.AGENT_TOKEN_TREASURY_ALLOCATION = AGENT_TOKEN_TREASURY_ALLOCATION;
3896
4229
  exports.AUDRIC_PARENT = AUDRIC_PARENT;
3897
4230
  exports.AUDRIC_PARENT_NAME = AUDRIC_PARENT_NAME;
3898
4231
  exports.AUDRIC_PARENT_NFT_ID = AUDRIC_PARENT_NFT_ID;
4232
+ exports.CAPITAL_REGISTRY_ID = CAPITAL_REGISTRY_ID;
4233
+ exports.CAPITAL_REGISTRY_VERSION = CAPITAL_REGISTRY_VERSION;
4234
+ exports.CETUS_CLMM_PACKAGE_ID = CETUS_CLMM_PACKAGE_ID;
4235
+ exports.CETUS_GLOBAL_CONFIG_ID = CETUS_GLOBAL_CONFIG_ID;
4236
+ exports.CETUS_POOLS_ID = CETUS_POOLS_ID;
4237
+ exports.CETUS_POSITION_TYPE = CETUS_POSITION_TYPE;
3899
4238
  exports.CETUS_USDC_SUI_POOL = CETUS_USDC_SUI_POOL;
3900
4239
  exports.CLOCK_ID = CLOCK_ID;
3901
4240
  exports.DEFAULT_API_BASE = DEFAULT_API_BASE;
@@ -3915,6 +4254,7 @@ exports.LimitExceededError = LimitExceededError;
3915
4254
  exports.MAX_DELIVER_HORIZON_MS = MAX_DELIVER_HORIZON_MS;
3916
4255
  exports.MAX_JOB_USDC = MAX_JOB_USDC;
3917
4256
  exports.MAX_REVIEW_WINDOW_MS = MAX_REVIEW_WINDOW_MS;
4257
+ exports.MIN_LP_SUI = MIN_LP_SUI;
3918
4258
  exports.MIST_PER_SUI = MIST_PER_SUI;
3919
4259
  exports.OPERATION_ASSETS = OPERATION_ASSETS;
3920
4260
  exports.SENDABLE_ASSETS = SENDABLE_ASSETS;
@@ -3923,8 +4263,10 @@ exports.STABLE_ASSETS = STABLE_ASSETS;
3923
4263
  exports.SUINS_NAME_REGEX = SUINS_NAME_REGEX;
3924
4264
  exports.SUI_ADDRESS_REGEX = SUI_ADDRESS_REGEX;
3925
4265
  exports.SUI_ADDRESS_STRICT_REGEX = SUI_ADDRESS_STRICT_REGEX;
4266
+ exports.SUI_COIN_METADATA_ID = SUI_COIN_METADATA_ID;
3926
4267
  exports.SUI_DECIMALS = SUI_DECIMALS;
3927
4268
  exports.SUPPORTED_ASSETS = SUPPORTED_ASSETS;
4269
+ exports.SYMBOL_BLOCKLIST = SYMBOL_BLOCKLIST;
3928
4270
  exports.SuinsNotRegisteredError = SuinsNotRegisteredError;
3929
4271
  exports.SuinsRpcError = SuinsRpcError;
3930
4272
  exports.T2000 = T2000;
@@ -3938,14 +4280,17 @@ exports.approxUsdValue = approxUsdValue;
3938
4280
  exports.assertAllowedAsset = assertAllowedAsset;
3939
4281
  exports.assertLimitConfig = assertLimitConfig;
3940
4282
  exports.buildAddLeafTx = buildAddLeafTx;
4283
+ exports.buildAgentCoinModule = buildAgentCoinModule;
3941
4284
  exports.buildCreateJobTx = buildCreateJobTx;
3942
4285
  exports.buildDeliverJobTx = buildDeliverJobTx;
4286
+ exports.buildPublishAgentCoinTx = buildPublishAgentCoinTx;
3943
4287
  exports.buildRefundJobTx = buildRefundJobTx;
3944
4288
  exports.buildRejectJobTx = buildRejectJobTx;
3945
4289
  exports.buildReleaseJobTx = buildReleaseJobTx;
3946
4290
  exports.buildRevokeLeafTx = buildRevokeLeafTx;
3947
4291
  exports.buildSendTx = buildSendTx;
3948
4292
  exports.buildSwapTx = buildSwapTx;
4293
+ exports.buildTokenizeTx = buildTokenizeTx;
3949
4294
  exports.chatCompletion = chatCompletion;
3950
4295
  exports.chatCompletionStream = chatCompletionStream;
3951
4296
  exports.checkPositiveAmount = checkPositiveAmount;
@@ -4035,6 +4380,7 @@ exports.throwIfSimulationFailed = throwIfSimulationFailed;
4035
4380
  exports.truncateAddress = truncateAddress;
4036
4381
  exports.usdcToRaw = usdcToRaw;
4037
4382
  exports.validateAddress = validateAddress;
4383
+ exports.validateAgentCoinParams = validateAgentCoinParams;
4038
4384
  exports.validateLabel = validateLabel;
4039
4385
  exports.verifyCetusRouteCoinMatch = verifyCetusRouteCoinMatch;
4040
4386
  exports.verifyJobForSeller = verifyJobForSeller;