11import type { Hex } from "viem" ;
22import type { ThirdwebClient } from "../client/client.js" ;
3- import { ZERO_ADDRESS } from "../constants/addresses.js" ;
3+ import { NATIVE_TOKEN_ADDRESS , ZERO_ADDRESS } from "../constants/addresses.js" ;
44import { getContract } from "../contract/contract.js" ;
55import { createAsset } from "../extensions/assets/__generated__/AssetEntrypointERC20/write/createAsset.js" ;
66import { encodeInitialize } from "../extensions/assets/__generated__/ERC20Asset/write/initialize.js" ;
@@ -9,10 +9,15 @@ import { getRpcClient } from "../rpc/rpc.js";
99import { upload } from "../storage/upload.js" ;
1010import type { FileOrBufferOrString } from "../storage/upload/types.js" ;
1111import { sendTransaction } from "../transaction/actions/send-transaction.js" ;
12+ import { encodeAbiParameters } from "../utils/abi/encodeAbiParameters.js" ;
1213import { keccakId } from "../utils/any-evm/keccak-id.js" ;
1314import { toHex } from "../utils/encoding/hex.js" ;
1415import type { ClientAndChainAndAccount } from "../utils/types.js" ;
15- import { DEFAULT_MAX_SUPPLY_ERC20 } from "./constants.js" ;
16+ import {
17+ DEFAULT_MAX_SUPPLY_ERC20 ,
18+ DEFAULT_POOL_FEE ,
19+ DEFAULT_POOL_INITIAL_TICK ,
20+ } from "./constants.js" ;
1621import { getEntrypointERC20 } from "./get-entrypoint-erc20.js" ;
1722
1823export type TokenParams = {
@@ -27,13 +32,21 @@ export type TokenParams = {
2732 owner ?: string ;
2833} ;
2934
35+ export type PoolConfig = {
36+ amount : bigint ;
37+ currency ?: string ;
38+ fee ?: number ;
39+ initialTick ?: number ;
40+ } ;
41+
3042export type CreateTokenOptions = ClientAndChainAndAccount & {
3143 salt ?: string ;
3244 params : TokenParams ;
45+ poolConfig ?: PoolConfig ;
3346} ;
3447
3548export async function createToken ( options : CreateTokenOptions ) {
36- const { chain, client, account, params } = options ;
49+ const { chain, client, account, params, poolConfig } = options ;
3750
3851 const creator = params . owner || account . address ;
3952
@@ -62,6 +75,8 @@ export async function createToken(options: CreateTokenOptions) {
6275 chain,
6376 } ) ;
6477
78+ const hookData = poolConfig ? encodePoolConfig ( poolConfig ) : "0x" ;
79+
6580 const transaction = createAsset ( {
6681 contract : entrypoint ,
6782 creator,
@@ -70,7 +85,7 @@ export async function createToken(options: CreateTokenOptions) {
7085 referrer : ZERO_ADDRESS ,
7186 salt,
7287 data : encodedInitData ,
73- hookData : "0x" ,
88+ hookData,
7489 } ,
7590 } ) ;
7691
@@ -109,3 +124,31 @@ async function encodeInitParams(options: {
109124 owner : creator ,
110125 } ) ;
111126}
127+
128+ function encodePoolConfig ( poolConfig : PoolConfig ) : Hex {
129+ const POOL_PARAMS = [
130+ {
131+ type : "address" ,
132+ name : "currency" ,
133+ } ,
134+ {
135+ type : "uint256" ,
136+ name : "amount" ,
137+ } ,
138+ {
139+ type : "uint24" ,
140+ name : "fee" ,
141+ } ,
142+ {
143+ type : "uint24" ,
144+ name : "initialTick" ,
145+ } ,
146+ ] as const ;
147+
148+ return encodeAbiParameters ( POOL_PARAMS , [
149+ poolConfig . currency || NATIVE_TOKEN_ADDRESS ,
150+ poolConfig . amount ,
151+ poolConfig . fee || DEFAULT_POOL_FEE ,
152+ poolConfig . initialTick || DEFAULT_POOL_INITIAL_TICK ,
153+ ] ) ;
154+ }
0 commit comments