Skip to content

Commit 2eb1b06

Browse files
authored
Merge pull request #110 from BootNodeDev/feat/fulfillment-status
2 parents b9fe8b4 + 869c066 commit 2eb1b06

File tree

4 files changed

+119
-44
lines changed

4 files changed

+119
-44
lines changed

typescript/ui/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
"version": "7.1.0",
55
"author": "J M Rossy",
66
"dependencies": {
7+
"@bootnodedev/intents-framework-core": "^0.1.0",
78
"@chakra-ui/next-js": "^2.4.2",
89
"@chakra-ui/react": "^2.8.2",
910
"@cosmjs/cosmwasm-stargate": "^0.32.4",

typescript/ui/src/features/store.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -100,9 +100,14 @@ export const useStore = create<AppState>()(
100100
},
101101
failUnconfirmedTransfers: () => {
102102
set((state) => ({
103-
transfers: state.transfers.map((t) =>
104-
FinalTransferStatuses.includes(t.status) ? t : { ...t, status: TransferStatus.Failed },
105-
),
103+
transfers: state.transfers.map((t) => {
104+
if (t.status === TransferStatus.WaitingForFulfillment && t.orderId) {
105+
return { ...t, status: TransferStatus.Delivered };
106+
}
107+
return FinalTransferStatuses.includes(t.status)
108+
? t
109+
: { ...t, status: TransferStatus.Failed };
110+
}),
106111
}));
107112
},
108113

typescript/ui/src/features/tokens/balances.ts

Lines changed: 29 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1+
import { Hyperlane7683__factory as Hyperlane7683Factory } from '@bootnodedev/intents-framework-core';
2+
import { FilledEvent } from '@bootnodedev/intents-framework-core/dist/src/Base7683';
13
import { IToken, MultiProtocolProvider, Token } from '@hyperlane-xyz/sdk';
2-
import { isValidAddress } from '@hyperlane-xyz/utils';
4+
import { assert, isValidAddress } from '@hyperlane-xyz/utils';
35
import { useAccountAddressForChain } from '@hyperlane-xyz/widgets';
46
import { useQuery } from '@tanstack/react-query';
5-
import { createConfig, getBlockNumber, http, watchContractEvent } from '@wagmi/core';
67
import { toast } from 'react-toastify';
7-
import { defineChain, type Address as ViemAddress } from 'viem';
8+
import { defineChain } from 'viem';
89
import * as viemChains from 'viem/chains';
910
import { chainConfig } from 'viem/op-stack';
1011
import { useToastError } from '../../components/toast/useToastError';
@@ -145,12 +146,6 @@ const abi = [
145146
},
146147
] as const;
147148

