@iexec/web3telegram
Version:
Enables secure, blockchain-based messaging by encrypting Telegram user IDs for privacy. It lets users message Ethereum account holders without knowing their Telegram details.
89 lines (79 loc) • 2.31 kB
text/typescript
import { Address, BN } from 'iexec';
import { PublishedWorkerpoolorder } from 'iexec/IExecOrderbookModule';
type VoucherInfo = {
owner: Address;
address: Address;
type: BN;
balance: BN;
expirationTimestamp: BN;
sponsoredApps: Address[];
sponsoredDatasets: Address[];
sponsoredWorkerpools: Address[];
allowanceAmount: BN;
authorizedAccounts: Address[];
};
function bnToNumber(bn: BN) {
return Number(bn.toString());
}
export function checkUserVoucher({
userVoucher,
}: {
userVoucher: VoucherInfo;
}) {
if (bnToNumber(userVoucher.expirationTimestamp) < Date.now() / 1000) {
throw new Error(
'Oops, it seems your voucher has expired. You might want to ask for a top up. Check on https://builder.iex.ec/'
);
}
if (bnToNumber(userVoucher.balance) === 0) {
throw new Error(
'Oops, it seems your voucher is empty. You might want to ask for a top up. Check on https://builder.iex.ec/'
);
}
}
export function filterWorkerpoolOrders({
workerpoolOrders,
workerpoolMaxPrice,
useVoucher,
userVoucher,
}: {
workerpoolOrders: PublishedWorkerpoolorder[];
workerpoolMaxPrice: number;
useVoucher: boolean;
userVoucher?: VoucherInfo;
}) {
if (workerpoolOrders.length === 0) {
return null;
}
let eligibleWorkerpoolOrders = [...workerpoolOrders];
let maxVoucherSponsoredAmount = 0; // may be safer to use bigint
if (useVoucher) {
if (!userVoucher) {
throw new Error(
'useVoucher === true but userVoucher is undefined? Hum...'
);
}
// only voucher sponsored workerpoolorders
eligibleWorkerpoolOrders = eligibleWorkerpoolOrders.filter(({ order }) =>
userVoucher.sponsoredWorkerpools.includes(order.workerpool)
);
if (eligibleWorkerpoolOrders.length === 0) {
throw new Error(
'Found some workerpool orders but none can be sponsored by your voucher.'
);
}
maxVoucherSponsoredAmount = bnToNumber(userVoucher.balance);
}
const [cheapestOrder] = eligibleWorkerpoolOrders.sort(
(order1, order2) =>
order1.order.workerpoolprice - order2.order.workerpoolprice
);
if (
!cheapestOrder ||
cheapestOrder.order.workerpoolprice >
workerpoolMaxPrice + maxVoucherSponsoredAmount
) {
return null;
}
return cheapestOrder.order;
}