diff --git a/packages/sdk/src/types.ts b/packages/sdk/src/types.ts index d5b4463..93f3ecd 100644 --- a/packages/sdk/src/types.ts +++ b/packages/sdk/src/types.ts @@ -76,6 +76,7 @@ export interface Solution { name: string; }; transaction: Transaction; + approvals?: Transaction[]; } export interface Transaction { diff --git a/web/src/lib/components/TransactionCard.svelte b/web/src/lib/components/TransactionCard.svelte index 687302f..c15077d 100644 --- a/web/src/lib/components/TransactionCard.svelte +++ b/web/src/lib/components/TransactionCard.svelte @@ -51,21 +51,31 @@ // @ts-expect-error // chainId is missing in web3js call options type const callOptions: NonPayableCallOptions = { chainId: quotaRecord.sourceChain }; + console.info('Quote', quotaRecord); + // Approval sniff etc...\ - const erc20 = new web3.eth.Contract(erc20Abi, quotaRecord.sourceTokenAddress); + if (quotaRecord.approvals?.length > 0) { + for (const approval of quotaRecord.approvals) { + console.log('Requesting approval:', approval); + const receipt = await web3.eth.sendTransaction(approval); + console.warn(`Approval receipt: `, receipt); + } + } else { + const erc20 = new web3.eth.Contract(erc20Abi, quotaRecord.sourceTokenAddress); - const allowed = await erc20.methods - .allowance(ownerAddress, quotaRecord.transaction.to) - .call(callOptions); + const allowed = await erc20.methods + .allowance(ownerAddress, quotaRecord.transaction.to) + .call(callOptions); - if (BigInt(quotaRecord.amount) > BigInt(allowed)) { - const approval = await erc20.methods - .approve(quotaRecord.transaction.to, quotaRecord.amount) - .send({ - ...callOptions, - from: ownerAddress - }); - if (!approval.status) throw new Error('Not Approved!'); // To stop execution + if (BigInt(quotaRecord.amount) > BigInt(allowed)) { + const approval = await erc20.methods + .approve(quotaRecord.transaction.to, quotaRecord.amount) + .send({ + ...callOptions, + from: ownerAddress + }); + if (!approval.status) throw new Error('Not Approved!'); // To stop execution + } } // FINAL STEP!