> For the complete documentation index, see [llms.txt](https://docs.txsync.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.txsync.io/sdks/txfusion-txsync-viem/api/extensions.md).

# Extensions

Extensions are external smart contracts that can be added to the Paymaster contract. These extensions are used to enforce specific conditions or rules that must be met for a transaction to be eligible

## createExtension

```typescript
async function createExtension(
  name: string,
  type: ExtensionMethod,
  wallet: WalletClient,
  client: unknown,
  items?: ExtensionItems,
  restrictionFactoryABI?: Abi,
  restrictionFactoryContractAddress?: Address
): Promise<Address>
```

Deploys a new extension contract based on the provided parameters.

* `name`: `string` - The name of the extension contract to be created.
* `type`: [`ExtensionMethod`](https://www.npmjs.com/package/@txfusion/txsync-viem#extensionmethod) - The type of extension contract to be created. It can be one of the following: `CONTRACT`, `USER`, or `FUNCTION`
* `wallet`: `WalletClient`: A `WalletClient` instance used for signing transactions and interacting with the Restriction Factory contract.
* `client`: `PublicClient`: A `PublicClient` instance used for writing public transactions.
* `items`: [`ExtensionItems`](https://www.npmjs.com/package/@txfusion/txsync-viem#extensionitems) (optional) - An object containing the items (e.g., contract addresses, user addresses, function signatures with contract addresses) related to the extension being created.
* `restrictionFactoryABI`: `Abi` (optional) - The ABI of the Restriction Factory contract. If not provided, it will be retrieved based on the chain ID.
* `restrictionFactoryContractAddress`: `Address` (optional) - The address of the Restriction Factory contract. If not provided, it will be retrieved based on the chain ID.
* `Returns`: Address: address of the deployed extension.

## types

### Pa**ymasterParams**

A tuple type representing the parameters for several methods of Paymaster instance, like [sendPaymasterTransaction](https://www.npmjs.com/package/@txfusion/txsync-viem#sendPaymasterTransaction). Added for easier usage.

```typescript
export type PaymasterParams = {
  /** The address of the paymaster. */
  paymaster: Address;
  /** The bytestream input for the paymaster. */
  paymasterInput: BytesLike;
};
```

### **PaymasterType**

```typescript
export enum PaymasterType {
  ERC20,
  SPONSORED,
}
```

### **ExtensionMethod**

```typescript
export enum ExtensionMethod {
  CONTRACT,
  USER,
  FUNCTION,
}
```

### **PaymasterOptions**

```typescript
export interface PaymasterOptions {
  innerInput?: BytesLike;
  minimalAllowance?: bigint;
}
```

### **PaymasterOverrides**

```typescript
export interface PaymasterOverrides
  extends Omit<TransactionRequest, 'from' | 'type' | 'gasPrice'> {
  paymasterOptions?: PaymasterOptions;
  gasLimit?: bigint;
  gasPrice?: bigint;
  customData?: PaymasterParams;
}
```

### **BaseRestrictionItem**

```typescript
export type BaseRestrictionItem = {
  address: Address;
};
```

### **AddressOrBaseRestrictionItem**

```typescript
export type AddressOrBaseRestrictionItem = Address | BaseRestrictionItem;
```

### **ContractItems**

```typescript
export type ContractItems = AddressOrBaseRestrictionItem[];
```

### **UserItems**

```typescript
export type UserItems = AddressOrBaseRestrictionItem[];
```

### **FunctionItems**

```typescript
export type FunctionItems = (BaseRestrictionItem & {
  functionSignature: string;
})[];
```

### **RestrictionItems**

```typescript
export type RestrictionItems = ContractItems | UserItems | FunctionItems;
```
