Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Neon deployment preparation #1313

Merged
merged 28 commits into from
Jul 18, 2024
Merged
Show file tree
Hide file tree
Changes from 18 commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
f0eef52
Merge pull request #1251 from airswap/develop
dmosites Jan 11, 2024
6c1cc86
Merge pull request #1260 from airswap/develop
dmosites Jan 15, 2024
a9d08e3
Merge pull request #1266 from airswap/develop
dmosites Jan 18, 2024
da9bbc7
Merge pull request #1268 from airswap/develop
dmosites Jan 19, 2024
58f612c
publish libraries 4.2.1-beta.0
dmosites Jan 20, 2024
d9d08fb
bump libraries beta version
dmosites Jan 25, 2024
f2869d7
Bump follow-redirects from 1.15.5 to 1.15.6 (#1302)
dependabot[bot] Mar 18, 2024
863586a
Batch registry call (#1295)
smartcontrart Mar 19, 2024
7a552bc
Bump express from 4.18.3 to 4.19.2 (#1303)
dependabot[bot] Apr 9, 2024
5b6ea7e
Bump undici from 5.28.3 to 5.28.4 (#1304)
dependabot[bot] Apr 9, 2024
eb5a595
Merge branch 'main' of github.com:airswap/airswap-protocols into develop
dmosites May 15, 2024
54cc4ab
Bump ejs from 3.1.9 to 3.1.10 (#1308)
dependabot[bot] May 16, 2024
da05cb9
Delegates (#1309)
smartcontrart May 27, 2024
96dc10c
Merge branch 'beta' into develop
smartcontrart May 31, 2024
ac0cd74
Merge branch 'main' of github.com:airswap/airswap-protocols into develop
dmosites Jun 14, 2024
8e7450d
@airswap/delegate: update utils version; update yarn.lock
dmosites Jun 14, 2024
5771382
Merge branch 'develop' of github.com:airswap/airswap-protocols into d…
smartcontrart Jun 17, 2024
fe02a30
Prepared neon and neondevnet deployment
smartcontrart Jun 18, 2024
80cb50d
Deployment to Neon Devnet
smartcontrart Jun 27, 2024
89e42d1
Deployed wrapper
smartcontrart Jun 27, 2024
ec84f7d
update utils deps to latest
dmosites Jul 5, 2024
ffd1f14
Merge branch 'main' of github.com:airswap/airswap-protocols into neon…
dmosites Jul 5, 2024
6bd2a64
update neonscan vars
dmosites Jul 5, 2024
311748f
update env.example
dmosites Jul 5, 2024
afeb69b
restore yarn.lock
dmosites Jul 5, 2024
c95e4f6
Removed Delegates
smartcontrart Jul 6, 2024
3fe2c3a
Deployed on Neon mainnet
smartcontrart Jul 16, 2024
77d849c
Verified contracts and transfered ownership on Neon
smartcontrart Jul 17, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions hardhat.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,14 @@ module.exports = {
url: apiUrls[ChainIds.HOLESKY],
accounts: process.env.PRIVATE_KEY ? [process.env.PRIVATE_KEY] : undefined,
},
neon: {
url: apiUrls[ChainIds.NEON],
accounts: process.env.PRIVATE_KEY ? [process.env.PRIVATE_KEY] : undefined,
},
neondevnet: {
url: apiUrls[ChainIds.NEONDEVNET],
accounts: process.env.PRIVATE_KEY ? [process.env.PRIVATE_KEY] : undefined,
},
},
solidity: {
compilers: [
Expand Down
31 changes: 26 additions & 5 deletions source/batch-call/contracts/BatchCall.sol
Original file line number Diff line number Diff line change
@@ -1,17 +1,16 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.23;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import { ERC20 } from "solady/src/tokens/ERC20.sol";
import "@openzeppelin/contracts/utils/Address.sol";
import "@airswap/swap/contracts/interfaces/ISwap.sol";
import "@airswap/swap-erc20/contracts/interfaces/ISwapERC20.sol";
import "@airswap/registry/contracts/interfaces/IRegistry.sol";

/**
* @title BatchCall: Batch balance, allowance, order validity checks, nonce usage check
*/
contract BatchCall {
using SafeERC20 for IERC20;
using Address for address;

error ArgumentInvalid();
Expand All @@ -28,7 +27,7 @@ contract BatchCall {
address tokenAddress
) public view returns (uint256) {
if (tokenAddress.isContract()) {
IERC20 token = IERC20(tokenAddress);
ERC20 token = ERC20(tokenAddress);
// Check if balanceOf succeeds.
(bool success, ) = address(token).staticcall(
abi.encodeWithSelector(token.balanceOf.selector, userAddress)
Expand Down Expand Up @@ -119,7 +118,7 @@ contract BatchCall {
address tokenAddress
) public view returns (uint256) {
if (tokenAddress.isContract()) {
IERC20 token = IERC20(tokenAddress);
ERC20 token = ERC20(tokenAddress);
// Check if allowance succeeds as a call else returns 0.
(bool success, ) = address(token).staticcall(
abi.encodeWithSelector(
Expand Down Expand Up @@ -290,4 +289,26 @@ contract BatchCall {
}
return nonceUsed;
}

/**
* @notice provides the tokens supported by multiple Stakers
* @param stakers address[] list of stakers to be checked
* @param registryContract IRegistry Registry contract to call
* @return bool[] true indicates the nonce is used
*/
function getTokensForStakers(
address[] calldata stakers,
IRegistry registryContract
) external view returns (address[][] memory) {
if (stakers.length == 0) revert ArgumentInvalid();
address[][] memory tokensSupported = new address[][](stakers.length);

for (uint256 i; i < stakers.length; ) {
tokensSupported[i] = registryContract.getTokensForStaker(stakers[i]);
unchecked {
++i;
}
}
return tokensSupported;
}
}
95 changes: 93 additions & 2 deletions source/batch-call/test/BatchCall.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ const { ethers, waffle } = require('hardhat')
const { deployMockContract } = waffle
const IERC20 = require('@openzeppelin/contracts/build/contracts/IERC20.json')
const IERC721 = require('@openzeppelin/contracts/build/contracts/ERC721Royalty.json')
const REGISTRY = require('@airswap/registry/build/contracts/Registry.sol/Registry.json')
const SWAP = require('@airswap/swap/build/contracts/Swap.sol/Swap.json')
const SWAP_ERC20 = require('@airswap/swap-erc20/build/contracts/SwapERC20.sol/SwapERC20.json')
const ERC20_ADAPTER = require('@airswap/swap/build/contracts/adapters/ERC20Adapter.sol/ERC20Adapter.json')
Expand All @@ -22,6 +23,8 @@ const DEFAULT_AMOUNT = '1000'
const DEFAULT_BALANCE = '100000'
const BONUS_SCALE = '10'
const BONUS_MAX = '100'
const STAKING_COST = '1000000000'
const SUPPORT_COST = '1000000'

let snapshotId
let deployer
Expand All @@ -31,6 +34,7 @@ let erc20token
let erc20adapter
let erc721token
let erc721adapter
let registry
let swap
let swapERC20
let batchCall
Expand Down Expand Up @@ -107,6 +111,15 @@ async function setUpAllowances(senderAmount, signerAmount) {
async function setUpBalances(senderAmount, signerAmount) {
await erc20token.mock.balanceOf.withArgs(sender.address).returns(senderAmount)
await erc20token.mock.balanceOf.withArgs(signer.address).returns(signerAmount)
await erc20token.mock.balanceOf
.withArgs(staker1.address)
.returns(STAKING_COST)
await erc20token.mock.balanceOf
.withArgs(staker2.address)
.returns(STAKING_COST)
await erc20token.mock.balanceOf
.withArgs(staker3.address)
.returns(STAKING_COST)
}

describe('BatchCall Integration', () => {
Expand All @@ -119,8 +132,17 @@ describe('BatchCall Integration', () => {
})

before('deploy adapter and swap', async () => {
;[deployer, sender, signer, affiliate, protocolFeeWallet, anyone] =
await ethers.getSigners()
;[
deployer,
sender,
signer,
affiliate,
protocolFeeWallet,
anyone,
staker1,
staker2,
staker3,
] = await ethers.getSigners()
erc20token = await deployMockContract(deployer, IERC20.abi)
await erc20token.mock.allowance.returns(DEFAULT_AMOUNT)
await erc20token.mock.balanceOf.returns(DEFAULT_AMOUNT)
Expand All @@ -143,6 +165,12 @@ describe('BatchCall Integration', () => {
)
).deploy()
await erc721adapter.deployed()

registry = await (
await ethers.getContractFactory(REGISTRY.abi, REGISTRY.bytecode)
).deploy(erc20token.address, STAKING_COST, SUPPORT_COST)
await registry.deployed()

swap = await (
await ethers.getContractFactory(SWAP.abi, SWAP.bytecode)
).deploy(
Expand Down Expand Up @@ -329,4 +357,67 @@ describe('BatchCall Integration', () => {
)
})
})

describe('returns tokensSupported for mutiple stakers', () => {
it('returns all tokens supported by multiple stakers', async () => {
const tokensSupported = []
for (let i = 0; i < 10; i++) {
tokensSupported[i] = await deployMockContract(deployer, IERC20.abi)
}
registry
.connect(staker1)
.addTokens([
tokensSupported[0].address,
tokensSupported[1].address,
tokensSupported[2].address,
])
registry
.connect(staker2)
.addTokens([
tokensSupported[3].address,
tokensSupported[4].address,
tokensSupported[5].address,
])
registry
.connect(staker3)
.addTokens([
tokensSupported[6].address,
tokensSupported[7].address,
tokensSupported[8].address,
tokensSupported[9].address,
])
const expectedTokensSupported = await batchCall
.connect(deployer)
.getTokensForStakers(
[staker1.address, staker2.address, staker3.address],
registry.address
)
expect(expectedTokensSupported.toString()).to.equal(
[
[
tokensSupported[0].address,
tokensSupported[1].address,
tokensSupported[2].address,
],
[
tokensSupported[3].address,
tokensSupported[4].address,
tokensSupported[5].address,
],
[
tokensSupported[6].address,
tokensSupported[7].address,
tokensSupported[8].address,
tokensSupported[9].address,
],
].toString()
)
})

it('reverts if a wrong argument is passed', async () => {
await expect(
batchCall.getTokensForStakers([], registry.address)
).to.be.revertedWith('ArgumentInvalid')
})
})
})
19 changes: 19 additions & 0 deletions source/delegate/LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
Copyright 2024 AirSwap

Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
37 changes: 37 additions & 0 deletions source/delegate/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# Delegate

[AirSwap](https://www.airswap.io/) is an open-source peer-to-peer trading network.

[![Discord](https://img.shields.io/discord/590643190281928738.svg)](https://discord.gg/ecQbV7H)
[![License](https://img.shields.io/badge/License-MIT-blue)](https://opensource.org/licenses/MIT)
![Twitter Follow](https://img.shields.io/twitter/follow/airswap?style=social)

## Resources

- About → https://about.airswap.io/
- Website → https://www.airswap.io/
- Twitter → https://twitter.com/airswap
- Chat → https://chat.airswap.io/

## Usage

:warning: This package may contain unaudited code. For all AirSwap contract deployments see [Deployed Contracts](https://about.airswap.io/technology/deployments).

## Commands

Environment variables are set in an `.env` file in the repository root.

| Command | Description |
| :-------------- | :--------------------------------------- |
| `yarn` | Install dependencies |
| `yarn clean` | Delete the contract `build` folder |
| `yarn compile` | Compile all contracts to `build` folder |
| `yarn coverage` | Report test coverage |
| `yarn test` | Run all tests in `test` folder |
| `yarn test:ci` | Run CI tests in `test` folder |
| `yarn deploy` | Deploy on a network using --network flag |
| `yarn verify` | Verify on a network using --network flag |

## Running Tests

:bulb: Prior to testing locally, run `yarn compile` in the `airswap-protocols` project root to build required artifacts.
Loading
Loading