148-
function getRpc(chainId: number): string | undefined {
149-
if (chainId === 8453) return 'https://base.drpc.org';
150-
if (chainId === 42161) return 'https://arbitrum.drpc.org';
151-
return;
152-
}
153-
154149
export async function checkOrderFilled({
155150
destination,
156151
orderId,
@@ -162,42 +157,36 @@ export async function checkOrderFilled({
162157
originToken: Token;
163158
multiProvider: MultiProtocolProvider;
164159
}): Promise<string> {
165-
const destinationChainId = multiProvider.getEvmChainId(destination);
160+
const provider = multiProvider.toMultiProvider().getProvider(destination);
161+
const connection = originToken.getConnectionForChain(destination);
166162

167-
const chain = Object.values(chains).find(
168-
(chain) => chain.id === destinationChainId,
169-
)! as viemChains.Chain;
163+
assert(connection?.token.collateralAddressOrDenom, 'No connection found for destination chain');
170164

171-
const config = createConfig({
172-
chains: [chain],
173-
transports: {
174-
[chain.id]: http(getRpc(chain.id)),
175-
},
176-
});
177-
178-
const fromBlock = await getBlockNumber(config);
165+
const contract = Hyperlane7683Factory.connect(
166+
connection.token.collateralAddressOrDenom,
167+
provider,
168+
);
169+
const filter = contract.filters.Filled();
179170

180171
return new Promise((resolve, reject) => {
181-
const connection = originToken?.getConnectionForChain(destination);
182-
183-
const unwatch = watchContractEvent(config, {
184-
address: connection?.token.collateralAddressOrDenom as ViemAddress,
185-
chainId: destinationChainId,
186-
eventName: 'Filled',
187-
fromBlock: fromBlock,
188-
args: { orderId },
189-
abi,
190-
onLogs([{ data, transactionHash }]) {
191-
if (data?.toLowerCase().startsWith(orderId.toLowerCase())) {
192-
// stop listening
193-
unwatch();
194-
resolve(transactionHash);
172+
const intervalId = setInterval(async () => {
173+
try {
174+
const to = await provider.getBlockNumber();
175+
const from = to - 20;
176+
const events = await contract.queryFilter(filter, from, to);
177+
178+
for (const event of events as Array<FilledEvent>) {
179+
const resolvedOrder = event.args.orderId;
180+
181+
if (resolvedOrder === orderId) {
182+
clearInterval(intervalId);
183+
resolve(event.transactionHash);
184+
}
195185
}
196-
},
197-
onError(error) {
198-
unwatch();
186+
} catch (error) {
187+
clearInterval(intervalId);
199188
reject(error);
200-
},
201-
});
189+
}
190+
}, 500);
202191
});
203192
}

typescript/ui/yarn.lock

Lines changed: 81 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -850,6 +850,18 @@ __metadata:
850850
languageName: node
851851
linkType: hard
852852

853+
"@bootnodedev/intents-framework-core@npm:^0.1.0":
854+
version: 0.1.0
855+
resolution: "@bootnodedev/intents-framework-core@npm:0.1.0"
856+
dependencies:
857+
"@hyperlane-xyz/core": "npm:^5.4.1"
858+
"@openzeppelin/contracts": "npm:^4.9.6"
859+
"@uniswap/permit2": "github:Uniswap/permit2"
860+
dotenv-run-script: "npm:^0.4.1"
861+
checksum: 10/f8df5a44e2ba7008e42d5e878ab6b2c57ebad0aaed1e8b134bc4a84d5539d5c62b04f299011435e9e4b2383c218e0d9897aef955c0b03b257ddbf7288242eb46
862+
languageName: node
863+
linkType: hard
864+
853865
"@censo-custody/solana-wallet-adapter@npm:^0.1.0":
854866
version: 0.1.0
855867
resolution: "@censo-custody/solana-wallet-adapter@npm:0.1.0"
@@ -3687,6 +3699,25 @@ __metadata:
36873699
languageName: node
36883700
linkType: hard
36893701

3702+
"@hyperlane-xyz/core@npm:^5.4.1":
3703+
version: 5.11.4
3704+
resolution: "@hyperlane-xyz/core@npm:5.11.4"
3705+
dependencies:
3706+
"@arbitrum/nitro-contracts": "npm:^1.2.1"
3707+
"@eth-optimism/contracts": "npm:^0.6.0"
3708+
"@hyperlane-xyz/utils": "npm:8.7.0"
3709+
"@layerzerolabs/lz-evm-oapp-v2": "npm:2.0.2"
3710+
"@openzeppelin/contracts": "npm:^4.9.3"
3711+
"@openzeppelin/contracts-upgradeable": "npm:^4.9.3"
3712+
fx-portal: "npm:^1.0.3"
3713+
peerDependencies:
3714+
"@ethersproject/abi": "*"
3715+
"@ethersproject/providers": "*"
3716+
"@types/sinon-chai": "*"
3717+
checksum: 10/85f953cc4967f06ac08f31244b3262000a7185df709cd304a0ad8a85332010dd10ce128d4920ae631e5e75e79d6a872e977e507e1f0f14391ca948b5824c4fac
3718+
languageName: node
3719+
linkType: hard
3720+
36903721
"@hyperlane-xyz/registry@npm:9.7.0":
36913722
version: 9.7.0
36923723
resolution: "@hyperlane-xyz/registry@npm:9.7.0"
@@ -4014,10 +4045,26 @@ __metadata:
40144045
languageName: node
40154046
linkType: hard
40164047

4048+
"@hyperlane-xyz/utils@npm:8.7.0":
4049+
version: 8.7.0
4050+
resolution: "@hyperlane-xyz/utils@npm:8.7.0"
4051+
dependencies:
4052+
"@cosmjs/encoding": "npm:^0.32.4"
4053+
"@solana/web3.js": "npm:^1.95.4"
4054+
bignumber.js: "npm:^9.1.1"
4055+
ethers: "npm:^5.7.2"
4056+
lodash-es: "npm:^4.17.21"
4057+
pino: "npm:^8.19.0"
4058+
yaml: "npm:2.4.5"
4059+
checksum: 10/90aaf687e59ae012e610f07727a16447cff54fd0f3f6b53792949e8cec88277092be53b04974d1974d1f49fb9393bdd3bfb0c17eeef563bcca6bb1421003d977
4060+
languageName: node
4061+
linkType: hard
4062+
40174063
"@hyperlane-xyz/warp-ui-template@workspace:.":
40184064
version: 0.0.0-use.local
40194065
resolution: "@hyperlane-xyz/warp-ui-template@workspace:."
40204066
dependencies:
4067+
"@bootnodedev/intents-framework-core": "npm:^0.1.0"
40214068
"@chakra-ui/next-js": "npm:^2.4.2"
40224069
"@chakra-ui/react": "npm:^2.8.2"
40234070
"@cosmjs/cosmwasm-stargate": "npm:^0.32.4"
@@ -5473,7 +5520,7 @@ __metadata:
54735520
languageName: node
54745521
linkType: hard
54755522

5476-
"@openzeppelin/contracts@npm:^4.2.0":
5523+
"@openzeppelin/contracts@npm:^4.2.0, @openzeppelin/contracts@npm:^4.9.6":
54775524
version: 4.9.6
54785525
resolution: "@openzeppelin/contracts@npm:4.9.6"
54795526
checksum: 10/71f45ad42e68c0559be4ba502115462a01c76fc805c08d3005c10b5550a093f1a2b00b2d7e9d6d1f331e147c50fd4ad832f71c4470ec5b34f5a2d0751cd19a47
@@ -9927,6 +9974,13 @@ __metadata:
99279974
languageName: node
99289975
linkType: hard
99299976

9977+
"@uniswap/permit2@github:Uniswap/permit2":
9978+
version: 1.0.0
9979+
resolution: "@uniswap/permit2@https://github.com/Uniswap/permit2.git#commit=cc56ad0f3439c502c246fc5cfcc3db92bb8b7219"
9980+
checksum: 10/746891ef1b7e494eada03caf4818223d21c15558c1932111dbdf6584bc632188e9e333685b09ec3f29e9238c11e4246adabefa222a0ae8cc4e11e9a1fc093c38
9981+
languageName: node
9982+
linkType: hard
9983+
99309984
"@vanilla-extract/css@npm:1.15.5":
99319985
version: 1.15.5
99329986
resolution: "@vanilla-extract/css@npm:1.15.5"
@@ -13011,6 +13065,32 @@ __metadata:
1301113065
languageName: node
1301213066
linkType: hard
1301313067

13068+
"dotenv-expand@npm:^10.0.0":
13069+
version: 10.0.0
13070+
resolution: "dotenv-expand@npm:10.0.0"
13071+
checksum: 10/b41eb278bc96b92cbf3037ca5f3d21e8845bf165dc06b6f9a0a03d278c2bd5a01c0cfbb3528ae3a60301ba1a8a9cace30e748c54b460753bc00d4c014b675597
13072+
languageName: node
13073+
linkType: hard
13074+
13075+
"dotenv-run-script@npm:^0.4.1":
13076+
version: 0.4.1
13077+
resolution: "dotenv-run-script@npm:0.4.1"
13078+
dependencies:
13079+
dotenv: "npm:^16.3.1"
13080+
dotenv-expand: "npm:^10.0.0"
13081+
bin:
13082+
dotenv-run-script: bin/dotenv-run-script
13083+
checksum: 10/dc0ec2b3bfbc5d01c32c937c24e6a6e4e910b6c95119dfd57d206a8c77f389a5f0512d68d4ec6e716e5afd3f1f799cc7d2e4a944b0334df781510f8aed0e5bd0
13084+
languageName: node
13085+
linkType: hard
13086+
13087+
"dotenv@npm:^16.3.1":
13088+
version: 16.4.7
13089+
resolution: "dotenv@npm:16.4.7"
13090+
checksum: 10/f13bfe97db88f0df4ec505eeffb8925ec51f2d56a3d0b6d916964d8b4af494e6fb1633ba5d09089b552e77ab2a25de58d70259b2c5ed45ec148221835fc99a0c
13091+
languageName: node
13092+
linkType: hard
13093+
1301413094
"duplexer@npm:^0.1.2":
1301513095
version: 0.1.2
1301613096
resolution: "duplexer@npm:0.1.2"

0 commit comments

Comments
 (0)