mirror of
https://github.com/Instadapp/dsa-connectors.git
synced 2024-07-29 22:37:00 +00:00
93 lines
2.7 KiB
Solidity
93 lines
2.7 KiB
Solidity
//SPDX-License-Identifier: MIT
|
|
pragma solidity ^0.7.0;
|
|
pragma experimental ABIEncoderV2;
|
|
|
|
/**
|
|
* @title DSA Spell.
|
|
* @dev Cast spells on DSA.
|
|
*/
|
|
|
|
import { AccountInterface } from "../../common/interfaces.sol";
|
|
import { Stores } from "../../common/stores.sol";
|
|
import { Events } from "./events.sol";
|
|
|
|
abstract contract DSASpellsResolver is Events, Stores {
|
|
/**
|
|
*@dev Casts spells on a DSA, caller DSA should be an auth of the target DSA. Reverts if any spell failed.
|
|
*@notice Interact with a target DSA by casting spells on it.
|
|
*@param targetDSA target DSA to cast spells on.
|
|
*@param connectors Array of connector names (For example, ["1INCH-A", "BASIC-A"]).
|
|
*@param datas Array of connector calldatas (function selectors encoded with parameters).
|
|
*/
|
|
function castOnDSA(
|
|
address targetDSA,
|
|
string[] memory connectors,
|
|
bytes[] memory datas
|
|
)
|
|
external
|
|
payable
|
|
returns (string memory _eventName, bytes memory _eventParam)
|
|
{
|
|
require(instaList.accountID(targetDSA) != 0, "not-a-DSA");
|
|
|
|
AccountInterface(targetDSA).cast(connectors, datas, address(this));
|
|
|
|
_eventName = "LogCastOnDSA(address,string[],bytes[])";
|
|
_eventParam = abi.encode(targetDSA, connectors, datas);
|
|
}
|
|
|
|
/**
|
|
*@dev Casts spell on caller DSA. Stops casting further spells as soon as a spell gets casted successfully.
|
|
* Reverts if none of the spells is successful.
|
|
*@notice Casts the first successful spell on the DSA.
|
|
*@param connectors Array of connector names, in preference order, if any (For example, ["1INCH-A", "ZEROX-A"]).
|
|
*@param datas Array of connector calldatas (function selectors encoded with parameters).
|
|
*/
|
|
function castAny(string[] memory connectors, bytes[] memory datas)
|
|
external
|
|
payable
|
|
returns (string memory eventName, bytes memory eventParam)
|
|
{
|
|
uint256 _length = connectors.length;
|
|
require(_length > 0, "zero-length-not-allowed");
|
|
require(datas.length == _length, "calldata-length-invalid");
|
|
|
|
(bool isOk, address[] memory _connectors) = instaConnectors
|
|
.isConnectors(connectors);
|
|
require(isOk, "connector-names-invalid");
|
|
|
|
string memory _connectorName;
|
|
string memory _eventName;
|
|
bytes memory _eventParam;
|
|
bytes memory returnData;
|
|
bool success;
|
|
|
|
for (uint256 i = 0; i < _length; i++) {
|
|
(success, returnData) = _connectors[i].delegatecall(datas[i]);
|
|
|
|
if (success) {
|
|
_connectorName = connectors[i];
|
|
(_eventName, _eventParam) = abi.decode(
|
|
returnData,
|
|
(string, bytes)
|
|
);
|
|
break;
|
|
}
|
|
}
|
|
require(success, "dsa-spells-failed");
|
|
|
|
eventName = "LogCastAny(string,string,string[],string,bytes)";
|
|
eventParam = abi.encode(
|
|
_connectorName,
|
|
_connectorName,
|
|
connectors,
|
|
_eventName,
|
|
_eventParam
|
|
);
|
|
}
|
|
}
|
|
|
|
contract ConnectV2DSASpellFantom is DSASpellsResolver {
|
|
string public name = "DSA-Spell-v1.0";
|
|
}
|