diff --git a/contracts/interfaces/stCelo/IAccount.sol b/contracts/interfaces/stCelo/IAccount.sol new file mode 100644 index 0000000..e7f8ff0 --- /dev/null +++ b/contracts/interfaces/stCelo/IAccount.sol @@ -0,0 +1,5 @@ +pragma solidity 0.6.8; + +interface IAccount { + function getTotalCelo() external view returns (uint256); +} \ No newline at end of file diff --git a/contracts/interfaces/stCelo/IManager.sol b/contracts/interfaces/stCelo/IManager.sol new file mode 100644 index 0000000..2a78408 --- /dev/null +++ b/contracts/interfaces/stCelo/IManager.sol @@ -0,0 +1,8 @@ +pragma solidity 0.6.8; + +interface IManager { + function deposit() external payable; + + function toStakedCelo(uint256 celoAmount) external view returns (uint256); + function toCelo(uint256 stCeloAmount) external view returns (uint256); +} \ No newline at end of file diff --git a/contracts/interfaces/stCelo/IRebasedStakedCelo.sol b/contracts/interfaces/stCelo/IRebasedStakedCelo.sol new file mode 100644 index 0000000..5bd11e9 --- /dev/null +++ b/contracts/interfaces/stCelo/IRebasedStakedCelo.sol @@ -0,0 +1,9 @@ +pragma solidity 0.6.8; + +interface IRebasedStakedCelo { + function deposit(uint256 stCeloAmount) external; + function withdraw(uint256 stCeloAmount) external; + + function toStakedCelo(uint256 rstCeloAmount) external view returns (uint256); + function toRebasedStakedCelo(uint256 stCeloAmount) external view returns (uint256); +} \ No newline at end of file diff --git a/contracts/interfaces/stCelo/IStakedCelo.sol b/contracts/interfaces/stCelo/IStakedCelo.sol new file mode 100644 index 0000000..a6137e8 --- /dev/null +++ b/contracts/interfaces/stCelo/IStakedCelo.sol @@ -0,0 +1,5 @@ +pragma solidity 0.6.8; + +interface IStakedCelo { + function totalSupply() external view returns (uint256); +} \ No newline at end of file diff --git a/contracts/swappa/PairRStCelo.sol b/contracts/swappa/PairRStCelo.sol new file mode 100644 index 0000000..ab91990 --- /dev/null +++ b/contracts/swappa/PairRStCelo.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.6.8; + +import "@openzeppelin/contracts/math/SafeMath.sol"; +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "../interfaces/stCelo/IRebasedStakedCelo.sol"; +import "./ISwappaPairV1.sol"; + +contract PairRStCelo is ISwappaPairV1 { + using SafeMath for uint; + + function swap( + address input, + address output, + address to, + bytes calldata data + ) external override { + (address rebaseAddr, uint8 inputType) = parseData(data); + uint inputAmount = ERC20(input).balanceOf(address(this)); + + if (inputType == 1) { + // rstCelo -> stCelo + uint stCeloAmount = IRebasedStakedCelo(rebaseAddr).toStakedCelo(inputAmount); + IRebasedStakedCelo(rebaseAddr).withdraw(stCeloAmount); + } else if (inputType == 2) { + // stCelo -> rstCelo + require(ERC20(input).approve(rebaseAddr, inputAmount)); + IRebasedStakedCelo(rebaseAddr).deposit(inputAmount); + } + uint outputAmount = ERC20(output).balanceOf(address(this)); + require(ERC20(output).transfer(to, outputAmount), "PairRStCelo: Transfer Failed"); + } + + function parseData(bytes memory data) private pure returns (address rebaseAddr, uint8 inputType) { + require(data.length == 21, "PairRStCelo: invalid data!"); + inputType = uint8(data[20]); + assembly { + rebaseAddr := mload(add(data, 20)) + } + } + + function getOutputAmount( + address, + address, + uint amountIn, + bytes calldata + ) external view override returns (uint amountOut) { + return amountIn; + } + + receive() external payable {} +} \ No newline at end of file diff --git a/contracts/swappa/PairStCelo.sol b/contracts/swappa/PairStCelo.sol new file mode 100644 index 0000000..cab9808 --- /dev/null +++ b/contracts/swappa/PairStCelo.sol @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.6.8; + +import "@openzeppelin/contracts/math/SafeMath.sol"; +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "../interfaces/stCelo/IManager.sol"; +import "./ISwappaPairV1.sol"; + +contract PairStCelo is ISwappaPairV1 { + using SafeMath for uint; + + address constant CELO_ADDRESS = 0x471EcE3750Da237f93B8E339c536989b8978a438; + + function swap( + address input, + address output, + address to, + bytes calldata data + ) external override { + require(input == CELO_ADDRESS, "PairStCelo: Incorrect Input"); + address payable managerAddr = parseData(data); + uint inputAmount = ERC20(input).balanceOf(address(this)); + IManager(managerAddr).deposit{value: inputAmount}(); + uint outputAmount = ERC20(output).balanceOf(address(this)); + require(ERC20(output).transfer(to, outputAmount), "PairStCelo: Transfer Failed"); + } + + function parseData(bytes memory data) private pure returns (address payable managerAddr) { + require(data.length == 20, "PairStCelo: invalid data!"); + assembly { + managerAddr := mload(add(data, 20)) + } + } + + function getOutputAmount( + address, + address, + uint amountIn, + bytes calldata + ) external view override returns (uint amountOut) { + return amountIn; + } + + receive() external payable {} +} \ No newline at end of file diff --git a/contracts/swappa/PairUniswapV3.sol b/contracts/swappa/PairUniswapV3.sol index 56e2232..d505562 100644 --- a/contracts/swappa/PairUniswapV3.sol +++ b/contracts/swappa/PairUniswapV3.sol @@ -14,129 +14,129 @@ import "./ISwappaPairV1.sol"; contract PairUniswapV3 is ISwappaPairV1, IUniswapV3SwapCallback { - using SafeMath for uint256; - using SafeCast for uint256; + using SafeMath for uint256; + using SafeCast for uint256; - function swap( - address input, - address, - address to, - bytes calldata data - ) external override { - address pairAddr = parseData(data); - uint256 inputAmount = ERC20(input).balanceOf(address(this)); - IUniswapV3Pool pair = IUniswapV3Pool(pairAddr); - bool zeroForOne = pair.token0() == input; - // calling swap will trigger the uniswapV3SwapCallback - pair.swap( - to, - zeroForOne, - inputAmount.toInt256(), - zeroForOne - ? TickMath.MIN_SQRT_RATIO + 1 - : TickMath.MAX_SQRT_RATIO - 1, - new bytes(0) - ); - } + function swap( + address input, + address, + address to, + bytes calldata data + ) external override { + address pairAddr = parseData(data); + uint256 inputAmount = ERC20(input).balanceOf(address(this)); + IUniswapV3Pool pair = IUniswapV3Pool(pairAddr); + bool zeroForOne = pair.token0() == input; + // calling swap will trigger the uniswapV3SwapCallback + pair.swap( + to, + zeroForOne, + inputAmount.toInt256(), + zeroForOne + ? TickMath.MIN_SQRT_RATIO + 1 + : TickMath.MAX_SQRT_RATIO - 1, + new bytes(0) + ); + } - function uniswapV3SwapCallback( - int256 amount0Delta, - int256 amount1Delta, - bytes calldata - ) external override { - ERC20 token; - uint256 amount; - if (amount0Delta > 0) { - amount = uint256(amount0Delta); - token = ERC20(IUniswapV3Pool(msg.sender).token0()); - } else if (amount1Delta > 0) { - amount = uint256(amount1Delta); - token = ERC20(IUniswapV3Pool(msg.sender).token1()); - } - require( - token.transfer(msg.sender, amount), - "PairUniswapV3: transfer failed!" - ); - } + function uniswapV3SwapCallback( + int256 amount0Delta, + int256 amount1Delta, + bytes calldata + ) external override { + ERC20 token; + uint256 amount; + if (amount0Delta > 0) { + amount = uint256(amount0Delta); + token = ERC20(IUniswapV3Pool(msg.sender).token0()); + } else if (amount1Delta > 0) { + amount = uint256(amount1Delta); + token = ERC20(IUniswapV3Pool(msg.sender).token1()); + } + require( + token.transfer(msg.sender, amount), + "PairUniswapV3: transfer failed!" + ); + } - function parseData(bytes memory data) - private - pure - returns (address pairAddr) - { - require(data.length == 20, "PairUniswapV3: invalid data!"); - assembly { - pairAddr := mload(add(data, 20)) - } - } + function parseData(bytes memory data) + private + pure + returns (address pairAddr) + { + require(data.length == 20, "PairUniswapV3: invalid data!"); + assembly { + pairAddr := mload(add(data, 20)) + } + } - function getOutputAmount( - address input, - address, - uint256 amountIn, - bytes calldata data - ) external view override returns (uint256 amountOut) { - address pairAddr = parseData(data); - IUniswapV3Pool pair = IUniswapV3Pool(pairAddr); - bool zeroForOne = pair.token0() == input; - // amount0, amount1 are delta of the pair reserves - (int256 amount0, int256 amount1) = Quoter.quote( - pair, - zeroForOne, - amountIn.toInt256(), - zeroForOne - ? TickMath.MIN_SQRT_RATIO + 1 - : TickMath.MAX_SQRT_RATIO - 1 - ); - return uint256(-(zeroForOne ? amount1 : amount0)); - } + function getOutputAmount( + address input, + address, + uint256 amountIn, + bytes calldata data + ) external view override returns (uint256 amountOut) { + address pairAddr = parseData(data); + IUniswapV3Pool pair = IUniswapV3Pool(pairAddr); + bool zeroForOne = pair.token0() == input; + // amount0, amount1 are delta of the pair reserves + (int256 amount0, int256 amount1) = Quoter.quote( + pair, + zeroForOne, + amountIn.toInt256(), + zeroForOne + ? TickMath.MIN_SQRT_RATIO + 1 + : TickMath.MAX_SQRT_RATIO - 1 + ); + return uint256(-(zeroForOne ? amount1 : amount0)); + } - function getInputAmount( - address input, - address, - uint256 amountOut, - bytes calldata data - ) external view returns (uint256 amountIn) { - address pairAddr = parseData(data); - IUniswapV3Pool pair = IUniswapV3Pool(pairAddr); - bool zeroForOne = pair.token0() == input; - // amount0, amount1 are delta of the pair reserves - (int256 amount0, int256 amount1) = Quoter.quote( - pair, - zeroForOne, - -amountOut.toInt256(), - zeroForOne - ? TickMath.MIN_SQRT_RATIO + 1 - : TickMath.MAX_SQRT_RATIO - 1 - ); - return uint256(zeroForOne ? amount0 : amount1); - } + function getInputAmount( + address input, + address, + uint256 amountOut, + bytes calldata data + ) external view returns (uint256 amountIn) { + address pairAddr = parseData(data); + IUniswapV3Pool pair = IUniswapV3Pool(pairAddr); + bool zeroForOne = pair.token0() == input; + // amount0, amount1 are delta of the pair reserves + (int256 amount0, int256 amount1) = Quoter.quote( + pair, + zeroForOne, + -amountOut.toInt256(), + zeroForOne + ? TickMath.MIN_SQRT_RATIO + 1 + : TickMath.MAX_SQRT_RATIO - 1 + ); + return uint256(zeroForOne ? amount0 : amount1); + } - function getSpotTicks(IUniswapV3Pool pool) - public - view - returns ( - uint160 sqrtPriceX96, - int24 tick, - TickLens.PopulatedTick[] memory populatedTicksTwiceAbove, - TickLens.PopulatedTick[] memory populatedTicksAbove, - TickLens.PopulatedTick[] memory populatedTicksSpot, - TickLens.PopulatedTick[] memory populatedTicksBelow, - TickLens.PopulatedTick[] memory populatedTicksTwiceBelow - ) - { - return TickLens.getSpotTicks(pool); - } + function getSpotTicks(IUniswapV3Pool pool) + public + view + returns ( + uint160 sqrtPriceX96, + int24 tick, + TickLens.PopulatedTick[] memory populatedTicksTwiceAbove, + TickLens.PopulatedTick[] memory populatedTicksAbove, + TickLens.PopulatedTick[] memory populatedTicksSpot, + TickLens.PopulatedTick[] memory populatedTicksBelow, + TickLens.PopulatedTick[] memory populatedTicksTwiceBelow + ) + { + return TickLens.getSpotTicks(pool); + } - function getPopulatedTicksInWord(IUniswapV3Pool pool, int16 tickBitmapIndex) - public - view - returns (TickLens.PopulatedTick[] memory populatedTicks) - { - return TickLens.getPopulatedTicksInWord(pool, tickBitmapIndex); - } + function getPopulatedTicksInWord(IUniswapV3Pool pool, int16 tickBitmapIndex) + public + view + returns (TickLens.PopulatedTick[] memory populatedTicks) + { + return TickLens.getPopulatedTicksInWord(pool, tickBitmapIndex); + } - function recoverERC20(ERC20 token) public { - token.transfer(msg.sender, token.balanceOf(address(this))); - } + function recoverERC20(ERC20 token) public { + token.transfer(msg.sender, token.balanceOf(address(this))); + } } \ No newline at end of file diff --git a/src/cli/cli.ts b/src/cli/cli.ts index 464d22e..04af332 100644 --- a/src/cli/cli.ts +++ b/src/cli/cli.ts @@ -13,14 +13,14 @@ import { SwappaManager } from '../swappa-manager'; import { mainnetRegistryMobius, mainnetRegistryMoola, mainnetRegistryMoolaV2, mainnetRegistrySavingsCELO, mainnetRegistrySushiswap, mainnetRegistryUbeswap, - mainnetRegistryCeloDex, mainnetRegistrySymmetric, mainnetRegistryMisc, mainnetRegistryCurve, mainnetRegistryUniswapV3, + mainnetRegistryCeloDex, mainnetRegistrySymmetric, mainnetRegistryMisc, mainnetRegistryCurve, mainnetRegistryUniswapV3, mainnetRegistriesWhitelist, mainnetRegistryStCelo, } from '../registry-cfg'; import { RegistryMento } from '../registries/mento'; import { Registry } from '../registry'; const program = commander.program .option("--network ", "Celo client URL to connect to.", "http://localhost:8545") - .option("--registries ", "Registries to use for routing.", "all") + .option("--registries ", "Registries to use for routing.", "default") .option("--input ", "Input token address or symbol.", "CELO") .option("--output ", "Output token address or symbol.", "cUSD") .option("--amount ", "Input amount.", "0.001") @@ -50,6 +50,7 @@ const registriesByName: {[name: string]: (kit: ContractKit) => Registry} = { "misc": mainnetRegistryMisc, "curve": mainnetRegistryCurve, "uniswap-v3": mainnetRegistryUniswapV3, + "stcelo": mainnetRegistryStCelo, } interface Token { @@ -92,10 +93,15 @@ async function main() { const inputAmount = new BigNumber(opts.amount).shiftedBy(inputToken.decimals) const tokenWhitelist = ALL_TOKENS.filter((v) => v.chainId === chainId).map((v) => v.address) - const registryFs = opts.registries === "all" ? - Object.values(registriesByName) : - (opts.registries as string).split(",").map((x) => registriesByName[x]) - const registries = registryFs.map((f) => f(kit)) + let registries + if (opts.registries === "default"){ + registries = await mainnetRegistriesWhitelist(kit) + } else { + const registryFs = + opts.registries === "all" ? Object.values(registriesByName) : + (opts.registries as string).split(",").map((x) => registriesByName[x]) + registries = registryFs.map((f) => f(kit)) + } const manager = new SwappaManager(kit, swappaRouterV1Address, registries) console.info(`Finding & initializing pairs...`) const pairs = await manager.reinitializePairs(tokenWhitelist) diff --git a/src/pairs/stCelo.ts b/src/pairs/stCelo.ts new file mode 100644 index 0000000..22295b0 --- /dev/null +++ b/src/pairs/stCelo.ts @@ -0,0 +1,168 @@ +import Web3 from "web3"; +import { Address, BigNumberString, Pair, Snapshot } from "../pair"; +import { + IStakedCelo, + ABI as StakedCeloABI, +} from "../../types/web3-v1-contracts/IStakedCelo"; +import { + IAccount, + ABI as AccountABI, +} from "../../types/web3-v1-contracts/IAccount"; +import { address as pairStCeloAddress } from "../../tools/deployed/mainnet.PairStCelo.addr.json"; +import { address as pairRstCeloAddress } from "../../tools/deployed/mainnet.PairRStCelo.addr.json"; + +import { selectAddress } from "../utils"; +import BigNumber from "bignumber.js"; + +interface PairStakedCeloSnapshot extends Snapshot { + stCeloSupply: BigNumberString; + celoBalance: BigNumberString; +} + +abstract class PairStakedCelo extends Pair { + allowRepeats = true; + + private stCeloContract: IStakedCelo; + private accountContract: IAccount; + private stCeloSupply: bigint = BigInt(0); + private celoBalance: bigint = BigInt(0); + + constructor( + private web3: Web3, + swappaPairAddress: Address, + private stakedCeloAddress: Address, + private accountAddress: Address + ) { + super(swappaPairAddress); + this.stCeloContract = new this.web3.eth.Contract( + StakedCeloABI, + this.stakedCeloAddress + ) as unknown as IStakedCelo; + this.accountContract = new this.web3.eth.Contract( + AccountABI, + this.accountAddress + ) as unknown as IAccount; + } + + protected async _fetchSupplies() { + const [stCeloSupply, celoBalace] = await Promise.all([ + this.stCeloContract.methods.totalSupply().call(), + this.accountContract.methods.getTotalCelo().call(), + ]); + this.stCeloSupply = BigInt(stCeloSupply.toString()); + this.celoBalance = BigInt(celoBalace.toString()); + } + public async refresh(): Promise { + await this._fetchSupplies(); + } + + protected toStakedCelo(celoAmount: bigint): bigint { + return (celoAmount * this.stCeloSupply) / this.celoBalance; + } + + protected toCelo(stCeloAmount: bigint): bigint { + return (stCeloAmount * this.celoBalance) / this.celoBalance; + } + + public snapshot(): PairStakedCeloSnapshot { + return { + stCeloSupply: this.stCeloSupply.toString(), + celoBalance: this.celoBalance.toString(), + }; + } + + public restore({ stCeloSupply, celoBalance }: PairStakedCeloSnapshot): void { + this.stCeloSupply = BigInt(stCeloSupply); + this.celoBalance = BigInt(celoBalance); + } +} + +export class PairStCelo extends PairStakedCelo { + constructor( + chainId: number, + web3: Web3, + accountAddress: Address, + private managerAddress: Address, + private celoAddr: Address, + private stCeloAddr: Address + ) { + super( + web3, + selectAddress(chainId, { mainnet: pairStCeloAddress }), + stCeloAddr, + accountAddress + ); + } + + protected async _init() { + return { + pairKey: this.managerAddress, + tokenA: this.celoAddr, + tokenB: this.stCeloAddr, + }; + } + + public outputAmount(inputToken: string, inputAmount: BigNumber): BigNumber { + const bnOutput = this._outputAmount( + inputToken, + BigInt(inputAmount.toFixed(0)) + ); + + return new BigNumber(bnOutput.toString()); + } + + private _outputAmount(inputToken: string, inputAmount: bigint): bigint { + if (inputToken === this.tokenB) return BigInt(0); + return this.toStakedCelo(inputAmount); + } + + protected swapExtraData(): string { + return this.managerAddress; + } +} + +export class PairRebasedStCelo extends PairStakedCelo { + constructor( + chainId: number, + web3: Web3, + accountAddress: Address, + private rstCeloAddr: Address, + private stCeloAddr: Address + ) { + super( + web3, + selectAddress(chainId, { mainnet: pairRstCeloAddress }), + stCeloAddr, + accountAddress + ); + } + + protected async _init() { + await this._fetchSupplies(); + return { + pairKey: this.rstCeloAddr, + tokenA: this.rstCeloAddr, + tokenB: this.stCeloAddr, + }; + } + + public outputAmount(inputToken: string, inputAmount: BigNumber): BigNumber { + const bnOutput = this._outputAmount( + inputToken, + BigInt(inputAmount.toFixed(0)) + ); + + return new BigNumber(bnOutput.toString()); + } + + private _outputAmount(inputToken: string, inputAmount: bigint): bigint { + if (inputToken === this.tokenB) return this.toCelo(inputAmount); + return this.toStakedCelo(inputAmount); + } + + protected swapExtraData(inputToken: string): string { + const swapType = inputToken === this.tokenA ? "01" : "02"; + + return `${this.rstCeloAddr}${swapType}`; + } +} diff --git a/src/registry-cfg.ts b/src/registry-cfg.ts index d0b39cb..8cf7a6a 100644 --- a/src/registry-cfg.ts +++ b/src/registry-cfg.ts @@ -14,6 +14,7 @@ import { RegistryBalancer } from "./registries/balancer" import { address as registryHelperUniswapV2 } from "../tools/deployed/mainnet.RegistryHelperUniswapV2.addr.json" import { createCurvePairs } from "./pairs/curve" import { RegistryUniswapV3 } from "./registries/uniswapv3" +import { PairRebasedStCelo, PairStCelo } from "./pairs/stCelo" export const mainnetRegistryMoola = (kit: ContractKit) => new RegistryAave("moola", kit, "0x7AAaD5a5fa74Aec83b74C2a098FBC86E17Ce4aEA") @@ -102,6 +103,36 @@ export const mainnetRegistryUniswapV3 = (kit: ContractKit) => "0xAfE208a311B21f13EF87E33A90049fC17A7acDEc", {fetchUsingPoolEvents: true}, ); +export const mainnetRegistryStCelo = (kit: ContractKit) => { + const CELO = "0x471EcE3750Da237f93B8E339c536989b8978a438"; + const ACCOUNT_PROXY = "0x4aAD04D41FD7fd495503731C5a2579e19054C432"; + const MANAGER_PROXY = "0x0239b96D10a434a56CC9E09383077A0490cF9398"; + const REBASED_PROXY = "0xDc5762753043327d74e0a538199c1488FC1F44cf"; + const STAKED_PROXY = "0xC668583dcbDc9ae6FA3CE46462758188adfdfC24"; + + const web3 = kit.web3 as unknown as Web3; + const pairs = web3.eth + .getChainId() + .then((chainId) => [ + new PairStCelo( + chainId, + web3, + ACCOUNT_PROXY, + MANAGER_PROXY, + CELO, + STAKED_PROXY + ), + new PairRebasedStCelo( + chainId, + web3, + ACCOUNT_PROXY, + REBASED_PROXY, + STAKED_PROXY + ), + ]); + + return new RegistryStatic("stcelo", pairs); +}; // mainnetRegistriesWhitelist contains list of more established protocols with diff --git a/tools/codegen.ts b/tools/codegen.ts index 5e316d6..c2dd5d6 100644 --- a/tools/codegen.ts +++ b/tools/codegen.ts @@ -27,6 +27,8 @@ async function generateContractTypes() { execSync(`sed -e '/type\:\ \"receive\"/d' -i ${extraFlag} ${path.join(typesDir, "PairStableSwap.ts")}`, {cwd: ROOT_DIR}) execSync(`sed -e '/type\:\ \"receive\"/d' -i ${extraFlag} ${path.join(typesDir, "PairSavingsCELO.ts")}`, {cwd: ROOT_DIR}) execSync(`sed -e '/type\:\ \"receive\"/d' -i ${extraFlag} ${path.join(typesDir, "PairATokenV2.ts")}`, {cwd: ROOT_DIR}) + execSync(`sed -e '/type\:\ \"receive\"/d' -i ${extraFlag} ${path.join(typesDir, "PairStCelo.ts")}`, {cwd: ROOT_DIR}) + execSync(`sed -e '/type\:\ \"receive\"/d' -i ${extraFlag} ${path.join(typesDir, "PairRStCelo.ts")}`, {cwd: ROOT_DIR}) } generateContractTypes() diff --git a/tools/deployed/mainnet.PairRStCelo.addr.json b/tools/deployed/mainnet.PairRStCelo.addr.json new file mode 100644 index 0000000..8b2c716 --- /dev/null +++ b/tools/deployed/mainnet.PairRStCelo.addr.json @@ -0,0 +1 @@ +{"address":"0x68B7B4CcB789B872ECA8373cf5941B48954BA82B"} \ No newline at end of file diff --git a/tools/deployed/mainnet.PairStCelo.addr.json b/tools/deployed/mainnet.PairStCelo.addr.json new file mode 100644 index 0000000..25d5502 --- /dev/null +++ b/tools/deployed/mainnet.PairStCelo.addr.json @@ -0,0 +1 @@ +{"address":"0x1d196cE5e4CB86e85147F4b5ae06392Fd07d7400"} \ No newline at end of file diff --git a/tools/deployer.ts b/tools/deployer.ts index 9284e46..1cd2ca8 100644 --- a/tools/deployer.ts +++ b/tools/deployer.ts @@ -18,6 +18,8 @@ import PairOpenSumSwap from "../build/contracts/PairOpenSumSwap.json" import PairSymmetricSwap from "../build/contracts/PairSymmetricSwap.json" import PairCurve from "../build/contracts/PairCurve.json" import PairUniswapV3 from "../build/contracts/PairUniswapV3.json" +import PairStCelo from "../build/contracts/PairStCelo.json" +import PairRStCelo from "../build/contracts/PairRStCelo.json" process.on('unhandledRejection', (reason, _promise) => { // @ts-ignore @@ -123,6 +125,10 @@ async function main() { kit, opts.network, "PairCurve", PairCurve.bytecode) await readAddressOrDeployContract( kit, opts.network, "PairUniswapV3", PairUniswapV3.bytecode) + await readAddressOrDeployContract( + kit, opts.network, "PairStCelo", PairStCelo.bytecode) + await readAddressOrDeployContract( + kit, opts.network, "PairRStCelo", PairRStCelo.bytecode) } main() \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index dd6db6e..489402b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1522,9 +1522,9 @@ "@types/node" "*" "@ubeswap/default-token-list@^4.0.11": - version "4.1.57" - resolved "https://registry.yarnpkg.com/@ubeswap/default-token-list/-/default-token-list-4.1.57.tgz#fcd343ea6cbd629ab02043fb8959d2cf3bbc59d7" - integrity sha512-rPFsGh/8OpzlZ+td+5ohTcsXF+cyxTgl6OKspiWJL6C/HS3/ER2Eb6J2IZosz0oDj1XsXVlLNPE8Gfvzz/d80Q== + version "4.1.61" + resolved "https://registry.yarnpkg.com/@ubeswap/default-token-list/-/default-token-list-4.1.61.tgz#aca99c350e70ed28893c09197376c071356501fd" + integrity sha512-4weBq0nXMyEwtvecD0dnpZ/1prdqhQEQHBw7FxHEcmYW2TcTm9QTvAdwoLXfzEIbNghRtestJGEk0GCTItyaOQ== "@wry/equality@^0.1.2": version "0.1.11"