Skip to content
Closed
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 56 additions & 0 deletions .github/workflows/publish-github-packages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,62 @@ jobs:
done
' _ {} \;

- name: Update inter-package dependencies
run: |
echo "Updating inter-package dependencies to use new versions..."

# Create a map of package names to their new versions
declare -A package_versions

# Read all package.json files and extract name and version
for package_json in packages/*/package.json; do
if [ -f "$package_json" ]; then
# Extract package name and version using node
name=$(node -p "require('./$package_json').name")
version=$(node -p "require('./$package_json').version")
echo "Found package: $name@$version"
package_versions["$name"]="$version"
fi
done

# Update dependencies in all package.json files
for package_json in packages/*/package.json; do
if [ -f "$package_json" ]; then
echo "Updating dependencies in $package_json"

# Create a temporary Node.js script to update dependencies
node -e "
const fs = require('fs');
const packageJson = JSON.parse(fs.readFileSync('$package_json', 'utf8'));
const packageVersions = $(declare -p package_versions | sed 's/declare -A package_versions=//' | sed 's/\[\([^]]*\)\]=/[\"\1\"]=/g' | sed 's/^(/{\"/; s/$/}/' | sed 's/ \[\"/,\"/g' | sed 's/\]=/\":/g' | sed 's/ /,\"/g');

let updated = false;

// Update dependencies
['dependencies', 'devDependencies', 'peerDependencies'].forEach(depType => {
if (packageJson[depType]) {
Object.keys(packageJson[depType]).forEach(depName => {
if (packageVersions[depName]) {
console.log(\`Updating \${depType}.\${depName} from \${packageJson[depType][depName]} to \${packageVersions[depName]}\`);
packageJson[depType][depName] = packageVersions[depName];
updated = true;
}
});
}
});

if (updated) {
fs.writeFileSync('$package_json', JSON.stringify(packageJson, null, 2) + '\n');
console.log('Updated $package_json');
} else {
console.log('No updates needed for $package_json');
}
" 2>/dev/null || echo "Warning: Could not update $package_json"
fi
done

echo "Inter-package dependency update completed."

- name: Publish packages to GitHub Packages
run: |
# Publish all packages and capture versions
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -289,47 +289,58 @@ adapterNames.forEach((adapterName) => {
})

it('should respect timeout options', async () => {
jest.useFakeTimers()

// Make one provider fast, others slow (will timeout)
mockProvider.getQuote = jest.fn().mockImplementation(async () => {
await new Promise((resolve) => setTimeout(resolve, 10)) // 10ms delay - fast
return {
...bridgeQuoteResult,
amountsAndCosts: {
...bridgeQuoteResult.amountsAndCosts,
afterSlippage: {
...bridgeQuoteResult.amountsAndCosts.afterSlippage,
buyAmount: BigInt('50000000000000000000'), // 50 ETH
},
},
}
return new Promise((resolve) => {
setTimeout(() => {
resolve({
...bridgeQuoteResult,
amountsAndCosts: {
...bridgeQuoteResult.amountsAndCosts,
afterSlippage: {
...bridgeQuoteResult.amountsAndCosts.afterSlippage,
buyAmount: BigInt('50000000000000000000'), // 50 ETH
},
},
})
}, 10) // 10ms delay - fast
})
})

mockProvider2.getQuote = jest.fn().mockImplementation(async () => {
await new Promise((resolve) => setTimeout(resolve, 200)) // 200ms delay - slow
return {
...bridgeQuoteResult,
amountsAndCosts: {
...bridgeQuoteResult.amountsAndCosts,
afterSlippage: {
...bridgeQuoteResult.amountsAndCosts.afterSlippage,
buyAmount: BigInt('40000000000000000000'), // 40 ETH
},
},
}
return new Promise((resolve) => {
setTimeout(() => {
resolve({
...bridgeQuoteResult,
amountsAndCosts: {
...bridgeQuoteResult.amountsAndCosts,
afterSlippage: {
...bridgeQuoteResult.amountsAndCosts.afterSlippage,
buyAmount: BigInt('40000000000000000000'), // 40 ETH
},
},
})
}, 200) // 200ms delay - slow
})
})

mockProvider3.getQuote = jest.fn().mockImplementation(async () => {
await new Promise((resolve) => setTimeout(resolve, 200)) // 200ms delay - slow
return {
...bridgeQuoteResult,
amountsAndCosts: {
...bridgeQuoteResult.amountsAndCosts,
afterSlippage: {
...bridgeQuoteResult.amountsAndCosts.afterSlippage,
buyAmount: BigInt('60000000000000000000'), // 60 ETH
},
},
}
return new Promise((resolve) => {
setTimeout(() => {
resolve({
...bridgeQuoteResult,
amountsAndCosts: {
...bridgeQuoteResult.amountsAndCosts,
afterSlippage: {
...bridgeQuoteResult.amountsAndCosts.afterSlippage,
buyAmount: BigInt('60000000000000000000'), // 60 ETH
},
},
})
}, 200) // 200ms delay - slow
})
})

const request = {
Expand All @@ -342,16 +353,18 @@ adapterNames.forEach((adapterName) => {
},
}

const startTime = Date.now()
const result = await strategy.execute(request, config)
const elapsed = Date.now() - startTime
const resultPromise = strategy.execute(request, config)

// Should complete around timeout time or earlier
expect(elapsed).toBeLessThan(150) // Should not wait for slow providers
// Advance timers past the fast provider delay but before slow providers
jest.advanceTimersByTime(50)

const result = await resultPromise

// Should still return the quote from the fast provider
expect(result).toBeTruthy()
expect(result?.providerDappId).toBe('mockProvider')

jest.useRealTimers()
})

it('should throw error for unknown provider dappId', async () => {
Expand Down
7 changes: 6 additions & 1 deletion packages/trading/src/consts.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
import { EcdsaSigningScheme, SigningScheme } from '@cowprotocol/sdk-order-book'
import { mapSupportedNetworks, SupportedChainId } from '@cowprotocol/sdk-config'
import { CowEnv, mapSupportedNetworks, SupportedChainId } from '@cowprotocol/sdk-config'

export const BFF_ENDPOINTS: Record<CowEnv, string> = {
prod: 'https://bff.cow.fi',
staging: 'https://bff.barn.cow.fi',
}

export const DEFAULT_QUOTE_VALIDITY = 60 * 30 // 30 min

Expand Down
Loading