mirror of
https://github.com/Instadapp/dsa-developers.git
synced 2024-07-29 21:56:57 +00:00
111 lines
3.8 KiB
Markdown
111 lines
3.8 KiB
Markdown
|
||
# 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` |