diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 88431c926..9737db6c3 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -10,16 +10,7 @@ on: - 'v*.*.*' jobs: - verify-main-branch: # ensures we only release from main - runs-on: ubuntu-latest - steps: - - name: Exit if not on main branch - if: github.ref != 'refs/heads/main' - run: echo "Not on main branch, exiting" && exit -1 - release-middleware: - needs: - - "verify-main-branch" runs-on: "ubuntu-latest" steps: - uses: actions/checkout@v2 @@ -47,12 +38,10 @@ jobs: password: ${{ secrets.PYPI_TOKEN }} skip-existing: true packages-dir: dist/ - release-operate: runs-on: macos-latest needs: - "release-middleware" - - "verify-main-branch" steps: - uses: actions/checkout@v2 - uses: actions/setup-python@v4 diff --git a/electron/install.js b/electron/install.js index 5bff13da4..1aa6ca967 100644 --- a/electron/install.js +++ b/electron/install.js @@ -11,7 +11,7 @@ const axios = require("axios") const Docker = require('dockerode'); const { spawnSync } = require('child_process'); -const Version = '0.1.0rc25'; +const Version = '0.1.0rc26'; const OperateDirectory = `${os.homedir()}/.operate`; const VenvDir = `${OperateDirectory}/venv`; const TempDir = `${OperateDirectory}/temp`; diff --git a/electron/loading/index.html b/electron/loading/index.html index e8f1767ee..12e942969 100644 --- a/electron/loading/index.html +++ b/electron/loading/index.html @@ -29,12 +29,12 @@ const { ipcRenderer } = require("electron"); ipcRenderer.on("response", (event, arg) => { if (typeof arg === "string") { - if (arg.includes(/Installing/)) { + if (arg.includes("Installing")) { document.getElementById("text").innerHTML = `Installing app dependencies...
This might take a while`; - } else if (arg.includes(/Development mode/)) { + } else if (arg.includes("Development")) { document.getElementById("text").innerHTML = arg; } } diff --git a/electron/preload.js b/electron/preload.js index 82d88e443..8431dbe3c 100644 --- a/electron/preload.js +++ b/electron/preload.js @@ -15,6 +15,7 @@ contextBridge.exposeInMainWorld('electronAPI', { get: (key) => ipcRenderer.invoke('store-get', key), set: (key, value) => ipcRenderer.invoke('store-set', key, value), delete: (key) => ipcRenderer.invoke('store-delete', key), + clear: () => ipcRenderer.invoke('store-clear'), }, setAppHeight: (height) => ipcRenderer.send('set-height', height), showNotification: (title, description) => diff --git a/electron/store.js b/electron/store.js index a9a5867c6..91cde5bef 100644 --- a/electron/store.js +++ b/electron/store.js @@ -32,6 +32,7 @@ const setupStoreIpc = async (ipcChannel, mainWindow) => { ipcChannel.handle('store-get', (_, key) => store.get(key)); ipcChannel.handle('store-set', (_, key, value) => store.set(key, value)); ipcChannel.handle('store-delete', (_, key) => store.delete(key)); + ipcChannel.handle('store-clear', (_) => store.clear()); }; module.exports = { setupStoreIpc }; diff --git a/frontend/components/Layout/Layout.tsx b/frontend/components/Layout/Layout.tsx index 194608543..62f88eea4 100644 --- a/frontend/components/Layout/Layout.tsx +++ b/frontend/components/Layout/Layout.tsx @@ -1,20 +1,57 @@ -import { PropsWithChildren } from 'react'; -import styled from 'styled-components'; +import { WifiOutlined } from '@ant-design/icons'; +import { message } from 'antd'; +import { PropsWithChildren, useContext, useEffect } from 'react'; +import styled, { css } from 'styled-components'; import { COLOR } from '@/constants'; +import { OnlineStatusContext } from '@/context/OnlineStatusProvider'; import { TopBar } from './TopBar'; -const Container = styled.div` +const Container = styled.div<{ blur: 'true' | 'false' }>` background-color: ${COLOR.WHITE}; border-radius: 8px; + + ${(props) => + props.blur === 'true' && + css` + filter: blur(2px); + position: relative; + overflow: hidden; + + &::before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(27, 38, 50, 0.1); + z-index: 1; + } + `} `; export const Layout = ({ children, }: PropsWithChildren & { vertical?: boolean }) => { + const { isOnline } = useContext(OnlineStatusContext); + + useEffect(() => { + let messageKey; + if (!isOnline) { + messageKey = message.error({ + content: 'Network connection is unstable', + duration: 0, + icon: , + }); + } else { + message.destroy(messageKey); + } + }, [isOnline]); + return ( - + {children} diff --git a/frontend/components/Main/MainHeader.tsx b/frontend/components/Main/MainHeader.tsx index 83313c074..1a82d2333 100644 --- a/frontend/components/Main/MainHeader.tsx +++ b/frontend/components/Main/MainHeader.tsx @@ -111,12 +111,15 @@ export const MainHeader = () => { return ServicesService.createService({ serviceTemplate, deploy: true, - }).then(() => { - setServiceStatus(DeploymentStatus.DEPLOYED); - setIsBalancePollingPaused(false); - setServiceButtonState(ServiceButtonLoadingState.NotLoading); - showNotification?.('Your agent is now running!'); - }); + }) + .then(() => { + setServiceStatus(DeploymentStatus.DEPLOYED); + showNotification?.('Your agent is now running!'); + }) + .finally(() => { + setIsBalancePollingPaused(false); + setServiceButtonState(ServiceButtonLoadingState.NotLoading); + }); } catch (error) { setIsBalancePollingPaused(false); setServiceButtonState(ServiceButtonLoadingState.NotLoading); diff --git a/frontend/components/Main/MainRewards.tsx b/frontend/components/Main/MainRewards.tsx index b4b5bf2c8..da0617a72 100644 --- a/frontend/components/Main/MainRewards.tsx +++ b/frontend/components/Main/MainRewards.tsx @@ -18,19 +18,32 @@ const RewardsRow = styled(Row)` margin: 0 -24px; > .ant-col { padding: 24px; - &:not(:last-child) { border-right: 1px solid ${COLOR.BORDER_GRAY}; } } `; +const Loader = () => ( + + + + +); + const DisplayRewards = () => { - const { availableRewardsForEpochEth, isEligibleForRewards } = useReward(); + const { + availableRewardsForEpochEth, + isEligibleForRewards, + minimumStakedAmountRequired, + } = useReward(); const { isBalanceLoaded, totalOlasStakedBalance } = useBalance(); - // 20 OLAS is the minimum amount to stake - const isStaked = totalOlasStakedBalance === 20; + // check if the staked amount is greater than the minimum required + const isStaked = + minimumStakedAmountRequired && + totalOlasStakedBalance && + totalOlasStakedBalance >= minimumStakedAmountRequired; return ( @@ -49,10 +62,7 @@ const DisplayRewards = () => { )} ) : ( - - - - + )} @@ -65,13 +75,12 @@ const DisplayRewards = () => { {balanceFormat(totalOlasStakedBalance, 2)} OLAS - {isStaked ? null : Not yet staked} + {minimumStakedAmountRequired && !isStaked ? ( + Not yet staked + ) : null} ) : ( - - - - + )} @@ -79,6 +88,9 @@ const DisplayRewards = () => { ); }; +const SHARE_TEXT = `I just earned my first reward through the Operate app powered by #olas!\n\nDownload the Pearl app:`; +const OPERATE_URL = 'https://olas.network/operate?pearl=first-reward'; + const NotifyRewards = () => { const { isEligibleForRewards, availableRewardsForEpochEth } = useReward(); const { totalOlasBalance } = useBalance(); @@ -119,6 +131,16 @@ const NotifyRewards = () => { store?.set?.('firstRewardNotificationShown', true); }, [store]); + const onTwitterShare = useCallback(() => { + const encodedText = encodeURIComponent(SHARE_TEXT); + const encodedURL = encodeURIComponent(OPERATE_URL); + + window.open( + `https://twitter.com/intent/tweet?text=${encodedText}&url=${encodedURL}`, + '_blank', + ); + }, []); + if (!canShowNotification) return null; return ( @@ -133,8 +155,7 @@ const NotifyRewards = () => { block size="large" className="mt-8" - disabled - style={{ display: 'none' }} // TODO: add twitter share functionality + onClick={onTwitterShare} > Share on diff --git a/frontend/components/Setup/SetupWelcome.tsx b/frontend/components/Setup/SetupWelcome.tsx index 92c4b5dd7..cf78db142 100644 --- a/frontend/components/Setup/SetupWelcome.tsx +++ b/frontend/components/Setup/SetupWelcome.tsx @@ -14,6 +14,7 @@ import { useCallback, useEffect, useMemo, useState } from 'react'; import { AccountIsSetup } from '@/client'; import { PageState, SetupScreen } from '@/enums'; import { usePageState, useSetup } from '@/hooks'; +import { useElectronApi } from '@/hooks/useElectronApi'; import { useWallet } from '@/hooks/useWallet'; import { AccountService } from '@/service/Account'; @@ -22,6 +23,7 @@ import { FormFlex } from '../styled/FormFlex'; const { Title } = Typography; export const SetupWelcome = () => { + const electronApi = useElectronApi(); const [isSetup, setIsSetup] = useState( AccountIsSetup.Loading, ); @@ -32,8 +34,12 @@ export const SetupWelcome = () => { switch (res.is_setup) { case true: setIsSetup(AccountIsSetup.True); + break; case false: + // Reset persistent state + // if creating new account + electronApi.store?.clear?.(); setIsSetup(AccountIsSetup.False); break; default: diff --git a/frontend/context/BalanceProvider.tsx b/frontend/context/BalanceProvider.tsx index 7aa9d0c6e..bc539cedb 100644 --- a/frontend/context/BalanceProvider.tsx +++ b/frontend/context/BalanceProvider.tsx @@ -28,6 +28,7 @@ import { } from '@/types'; import { ServicesContext } from '.'; +import { OnlineStatusContext } from './OnlineStatusProvider'; import { RewardContext } from './RewardProvider'; import { WalletContext } from './WalletProvider'; @@ -64,6 +65,7 @@ export const BalanceContext = createContext<{ }); export const BalanceProvider = ({ children }: PropsWithChildren) => { + const { isOnline } = useContext(OnlineStatusContext); const { wallets, masterEoaAddress, masterSafeAddress } = useContext(WalletContext); const { services, serviceAddresses } = useContext(ServicesContext); @@ -197,7 +199,7 @@ export const BalanceProvider = ({ children }: PropsWithChildren) => { () => { updateBalances(); }, - isPaused ? null : 5000, + isPaused || !isOnline ? null : 5000, ); return ( diff --git a/frontend/context/ElectronApiProvider.tsx b/frontend/context/ElectronApiProvider.tsx index 6710b843c..81b12ff7a 100644 --- a/frontend/context/ElectronApiProvider.tsx +++ b/frontend/context/ElectronApiProvider.tsx @@ -20,6 +20,7 @@ type ElectronApiContextProps = { get?: (key: string) => Promise; set?: (key: string, value: unknown) => Promise; delete?: (key: string) => Promise; + clear?: () => Promise; }; setAppHeight?: (height: unknown) => void; notifyAgentRunning?: () => void; @@ -40,6 +41,7 @@ export const ElectronApiContext = createContext({ get: async () => {}, set: async () => {}, delete: async () => {}, + clear: async () => {}, }, setAppHeight: () => {}, }); @@ -74,6 +76,7 @@ export const ElectronApiProvider = ({ children }: PropsWithChildren) => { get: getElectronApiFunction('store.get'), set: getElectronApiFunction('store.set'), delete: getElectronApiFunction('store.delete'), + clear: getElectronApiFunction('store.clear'), }, setAppHeight: getElectronApiFunction('setAppHeight'), showNotification: getElectronApiFunction('showNotification'), diff --git a/frontend/context/MasterSafeProvider.tsx b/frontend/context/MasterSafeProvider.tsx index 9bd27e393..f4a3356db 100644 --- a/frontend/context/MasterSafeProvider.tsx +++ b/frontend/context/MasterSafeProvider.tsx @@ -14,6 +14,7 @@ import { useInterval } from 'usehooks-ts'; import { GnosisSafeService } from '@/service/GnosisSafe'; import { Address } from '@/types'; +import { OnlineStatusContext } from './OnlineStatusProvider'; import { WalletContext } from './WalletProvider'; export const MasterSafeContext = createContext<{ @@ -31,6 +32,7 @@ export const MasterSafeContext = createContext<{ }); export const MasterSafeProvider = ({ children }: PropsWithChildren) => { + const { isOnline } = useContext(OnlineStatusContext); const { masterSafeAddress, masterEoaAddress } = useContext(WalletContext); const [masterSafeOwners, setMasterSafeOwners] = useState(); @@ -66,7 +68,9 @@ export const MasterSafeProvider = ({ children }: PropsWithChildren) => { useInterval( updateMasterSafeOwners, - masterSafeOwners && masterSafeOwners.length >= 2 ? null : 5000, + (masterSafeOwners && masterSafeOwners.length >= 2) || !isOnline + ? null + : 5000, ); return ( diff --git a/frontend/context/OnlineStatusProvider.tsx b/frontend/context/OnlineStatusProvider.tsx new file mode 100644 index 000000000..c1bcfc2f2 --- /dev/null +++ b/frontend/context/OnlineStatusProvider.tsx @@ -0,0 +1,43 @@ +import React, { + createContext, + PropsWithChildren, + useEffect, + useState, +} from 'react'; + +type OnlineStatusContextProps = { + isOnline: boolean; +}; + +const initialState = { + isOnline: true, +}; + +const OnlineStatusContext = + createContext(initialState); + +const OnlineStatusProvider = ({ children }: PropsWithChildren) => { + const [isOnline, setIsOnline] = useState(initialState.isOnline); + + useEffect(() => { + const updateOnlineStatus = () => { + setIsOnline(navigator.onLine); + }; + + window.addEventListener('online', updateOnlineStatus); + window.addEventListener('offline', updateOnlineStatus); + + return () => { + window.removeEventListener('online', updateOnlineStatus); + window.removeEventListener('offline', updateOnlineStatus); + }; + }, []); + + return ( + + {children} + + ); +}; + +export { OnlineStatusContext, OnlineStatusProvider }; diff --git a/frontend/context/RewardProvider.tsx b/frontend/context/RewardProvider.tsx index 6bf4ebdb3..831e2b420 100644 --- a/frontend/context/RewardProvider.tsx +++ b/frontend/context/RewardProvider.tsx @@ -14,6 +14,7 @@ import { useElectronApi } from '@/hooks/useElectronApi'; import { useStore } from '@/hooks/useStore'; import { AutonolasService } from '@/service/Autonolas'; +import { OnlineStatusContext } from './OnlineStatusProvider'; import { ServicesContext } from './ServicesProvider'; export const RewardContext = createContext<{ @@ -22,6 +23,7 @@ export const RewardContext = createContext<{ availableRewardsForEpochEth?: number; isEligibleForRewards?: boolean; optimisticRewardsEarnedForEpoch?: number; + minimumStakedAmountRequired?: number; updateRewards: () => Promise; }>({ accruedServiceStakingRewards: undefined, @@ -29,10 +31,12 @@ export const RewardContext = createContext<{ availableRewardsForEpochEth: undefined, isEligibleForRewards: undefined, optimisticRewardsEarnedForEpoch: undefined, + minimumStakedAmountRequired: undefined, updateRewards: async () => {}, }); export const RewardProvider = ({ children }: PropsWithChildren) => { + const { isOnline } = useContext(OnlineStatusContext); const { services } = useContext(ServicesContext); const service = useMemo(() => services?.[0], [services]); const { storeState } = useStore(); @@ -43,6 +47,8 @@ export const RewardProvider = ({ children }: PropsWithChildren) => { const [availableRewardsForEpoch, setAvailableRewardsForEpoch] = useState(); const [isEligibleForRewards, setIsEligibleForRewards] = useState(); + const [minimumStakedAmountRequired, setMinimumStakedAmountRequired] = + useState(); const availableRewardsForEpochEth = useMemo(() => { if (!availableRewardsForEpoch) return; @@ -80,6 +86,7 @@ export const RewardProvider = ({ children }: PropsWithChildren) => { setAccruedServiceStakingRewards( stakingRewardsInfo?.accruedServiceStakingRewards, ); + setMinimumStakedAmountRequired(stakingRewardsInfo?.minimumStakedAmount); setAvailableRewardsForEpoch(rewards); }, [service]); @@ -93,7 +100,7 @@ export const RewardProvider = ({ children }: PropsWithChildren) => { storeState?.firstStakingRewardAchieved, ]); - useInterval(async () => updateRewards(), 5000); + useInterval(async () => updateRewards(), isOnline ? 5000 : null); return ( { availableRewardsForEpochEth, isEligibleForRewards, optimisticRewardsEarnedForEpoch, + minimumStakedAmountRequired, updateRewards, }} > diff --git a/frontend/context/ServicesProvider.tsx b/frontend/context/ServicesProvider.tsx index 5a22a008e..37b3a2887 100644 --- a/frontend/context/ServicesProvider.tsx +++ b/frontend/context/ServicesProvider.tsx @@ -5,6 +5,7 @@ import { PropsWithChildren, SetStateAction, useCallback, + useContext, useMemo, useState, } from 'react'; @@ -14,6 +15,8 @@ import { DeploymentStatus, Service } from '@/client'; import { ServicesService } from '@/service'; import { Address } from '@/types'; +import { OnlineStatusContext } from './OnlineStatusProvider'; + type ServicesContextProps = { services?: Service[]; serviceAddresses?: Address[]; @@ -39,6 +42,8 @@ export const ServicesContext = createContext({ }); export const ServicesProvider = ({ children }: PropsWithChildren) => { + const { isOnline } = useContext(OnlineStatusContext); + const [services, setServices] = useState(); const [serviceStatus, setServiceStatus] = useState< @@ -86,7 +91,7 @@ export const ServicesProvider = ({ children }: PropsWithChildren) => { updateServicesState() .then(() => updateServiceStatus()) .catch((e) => message.error(e.message)), - 5000, + isOnline ? 5000 : null, ); return ( diff --git a/frontend/context/WalletProvider.tsx b/frontend/context/WalletProvider.tsx index 533594308..f175394b0 100644 --- a/frontend/context/WalletProvider.tsx +++ b/frontend/context/WalletProvider.tsx @@ -1,10 +1,12 @@ -import { createContext, PropsWithChildren, useState } from 'react'; +import { createContext, PropsWithChildren, useContext, useState } from 'react'; import { useInterval } from 'usehooks-ts'; import { Wallet } from '@/client'; import { WalletService } from '@/service/Wallet'; import { Address } from '@/types'; +import { OnlineStatusContext } from './OnlineStatusProvider'; + export const WalletContext = createContext<{ masterEoaAddress?: Address; masterSafeAddress?: Address; @@ -18,6 +20,8 @@ export const WalletContext = createContext<{ }); export const WalletProvider = ({ children }: PropsWithChildren) => { + const { isOnline } = useContext(OnlineStatusContext); + const [wallets, setWallets] = useState(); const masterEoaAddress: Address | undefined = wallets?.[0]?.address; @@ -29,7 +33,7 @@ export const WalletProvider = ({ children }: PropsWithChildren) => { setWallets(wallets); }; - useInterval(updateWallets, 5000); + useInterval(updateWallets, isOnline ? 5000 : null); return ( { availableRewardsForEpoch, availableRewardsForEpochEth, isEligibleForRewards, + minimumStakedAmountRequired, } = useContext(RewardContext); return { availableRewardsForEpoch, availableRewardsForEpochEth, isEligibleForRewards, + minimumStakedAmountRequired, }; }; diff --git a/frontend/pages/_app.tsx b/frontend/pages/_app.tsx index 995d1f560..9c91f90b1 100644 --- a/frontend/pages/_app.tsx +++ b/frontend/pages/_app.tsx @@ -9,6 +9,7 @@ import { PageStateProvider, ServicesProvider, SetupProvider } from '@/context'; import { BalanceProvider } from '@/context/BalanceProvider'; import { ElectronApiProvider } from '@/context/ElectronApiProvider'; import { MasterSafeProvider } from '@/context/MasterSafeProvider'; +import { OnlineStatusProvider } from '@/context/OnlineStatusProvider'; import { RewardProvider } from '@/context/RewardProvider'; import { SettingsProvider } from '@/context/SettingsProvider'; import { StoreProvider } from '@/context/StoreProvider'; @@ -29,27 +30,29 @@ export default function App({ Component, pageProps }: AppProps) { - - - - - - - - {isMounted ? ( - - - - - - ) : null} - - - - - - - + + + + + + + + + {isMounted ? ( + + + + + + ) : null} + + + + + + + + diff --git a/frontend/service/Autonolas.ts b/frontend/service/Autonolas.ts index 49c8e2e42..1be76ed44 100644 --- a/frontend/service/Autonolas.ts +++ b/frontend/service/Autonolas.ts @@ -64,6 +64,7 @@ const getAgentStakingRewardsInfo = async ({ mechActivityCheckerContract.livenessRatio(), serviceStakingTokenMechUsageContract.rewardsPerSecond(), serviceStakingTokenMechUsageContract.calculateStakingReward(serviceId), + serviceStakingTokenMechUsageContract.minStakingDeposit(), ]; await gnosisMulticallProvider.init(); @@ -77,6 +78,7 @@ const getAgentStakingRewardsInfo = async ({ livenessRatio, rewardsPerSecond, accruedServiceStakingRewards, + minimumStakingDeposit, ] = multicallResponse; /** @@ -109,6 +111,11 @@ const getAgentStakingRewardsInfo = async ({ const availableRewardsForEpoch = rewardsPerSecond * livenessPeriod; + // Minimum staked amount is double the minimum staking deposit + // (basically all the bonds must be the same as deposit) + const minimumStakedAmount = + parseFloat(ethers.utils.formatEther(`${minimumStakingDeposit}`)) * 2; + return { mechRequestCount, serviceInfo, @@ -120,6 +127,7 @@ const getAgentStakingRewardsInfo = async ({ accruedServiceStakingRewards: parseFloat( ethers.utils.formatEther(`${accruedServiceStakingRewards}`), ), + minimumStakedAmount, } as StakingRewardsInfo; }; diff --git a/frontend/service/Services.ts b/frontend/service/Services.ts index 7f923085e..fe2182217 100644 --- a/frontend/service/Services.ts +++ b/frontend/service/Services.ts @@ -35,20 +35,27 @@ const createService = async ({ serviceTemplate: ServiceTemplate; deploy: boolean; }): Promise => - fetch(`${BACKEND_URL}/services`, { - method: 'POST', - body: JSON.stringify({ - ...serviceTemplate, - deploy, - configuration: { - ...serviceTemplate.configuration, - rpc: `${process.env.GNOSIS_RPC}`, + new Promise((resolve, reject) => + fetch(`${BACKEND_URL}/services`, { + method: 'POST', + body: JSON.stringify({ + ...serviceTemplate, + deploy, + configuration: { + ...serviceTemplate.configuration, + rpc: `${process.env.GNOSIS_RPC}`, + }, + }), + headers: { + 'Content-Type': 'application/json', }, + }).then((response) => { + if (response.ok) { + resolve(response.json()); + } + reject('Failed to create service'); }), - headers: { - 'Content-Type': 'application/json', - }, - }).then((response) => response.json()); + ); const deployOnChain = async (serviceHash: ServiceHash): Promise => fetch(`${BACKEND_URL}/services/${serviceHash}/onchain/deploy`, { diff --git a/frontend/types/Autonolas.ts b/frontend/types/Autonolas.ts index 80a1f518b..dfc441581 100644 --- a/frontend/types/Autonolas.ts +++ b/frontend/types/Autonolas.ts @@ -7,4 +7,5 @@ export type StakingRewardsInfo = { isEligibleForRewards: boolean; availableRewardsForEpoch: number; accruedServiceStakingRewards: number; + minimumStakedAmount: number; }; diff --git a/operate/data/contracts/service_staking_token/contract.yaml b/operate/data/contracts/service_staking_token/contract.yaml index 1b1d6b19b..a0a0069a4 100644 --- a/operate/data/contracts/service_staking_token/contract.yaml +++ b/operate/data/contracts/service_staking_token/contract.yaml @@ -7,8 +7,8 @@ license: Apache-2.0 aea_version: '>=1.0.0, <2.0.0' fingerprint: __init__.py: bafybeid3wfzglolebuo6jrrsopswzu4lk77bm76mvw3euizlsjtnt3wmgu - build/ServiceStakingToken.json: bafybeib6frfpqtr4dfyxuylehqmic2iawofydx7u24t7j5zbrsc4m4ijoi - contract.py: bafybeig26jfncdktpl6d46j7gkjernenw2c4hop7i2guadnsha4hnbhywq + build/ServiceStakingToken.json: bafybeifptgh2dpse3l7lscjdvy24t7svqnflj3n2txehu7zerdeaszldsi + contract.py: bafybeiff62bquzeisbd6iptqdjetrhlkt2ut5d7j6md2kqinrqgmbveceu fingerprint_ignore_patterns: [] contracts: [] class_name: ServiceStakingTokenContract diff --git a/operate/data/contracts/uniswap_v2_erc20/contract.yaml b/operate/data/contracts/uniswap_v2_erc20/contract.yaml index 0c99a3faa..311f5cabc 100644 --- a/operate/data/contracts/uniswap_v2_erc20/contract.yaml +++ b/operate/data/contracts/uniswap_v2_erc20/contract.yaml @@ -8,9 +8,7 @@ aea_version: '>=1.0.0, <2.0.0' fingerprint: __init__.py: bafybeia75xbvf6zogcloppdcu2zrwcl6d46ebj2zmm6dkge6eno3k6ysw4 build/IUniswapV2ERC20.json: bafybeid45gy6x5ah5ub5p2obdhph36skpoy5qdhikwwfso7f3655iqnpc4 - contract.py: bafybeidxnb72n5xz4fvvxogbk2xk2vz4jvtsqa3berolr34v7cug3snism - tests/__init__.py: bafybeigj3ngmfmyy4nw4xipxbqnx4nd42aqidqmmduwpx6hurssjqqkirq - tests/test_contract.py: bafybeigaf7kyhuy4qn5dww2r62hffhytab3uhmjummsaiazzvqetvomyi4 + contract.py: bafybeiarfpumhdmxh24xuiv6jprjq5f6qlrfrlxisz5enbvvbhotafp37e fingerprint_ignore_patterns: [] contracts: [] class_name: UniswapV2ERC20Contract diff --git a/package.json b/package.json index ff05c6754..1b6f93913 100644 --- a/package.json +++ b/package.json @@ -55,5 +55,5 @@ "start": "electron .", "build": "rm -rf dist/ && electron-builder build" }, - "version": "0.1.0-rc25" + "version": "0.1.0-rc26" } diff --git a/pyproject.toml b/pyproject.toml index a51ff7043..45d42e3a1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "olas-operate-middleware" -version = "0.1.0-rc25" +version = "0.1.0-rc26" description = "" authors = ["David Vilela ", "Viraj Patel "] readme = "README.md"