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"