> For the complete documentation index, see [llms.txt](https://instadapp-3.gitbook.io/instadapp-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://instadapp-3.gitbook.io/instadapp-docs/dsa-sdk/casting-spells.md).

# Casting Spells

**Spells** denotes a sequence of connector functions that will achieve a given use case. Spells can comprise of any number of functions across any number of connectors.

With this SDK, performing DeFi operations on your dapp consists of creating a `spells` instance to add transactions. Here is where you can initiate complex transactions amongst different protocols.

Create an instance.

```
let spells = dsa.Spell();
```

Add **spells** that you want to execute. Think of any actions, and by just adding new SPELLS, you can wonderfully CAST transactions across protocols. Let's try to execute the following actions:

1. Lend 1 ETH on Compound
2. Borrow 50 DAI on Compound

```
spells.add({
  connector: "compound",
  method: "deposit",
  args: [dsa.tokens.info.eth.address, dsa.tokens.fromDecimal(1, "eth"), 0, 0]
});

spells.add({
  connector: "compound",
  method: "borrow",
  args: [dsa.tokens.info.dai.address, dsa.tokens.fromDecimal(50, "dai"), 0, 0]
});
```

&#x20;**Note:** Make sure, your smart account have the equivalent ETH balance before executing the above actions. Check [this section](https://docs.instadapp.io/setup#transfer-tokens) for more details.

&#x20;At last, cast your spell using `cast()` method.

```
dsa.cast(spells).then(console.log) // returns transaction hash
```

&#x20;You can also pass an object to send **optional** parameters like sending ETH along with the transaction.

```
dsa.cast({
  spells: spells,
  gasPrice: web3.utils.toWei(gasPrice, 'gwei'), // in gwei, used in node implementation.
  value: dsa.tokens.fromDecimal(1,"eth"), // sending 1 Eth along the transaction.
  nonce: nonce
})
```
