From 8aec31057d34c47f822010f706ec36a6f4db3513 Mon Sep 17 00:00:00 2001 From: Richa-iitr Date: Sun, 19 Jun 2022 19:24:10 +0530 Subject: [PATCH 01/14] spell-connector --- contracts/arbitrum/common/interfaces.sol | 9 ++++ .../arbitrum/connectors/spell/events.sol | 11 +++++ .../arbitrum/connectors/spell/helpers.sol | 12 ++++++ contracts/arbitrum/connectors/spell/main.sol | 42 +++++++++++++++++++ contracts/avalanche/common/interfaces.sol | 9 ++++ .../avalanche/connectors/spell/events.sol | 11 +++++ .../avalanche/connectors/spell/helpers.sol | 12 ++++++ contracts/avalanche/connectors/spell/main.sol | 42 +++++++++++++++++++ contracts/fantom/common/interfaces.sol | 10 +++++ contracts/fantom/connectors/spell/events.sol | 11 +++++ contracts/fantom/connectors/spell/helpers.sol | 12 ++++++ contracts/fantom/connectors/spell/main.sol | 42 +++++++++++++++++++ contracts/mainnet/common/interfaces.sol | 9 ++++ contracts/mainnet/connectors/spell/events.sol | 11 +++++ .../mainnet/connectors/spell/helpers.sol | 12 ++++++ contracts/mainnet/connectors/spell/main.sol | 42 +++++++++++++++++++ contracts/optimism/common/interfaces.sol | 9 ++++ .../optimism/connectors/spell/events.sol | 11 +++++ .../optimism/connectors/spell/helpers.sol | 12 ++++++ contracts/optimism/connectors/spell/main.sol | 42 +++++++++++++++++++ contracts/polygon/common/interfaces.sol | 9 ++++ contracts/polygon/connectors/spell/events.sol | 11 +++++ .../polygon/connectors/spell/helpers.sol | 12 ++++++ contracts/polygon/connectors/spell/main.sol | 42 +++++++++++++++++++ 24 files changed, 445 insertions(+) create mode 100644 contracts/arbitrum/connectors/spell/events.sol create mode 100644 contracts/arbitrum/connectors/spell/helpers.sol create mode 100644 contracts/arbitrum/connectors/spell/main.sol create mode 100644 contracts/avalanche/connectors/spell/events.sol create mode 100644 contracts/avalanche/connectors/spell/helpers.sol create mode 100644 contracts/avalanche/connectors/spell/main.sol create mode 100644 contracts/fantom/connectors/spell/events.sol create mode 100644 contracts/fantom/connectors/spell/helpers.sol create mode 100644 contracts/fantom/connectors/spell/main.sol create mode 100644 contracts/mainnet/connectors/spell/events.sol create mode 100644 contracts/mainnet/connectors/spell/helpers.sol create mode 100644 contracts/mainnet/connectors/spell/main.sol create mode 100644 contracts/optimism/connectors/spell/events.sol create mode 100644 contracts/optimism/connectors/spell/helpers.sol create mode 100644 contracts/optimism/connectors/spell/main.sol create mode 100644 contracts/polygon/connectors/spell/events.sol create mode 100644 contracts/polygon/connectors/spell/helpers.sol create mode 100644 contracts/polygon/connectors/spell/main.sol diff --git a/contracts/arbitrum/common/interfaces.sol b/contracts/arbitrum/common/interfaces.sol index 5fbd1b6d..0a0c2c58 100644 --- a/contracts/arbitrum/common/interfaces.sol +++ b/contracts/arbitrum/common/interfaces.sol @@ -26,6 +26,15 @@ interface AccountInterface { function enable(address) external; function disable(address) external; function isAuth(address) external view returns (bool); + function cast( + string[] calldata _targetNames, + bytes[] calldata _datas, + address _origin + ) external payable returns (bytes32[] memory responses); +} + +interface ListInterface { + function accountID(address) external returns (uint64); } interface InstaConnectors { diff --git a/contracts/arbitrum/connectors/spell/events.sol b/contracts/arbitrum/connectors/spell/events.sol new file mode 100644 index 00000000..1fff84f3 --- /dev/null +++ b/contracts/arbitrum/connectors/spell/events.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.7.0; +pragma abicoder v2; + +contract Events { + event LogCastDSA( + address indexed targetDSA, + string[] connectors, + bytes[] datas + ); +} diff --git a/contracts/arbitrum/connectors/spell/helpers.sol b/contracts/arbitrum/connectors/spell/helpers.sol new file mode 100644 index 00000000..5f8d3d9a --- /dev/null +++ b/contracts/arbitrum/connectors/spell/helpers.sol @@ -0,0 +1,12 @@ +//SPDX-License-Identifier: MIT +pragma solidity ^0.7.0; + +import { ListInterface } from "../../common/interfaces.sol"; + +contract SpellHelpers { + /** + * @dev InstaList + */ + ListInterface internal constant instaList = + ListInterface(0x3565F6057b7fFE36984779A507fC87b31EFb0f09); +} diff --git a/contracts/arbitrum/connectors/spell/main.sol b/contracts/arbitrum/connectors/spell/main.sol new file mode 100644 index 00000000..5e0356d4 --- /dev/null +++ b/contracts/arbitrum/connectors/spell/main.sol @@ -0,0 +1,42 @@ +//SPDX-License-Identifier: MIT +pragma solidity ^0.7.0; +pragma experimental ABIEncoderV2; + +/** + * @title Spell. + * @dev Cast on DSAs. + */ + +// import files +import { AccountInterface } from "../../common/interfaces.sol"; +import { SpellHelpers } from "./helpers.sol"; +import { Events } from "./events.sol"; + +abstract contract Spell is SpellHelpers, Events { + /** + *@dev Cast spells on DSA. + *@param targetDSA target DSA to cast spells on. + *@param connectors connector names. + *@param datas datas for the cast. + */ + function castDSA( + 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(0)); + + _eventName = "LogCastDSA(address,string[],bytes[])"; + _eventParam = abi.encode(targetDSA, connectors, datas); + } +} + +contract ConnectV2SpellConnectorPolygon is Spell { + string public name = "Spell-Connector-v1.0"; +} diff --git a/contracts/avalanche/common/interfaces.sol b/contracts/avalanche/common/interfaces.sol index 912e57b1..11186b6b 100644 --- a/contracts/avalanche/common/interfaces.sol +++ b/contracts/avalanche/common/interfaces.sol @@ -21,6 +21,15 @@ interface AccountInterface { function enable(address) external; function disable(address) external; function isAuth(address) external view returns (bool); + function cast( + string[] calldata _targetNames, + bytes[] calldata _datas, + address _origin + ) external payable returns (bytes32[] memory responses); +} + +interface ListInterface { + function accountID(address) external returns (uint64); } interface InstaConnectors { diff --git a/contracts/avalanche/connectors/spell/events.sol b/contracts/avalanche/connectors/spell/events.sol new file mode 100644 index 00000000..1fff84f3 --- /dev/null +++ b/contracts/avalanche/connectors/spell/events.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.7.0; +pragma abicoder v2; + +contract Events { + event LogCastDSA( + address indexed targetDSA, + string[] connectors, + bytes[] datas + ); +} diff --git a/contracts/avalanche/connectors/spell/helpers.sol b/contracts/avalanche/connectors/spell/helpers.sol new file mode 100644 index 00000000..0576e10e --- /dev/null +++ b/contracts/avalanche/connectors/spell/helpers.sol @@ -0,0 +1,12 @@ +//SPDX-License-Identifier: MIT +pragma solidity ^0.7.0; + +import { ListInterface } from "../../common/interfaces.sol"; + +contract SpellHelpers { + /** + * @dev InstaList + */ + ListInterface internal constant instaList = + ListInterface(0x9926955e0Dd681Dc303370C52f4Ad0a4dd061687); +} diff --git a/contracts/avalanche/connectors/spell/main.sol b/contracts/avalanche/connectors/spell/main.sol new file mode 100644 index 00000000..5e0356d4 --- /dev/null +++ b/contracts/avalanche/connectors/spell/main.sol @@ -0,0 +1,42 @@ +//SPDX-License-Identifier: MIT +pragma solidity ^0.7.0; +pragma experimental ABIEncoderV2; + +/** + * @title Spell. + * @dev Cast on DSAs. + */ + +// import files +import { AccountInterface } from "../../common/interfaces.sol"; +import { SpellHelpers } from "./helpers.sol"; +import { Events } from "./events.sol"; + +abstract contract Spell is SpellHelpers, Events { + /** + *@dev Cast spells on DSA. + *@param targetDSA target DSA to cast spells on. + *@param connectors connector names. + *@param datas datas for the cast. + */ + function castDSA( + 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(0)); + + _eventName = "LogCastDSA(address,string[],bytes[])"; + _eventParam = abi.encode(targetDSA, connectors, datas); + } +} + +contract ConnectV2SpellConnectorPolygon is Spell { + string public name = "Spell-Connector-v1.0"; +} diff --git a/contracts/fantom/common/interfaces.sol b/contracts/fantom/common/interfaces.sol index cf1abfee..b228ebe8 100644 --- a/contracts/fantom/common/interfaces.sol +++ b/contracts/fantom/common/interfaces.sol @@ -34,6 +34,16 @@ interface AccountInterface { function disable(address) external; function isAuth(address) external view returns (bool); + + function cast( + string[] calldata _targetNames, + bytes[] calldata _datas, + address _origin + ) external payable returns (bytes32[] memory responses); +} + +interface ListInterface { + function accountID(address) external returns (uint64); } interface InstaConnectors { diff --git a/contracts/fantom/connectors/spell/events.sol b/contracts/fantom/connectors/spell/events.sol new file mode 100644 index 00000000..1fff84f3 --- /dev/null +++ b/contracts/fantom/connectors/spell/events.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.7.0; +pragma abicoder v2; + +contract Events { + event LogCastDSA( + address indexed targetDSA, + string[] connectors, + bytes[] datas + ); +} diff --git a/contracts/fantom/connectors/spell/helpers.sol b/contracts/fantom/connectors/spell/helpers.sol new file mode 100644 index 00000000..ae065b8b --- /dev/null +++ b/contracts/fantom/connectors/spell/helpers.sol @@ -0,0 +1,12 @@ +//SPDX-License-Identifier: MIT +pragma solidity ^0.7.0; + +import { ListInterface } from "../../common/interfaces.sol"; + +contract SpellHelpers { + /** + * @dev InstaList + */ + ListInterface internal constant instaList = + ListInterface(0x10e166c3FAF887D8a61dE6c25039231eE694E926); +} diff --git a/contracts/fantom/connectors/spell/main.sol b/contracts/fantom/connectors/spell/main.sol new file mode 100644 index 00000000..5e0356d4 --- /dev/null +++ b/contracts/fantom/connectors/spell/main.sol @@ -0,0 +1,42 @@ +//SPDX-License-Identifier: MIT +pragma solidity ^0.7.0; +pragma experimental ABIEncoderV2; + +/** + * @title Spell. + * @dev Cast on DSAs. + */ + +// import files +import { AccountInterface } from "../../common/interfaces.sol"; +import { SpellHelpers } from "./helpers.sol"; +import { Events } from "./events.sol"; + +abstract contract Spell is SpellHelpers, Events { + /** + *@dev Cast spells on DSA. + *@param targetDSA target DSA to cast spells on. + *@param connectors connector names. + *@param datas datas for the cast. + */ + function castDSA( + 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(0)); + + _eventName = "LogCastDSA(address,string[],bytes[])"; + _eventParam = abi.encode(targetDSA, connectors, datas); + } +} + +contract ConnectV2SpellConnectorPolygon is Spell { + string public name = "Spell-Connector-v1.0"; +} diff --git a/contracts/mainnet/common/interfaces.sol b/contracts/mainnet/common/interfaces.sol index 29f60e4b..9b872418 100644 --- a/contracts/mainnet/common/interfaces.sol +++ b/contracts/mainnet/common/interfaces.sol @@ -27,6 +27,15 @@ interface AccountInterface { function enable(address) external; function disable(address) external; function isAuth(address) external view returns (bool); + function cast( + string[] calldata _targetNames, + bytes[] calldata _datas, + address _origin + ) external payable returns (bytes32[] memory responses); +} + +interface ListInterface { + function accountID(address) external returns (uint64); } interface InstaConnectors { diff --git a/contracts/mainnet/connectors/spell/events.sol b/contracts/mainnet/connectors/spell/events.sol new file mode 100644 index 00000000..1fff84f3 --- /dev/null +++ b/contracts/mainnet/connectors/spell/events.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.7.0; +pragma abicoder v2; + +contract Events { + event LogCastDSA( + address indexed targetDSA, + string[] connectors, + bytes[] datas + ); +} diff --git a/contracts/mainnet/connectors/spell/helpers.sol b/contracts/mainnet/connectors/spell/helpers.sol new file mode 100644 index 00000000..a0a7582a --- /dev/null +++ b/contracts/mainnet/connectors/spell/helpers.sol @@ -0,0 +1,12 @@ +//SPDX-License-Identifier: MIT +pragma solidity ^0.7.0; + +import { ListInterface } from "../../common/interfaces.sol"; + +contract SpellHelpers { + /** + * @dev InstaList + */ + ListInterface internal constant instaList = + ListInterface(0x4c8a1BEb8a87765788946D6B19C6C6355194AbEb); +} diff --git a/contracts/mainnet/connectors/spell/main.sol b/contracts/mainnet/connectors/spell/main.sol new file mode 100644 index 00000000..5e0356d4 --- /dev/null +++ b/contracts/mainnet/connectors/spell/main.sol @@ -0,0 +1,42 @@ +//SPDX-License-Identifier: MIT +pragma solidity ^0.7.0; +pragma experimental ABIEncoderV2; + +/** + * @title Spell. + * @dev Cast on DSAs. + */ + +// import files +import { AccountInterface } from "../../common/interfaces.sol"; +import { SpellHelpers } from "./helpers.sol"; +import { Events } from "./events.sol"; + +abstract contract Spell is SpellHelpers, Events { + /** + *@dev Cast spells on DSA. + *@param targetDSA target DSA to cast spells on. + *@param connectors connector names. + *@param datas datas for the cast. + */ + function castDSA( + 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(0)); + + _eventName = "LogCastDSA(address,string[],bytes[])"; + _eventParam = abi.encode(targetDSA, connectors, datas); + } +} + +contract ConnectV2SpellConnectorPolygon is Spell { + string public name = "Spell-Connector-v1.0"; +} diff --git a/contracts/optimism/common/interfaces.sol b/contracts/optimism/common/interfaces.sol index 797bce15..05fab373 100644 --- a/contracts/optimism/common/interfaces.sol +++ b/contracts/optimism/common/interfaces.sol @@ -23,6 +23,15 @@ interface AccountInterface { function enable(address) external; function disable(address) external; function isAuth(address) external view returns (bool); + function cast( + string[] calldata _targetNames, + bytes[] calldata _datas, + address _origin + ) external payable returns (bytes32[] memory responses); +} + +interface ListInterface { + function accountID(address) external returns (uint64); } interface InstaConnectors { diff --git a/contracts/optimism/connectors/spell/events.sol b/contracts/optimism/connectors/spell/events.sol new file mode 100644 index 00000000..1fff84f3 --- /dev/null +++ b/contracts/optimism/connectors/spell/events.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.7.0; +pragma abicoder v2; + +contract Events { + event LogCastDSA( + address indexed targetDSA, + string[] connectors, + bytes[] datas + ); +} diff --git a/contracts/optimism/connectors/spell/helpers.sol b/contracts/optimism/connectors/spell/helpers.sol new file mode 100644 index 00000000..0576e10e --- /dev/null +++ b/contracts/optimism/connectors/spell/helpers.sol @@ -0,0 +1,12 @@ +//SPDX-License-Identifier: MIT +pragma solidity ^0.7.0; + +import { ListInterface } from "../../common/interfaces.sol"; + +contract SpellHelpers { + /** + * @dev InstaList + */ + ListInterface internal constant instaList = + ListInterface(0x9926955e0Dd681Dc303370C52f4Ad0a4dd061687); +} diff --git a/contracts/optimism/connectors/spell/main.sol b/contracts/optimism/connectors/spell/main.sol new file mode 100644 index 00000000..5e0356d4 --- /dev/null +++ b/contracts/optimism/connectors/spell/main.sol @@ -0,0 +1,42 @@ +//SPDX-License-Identifier: MIT +pragma solidity ^0.7.0; +pragma experimental ABIEncoderV2; + +/** + * @title Spell. + * @dev Cast on DSAs. + */ + +// import files +import { AccountInterface } from "../../common/interfaces.sol"; +import { SpellHelpers } from "./helpers.sol"; +import { Events } from "./events.sol"; + +abstract contract Spell is SpellHelpers, Events { + /** + *@dev Cast spells on DSA. + *@param targetDSA target DSA to cast spells on. + *@param connectors connector names. + *@param datas datas for the cast. + */ + function castDSA( + 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(0)); + + _eventName = "LogCastDSA(address,string[],bytes[])"; + _eventParam = abi.encode(targetDSA, connectors, datas); + } +} + +contract ConnectV2SpellConnectorPolygon is Spell { + string public name = "Spell-Connector-v1.0"; +} diff --git a/contracts/polygon/common/interfaces.sol b/contracts/polygon/common/interfaces.sol index 94f054e1..5041400a 100644 --- a/contracts/polygon/common/interfaces.sol +++ b/contracts/polygon/common/interfaces.sol @@ -26,6 +26,15 @@ interface AccountInterface { function enable(address) external; function disable(address) external; function isAuth(address) external view returns (bool); + function cast( + string[] calldata _targetNames, + bytes[] calldata _datas, + address _origin + ) external payable returns (bytes32[] memory responses); +} + +interface ListInterface { + function accountID(address) external returns (uint64); } interface InstaConnectors { diff --git a/contracts/polygon/connectors/spell/events.sol b/contracts/polygon/connectors/spell/events.sol new file mode 100644 index 00000000..1fff84f3 --- /dev/null +++ b/contracts/polygon/connectors/spell/events.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.7.0; +pragma abicoder v2; + +contract Events { + event LogCastDSA( + address indexed targetDSA, + string[] connectors, + bytes[] datas + ); +} diff --git a/contracts/polygon/connectors/spell/helpers.sol b/contracts/polygon/connectors/spell/helpers.sol new file mode 100644 index 00000000..ae03c240 --- /dev/null +++ b/contracts/polygon/connectors/spell/helpers.sol @@ -0,0 +1,12 @@ +//SPDX-License-Identifier: MIT +pragma solidity ^0.7.0; + +import { ListInterface } from "../../common/interfaces.sol"; + +contract SpellHelpers { + /** + * @dev InstaList + */ + ListInterface internal constant instaList = + ListInterface(0x839c2D3aDe63DF5b0b8F3E57D5e145057Ab41556); +} diff --git a/contracts/polygon/connectors/spell/main.sol b/contracts/polygon/connectors/spell/main.sol new file mode 100644 index 00000000..5e0356d4 --- /dev/null +++ b/contracts/polygon/connectors/spell/main.sol @@ -0,0 +1,42 @@ +//SPDX-License-Identifier: MIT +pragma solidity ^0.7.0; +pragma experimental ABIEncoderV2; + +/** + * @title Spell. + * @dev Cast on DSAs. + */ + +// import files +import { AccountInterface } from "../../common/interfaces.sol"; +import { SpellHelpers } from "./helpers.sol"; +import { Events } from "./events.sol"; + +abstract contract Spell is SpellHelpers, Events { + /** + *@dev Cast spells on DSA. + *@param targetDSA target DSA to cast spells on. + *@param connectors connector names. + *@param datas datas for the cast. + */ + function castDSA( + 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(0)); + + _eventName = "LogCastDSA(address,string[],bytes[])"; + _eventParam = abi.encode(targetDSA, connectors, datas); + } +} + +contract ConnectV2SpellConnectorPolygon is Spell { + string public name = "Spell-Connector-v1.0"; +} From 4bdd9535afdf1e7ab8362f30ff15ede661f018f2 Mon Sep 17 00:00:00 2001 From: Richa-iitr Date: Sun, 19 Jun 2022 20:56:15 +0530 Subject: [PATCH 02/14] added function for spells --- contracts/arbitrum/common/stores.sol | 12 ++++- .../arbitrum/connectors/spell/events.sol | 3 +- .../arbitrum/connectors/spell/helpers.sol | 12 ----- contracts/arbitrum/connectors/spell/main.sol | 53 +++++++++++++++---- contracts/avalanche/common/stores.sol | 12 ++++- .../avalanche/connectors/spell/events.sol | 3 +- .../avalanche/connectors/spell/helpers.sol | 12 ----- contracts/avalanche/connectors/spell/main.sol | 53 +++++++++++++++---- contracts/fantom/common/stores.sol | 12 ++++- contracts/fantom/connectors/spell/events.sol | 3 +- contracts/fantom/connectors/spell/helpers.sol | 12 ----- contracts/fantom/connectors/spell/main.sol | 53 +++++++++++++++---- contracts/mainnet/common/stores.sol | 12 ++++- contracts/mainnet/connectors/spell/events.sol | 3 +- .../mainnet/connectors/spell/helpers.sol | 12 ----- contracts/mainnet/connectors/spell/main.sol | 53 +++++++++++++++---- contracts/optimism/common/stores.sol | 12 ++++- .../optimism/connectors/spell/events.sol | 3 +- .../optimism/connectors/spell/helpers.sol | 12 ----- contracts/optimism/connectors/spell/main.sol | 53 +++++++++++++++---- contracts/polygon/common/stores.sol | 12 ++++- contracts/polygon/connectors/spell/events.sol | 3 +- .../polygon/connectors/spell/helpers.sol | 12 ----- contracts/polygon/connectors/spell/main.sol | 53 +++++++++++++++---- 24 files changed, 342 insertions(+), 138 deletions(-) delete mode 100644 contracts/arbitrum/connectors/spell/helpers.sol delete mode 100644 contracts/avalanche/connectors/spell/helpers.sol delete mode 100644 contracts/fantom/connectors/spell/helpers.sol delete mode 100644 contracts/mainnet/connectors/spell/helpers.sol delete mode 100644 contracts/optimism/connectors/spell/helpers.sol delete mode 100644 contracts/polygon/connectors/spell/helpers.sol diff --git a/contracts/arbitrum/common/stores.sol b/contracts/arbitrum/common/stores.sol index dce4a455..40dd2731 100644 --- a/contracts/arbitrum/common/stores.sol +++ b/contracts/arbitrum/common/stores.sol @@ -1,7 +1,7 @@ //SPDX-License-Identifier: MIT pragma solidity ^0.7.0; -import { MemoryInterface, InstaMapping } from "./interfaces.sol"; +import { MemoryInterface, InstaMapping, ListInterface, InstaConnectors } from "./interfaces.sol"; abstract contract Stores { @@ -21,6 +21,16 @@ abstract contract Stores { */ MemoryInterface constant internal instaMemory = MemoryInterface(0xc109f7Ef06152c3a63dc7254fD861E612d3Ac571); + /** + * @dev Return InstaList address + */ + ListInterface internal constant instaList = ListInterface(0x3565F6057b7fFE36984779A507fC87b31EFb0f09); + + /** + * @dev Return InstaConnectors Registry Address + */ + InstaConnectors internal constant instaConnectors = InstaConnectors(0x67fCE99Dd6d8d659eea2a1ac1b8881c57eb6592B); + /** * @dev Get Uint value from InstaMemory Contract. */ diff --git a/contracts/arbitrum/connectors/spell/events.sol b/contracts/arbitrum/connectors/spell/events.sol index 1fff84f3..75048eff 100644 --- a/contracts/arbitrum/connectors/spell/events.sol +++ b/contracts/arbitrum/connectors/spell/events.sol @@ -4,8 +4,9 @@ pragma abicoder v2; contract Events { event LogCastDSA( - address indexed targetDSA, + address indexed targetDSA, string[] connectors, bytes[] datas ); + event LogCastSpells(string[] eventNames, bytes[] eventParams); } diff --git a/contracts/arbitrum/connectors/spell/helpers.sol b/contracts/arbitrum/connectors/spell/helpers.sol deleted file mode 100644 index 5f8d3d9a..00000000 --- a/contracts/arbitrum/connectors/spell/helpers.sol +++ /dev/null @@ -1,12 +0,0 @@ -//SPDX-License-Identifier: MIT -pragma solidity ^0.7.0; - -import { ListInterface } from "../../common/interfaces.sol"; - -contract SpellHelpers { - /** - * @dev InstaList - */ - ListInterface internal constant instaList = - ListInterface(0x3565F6057b7fFE36984779A507fC87b31EFb0f09); -} diff --git a/contracts/arbitrum/connectors/spell/main.sol b/contracts/arbitrum/connectors/spell/main.sol index 5e0356d4..47d65d38 100644 --- a/contracts/arbitrum/connectors/spell/main.sol +++ b/contracts/arbitrum/connectors/spell/main.sol @@ -3,21 +3,21 @@ pragma solidity ^0.7.0; pragma experimental ABIEncoderV2; /** - * @title Spell. - * @dev Cast on DSAs. + * @title DSA Spell. + * @dev Cast spells on DSA. */ // import files import { AccountInterface } from "../../common/interfaces.sol"; -import { SpellHelpers } from "./helpers.sol"; +import { Stores } from "../../common/stores.sol"; import { Events } from "./events.sol"; -abstract contract Spell is SpellHelpers, Events { +abstract contract DSASpell is Events, Stores { /** *@dev Cast spells on DSA. *@param targetDSA target DSA to cast spells on. - *@param connectors connector names. - *@param datas datas for the cast. + *@param connectors Array of connector names. + *@param datas Array of connector calldatas. */ function castDSA( address targetDSA, @@ -30,13 +30,48 @@ abstract contract Spell is SpellHelpers, Events { { require(instaList.accountID(targetDSA) != 0, "not-a-DSA"); - AccountInterface(targetDSA).cast(connectors, datas, address(0)); + AccountInterface(targetDSA).cast(connectors, datas, address(this)); _eventName = "LogCastDSA(address,string[],bytes[])"; _eventParam = abi.encode(targetDSA, connectors, datas); } + + /** + *@dev Perform spells. + *@param connectors Array of connector names. + *@param datas Array of connector calldatas. + */ + function castSpells(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 _eventNames = new string[](_length); + bytes[] memory _eventParams = new bytes[](_length); + + for (uint256 i = 0; i < _length; i++) { + (bool success, bytes memory returnData) = _connectors[i] + .delegatecall(datas[i]); + require(success, "spells-failed"); + (_eventNames[i], _eventParams[i]) = abi.decode( + returnData, + (string, bytes) + ); + } + + eventName = "LogCastSpells(string[],bytes[])"; + eventParam = abi.encode(_eventNames, _eventParams); + } } -contract ConnectV2SpellConnectorPolygon is Spell { - string public name = "Spell-Connector-v1.0"; +contract ConnectV2DSASpellArbitrum is DSASpell { + string public name = "DSA-Spell-v1.0"; } diff --git a/contracts/avalanche/common/stores.sol b/contracts/avalanche/common/stores.sol index 97f51614..3d35be30 100644 --- a/contracts/avalanche/common/stores.sol +++ b/contracts/avalanche/common/stores.sol @@ -1,7 +1,7 @@ //SPDX-License-Identifier: MIT pragma solidity ^0.7.0; -import { MemoryInterface } from "./interfaces.sol"; +import { MemoryInterface, ListInterface, InstaConnectors } from "./interfaces.sol"; abstract contract Stores { @@ -21,6 +21,16 @@ abstract contract Stores { */ MemoryInterface constant internal instaMemory = MemoryInterface(0x3254Ce8f5b1c82431B8f21Df01918342215825C2); + /** + * @dev Return InstaList address + */ + ListInterface internal constant instaList = ListInterface(0x9926955e0Dd681Dc303370C52f4Ad0a4dd061687); + + /** + * @dev Return InstaConnectors Registry address + */ + InstaConnectors internal constant instaConnectors = InstaConnectors(0x127d8cD0E2b2E0366D522DeA53A787bfE9002C14); + /** * @dev Get Uint value from InstaMemory Contract. */ diff --git a/contracts/avalanche/connectors/spell/events.sol b/contracts/avalanche/connectors/spell/events.sol index 1fff84f3..75048eff 100644 --- a/contracts/avalanche/connectors/spell/events.sol +++ b/contracts/avalanche/connectors/spell/events.sol @@ -4,8 +4,9 @@ pragma abicoder v2; contract Events { event LogCastDSA( - address indexed targetDSA, + address indexed targetDSA, string[] connectors, bytes[] datas ); + event LogCastSpells(string[] eventNames, bytes[] eventParams); } diff --git a/contracts/avalanche/connectors/spell/helpers.sol b/contracts/avalanche/connectors/spell/helpers.sol deleted file mode 100644 index 0576e10e..00000000 --- a/contracts/avalanche/connectors/spell/helpers.sol +++ /dev/null @@ -1,12 +0,0 @@ -//SPDX-License-Identifier: MIT -pragma solidity ^0.7.0; - -import { ListInterface } from "../../common/interfaces.sol"; - -contract SpellHelpers { - /** - * @dev InstaList - */ - ListInterface internal constant instaList = - ListInterface(0x9926955e0Dd681Dc303370C52f4Ad0a4dd061687); -} diff --git a/contracts/avalanche/connectors/spell/main.sol b/contracts/avalanche/connectors/spell/main.sol index 5e0356d4..d203022e 100644 --- a/contracts/avalanche/connectors/spell/main.sol +++ b/contracts/avalanche/connectors/spell/main.sol @@ -3,21 +3,21 @@ pragma solidity ^0.7.0; pragma experimental ABIEncoderV2; /** - * @title Spell. - * @dev Cast on DSAs. + * @title DSA Spell. + * @dev Cast spells on DSA. */ // import files import { AccountInterface } from "../../common/interfaces.sol"; -import { SpellHelpers } from "./helpers.sol"; +import { Stores } from "../../common/stores.sol"; import { Events } from "./events.sol"; -abstract contract Spell is SpellHelpers, Events { +abstract contract DSASpell is Events, Stores { /** *@dev Cast spells on DSA. *@param targetDSA target DSA to cast spells on. - *@param connectors connector names. - *@param datas datas for the cast. + *@param connectors Array of connector names. + *@param datas Array of connector calldatas. */ function castDSA( address targetDSA, @@ -30,13 +30,48 @@ abstract contract Spell is SpellHelpers, Events { { require(instaList.accountID(targetDSA) != 0, "not-a-DSA"); - AccountInterface(targetDSA).cast(connectors, datas, address(0)); + AccountInterface(targetDSA).cast(connectors, datas, address(this)); _eventName = "LogCastDSA(address,string[],bytes[])"; _eventParam = abi.encode(targetDSA, connectors, datas); } + + /** + *@dev Perform spells. + *@param connectors Array of connector names. + *@param datas Array of connector calldatas. + */ + function castSpells(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 _eventNames = new string[](_length); + bytes[] memory _eventParams = new bytes[](_length); + + for (uint256 i = 0; i < _length; i++) { + (bool success, bytes memory returnData) = _connectors[i] + .delegatecall(datas[i]); + require(success, "spells-failed"); + (_eventNames[i], _eventParams[i]) = abi.decode( + returnData, + (string, bytes) + ); + } + + eventName = "LogCastSpells(string[],bytes[])"; + eventParam = abi.encode(_eventNames, _eventParams); + } } -contract ConnectV2SpellConnectorPolygon is Spell { - string public name = "Spell-Connector-v1.0"; +contract ConnectV2DSASpellAvalanche is DSASpell { + string public name = "DSA-Spell-v1.0"; } diff --git a/contracts/fantom/common/stores.sol b/contracts/fantom/common/stores.sol index 0e16eb06..72285b6d 100644 --- a/contracts/fantom/common/stores.sol +++ b/contracts/fantom/common/stores.sol @@ -1,7 +1,7 @@ //SPDX-License-Identifier: MIT pragma solidity ^0.7.0; -import { MemoryInterface } from "./interfaces.sol"; +import { MemoryInterface, ListInterface, InstaConnectors } from "./interfaces.sol"; abstract contract Stores { /** @@ -22,6 +22,16 @@ abstract contract Stores { MemoryInterface internal constant instaMemory = MemoryInterface(0x56439117379A53bE3CC2C55217251e2481B7a1C8); + /** + * @dev Return InstaList address + */ + ListInterface internal constant instaList = ListInterface(0x10e166c3FAF887D8a61dE6c25039231eE694E926); + + /** + * @dev Return connectors Registry address + */ + InstaConnectors internal constant instaConnectors = InstaConnectors(0x819910794a030403F69247E1e5C0bBfF1593B968); + /** * @dev Get Uint value from InstaMemory Contract. */ diff --git a/contracts/fantom/connectors/spell/events.sol b/contracts/fantom/connectors/spell/events.sol index 1fff84f3..75048eff 100644 --- a/contracts/fantom/connectors/spell/events.sol +++ b/contracts/fantom/connectors/spell/events.sol @@ -4,8 +4,9 @@ pragma abicoder v2; contract Events { event LogCastDSA( - address indexed targetDSA, + address indexed targetDSA, string[] connectors, bytes[] datas ); + event LogCastSpells(string[] eventNames, bytes[] eventParams); } diff --git a/contracts/fantom/connectors/spell/helpers.sol b/contracts/fantom/connectors/spell/helpers.sol deleted file mode 100644 index ae065b8b..00000000 --- a/contracts/fantom/connectors/spell/helpers.sol +++ /dev/null @@ -1,12 +0,0 @@ -//SPDX-License-Identifier: MIT -pragma solidity ^0.7.0; - -import { ListInterface } from "../../common/interfaces.sol"; - -contract SpellHelpers { - /** - * @dev InstaList - */ - ListInterface internal constant instaList = - ListInterface(0x10e166c3FAF887D8a61dE6c25039231eE694E926); -} diff --git a/contracts/fantom/connectors/spell/main.sol b/contracts/fantom/connectors/spell/main.sol index 5e0356d4..15bce48d 100644 --- a/contracts/fantom/connectors/spell/main.sol +++ b/contracts/fantom/connectors/spell/main.sol @@ -3,21 +3,21 @@ pragma solidity ^0.7.0; pragma experimental ABIEncoderV2; /** - * @title Spell. - * @dev Cast on DSAs. + * @title DSA Spell. + * @dev Cast spells on DSA. */ // import files import { AccountInterface } from "../../common/interfaces.sol"; -import { SpellHelpers } from "./helpers.sol"; +import { Stores } from "../../common/stores.sol"; import { Events } from "./events.sol"; -abstract contract Spell is SpellHelpers, Events { +abstract contract DSASpell is Events, Stores { /** *@dev Cast spells on DSA. *@param targetDSA target DSA to cast spells on. - *@param connectors connector names. - *@param datas datas for the cast. + *@param connectors Array of connector names. + *@param datas Array of connector calldatas. */ function castDSA( address targetDSA, @@ -30,13 +30,48 @@ abstract contract Spell is SpellHelpers, Events { { require(instaList.accountID(targetDSA) != 0, "not-a-DSA"); - AccountInterface(targetDSA).cast(connectors, datas, address(0)); + AccountInterface(targetDSA).cast(connectors, datas, address(this)); _eventName = "LogCastDSA(address,string[],bytes[])"; _eventParam = abi.encode(targetDSA, connectors, datas); } + + /** + *@dev Perform spells. + *@param connectors Array of connector names. + *@param datas Array of connector calldatas. + */ + function castSpells(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 _eventNames = new string[](_length); + bytes[] memory _eventParams = new bytes[](_length); + + for (uint256 i = 0; i < _length; i++) { + (bool success, bytes memory returnData) = _connectors[i] + .delegatecall(datas[i]); + require(success, "spells-failed"); + (_eventNames[i], _eventParams[i]) = abi.decode( + returnData, + (string, bytes) + ); + } + + eventName = "LogCastSpells(string[],bytes[])"; + eventParam = abi.encode(_eventNames, _eventParams); + } } -contract ConnectV2SpellConnectorPolygon is Spell { - string public name = "Spell-Connector-v1.0"; +contract ConnectV2DSASpellFantom is DSASpell { + string public name = "DSA-Spell-v1.0"; } diff --git a/contracts/mainnet/common/stores.sol b/contracts/mainnet/common/stores.sol index 25cb226f..8be01eb7 100644 --- a/contracts/mainnet/common/stores.sol +++ b/contracts/mainnet/common/stores.sol @@ -1,7 +1,7 @@ //SPDX-License-Identifier: MIT pragma solidity ^0.7.0; -import { MemoryInterface, InstaMapping } from "./interfaces.sol"; +import { MemoryInterface, InstaMapping, ListInterface, InstaConnectors } from "./interfaces.sol"; abstract contract Stores { @@ -26,6 +26,16 @@ abstract contract Stores { */ InstaMapping constant internal instaMapping = InstaMapping(0xe81F70Cc7C0D46e12d70efc60607F16bbD617E88); + /** + * @dev Return InstaList Address + */ + ListInterface internal constant instaList = ListInterface(0x4c8a1BEb8a87765788946D6B19C6C6355194AbEb); + + /** + * @dev Return connectors registry address + */ + InstaConnectors internal constant instaConnectors = InstaConnectors(0x97b0B3A8bDeFE8cB9563a3c610019Ad10DB8aD11); + /** * @dev Get Uint value from InstaMemory Contract. */ diff --git a/contracts/mainnet/connectors/spell/events.sol b/contracts/mainnet/connectors/spell/events.sol index 1fff84f3..75048eff 100644 --- a/contracts/mainnet/connectors/spell/events.sol +++ b/contracts/mainnet/connectors/spell/events.sol @@ -4,8 +4,9 @@ pragma abicoder v2; contract Events { event LogCastDSA( - address indexed targetDSA, + address indexed targetDSA, string[] connectors, bytes[] datas ); + event LogCastSpells(string[] eventNames, bytes[] eventParams); } diff --git a/contracts/mainnet/connectors/spell/helpers.sol b/contracts/mainnet/connectors/spell/helpers.sol deleted file mode 100644 index a0a7582a..00000000 --- a/contracts/mainnet/connectors/spell/helpers.sol +++ /dev/null @@ -1,12 +0,0 @@ -//SPDX-License-Identifier: MIT -pragma solidity ^0.7.0; - -import { ListInterface } from "../../common/interfaces.sol"; - -contract SpellHelpers { - /** - * @dev InstaList - */ - ListInterface internal constant instaList = - ListInterface(0x4c8a1BEb8a87765788946D6B19C6C6355194AbEb); -} diff --git a/contracts/mainnet/connectors/spell/main.sol b/contracts/mainnet/connectors/spell/main.sol index 5e0356d4..d2ca441e 100644 --- a/contracts/mainnet/connectors/spell/main.sol +++ b/contracts/mainnet/connectors/spell/main.sol @@ -3,21 +3,21 @@ pragma solidity ^0.7.0; pragma experimental ABIEncoderV2; /** - * @title Spell. - * @dev Cast on DSAs. + * @title DSA Spell. + * @dev Cast spells on DSA. */ // import files import { AccountInterface } from "../../common/interfaces.sol"; -import { SpellHelpers } from "./helpers.sol"; +import { Stores } from "../../common/stores.sol"; import { Events } from "./events.sol"; -abstract contract Spell is SpellHelpers, Events { +abstract contract DSASpell is Events, Stores { /** *@dev Cast spells on DSA. *@param targetDSA target DSA to cast spells on. - *@param connectors connector names. - *@param datas datas for the cast. + *@param connectors Array of connector names. + *@param datas Array of connector calldatas. */ function castDSA( address targetDSA, @@ -30,13 +30,48 @@ abstract contract Spell is SpellHelpers, Events { { require(instaList.accountID(targetDSA) != 0, "not-a-DSA"); - AccountInterface(targetDSA).cast(connectors, datas, address(0)); + AccountInterface(targetDSA).cast(connectors, datas, address(this)); _eventName = "LogCastDSA(address,string[],bytes[])"; _eventParam = abi.encode(targetDSA, connectors, datas); } + + /** + *@dev Perform spells. + *@param connectors Array of connector names. + *@param datas Array of connector calldatas. + */ + function castSpells(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 _eventNames = new string[](_length); + bytes[] memory _eventParams = new bytes[](_length); + + for (uint256 i = 0; i < _length; i++) { + (bool success, bytes memory returnData) = _connectors[i] + .delegatecall(datas[i]); + require(success, "spells-failed"); + (_eventNames[i], _eventParams[i]) = abi.decode( + returnData, + (string, bytes) + ); + } + + eventName = "LogCastSpells(string[],bytes[])"; + eventParam = abi.encode(_eventNames, _eventParams); + } } -contract ConnectV2SpellConnectorPolygon is Spell { - string public name = "Spell-Connector-v1.0"; +contract ConnectV2DSASpell is DSASpell { + string public name = "DSA-Spell-v1.0"; } diff --git a/contracts/optimism/common/stores.sol b/contracts/optimism/common/stores.sol index 09d3cfca..d13351bb 100644 --- a/contracts/optimism/common/stores.sol +++ b/contracts/optimism/common/stores.sol @@ -1,7 +1,7 @@ //SPDX-License-Identifier: MIT pragma solidity ^0.7.0; -import { MemoryInterface } from "./interfaces.sol"; +import { MemoryInterface, ListInterface, InstaConnectors } from "./interfaces.sol"; abstract contract Stores { @@ -20,6 +20,16 @@ abstract contract Stores { */ MemoryInterface constant internal instaMemory = MemoryInterface(0x3254Ce8f5b1c82431B8f21Df01918342215825C2); + /** + * @dev Return InstaList address + */ + ListInterface internal constant instaList = ListInterface(0x9926955e0Dd681Dc303370C52f4Ad0a4dd061687); + + /** + * @dev Returns connectors registry address + */ + InstaConnectors internal constant instaConnectors = InstaConnectors(0x127d8cD0E2b2E0366D522DeA53A787bfE9002C14); + /** * @dev Get Uint value from InstaMemory Contract. */ diff --git a/contracts/optimism/connectors/spell/events.sol b/contracts/optimism/connectors/spell/events.sol index 1fff84f3..75048eff 100644 --- a/contracts/optimism/connectors/spell/events.sol +++ b/contracts/optimism/connectors/spell/events.sol @@ -4,8 +4,9 @@ pragma abicoder v2; contract Events { event LogCastDSA( - address indexed targetDSA, + address indexed targetDSA, string[] connectors, bytes[] datas ); + event LogCastSpells(string[] eventNames, bytes[] eventParams); } diff --git a/contracts/optimism/connectors/spell/helpers.sol b/contracts/optimism/connectors/spell/helpers.sol deleted file mode 100644 index 0576e10e..00000000 --- a/contracts/optimism/connectors/spell/helpers.sol +++ /dev/null @@ -1,12 +0,0 @@ -//SPDX-License-Identifier: MIT -pragma solidity ^0.7.0; - -import { ListInterface } from "../../common/interfaces.sol"; - -contract SpellHelpers { - /** - * @dev InstaList - */ - ListInterface internal constant instaList = - ListInterface(0x9926955e0Dd681Dc303370C52f4Ad0a4dd061687); -} diff --git a/contracts/optimism/connectors/spell/main.sol b/contracts/optimism/connectors/spell/main.sol index 5e0356d4..821c6b0b 100644 --- a/contracts/optimism/connectors/spell/main.sol +++ b/contracts/optimism/connectors/spell/main.sol @@ -3,21 +3,21 @@ pragma solidity ^0.7.0; pragma experimental ABIEncoderV2; /** - * @title Spell. - * @dev Cast on DSAs. + * @title DSA Spell. + * @dev Cast spells on DSA. */ // import files import { AccountInterface } from "../../common/interfaces.sol"; -import { SpellHelpers } from "./helpers.sol"; +import { Stores } from "../../common/stores.sol"; import { Events } from "./events.sol"; -abstract contract Spell is SpellHelpers, Events { +abstract contract DSASpell is Events, Stores { /** *@dev Cast spells on DSA. *@param targetDSA target DSA to cast spells on. - *@param connectors connector names. - *@param datas datas for the cast. + *@param connectors Array of connector names. + *@param datas Array of connector calldatas. */ function castDSA( address targetDSA, @@ -30,13 +30,48 @@ abstract contract Spell is SpellHelpers, Events { { require(instaList.accountID(targetDSA) != 0, "not-a-DSA"); - AccountInterface(targetDSA).cast(connectors, datas, address(0)); + AccountInterface(targetDSA).cast(connectors, datas, address(this)); _eventName = "LogCastDSA(address,string[],bytes[])"; _eventParam = abi.encode(targetDSA, connectors, datas); } + + /** + *@dev Perform spells. + *@param connectors Array of connector names. + *@param datas Array of connector calldatas. + */ + function castSpells(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 _eventNames = new string[](_length); + bytes[] memory _eventParams = new bytes[](_length); + + for (uint256 i = 0; i < _length; i++) { + (bool success, bytes memory returnData) = _connectors[i] + .delegatecall(datas[i]); + require(success, "spells-failed"); + (_eventNames[i], _eventParams[i]) = abi.decode( + returnData, + (string, bytes) + ); + } + + eventName = "LogCastSpells(string[],bytes[])"; + eventParam = abi.encode(_eventNames, _eventParams); + } } -contract ConnectV2SpellConnectorPolygon is Spell { - string public name = "Spell-Connector-v1.0"; +contract ConnectV2DSASpellOptimism is DSASpell { + string public name = "DSA-Spell-v1.0"; } diff --git a/contracts/polygon/common/stores.sol b/contracts/polygon/common/stores.sol index e5e21f55..9231dcde 100644 --- a/contracts/polygon/common/stores.sol +++ b/contracts/polygon/common/stores.sol @@ -1,7 +1,7 @@ //SPDX-License-Identifier: MIT pragma solidity ^0.7.0; -import { MemoryInterface, InstaMapping } from "./interfaces.sol"; +import { MemoryInterface, InstaMapping, ListInterface, InstaConnectors } from "./interfaces.sol"; abstract contract Stores { @@ -21,6 +21,16 @@ abstract contract Stores { */ MemoryInterface constant internal instaMemory = MemoryInterface(0x6C7256cf7C003dD85683339F75DdE9971f98f2FD); + /** + * @dev Return InstaList address + */ + ListInterface internal constant instaList = ListInterface(0x839c2D3aDe63DF5b0b8F3E57D5e145057Ab41556); + + /** + * @dev Return connectors registry address + */ + InstaConnectors internal constant instaConnectors = InstaConnectors(0x2A00684bFAb9717C21271E0751BCcb7d2D763c88); + /** * @dev Get Uint value from InstaMemory Contract. */ diff --git a/contracts/polygon/connectors/spell/events.sol b/contracts/polygon/connectors/spell/events.sol index 1fff84f3..75048eff 100644 --- a/contracts/polygon/connectors/spell/events.sol +++ b/contracts/polygon/connectors/spell/events.sol @@ -4,8 +4,9 @@ pragma abicoder v2; contract Events { event LogCastDSA( - address indexed targetDSA, + address indexed targetDSA, string[] connectors, bytes[] datas ); + event LogCastSpells(string[] eventNames, bytes[] eventParams); } diff --git a/contracts/polygon/connectors/spell/helpers.sol b/contracts/polygon/connectors/spell/helpers.sol deleted file mode 100644 index ae03c240..00000000 --- a/contracts/polygon/connectors/spell/helpers.sol +++ /dev/null @@ -1,12 +0,0 @@ -//SPDX-License-Identifier: MIT -pragma solidity ^0.7.0; - -import { ListInterface } from "../../common/interfaces.sol"; - -contract SpellHelpers { - /** - * @dev InstaList - */ - ListInterface internal constant instaList = - ListInterface(0x839c2D3aDe63DF5b0b8F3E57D5e145057Ab41556); -} diff --git a/contracts/polygon/connectors/spell/main.sol b/contracts/polygon/connectors/spell/main.sol index 5e0356d4..0252cc63 100644 --- a/contracts/polygon/connectors/spell/main.sol +++ b/contracts/polygon/connectors/spell/main.sol @@ -3,21 +3,21 @@ pragma solidity ^0.7.0; pragma experimental ABIEncoderV2; /** - * @title Spell. - * @dev Cast on DSAs. + * @title DSA Spell. + * @dev Cast spells on DSA. */ // import files import { AccountInterface } from "../../common/interfaces.sol"; -import { SpellHelpers } from "./helpers.sol"; +import { Stores } from "../../common/stores.sol"; import { Events } from "./events.sol"; -abstract contract Spell is SpellHelpers, Events { +abstract contract DSASpell is Events, Stores { /** *@dev Cast spells on DSA. *@param targetDSA target DSA to cast spells on. - *@param connectors connector names. - *@param datas datas for the cast. + *@param connectors Array of connector names. + *@param datas Array of connector calldatas. */ function castDSA( address targetDSA, @@ -30,13 +30,48 @@ abstract contract Spell is SpellHelpers, Events { { require(instaList.accountID(targetDSA) != 0, "not-a-DSA"); - AccountInterface(targetDSA).cast(connectors, datas, address(0)); + AccountInterface(targetDSA).cast(connectors, datas, address(this)); _eventName = "LogCastDSA(address,string[],bytes[])"; _eventParam = abi.encode(targetDSA, connectors, datas); } + + /** + *@dev Perform spells. + *@param connectors Array of connector names. + *@param datas Array of connector calldatas. + */ + function castSpells(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 _eventNames = new string[](_length); + bytes[] memory _eventParams = new bytes[](_length); + + for (uint256 i = 0; i < _length; i++) { + (bool success, bytes memory returnData) = _connectors[i] + .delegatecall(datas[i]); + require(success, "spells-failed"); + (_eventNames[i], _eventParams[i]) = abi.decode( + returnData, + (string, bytes) + ); + } + + eventName = "LogCastSpells(string[],bytes[])"; + eventParam = abi.encode(_eventNames, _eventParams); + } } -contract ConnectV2SpellConnectorPolygon is Spell { - string public name = "Spell-Connector-v1.0"; +contract ConnectV2DSASpellPolygon is DSASpell { + string public name = "DSA-Spell-v1.0"; } From 292c2812de4ac5d74a76d9d63a95776b3ffe940e Mon Sep 17 00:00:00 2001 From: Richa-iitr Date: Sun, 19 Jun 2022 21:01:35 +0530 Subject: [PATCH 03/14] minor changes --- contracts/arbitrum/common/stores.sol | 4 ++-- contracts/avalanche/common/stores.sol | 2 +- contracts/fantom/common/stores.sol | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/contracts/arbitrum/common/stores.sol b/contracts/arbitrum/common/stores.sol index 40dd2731..bd27493f 100644 --- a/contracts/arbitrum/common/stores.sol +++ b/contracts/arbitrum/common/stores.sol @@ -27,9 +27,9 @@ abstract contract Stores { ListInterface internal constant instaList = ListInterface(0x3565F6057b7fFE36984779A507fC87b31EFb0f09); /** - * @dev Return InstaConnectors Registry Address + * @dev Return connectors Registry Address */ - InstaConnectors internal constant instaConnectors = InstaConnectors(0x67fCE99Dd6d8d659eea2a1ac1b8881c57eb6592B); + InstaConnectors internal constant instaConnectors = InstaConnectors(0x67fCE99Dd6d8d659eea2a1ac1b8881c57eb6592B); /** * @dev Get Uint value from InstaMemory Contract. diff --git a/contracts/avalanche/common/stores.sol b/contracts/avalanche/common/stores.sol index 3d35be30..2e84c065 100644 --- a/contracts/avalanche/common/stores.sol +++ b/contracts/avalanche/common/stores.sol @@ -27,7 +27,7 @@ abstract contract Stores { ListInterface internal constant instaList = ListInterface(0x9926955e0Dd681Dc303370C52f4Ad0a4dd061687); /** - * @dev Return InstaConnectors Registry address + * @dev Return connectors registry address */ InstaConnectors internal constant instaConnectors = InstaConnectors(0x127d8cD0E2b2E0366D522DeA53A787bfE9002C14); diff --git a/contracts/fantom/common/stores.sol b/contracts/fantom/common/stores.sol index 72285b6d..39c2c8ae 100644 --- a/contracts/fantom/common/stores.sol +++ b/contracts/fantom/common/stores.sol @@ -28,7 +28,7 @@ abstract contract Stores { ListInterface internal constant instaList = ListInterface(0x10e166c3FAF887D8a61dE6c25039231eE694E926); /** - * @dev Return connectors Registry address + * @dev Return connectors registry address */ InstaConnectors internal constant instaConnectors = InstaConnectors(0x819910794a030403F69247E1e5C0bBfF1593B968); From 946a1ed5aa275a9068ff233b5f73cb4b2b6a2b69 Mon Sep 17 00:00:00 2001 From: Richa-iitr Date: Sun, 19 Jun 2022 21:03:05 +0530 Subject: [PATCH 04/14] linting --- contracts/arbitrum/common/stores.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/arbitrum/common/stores.sol b/contracts/arbitrum/common/stores.sol index bd27493f..ca0b1396 100644 --- a/contracts/arbitrum/common/stores.sol +++ b/contracts/arbitrum/common/stores.sol @@ -27,9 +27,9 @@ abstract contract Stores { ListInterface internal constant instaList = ListInterface(0x3565F6057b7fFE36984779A507fC87b31EFb0f09); /** - * @dev Return connectors Registry Address + * @dev Return connectors registry address */ - InstaConnectors internal constant instaConnectors = InstaConnectors(0x67fCE99Dd6d8d659eea2a1ac1b8881c57eb6592B); + InstaConnectors internal constant instaConnectors = InstaConnectors(0x67fCE99Dd6d8d659eea2a1ac1b8881c57eb6592B); /** * @dev Get Uint value from InstaMemory Contract. From a4d7206c58af11d58641c79e67e7667daf4ce08d Mon Sep 17 00:00:00 2001 From: Richa-iitr Date: Sun, 19 Jun 2022 21:06:03 +0530 Subject: [PATCH 05/14] linting --- contracts/arbitrum/common/stores.sol | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/arbitrum/common/stores.sol b/contracts/arbitrum/common/stores.sol index ca0b1396..650cccb1 100644 --- a/contracts/arbitrum/common/stores.sol +++ b/contracts/arbitrum/common/stores.sol @@ -27,9 +27,9 @@ abstract contract Stores { ListInterface internal constant instaList = ListInterface(0x3565F6057b7fFE36984779A507fC87b31EFb0f09); /** - * @dev Return connectors registry address - */ - InstaConnectors internal constant instaConnectors = InstaConnectors(0x67fCE99Dd6d8d659eea2a1ac1b8881c57eb6592B); + * @dev Return connectors registry address + */ + InstaConnectors internal constant instaConnectors = InstaConnectors(0x67fCE99Dd6d8d659eea2a1ac1b8881c57eb6592B); /** * @dev Get Uint value from InstaMemory Contract. From a35ab9ec4b9de68413741523a95a9d8f9d0e5b7e Mon Sep 17 00:00:00 2001 From: Richa-iitr Date: Sun, 19 Jun 2022 21:06:51 +0530 Subject: [PATCH 06/14] minor change --- contracts/arbitrum/common/stores.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/arbitrum/common/stores.sol b/contracts/arbitrum/common/stores.sol index 650cccb1..01d5ccd3 100644 --- a/contracts/arbitrum/common/stores.sol +++ b/contracts/arbitrum/common/stores.sol @@ -29,7 +29,7 @@ abstract contract Stores { /** * @dev Return connectors registry address */ - InstaConnectors internal constant instaConnectors = InstaConnectors(0x67fCE99Dd6d8d659eea2a1ac1b8881c57eb6592B); + InstaConnectors internal constant instaConnectors = InstaConnectors(0x67fCE99Dd6d8d659eea2a1ac1b8881c57eb6592B); /** * @dev Get Uint value from InstaMemory Contract. From cf0e7ed240d71f736caec220a2064f61cfd400af Mon Sep 17 00:00:00 2001 From: Richa-iitr Date: Mon, 20 Jun 2022 05:29:53 +0530 Subject: [PATCH 07/14] renamed functions --- .../arbitrum/connectors/spell/events.sol | 4 ++-- contracts/arbitrum/connectors/spell/main.sol | 20 ++++++++++--------- .../avalanche/connectors/spell/events.sol | 4 ++-- contracts/avalanche/connectors/spell/main.sol | 20 ++++++++++--------- contracts/fantom/connectors/spell/events.sol | 4 ++-- contracts/fantom/connectors/spell/main.sol | 20 ++++++++++--------- contracts/mainnet/connectors/spell/events.sol | 4 ++-- contracts/mainnet/connectors/spell/main.sol | 20 ++++++++++--------- .../optimism/connectors/spell/events.sol | 4 ++-- contracts/optimism/connectors/spell/main.sol | 20 ++++++++++--------- contracts/polygon/connectors/spell/events.sol | 4 ++-- contracts/polygon/connectors/spell/main.sol | 20 ++++++++++--------- 12 files changed, 78 insertions(+), 66 deletions(-) diff --git a/contracts/arbitrum/connectors/spell/events.sol b/contracts/arbitrum/connectors/spell/events.sol index 75048eff..036c990f 100644 --- a/contracts/arbitrum/connectors/spell/events.sol +++ b/contracts/arbitrum/connectors/spell/events.sol @@ -3,10 +3,10 @@ pragma solidity ^0.7.0; pragma abicoder v2; contract Events { - event LogCastDSA( + event LogCastOnDSA( address indexed targetDSA, string[] connectors, bytes[] datas ); - event LogCastSpells(string[] eventNames, bytes[] eventParams); + event LogRetrySpell(string[] eventNames, bytes[] eventParams); } diff --git a/contracts/arbitrum/connectors/spell/main.sol b/contracts/arbitrum/connectors/spell/main.sol index 47d65d38..54d26cec 100644 --- a/contracts/arbitrum/connectors/spell/main.sol +++ b/contracts/arbitrum/connectors/spell/main.sol @@ -19,7 +19,7 @@ abstract contract DSASpell is Events, Stores { *@param connectors Array of connector names. *@param datas Array of connector calldatas. */ - function castDSA( + function castOnDSA( address targetDSA, string[] memory connectors, bytes[] memory datas @@ -32,7 +32,7 @@ abstract contract DSASpell is Events, Stores { AccountInterface(targetDSA).cast(connectors, datas, address(this)); - _eventName = "LogCastDSA(address,string[],bytes[])"; + _eventName = "LogCastOnDSA(address,string[],bytes[])"; _eventParam = abi.encode(targetDSA, connectors, datas); } @@ -41,7 +41,7 @@ abstract contract DSASpell is Events, Stores { *@param connectors Array of connector names. *@param datas Array of connector calldatas. */ - function castSpells(string[] memory connectors, bytes[] memory datas) + function retrySpell(string[] memory connectors, bytes[] memory datas) external payable returns (string memory eventName, bytes memory eventParam) @@ -60,14 +60,16 @@ abstract contract DSASpell is Events, Stores { for (uint256 i = 0; i < _length; i++) { (bool success, bytes memory returnData) = _connectors[i] .delegatecall(datas[i]); - require(success, "spells-failed"); - (_eventNames[i], _eventParams[i]) = abi.decode( - returnData, - (string, bytes) - ); + + if (success) { + (_eventNames[i], _eventParams[i]) = abi.decode( + returnData, + (string, bytes) + ); + } } - eventName = "LogCastSpells(string[],bytes[])"; + eventName = "LogRetrySpell(string[],bytes[])"; eventParam = abi.encode(_eventNames, _eventParams); } } diff --git a/contracts/avalanche/connectors/spell/events.sol b/contracts/avalanche/connectors/spell/events.sol index 75048eff..036c990f 100644 --- a/contracts/avalanche/connectors/spell/events.sol +++ b/contracts/avalanche/connectors/spell/events.sol @@ -3,10 +3,10 @@ pragma solidity ^0.7.0; pragma abicoder v2; contract Events { - event LogCastDSA( + event LogCastOnDSA( address indexed targetDSA, string[] connectors, bytes[] datas ); - event LogCastSpells(string[] eventNames, bytes[] eventParams); + event LogRetrySpell(string[] eventNames, bytes[] eventParams); } diff --git a/contracts/avalanche/connectors/spell/main.sol b/contracts/avalanche/connectors/spell/main.sol index d203022e..b09a80b9 100644 --- a/contracts/avalanche/connectors/spell/main.sol +++ b/contracts/avalanche/connectors/spell/main.sol @@ -19,7 +19,7 @@ abstract contract DSASpell is Events, Stores { *@param connectors Array of connector names. *@param datas Array of connector calldatas. */ - function castDSA( + function castOnDSA( address targetDSA, string[] memory connectors, bytes[] memory datas @@ -32,7 +32,7 @@ abstract contract DSASpell is Events, Stores { AccountInterface(targetDSA).cast(connectors, datas, address(this)); - _eventName = "LogCastDSA(address,string[],bytes[])"; + _eventName = "LogCastOnDSA(address,string[],bytes[])"; _eventParam = abi.encode(targetDSA, connectors, datas); } @@ -41,7 +41,7 @@ abstract contract DSASpell is Events, Stores { *@param connectors Array of connector names. *@param datas Array of connector calldatas. */ - function castSpells(string[] memory connectors, bytes[] memory datas) + function retrySpell(string[] memory connectors, bytes[] memory datas) external payable returns (string memory eventName, bytes memory eventParam) @@ -60,14 +60,16 @@ abstract contract DSASpell is Events, Stores { for (uint256 i = 0; i < _length; i++) { (bool success, bytes memory returnData) = _connectors[i] .delegatecall(datas[i]); - require(success, "spells-failed"); - (_eventNames[i], _eventParams[i]) = abi.decode( - returnData, - (string, bytes) - ); + + if (success) { + (_eventNames[i], _eventParams[i]) = abi.decode( + returnData, + (string, bytes) + ); + } } - eventName = "LogCastSpells(string[],bytes[])"; + eventName = "LogRetrySpell(string[],bytes[])"; eventParam = abi.encode(_eventNames, _eventParams); } } diff --git a/contracts/fantom/connectors/spell/events.sol b/contracts/fantom/connectors/spell/events.sol index 75048eff..036c990f 100644 --- a/contracts/fantom/connectors/spell/events.sol +++ b/contracts/fantom/connectors/spell/events.sol @@ -3,10 +3,10 @@ pragma solidity ^0.7.0; pragma abicoder v2; contract Events { - event LogCastDSA( + event LogCastOnDSA( address indexed targetDSA, string[] connectors, bytes[] datas ); - event LogCastSpells(string[] eventNames, bytes[] eventParams); + event LogRetrySpell(string[] eventNames, bytes[] eventParams); } diff --git a/contracts/fantom/connectors/spell/main.sol b/contracts/fantom/connectors/spell/main.sol index 15bce48d..6c86a123 100644 --- a/contracts/fantom/connectors/spell/main.sol +++ b/contracts/fantom/connectors/spell/main.sol @@ -19,7 +19,7 @@ abstract contract DSASpell is Events, Stores { *@param connectors Array of connector names. *@param datas Array of connector calldatas. */ - function castDSA( + function castOnDSA( address targetDSA, string[] memory connectors, bytes[] memory datas @@ -32,7 +32,7 @@ abstract contract DSASpell is Events, Stores { AccountInterface(targetDSA).cast(connectors, datas, address(this)); - _eventName = "LogCastDSA(address,string[],bytes[])"; + _eventName = "LogCastOnDSA(address,string[],bytes[])"; _eventParam = abi.encode(targetDSA, connectors, datas); } @@ -41,7 +41,7 @@ abstract contract DSASpell is Events, Stores { *@param connectors Array of connector names. *@param datas Array of connector calldatas. */ - function castSpells(string[] memory connectors, bytes[] memory datas) + function retrySpell(string[] memory connectors, bytes[] memory datas) external payable returns (string memory eventName, bytes memory eventParam) @@ -60,14 +60,16 @@ abstract contract DSASpell is Events, Stores { for (uint256 i = 0; i < _length; i++) { (bool success, bytes memory returnData) = _connectors[i] .delegatecall(datas[i]); - require(success, "spells-failed"); - (_eventNames[i], _eventParams[i]) = abi.decode( - returnData, - (string, bytes) - ); + + if (success) { + (_eventNames[i], _eventParams[i]) = abi.decode( + returnData, + (string, bytes) + ); + } } - eventName = "LogCastSpells(string[],bytes[])"; + eventName = "LogRetrySpell(string[],bytes[])"; eventParam = abi.encode(_eventNames, _eventParams); } } diff --git a/contracts/mainnet/connectors/spell/events.sol b/contracts/mainnet/connectors/spell/events.sol index 75048eff..036c990f 100644 --- a/contracts/mainnet/connectors/spell/events.sol +++ b/contracts/mainnet/connectors/spell/events.sol @@ -3,10 +3,10 @@ pragma solidity ^0.7.0; pragma abicoder v2; contract Events { - event LogCastDSA( + event LogCastOnDSA( address indexed targetDSA, string[] connectors, bytes[] datas ); - event LogCastSpells(string[] eventNames, bytes[] eventParams); + event LogRetrySpell(string[] eventNames, bytes[] eventParams); } diff --git a/contracts/mainnet/connectors/spell/main.sol b/contracts/mainnet/connectors/spell/main.sol index d2ca441e..c1a92dea 100644 --- a/contracts/mainnet/connectors/spell/main.sol +++ b/contracts/mainnet/connectors/spell/main.sol @@ -19,7 +19,7 @@ abstract contract DSASpell is Events, Stores { *@param connectors Array of connector names. *@param datas Array of connector calldatas. */ - function castDSA( + function castOnDSA( address targetDSA, string[] memory connectors, bytes[] memory datas @@ -32,7 +32,7 @@ abstract contract DSASpell is Events, Stores { AccountInterface(targetDSA).cast(connectors, datas, address(this)); - _eventName = "LogCastDSA(address,string[],bytes[])"; + _eventName = "LogCastOnDSA(address,string[],bytes[])"; _eventParam = abi.encode(targetDSA, connectors, datas); } @@ -41,7 +41,7 @@ abstract contract DSASpell is Events, Stores { *@param connectors Array of connector names. *@param datas Array of connector calldatas. */ - function castSpells(string[] memory connectors, bytes[] memory datas) + function retrySpell(string[] memory connectors, bytes[] memory datas) external payable returns (string memory eventName, bytes memory eventParam) @@ -60,14 +60,16 @@ abstract contract DSASpell is Events, Stores { for (uint256 i = 0; i < _length; i++) { (bool success, bytes memory returnData) = _connectors[i] .delegatecall(datas[i]); - require(success, "spells-failed"); - (_eventNames[i], _eventParams[i]) = abi.decode( - returnData, - (string, bytes) - ); + + if (success) { + (_eventNames[i], _eventParams[i]) = abi.decode( + returnData, + (string, bytes) + ); + } } - eventName = "LogCastSpells(string[],bytes[])"; + eventName = "LogRetrySpell(string[],bytes[])"; eventParam = abi.encode(_eventNames, _eventParams); } } diff --git a/contracts/optimism/connectors/spell/events.sol b/contracts/optimism/connectors/spell/events.sol index 75048eff..036c990f 100644 --- a/contracts/optimism/connectors/spell/events.sol +++ b/contracts/optimism/connectors/spell/events.sol @@ -3,10 +3,10 @@ pragma solidity ^0.7.0; pragma abicoder v2; contract Events { - event LogCastDSA( + event LogCastOnDSA( address indexed targetDSA, string[] connectors, bytes[] datas ); - event LogCastSpells(string[] eventNames, bytes[] eventParams); + event LogRetrySpell(string[] eventNames, bytes[] eventParams); } diff --git a/contracts/optimism/connectors/spell/main.sol b/contracts/optimism/connectors/spell/main.sol index 821c6b0b..557aeed0 100644 --- a/contracts/optimism/connectors/spell/main.sol +++ b/contracts/optimism/connectors/spell/main.sol @@ -19,7 +19,7 @@ abstract contract DSASpell is Events, Stores { *@param connectors Array of connector names. *@param datas Array of connector calldatas. */ - function castDSA( + function castOnDSA( address targetDSA, string[] memory connectors, bytes[] memory datas @@ -32,7 +32,7 @@ abstract contract DSASpell is Events, Stores { AccountInterface(targetDSA).cast(connectors, datas, address(this)); - _eventName = "LogCastDSA(address,string[],bytes[])"; + _eventName = "LogCastOnDSA(address,string[],bytes[])"; _eventParam = abi.encode(targetDSA, connectors, datas); } @@ -41,7 +41,7 @@ abstract contract DSASpell is Events, Stores { *@param connectors Array of connector names. *@param datas Array of connector calldatas. */ - function castSpells(string[] memory connectors, bytes[] memory datas) + function retrySpell(string[] memory connectors, bytes[] memory datas) external payable returns (string memory eventName, bytes memory eventParam) @@ -60,14 +60,16 @@ abstract contract DSASpell is Events, Stores { for (uint256 i = 0; i < _length; i++) { (bool success, bytes memory returnData) = _connectors[i] .delegatecall(datas[i]); - require(success, "spells-failed"); - (_eventNames[i], _eventParams[i]) = abi.decode( - returnData, - (string, bytes) - ); + + if (success) { + (_eventNames[i], _eventParams[i]) = abi.decode( + returnData, + (string, bytes) + ); + } } - eventName = "LogCastSpells(string[],bytes[])"; + eventName = "LogRetrySpell(string[],bytes[])"; eventParam = abi.encode(_eventNames, _eventParams); } } diff --git a/contracts/polygon/connectors/spell/events.sol b/contracts/polygon/connectors/spell/events.sol index 75048eff..036c990f 100644 --- a/contracts/polygon/connectors/spell/events.sol +++ b/contracts/polygon/connectors/spell/events.sol @@ -3,10 +3,10 @@ pragma solidity ^0.7.0; pragma abicoder v2; contract Events { - event LogCastDSA( + event LogCastOnDSA( address indexed targetDSA, string[] connectors, bytes[] datas ); - event LogCastSpells(string[] eventNames, bytes[] eventParams); + event LogRetrySpell(string[] eventNames, bytes[] eventParams); } diff --git a/contracts/polygon/connectors/spell/main.sol b/contracts/polygon/connectors/spell/main.sol index 0252cc63..3d44cb3a 100644 --- a/contracts/polygon/connectors/spell/main.sol +++ b/contracts/polygon/connectors/spell/main.sol @@ -19,7 +19,7 @@ abstract contract DSASpell is Events, Stores { *@param connectors Array of connector names. *@param datas Array of connector calldatas. */ - function castDSA( + function castOnDSA( address targetDSA, string[] memory connectors, bytes[] memory datas @@ -32,7 +32,7 @@ abstract contract DSASpell is Events, Stores { AccountInterface(targetDSA).cast(connectors, datas, address(this)); - _eventName = "LogCastDSA(address,string[],bytes[])"; + _eventName = "LogCastOnDSA(address,string[],bytes[])"; _eventParam = abi.encode(targetDSA, connectors, datas); } @@ -41,7 +41,7 @@ abstract contract DSASpell is Events, Stores { *@param connectors Array of connector names. *@param datas Array of connector calldatas. */ - function castSpells(string[] memory connectors, bytes[] memory datas) + function retrySpell(string[] memory connectors, bytes[] memory datas) external payable returns (string memory eventName, bytes memory eventParam) @@ -60,14 +60,16 @@ abstract contract DSASpell is Events, Stores { for (uint256 i = 0; i < _length; i++) { (bool success, bytes memory returnData) = _connectors[i] .delegatecall(datas[i]); - require(success, "spells-failed"); - (_eventNames[i], _eventParams[i]) = abi.decode( - returnData, - (string, bytes) - ); + + if (success) { + (_eventNames[i], _eventParams[i]) = abi.decode( + returnData, + (string, bytes) + ); + } } - eventName = "LogCastSpells(string[],bytes[])"; + eventName = "LogRetrySpell(string[],bytes[])"; eventParam = abi.encode(_eventNames, _eventParams); } } From 559ab1f4e172648f1bca1440442e77e2c3ad0e4d Mon Sep 17 00:00:00 2001 From: Richa-iitr Date: Mon, 20 Jun 2022 08:20:49 +0530 Subject: [PATCH 08/14] added tests --- test/arbitrum/dsa-spell/dsa-spell.test.ts | 154 +++++++++++++++++ test/avalanche/dsa-spell/dsa-spell.test.ts | 179 ++++++++++++++++++++ test/fantom/dsa-spell/dsa-spell.test.ts | 156 ++++++++++++++++++ test/mainnet/dsa-spell/dsa-spell.test.ts | 154 +++++++++++++++++ test/optimism/dsa-spell/dsa-spell.test.ts | 154 +++++++++++++++++ test/polygon/dsa-spell/dsa-spell.test.ts | 182 +++++++++++++++++++++ 6 files changed, 979 insertions(+) create mode 100644 test/arbitrum/dsa-spell/dsa-spell.test.ts create mode 100644 test/avalanche/dsa-spell/dsa-spell.test.ts create mode 100644 test/fantom/dsa-spell/dsa-spell.test.ts create mode 100644 test/mainnet/dsa-spell/dsa-spell.test.ts create mode 100644 test/optimism/dsa-spell/dsa-spell.test.ts create mode 100644 test/polygon/dsa-spell/dsa-spell.test.ts diff --git a/test/arbitrum/dsa-spell/dsa-spell.test.ts b/test/arbitrum/dsa-spell/dsa-spell.test.ts new file mode 100644 index 00000000..98346369 --- /dev/null +++ b/test/arbitrum/dsa-spell/dsa-spell.test.ts @@ -0,0 +1,154 @@ +import hre from "hardhat"; +import axios from "axios"; +import { expect } from "chai"; +const { ethers } = hre; //check +import { deployAndEnableConnector } from "../../../scripts/tests/deployAndEnableConnector"; +import { buildDSAv2 } from "../../../scripts/tests/buildDSAv2"; +import { encodeSpells } from "../../../scripts/tests/encodeSpells"; +import { getMasterSigner } from "../../../scripts/tests/getMasterSigner"; +import { addresses } from "../../../scripts/tests/arbitrum/addresses"; +import { abis } from "../../../scripts/constant/abis"; +import { ConnectV2DSASpellArbitrum__factory } from "../../../typechain"; +import type { Signer, Contract } from "ethers"; + +describe("DSA Spell", function () { + const connectorName = "dsa-spell-test"; + + let dsaWallet0: any; + let dsaWallet1: any; + let dsaWallet2: any; + let walletB: any; + let wallet0: any; + let masterSigner: Signer; + let instaConnectorsV2: Contract; + let connector: any; + + before(async () => { + await hre.network.provider.request({ + method: "hardhat_reset", + params: [ + { + forking: { + // @ts-ignore + jsonRpcUrl: hre.config.networks.hardhat.forking.url + } + } + ] + }); + [wallet0] = await ethers.getSigners(); + + masterSigner = await getMasterSigner(); + instaConnectorsV2 = await ethers.getContractAt(abis.core.connectorsV2, addresses.core.connectorsV2); + connector = await deployAndEnableConnector({ + connectorName, + contractArtifact: ConnectV2DSASpellArbitrum__factory, + signer: masterSigner, + connectors: instaConnectorsV2 + }); + console.log("\tConnector address", connector.address); + }); + + it("Should have contracts deployed.", async function () { + expect(!!instaConnectorsV2.address).to.be.true; + expect(!!connector.address).to.be.true; + expect(!!(await masterSigner.getAddress())).to.be.true; + }); + + describe("DSA wallet setup", function () { + it("Should build DSA v2", async function () { + dsaWallet0 = await buildDSAv2(wallet0.address); + expect(!!dsaWallet0.address).to.be.true; + walletB = await ethers.getSigner(dsaWallet0.address); + dsaWallet1 = await buildDSAv2(dsaWallet0.address); + expect(!!dsaWallet1.address).to.be.true; + console.log(`\t${dsaWallet1.address}`); + }); + + it("Deposit eth into DSA wallet 0", async function () { + await wallet0.sendTransaction({ + to: dsaWallet0.address, + value: ethers.utils.parseEther("10") + }); + + expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.gte(ethers.utils.parseEther("10")); + }); + + it("Deposit eth into DSA wallet 1", async function () { + await wallet0.sendTransaction({ + to: dsaWallet1.address, + value: ethers.utils.parseEther("10") + }); + + expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.gte(ethers.utils.parseEther("10")); + }); + }); + + describe("Main", function () { + let ETH = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"; + var abi = [ + "function withdraw(address,uint256,address,uint256,uint256)", + "function deposit(address,uint256,uint256,uint256)" + ]; + function getCallData(spell: string, params: any) { + var iface = new ethers.utils.Interface(abi); + let data = iface.encodeFunctionData(spell, params); + return data; + } + + it("should cast spells", async function () { + async function getArg() { + let basicParams = [ETH, ethers.utils.parseEther("2"), dsaWallet0.address, 0, 0]; + let dataBasic = ethers.utils.hexlify(await getCallData("withdraw", basicParams)); + let datas = [dataBasic]; + + let connectors = ["BASIC-A"]; + + return [dsaWallet1.address, connectors, datas]; + } + + let arg = await getArg(); + const spells = [ + { + connector: connectorName, + method: "castOnDSA", + args: arg + } + ]; + const tx = await dsaWallet0.connect(wallet0).cast(...encodeSpells(spells), await wallet0.getAddress()); + const receipt = await tx.wait(); + + expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.lte(ethers.utils.parseEther("8")); + expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.gte(ethers.utils.parseEther("12")); + }); + + it("should retry spells", async function () { + async function getArg() { + let basicParams = [ETH, ethers.utils.parseEther("1"), 0, 0]; + let dataBasic = ethers.utils.hexlify(await getCallData("deposit", basicParams)); + let basicWithdraw = [ETH, ethers.utils.parseEther("2"), dsaWallet1.address, 0, 0]; + let dataWithdraw = ethers.utils.hexlify(await getCallData("withdraw", basicWithdraw)); + let datas = [dataBasic, dataWithdraw]; + + let connectors = ["BASIC-A", "BASIC-A"]; + + return [connectors, datas]; + } + + let arg = await getArg(); + const spells = [ + { + connector: connectorName, + method: "retrySpell", + args: arg + } + ]; + const tx = await dsaWallet0 + .connect(wallet0) + .cast(...encodeSpells(spells), await wallet0.getAddress(), { value: ethers.utils.parseEther("1") }); + const receipt = await tx.wait(); + + expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.lte(ethers.utils.parseEther("11")); + expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.gte(ethers.utils.parseEther("10")); + }); + }); +}); diff --git a/test/avalanche/dsa-spell/dsa-spell.test.ts b/test/avalanche/dsa-spell/dsa-spell.test.ts new file mode 100644 index 00000000..aa1668fd --- /dev/null +++ b/test/avalanche/dsa-spell/dsa-spell.test.ts @@ -0,0 +1,179 @@ +import hre from "hardhat"; +import axios from "axios"; +import { expect } from "chai"; +const { ethers } = hre; //check +import { BigNumber } from "bignumber.js"; +import { deployAndEnableConnector } from "../../../scripts/tests/deployAndEnableConnector"; +import { buildDSAv2 } from "../../../scripts/tests/buildDSAv2"; +import { encodeSpells } from "../../../scripts/tests/encodeSpells"; +import { getMasterSigner } from "../../../scripts/tests/getMasterSigner"; +import { addresses } from "../../../scripts/tests/avalanche/addresses"; +import { abis } from "../../../scripts/constant/abis"; +import { ConnectV2DSASpellAvalanche__factory } from "../../../typechain"; +import er20abi from "../../../scripts/constant/abi/basics/erc20.json"; +import type { Signer, Contract } from "ethers"; + +describe("DSA Spell", function () { + const connectorName = "dsa-spell-test"; + + let dsaWallet0: any; + let dsaWallet1: any; + let dsaWallet2: any; + let walletB: any; + let wallet0: any; + let walletBsigner: any; + let masterSigner: Signer; + let instaConnectorsV2: Contract; + let connector: any; + + before(async () => { + await hre.network.provider.request({ + method: "hardhat_reset", + params: [ + { + forking: { + // @ts-ignore + jsonRpcUrl: hre.config.networks.hardhat.forking.url + } + } + ] + }); + [wallet0] = await ethers.getSigners(); + + masterSigner = await getMasterSigner(); + instaConnectorsV2 = await ethers.getContractAt(abis.core.connectorsV2, addresses.core.connectorsV2); + connector = await deployAndEnableConnector({ + connectorName, + contractArtifact: ConnectV2DSASpellAvalanche__factory, + signer: masterSigner, + connectors: instaConnectorsV2 + }); + console.log("\tConnector address", connector.address); + }); + + it("Should have contracts deployed.", async function () { + expect(!!instaConnectorsV2.address).to.be.true; + expect(!!connector.address).to.be.true; + expect(!!(await masterSigner.getAddress())).to.be.true; + }); + + describe("DSA wallet setup", function () { + it("Should build DSA v2", async function () { + dsaWallet0 = await buildDSAv2(wallet0.address); + expect(!!dsaWallet0.address).to.be.true; + walletB = await ethers.getSigner(dsaWallet0.address); + dsaWallet1 = await buildDSAv2(dsaWallet0.address); + expect(!!dsaWallet1.address).to.be.true; + console.log(`\t${dsaWallet1.address}`); + dsaWallet2 = await buildDSAv2(wallet0.address); + expect(!!dsaWallet2.address).to.be.true; + }); + + it("Deposit avax into DSA wallet 0", async function () { + await wallet0.sendTransaction({ + to: dsaWallet0.address, + value: ethers.utils.parseEther("10") + }); + + expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.gte(ethers.utils.parseEther("10")); + }); + + it("Deposit avax into DSA wallet 1", async function () { + await wallet0.sendTransaction({ + to: dsaWallet1.address, + value: ethers.utils.parseEther("10") + }); + + expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.gte(ethers.utils.parseEther("10")); + }); + }); + + describe("Main", function () { + let AVAX = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"; + it("should cast spells", async function () { + await hre.network.provider.request({ + method: "hardhat_impersonateAccount", + params: [walletB.address] + }); + + walletBsigner = await ethers.getSigner(walletB.address); + async function getArg() { + var abi = [ + "function withdraw(address,uint256,address,uint256,uint256)", + "function deposit(address,uint256,uint256,uint256)" + ]; + function getCallData(connector: string, spell: string, params: any) { + var iface = new ethers.utils.Interface(abi); + let data = iface.encodeFunctionData(spell, params); + return data; + } + let basicParams = [AVAX, ethers.utils.parseEther("2"), dsaWallet0.address, 0, 0]; + let dataBasic = ethers.utils.hexlify(await getCallData("BASIC-A", "withdraw", basicParams)); + let datas = [dataBasic]; + + let connectors = ["BASIC-A"]; + + return [dsaWallet1.address, connectors, datas]; + } + + let arg = await getArg(); + const spells = [ + { + connector: connectorName, + method: "castOnDSA", + args: arg + } + ]; + const tx = await dsaWallet0.connect(wallet0).cast(...encodeSpells(spells), await wallet0.getAddress()); + const receipt = await tx.wait(); + + expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.lte(ethers.utils.parseEther("8")); + expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.gte(ethers.utils.parseEther("12")); + }); + + it("should retry spells", async function () { + await hre.network.provider.request({ + method: "hardhat_impersonateAccount", + params: [walletB.address] + }); + + walletBsigner = await ethers.getSigner(walletB.address); + async function getArg() { + var abi = [ + "function withdraw(address,uint256,address,uint256,uint256)", + "function deposit(address,uint256,uint256,uint256)" + ]; + function getCallData(spell: string, params: any) { + var iface = new ethers.utils.Interface(abi); + let data = iface.encodeFunctionData(spell, params); + return data; + } + let basicParams = [AVAX, ethers.utils.parseEther("1"), 0, 0]; + let dataBasic = ethers.utils.hexlify(await getCallData("deposit", basicParams)); + let basicWithdraw = [AVAX, ethers.utils.parseEther("2"), dsaWallet1.address, 0, 0]; + let dataWithdraw = ethers.utils.hexlify(await getCallData("withdraw", basicWithdraw)); + let datas = [dataBasic, dataWithdraw]; + + let connectors = ["BASIC-A", "BASIC-A"]; + + return [connectors, datas]; + } + + let arg = await getArg(); + const spells = [ + { + connector: connectorName, + method: "retrySpell", + args: arg + } + ]; + const tx = await dsaWallet0 + .connect(wallet0) + .cast(...encodeSpells(spells), await wallet0.getAddress(), { value: ethers.utils.parseEther("1") }); + const receipt = await tx.wait(); + + expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.lte(ethers.utils.parseEther("11")); + expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.gte(ethers.utils.parseEther("10")); + }); + }); +}); diff --git a/test/fantom/dsa-spell/dsa-spell.test.ts b/test/fantom/dsa-spell/dsa-spell.test.ts new file mode 100644 index 00000000..6dc2850d --- /dev/null +++ b/test/fantom/dsa-spell/dsa-spell.test.ts @@ -0,0 +1,156 @@ +import hre from "hardhat"; +import axios from "axios"; +import { expect } from "chai"; +const { ethers } = hre; //check +import { deployAndEnableConnector } from "../../../scripts/tests/deployAndEnableConnector"; +import { buildDSAv2 } from "../../../scripts/tests/buildDSAv2"; +import { encodeSpells } from "../../../scripts/tests/encodeSpells"; +import { getMasterSigner } from "../../../scripts/tests/getMasterSigner"; +import { addresses } from "../../../scripts/tests/fantom/addresses"; +import { abis } from "../../../scripts/constant/abis"; +import { ConnectV2DSASpellFantom__factory } from "../../../typechain"; +import type { Signer, Contract } from "ethers"; + +describe("DSA Spell", function () { + const connectorName = "dsa-spell-test"; + + let dsaWallet0: any; + let dsaWallet1: any; + let dsaWallet2: any; + let walletB: any; + let wallet0: any; + let masterSigner: Signer; + let instaConnectorsV2: Contract; + let connector: any; + + before(async () => { + await hre.network.provider.request({ + method: "hardhat_reset", + params: [ + { + forking: { + // @ts-ignore + jsonRpcUrl: hre.config.networks.hardhat.forking.url + } + } + ] + }); + [wallet0] = await ethers.getSigners(); + + masterSigner = await getMasterSigner(); + instaConnectorsV2 = await ethers.getContractAt(abis.core.connectorsV2, addresses.core.connectorsV2); + connector = await deployAndEnableConnector({ + connectorName, + contractArtifact: ConnectV2DSASpellFantom__factory, + signer: masterSigner, + connectors: instaConnectorsV2 + }); + console.log("\tConnector address", connector.address); + }); + + it("Should have contracts deployed.", async function () { + expect(!!instaConnectorsV2.address).to.be.true; + expect(!!connector.address).to.be.true; + expect(!!(await masterSigner.getAddress())).to.be.true; + }); + + describe("DSA wallet setup", function () { + it("Should build DSA v2", async function () { + dsaWallet0 = await buildDSAv2(wallet0.address); + expect(!!dsaWallet0.address).to.be.true; + walletB = await ethers.getSigner(dsaWallet0.address); + dsaWallet1 = await buildDSAv2(dsaWallet0.address); + expect(!!dsaWallet1.address).to.be.true; + console.log(`\t${dsaWallet1.address}`); + dsaWallet2 = await buildDSAv2(wallet0.address); + expect(!!dsaWallet2.address).to.be.true; + }); + + it("Deposit ftm into DSA wallet 0", async function () { + await wallet0.sendTransaction({ + to: dsaWallet0.address, + value: ethers.utils.parseEther("10") + }); + + expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.gte(ethers.utils.parseEther("10")); + }); + + it("Deposit ftm into DSA wallet 1", async function () { + await wallet0.sendTransaction({ + to: dsaWallet1.address, + value: ethers.utils.parseEther("10") + }); + + expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.gte(ethers.utils.parseEther("10")); + }); + }); + + describe("Main", function () { + let FTM = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"; + var abi = [ + "function withdraw(address,uint256,address,uint256,uint256)", + "function deposit(address,uint256,uint256,uint256)" + ]; + function getCallData(spell: string, params: any) { + var iface = new ethers.utils.Interface(abi); + let data = iface.encodeFunctionData(spell, params); + return data; + } + + it("should cast spells", async function () { + async function getArg() { + let basicParams = [FTM, ethers.utils.parseEther("2"), dsaWallet0.address, 0, 0]; + let dataBasic = ethers.utils.hexlify(await getCallData("withdraw", basicParams)); + let datas = [dataBasic]; + + let connectors = ["BASIC-A"]; + + return [dsaWallet1.address, connectors, datas]; + } + + let arg = await getArg(); + const spells = [ + { + connector: connectorName, + method: "castOnDSA", + args: arg + } + ]; + const tx = await dsaWallet0.connect(wallet0).cast(...encodeSpells(spells), await wallet0.getAddress()); + const receipt = await tx.wait(); + + expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.lte(ethers.utils.parseEther("8")); + expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.gte(ethers.utils.parseEther("12")); + }); + + it("should retry spells", async function () { + async function getArg() { + let basicParams = [FTM, ethers.utils.parseEther("1"), 0, 0]; + let dataBasic = ethers.utils.hexlify(await getCallData("deposit", basicParams)); + let basicWithdraw = [FTM, ethers.utils.parseEther("2"), dsaWallet1.address, 0, 0]; + let dataWithdraw = ethers.utils.hexlify(await getCallData("withdraw", basicWithdraw)); + let datas = [dataBasic, dataWithdraw]; + + let connectors = ["BASIC-A", "BASIC-A"]; + + return [connectors, datas]; + } + + let arg = await getArg(); + const spells = [ + { + connector: connectorName, + method: "retrySpell", + args: arg + } + ]; + const tx = await dsaWallet0 + .connect(wallet0) + .cast(...encodeSpells(spells), await wallet0.getAddress(), { value: ethers.utils.parseEther("1") }); + const receipt = await tx.wait(); + + expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.lte(ethers.utils.parseEther("11")); + expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.gte(ethers.utils.parseEther("10")); + }); + }); +}); diff --git a/test/mainnet/dsa-spell/dsa-spell.test.ts b/test/mainnet/dsa-spell/dsa-spell.test.ts new file mode 100644 index 00000000..5cf8a7b8 --- /dev/null +++ b/test/mainnet/dsa-spell/dsa-spell.test.ts @@ -0,0 +1,154 @@ +import hre from "hardhat"; +import axios from "axios"; +import { expect } from "chai"; +const { ethers } = hre; //check +import { deployAndEnableConnector } from "../../../scripts/tests/deployAndEnableConnector"; +import { buildDSAv2 } from "../../../scripts/tests/buildDSAv2"; +import { encodeSpells } from "../../../scripts/tests/encodeSpells"; +import { getMasterSigner } from "../../../scripts/tests/getMasterSigner"; +import { addresses } from "../../../scripts/tests/mainnet/addresses"; +import { abis } from "../../../scripts/constant/abis"; +import { ConnectV2DSASpell__factory } from "../../../typechain"; +import type { Signer, Contract } from "ethers"; + +describe("DSA Spell", function () { + const connectorName = "dsa-spell-test"; + + let dsaWallet0: any; + let dsaWallet1: any; + let dsaWallet2: any; + let walletB: any; + let wallet0: any; + let masterSigner: Signer; + let instaConnectorsV2: Contract; + let connector: any; + + before(async () => { + await hre.network.provider.request({ + method: "hardhat_reset", + params: [ + { + forking: { + // @ts-ignore + jsonRpcUrl: hre.config.networks.hardhat.forking.url + } + } + ] + }); + [wallet0] = await ethers.getSigners(); + + masterSigner = await getMasterSigner(); + instaConnectorsV2 = await ethers.getContractAt(abis.core.connectorsV2, addresses.core.connectorsV2); + connector = await deployAndEnableConnector({ + connectorName, + contractArtifact: ConnectV2DSASpell__factory, + signer: masterSigner, + connectors: instaConnectorsV2 + }); + console.log("\tConnector address", connector.address); + }); + + it("Should have contracts deployed.", async function () { + expect(!!instaConnectorsV2.address).to.be.true; + expect(!!connector.address).to.be.true; + expect(!!(await masterSigner.getAddress())).to.be.true; + }); + + describe("DSA wallet setup", function () { + it("Should build DSA v2", async function () { + dsaWallet0 = await buildDSAv2(wallet0.address); + expect(!!dsaWallet0.address).to.be.true; + walletB = await ethers.getSigner(dsaWallet0.address); + dsaWallet1 = await buildDSAv2(dsaWallet0.address); + expect(!!dsaWallet1.address).to.be.true; + console.log(`\t${dsaWallet1.address}`); + }); + + it("Deposit eth into DSA wallet 0", async function () { + await wallet0.sendTransaction({ + to: dsaWallet0.address, + value: ethers.utils.parseEther("10") + }); + + expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.gte(ethers.utils.parseEther("10")); + }); + + it("Deposit eth into DSA wallet 1", async function () { + await wallet0.sendTransaction({ + to: dsaWallet1.address, + value: ethers.utils.parseEther("10") + }); + + expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.gte(ethers.utils.parseEther("10")); + }); + }); + + describe("Main", function () { + let ETH = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"; + var abi = [ + "function withdraw(address,uint256,address,uint256,uint256)", + "function deposit(address,uint256,uint256,uint256)" + ]; + function getCallData(spell: string, params: any) { + var iface = new ethers.utils.Interface(abi); + let data = iface.encodeFunctionData(spell, params); + return data; + } + + it("should cast spells", async function () { + async function getArg() { + let basicParams = [ETH, ethers.utils.parseEther("2"), dsaWallet0.address, 0, 0]; + let dataBasic = ethers.utils.hexlify(await getCallData("withdraw", basicParams)); + let datas = [dataBasic]; + + let connectors = ["BASIC-A"]; + + return [dsaWallet1.address, connectors, datas]; + } + + let arg = await getArg(); + const spells = [ + { + connector: connectorName, + method: "castOnDSA", + args: arg + } + ]; + const tx = await dsaWallet0.connect(wallet0).cast(...encodeSpells(spells), await wallet0.getAddress()); + const receipt = await tx.wait(); + + expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.lte(ethers.utils.parseEther("8")); + expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.gte(ethers.utils.parseEther("12")); + }); + + it("should retry spells", async function () { + async function getArg() { + let basicParams = [ETH, ethers.utils.parseEther("1"), 0, 0]; + let dataBasic = ethers.utils.hexlify(await getCallData("deposit", basicParams)); + let basicWithdraw = [ETH, ethers.utils.parseEther("2"), dsaWallet1.address, 0, 0]; + let dataWithdraw = ethers.utils.hexlify(await getCallData("withdraw", basicWithdraw)); + let datas = [dataBasic, dataWithdraw]; + + let connectors = ["BASIC-A", "BASIC-A"]; + + return [connectors, datas]; + } + + let arg = await getArg(); + const spells = [ + { + connector: connectorName, + method: "retrySpell", + args: arg + } + ]; + const tx = await dsaWallet0 + .connect(wallet0) + .cast(...encodeSpells(spells), await wallet0.getAddress(), { value: ethers.utils.parseEther("1") }); + const receipt = await tx.wait(); + + expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.lte(ethers.utils.parseEther("11")); + expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.gte(ethers.utils.parseEther("10")); + }); + }); +}); diff --git a/test/optimism/dsa-spell/dsa-spell.test.ts b/test/optimism/dsa-spell/dsa-spell.test.ts new file mode 100644 index 00000000..7c0faa61 --- /dev/null +++ b/test/optimism/dsa-spell/dsa-spell.test.ts @@ -0,0 +1,154 @@ +import hre from "hardhat"; +import axios from "axios"; +import { expect } from "chai"; +const { ethers } = hre; //check +import { deployAndEnableConnector } from "../../../scripts/tests/deployAndEnableConnector"; +import { buildDSAv2 } from "../../../scripts/tests/buildDSAv2"; +import { encodeSpells } from "../../../scripts/tests/encodeSpells"; +import { getMasterSigner } from "../../../scripts/tests/getMasterSigner"; +import { addresses } from "../../../scripts/tests/optimism/addresses"; +import { abis } from "../../../scripts/constant/abis"; +import { ConnectV2DSASpellOptimism__factory } from "../../../typechain"; +import type { Signer, Contract } from "ethers"; + +describe("DSA Spell", function () { + const connectorName = "dsa-spell-test"; + + let dsaWallet0: any; + let dsaWallet1: any; + let dsaWallet2: any; + let walletB: any; + let wallet0: any; + let masterSigner: Signer; + let instaConnectorsV2: Contract; + let connector: any; + + before(async () => { + await hre.network.provider.request({ + method: "hardhat_reset", + params: [ + { + forking: { + // @ts-ignore + jsonRpcUrl: hre.config.networks.hardhat.forking.url + } + } + ] + }); + [wallet0] = await ethers.getSigners(); + + masterSigner = await getMasterSigner(); + instaConnectorsV2 = await ethers.getContractAt(abis.core.connectorsV2, addresses.core.connectorsV2); + connector = await deployAndEnableConnector({ + connectorName, + contractArtifact: ConnectV2DSASpellOptimism__factory, + signer: masterSigner, + connectors: instaConnectorsV2 + }); + console.log("\tConnector address", connector.address); + }); + + it("Should have contracts deployed.", async function () { + expect(!!instaConnectorsV2.address).to.be.true; + expect(!!connector.address).to.be.true; + expect(!!(await masterSigner.getAddress())).to.be.true; + }); + + describe("DSA wallet setup", function () { + it("Should build DSA v2", async function () { + dsaWallet0 = await buildDSAv2(wallet0.address); + expect(!!dsaWallet0.address).to.be.true; + walletB = await ethers.getSigner(dsaWallet0.address); + dsaWallet1 = await buildDSAv2(dsaWallet0.address); + expect(!!dsaWallet1.address).to.be.true; + console.log(`\t${dsaWallet1.address}`); + }); + + it("Deposit eth into DSA wallet 0", async function () { + await wallet0.sendTransaction({ + to: dsaWallet0.address, + value: ethers.utils.parseEther("10") + }); + + expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.gte(ethers.utils.parseEther("10")); + }); + + it("Deposit eth into DSA wallet 1", async function () { + await wallet0.sendTransaction({ + to: dsaWallet1.address, + value: ethers.utils.parseEther("10") + }); + + expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.gte(ethers.utils.parseEther("10")); + }); + }); + + describe("Main", function () { + let ETH = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"; + var abi = [ + "function withdraw(address,uint256,address,uint256,uint256)", + "function deposit(address,uint256,uint256,uint256)" + ]; + function getCallData(spell: string, params: any) { + var iface = new ethers.utils.Interface(abi); + let data = iface.encodeFunctionData(spell, params); + return data; + } + + it("should cast spells", async function () { + async function getArg() { + let basicParams = [ETH, ethers.utils.parseEther("2"), dsaWallet0.address, 0, 0]; + let dataBasic = ethers.utils.hexlify(await getCallData("withdraw", basicParams)); + let datas = [dataBasic]; + + let connectors = ["BASIC-A"]; + + return [dsaWallet1.address, connectors, datas]; + } + + let arg = await getArg(); + const spells = [ + { + connector: connectorName, + method: "castOnDSA", + args: arg + } + ]; + const tx = await dsaWallet0.connect(wallet0).cast(...encodeSpells(spells), await wallet0.getAddress()); + const receipt = await tx.wait(); + + expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.lte(ethers.utils.parseEther("8")); + expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.gte(ethers.utils.parseEther("12")); + }); + + it("should retry spells", async function () { + async function getArg() { + let basicParams = [ETH, ethers.utils.parseEther("1"), 0, 0]; + let dataBasic = ethers.utils.hexlify(await getCallData("deposit", basicParams)); + let basicWithdraw = [ETH, ethers.utils.parseEther("2"), dsaWallet1.address, 0, 0]; + let dataWithdraw = ethers.utils.hexlify(await getCallData("withdraw", basicWithdraw)); + let datas = [dataBasic, dataWithdraw]; + + let connectors = ["BASIC-A", "BASIC-A"]; + + return [connectors, datas]; + } + + let arg = await getArg(); + const spells = [ + { + connector: connectorName, + method: "retrySpell", + args: arg + } + ]; + const tx = await dsaWallet0 + .connect(wallet0) + .cast(...encodeSpells(spells), await wallet0.getAddress(), { value: ethers.utils.parseEther("1") }); + const receipt = await tx.wait(); + + expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.lte(ethers.utils.parseEther("11")); + expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.gte(ethers.utils.parseEther("10")); + }); + }); +}); diff --git a/test/polygon/dsa-spell/dsa-spell.test.ts b/test/polygon/dsa-spell/dsa-spell.test.ts new file mode 100644 index 00000000..577ad5cd --- /dev/null +++ b/test/polygon/dsa-spell/dsa-spell.test.ts @@ -0,0 +1,182 @@ +import hre from "hardhat"; +import axios from "axios"; +import { expect } from "chai"; +const { ethers } = hre; //check +import { BigNumber } from "bignumber.js"; +import { deployAndEnableConnector } from "../../../scripts/tests/deployAndEnableConnector"; +import { buildDSAv2 } from "../../../scripts/tests/buildDSAv2"; +import { encodeSpells } from "../../../scripts/tests/encodeSpells"; +import { getMasterSigner } from "../../../scripts/tests/getMasterSigner"; +import { addresses } from "../../../scripts/tests/polygon/addresses"; +import { abis } from "../../../scripts/constant/abis"; +import { ConnectV2DSASpellPolygon__factory } from "../../../typechain"; +import er20abi from "../../../scripts/constant/abi/basics/erc20.json"; +import type { Signer, Contract } from "ethers"; + +describe("DSA Spell", function () { + const connectorName = "dsa-spell-test"; + + let dsaWallet0: any; + let dsaWallet1: any; + let dsaWallet2: any; + let walletB: any; + let wallet0: any; + let walletBsigner: any; + let masterSigner: Signer; + let instaConnectorsV2: Contract; + let connector: any; + + before(async () => { + await hre.network.provider.request({ + method: "hardhat_reset", + params: [ + { + forking: { + // @ts-ignore + jsonRpcUrl: hre.config.networks.hardhat.forking.url + } + } + ] + }); + [wallet0] = await ethers.getSigners(); + + masterSigner = await getMasterSigner(); + instaConnectorsV2 = await ethers.getContractAt(abis.core.connectorsV2, addresses.core.connectorsV2); + connector = await deployAndEnableConnector({ + connectorName, + contractArtifact: ConnectV2DSASpellPolygon__factory, + signer: masterSigner, + connectors: instaConnectorsV2 + }); + console.log("\tConnector address", connector.address); + }); + + it("Should have contracts deployed.", async function () { + expect(!!instaConnectorsV2.address).to.be.true; + expect(!!connector.address).to.be.true; + expect(!!(await masterSigner.getAddress())).to.be.true; + }); + + describe("DSA wallet setup", function () { + it("Should build DSA v2", async function () { + dsaWallet0 = await buildDSAv2(wallet0.address); + expect(!!dsaWallet0.address).to.be.true; + walletB = await ethers.getSigner(dsaWallet0.address); + dsaWallet1 = await buildDSAv2(dsaWallet0.address); + expect(!!dsaWallet1.address).to.be.true; + console.log(`\t${dsaWallet1.address}`); + dsaWallet2 = await buildDSAv2(wallet0.address); + expect(!!dsaWallet2.address).to.be.true; + }); + + it("Deposit matic into DSA wallet 0", async function () { + await wallet0.sendTransaction({ + to: dsaWallet0.address, + value: ethers.utils.parseEther("10") + }); + + expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.gte(ethers.utils.parseEther("10")); + }); + + it("Deposit matic into DSA wallet 1", async function () { + await wallet0.sendTransaction({ + to: dsaWallet1.address, + value: ethers.utils.parseEther("10") + }); + + expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.gte(ethers.utils.parseEther("10")); + }); + }); + + describe("Main", function () { + it("should cast spells", async function () { + await hre.network.provider.request({ + method: "hardhat_impersonateAccount", + params: [walletB.address] + }); + + walletBsigner = await ethers.getSigner(walletB.address); + let buyTokenAmountZeroX: any; + let USDT = "0xc2132d05d31c914a87c6611c10748aeb04b58e8f"; + let MATIC = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"; + async function getArg() { + var abi = [ + "function withdraw(address,uint256,address,uint256,uint256)", + "function deposit(address,uint256,uint256,uint256)" + ]; + function getCallData(connector: string, spell: string, params: any) { + var iface = new ethers.utils.Interface(abi); + let data = iface.encodeFunctionData(spell, params); + return data; + } + let basicParams = [MATIC, ethers.utils.parseEther("2"), dsaWallet0.address, 0, 0]; + let dataBasic = ethers.utils.hexlify(await getCallData("BASIC-A", "withdraw", basicParams)); + let datas = [dataBasic]; + + let connectors = ["BASIC-A"]; + + return [dsaWallet1.address, connectors, datas]; + } + + let arg = await getArg(); + const spells = [ + { + connector: connectorName, + method: "castOnDSA", + args: arg + } + ]; + const tx = await dsaWallet0.connect(wallet0).cast(...encodeSpells(spells), await wallet0.getAddress()); + const receipt = await tx.wait(); + + expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.lte(ethers.utils.parseEther("8")); + expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.gte(ethers.utils.parseEther("12")); + }); + + it("should retry spells", async function () { + await hre.network.provider.request({ + method: "hardhat_impersonateAccount", + params: [walletB.address] + }); + + walletBsigner = await ethers.getSigner(walletB.address); + let buyTokenAmountZeroX: any; + let USDT = "0xc2132d05d31c914a87c6611c10748aeb04b58e8f"; + let MATIC = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"; + async function getArg() { + var abi = [ + "function withdraw(address,uint256,address,uint256,uint256)", + "function deposit(address,uint256,uint256,uint256)" + ]; + function getCallData(spell: string, params: any) { + var iface = new ethers.utils.Interface(abi); + let data = iface.encodeFunctionData(spell, params); + return data; + } + let basicParams = [MATIC, ethers.utils.parseEther("1"), 0, 0]; + let dataBasic = ethers.utils.hexlify(await getCallData("deposit", basicParams)); + let basicWithdraw = [MATIC, ethers.utils.parseEther("2"), dsaWallet1.address, 0, 0]; + let dataWithdraw = ethers.utils.hexlify(await getCallData("withdraw", basicWithdraw)); + let datas = [dataBasic,dataWithdraw]; + + let connectors = ["BASIC-A","BASIC-A"]; + + return [connectors, datas]; + } + + let arg = await getArg(); + const spells = [ + { + connector: connectorName, + method: "retrySpell", + args: arg + } + ]; + const tx = await dsaWallet0.connect(wallet0).cast(...encodeSpells(spells), await wallet0.getAddress(), {value: ethers.utils.parseEther("1")}); + const receipt = await tx.wait(); + + expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.lte(ethers.utils.parseEther("11")); + expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.gte(ethers.utils.parseEther("10")); + }); + }); +}); From 47475742a294511a99e41536190afbe482107f7a Mon Sep 17 00:00:00 2001 From: Richa-iitr Date: Mon, 20 Jun 2022 11:15:10 +0530 Subject: [PATCH 09/14] minor changes --- contracts/arbitrum/connectors/spell/events.sol | 2 +- contracts/arbitrum/connectors/spell/main.sol | 8 ++++---- contracts/avalanche/connectors/spell/events.sol | 2 +- contracts/avalanche/connectors/spell/main.sol | 8 ++++---- contracts/fantom/connectors/spell/events.sol | 2 +- contracts/fantom/connectors/spell/main.sol | 8 ++++---- contracts/mainnet/connectors/spell/events.sol | 2 +- contracts/mainnet/connectors/spell/main.sol | 8 ++++---- contracts/optimism/connectors/spell/events.sol | 2 +- contracts/optimism/connectors/spell/main.sol | 8 ++++---- contracts/polygon/connectors/spell/events.sol | 2 +- contracts/polygon/connectors/spell/main.sol | 8 ++++---- 12 files changed, 30 insertions(+), 30 deletions(-) diff --git a/contracts/arbitrum/connectors/spell/events.sol b/contracts/arbitrum/connectors/spell/events.sol index 036c990f..b3e455d6 100644 --- a/contracts/arbitrum/connectors/spell/events.sol +++ b/contracts/arbitrum/connectors/spell/events.sol @@ -8,5 +8,5 @@ contract Events { string[] connectors, bytes[] datas ); - event LogRetrySpell(string[] eventNames, bytes[] eventParams); + event LogSpellFactory(string[] eventNames, bytes[] eventParams); } diff --git a/contracts/arbitrum/connectors/spell/main.sol b/contracts/arbitrum/connectors/spell/main.sol index 54d26cec..553bee32 100644 --- a/contracts/arbitrum/connectors/spell/main.sol +++ b/contracts/arbitrum/connectors/spell/main.sol @@ -12,7 +12,7 @@ import { AccountInterface } from "../../common/interfaces.sol"; import { Stores } from "../../common/stores.sol"; import { Events } from "./events.sol"; -abstract contract DSASpell is Events, Stores { +abstract contract DSASpellsResolver is Events, Stores { /** *@dev Cast spells on DSA. *@param targetDSA target DSA to cast spells on. @@ -41,7 +41,7 @@ abstract contract DSASpell is Events, Stores { *@param connectors Array of connector names. *@param datas Array of connector calldatas. */ - function retrySpell(string[] memory connectors, bytes[] memory datas) + function spellFactory(string[] memory connectors, bytes[] memory datas) external payable returns (string memory eventName, bytes memory eventParam) @@ -69,11 +69,11 @@ abstract contract DSASpell is Events, Stores { } } - eventName = "LogRetrySpell(string[],bytes[])"; + eventName = "LogSpellFactory(string[],bytes[])"; eventParam = abi.encode(_eventNames, _eventParams); } } -contract ConnectV2DSASpellArbitrum is DSASpell { +contract ConnectV2DSASpellArbitrum is DSASpellsResolver { string public name = "DSA-Spell-v1.0"; } diff --git a/contracts/avalanche/connectors/spell/events.sol b/contracts/avalanche/connectors/spell/events.sol index 036c990f..b3e455d6 100644 --- a/contracts/avalanche/connectors/spell/events.sol +++ b/contracts/avalanche/connectors/spell/events.sol @@ -8,5 +8,5 @@ contract Events { string[] connectors, bytes[] datas ); - event LogRetrySpell(string[] eventNames, bytes[] eventParams); + event LogSpellFactory(string[] eventNames, bytes[] eventParams); } diff --git a/contracts/avalanche/connectors/spell/main.sol b/contracts/avalanche/connectors/spell/main.sol index b09a80b9..bccc11d2 100644 --- a/contracts/avalanche/connectors/spell/main.sol +++ b/contracts/avalanche/connectors/spell/main.sol @@ -12,7 +12,7 @@ import { AccountInterface } from "../../common/interfaces.sol"; import { Stores } from "../../common/stores.sol"; import { Events } from "./events.sol"; -abstract contract DSASpell is Events, Stores { +abstract contract DSASpellsResolver is Events, Stores { /** *@dev Cast spells on DSA. *@param targetDSA target DSA to cast spells on. @@ -41,7 +41,7 @@ abstract contract DSASpell is Events, Stores { *@param connectors Array of connector names. *@param datas Array of connector calldatas. */ - function retrySpell(string[] memory connectors, bytes[] memory datas) + function spellFactory(string[] memory connectors, bytes[] memory datas) external payable returns (string memory eventName, bytes memory eventParam) @@ -69,11 +69,11 @@ abstract contract DSASpell is Events, Stores { } } - eventName = "LogRetrySpell(string[],bytes[])"; + eventName = "LogSpellFactory(string[],bytes[])"; eventParam = abi.encode(_eventNames, _eventParams); } } -contract ConnectV2DSASpellAvalanche is DSASpell { +contract ConnectV2DSASpellAvalanche is DSASpellsResolver { string public name = "DSA-Spell-v1.0"; } diff --git a/contracts/fantom/connectors/spell/events.sol b/contracts/fantom/connectors/spell/events.sol index 036c990f..b3e455d6 100644 --- a/contracts/fantom/connectors/spell/events.sol +++ b/contracts/fantom/connectors/spell/events.sol @@ -8,5 +8,5 @@ contract Events { string[] connectors, bytes[] datas ); - event LogRetrySpell(string[] eventNames, bytes[] eventParams); + event LogSpellFactory(string[] eventNames, bytes[] eventParams); } diff --git a/contracts/fantom/connectors/spell/main.sol b/contracts/fantom/connectors/spell/main.sol index 6c86a123..62bdb130 100644 --- a/contracts/fantom/connectors/spell/main.sol +++ b/contracts/fantom/connectors/spell/main.sol @@ -12,7 +12,7 @@ import { AccountInterface } from "../../common/interfaces.sol"; import { Stores } from "../../common/stores.sol"; import { Events } from "./events.sol"; -abstract contract DSASpell is Events, Stores { +abstract contract DSASpellsResolver is Events, Stores { /** *@dev Cast spells on DSA. *@param targetDSA target DSA to cast spells on. @@ -41,7 +41,7 @@ abstract contract DSASpell is Events, Stores { *@param connectors Array of connector names. *@param datas Array of connector calldatas. */ - function retrySpell(string[] memory connectors, bytes[] memory datas) + function spellFactory(string[] memory connectors, bytes[] memory datas) external payable returns (string memory eventName, bytes memory eventParam) @@ -69,11 +69,11 @@ abstract contract DSASpell is Events, Stores { } } - eventName = "LogRetrySpell(string[],bytes[])"; + eventName = "LogSpellFactory(string[],bytes[])"; eventParam = abi.encode(_eventNames, _eventParams); } } -contract ConnectV2DSASpellFantom is DSASpell { +contract ConnectV2DSASpellFantom is DSASpellsResolver { string public name = "DSA-Spell-v1.0"; } diff --git a/contracts/mainnet/connectors/spell/events.sol b/contracts/mainnet/connectors/spell/events.sol index 036c990f..b3e455d6 100644 --- a/contracts/mainnet/connectors/spell/events.sol +++ b/contracts/mainnet/connectors/spell/events.sol @@ -8,5 +8,5 @@ contract Events { string[] connectors, bytes[] datas ); - event LogRetrySpell(string[] eventNames, bytes[] eventParams); + event LogSpellFactory(string[] eventNames, bytes[] eventParams); } diff --git a/contracts/mainnet/connectors/spell/main.sol b/contracts/mainnet/connectors/spell/main.sol index c1a92dea..34458953 100644 --- a/contracts/mainnet/connectors/spell/main.sol +++ b/contracts/mainnet/connectors/spell/main.sol @@ -12,7 +12,7 @@ import { AccountInterface } from "../../common/interfaces.sol"; import { Stores } from "../../common/stores.sol"; import { Events } from "./events.sol"; -abstract contract DSASpell is Events, Stores { +abstract contract DSASpellsResolver is Events, Stores { /** *@dev Cast spells on DSA. *@param targetDSA target DSA to cast spells on. @@ -41,7 +41,7 @@ abstract contract DSASpell is Events, Stores { *@param connectors Array of connector names. *@param datas Array of connector calldatas. */ - function retrySpell(string[] memory connectors, bytes[] memory datas) + function spellFactory(string[] memory connectors, bytes[] memory datas) external payable returns (string memory eventName, bytes memory eventParam) @@ -69,11 +69,11 @@ abstract contract DSASpell is Events, Stores { } } - eventName = "LogRetrySpell(string[],bytes[])"; + eventName = "LogSpellFactory(string[],bytes[])"; eventParam = abi.encode(_eventNames, _eventParams); } } -contract ConnectV2DSASpell is DSASpell { +contract ConnectV2DSASpell is DSASpellsResolver { string public name = "DSA-Spell-v1.0"; } diff --git a/contracts/optimism/connectors/spell/events.sol b/contracts/optimism/connectors/spell/events.sol index 036c990f..b3e455d6 100644 --- a/contracts/optimism/connectors/spell/events.sol +++ b/contracts/optimism/connectors/spell/events.sol @@ -8,5 +8,5 @@ contract Events { string[] connectors, bytes[] datas ); - event LogRetrySpell(string[] eventNames, bytes[] eventParams); + event LogSpellFactory(string[] eventNames, bytes[] eventParams); } diff --git a/contracts/optimism/connectors/spell/main.sol b/contracts/optimism/connectors/spell/main.sol index 557aeed0..c98c97d4 100644 --- a/contracts/optimism/connectors/spell/main.sol +++ b/contracts/optimism/connectors/spell/main.sol @@ -12,7 +12,7 @@ import { AccountInterface } from "../../common/interfaces.sol"; import { Stores } from "../../common/stores.sol"; import { Events } from "./events.sol"; -abstract contract DSASpell is Events, Stores { +abstract contract DSASpellsResolver is Events, Stores { /** *@dev Cast spells on DSA. *@param targetDSA target DSA to cast spells on. @@ -41,7 +41,7 @@ abstract contract DSASpell is Events, Stores { *@param connectors Array of connector names. *@param datas Array of connector calldatas. */ - function retrySpell(string[] memory connectors, bytes[] memory datas) + function spellFactory(string[] memory connectors, bytes[] memory datas) external payable returns (string memory eventName, bytes memory eventParam) @@ -69,11 +69,11 @@ abstract contract DSASpell is Events, Stores { } } - eventName = "LogRetrySpell(string[],bytes[])"; + eventName = "LogSpellFactory(string[],bytes[])"; eventParam = abi.encode(_eventNames, _eventParams); } } -contract ConnectV2DSASpellOptimism is DSASpell { +contract ConnectV2DSASpellOptimism is DSASpellsResolver { string public name = "DSA-Spell-v1.0"; } diff --git a/contracts/polygon/connectors/spell/events.sol b/contracts/polygon/connectors/spell/events.sol index 036c990f..b3e455d6 100644 --- a/contracts/polygon/connectors/spell/events.sol +++ b/contracts/polygon/connectors/spell/events.sol @@ -8,5 +8,5 @@ contract Events { string[] connectors, bytes[] datas ); - event LogRetrySpell(string[] eventNames, bytes[] eventParams); + event LogSpellFactory(string[] eventNames, bytes[] eventParams); } diff --git a/contracts/polygon/connectors/spell/main.sol b/contracts/polygon/connectors/spell/main.sol index 3d44cb3a..023a7ee7 100644 --- a/contracts/polygon/connectors/spell/main.sol +++ b/contracts/polygon/connectors/spell/main.sol @@ -12,7 +12,7 @@ import { AccountInterface } from "../../common/interfaces.sol"; import { Stores } from "../../common/stores.sol"; import { Events } from "./events.sol"; -abstract contract DSASpell is Events, Stores { +abstract contract DSASpellsResolver is Events, Stores { /** *@dev Cast spells on DSA. *@param targetDSA target DSA to cast spells on. @@ -41,7 +41,7 @@ abstract contract DSASpell is Events, Stores { *@param connectors Array of connector names. *@param datas Array of connector calldatas. */ - function retrySpell(string[] memory connectors, bytes[] memory datas) + function spellFactory(string[] memory connectors, bytes[] memory datas) external payable returns (string memory eventName, bytes memory eventParam) @@ -69,11 +69,11 @@ abstract contract DSASpell is Events, Stores { } } - eventName = "LogRetrySpell(string[],bytes[])"; + eventName = "LogSpellFactory(string[],bytes[])"; eventParam = abi.encode(_eventNames, _eventParams); } } -contract ConnectV2DSASpellPolygon is DSASpell { +contract ConnectV2DSASpellPolygon is DSASpellsResolver { string public name = "DSA-Spell-v1.0"; } From b8e0c1826ac1a124c1c428d52722e365b2a6cec1 Mon Sep 17 00:00:00 2001 From: Richa-iitr Date: Mon, 20 Jun 2022 12:11:56 +0530 Subject: [PATCH 10/14] updated tests --- test/arbitrum/dsa-spell/dsa-spell.test.ts | 67 ++++++++----- test/avalanche/dsa-spell/dsa-spell.test.ts | 99 +++++++++---------- test/fantom/dsa-spell/dsa-spell.test.ts | 67 ++++++++----- test/mainnet/dsa-spell/dsa-spell.test.ts | 57 ++++++----- test/optimism/dsa-spell/dsa-spell.test.ts | 67 ++++++++----- test/polygon/dsa-spell/dsa-spell.test.ts | 110 ++++++++++----------- 6 files changed, 266 insertions(+), 201 deletions(-) diff --git a/test/arbitrum/dsa-spell/dsa-spell.test.ts b/test/arbitrum/dsa-spell/dsa-spell.test.ts index 98346369..399e17a3 100644 --- a/test/arbitrum/dsa-spell/dsa-spell.test.ts +++ b/test/arbitrum/dsa-spell/dsa-spell.test.ts @@ -85,28 +85,37 @@ describe("DSA Spell", function () { describe("Main", function () { let ETH = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"; + let USDC = "0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8"; + let usdc = new ethers.Contract(USDC, abis.basic.erc20); var abi = [ "function withdraw(address,uint256,address,uint256,uint256)", - "function deposit(address,uint256,uint256,uint256)" + "function deposit(address,uint256,uint256,uint256)", + "function borrow(address,uint256,uint256,uint256,uint256)" ]; function getCallData(spell: string, params: any) { var iface = new ethers.utils.Interface(abi); let data = iface.encodeFunctionData(spell, params); - return data; + return ethers.utils.hexlify(data); } it("should cast spells", async function () { - async function getArg() { - let basicParams = [ETH, ethers.utils.parseEther("2"), dsaWallet0.address, 0, 0]; - let dataBasic = ethers.utils.hexlify(await getCallData("withdraw", basicParams)); - let datas = [dataBasic]; - - let connectors = ["BASIC-A"]; - + async function getArg(connectors: any, spells: any, params: any) { + let datas = []; + for (let i = 0; i < connectors.length; i++) { + datas.push(getCallData(spells[i], params[i])); + } return [dsaWallet1.address, connectors, datas]; } - let arg = await getArg(); + let connectors = ["BASIC-A", "AAVE-V3-A", "AAVE-V3-A"]; + let methods = ["withdraw", "deposit", "borrow"]; + let params = [ + [ETH, ethers.utils.parseEther("2"), dsaWallet0.address, 0, 0], + [ETH, ethers.constants.MaxUint256, 0, 0], + [USDC, ethers.utils.parseUnits("1", 6), 2, 0, 0] + ]; + let arg = await getArg(connectors, methods, params); + const spells = [ { connector: connectorName, @@ -116,29 +125,36 @@ describe("DSA Spell", function () { ]; const tx = await dsaWallet0.connect(wallet0).cast(...encodeSpells(spells), await wallet0.getAddress()); const receipt = await tx.wait(); + }); - expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.lte(ethers.utils.parseEther("8")); + it("should check balances after cast on DSA", async function () { + expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.lte(ethers.utils.parseEther("0")); + expect(await usdc.connect(wallet0).balanceOf(dsaWallet1.address)).to.be.gte(ethers.utils.parseUnits("1", 6)); expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.gte(ethers.utils.parseEther("12")); }); it("should retry spells", async function () { - async function getArg() { - let basicParams = [ETH, ethers.utils.parseEther("1"), 0, 0]; - let dataBasic = ethers.utils.hexlify(await getCallData("deposit", basicParams)); - let basicWithdraw = [ETH, ethers.utils.parseEther("2"), dsaWallet1.address, 0, 0]; - let dataWithdraw = ethers.utils.hexlify(await getCallData("withdraw", basicWithdraw)); - let datas = [dataBasic, dataWithdraw]; - - let connectors = ["BASIC-A", "BASIC-A"]; - + async function getArg(connectors: any, spells: any, params: any) { + let datas = []; + for (let i = 0; i < connectors.length; i++) { + datas.push(getCallData(spells[i], params[i])); + } return [connectors, datas]; } - let arg = await getArg(); + let connectors = ["BASIC-A", "BASIC-A", "AAVE-V3-A", "AAVE-V3-A"]; + let methods = ["deposit", "withdraw", "deposit", "borrow"]; + let params = [ + [ETH, ethers.utils.parseEther("1"), 0, 0], + [ETH, ethers.utils.parseEther("2"), dsaWallet1.address, 0, 0], + [ETH, ethers.utils.parseEther("10"), 0, 0], + [USDC, ethers.utils.parseUnits("3", 6), 2, 0, 0] + ]; + let arg = await getArg(connectors, methods, params); const spells = [ { connector: connectorName, - method: "retrySpell", + method: "spellFactory", args: arg } ]; @@ -146,9 +162,12 @@ describe("DSA Spell", function () { .connect(wallet0) .cast(...encodeSpells(spells), await wallet0.getAddress(), { value: ethers.utils.parseEther("1") }); const receipt = await tx.wait(); + }); - expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.lte(ethers.utils.parseEther("11")); - expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.gte(ethers.utils.parseEther("10")); + it("should check balances after spells on DSA", async function () { + expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.lte(ethers.utils.parseEther("1")); + expect(await usdc.connect(wallet0).balanceOf(dsaWallet0.address)).to.be.gte(ethers.utils.parseUnits("3", 6)); + expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.gte(ethers.utils.parseEther("2")); }); }); }); diff --git a/test/avalanche/dsa-spell/dsa-spell.test.ts b/test/avalanche/dsa-spell/dsa-spell.test.ts index aa1668fd..48d45fdd 100644 --- a/test/avalanche/dsa-spell/dsa-spell.test.ts +++ b/test/avalanche/dsa-spell/dsa-spell.test.ts @@ -90,33 +90,37 @@ describe("DSA Spell", function () { describe("Main", function () { let AVAX = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"; + let USDC = "0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"; + let usdc = new ethers.Contract(USDC, abis.basic.erc20); + var abi = [ + "function withdraw(address,uint256,address,uint256,uint256)", + "function deposit(address,uint256,uint256,uint256)", + "function borrow(address,uint256,uint256,uint256,uint256)" + ]; + function getCallData(spell: string, params: any) { + var iface = new ethers.utils.Interface(abi); + let data = iface.encodeFunctionData(spell, params); + return ethers.utils.hexlify(data); + } + it("should cast spells", async function () { - await hre.network.provider.request({ - method: "hardhat_impersonateAccount", - params: [walletB.address] - }); - - walletBsigner = await ethers.getSigner(walletB.address); - async function getArg() { - var abi = [ - "function withdraw(address,uint256,address,uint256,uint256)", - "function deposit(address,uint256,uint256,uint256)" - ]; - function getCallData(connector: string, spell: string, params: any) { - var iface = new ethers.utils.Interface(abi); - let data = iface.encodeFunctionData(spell, params); - return data; + async function getArg(connectors: any, spells: any, params: any) { + let datas = []; + for (let i = 0; i < connectors.length; i++) { + datas.push(getCallData(spells[i], params[i])); } - let basicParams = [AVAX, ethers.utils.parseEther("2"), dsaWallet0.address, 0, 0]; - let dataBasic = ethers.utils.hexlify(await getCallData("BASIC-A", "withdraw", basicParams)); - let datas = [dataBasic]; - - let connectors = ["BASIC-A"]; - return [dsaWallet1.address, connectors, datas]; } - let arg = await getArg(); + let connectors = ["BASIC-A", "AAVE-V3-A", "AAVE-V3-A"]; + let methods = ["withdraw", "deposit", "borrow"]; + let params = [ + [AVAX, ethers.utils.parseEther("2"), dsaWallet0.address, 0, 0], + [AVAX, ethers.constants.MaxUint256, 0, 0], + [USDC, ethers.utils.parseUnits("1", 6), 2, 0, 0] + ]; + let arg = await getArg(connectors, methods, params); + const spells = [ { connector: connectorName, @@ -126,44 +130,36 @@ describe("DSA Spell", function () { ]; const tx = await dsaWallet0.connect(wallet0).cast(...encodeSpells(spells), await wallet0.getAddress()); const receipt = await tx.wait(); + }); - expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.lte(ethers.utils.parseEther("8")); + it("should check balances after cast on DSA", async function () { + expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.lte(ethers.utils.parseEther("0")); + expect(await usdc.connect(wallet0).balanceOf(dsaWallet1.address)).to.be.gte(ethers.utils.parseUnits("1", 6)); expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.gte(ethers.utils.parseEther("12")); }); it("should retry spells", async function () { - await hre.network.provider.request({ - method: "hardhat_impersonateAccount", - params: [walletB.address] - }); - - walletBsigner = await ethers.getSigner(walletB.address); - async function getArg() { - var abi = [ - "function withdraw(address,uint256,address,uint256,uint256)", - "function deposit(address,uint256,uint256,uint256)" - ]; - function getCallData(spell: string, params: any) { - var iface = new ethers.utils.Interface(abi); - let data = iface.encodeFunctionData(spell, params); - return data; + async function getArg(connectors: any, spells: any, params: any) { + let datas = []; + for (let i = 0; i < connectors.length; i++) { + datas.push(getCallData(spells[i], params[i])); } - let basicParams = [AVAX, ethers.utils.parseEther("1"), 0, 0]; - let dataBasic = ethers.utils.hexlify(await getCallData("deposit", basicParams)); - let basicWithdraw = [AVAX, ethers.utils.parseEther("2"), dsaWallet1.address, 0, 0]; - let dataWithdraw = ethers.utils.hexlify(await getCallData("withdraw", basicWithdraw)); - let datas = [dataBasic, dataWithdraw]; - - let connectors = ["BASIC-A", "BASIC-A"]; - return [connectors, datas]; } - let arg = await getArg(); + let connectors = ["BASIC-A", "BASIC-A", "AAVE-V3-A", "AAVE-V3-A"]; + let methods = ["deposit", "withdraw", "deposit", "borrow"]; + let params = [ + [AVAX, ethers.utils.parseEther("1"), 0, 0], + [AVAX, ethers.utils.parseEther("2"), dsaWallet1.address, 0, 0], + [AVAX, ethers.utils.parseEther("10"), 0, 0], + [USDC, ethers.utils.parseUnits("3", 6), 2, 0, 0] + ]; + let arg = await getArg(connectors, methods, params); const spells = [ { connector: connectorName, - method: "retrySpell", + method: "spellFactory", args: arg } ]; @@ -171,9 +167,12 @@ describe("DSA Spell", function () { .connect(wallet0) .cast(...encodeSpells(spells), await wallet0.getAddress(), { value: ethers.utils.parseEther("1") }); const receipt = await tx.wait(); + }); - expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.lte(ethers.utils.parseEther("11")); - expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.gte(ethers.utils.parseEther("10")); + it("should check balances after spells on DSA", async function () { + expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.lte(ethers.utils.parseEther("1")); + expect(await usdc.connect(wallet0).balanceOf(dsaWallet0.address)).to.be.gte(ethers.utils.parseUnits("3", 6)); + expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.gte(ethers.utils.parseEther("2")); }); }); }); diff --git a/test/fantom/dsa-spell/dsa-spell.test.ts b/test/fantom/dsa-spell/dsa-spell.test.ts index 6dc2850d..e58c3367 100644 --- a/test/fantom/dsa-spell/dsa-spell.test.ts +++ b/test/fantom/dsa-spell/dsa-spell.test.ts @@ -87,28 +87,37 @@ describe("DSA Spell", function () { describe("Main", function () { let FTM = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"; + let USDC = "0x04068DA6C83AFCFA0e13ba15A6696662335D5B75"; + let usdc = new ethers.Contract(USDC, abis.basic.erc20); var abi = [ "function withdraw(address,uint256,address,uint256,uint256)", - "function deposit(address,uint256,uint256,uint256)" + "function deposit(address,uint256,uint256,uint256)", + "function borrow(address,uint256,uint256,uint256,uint256)" ]; function getCallData(spell: string, params: any) { var iface = new ethers.utils.Interface(abi); let data = iface.encodeFunctionData(spell, params); - return data; + return ethers.utils.hexlify(data); } it("should cast spells", async function () { - async function getArg() { - let basicParams = [FTM, ethers.utils.parseEther("2"), dsaWallet0.address, 0, 0]; - let dataBasic = ethers.utils.hexlify(await getCallData("withdraw", basicParams)); - let datas = [dataBasic]; - - let connectors = ["BASIC-A"]; - + async function getArg(connectors: any, spells: any, params: any) { + let datas = []; + for (let i = 0; i < connectors.length; i++) { + datas.push(getCallData(spells[i], params[i])); + } return [dsaWallet1.address, connectors, datas]; } - let arg = await getArg(); + let connectors = ["BASIC-A", "AAVE-V3-A", "AAVE-V3-A"]; + let methods = ["withdraw", "deposit", "borrow"]; + let params = [ + [FTM, ethers.utils.parseEther("2"), dsaWallet0.address, 0, 0], + [FTM, ethers.constants.MaxUint256, 0, 0], + [USDC, ethers.utils.parseUnits("1", 5), 2, 0, 0] + ]; + let arg = await getArg(connectors, methods, params); + const spells = [ { connector: connectorName, @@ -118,29 +127,36 @@ describe("DSA Spell", function () { ]; const tx = await dsaWallet0.connect(wallet0).cast(...encodeSpells(spells), await wallet0.getAddress()); const receipt = await tx.wait(); + }); - expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.lte(ethers.utils.parseEther("8")); + it("should check balances after cast on DSA", async function () { + expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.lte(ethers.utils.parseEther("0")); + expect(await usdc.connect(wallet0).balanceOf(dsaWallet1.address)).to.be.gte(ethers.utils.parseUnits("1", 5)); expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.gte(ethers.utils.parseEther("12")); }); it("should retry spells", async function () { - async function getArg() { - let basicParams = [FTM, ethers.utils.parseEther("1"), 0, 0]; - let dataBasic = ethers.utils.hexlify(await getCallData("deposit", basicParams)); - let basicWithdraw = [FTM, ethers.utils.parseEther("2"), dsaWallet1.address, 0, 0]; - let dataWithdraw = ethers.utils.hexlify(await getCallData("withdraw", basicWithdraw)); - let datas = [dataBasic, dataWithdraw]; - - let connectors = ["BASIC-A", "BASIC-A"]; - + async function getArg(connectors: any, spells: any, params: any) { + let datas = []; + for (let i = 0; i < connectors.length; i++) { + datas.push(getCallData(spells[i], params[i])); + } return [connectors, datas]; } - let arg = await getArg(); + let connectors = ["BASIC-A", "BASIC-A", "AAVE-V3-A", "AAVE-V3-A"]; + let methods = ["deposit", "withdraw", "deposit", "borrow"]; + let params = [ + [FTM, ethers.utils.parseEther("1"), 0, 0], + [FTM, ethers.utils.parseEther("2"), dsaWallet1.address, 0, 0], + [FTM, ethers.utils.parseEther("10"), 0, 0], + [USDC, ethers.utils.parseUnits("1", 5), 2, 0, 0] + ]; + let arg = await getArg(connectors, methods, params); const spells = [ { connector: connectorName, - method: "retrySpell", + method: "spellFactory", args: arg } ]; @@ -148,9 +164,12 @@ describe("DSA Spell", function () { .connect(wallet0) .cast(...encodeSpells(spells), await wallet0.getAddress(), { value: ethers.utils.parseEther("1") }); const receipt = await tx.wait(); + }); - expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.lte(ethers.utils.parseEther("11")); - expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.gte(ethers.utils.parseEther("10")); + it("should check balances after spells on DSA", async function () { + expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.lte(ethers.utils.parseEther("1")); + expect(await usdc.connect(wallet0).balanceOf(dsaWallet0.address)).to.be.gte(ethers.utils.parseUnits("1", 5)); + expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.gte(ethers.utils.parseEther("2")); }); }); }); diff --git a/test/mainnet/dsa-spell/dsa-spell.test.ts b/test/mainnet/dsa-spell/dsa-spell.test.ts index 5cf8a7b8..be805d95 100644 --- a/test/mainnet/dsa-spell/dsa-spell.test.ts +++ b/test/mainnet/dsa-spell/dsa-spell.test.ts @@ -85,28 +85,35 @@ describe("DSA Spell", function () { describe("Main", function () { let ETH = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"; + let USDC = "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"; + let usdc = new ethers.Contract(USDC, abis.basic.erc20); var abi = [ "function withdraw(address,uint256,address,uint256,uint256)", - "function deposit(address,uint256,uint256,uint256)" + "function deposit(address,uint256,uint256,uint256)", + "function borrow(address,uint256,uint256,uint256,uint256)" ]; function getCallData(spell: string, params: any) { var iface = new ethers.utils.Interface(abi); let data = iface.encodeFunctionData(spell, params); - return data; + return ethers.utils.hexlify(data); } it("should cast spells", async function () { - async function getArg() { - let basicParams = [ETH, ethers.utils.parseEther("2"), dsaWallet0.address, 0, 0]; - let dataBasic = ethers.utils.hexlify(await getCallData("withdraw", basicParams)); - let datas = [dataBasic]; - - let connectors = ["BASIC-A"]; - + async function getArg(connectors: any, spells: any, params: any) { + let datas = []; + for (let i = 0; i < connectors.length; i++) { + datas.push(getCallData(spells[i], params[i])); + } return [dsaWallet1.address, connectors, datas]; } - let arg = await getArg(); + let connectors = ["BASIC-A"]; + let methods = ["withdraw"]; + let params = [ + [ETH, ethers.utils.parseEther("2"), dsaWallet0.address, 0, 0], + ]; + let arg = await getArg(connectors, methods, params); + const spells = [ { connector: connectorName, @@ -116,29 +123,33 @@ describe("DSA Spell", function () { ]; const tx = await dsaWallet0.connect(wallet0).cast(...encodeSpells(spells), await wallet0.getAddress()); const receipt = await tx.wait(); + }); + it("should check balances after cast on DSA", async function () { expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.lte(ethers.utils.parseEther("8")); expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.gte(ethers.utils.parseEther("12")); }); it("should retry spells", async function () { - async function getArg() { - let basicParams = [ETH, ethers.utils.parseEther("1"), 0, 0]; - let dataBasic = ethers.utils.hexlify(await getCallData("deposit", basicParams)); - let basicWithdraw = [ETH, ethers.utils.parseEther("2"), dsaWallet1.address, 0, 0]; - let dataWithdraw = ethers.utils.hexlify(await getCallData("withdraw", basicWithdraw)); - let datas = [dataBasic, dataWithdraw]; - - let connectors = ["BASIC-A", "BASIC-A"]; - + async function getArg(connectors: any, spells: any, params: any) { + let datas = []; + for (let i = 0; i < connectors.length; i++) { + datas.push(getCallData(spells[i], params[i])); + } return [connectors, datas]; } - let arg = await getArg(); + let connectors = ["BASIC-A", "BASIC-A"]; + let methods = ["deposit", "withdraw"]; + let params = [ + [ETH, ethers.utils.parseEther("1"), 0, 0], + [ETH, ethers.utils.parseEther("2"), dsaWallet1.address, 0, 0] + ]; + let arg = await getArg(connectors, methods, params); const spells = [ { connector: connectorName, - method: "retrySpell", + method: "spellFactory", args: arg } ]; @@ -146,8 +157,10 @@ describe("DSA Spell", function () { .connect(wallet0) .cast(...encodeSpells(spells), await wallet0.getAddress(), { value: ethers.utils.parseEther("1") }); const receipt = await tx.wait(); + }); - expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.lte(ethers.utils.parseEther("11")); + it("should check balances after spells on DSA", async function () { + expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.lte(ethers.utils.parseEther("13")); expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.gte(ethers.utils.parseEther("10")); }); }); diff --git a/test/optimism/dsa-spell/dsa-spell.test.ts b/test/optimism/dsa-spell/dsa-spell.test.ts index 7c0faa61..b4a12e69 100644 --- a/test/optimism/dsa-spell/dsa-spell.test.ts +++ b/test/optimism/dsa-spell/dsa-spell.test.ts @@ -85,28 +85,37 @@ describe("DSA Spell", function () { describe("Main", function () { let ETH = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"; + let USDC = "0x7F5c764cBc14f9669B88837ca1490cCa17c31607"; + let usdc = new ethers.Contract(USDC, abis.basic.erc20); var abi = [ "function withdraw(address,uint256,address,uint256,uint256)", - "function deposit(address,uint256,uint256,uint256)" + "function deposit(address,uint256,uint256,uint256)", + "function borrow(address,uint256,uint256,uint256,uint256)" ]; function getCallData(spell: string, params: any) { var iface = new ethers.utils.Interface(abi); let data = iface.encodeFunctionData(spell, params); - return data; + return ethers.utils.hexlify(data); } it("should cast spells", async function () { - async function getArg() { - let basicParams = [ETH, ethers.utils.parseEther("2"), dsaWallet0.address, 0, 0]; - let dataBasic = ethers.utils.hexlify(await getCallData("withdraw", basicParams)); - let datas = [dataBasic]; - - let connectors = ["BASIC-A"]; - + async function getArg(connectors: any, spells: any, params: any) { + let datas = []; + for (let i = 0; i < connectors.length; i++) { + datas.push(getCallData(spells[i], params[i])); + } return [dsaWallet1.address, connectors, datas]; } - let arg = await getArg(); + let connectors = ["BASIC-A", "AAVE-V3-A", "AAVE-V3-A"]; + let methods = ["withdraw", "deposit", "borrow"]; + let params = [ + [ETH, ethers.utils.parseEther("2"), dsaWallet0.address, 0, 0], + [ETH, ethers.constants.MaxUint256, 0, 0], + [USDC, ethers.utils.parseUnits("1", 6), 2, 0, 0] + ]; + let arg = await getArg(connectors, methods, params); + const spells = [ { connector: connectorName, @@ -116,29 +125,36 @@ describe("DSA Spell", function () { ]; const tx = await dsaWallet0.connect(wallet0).cast(...encodeSpells(spells), await wallet0.getAddress()); const receipt = await tx.wait(); + }); - expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.lte(ethers.utils.parseEther("8")); + it("should check balances after cast on DSA", async function () { + expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.lte(ethers.utils.parseEther("0")); + expect(await usdc.connect(wallet0).balanceOf(dsaWallet1.address)).to.be.gte(ethers.utils.parseUnits("1", 6)); expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.gte(ethers.utils.parseEther("12")); }); it("should retry spells", async function () { - async function getArg() { - let basicParams = [ETH, ethers.utils.parseEther("1"), 0, 0]; - let dataBasic = ethers.utils.hexlify(await getCallData("deposit", basicParams)); - let basicWithdraw = [ETH, ethers.utils.parseEther("2"), dsaWallet1.address, 0, 0]; - let dataWithdraw = ethers.utils.hexlify(await getCallData("withdraw", basicWithdraw)); - let datas = [dataBasic, dataWithdraw]; - - let connectors = ["BASIC-A", "BASIC-A"]; - + async function getArg(connectors: any, spells: any, params: any) { + let datas = []; + for (let i = 0; i < connectors.length; i++) { + datas.push(getCallData(spells[i], params[i])); + } return [connectors, datas]; } - let arg = await getArg(); + let connectors = ["BASIC-A", "BASIC-A", "AAVE-V3-A", "AAVE-V3-A"]; + let methods = ["deposit", "withdraw", "deposit", "borrow"]; + let params = [ + [ETH, ethers.utils.parseEther("1"), 0, 0], + [ETH, ethers.utils.parseEther("2"), dsaWallet1.address, 0, 0], + [ETH, ethers.utils.parseEther("10"), 0, 0], + [USDC, ethers.utils.parseUnits("3", 6), 2, 0, 0] + ]; + let arg = await getArg(connectors, methods, params); const spells = [ { connector: connectorName, - method: "retrySpell", + method: "spellFactory", args: arg } ]; @@ -146,9 +162,12 @@ describe("DSA Spell", function () { .connect(wallet0) .cast(...encodeSpells(spells), await wallet0.getAddress(), { value: ethers.utils.parseEther("1") }); const receipt = await tx.wait(); + }); - expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.lte(ethers.utils.parseEther("11")); - expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.gte(ethers.utils.parseEther("10")); + it("should check balances after spells on DSA", async function () { + expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.lte(ethers.utils.parseEther("1")); + expect(await usdc.connect(wallet0).balanceOf(dsaWallet0.address)).to.be.gte(ethers.utils.parseUnits("3", 6)); + expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.gte(ethers.utils.parseEther("2")); }); }); }); diff --git a/test/polygon/dsa-spell/dsa-spell.test.ts b/test/polygon/dsa-spell/dsa-spell.test.ts index 577ad5cd..c06d44d9 100644 --- a/test/polygon/dsa-spell/dsa-spell.test.ts +++ b/test/polygon/dsa-spell/dsa-spell.test.ts @@ -89,36 +89,38 @@ describe("DSA Spell", function () { }); describe("Main", function () { + let MATIC = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"; + let USDC = "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174"; + let usdc = new ethers.Contract(USDC, abis.basic.erc20); + var abi = [ + "function withdraw(address,uint256,address,uint256,uint256)", + "function deposit(address,uint256,uint256,uint256)", + "function borrow(address,uint256,uint256,uint256,uint256)" + ]; + function getCallData(spell: string, params: any) { + var iface = new ethers.utils.Interface(abi); + let data = iface.encodeFunctionData(spell, params); + return ethers.utils.hexlify(data); + } + it("should cast spells", async function () { - await hre.network.provider.request({ - method: "hardhat_impersonateAccount", - params: [walletB.address] - }); - - walletBsigner = await ethers.getSigner(walletB.address); - let buyTokenAmountZeroX: any; - let USDT = "0xc2132d05d31c914a87c6611c10748aeb04b58e8f"; - let MATIC = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"; - async function getArg() { - var abi = [ - "function withdraw(address,uint256,address,uint256,uint256)", - "function deposit(address,uint256,uint256,uint256)" - ]; - function getCallData(connector: string, spell: string, params: any) { - var iface = new ethers.utils.Interface(abi); - let data = iface.encodeFunctionData(spell, params); - return data; + async function getArg(connectors: any, spells: any, params: any) { + let datas = []; + for (let i = 0; i < connectors.length; i++) { + datas.push(getCallData(spells[i], params[i])); } - let basicParams = [MATIC, ethers.utils.parseEther("2"), dsaWallet0.address, 0, 0]; - let dataBasic = ethers.utils.hexlify(await getCallData("BASIC-A", "withdraw", basicParams)); - let datas = [dataBasic]; - - let connectors = ["BASIC-A"]; - return [dsaWallet1.address, connectors, datas]; } - let arg = await getArg(); + let connectors = ["BASIC-A", "AAVE-V3-A", "AAVE-V3-A"]; + let methods = ["withdraw", "deposit", "borrow"]; + let params = [ + [MATIC, ethers.utils.parseEther("2"), dsaWallet0.address, 0, 0], + [MATIC, ethers.constants.MaxUint256, 0, 0], + [USDC, ethers.utils.parseUnits("1", 6), 2, 0, 0] + ]; + let arg = await getArg(connectors, methods, params); + const spells = [ { connector: connectorName, @@ -128,55 +130,49 @@ describe("DSA Spell", function () { ]; const tx = await dsaWallet0.connect(wallet0).cast(...encodeSpells(spells), await wallet0.getAddress()); const receipt = await tx.wait(); + }); - expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.lte(ethers.utils.parseEther("8")); + it("should check balances after cast on DSA", async function () { + expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.lte(ethers.utils.parseEther("0")); + expect(await usdc.connect(wallet0).balanceOf(dsaWallet1.address)).to.be.gte(ethers.utils.parseUnits("1", 6)); expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.gte(ethers.utils.parseEther("12")); }); it("should retry spells", async function () { - await hre.network.provider.request({ - method: "hardhat_impersonateAccount", - params: [walletB.address] - }); - - walletBsigner = await ethers.getSigner(walletB.address); - let buyTokenAmountZeroX: any; - let USDT = "0xc2132d05d31c914a87c6611c10748aeb04b58e8f"; - let MATIC = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"; - async function getArg() { - var abi = [ - "function withdraw(address,uint256,address,uint256,uint256)", - "function deposit(address,uint256,uint256,uint256)" - ]; - function getCallData(spell: string, params: any) { - var iface = new ethers.utils.Interface(abi); - let data = iface.encodeFunctionData(spell, params); - return data; + async function getArg(connectors: any, spells: any, params: any) { + let datas = []; + for (let i = 0; i < connectors.length; i++) { + datas.push(getCallData(spells[i], params[i])); } - let basicParams = [MATIC, ethers.utils.parseEther("1"), 0, 0]; - let dataBasic = ethers.utils.hexlify(await getCallData("deposit", basicParams)); - let basicWithdraw = [MATIC, ethers.utils.parseEther("2"), dsaWallet1.address, 0, 0]; - let dataWithdraw = ethers.utils.hexlify(await getCallData("withdraw", basicWithdraw)); - let datas = [dataBasic,dataWithdraw]; - - let connectors = ["BASIC-A","BASIC-A"]; - return [connectors, datas]; } - let arg = await getArg(); + let connectors = ["BASIC-A", "BASIC-A", "AAVE-V3-A", "AAVE-V3-A"]; + let methods = ["deposit", "withdraw", "deposit", "borrow"]; + let params = [ + [MATIC, ethers.utils.parseEther("1"), 0, 0], + [MATIC, ethers.utils.parseEther("2"), dsaWallet1.address, 0, 0], + [MATIC, ethers.utils.parseEther("10"), 0, 0], + [USDC, ethers.utils.parseUnits("1", 6), 2, 0, 0] + ]; + let arg = await getArg(connectors, methods, params); const spells = [ { connector: connectorName, - method: "retrySpell", + method: "spellFactory", args: arg } ]; - const tx = await dsaWallet0.connect(wallet0).cast(...encodeSpells(spells), await wallet0.getAddress(), {value: ethers.utils.parseEther("1")}); + const tx = await dsaWallet0 + .connect(wallet0) + .cast(...encodeSpells(spells), await wallet0.getAddress(), { value: ethers.utils.parseEther("1") }); const receipt = await tx.wait(); + }); - expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.lte(ethers.utils.parseEther("11")); - expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.gte(ethers.utils.parseEther("10")); + it("should check balances after spells on DSA", async function () { + expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.lte(ethers.utils.parseEther("1")); + expect(await usdc.connect(wallet0).balanceOf(dsaWallet0.address)).to.be.gte(ethers.utils.parseUnits("1", 6)); + expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.gte(ethers.utils.parseEther("2")); }); }); }); From 655bd59878847e51dd806831b36aa70d836092b0 Mon Sep 17 00:00:00 2001 From: Richa-iitr Date: Mon, 20 Jun 2022 12:41:50 +0530 Subject: [PATCH 11/14] renamed directory --- contracts/arbitrum/connectors/{spell => dsa-spell}/events.sol | 0 contracts/arbitrum/connectors/{spell => dsa-spell}/main.sol | 0 contracts/avalanche/connectors/{spell => dsa-spell}/events.sol | 0 contracts/avalanche/connectors/{spell => dsa-spell}/main.sol | 0 contracts/fantom/connectors/{spell => dsa-spell}/events.sol | 0 contracts/fantom/connectors/{spell => dsa-spell}/main.sol | 0 contracts/mainnet/connectors/{spell => dsa-spell}/events.sol | 0 contracts/mainnet/connectors/{spell => dsa-spell}/main.sol | 0 contracts/optimism/connectors/{spell => dsa-spell}/events.sol | 0 contracts/optimism/connectors/{spell => dsa-spell}/main.sol | 0 contracts/polygon/connectors/{spell => dsa-spell}/events.sol | 0 contracts/polygon/connectors/{spell => dsa-spell}/main.sol | 0 12 files changed, 0 insertions(+), 0 deletions(-) rename contracts/arbitrum/connectors/{spell => dsa-spell}/events.sol (100%) rename contracts/arbitrum/connectors/{spell => dsa-spell}/main.sol (100%) rename contracts/avalanche/connectors/{spell => dsa-spell}/events.sol (100%) rename contracts/avalanche/connectors/{spell => dsa-spell}/main.sol (100%) rename contracts/fantom/connectors/{spell => dsa-spell}/events.sol (100%) rename contracts/fantom/connectors/{spell => dsa-spell}/main.sol (100%) rename contracts/mainnet/connectors/{spell => dsa-spell}/events.sol (100%) rename contracts/mainnet/connectors/{spell => dsa-spell}/main.sol (100%) rename contracts/optimism/connectors/{spell => dsa-spell}/events.sol (100%) rename contracts/optimism/connectors/{spell => dsa-spell}/main.sol (100%) rename contracts/polygon/connectors/{spell => dsa-spell}/events.sol (100%) rename contracts/polygon/connectors/{spell => dsa-spell}/main.sol (100%) diff --git a/contracts/arbitrum/connectors/spell/events.sol b/contracts/arbitrum/connectors/dsa-spell/events.sol similarity index 100% rename from contracts/arbitrum/connectors/spell/events.sol rename to contracts/arbitrum/connectors/dsa-spell/events.sol diff --git a/contracts/arbitrum/connectors/spell/main.sol b/contracts/arbitrum/connectors/dsa-spell/main.sol similarity index 100% rename from contracts/arbitrum/connectors/spell/main.sol rename to contracts/arbitrum/connectors/dsa-spell/main.sol diff --git a/contracts/avalanche/connectors/spell/events.sol b/contracts/avalanche/connectors/dsa-spell/events.sol similarity index 100% rename from contracts/avalanche/connectors/spell/events.sol rename to contracts/avalanche/connectors/dsa-spell/events.sol diff --git a/contracts/avalanche/connectors/spell/main.sol b/contracts/avalanche/connectors/dsa-spell/main.sol similarity index 100% rename from contracts/avalanche/connectors/spell/main.sol rename to contracts/avalanche/connectors/dsa-spell/main.sol diff --git a/contracts/fantom/connectors/spell/events.sol b/contracts/fantom/connectors/dsa-spell/events.sol similarity index 100% rename from contracts/fantom/connectors/spell/events.sol rename to contracts/fantom/connectors/dsa-spell/events.sol diff --git a/contracts/fantom/connectors/spell/main.sol b/contracts/fantom/connectors/dsa-spell/main.sol similarity index 100% rename from contracts/fantom/connectors/spell/main.sol rename to contracts/fantom/connectors/dsa-spell/main.sol diff --git a/contracts/mainnet/connectors/spell/events.sol b/contracts/mainnet/connectors/dsa-spell/events.sol similarity index 100% rename from contracts/mainnet/connectors/spell/events.sol rename to contracts/mainnet/connectors/dsa-spell/events.sol diff --git a/contracts/mainnet/connectors/spell/main.sol b/contracts/mainnet/connectors/dsa-spell/main.sol similarity index 100% rename from contracts/mainnet/connectors/spell/main.sol rename to contracts/mainnet/connectors/dsa-spell/main.sol diff --git a/contracts/optimism/connectors/spell/events.sol b/contracts/optimism/connectors/dsa-spell/events.sol similarity index 100% rename from contracts/optimism/connectors/spell/events.sol rename to contracts/optimism/connectors/dsa-spell/events.sol diff --git a/contracts/optimism/connectors/spell/main.sol b/contracts/optimism/connectors/dsa-spell/main.sol similarity index 100% rename from contracts/optimism/connectors/spell/main.sol rename to contracts/optimism/connectors/dsa-spell/main.sol diff --git a/contracts/polygon/connectors/spell/events.sol b/contracts/polygon/connectors/dsa-spell/events.sol similarity index 100% rename from contracts/polygon/connectors/spell/events.sol rename to contracts/polygon/connectors/dsa-spell/events.sol diff --git a/contracts/polygon/connectors/spell/main.sol b/contracts/polygon/connectors/dsa-spell/main.sol similarity index 100% rename from contracts/polygon/connectors/spell/main.sol rename to contracts/polygon/connectors/dsa-spell/main.sol From 2dd6321f5acdf674b2e1fb5348dfb3304bdacbf0 Mon Sep 17 00:00:00 2001 From: Richa-iitr Date: Mon, 20 Jun 2022 18:48:38 +0530 Subject: [PATCH 12/14] updated castAny(), comments --- .../arbitrum/connectors/dsa-spell/events.sol | 8 +++- .../arbitrum/connectors/dsa-spell/main.sol | 43 ++++++++++++------- .../avalanche/connectors/dsa-spell/events.sol | 8 +++- .../avalanche/connectors/dsa-spell/main.sol | 43 ++++++++++++------- .../fantom/connectors/dsa-spell/events.sol | 8 +++- .../fantom/connectors/dsa-spell/main.sol | 43 ++++++++++++------- .../mainnet/connectors/dsa-spell/events.sol | 8 +++- .../mainnet/connectors/dsa-spell/main.sol | 43 ++++++++++++------- .../optimism/connectors/dsa-spell/events.sol | 8 +++- .../optimism/connectors/dsa-spell/main.sol | 43 ++++++++++++------- .../polygon/connectors/dsa-spell/events.sol | 8 +++- .../polygon/connectors/dsa-spell/main.sol | 43 ++++++++++++------- 12 files changed, 210 insertions(+), 96 deletions(-) diff --git a/contracts/arbitrum/connectors/dsa-spell/events.sol b/contracts/arbitrum/connectors/dsa-spell/events.sol index b3e455d6..a48b295a 100644 --- a/contracts/arbitrum/connectors/dsa-spell/events.sol +++ b/contracts/arbitrum/connectors/dsa-spell/events.sol @@ -8,5 +8,11 @@ contract Events { string[] connectors, bytes[] datas ); - event LogSpellFactory(string[] eventNames, bytes[] eventParams); + event LogCastAny( + string indexed connector, + string connectorName, + string[] connectors, + string eventName, + bytes eventParam + ); } diff --git a/contracts/arbitrum/connectors/dsa-spell/main.sol b/contracts/arbitrum/connectors/dsa-spell/main.sol index 553bee32..89cb38dd 100644 --- a/contracts/arbitrum/connectors/dsa-spell/main.sol +++ b/contracts/arbitrum/connectors/dsa-spell/main.sol @@ -7,17 +7,17 @@ pragma experimental ABIEncoderV2; * @dev Cast spells on DSA. */ -// import files import { AccountInterface } from "../../common/interfaces.sol"; import { Stores } from "../../common/stores.sol"; import { Events } from "./events.sol"; abstract contract DSASpellsResolver is Events, Stores { /** - *@dev Cast spells on DSA. + *@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. - *@param datas Array of connector calldatas. + *@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, @@ -37,11 +37,13 @@ abstract contract DSASpellsResolver is Events, Stores { } /** - *@dev Perform spells. - *@param connectors Array of connector names. - *@param datas Array of connector calldatas. + *@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 spellFactory(string[] memory connectors, bytes[] memory datas) + function castAny(string[] memory connectors, bytes[] memory datas) external payable returns (string memory eventName, bytes memory eventParam) @@ -54,23 +56,34 @@ abstract contract DSASpellsResolver is Events, Stores { .isConnectors(connectors); require(isOk, "connector-names-invalid"); - string[] memory _eventNames = new string[](_length); - bytes[] memory _eventParams = new bytes[](_length); + string memory _connectorName; + string memory _eventName; + bytes memory _eventParam; + bytes memory returnData; + bool success; for (uint256 i = 0; i < _length; i++) { - (bool success, bytes memory returnData) = _connectors[i] - .delegatecall(datas[i]); + (success, returnData) = _connectors[i].delegatecall(datas[i]); if (success) { - (_eventNames[i], _eventParams[i]) = abi.decode( + _connectorName = connectors[i]; + (_eventName, _eventParam) = abi.decode( returnData, (string, bytes) ); + break; } } + require(success, "dsa-spells-failed"); - eventName = "LogSpellFactory(string[],bytes[])"; - eventParam = abi.encode(_eventNames, _eventParams); + eventName = "LogCastAny(string,string,string[],string,bytes)"; + eventParam = abi.encode( + _connectorName, + _connectorName, + connectors, + _eventName, + _eventParam + ); } } diff --git a/contracts/avalanche/connectors/dsa-spell/events.sol b/contracts/avalanche/connectors/dsa-spell/events.sol index b3e455d6..a48b295a 100644 --- a/contracts/avalanche/connectors/dsa-spell/events.sol +++ b/contracts/avalanche/connectors/dsa-spell/events.sol @@ -8,5 +8,11 @@ contract Events { string[] connectors, bytes[] datas ); - event LogSpellFactory(string[] eventNames, bytes[] eventParams); + event LogCastAny( + string indexed connector, + string connectorName, + string[] connectors, + string eventName, + bytes eventParam + ); } diff --git a/contracts/avalanche/connectors/dsa-spell/main.sol b/contracts/avalanche/connectors/dsa-spell/main.sol index bccc11d2..32da1e8b 100644 --- a/contracts/avalanche/connectors/dsa-spell/main.sol +++ b/contracts/avalanche/connectors/dsa-spell/main.sol @@ -7,17 +7,17 @@ pragma experimental ABIEncoderV2; * @dev Cast spells on DSA. */ -// import files import { AccountInterface } from "../../common/interfaces.sol"; import { Stores } from "../../common/stores.sol"; import { Events } from "./events.sol"; abstract contract DSASpellsResolver is Events, Stores { /** - *@dev Cast spells on DSA. + *@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. - *@param datas Array of connector calldatas. + *@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, @@ -37,11 +37,13 @@ abstract contract DSASpellsResolver is Events, Stores { } /** - *@dev Perform spells. - *@param connectors Array of connector names. - *@param datas Array of connector calldatas. + *@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 spellFactory(string[] memory connectors, bytes[] memory datas) + function castAny(string[] memory connectors, bytes[] memory datas) external payable returns (string memory eventName, bytes memory eventParam) @@ -54,23 +56,34 @@ abstract contract DSASpellsResolver is Events, Stores { .isConnectors(connectors); require(isOk, "connector-names-invalid"); - string[] memory _eventNames = new string[](_length); - bytes[] memory _eventParams = new bytes[](_length); + string memory _connectorName; + string memory _eventName; + bytes memory _eventParam; + bytes memory returnData; + bool success; for (uint256 i = 0; i < _length; i++) { - (bool success, bytes memory returnData) = _connectors[i] - .delegatecall(datas[i]); + (success, returnData) = _connectors[i].delegatecall(datas[i]); if (success) { - (_eventNames[i], _eventParams[i]) = abi.decode( + _connectorName = connectors[i]; + (_eventName, _eventParam) = abi.decode( returnData, (string, bytes) ); + break; } } + require(success, "dsa-spells-failed"); - eventName = "LogSpellFactory(string[],bytes[])"; - eventParam = abi.encode(_eventNames, _eventParams); + eventName = "LogCastAny(string,string,string[],string,bytes)"; + eventParam = abi.encode( + _connectorName, + _connectorName, + connectors, + _eventName, + _eventParam + ); } } diff --git a/contracts/fantom/connectors/dsa-spell/events.sol b/contracts/fantom/connectors/dsa-spell/events.sol index b3e455d6..a48b295a 100644 --- a/contracts/fantom/connectors/dsa-spell/events.sol +++ b/contracts/fantom/connectors/dsa-spell/events.sol @@ -8,5 +8,11 @@ contract Events { string[] connectors, bytes[] datas ); - event LogSpellFactory(string[] eventNames, bytes[] eventParams); + event LogCastAny( + string indexed connector, + string connectorName, + string[] connectors, + string eventName, + bytes eventParam + ); } diff --git a/contracts/fantom/connectors/dsa-spell/main.sol b/contracts/fantom/connectors/dsa-spell/main.sol index 62bdb130..d467ab14 100644 --- a/contracts/fantom/connectors/dsa-spell/main.sol +++ b/contracts/fantom/connectors/dsa-spell/main.sol @@ -7,17 +7,17 @@ pragma experimental ABIEncoderV2; * @dev Cast spells on DSA. */ -// import files import { AccountInterface } from "../../common/interfaces.sol"; import { Stores } from "../../common/stores.sol"; import { Events } from "./events.sol"; abstract contract DSASpellsResolver is Events, Stores { /** - *@dev Cast spells on DSA. + *@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. - *@param datas Array of connector calldatas. + *@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, @@ -37,11 +37,13 @@ abstract contract DSASpellsResolver is Events, Stores { } /** - *@dev Perform spells. - *@param connectors Array of connector names. - *@param datas Array of connector calldatas. + *@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 spellFactory(string[] memory connectors, bytes[] memory datas) + function castAny(string[] memory connectors, bytes[] memory datas) external payable returns (string memory eventName, bytes memory eventParam) @@ -54,23 +56,34 @@ abstract contract DSASpellsResolver is Events, Stores { .isConnectors(connectors); require(isOk, "connector-names-invalid"); - string[] memory _eventNames = new string[](_length); - bytes[] memory _eventParams = new bytes[](_length); + string memory _connectorName; + string memory _eventName; + bytes memory _eventParam; + bytes memory returnData; + bool success; for (uint256 i = 0; i < _length; i++) { - (bool success, bytes memory returnData) = _connectors[i] - .delegatecall(datas[i]); + (success, returnData) = _connectors[i].delegatecall(datas[i]); if (success) { - (_eventNames[i], _eventParams[i]) = abi.decode( + _connectorName = connectors[i]; + (_eventName, _eventParam) = abi.decode( returnData, (string, bytes) ); + break; } } + require(success, "dsa-spells-failed"); - eventName = "LogSpellFactory(string[],bytes[])"; - eventParam = abi.encode(_eventNames, _eventParams); + eventName = "LogCastAny(string,string,string[],string,bytes)"; + eventParam = abi.encode( + _connectorName, + _connectorName, + connectors, + _eventName, + _eventParam + ); } } diff --git a/contracts/mainnet/connectors/dsa-spell/events.sol b/contracts/mainnet/connectors/dsa-spell/events.sol index b3e455d6..a48b295a 100644 --- a/contracts/mainnet/connectors/dsa-spell/events.sol +++ b/contracts/mainnet/connectors/dsa-spell/events.sol @@ -8,5 +8,11 @@ contract Events { string[] connectors, bytes[] datas ); - event LogSpellFactory(string[] eventNames, bytes[] eventParams); + event LogCastAny( + string indexed connector, + string connectorName, + string[] connectors, + string eventName, + bytes eventParam + ); } diff --git a/contracts/mainnet/connectors/dsa-spell/main.sol b/contracts/mainnet/connectors/dsa-spell/main.sol index 34458953..7b255b17 100644 --- a/contracts/mainnet/connectors/dsa-spell/main.sol +++ b/contracts/mainnet/connectors/dsa-spell/main.sol @@ -7,17 +7,17 @@ pragma experimental ABIEncoderV2; * @dev Cast spells on DSA. */ -// import files import { AccountInterface } from "../../common/interfaces.sol"; import { Stores } from "../../common/stores.sol"; import { Events } from "./events.sol"; abstract contract DSASpellsResolver is Events, Stores { /** - *@dev Cast spells on DSA. + *@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. - *@param datas Array of connector calldatas. + *@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, @@ -37,11 +37,13 @@ abstract contract DSASpellsResolver is Events, Stores { } /** - *@dev Perform spells. - *@param connectors Array of connector names. - *@param datas Array of connector calldatas. + *@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 spellFactory(string[] memory connectors, bytes[] memory datas) + function castAny(string[] memory connectors, bytes[] memory datas) external payable returns (string memory eventName, bytes memory eventParam) @@ -54,23 +56,34 @@ abstract contract DSASpellsResolver is Events, Stores { .isConnectors(connectors); require(isOk, "connector-names-invalid"); - string[] memory _eventNames = new string[](_length); - bytes[] memory _eventParams = new bytes[](_length); + string memory _connectorName; + string memory _eventName; + bytes memory _eventParam; + bytes memory returnData; + bool success; for (uint256 i = 0; i < _length; i++) { - (bool success, bytes memory returnData) = _connectors[i] - .delegatecall(datas[i]); + (success, returnData) = _connectors[i].delegatecall(datas[i]); if (success) { - (_eventNames[i], _eventParams[i]) = abi.decode( + _connectorName = connectors[i]; + (_eventName, _eventParam) = abi.decode( returnData, (string, bytes) ); + break; } } + require(success, "dsa-spells-failed"); - eventName = "LogSpellFactory(string[],bytes[])"; - eventParam = abi.encode(_eventNames, _eventParams); + eventName = "LogCastAny(string,string,string[],string,bytes)"; + eventParam = abi.encode( + _connectorName, + _connectorName, + connectors, + _eventName, + _eventParam + ); } } diff --git a/contracts/optimism/connectors/dsa-spell/events.sol b/contracts/optimism/connectors/dsa-spell/events.sol index b3e455d6..a48b295a 100644 --- a/contracts/optimism/connectors/dsa-spell/events.sol +++ b/contracts/optimism/connectors/dsa-spell/events.sol @@ -8,5 +8,11 @@ contract Events { string[] connectors, bytes[] datas ); - event LogSpellFactory(string[] eventNames, bytes[] eventParams); + event LogCastAny( + string indexed connector, + string connectorName, + string[] connectors, + string eventName, + bytes eventParam + ); } diff --git a/contracts/optimism/connectors/dsa-spell/main.sol b/contracts/optimism/connectors/dsa-spell/main.sol index c98c97d4..cf1e4941 100644 --- a/contracts/optimism/connectors/dsa-spell/main.sol +++ b/contracts/optimism/connectors/dsa-spell/main.sol @@ -7,17 +7,17 @@ pragma experimental ABIEncoderV2; * @dev Cast spells on DSA. */ -// import files import { AccountInterface } from "../../common/interfaces.sol"; import { Stores } from "../../common/stores.sol"; import { Events } from "./events.sol"; abstract contract DSASpellsResolver is Events, Stores { /** - *@dev Cast spells on DSA. + *@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. - *@param datas Array of connector calldatas. + *@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, @@ -37,11 +37,13 @@ abstract contract DSASpellsResolver is Events, Stores { } /** - *@dev Perform spells. - *@param connectors Array of connector names. - *@param datas Array of connector calldatas. + *@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 spellFactory(string[] memory connectors, bytes[] memory datas) + function castAny(string[] memory connectors, bytes[] memory datas) external payable returns (string memory eventName, bytes memory eventParam) @@ -54,23 +56,34 @@ abstract contract DSASpellsResolver is Events, Stores { .isConnectors(connectors); require(isOk, "connector-names-invalid"); - string[] memory _eventNames = new string[](_length); - bytes[] memory _eventParams = new bytes[](_length); + string memory _connectorName; + string memory _eventName; + bytes memory _eventParam; + bytes memory returnData; + bool success; for (uint256 i = 0; i < _length; i++) { - (bool success, bytes memory returnData) = _connectors[i] - .delegatecall(datas[i]); + (success, returnData) = _connectors[i].delegatecall(datas[i]); if (success) { - (_eventNames[i], _eventParams[i]) = abi.decode( + _connectorName = connectors[i]; + (_eventName, _eventParam) = abi.decode( returnData, (string, bytes) ); + break; } } + require(success, "dsa-spells-failed"); - eventName = "LogSpellFactory(string[],bytes[])"; - eventParam = abi.encode(_eventNames, _eventParams); + eventName = "LogCastAny(string,string,string[],string,bytes)"; + eventParam = abi.encode( + _connectorName, + _connectorName, + connectors, + _eventName, + _eventParam + ); } } diff --git a/contracts/polygon/connectors/dsa-spell/events.sol b/contracts/polygon/connectors/dsa-spell/events.sol index b3e455d6..a48b295a 100644 --- a/contracts/polygon/connectors/dsa-spell/events.sol +++ b/contracts/polygon/connectors/dsa-spell/events.sol @@ -8,5 +8,11 @@ contract Events { string[] connectors, bytes[] datas ); - event LogSpellFactory(string[] eventNames, bytes[] eventParams); + event LogCastAny( + string indexed connector, + string connectorName, + string[] connectors, + string eventName, + bytes eventParam + ); } diff --git a/contracts/polygon/connectors/dsa-spell/main.sol b/contracts/polygon/connectors/dsa-spell/main.sol index 023a7ee7..b8f896a4 100644 --- a/contracts/polygon/connectors/dsa-spell/main.sol +++ b/contracts/polygon/connectors/dsa-spell/main.sol @@ -7,17 +7,17 @@ pragma experimental ABIEncoderV2; * @dev Cast spells on DSA. */ -// import files import { AccountInterface } from "../../common/interfaces.sol"; import { Stores } from "../../common/stores.sol"; import { Events } from "./events.sol"; abstract contract DSASpellsResolver is Events, Stores { /** - *@dev Cast spells on DSA. + *@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. - *@param datas Array of connector calldatas. + *@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, @@ -37,11 +37,13 @@ abstract contract DSASpellsResolver is Events, Stores { } /** - *@dev Perform spells. - *@param connectors Array of connector names. - *@param datas Array of connector calldatas. + *@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 spellFactory(string[] memory connectors, bytes[] memory datas) + function castAny(string[] memory connectors, bytes[] memory datas) external payable returns (string memory eventName, bytes memory eventParam) @@ -54,23 +56,34 @@ abstract contract DSASpellsResolver is Events, Stores { .isConnectors(connectors); require(isOk, "connector-names-invalid"); - string[] memory _eventNames = new string[](_length); - bytes[] memory _eventParams = new bytes[](_length); + string memory _connectorName; + string memory _eventName; + bytes memory _eventParam; + bytes memory returnData; + bool success; for (uint256 i = 0; i < _length; i++) { - (bool success, bytes memory returnData) = _connectors[i] - .delegatecall(datas[i]); + (success, returnData) = _connectors[i].delegatecall(datas[i]); if (success) { - (_eventNames[i], _eventParams[i]) = abi.decode( + _connectorName = connectors[i]; + (_eventName, _eventParam) = abi.decode( returnData, (string, bytes) ); + break; } } + require(success, "dsa-spells-failed"); - eventName = "LogSpellFactory(string[],bytes[])"; - eventParam = abi.encode(_eventNames, _eventParams); + eventName = "LogCastAny(string,string,string[],string,bytes)"; + eventParam = abi.encode( + _connectorName, + _connectorName, + connectors, + _eventName, + _eventParam + ); } } From 67635feb267efc5ceb0bf9fda498ebe89e20aaac Mon Sep 17 00:00:00 2001 From: Richa-iitr Date: Mon, 20 Jun 2022 19:40:49 +0530 Subject: [PATCH 13/14] updated tests --- test/arbitrum/dsa-spell/dsa-spell.test.ts | 39 +++++++++++++--------- test/avalanche/dsa-spell/dsa-spell.test.ts | 35 +++++++++++-------- test/fantom/dsa-spell/dsa-spell.test.ts | 37 +++++++++++--------- test/mainnet/dsa-spell/dsa-spell.test.ts | 31 +++++++++++------ test/optimism/dsa-spell/dsa-spell.test.ts | 37 +++++++++++--------- test/polygon/dsa-spell/dsa-spell.test.ts | 35 +++++++++++-------- 6 files changed, 129 insertions(+), 85 deletions(-) diff --git a/test/arbitrum/dsa-spell/dsa-spell.test.ts b/test/arbitrum/dsa-spell/dsa-spell.test.ts index 399e17a3..6ae968c5 100644 --- a/test/arbitrum/dsa-spell/dsa-spell.test.ts +++ b/test/arbitrum/dsa-spell/dsa-spell.test.ts @@ -9,7 +9,8 @@ import { getMasterSigner } from "../../../scripts/tests/getMasterSigner"; import { addresses } from "../../../scripts/tests/arbitrum/addresses"; import { abis } from "../../../scripts/constant/abis"; import { ConnectV2DSASpellArbitrum__factory } from "../../../typechain"; -import type { Signer, Contract } from "ethers"; +import { Signer, Contract } from "ethers"; +import { BigNumber } from "bignumber.js"; describe("DSA Spell", function () { const connectorName = "dsa-spell-test"; @@ -87,6 +88,8 @@ describe("DSA Spell", function () { let ETH = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"; let USDC = "0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8"; let usdc = new ethers.Contract(USDC, abis.basic.erc20); + let aETH = "0xe50fA9b3c56FfB159cB0FCA61F5c9D750e8128c8"; + let aEth = new ethers.Contract(aETH, abis.basic.aToken); var abi = [ "function withdraw(address,uint256,address,uint256,uint256)", "function deposit(address,uint256,uint256,uint256)", @@ -128,12 +131,16 @@ describe("DSA Spell", function () { }); it("should check balances after cast on DSA", async function () { - expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.lte(ethers.utils.parseEther("0")); - expect(await usdc.connect(wallet0).balanceOf(dsaWallet1.address)).to.be.gte(ethers.utils.parseUnits("1", 6)); - expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.gte(ethers.utils.parseEther("12")); + expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.lte(0); + expect(await usdc.connect(wallet0).balanceOf(dsaWallet1.address)).to.be.gte( + new BigNumber(1).multipliedBy(1e6).toString() + ); + expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.gte( + new BigNumber(12).multipliedBy(1e18).toString() + ); }); - it("should retry spells", async function () { + it("should cast spell on the first successful", async function () { async function getArg(connectors: any, spells: any, params: any) { let datas = []; for (let i = 0; i < connectors.length; i++) { @@ -142,32 +149,32 @@ describe("DSA Spell", function () { return [connectors, datas]; } - let connectors = ["BASIC-A", "BASIC-A", "AAVE-V3-A", "AAVE-V3-A"]; - let methods = ["deposit", "withdraw", "deposit", "borrow"]; + let connectors = ["AAVE-V3-A"]; + let methods = ["deposit"]; let params = [ - [ETH, ethers.utils.parseEther("1"), 0, 0], - [ETH, ethers.utils.parseEther("2"), dsaWallet1.address, 0, 0], - [ETH, ethers.utils.parseEther("10"), 0, 0], - [USDC, ethers.utils.parseUnits("3", 6), 2, 0, 0] + [ETH, ethers.utils.parseEther("10"), 0, 0] ]; let arg = await getArg(connectors, methods, params); const spells = [ { connector: connectorName, - method: "spellFactory", + method: "castAny", args: arg } ]; const tx = await dsaWallet0 .connect(wallet0) - .cast(...encodeSpells(spells), await wallet0.getAddress(), { value: ethers.utils.parseEther("1") }); + .cast(...encodeSpells(spells), await wallet0.getAddress()); const receipt = await tx.wait(); }); it("should check balances after spells on DSA", async function () { - expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.lte(ethers.utils.parseEther("1")); - expect(await usdc.connect(wallet0).balanceOf(dsaWallet0.address)).to.be.gte(ethers.utils.parseUnits("3", 6)); - expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.gte(ethers.utils.parseEther("2")); + expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.lte( + new BigNumber(2).multipliedBy(1e18).toString() + ); + expect(await aEth.connect(wallet0).balanceOf(dsaWallet0.address)).to.be.gte( + new BigNumber(10).multipliedBy(1e18).toString() + ); }); }); }); diff --git a/test/avalanche/dsa-spell/dsa-spell.test.ts b/test/avalanche/dsa-spell/dsa-spell.test.ts index 48d45fdd..e5430cd2 100644 --- a/test/avalanche/dsa-spell/dsa-spell.test.ts +++ b/test/avalanche/dsa-spell/dsa-spell.test.ts @@ -92,6 +92,8 @@ describe("DSA Spell", function () { let AVAX = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"; let USDC = "0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E"; let usdc = new ethers.Contract(USDC, abis.basic.erc20); + let aAVAX = "0x6d80113e533a2C0fe82EaBD35f1875DcEA89Ea97"; + let aAvax = new ethers.Contract(aAVAX, abis.basic.aToken); var abi = [ "function withdraw(address,uint256,address,uint256,uint256)", "function deposit(address,uint256,uint256,uint256)", @@ -133,12 +135,16 @@ describe("DSA Spell", function () { }); it("should check balances after cast on DSA", async function () { - expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.lte(ethers.utils.parseEther("0")); - expect(await usdc.connect(wallet0).balanceOf(dsaWallet1.address)).to.be.gte(ethers.utils.parseUnits("1", 6)); - expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.gte(ethers.utils.parseEther("12")); + expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.lte(0); + expect(await usdc.connect(wallet0).balanceOf(dsaWallet1.address)).to.be.gte( + new BigNumber(1).multipliedBy(1e6).toString() + ); + expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.gte( + new BigNumber(12).multipliedBy(1e18).toString() + ); }); - it("should retry spells", async function () { + it("should cast spell on the first successful", async function () { async function getArg(connectors: any, spells: any, params: any) { let datas = []; for (let i = 0; i < connectors.length; i++) { @@ -147,32 +153,33 @@ describe("DSA Spell", function () { return [connectors, datas]; } - let connectors = ["BASIC-A", "BASIC-A", "AAVE-V3-A", "AAVE-V3-A"]; - let methods = ["deposit", "withdraw", "deposit", "borrow"]; + let connectors = ["AAVE-V3-A", "AAVE-V2-A"]; + let methods = ["deposit","deposit"]; let params = [ - [AVAX, ethers.utils.parseEther("1"), 0, 0], - [AVAX, ethers.utils.parseEther("2"), dsaWallet1.address, 0, 0], [AVAX, ethers.utils.parseEther("10"), 0, 0], - [USDC, ethers.utils.parseUnits("3", 6), 2, 0, 0] + [AVAX, ethers.utils.parseEther("10"), 0, 0] ]; let arg = await getArg(connectors, methods, params); const spells = [ { connector: connectorName, - method: "spellFactory", + method: "castAny", args: arg } ]; const tx = await dsaWallet0 .connect(wallet0) - .cast(...encodeSpells(spells), await wallet0.getAddress(), { value: ethers.utils.parseEther("1") }); + .cast(...encodeSpells(spells), await wallet0.getAddress()); const receipt = await tx.wait(); }); it("should check balances after spells on DSA", async function () { - expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.lte(ethers.utils.parseEther("1")); - expect(await usdc.connect(wallet0).balanceOf(dsaWallet0.address)).to.be.gte(ethers.utils.parseUnits("3", 6)); - expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.gte(ethers.utils.parseEther("2")); + expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.lte( + new BigNumber(2).multipliedBy(1e18).toString() + ); + expect(await aAvax.connect(wallet0).balanceOf(dsaWallet0.address)).to.be.gte( + new BigNumber(10).multipliedBy(1e18).toString() + ); }); }); }); diff --git a/test/fantom/dsa-spell/dsa-spell.test.ts b/test/fantom/dsa-spell/dsa-spell.test.ts index e58c3367..5a1f0c88 100644 --- a/test/fantom/dsa-spell/dsa-spell.test.ts +++ b/test/fantom/dsa-spell/dsa-spell.test.ts @@ -10,6 +10,7 @@ import { addresses } from "../../../scripts/tests/fantom/addresses"; import { abis } from "../../../scripts/constant/abis"; import { ConnectV2DSASpellFantom__factory } from "../../../typechain"; import type { Signer, Contract } from "ethers"; +import BigNumber from "bignumber.js"; describe("DSA Spell", function () { const connectorName = "dsa-spell-test"; @@ -87,8 +88,10 @@ describe("DSA Spell", function () { describe("Main", function () { let FTM = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"; + let aFTM = "0x6d80113e533a2C0fe82EaBD35f1875DcEA89Ea97"; let USDC = "0x04068DA6C83AFCFA0e13ba15A6696662335D5B75"; let usdc = new ethers.Contract(USDC, abis.basic.erc20); + let aFtm = new ethers.Contract(aFTM, abis.basic.aToken); var abi = [ "function withdraw(address,uint256,address,uint256,uint256)", "function deposit(address,uint256,uint256,uint256)", @@ -130,12 +133,16 @@ describe("DSA Spell", function () { }); it("should check balances after cast on DSA", async function () { - expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.lte(ethers.utils.parseEther("0")); - expect(await usdc.connect(wallet0).balanceOf(dsaWallet1.address)).to.be.gte(ethers.utils.parseUnits("1", 5)); - expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.gte(ethers.utils.parseEther("12")); + expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.lte(0); + expect(await usdc.connect(wallet0).balanceOf(dsaWallet1.address)).to.be.gte( + new BigNumber(1).multipliedBy(1e5).toString() + ); + expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.gte( + new BigNumber(12).multipliedBy(1e18).toString() + ); }); - it("should retry spells", async function () { + it("should cast spell on the first successful", async function () { async function getArg(connectors: any, spells: any, params: any) { let datas = []; for (let i = 0; i < connectors.length; i++) { @@ -144,32 +151,32 @@ describe("DSA Spell", function () { return [connectors, datas]; } - let connectors = ["BASIC-A", "BASIC-A", "AAVE-V3-A", "AAVE-V3-A"]; - let methods = ["deposit", "withdraw", "deposit", "borrow"]; + let connectors = ["AAVE-V3-A"]; + let methods = ["deposit"]; let params = [ - [FTM, ethers.utils.parseEther("1"), 0, 0], - [FTM, ethers.utils.parseEther("2"), dsaWallet1.address, 0, 0], - [FTM, ethers.utils.parseEther("10"), 0, 0], - [USDC, ethers.utils.parseUnits("1", 5), 2, 0, 0] + [FTM, ethers.utils.parseEther("10"), 0, 0] ]; let arg = await getArg(connectors, methods, params); const spells = [ { connector: connectorName, - method: "spellFactory", + method: "castAny", args: arg } ]; const tx = await dsaWallet0 .connect(wallet0) - .cast(...encodeSpells(spells), await wallet0.getAddress(), { value: ethers.utils.parseEther("1") }); + .cast(...encodeSpells(spells), await wallet0.getAddress()); const receipt = await tx.wait(); }); it("should check balances after spells on DSA", async function () { - expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.lte(ethers.utils.parseEther("1")); - expect(await usdc.connect(wallet0).balanceOf(dsaWallet0.address)).to.be.gte(ethers.utils.parseUnits("1", 5)); - expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.gte(ethers.utils.parseEther("2")); + expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.lte( + new BigNumber(2).multipliedBy(1e18).toString() + ); + expect(await aFtm.connect(wallet0).balanceOf(dsaWallet0.address)).to.be.gte( + new BigNumber(10).multipliedBy(1e18).toString() + ); }); }); }); diff --git a/test/mainnet/dsa-spell/dsa-spell.test.ts b/test/mainnet/dsa-spell/dsa-spell.test.ts index be805d95..a717ec39 100644 --- a/test/mainnet/dsa-spell/dsa-spell.test.ts +++ b/test/mainnet/dsa-spell/dsa-spell.test.ts @@ -10,6 +10,7 @@ import { addresses } from "../../../scripts/tests/mainnet/addresses"; import { abis } from "../../../scripts/constant/abis"; import { ConnectV2DSASpell__factory } from "../../../typechain"; import type { Signer, Contract } from "ethers"; +import BigNumber from "bignumber.js"; describe("DSA Spell", function () { const connectorName = "dsa-spell-test"; @@ -87,6 +88,8 @@ describe("DSA Spell", function () { let ETH = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"; let USDC = "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"; let usdc = new ethers.Contract(USDC, abis.basic.erc20); + let aETH = "0x030bA81f1c18d280636F32af80b9AAd02Cf0854e"; + let aEth = new ethers.Contract(aETH, abis.basic.aToken); var abi = [ "function withdraw(address,uint256,address,uint256,uint256)", "function deposit(address,uint256,uint256,uint256)", @@ -126,11 +129,13 @@ describe("DSA Spell", function () { }); it("should check balances after cast on DSA", async function () { - expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.lte(ethers.utils.parseEther("8")); - expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.gte(ethers.utils.parseEther("12")); + expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.lte(new BigNumber(8).multipliedBy(1e18).toString()); + expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.gte( + new BigNumber(12).multipliedBy(1e18).toString() + ); }); - it("should retry spells", async function () { + it("should cast spell on the first successful", async function () { async function getArg(connectors: any, spells: any, params: any) { let datas = []; for (let i = 0; i < connectors.length; i++) { @@ -139,29 +144,33 @@ describe("DSA Spell", function () { return [connectors, datas]; } - let connectors = ["BASIC-A", "BASIC-A"]; - let methods = ["deposit", "withdraw"]; + let connectors = ["AAVE-V2-A", "AAVE-V1-A"]; + let methods = ["deposit", "deposit"]; let params = [ - [ETH, ethers.utils.parseEther("1"), 0, 0], - [ETH, ethers.utils.parseEther("2"), dsaWallet1.address, 0, 0] + [ETH, ethers.utils.parseEther("10"), 0, 0], + [ETH, ethers.utils.parseEther("10"), 0, 0] ]; let arg = await getArg(connectors, methods, params); const spells = [ { connector: connectorName, - method: "spellFactory", + method: "castAny", args: arg } ]; const tx = await dsaWallet0 .connect(wallet0) - .cast(...encodeSpells(spells), await wallet0.getAddress(), { value: ethers.utils.parseEther("1") }); + .cast(...encodeSpells(spells), await wallet0.getAddress()); const receipt = await tx.wait(); }); it("should check balances after spells on DSA", async function () { - expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.lte(ethers.utils.parseEther("13")); - expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.gte(ethers.utils.parseEther("10")); + expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.lte( + new BigNumber(2).multipliedBy(1e18).toString() + ); + expect(await aEth.connect(wallet0).balanceOf(dsaWallet0.address)).to.be.gte( + new BigNumber(10).multipliedBy(1e18).toString() + ); }); }); }); diff --git a/test/optimism/dsa-spell/dsa-spell.test.ts b/test/optimism/dsa-spell/dsa-spell.test.ts index b4a12e69..af9fa8b0 100644 --- a/test/optimism/dsa-spell/dsa-spell.test.ts +++ b/test/optimism/dsa-spell/dsa-spell.test.ts @@ -10,6 +10,7 @@ import { addresses } from "../../../scripts/tests/optimism/addresses"; import { abis } from "../../../scripts/constant/abis"; import { ConnectV2DSASpellOptimism__factory } from "../../../typechain"; import type { Signer, Contract } from "ethers"; +import BigNumber from "bignumber.js"; describe("DSA Spell", function () { const connectorName = "dsa-spell-test"; @@ -87,6 +88,8 @@ describe("DSA Spell", function () { let ETH = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"; let USDC = "0x7F5c764cBc14f9669B88837ca1490cCa17c31607"; let usdc = new ethers.Contract(USDC, abis.basic.erc20); + let aETH = "0xe50fA9b3c56FfB159cB0FCA61F5c9D750e8128c8"; + let aEth = new ethers.Contract(aETH, abis.basic.aToken); var abi = [ "function withdraw(address,uint256,address,uint256,uint256)", "function deposit(address,uint256,uint256,uint256)", @@ -128,12 +131,16 @@ describe("DSA Spell", function () { }); it("should check balances after cast on DSA", async function () { - expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.lte(ethers.utils.parseEther("0")); - expect(await usdc.connect(wallet0).balanceOf(dsaWallet1.address)).to.be.gte(ethers.utils.parseUnits("1", 6)); - expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.gte(ethers.utils.parseEther("12")); + expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.lte(0); + expect(await usdc.connect(wallet0).balanceOf(dsaWallet1.address)).to.be.gte( + new BigNumber(1).multipliedBy(1e6).toString() + ); + expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.gte( + new BigNumber(12).multipliedBy(1e18).toString() + ); }); - it("should retry spells", async function () { + it("should cast spell on the first successful", async function () { async function getArg(connectors: any, spells: any, params: any) { let datas = []; for (let i = 0; i < connectors.length; i++) { @@ -142,32 +149,32 @@ describe("DSA Spell", function () { return [connectors, datas]; } - let connectors = ["BASIC-A", "BASIC-A", "AAVE-V3-A", "AAVE-V3-A"]; - let methods = ["deposit", "withdraw", "deposit", "borrow"]; + let connectors = ["AAVE-V3-A"]; + let methods = ["deposit"]; let params = [ - [ETH, ethers.utils.parseEther("1"), 0, 0], - [ETH, ethers.utils.parseEther("2"), dsaWallet1.address, 0, 0], - [ETH, ethers.utils.parseEther("10"), 0, 0], - [USDC, ethers.utils.parseUnits("3", 6), 2, 0, 0] + [ETH, ethers.utils.parseEther("10"), 0, 0] ]; let arg = await getArg(connectors, methods, params); const spells = [ { connector: connectorName, - method: "spellFactory", + method: "castAny", args: arg } ]; const tx = await dsaWallet0 .connect(wallet0) - .cast(...encodeSpells(spells), await wallet0.getAddress(), { value: ethers.utils.parseEther("1") }); + .cast(...encodeSpells(spells), await wallet0.getAddress()); const receipt = await tx.wait(); }); it("should check balances after spells on DSA", async function () { - expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.lte(ethers.utils.parseEther("1")); - expect(await usdc.connect(wallet0).balanceOf(dsaWallet0.address)).to.be.gte(ethers.utils.parseUnits("3", 6)); - expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.gte(ethers.utils.parseEther("2")); + expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.lte( + new BigNumber(2).multipliedBy(1e18).toString() + ); + expect(await aEth.connect(wallet0).balanceOf(dsaWallet0.address)).to.be.gte( + new BigNumber(10).multipliedBy(1e18).toString() + ); }); }); }); diff --git a/test/polygon/dsa-spell/dsa-spell.test.ts b/test/polygon/dsa-spell/dsa-spell.test.ts index c06d44d9..11be803c 100644 --- a/test/polygon/dsa-spell/dsa-spell.test.ts +++ b/test/polygon/dsa-spell/dsa-spell.test.ts @@ -91,7 +91,9 @@ describe("DSA Spell", function () { describe("Main", function () { let MATIC = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"; let USDC = "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174"; + let aMATIC = "0x6d80113e533a2C0fe82EaBD35f1875DcEA89Ea97"; let usdc = new ethers.Contract(USDC, abis.basic.erc20); + let aMatic = new ethers.Contract(aMATIC, abis.basic.aToken); var abi = [ "function withdraw(address,uint256,address,uint256,uint256)", "function deposit(address,uint256,uint256,uint256)", @@ -133,12 +135,16 @@ describe("DSA Spell", function () { }); it("should check balances after cast on DSA", async function () { - expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.lte(ethers.utils.parseEther("0")); - expect(await usdc.connect(wallet0).balanceOf(dsaWallet1.address)).to.be.gte(ethers.utils.parseUnits("1", 6)); - expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.gte(ethers.utils.parseEther("12")); + expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.lte(0); + expect(await usdc.connect(wallet0).balanceOf(dsaWallet1.address)).to.be.gte( + new BigNumber(1).multipliedBy(1e6).toString() + ); + expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.gte( + new BigNumber(12).multipliedBy(1e18).toString() + ); }); - it("should retry spells", async function () { + it("should cast spell on the first successful", async function () { async function getArg(connectors: any, spells: any, params: any) { let datas = []; for (let i = 0; i < connectors.length; i++) { @@ -147,32 +153,33 @@ describe("DSA Spell", function () { return [connectors, datas]; } - let connectors = ["BASIC-A", "BASIC-A", "AAVE-V3-A", "AAVE-V3-A"]; - let methods = ["deposit", "withdraw", "deposit", "borrow"]; + let connectors = ["AAVE-V3-A", "AAVE-V2-A"]; + let methods = ["deposit","deposit"]; let params = [ - [MATIC, ethers.utils.parseEther("1"), 0, 0], - [MATIC, ethers.utils.parseEther("2"), dsaWallet1.address, 0, 0], [MATIC, ethers.utils.parseEther("10"), 0, 0], - [USDC, ethers.utils.parseUnits("1", 6), 2, 0, 0] + [MATIC, ethers.utils.parseEther("10"), 0, 0] ]; let arg = await getArg(connectors, methods, params); const spells = [ { connector: connectorName, - method: "spellFactory", + method: "castAny", args: arg } ]; const tx = await dsaWallet0 .connect(wallet0) - .cast(...encodeSpells(spells), await wallet0.getAddress(), { value: ethers.utils.parseEther("1") }); + .cast(...encodeSpells(spells), await wallet0.getAddress()); const receipt = await tx.wait(); }); it("should check balances after spells on DSA", async function () { - expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.lte(ethers.utils.parseEther("1")); - expect(await usdc.connect(wallet0).balanceOf(dsaWallet0.address)).to.be.gte(ethers.utils.parseUnits("1", 6)); - expect(await ethers.provider.getBalance(dsaWallet1.address)).to.be.gte(ethers.utils.parseEther("2")); + expect(await ethers.provider.getBalance(dsaWallet0.address)).to.be.lte( + new BigNumber(2).multipliedBy(1e18).toString() + ); + expect(await aMatic.connect(wallet0).balanceOf(dsaWallet0.address)).to.be.gte( + new BigNumber(10).multipliedBy(1e18).toString() + ); }); }); }); From 27f3cc1b686d4eda8ca5ae8bbd09472debb602f8 Mon Sep 17 00:00:00 2001 From: Richa-iitr Date: Mon, 20 Jun 2022 22:26:33 +0530 Subject: [PATCH 14/14] minor change --- contracts/arbitrum/connectors/dsa-spell/events.sol | 3 +-- contracts/arbitrum/connectors/dsa-spell/main.sol | 5 ++--- contracts/avalanche/connectors/dsa-spell/events.sol | 3 +-- contracts/avalanche/connectors/dsa-spell/main.sol | 5 ++--- contracts/fantom/connectors/dsa-spell/events.sol | 3 +-- contracts/fantom/connectors/dsa-spell/main.sol | 5 ++--- contracts/mainnet/connectors/dsa-spell/events.sol | 3 +-- contracts/mainnet/connectors/dsa-spell/main.sol | 5 ++--- contracts/optimism/connectors/dsa-spell/events.sol | 3 +-- contracts/optimism/connectors/dsa-spell/main.sol | 5 ++--- contracts/polygon/connectors/dsa-spell/events.sol | 3 +-- contracts/polygon/connectors/dsa-spell/main.sol | 5 ++--- 12 files changed, 18 insertions(+), 30 deletions(-) diff --git a/contracts/arbitrum/connectors/dsa-spell/events.sol b/contracts/arbitrum/connectors/dsa-spell/events.sol index a48b295a..097aeec9 100644 --- a/contracts/arbitrum/connectors/dsa-spell/events.sol +++ b/contracts/arbitrum/connectors/dsa-spell/events.sol @@ -9,9 +9,8 @@ contract Events { bytes[] datas ); event LogCastAny( - string indexed connector, - string connectorName, string[] connectors, + string connectorName, string eventName, bytes eventParam ); diff --git a/contracts/arbitrum/connectors/dsa-spell/main.sol b/contracts/arbitrum/connectors/dsa-spell/main.sol index 89cb38dd..87c5a655 100644 --- a/contracts/arbitrum/connectors/dsa-spell/main.sol +++ b/contracts/arbitrum/connectors/dsa-spell/main.sol @@ -76,11 +76,10 @@ abstract contract DSASpellsResolver is Events, Stores { } require(success, "dsa-spells-failed"); - eventName = "LogCastAny(string,string,string[],string,bytes)"; + eventName = "LogCastAny(string[],string,string,bytes)"; eventParam = abi.encode( - _connectorName, - _connectorName, connectors, + _connectorName, _eventName, _eventParam ); diff --git a/contracts/avalanche/connectors/dsa-spell/events.sol b/contracts/avalanche/connectors/dsa-spell/events.sol index a48b295a..097aeec9 100644 --- a/contracts/avalanche/connectors/dsa-spell/events.sol +++ b/contracts/avalanche/connectors/dsa-spell/events.sol @@ -9,9 +9,8 @@ contract Events { bytes[] datas ); event LogCastAny( - string indexed connector, - string connectorName, string[] connectors, + string connectorName, string eventName, bytes eventParam ); diff --git a/contracts/avalanche/connectors/dsa-spell/main.sol b/contracts/avalanche/connectors/dsa-spell/main.sol index 32da1e8b..f2ca0f1c 100644 --- a/contracts/avalanche/connectors/dsa-spell/main.sol +++ b/contracts/avalanche/connectors/dsa-spell/main.sol @@ -76,11 +76,10 @@ abstract contract DSASpellsResolver is Events, Stores { } require(success, "dsa-spells-failed"); - eventName = "LogCastAny(string,string,string[],string,bytes)"; + eventName = "LogCastAny(string[],string,string,bytes)"; eventParam = abi.encode( - _connectorName, - _connectorName, connectors, + _connectorName, _eventName, _eventParam ); diff --git a/contracts/fantom/connectors/dsa-spell/events.sol b/contracts/fantom/connectors/dsa-spell/events.sol index a48b295a..097aeec9 100644 --- a/contracts/fantom/connectors/dsa-spell/events.sol +++ b/contracts/fantom/connectors/dsa-spell/events.sol @@ -9,9 +9,8 @@ contract Events { bytes[] datas ); event LogCastAny( - string indexed connector, - string connectorName, string[] connectors, + string connectorName, string eventName, bytes eventParam ); diff --git a/contracts/fantom/connectors/dsa-spell/main.sol b/contracts/fantom/connectors/dsa-spell/main.sol index d467ab14..78330f24 100644 --- a/contracts/fantom/connectors/dsa-spell/main.sol +++ b/contracts/fantom/connectors/dsa-spell/main.sol @@ -76,11 +76,10 @@ abstract contract DSASpellsResolver is Events, Stores { } require(success, "dsa-spells-failed"); - eventName = "LogCastAny(string,string,string[],string,bytes)"; + eventName = "LogCastAny(string[],string,string,bytes)"; eventParam = abi.encode( - _connectorName, - _connectorName, connectors, + _connectorName, _eventName, _eventParam ); diff --git a/contracts/mainnet/connectors/dsa-spell/events.sol b/contracts/mainnet/connectors/dsa-spell/events.sol index a48b295a..097aeec9 100644 --- a/contracts/mainnet/connectors/dsa-spell/events.sol +++ b/contracts/mainnet/connectors/dsa-spell/events.sol @@ -9,9 +9,8 @@ contract Events { bytes[] datas ); event LogCastAny( - string indexed connector, - string connectorName, string[] connectors, + string connectorName, string eventName, bytes eventParam ); diff --git a/contracts/mainnet/connectors/dsa-spell/main.sol b/contracts/mainnet/connectors/dsa-spell/main.sol index 7b255b17..a4f51143 100644 --- a/contracts/mainnet/connectors/dsa-spell/main.sol +++ b/contracts/mainnet/connectors/dsa-spell/main.sol @@ -76,11 +76,10 @@ abstract contract DSASpellsResolver is Events, Stores { } require(success, "dsa-spells-failed"); - eventName = "LogCastAny(string,string,string[],string,bytes)"; + eventName = "LogCastAny(string[],string,string,bytes)"; eventParam = abi.encode( - _connectorName, - _connectorName, connectors, + _connectorName, _eventName, _eventParam ); diff --git a/contracts/optimism/connectors/dsa-spell/events.sol b/contracts/optimism/connectors/dsa-spell/events.sol index a48b295a..097aeec9 100644 --- a/contracts/optimism/connectors/dsa-spell/events.sol +++ b/contracts/optimism/connectors/dsa-spell/events.sol @@ -9,9 +9,8 @@ contract Events { bytes[] datas ); event LogCastAny( - string indexed connector, - string connectorName, string[] connectors, + string connectorName, string eventName, bytes eventParam ); diff --git a/contracts/optimism/connectors/dsa-spell/main.sol b/contracts/optimism/connectors/dsa-spell/main.sol index cf1e4941..ccc6bc82 100644 --- a/contracts/optimism/connectors/dsa-spell/main.sol +++ b/contracts/optimism/connectors/dsa-spell/main.sol @@ -76,11 +76,10 @@ abstract contract DSASpellsResolver is Events, Stores { } require(success, "dsa-spells-failed"); - eventName = "LogCastAny(string,string,string[],string,bytes)"; + eventName = "LogCastAny(string[],string,string,bytes)"; eventParam = abi.encode( - _connectorName, - _connectorName, connectors, + _connectorName, _eventName, _eventParam ); diff --git a/contracts/polygon/connectors/dsa-spell/events.sol b/contracts/polygon/connectors/dsa-spell/events.sol index a48b295a..097aeec9 100644 --- a/contracts/polygon/connectors/dsa-spell/events.sol +++ b/contracts/polygon/connectors/dsa-spell/events.sol @@ -9,9 +9,8 @@ contract Events { bytes[] datas ); event LogCastAny( - string indexed connector, - string connectorName, string[] connectors, + string connectorName, string eventName, bytes eventParam ); diff --git a/contracts/polygon/connectors/dsa-spell/main.sol b/contracts/polygon/connectors/dsa-spell/main.sol index b8f896a4..26d9f316 100644 --- a/contracts/polygon/connectors/dsa-spell/main.sol +++ b/contracts/polygon/connectors/dsa-spell/main.sol @@ -76,11 +76,10 @@ abstract contract DSASpellsResolver is Events, Stores { } require(success, "dsa-spells-failed"); - eventName = "LogCastAny(string,string,string[],string,bytes)"; + eventName = "LogCastAny(string[],string,string,bytes)"; eventParam = abi.encode( - _connectorName, - _connectorName, connectors, + _connectorName, _eventName, _eventParam );