# How to Interact With DSA using Web3 DeFi Smart Accounts (DSA) are contract accounts **trustlessly owned by the users**. Briefly, DSA is designed to allow developers to build extensible products and business models on top of DeFi with maximum security and composability. **Our platform is open to all sizes of developers, from solo-coders to a group of hackers to globally-scaled teams**. Build compelling use cases and monetize their models to earn money by serving your users with high reliability. ## Prerequisite - [web3](https://github.com/ethereum/web3.js/#installation) installed. - Instantiating web3 ```javascript // in browser if (window.ethereum) { window.web3 = new Web3(window.ethereum) } else if (window.web3) { window.web3 = new Web3(window.web3.currentProvider) } else { window.web3 = new Web3(customProvider) } // in node.js const web3 = new Web3(new Web3.providers.HttpProvider(ETH_NODE_URL)) ``` ## Creating new DSA. - Index Contract is the core contract of DSA and is a factory contract to deploy new DSA for users. ### .build() `function build(address _owner, uint accountVersion, address _origin)` | Parameter | Type | Description| |--|--|--| | `_owner` | address | Owner of the new DSA. | `accountVersion` | uint | Version of the new DSA. | `_origin` | address | Referral Address. **Web3 Code Snippet to create new DSA.** ```javascript let indexAddress = "0x2971adfa57b20e5a416ae5a708a8655a9c74f723" let indexABI = [] // paste ABI from `https://github.com/InstaDApp/dsa-sdk/blob/master/src/abi/core/index.json` let owner = "0x...."; // Owner of the DSA. let version = 1; // Version of DSA. let origin = "0x...."; // Referral Address for creating DSA. new web3.eth.Contract(indexABI, indexAddress).methods .build(owner, version, origin) .send({ from: owner }) .on("transactionHash", (txHash) => { return txHash; }) .on("error", (error) => { return error; }); ``` ## Interacting with Your DSA. Once DSA is created, You can interact with your DSA. ### .cast() `function cast(address[] calldata _targets, bytes[] calldata _datas, address _origin)` | Parameter | Type | Description| |--|--|--| | `_targets` | address[] | Array of connector’s target addresses. | `_datas` | bytes[] | Array of connector’s function callData. | `_origin` | address | Referral Address. **Web3 Code Snippet to interact with DSA.** Deposit Asset in Compound Protocol and start earning Interest. ```javascript // compound connector desposit function interface let depositLogic = [{inputs:[{internalType:"address",name:"token",type:"address"},{internalType:"uint256",name:"amt",type:"uint256"},{internalType:"uint256",name:"getId",type:"uint256"},{internalType:"uint256", name:"setId",type:"uint256"}],name:"deposit",outputs:[],stateMutability:"payable",type:"function"}]; // compound connector address let CompoundAddress = "0x547f1508a2a1ab0cb84dce4b3e09beb560bb44cb"; let DSA_Address = "YOUR_DSA_ADDRESS" // Your DSA Address. let DSA_ABI = ["COPY_PASTE_DSA_ABI_HERE"] // ABI of DSA Contract. // You need to create callData of a specific function of connector. let depositArgs = [ "TOKEN_ADDRESS", // address of the token to deposit. "TOKEN_AMOUNT", // amount to deposit(Amount should be in wei). "0", // It should be zero "0" // It should be zero ]; let depositCallData = web3.eth.abi.encodeFunctionCall(depositLogic, depositArgs); // Interacting with DSA. new web3.eth.Contract(DSA_ABI, DSA_Address).methods .cast( [CompoundAddress], // need to be in array format [depositArgs] // need to be in array format ).send({ from: address[0] }) .on("transactionHash", (txHash) => { return txHash; }) .on("error", (error) => { return error; }); ``` **Note:** We use a mock address to indicate ETH in connectors: `0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE`