@xyo-network/payloadset-plugins 8.0.1 → 8.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/dist/browser/modules/crypto-asset/Diviner.d.ts.map +1 -1
  2. package/dist/browser/modules/crypto-asset/lib/divinePrices.d.ts +1 -1
  3. package/dist/browser/modules/crypto-asset/lib/divinePrices.d.ts.map +1 -1
  4. package/dist/browser/modules/crypto-asset/lib/divineUniswapPrices.d.ts +6 -1
  5. package/dist/browser/modules/crypto-asset/lib/divineUniswapPrices.d.ts.map +1 -1
  6. package/dist/browser/modules/crypto-asset/lib/uniswapQuotes.d.ts +11 -0
  7. package/dist/browser/modules/crypto-asset/lib/uniswapQuotes.d.ts.map +1 -0
  8. package/dist/browser/modules/crypto-asset/lib/usdPricesFromQuotes.d.ts +8 -0
  9. package/dist/browser/modules/crypto-asset/lib/usdPricesFromQuotes.d.ts.map +1 -0
  10. package/dist/browser/modules/crypto-asset/test/buildUniswapPayload.d.ts +5 -0
  11. package/dist/browser/modules/crypto-asset/test/buildUniswapPayload.d.ts.map +1 -0
  12. package/dist/browser/modules/crypto-asset/test/index.d.ts +4 -0
  13. package/dist/browser/modules/crypto-asset/test/index.d.ts.map +1 -1
  14. package/dist/browser/modules/crypto-asset/test/sampleCryptoAssetReference.d.ts +8 -0
  15. package/dist/browser/modules/crypto-asset/test/sampleCryptoAssetReference.d.ts.map +1 -0
  16. package/dist/browser/modules/crypto-asset/test/sampleUniswapV3.d.ts +3 -0
  17. package/dist/browser/modules/crypto-asset/test/sampleUniswapV3.d.ts.map +1 -0
  18. package/dist/browser/modules/crypto-asset/test/sampleUniswapV4.d.ts +3 -0
  19. package/dist/browser/modules/crypto-asset/test/sampleUniswapV4.d.ts.map +1 -0
  20. package/dist/browser/modules/uniswap-v3-crypto-market/lib/UniswapV3CryptoAssetPools.d.ts +7 -0
  21. package/dist/browser/modules/uniswap-v3-crypto-market/lib/UniswapV3CryptoAssetPools.d.ts.map +1 -0
  22. package/dist/browser/modules/uniswap-v3-crypto-market/lib/index.d.ts +1 -0
  23. package/dist/browser/modules/uniswap-v3-crypto-market/lib/index.d.ts.map +1 -1
  24. package/dist/browser/modules/uniswap-v4-crypto-market/lib/UniswapV4DefaultPools.d.ts +4 -0
  25. package/dist/browser/modules/uniswap-v4-crypto-market/lib/UniswapV4DefaultPools.d.ts.map +1 -1
  26. package/dist/browser/modules/uniswap-v4-crypto-market/lib/getExchangeRate.d.ts +2 -1
  27. package/dist/browser/modules/uniswap-v4-crypto-market/lib/getExchangeRate.d.ts.map +1 -1
  28. package/dist/browser/modules/uniswap-v4-crypto-market/lib/getPriceFromSqrtX96.d.ts.map +1 -1
  29. package/dist/browser/modules/uniswap-v4-crypto-market/lib/pricesFromUniswapV4.d.ts +6 -1
  30. package/dist/browser/modules/uniswap-v4-crypto-market/lib/pricesFromUniswapV4.d.ts.map +1 -1
  31. package/dist/neutral/crypto-asset.mjs +115 -42
  32. package/dist/neutral/crypto-asset.mjs.map +4 -4
  33. package/dist/neutral/modules/crypto-asset/Diviner.d.ts.map +1 -1
  34. package/dist/neutral/modules/crypto-asset/lib/divinePrices.d.ts +1 -1
  35. package/dist/neutral/modules/crypto-asset/lib/divinePrices.d.ts.map +1 -1
  36. package/dist/neutral/modules/crypto-asset/lib/divineUniswapPrices.d.ts +6 -1
  37. package/dist/neutral/modules/crypto-asset/lib/divineUniswapPrices.d.ts.map +1 -1
  38. package/dist/neutral/modules/crypto-asset/lib/uniswapQuotes.d.ts +11 -0
  39. package/dist/neutral/modules/crypto-asset/lib/uniswapQuotes.d.ts.map +1 -0
  40. package/dist/neutral/modules/crypto-asset/lib/usdPricesFromQuotes.d.ts +8 -0
  41. package/dist/neutral/modules/crypto-asset/lib/usdPricesFromQuotes.d.ts.map +1 -0
  42. package/dist/neutral/modules/crypto-asset/test/buildUniswapPayload.d.ts +5 -0
  43. package/dist/neutral/modules/crypto-asset/test/buildUniswapPayload.d.ts.map +1 -0
  44. package/dist/neutral/modules/crypto-asset/test/index.d.ts +4 -0
  45. package/dist/neutral/modules/crypto-asset/test/index.d.ts.map +1 -1
  46. package/dist/neutral/modules/crypto-asset/test/sampleCryptoAssetReference.d.ts +8 -0
  47. package/dist/neutral/modules/crypto-asset/test/sampleCryptoAssetReference.d.ts.map +1 -0
  48. package/dist/neutral/modules/crypto-asset/test/sampleUniswapV3.d.ts +3 -0
  49. package/dist/neutral/modules/crypto-asset/test/sampleUniswapV3.d.ts.map +1 -0
  50. package/dist/neutral/modules/crypto-asset/test/sampleUniswapV4.d.ts +3 -0
  51. package/dist/neutral/modules/crypto-asset/test/sampleUniswapV4.d.ts.map +1 -0
  52. package/dist/neutral/modules/uniswap-v3-crypto-market/lib/UniswapV3CryptoAssetPools.d.ts +7 -0
  53. package/dist/neutral/modules/uniswap-v3-crypto-market/lib/UniswapV3CryptoAssetPools.d.ts.map +1 -0
  54. package/dist/neutral/modules/uniswap-v3-crypto-market/lib/index.d.ts +1 -0
  55. package/dist/neutral/modules/uniswap-v3-crypto-market/lib/index.d.ts.map +1 -1
  56. package/dist/neutral/modules/uniswap-v4-crypto-market/lib/UniswapV4DefaultPools.d.ts +4 -0
  57. package/dist/neutral/modules/uniswap-v4-crypto-market/lib/UniswapV4DefaultPools.d.ts.map +1 -1
  58. package/dist/neutral/modules/uniswap-v4-crypto-market/lib/getExchangeRate.d.ts +2 -1
  59. package/dist/neutral/modules/uniswap-v4-crypto-market/lib/getExchangeRate.d.ts.map +1 -1
  60. package/dist/neutral/modules/uniswap-v4-crypto-market/lib/getPriceFromSqrtX96.d.ts.map +1 -1
  61. package/dist/neutral/modules/uniswap-v4-crypto-market/lib/pricesFromUniswapV4.d.ts +6 -1
  62. package/dist/neutral/modules/uniswap-v4-crypto-market/lib/pricesFromUniswapV4.d.ts.map +1 -1
  63. package/dist/neutral/uniswap-v3-crypto-market.mjs +21 -0
  64. package/dist/neutral/uniswap-v3-crypto-market.mjs.map +3 -3
  65. package/dist/neutral/uniswap-v4-crypto-market.mjs +99 -17
  66. package/dist/neutral/uniswap-v4-crypto-market.mjs.map +2 -2
  67. package/dist/node/modules/crypto-asset/Diviner.d.ts.map +1 -1
  68. package/dist/node/modules/crypto-asset/lib/divinePrices.d.ts +1 -1
  69. package/dist/node/modules/crypto-asset/lib/divinePrices.d.ts.map +1 -1
  70. package/dist/node/modules/crypto-asset/lib/divineUniswapPrices.d.ts +6 -1
  71. package/dist/node/modules/crypto-asset/lib/divineUniswapPrices.d.ts.map +1 -1
  72. package/dist/node/modules/crypto-asset/lib/uniswapQuotes.d.ts +11 -0
  73. package/dist/node/modules/crypto-asset/lib/uniswapQuotes.d.ts.map +1 -0
  74. package/dist/node/modules/crypto-asset/lib/usdPricesFromQuotes.d.ts +8 -0
  75. package/dist/node/modules/crypto-asset/lib/usdPricesFromQuotes.d.ts.map +1 -0
  76. package/dist/node/modules/crypto-asset/test/buildUniswapPayload.d.ts +5 -0
  77. package/dist/node/modules/crypto-asset/test/buildUniswapPayload.d.ts.map +1 -0
  78. package/dist/node/modules/crypto-asset/test/index.d.ts +4 -0
  79. package/dist/node/modules/crypto-asset/test/index.d.ts.map +1 -1
  80. package/dist/node/modules/crypto-asset/test/sampleCryptoAssetReference.d.ts +8 -0
  81. package/dist/node/modules/crypto-asset/test/sampleCryptoAssetReference.d.ts.map +1 -0
  82. package/dist/node/modules/crypto-asset/test/sampleUniswapV3.d.ts +3 -0
  83. package/dist/node/modules/crypto-asset/test/sampleUniswapV3.d.ts.map +1 -0
  84. package/dist/node/modules/crypto-asset/test/sampleUniswapV4.d.ts +3 -0
  85. package/dist/node/modules/crypto-asset/test/sampleUniswapV4.d.ts.map +1 -0
  86. package/dist/node/modules/uniswap-v3-crypto-market/lib/UniswapV3CryptoAssetPools.d.ts +7 -0
  87. package/dist/node/modules/uniswap-v3-crypto-market/lib/UniswapV3CryptoAssetPools.d.ts.map +1 -0
  88. package/dist/node/modules/uniswap-v3-crypto-market/lib/index.d.ts +1 -0
  89. package/dist/node/modules/uniswap-v3-crypto-market/lib/index.d.ts.map +1 -1
  90. package/dist/node/modules/uniswap-v4-crypto-market/lib/UniswapV4DefaultPools.d.ts +4 -0
  91. package/dist/node/modules/uniswap-v4-crypto-market/lib/UniswapV4DefaultPools.d.ts.map +1 -1
  92. package/dist/node/modules/uniswap-v4-crypto-market/lib/getExchangeRate.d.ts +2 -1
  93. package/dist/node/modules/uniswap-v4-crypto-market/lib/getExchangeRate.d.ts.map +1 -1
  94. package/dist/node/modules/uniswap-v4-crypto-market/lib/getPriceFromSqrtX96.d.ts.map +1 -1
  95. package/dist/node/modules/uniswap-v4-crypto-market/lib/pricesFromUniswapV4.d.ts +6 -1
  96. package/dist/node/modules/uniswap-v4-crypto-market/lib/pricesFromUniswapV4.d.ts.map +1 -1
  97. package/package.json +9 -9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usdPricesFromQuotes.d.ts","sourceRoot":"","sources":["../../../../../src/modules/crypto-asset/lib/usdPricesFromQuotes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AA6BtD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAsB/E"}
@@ -0,0 +1,5 @@
1
+ import type { UniswapCryptoMarketPayload, UniswapCryptoPair } from '@xyo-network/payload-plugins/uniswap-crypto-market';
2
+ /** A pool pair in which one `base` is worth `rate` of `quote` */
3
+ export declare const uniswapPair: (base: string, rate: number, quote: string) => UniswapCryptoPair;
4
+ export declare const uniswapPayload: (...pairs: UniswapCryptoPair[]) => UniswapCryptoMarketPayload;
5
+ //# sourceMappingURL=buildUniswapPayload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildUniswapPayload.d.ts","sourceRoot":"","sources":["../../../../../src/modules/crypto-asset/test/buildUniswapPayload.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,MAAM,oDAAoD,CAAA;AAGvH,iEAAiE;AACjE,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,EAAE,MAAM,MAAM,EAAE,OAAO,MAAM,KAAG,iBAStE,CAAA;AAEF,eAAO,MAAM,cAAc,GAAI,GAAG,OAAO,iBAAiB,EAAE,KAAG,0BAE7D,CAAA"}
@@ -1,3 +1,7 @@
1
+ export * from './buildUniswapPayload.js';
1
2
  export * from './sampleCoinGecko.js';
3
+ export * from './sampleCryptoAssetReference.js';
2
4
  export * from './sampleUniswap.js';
5
+ export * from './sampleUniswapV3.js';
6
+ export * from './sampleUniswapV4.js';
3
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/modules/crypto-asset/test/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA;AACpC,cAAc,oBAAoB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/modules/crypto-asset/test/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAA;AACxC,cAAc,sBAAsB,CAAA;AACpC,cAAc,iCAAiC,CAAA;AAC/C,cAAc,oBAAoB,CAAA;AAClC,cAAc,sBAAsB,CAAA;AACpC,cAAc,sBAAsB,CAAA"}
@@ -0,0 +1,8 @@
1
+ import type { CryptoMarketAssetPayload } from '@xyo-network/payload-plugins/crypto-asset';
2
+ /**
3
+ * The last aggregate the automation witness divined with CoinGecko prices (2026-09-29T08:09:03Z),
4
+ * archived as aa58d5900e8cb072a5f95946c205c1c70ef9b550361343d6d94d73a66ceb8b00. All but xl1 and xyo
5
+ * are CoinGecko prices alone; those two blend in the XYO:USDT and XL1:USDT Uniswap V4 pools.
6
+ */
7
+ export declare const sampleCryptoAssetReference: CryptoMarketAssetPayload;
8
+ //# sourceMappingURL=sampleCryptoAssetReference.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sampleCryptoAssetReference.d.ts","sourceRoot":"","sources":["../../../../../src/modules/crypto-asset/test/sampleCryptoAssetReference.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2CAA2C,CAAA;AAGzF;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,EAAE,wBAiExC,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { UniswapCryptoMarketPayload } from '@xyo-network/payload-plugins/uniswap-crypto-market';
2
+ export declare const sampleUniswapV3Payload: UniswapCryptoMarketPayload;
3
+ //# sourceMappingURL=sampleUniswapV3.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sampleUniswapV3.d.ts","sourceRoot":"","sources":["../../../../../src/modules/crypto-asset/test/sampleUniswapV3.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,oDAAoD,CAAA;AAIpG,eAAO,MAAM,sBAAsB,EAAE,0BAqHpC,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { UniswapCryptoMarketPayload } from '@xyo-network/payload-plugins/uniswap-crypto-market';
2
+ export declare const sampleUniswapV4Payload: UniswapCryptoMarketPayload;
3
+ //# sourceMappingURL=sampleUniswapV4.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sampleUniswapV4.d.ts","sourceRoot":"","sources":["../../../../../src/modules/crypto-asset/test/sampleUniswapV4.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,oDAAoD,CAAA;AAIpG,eAAO,MAAM,sBAAsB,EAAE,0BAmIpC,CAAA"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Deep mainnet pools for pricing the crypto asset aggregate (network.xyo.crypto.asset),
3
+ * each at its pair's lowest fee tier with real depth. Unlike UniswapPoolContracts, this
4
+ * leaves out the thinly traded XYO pools, which would skew the XYO price.
5
+ */
6
+ export declare const UniswapV3CryptoAssetPools: string[];
7
+ //# sourceMappingURL=UniswapV3CryptoAssetPools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UniswapV3CryptoAssetPools.d.ts","sourceRoot":"","sources":["../../../../../src/modules/uniswap-v3-crypto-market/lib/UniswapV3CryptoAssetPools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,UASrC,CAAA"}
@@ -3,5 +3,6 @@ export * from './pricesFromUniswap3.js';
3
3
  export * from './UniSwap3Pair.js';
4
4
  export * from './Uniswap3PoolSlot0Wrapper.js';
5
5
  export * from './UniswapPoolContracts.js';
6
+ export * from './UniswapV3CryptoAssetPools.js';
6
7
  export * from './UniswapV3Slot0Fields.js';
7
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/modules/uniswap-v3-crypto-market/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,iCAAiC,CAAA;AAC/C,cAAc,yBAAyB,CAAA;AACvC,cAAc,mBAAmB,CAAA;AACjC,cAAc,+BAA+B,CAAA;AAC7C,cAAc,2BAA2B,CAAA;AACzC,cAAc,2BAA2B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/modules/uniswap-v3-crypto-market/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,iCAAiC,CAAA;AAC/C,cAAc,yBAAyB,CAAA;AACvC,cAAc,mBAAmB,CAAA;AACjC,cAAc,+BAA+B,CAAA;AAC7C,cAAc,2BAA2B,CAAA;AACzC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,2BAA2B,CAAA"}
@@ -1,4 +1,8 @@
1
1
  import type { TokenPairPoolKey, TokenParameters } from '../types/index.js';
2
2
  export declare const TokenRegistry: Record<string, TokenParameters>;
3
+ /**
4
+ * Hookless mainnet pools. Beyond XYO and XL1, each pair uses its lowest fee tier with real
5
+ * depth: low-fee pools are arbitraged more tightly, so they track the market more closely.
6
+ */
3
7
  export declare const UniswapV4DefaultPools: Record<string, TokenPairPoolKey>;
4
8
  //# sourceMappingURL=UniswapV4DefaultPools.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"UniswapV4DefaultPools.d.ts","sourceRoot":"","sources":["../../../../../src/modules/uniswap-v4-crypto-market/lib/UniswapV4DefaultPools.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAE1E,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAmBhD,CAAA;AAEV,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAazD,CAAA"}
1
+ {"version":3,"file":"UniswapV4DefaultPools.d.ts","sourceRoot":"","sources":["../../../../../src/modules/uniswap-v4-crypto-market/lib/UniswapV4DefaultPools.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAE1E,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAmDhD,CAAA;AAEV;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAwDzD,CAAA"}
@@ -5,9 +5,10 @@ import type { Token } from '../../uniswap-token/index.js';
5
5
  * @param tokenA The first token in the pair.
6
6
  * @param tokenB The second token in the pair.
7
7
  * @param fee The fee tier for the pool.
8
+ * @param tickSpacing The tick spacing for the pool.
8
9
  * @param hookAddress The address of the hook contract. Default is ZeroAddress.
9
10
  * @param provider The EVM provider to use for the transaction.
10
11
  * @returns The price of the token pair.
11
12
  */
12
- export declare const getExchangeRate: (tokenA: Token, tokenB: Token, fee: number, hookAddress: string | undefined, provider: Provider) => Promise<number>;
13
+ export declare const getExchangeRate: (tokenA: Token, tokenB: Token, fee: number, tickSpacing: number, hookAddress: string | undefined, provider: Provider) => Promise<number>;
13
14
  //# sourceMappingURL=getExchangeRate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getExchangeRate.d.ts","sourceRoot":"","sources":["../../../../../src/modules/uniswap-v4-crypto-market/lib/getExchangeRate.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAEhD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAO3C;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,GAC1B,QAAQ,KAAK,EACb,QAAQ,KAAK,EACb,KAAK,MAAM,EACX,aAAa,MAAM,GAAG,SAAS,EAC/B,UAAU,QAAQ,KACjB,OAAO,CAAC,MAAM,CAYhB,CAAA"}
1
+ {"version":3,"file":"getExchangeRate.d.ts","sourceRoot":"","sources":["../../../../../src/modules/uniswap-v4-crypto-market/lib/getExchangeRate.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAEhD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAO3C;;;;;;;;;GASG;AACH,eAAO,MAAM,eAAe,GAC1B,QAAQ,KAAK,EACb,QAAQ,KAAK,EACb,KAAK,MAAM,EACX,aAAa,MAAM,EACnB,aAAa,MAAM,GAAG,SAAS,EAC/B,UAAU,QAAQ,KACjB,OAAO,CAAC,MAAM,CAchB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"getPriceFromSqrtX96.d.ts","sourceRoot":"","sources":["../../../../../src/modules/uniswap-v4-crypto-market/lib/getPriceFromSqrtX96.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,GAAI,cAAc,MAAM,EAAE,WAAW,MAAM,EAAE,WAAW,MAAM,KAAG,MAkBhG,CAAA"}
1
+ {"version":3,"file":"getPriceFromSqrtX96.d.ts","sourceRoot":"","sources":["../../../../../src/modules/uniswap-v4-crypto-market/lib/getPriceFromSqrtX96.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,GAAI,cAAc,MAAM,EAAE,WAAW,MAAM,EAAE,WAAW,MAAM,KAAG,MAKhG,CAAA"}
@@ -1,5 +1,10 @@
1
+ import type { Logger } from '@ariestools/sdk';
1
2
  import type { UniswapCryptoPair } from '@xyo-network/payload-plugins/uniswap-crypto-market';
2
3
  import type { Provider } from 'ethers';
3
4
  import type { TokenPairPoolKey } from '../types/index.js';
4
- export declare const pricesFromUniswapV4: (poolId: TokenPairPoolKey[], provider: Provider) => Promise<UniswapCryptoPair[]>;
5
+ /**
6
+ * Prices each pool, skipping (and logging) any that cannot be read so one bad pool
7
+ * does not drop the others. Throws only if every pool fails.
8
+ */
9
+ export declare const pricesFromUniswapV4: (poolId: TokenPairPoolKey[], provider: Provider, logger?: Logger) => Promise<UniswapCryptoPair[]>;
5
10
  //# sourceMappingURL=pricesFromUniswapV4.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pricesFromUniswapV4.d.ts","sourceRoot":"","sources":["../../../../../src/modules/uniswap-v4-crypto-market/lib/pricesFromUniswapV4.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oDAAoD,CAAA;AAC3F,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAEtC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAGzD,eAAO,MAAM,mBAAmB,GAAU,QAAQ,gBAAgB,EAAE,EAAE,UAAU,QAAQ,KAAG,OAAO,CAAC,iBAAiB,EAAE,CAErH,CAAA"}
1
+ {"version":3,"file":"pricesFromUniswapV4.d.ts","sourceRoot":"","sources":["../../../../../src/modules/uniswap-v4-crypto-market/lib/pricesFromUniswapV4.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAE7C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oDAAoD,CAAA;AAC3F,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAEtC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAOzD;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAAU,QAAQ,gBAAgB,EAAE,EAAE,UAAU,QAAQ,EAAE,SAAS,MAAM,KAAG,OAAO,CAAC,iBAAiB,EAAE,CAStI,CAAA"}
@@ -228,6 +228,26 @@ var UniswapPoolContracts = [
228
228
  "0x3416cF6C708Da44DB2624D63ea0AAef7113527C6"
229
229
  ];
230
230
 
231
+ // src/modules/uniswap-v3-crypto-market/lib/UniswapV3CryptoAssetPools.ts
232
+ var UniswapV3CryptoAssetPools = [
233
+ /* usdc/weth 0.05% */
234
+ "0x88e6A0c2dDD26FEEb64F039a2c41296FcB3f5640",
235
+ /* weth/usdt 0.05% */
236
+ "0x11b815efB8f581194ae79006d24E0d814B7697F6",
237
+ /* usdc/usdt 0.01% */
238
+ "0x3416cF6C708Da44DB2624D63ea0AAef7113527C6",
239
+ /* wbtc/weth 0.05% */
240
+ "0x4585FE77225b41b697C938B018E2Ac67Ac5a20c0",
241
+ /* wbtc/usdt 0.05% */
242
+ "0x56534741CD8B152df6d48AdF7ac51f75169A83b2",
243
+ /* eurc/usdc 0.05% */
244
+ "0x95DBB3C7546F22BCE375900AbFdd64a4E5bD73d6",
245
+ /* eurcv/usdc 0.05% */
246
+ "0x1F195908f2EE7A6Fc15D33B30c82298F568E805C",
247
+ /* weth/sol 0.3% (Wormhole SOL; no lower tier has depth) */
248
+ "0x127452F3f9cDc0389b0Bf59ce6131aA3Bd763598"
249
+ ];
250
+
231
251
  // src/modules/uniswap-v3-crypto-market/Plugin.ts
232
252
  import { UniswapCryptoMarketSchema as UniswapCryptoMarketSchema2 } from "@xyo-network/payload-plugins/uniswap-crypto-market";
233
253
  import { createPayloadSetWitnessPlugin, PayloadSetSchema } from "@xyo-network/sdk";
@@ -283,6 +303,7 @@ export {
283
303
  UniswapCryptoMarketPlugin,
284
304
  UniswapCryptoMarketWitness,
285
305
  UniswapPoolContracts,
306
+ UniswapV3CryptoAssetPools,
286
307
  createUniswapPoolContracts,
287
308
  UniswapCryptoMarketPlugin as default,
288
309
  pricesFromUniswap3
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../src/modules/uniswap-v3-crypto-market/lib/logErrors.ts", "../../src/modules/uniswap-v3-crypto-market/lib/UniSwap3Pair.ts", "../../src/modules/uniswap-v3-crypto-market/lib/Uniswap3PoolSlot0Wrapper.ts", "../../src/modules/uniswap-v3-crypto-market/lib/createUniswapPoolContracts.ts", "../../src/modules/uniswap-v3-crypto-market/lib/pricesFromUniswap3.ts", "../../src/modules/uniswap-v3-crypto-market/lib/UniswapPoolContracts.ts", "../../src/modules/uniswap-v3-crypto-market/Plugin.ts", "../../src/modules/uniswap-v3-crypto-market/Witness.ts"],
4
- "sourcesContent": ["export const logErrors = <T>(func: () => T) => {\n try {\n return func()\n } catch (ex) {\n console.error(ex)\n throw ex\n }\n}\n\nexport const logErrorsAsync = async <T>(func: () => Promise<T>) => {\n try {\n return await func()\n } catch (ex) {\n console.error(ex)\n throw ex\n }\n}\n", "import type { EnumValue } from '@ariestools/sdk'\nimport {\n assertEx, delay, Enum,\n} from '@ariestools/sdk'\nimport { Pool } from '@uniswap/v3-sdk'\nimport type { IERC20Metadata } from '@xyo-network/open-zeppelin-typechain'\nimport { IERC20Metadata__factory } from '@xyo-network/open-zeppelin-typechain'\nimport type { IUniswapV3Pool } from '@xyo-network/uniswap-typechain'\nimport { IUniswapV3Pool__factory } from '@xyo-network/uniswap-typechain'\nimport type { Provider } from 'ethers'\n\nimport { Token } from '#uniswap-token'\n\nimport { logErrors, logErrorsAsync } from './logErrors.ts'\nimport { EthersUniswap3PoolSlot0Wrapper } from './Uniswap3PoolSlot0Wrapper.ts'\n\nexport const ChainId = Enum({\n MAINNET: 1,\n ROPSTEN: 3,\n RINKEBY: 4,\n G\u00D6RLI: 5,\n KOVAN: 42,\n})\n\nexport type ChainId = EnumValue<typeof ChainId>\n\n// null is used as 'in-progress'\nconst waitNotNull = async (closure: () => unknown) => {\n while (closure() === null) await delay(10)\n}\n\nexport class EthersUniSwap3Pair {\n protected address: string\n protected provider: Provider\n\n private _pool?: Pool | null\n private _poolContract?: IUniswapV3Pool\n private _slot0?: EthersUniswap3PoolSlot0Wrapper | null\n private _tokenContracts: (IERC20Metadata | null | undefined)[] = [undefined, undefined]\n private _tokens: (Token | null | undefined)[] = [undefined, undefined]\n\n constructor(address: string, provider: Provider) {\n this.address = address\n this.provider = provider\n }\n\n async pool(): Promise<Pool> {\n return await logErrorsAsync(async () => {\n await waitNotNull(() => this._pool)\n this._pool = this._pool ?? null\n const slot0 = await this.slot0()\n const liquidity = await this.poolContract().liquidity()\n this._pool ??= new Pool(\n await this.token(0),\n await this.token(1),\n Number(slot0.feeProtocol),\n `0x${slot0.sqrtPriceX96.toString(16)}`,\n `0x${liquidity.toString(16)}`,\n Number(slot0.tick),\n )\n return assertEx(this._pool)\n })\n }\n\n poolContract() {\n return logErrors(() => {\n this._poolContract = this._poolContract ?? IUniswapV3Pool__factory.connect(this.address, this.provider)\n return assertEx(this._poolContract)\n })\n }\n\n async price() {\n return await logErrorsAsync(async () => {\n const tokenIndexes: (0 | 1)[] = [0, 1]\n const pool = await this.pool()\n const tokens = await Promise.all(tokenIndexes.map(value => this.token(value)))\n const tokenContracts = await Promise.all(tokenIndexes.map(value => this.tokenContract(value)))\n const tokenPrices = tokens.map(token => Number(pool.priceOf(token).toSignificant()))\n const tokenSymbols = tokens.map((token, index) => assertEx(token.symbol, () => `Token[${index}] Missing Symbols`).toLowerCase())\n const result = {\n tokens: await Promise.all(\n tokenIndexes.map(async (value) => {\n return {\n address: await tokenContracts[value].getAddress(), symbol: tokenSymbols[value], value: tokenPrices[value],\n }\n }),\n ),\n }\n return result\n })\n }\n\n async slot0(): Promise<EthersUniswap3PoolSlot0Wrapper> {\n return await logErrorsAsync(async () => {\n await waitNotNull(() => this._slot0)\n this._slot0 = this._slot0 ?? null\n if (this._slot0 === null) {\n const poolContract = this.poolContract()\n const slot = await poolContract.slot0()\n this._slot0 = this._slot0 ?? new EthersUniswap3PoolSlot0Wrapper(slot)\n }\n return assertEx(this._slot0)\n })\n }\n\n async token(index: 0 | 1): Promise<Token> {\n return await logErrorsAsync(async () => {\n await waitNotNull(() => this._tokens[index])\n this._tokens[index] = this._tokens[index] ?? null\n const tokenContract = await this.tokenContract(index)\n this._tokens[index]\n = this._tokens[index]\n ?? new Token(\n ChainId.MAINNET,\n await tokenContract.getAddress(),\n Number(await tokenContract.decimals()),\n await tokenContract.symbol(),\n await tokenContract.name(),\n )\n return assertEx(this._tokens[index])\n })\n }\n\n async tokenContract(index: 0 | 1): Promise<IERC20Metadata> {\n return await logErrorsAsync(async () => {\n await waitNotNull(() => this._tokenContracts[index])\n this._tokenContracts[index] = this._tokenContracts[index] ?? null\n this._tokenContracts[index]\n = this._tokenContracts[index]\n ?? IERC20Metadata__factory.connect(await (index === 0 ? this.poolContract().token0() : this.poolContract().token1()), this.provider)\n return assertEx(this._tokenContracts[index])\n })\n }\n}\n", "import type { EthersUniswapV3Slot0Fields } from './UniswapV3Slot0Fields.ts'\n\nexport class EthersUniswap3PoolSlot0Wrapper {\n protected values: EthersUniswapV3Slot0Fields\n constructor(values: EthersUniswapV3Slot0Fields) {\n this.values = values\n }\n\n get feeProtocol() {\n return this.values[5]\n }\n\n get observationCardinality() {\n return this.values[3]\n }\n\n get observationCardinalityNext() {\n return this.values[4]\n }\n\n get observationIndex() {\n return this.values[2]\n }\n\n get sqrtPriceX96() {\n return this.values[0]\n }\n\n get tick() {\n return this.values[1]\n }\n\n get unlocked() {\n return this.values[6]\n }\n}\n", "import type { Provider } from 'ethers'\n\nimport { logErrors } from './logErrors.ts'\nimport { EthersUniSwap3Pair } from './UniSwap3Pair.ts'\n\nexport const createUniswapPoolContracts = (provider: Provider, contracts: string[]) => {\n return logErrors(() => {\n return contracts.map(contract => new EthersUniSwap3Pair(contract, provider))\n })\n}\n", "import { exists, fulfilled } from '@ariestools/sdk'\nimport type { UniswapCryptoPair } from '@xyo-network/payload-plugins/uniswap-crypto-market'\n\nimport { logErrorsAsync } from './logErrors.ts'\nimport type { EthersUniSwap3Pair } from './UniSwap3Pair.ts'\n\nexport const pricesFromUniswap3 = async (pools: EthersUniSwap3Pair[]): Promise<UniswapCryptoPair[]> => {\n return await logErrorsAsync(async () => {\n const promiseResults = await Promise.allSettled(\n pools.map(async (pool): Promise<UniswapCryptoPair> => {\n const result = await pool.price()\n return result\n }),\n )\n return promiseResults.filter(fulfilled).map(result => result.status === 'fulfilled' ? result.value : undefined).filter(exists)\n })\n}\n", "export const UniswapPoolContracts = [\n /* xyo/weth */ '0xE331DE28cd81B768C19A366b0e4e4675c45eC2dA',\n /* xyo/usdt */ '0xd0AF1981f52146a6939385451dAeA0726e13a484',\n /* xyo/dai */ '0x9D7e5647CE3c7C2d835F2F5e82C8fDb36B0BB0fe',\n /* wbtc/xyo */ '0x0cF7494c9dE661467403aBeE8454b3BBf0179a84',\n /* link/xyo */ '0x4693456599a8a4975862A0E720C5de7E1D09A1e4',\n /* wbtc/weth */ '0xCBCdF9626bC03E24f779434178A73a0B4bad62eD',\n /* dai/usdc */ '0x5777d92f208679DB4b9778590Fa3CAB3aC9e2168',\n /* usdc/weth */ '0x8ad599c3A0ff1De082011EFDDc58f1908eb6e6D8',\n /* usdc/weth */ '0x88e6A0c2dDD26FEEb64F039a2c41296FcB3f5640',\n /* dai/usdc */ '0x6c6Bc977E13Df9b0de53b251522280BB72383700',\n /* frax/usdc */ '0xc63B0708E2F7e69CB8A1df0e1389A98C35A76D52',\n /* wbtc/usdc */ '0x99ac8cA7087fA4A2A1FB6357269965A2014ABc35',\n /* usdc/usdt */ '0x3416cF6C708Da44DB2624D63ea0AAef7113527C6',\n]\n", "import { UniswapCryptoMarketSchema } from '@xyo-network/payload-plugins/uniswap-crypto-market'\nimport { createPayloadSetWitnessPlugin, PayloadSetSchema } from '@xyo-network/sdk'\n\nimport { UniswapCryptoMarketWitness } from './Witness.ts'\n\nexport const UniswapCryptoMarketPlugin = () =>\n createPayloadSetWitnessPlugin<UniswapCryptoMarketWitness>(\n { required: { [UniswapCryptoMarketSchema]: 1 }, schema: PayloadSetSchema },\n {\n witness: async (params) => {\n const result = await UniswapCryptoMarketWitness.create(params)\n return result\n },\n },\n )\n", "import { assertEx } from '@ariestools/sdk'\nimport type { UniswapCryptoMarketPayload } from '@xyo-network/payload-plugins/uniswap-crypto-market'\nimport { UniswapCryptoMarketSchema, UniswapCryptoMarketWitnessConfigSchema } from '@xyo-network/payload-plugins/uniswap-crypto-market'\nimport type {\n AnyConfigSchema, Payload, Schema, WitnessParams,\n} from '@xyo-network/sdk'\nimport { AbstractWitness, creatableModule } from '@xyo-network/sdk'\nimport type { Provider } from 'ethers'\n\nimport type { UniswapCryptoMarketWitnessConfig } from './Config.ts'\nimport type { EthersUniSwap3Pair } from './lib/index.ts'\nimport {\n createUniswapPoolContracts, pricesFromUniswap3, UniswapPoolContracts,\n} from './lib/index.ts'\n\nexport interface UniswapCryptoMarketWitnessParams extends WitnessParams<\n AnyConfigSchema<UniswapCryptoMarketWitnessConfig>> {\n provider?: Provider\n}\n\n@creatableModule()\nexport class UniswapCryptoMarketWitness<\n TParams extends UniswapCryptoMarketWitnessParams = UniswapCryptoMarketWitnessParams,\n> extends AbstractWitness<TParams> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, UniswapCryptoMarketWitnessConfigSchema]\n static override readonly defaultConfigSchema: Schema = UniswapCryptoMarketWitnessConfigSchema\n\n protected pairs?: EthersUniSwap3Pair[]\n protected get provider() {\n return this.params.provider\n }\n\n protected override async observeHandler(): Promise<Payload[]> {\n this.started('throw')\n const pairs = await pricesFromUniswap3(assertEx(this.pairs))\n const timestamp = Date.now()\n\n const payload: UniswapCryptoMarketPayload = {\n pairs,\n schema: UniswapCryptoMarketSchema,\n timestamp,\n }\n\n return [payload]\n }\n\n protected override async startHandler() {\n await super.startHandler()\n this.pairs = createUniswapPoolContracts(\n assertEx(this.provider, () => 'Provider Required'),\n this.config?.pools ?? UniswapPoolContracts,\n )\n }\n}\n"],
5
- "mappings": "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",
3
+ "sources": ["../../src/modules/uniswap-v3-crypto-market/lib/logErrors.ts", "../../src/modules/uniswap-v3-crypto-market/lib/UniSwap3Pair.ts", "../../src/modules/uniswap-v3-crypto-market/lib/Uniswap3PoolSlot0Wrapper.ts", "../../src/modules/uniswap-v3-crypto-market/lib/createUniswapPoolContracts.ts", "../../src/modules/uniswap-v3-crypto-market/lib/pricesFromUniswap3.ts", "../../src/modules/uniswap-v3-crypto-market/lib/UniswapPoolContracts.ts", "../../src/modules/uniswap-v3-crypto-market/lib/UniswapV3CryptoAssetPools.ts", "../../src/modules/uniswap-v3-crypto-market/Plugin.ts", "../../src/modules/uniswap-v3-crypto-market/Witness.ts"],
4
+ "sourcesContent": ["export const logErrors = <T>(func: () => T) => {\n try {\n return func()\n } catch (ex) {\n console.error(ex)\n throw ex\n }\n}\n\nexport const logErrorsAsync = async <T>(func: () => Promise<T>) => {\n try {\n return await func()\n } catch (ex) {\n console.error(ex)\n throw ex\n }\n}\n", "import type { EnumValue } from '@ariestools/sdk'\nimport {\n assertEx, delay, Enum,\n} from '@ariestools/sdk'\nimport { Pool } from '@uniswap/v3-sdk'\nimport type { IERC20Metadata } from '@xyo-network/open-zeppelin-typechain'\nimport { IERC20Metadata__factory } from '@xyo-network/open-zeppelin-typechain'\nimport type { IUniswapV3Pool } from '@xyo-network/uniswap-typechain'\nimport { IUniswapV3Pool__factory } from '@xyo-network/uniswap-typechain'\nimport type { Provider } from 'ethers'\n\nimport { Token } from '#uniswap-token'\n\nimport { logErrors, logErrorsAsync } from './logErrors.ts'\nimport { EthersUniswap3PoolSlot0Wrapper } from './Uniswap3PoolSlot0Wrapper.ts'\n\nexport const ChainId = Enum({\n MAINNET: 1,\n ROPSTEN: 3,\n RINKEBY: 4,\n G\u00D6RLI: 5,\n KOVAN: 42,\n})\n\nexport type ChainId = EnumValue<typeof ChainId>\n\n// null is used as 'in-progress'\nconst waitNotNull = async (closure: () => unknown) => {\n while (closure() === null) await delay(10)\n}\n\nexport class EthersUniSwap3Pair {\n protected address: string\n protected provider: Provider\n\n private _pool?: Pool | null\n private _poolContract?: IUniswapV3Pool\n private _slot0?: EthersUniswap3PoolSlot0Wrapper | null\n private _tokenContracts: (IERC20Metadata | null | undefined)[] = [undefined, undefined]\n private _tokens: (Token | null | undefined)[] = [undefined, undefined]\n\n constructor(address: string, provider: Provider) {\n this.address = address\n this.provider = provider\n }\n\n async pool(): Promise<Pool> {\n return await logErrorsAsync(async () => {\n await waitNotNull(() => this._pool)\n this._pool = this._pool ?? null\n const slot0 = await this.slot0()\n const liquidity = await this.poolContract().liquidity()\n this._pool ??= new Pool(\n await this.token(0),\n await this.token(1),\n Number(slot0.feeProtocol),\n `0x${slot0.sqrtPriceX96.toString(16)}`,\n `0x${liquidity.toString(16)}`,\n Number(slot0.tick),\n )\n return assertEx(this._pool)\n })\n }\n\n poolContract() {\n return logErrors(() => {\n this._poolContract = this._poolContract ?? IUniswapV3Pool__factory.connect(this.address, this.provider)\n return assertEx(this._poolContract)\n })\n }\n\n async price() {\n return await logErrorsAsync(async () => {\n const tokenIndexes: (0 | 1)[] = [0, 1]\n const pool = await this.pool()\n const tokens = await Promise.all(tokenIndexes.map(value => this.token(value)))\n const tokenContracts = await Promise.all(tokenIndexes.map(value => this.tokenContract(value)))\n const tokenPrices = tokens.map(token => Number(pool.priceOf(token).toSignificant()))\n const tokenSymbols = tokens.map((token, index) => assertEx(token.symbol, () => `Token[${index}] Missing Symbols`).toLowerCase())\n const result = {\n tokens: await Promise.all(\n tokenIndexes.map(async (value) => {\n return {\n address: await tokenContracts[value].getAddress(), symbol: tokenSymbols[value], value: tokenPrices[value],\n }\n }),\n ),\n }\n return result\n })\n }\n\n async slot0(): Promise<EthersUniswap3PoolSlot0Wrapper> {\n return await logErrorsAsync(async () => {\n await waitNotNull(() => this._slot0)\n this._slot0 = this._slot0 ?? null\n if (this._slot0 === null) {\n const poolContract = this.poolContract()\n const slot = await poolContract.slot0()\n this._slot0 = this._slot0 ?? new EthersUniswap3PoolSlot0Wrapper(slot)\n }\n return assertEx(this._slot0)\n })\n }\n\n async token(index: 0 | 1): Promise<Token> {\n return await logErrorsAsync(async () => {\n await waitNotNull(() => this._tokens[index])\n this._tokens[index] = this._tokens[index] ?? null\n const tokenContract = await this.tokenContract(index)\n this._tokens[index]\n = this._tokens[index]\n ?? new Token(\n ChainId.MAINNET,\n await tokenContract.getAddress(),\n Number(await tokenContract.decimals()),\n await tokenContract.symbol(),\n await tokenContract.name(),\n )\n return assertEx(this._tokens[index])\n })\n }\n\n async tokenContract(index: 0 | 1): Promise<IERC20Metadata> {\n return await logErrorsAsync(async () => {\n await waitNotNull(() => this._tokenContracts[index])\n this._tokenContracts[index] = this._tokenContracts[index] ?? null\n this._tokenContracts[index]\n = this._tokenContracts[index]\n ?? IERC20Metadata__factory.connect(await (index === 0 ? this.poolContract().token0() : this.poolContract().token1()), this.provider)\n return assertEx(this._tokenContracts[index])\n })\n }\n}\n", "import type { EthersUniswapV3Slot0Fields } from './UniswapV3Slot0Fields.ts'\n\nexport class EthersUniswap3PoolSlot0Wrapper {\n protected values: EthersUniswapV3Slot0Fields\n constructor(values: EthersUniswapV3Slot0Fields) {\n this.values = values\n }\n\n get feeProtocol() {\n return this.values[5]\n }\n\n get observationCardinality() {\n return this.values[3]\n }\n\n get observationCardinalityNext() {\n return this.values[4]\n }\n\n get observationIndex() {\n return this.values[2]\n }\n\n get sqrtPriceX96() {\n return this.values[0]\n }\n\n get tick() {\n return this.values[1]\n }\n\n get unlocked() {\n return this.values[6]\n }\n}\n", "import type { Provider } from 'ethers'\n\nimport { logErrors } from './logErrors.ts'\nimport { EthersUniSwap3Pair } from './UniSwap3Pair.ts'\n\nexport const createUniswapPoolContracts = (provider: Provider, contracts: string[]) => {\n return logErrors(() => {\n return contracts.map(contract => new EthersUniSwap3Pair(contract, provider))\n })\n}\n", "import { exists, fulfilled } from '@ariestools/sdk'\nimport type { UniswapCryptoPair } from '@xyo-network/payload-plugins/uniswap-crypto-market'\n\nimport { logErrorsAsync } from './logErrors.ts'\nimport type { EthersUniSwap3Pair } from './UniSwap3Pair.ts'\n\nexport const pricesFromUniswap3 = async (pools: EthersUniSwap3Pair[]): Promise<UniswapCryptoPair[]> => {\n return await logErrorsAsync(async () => {\n const promiseResults = await Promise.allSettled(\n pools.map(async (pool): Promise<UniswapCryptoPair> => {\n const result = await pool.price()\n return result\n }),\n )\n return promiseResults.filter(fulfilled).map(result => result.status === 'fulfilled' ? result.value : undefined).filter(exists)\n })\n}\n", "export const UniswapPoolContracts = [\n /* xyo/weth */ '0xE331DE28cd81B768C19A366b0e4e4675c45eC2dA',\n /* xyo/usdt */ '0xd0AF1981f52146a6939385451dAeA0726e13a484',\n /* xyo/dai */ '0x9D7e5647CE3c7C2d835F2F5e82C8fDb36B0BB0fe',\n /* wbtc/xyo */ '0x0cF7494c9dE661467403aBeE8454b3BBf0179a84',\n /* link/xyo */ '0x4693456599a8a4975862A0E720C5de7E1D09A1e4',\n /* wbtc/weth */ '0xCBCdF9626bC03E24f779434178A73a0B4bad62eD',\n /* dai/usdc */ '0x5777d92f208679DB4b9778590Fa3CAB3aC9e2168',\n /* usdc/weth */ '0x8ad599c3A0ff1De082011EFDDc58f1908eb6e6D8',\n /* usdc/weth */ '0x88e6A0c2dDD26FEEb64F039a2c41296FcB3f5640',\n /* dai/usdc */ '0x6c6Bc977E13Df9b0de53b251522280BB72383700',\n /* frax/usdc */ '0xc63B0708E2F7e69CB8A1df0e1389A98C35A76D52',\n /* wbtc/usdc */ '0x99ac8cA7087fA4A2A1FB6357269965A2014ABc35',\n /* usdc/usdt */ '0x3416cF6C708Da44DB2624D63ea0AAef7113527C6',\n]\n", "/**\n * Deep mainnet pools for pricing the crypto asset aggregate (network.xyo.crypto.asset),\n * each at its pair's lowest fee tier with real depth. Unlike UniswapPoolContracts, this\n * leaves out the thinly traded XYO pools, which would skew the XYO price.\n */\nexport const UniswapV3CryptoAssetPools = [\n /* usdc/weth 0.05% */ '0x88e6A0c2dDD26FEEb64F039a2c41296FcB3f5640',\n /* weth/usdt 0.05% */ '0x11b815efB8f581194ae79006d24E0d814B7697F6',\n /* usdc/usdt 0.01% */ '0x3416cF6C708Da44DB2624D63ea0AAef7113527C6',\n /* wbtc/weth 0.05% */ '0x4585FE77225b41b697C938B018E2Ac67Ac5a20c0',\n /* wbtc/usdt 0.05% */ '0x56534741CD8B152df6d48AdF7ac51f75169A83b2',\n /* eurc/usdc 0.05% */ '0x95DBB3C7546F22BCE375900AbFdd64a4E5bD73d6',\n /* eurcv/usdc 0.05% */ '0x1F195908f2EE7A6Fc15D33B30c82298F568E805C',\n /* weth/sol 0.3% (Wormhole SOL; no lower tier has depth) */ '0x127452F3f9cDc0389b0Bf59ce6131aA3Bd763598',\n]\n", "import { UniswapCryptoMarketSchema } from '@xyo-network/payload-plugins/uniswap-crypto-market'\nimport { createPayloadSetWitnessPlugin, PayloadSetSchema } from '@xyo-network/sdk'\n\nimport { UniswapCryptoMarketWitness } from './Witness.ts'\n\nexport const UniswapCryptoMarketPlugin = () =>\n createPayloadSetWitnessPlugin<UniswapCryptoMarketWitness>(\n { required: { [UniswapCryptoMarketSchema]: 1 }, schema: PayloadSetSchema },\n {\n witness: async (params) => {\n const result = await UniswapCryptoMarketWitness.create(params)\n return result\n },\n },\n )\n", "import { assertEx } from '@ariestools/sdk'\nimport type { UniswapCryptoMarketPayload } from '@xyo-network/payload-plugins/uniswap-crypto-market'\nimport { UniswapCryptoMarketSchema, UniswapCryptoMarketWitnessConfigSchema } from '@xyo-network/payload-plugins/uniswap-crypto-market'\nimport type {\n AnyConfigSchema, Payload, Schema, WitnessParams,\n} from '@xyo-network/sdk'\nimport { AbstractWitness, creatableModule } from '@xyo-network/sdk'\nimport type { Provider } from 'ethers'\n\nimport type { UniswapCryptoMarketWitnessConfig } from './Config.ts'\nimport type { EthersUniSwap3Pair } from './lib/index.ts'\nimport {\n createUniswapPoolContracts, pricesFromUniswap3, UniswapPoolContracts,\n} from './lib/index.ts'\n\nexport interface UniswapCryptoMarketWitnessParams extends WitnessParams<\n AnyConfigSchema<UniswapCryptoMarketWitnessConfig>> {\n provider?: Provider\n}\n\n@creatableModule()\nexport class UniswapCryptoMarketWitness<\n TParams extends UniswapCryptoMarketWitnessParams = UniswapCryptoMarketWitnessParams,\n> extends AbstractWitness<TParams> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, UniswapCryptoMarketWitnessConfigSchema]\n static override readonly defaultConfigSchema: Schema = UniswapCryptoMarketWitnessConfigSchema\n\n protected pairs?: EthersUniSwap3Pair[]\n protected get provider() {\n return this.params.provider\n }\n\n protected override async observeHandler(): Promise<Payload[]> {\n this.started('throw')\n const pairs = await pricesFromUniswap3(assertEx(this.pairs))\n const timestamp = Date.now()\n\n const payload: UniswapCryptoMarketPayload = {\n pairs,\n schema: UniswapCryptoMarketSchema,\n timestamp,\n }\n\n return [payload]\n }\n\n protected override async startHandler() {\n await super.startHandler()\n this.pairs = createUniswapPoolContracts(\n assertEx(this.provider, () => 'Provider Required'),\n this.config?.pools ?? UniswapPoolContracts,\n )\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["UniswapCryptoMarketSchema", "assertEx", "assertEx", "UniswapCryptoMarketSchema"]
7
7
  }
@@ -45,18 +45,10 @@ var getPoolId = (tokenA, tokenB, fee, tickSpacing, hooks) => {
45
45
  };
46
46
 
47
47
  // src/modules/uniswap-v4-crypto-market/lib/getPriceFromSqrtX96.ts
48
+ var Q96 = 2 ** 96;
48
49
  var getPriceFromSqrtX96 = (sqrtPriceX96, decimalsA, decimalsB) => {
49
- const Q96 = 2n ** 96n;
50
- const numerator = sqrtPriceX96 * sqrtPriceX96 * 10n ** 18n;
51
- const denominator = Q96 * Q96;
52
- let price = numerator / denominator;
53
- const decimalAdjustment = decimalsB - decimalsA;
54
- if (decimalAdjustment > 0) {
55
- price *= 10n ** BigInt(decimalAdjustment);
56
- } else if (decimalAdjustment < 0) {
57
- price /= 10n ** BigInt(-decimalAdjustment);
58
- }
59
- return Number(price) / 1e18;
50
+ const sqrtPrice = Number(sqrtPriceX96) / Q96;
51
+ return sqrtPrice * sqrtPrice * 10 ** (decimalsB - decimalsA);
60
52
  };
61
53
 
62
54
  // src/modules/uniswap-v4-crypto-market/lib/UniswapV4ContractAddresses.ts
@@ -72,13 +64,14 @@ var UniswapV4ContractAddresses = {
72
64
  };
73
65
 
74
66
  // src/modules/uniswap-v4-crypto-market/lib/getExchangeRate.ts
75
- var getExchangeRate = async (tokenA, tokenB, fee, hookAddress, provider) => {
67
+ var getExchangeRate = async (tokenA, tokenB, fee, tickSpacing, hookAddress, provider) => {
76
68
  const hooks = hookAddress ?? ZeroAddress2;
77
69
  const stateView = IStateView__factory.connect(UniswapV4ContractAddresses.Ethereum.StateView, provider);
78
70
  const [token0, token1] = sortTokens(tokenA, tokenB);
79
- const poolId = getPoolId(token0, token1, fee, 60, hooks);
71
+ const poolId = getPoolId(token0, token1, fee, tickSpacing, hooks);
80
72
  if (poolId === ZeroAddress2) throw new Error("Invalid poolId");
81
73
  const response = await stateView.getSlot0(poolId);
74
+ if (response.sqrtPriceX96 === 0n) throw new Error(`Uniswap V4 pool not initialized [${poolId}]`);
82
75
  const price = getPriceFromSqrtX96(response.sqrtPriceX96, token1.decimals, token0.decimals);
83
76
  const wasSwapped = token0.address !== tokenA.address;
84
77
  return wasSwapped ? 1 / price : price;
@@ -104,11 +97,12 @@ var priceFromUniswapV4 = async (poolId, provider) => {
104
97
  const {
105
98
  tokens,
106
99
  fee,
100
+ tickSpacing,
107
101
  hookAddress = ZeroAddress3
108
102
  } = poolId;
109
103
  const tokenA = tokenRegistryValueToToken(tokens[0]);
110
104
  const tokenB = tokenRegistryValueToToken(tokens[1]);
111
- const rate = await getExchangeRate(tokenA, tokenB, fee, hookAddress, provider);
105
+ const rate = await getExchangeRate(tokenA, tokenB, fee, tickSpacing, hookAddress, provider);
112
106
  const token0 = {
113
107
  address: tokenA.address,
114
108
  symbol: tokenA.symbol ?? "",
@@ -124,8 +118,21 @@ var priceFromUniswapV4 = async (poolId, provider) => {
124
118
  };
125
119
 
126
120
  // src/modules/uniswap-v4-crypto-market/lib/pricesFromUniswapV4.ts
127
- var pricesFromUniswapV4 = async (poolId, provider) => {
128
- return await Promise.all(poolId.map((pool) => priceFromUniswapV4(pool, provider)));
121
+ import { fulfilledValues, rejected } from "@ariestools/sdk";
122
+ var poolLabel = ({
123
+ tokens,
124
+ fee,
125
+ tickSpacing
126
+ }) => `${tokens[0].symbol}:${tokens[1].symbol} [${fee}/${tickSpacing}]`;
127
+ var pricesFromUniswapV4 = async (poolId, provider, logger) => {
128
+ const results = await Promise.allSettled(poolId.map((pool) => priceFromUniswapV4(pool, provider)));
129
+ const pairs = results.reduce(fulfilledValues, []);
130
+ const failures = results.filter(rejected);
131
+ if (pairs.length === 0 && failures.length > 0) throw failures[0].reason;
132
+ for (const [index, result] of results.entries()) {
133
+ if (rejected(result)) logger?.warn(`Skipping Uniswap V4 pool ${poolLabel(poolId[index])}: ${result.reason}`);
134
+ }
135
+ return pairs;
129
136
  };
130
137
 
131
138
  // src/modules/uniswap-v4-crypto-market/lib/UniswapV4DefaultPools.ts
@@ -148,6 +155,38 @@ var TokenRegistry = {
148
155
  chainId: 1,
149
156
  decimals: 18,
150
157
  symbol: "XL1"
158
+ },
159
+ // Uniswap V4 pools hold native ETH as the zero address
160
+ ETH: {
161
+ address: ZeroAddress4,
162
+ chainId: 1,
163
+ decimals: 18,
164
+ symbol: "ETH"
165
+ },
166
+ USDC: {
167
+ address: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
168
+ chainId: 1,
169
+ decimals: 6,
170
+ symbol: "USDC"
171
+ },
172
+ WBTC: {
173
+ address: "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599",
174
+ chainId: 1,
175
+ decimals: 8,
176
+ symbol: "WBTC"
177
+ },
178
+ EURC: {
179
+ address: "0x1abaea1f7c830bd89acc67ec4af516284b1bc33c",
180
+ chainId: 1,
181
+ decimals: 6,
182
+ symbol: "EURC"
183
+ },
184
+ // Wormhole-bridged SOL
185
+ SOL: {
186
+ address: "0xd31a59c85ae9d8edefec411d448f90841571b89c",
187
+ chainId: 1,
188
+ decimals: 9,
189
+ symbol: "SOL"
151
190
  }
152
191
  };
153
192
  var UniswapV4DefaultPools = {
@@ -162,6 +201,49 @@ var UniswapV4DefaultPools = {
162
201
  hookAddress: ZeroAddress4,
163
202
  tickSpacing: 60,
164
203
  tokens: [TokenRegistry.XL1, TokenRegistry.USDT]
204
+ },
205
+ "ETH:USDC": {
206
+ fee: 500,
207
+ hookAddress: ZeroAddress4,
208
+ tickSpacing: 10,
209
+ tokens: [TokenRegistry.ETH, TokenRegistry.USDC]
210
+ },
211
+ "ETH:USDT": {
212
+ fee: 500,
213
+ hookAddress: ZeroAddress4,
214
+ tickSpacing: 10,
215
+ tokens: [TokenRegistry.ETH, TokenRegistry.USDT]
216
+ },
217
+ "USDC:USDT": {
218
+ fee: 8,
219
+ hookAddress: ZeroAddress4,
220
+ tickSpacing: 1,
221
+ tokens: [TokenRegistry.USDC, TokenRegistry.USDT]
222
+ },
223
+ "WBTC:ETH": {
224
+ fee: 500,
225
+ hookAddress: ZeroAddress4,
226
+ tickSpacing: 10,
227
+ tokens: [TokenRegistry.WBTC, TokenRegistry.ETH]
228
+ },
229
+ "WBTC:USDC": {
230
+ fee: 500,
231
+ hookAddress: ZeroAddress4,
232
+ tickSpacing: 10,
233
+ tokens: [TokenRegistry.WBTC, TokenRegistry.USDC]
234
+ },
235
+ "EURC:USDC": {
236
+ fee: 300,
237
+ hookAddress: ZeroAddress4,
238
+ tickSpacing: 6,
239
+ tokens: [TokenRegistry.EURC, TokenRegistry.USDC]
240
+ },
241
+ // Only 0.3% SOL pools have meaningful depth
242
+ "SOL:ETH": {
243
+ fee: 3e3,
244
+ hookAddress: ZeroAddress4,
245
+ tickSpacing: 60,
246
+ tokens: [TokenRegistry.SOL, TokenRegistry.ETH]
165
247
  }
166
248
  };
167
249
 
@@ -182,7 +264,7 @@ var UniswapV4CryptoMarketWitness = class extends AbstractWitness {
182
264
  }
183
265
  async observeHandler() {
184
266
  this.started("throw");
185
- const pairs = await pricesFromUniswapV4(this.pools, this.provider);
267
+ const pairs = await pricesFromUniswapV4(this.pools, this.provider, this.logger);
186
268
  const timestamp = Date.now();
187
269
  const payload = {
188
270
  pairs,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/modules/uniswap-v4-crypto-market/lib/priceFromUniswapV4.ts", "../../src/modules/uniswap-v4-crypto-market/lib/getExchangeRate.ts", "../../src/modules/uniswap-v4-crypto-market/lib/getPoolId.ts", "../../src/modules/uniswap-v4-crypto-market/lib/sortTokens.ts", "../../src/modules/uniswap-v4-crypto-market/lib/getPriceFromSqrtX96.ts", "../../src/modules/uniswap-v4-crypto-market/lib/UniswapV4ContractAddresses.ts", "../../src/modules/uniswap-v4-crypto-market/lib/tokenRegistryValueToToken.ts", "../../src/modules/uniswap-v4-crypto-market/lib/pricesFromUniswapV4.ts", "../../src/modules/uniswap-v4-crypto-market/lib/UniswapV4DefaultPools.ts", "../../src/modules/uniswap-v4-crypto-market/Plugin.ts", "../../src/modules/uniswap-v4-crypto-market/Witness.ts"],
4
- "sourcesContent": ["import type { UniswapCryptoPair, UniswapCryptoToken } from '@xyo-network/payload-plugins/uniswap-crypto-market'\nimport type { Provider } from 'ethers'\nimport { ZeroAddress } from 'ethers'\n\nimport type { TokenPairPoolKey } from '../types/index.ts'\nimport { getExchangeRate } from './getExchangeRate.ts'\nimport { tokenRegistryValueToToken } from './tokenRegistryValueToToken.ts'\n\nexport const priceFromUniswapV4 = async (poolId: TokenPairPoolKey, provider: Provider): Promise<UniswapCryptoPair> => {\n const {\n tokens, fee, hookAddress = ZeroAddress,\n } = poolId\n const tokenA = tokenRegistryValueToToken(tokens[0])\n const tokenB = tokenRegistryValueToToken(tokens[1])\n const rate = await getExchangeRate(tokenA, tokenB, fee, hookAddress, provider)\n const token0: UniswapCryptoToken = {\n address: tokenA.address,\n symbol: tokenA.symbol ?? '',\n value: Math.max(rate, 0),\n }\n const token1: UniswapCryptoToken = {\n address: tokenB.address,\n symbol: tokenB.symbol ?? '',\n value: rate > 0 ? Number((1 / rate).toPrecision(6)) : 0,\n }\n const pair: UniswapCryptoPair = { tokens: [token0, token1] }\n return pair\n}\n", "import { IStateView__factory } from '@xyo-network/uniswap-typechain/v4-periphery'\nimport { ZeroAddress } from 'ethers/constants'\nimport type { Provider } from 'ethers/providers'\n\nimport type { Token } from '#uniswap-token'\n\nimport { getPoolId } from './getPoolId.ts'\nimport { getPriceFromSqrtX96 } from './getPriceFromSqrtX96.ts'\nimport { sortTokens } from './sortTokens.ts'\nimport { UniswapV4ContractAddresses } from './UniswapV4ContractAddresses.ts'\n\n/**\n * Returns the price of the token pair in the Uniswap V4 pool.\n * @param tokenA The first token in the pair.\n * @param tokenB The second token in the pair.\n * @param fee The fee tier for the pool.\n * @param hookAddress The address of the hook contract. Default is ZeroAddress.\n * @param provider The EVM provider to use for the transaction.\n * @returns The price of the token pair.\n */\nexport const getExchangeRate = async (\n tokenA: Token,\n tokenB: Token,\n fee: number,\n hookAddress: string | undefined,\n provider: Provider,\n): Promise<number> => {\n const hooks = hookAddress ?? ZeroAddress\n const stateView = IStateView__factory.connect(UniswapV4ContractAddresses.Ethereum.StateView, provider)\n const [token0, token1] = sortTokens(tokenA, tokenB)\n const poolId: string = getPoolId(token0, token1, fee, 60, hooks)\n if (poolId === ZeroAddress) throw new Error('Invalid poolId')\n const response = await stateView.getSlot0(poolId)\n const price = getPriceFromSqrtX96(response.sqrtPriceX96, token1.decimals, token0.decimals)\n // sqrtPriceX96 encodes token0/token1 in sorted order, not config order.\n // If tokenA was sorted to token1, the price is inverted \u2014 correct for it.\n const wasSwapped = token0.address !== tokenA.address\n return wasSwapped ? 1 / price : price\n}\n", "import { AbiCoder } from 'ethers/abi'\nimport { ZeroAddress } from 'ethers/constants'\nimport { keccak256 } from 'ethers/crypto'\n\nimport type { Token } from '#uniswap-token'\n\nimport { sortTokens } from './sortTokens.ts'\n\n/**\n * Computes the pool address for a given pair of tokens, fee, tick spacing, and hooks which\n * is used to identify the pool on the Uniswap V4 protocol.\n * @param tokenA - The first token in the pair.\n * @param tokenB - The second token in the pair.\n * @param fee - The fee tier for the pool.\n * @param tickSpacing - The tick spacing for the pool.\n * @param hooks - The hooks associated with the pool.\n * @returns The computed pool address as a string.\n */\nexport const getPoolId = (tokenA: Token, tokenB: Token, fee: number, tickSpacing: number, hooks: string): string => {\n const [currency0, currency1] = sortTokens(tokenA, tokenB)\n const currency0Addr = currency0.isNative ? ZeroAddress : currency0.wrapped.address\n const currency1Addr = currency1.isNative ? ZeroAddress : currency1.wrapped.address\n return keccak256(\n AbiCoder.defaultAbiCoder().encode(\n ['address', 'address', 'uint24', 'int24', 'address'],\n [currency0Addr, currency1Addr, fee, tickSpacing, hooks],\n ),\n )\n}\n", "import type { Token } from '#uniswap-token'\n\n/**\n * Sorts two tokens in ascending order by address to ensure consistent ordering.\n *\n * In Uniswap v2, v3, and v4, pool addresses are deterministically derived using\n * `CREATE2` with a hash of the pool's initialization parameters. One critical\n * part of this hash is the `token0` and `token1` addresses. To ensure uniqueness\n * and prevent duplicate pools (e.g., USDC/WETH and WETH/USDC being treated as different),\n * Uniswap requires that token pairs be ordered **lexicographically by address**.\n *\n * This method ensures that tokens are sorted according to that rule.\n *\n * This is required any time you:\n * - Derive a pool address\n * - Generate a pool ID\n * - Call a function that expects a PoolKey or token pair in sorted order\n *\n * @param tokenA - The first token to compare\n * @param tokenB - The second token to compare\n * @returns A tuple `[token0, token1]` sorted by address in ascending order\n */\nexport const sortTokens = (tokenA: Token, tokenB: Token): [Token, Token] => {\n return tokenA.sortsBefore(tokenB) ? [tokenA, tokenB] : [tokenB, tokenA]\n}\n", "/**\n * Calculates the price from the square root price in Q96 format.\n * @param sqrtPriceX96 The square root price in Q96 format.\n * @param decimalsA The number of decimals for the first token.\n * @param decimalsB The number of decimals for the second token.\n * @returns The price as a number.\n */\nexport const getPriceFromSqrtX96 = (sqrtPriceX96: bigint, decimalsA: number, decimalsB: number): number => {\n const Q96 = 2n ** 96n\n\n // Scale to avoid floating point math by using a 1e18 factor\n const numerator = sqrtPriceX96 * sqrtPriceX96 * 10n ** 18n\n const denominator = Q96 * Q96\n\n let price = numerator / denominator\n\n // Adjust for decimal differences\n const decimalAdjustment = decimalsB - decimalsA\n if (decimalAdjustment > 0) {\n price *= 10n ** BigInt(decimalAdjustment)\n } else if (decimalAdjustment < 0) {\n price /= 10n ** BigInt(-decimalAdjustment)\n }\n\n return Number(price) / 1e18\n}\n", "// https://docs.uniswap.org/contracts/v4/deployments#mainnet-deployments\nexport const UniswapV4ContractAddresses = {\n Ethereum: {\n PoolManager: '0x000000000004444c5dc75cB358380D2e3dE08A90',\n PositionDescriptor: '0xd1428ba554f4c8450b763a0b2040a4935c63f06c',\n PositionManager: '0xbd216513d74c8cf14cf4747e6aaa6420ff64ee9e',\n Quoter: '0x52f0e24d1c21c8a0cb1e5a5dd6198556bd9e1203',\n StateView: '0x7ffe42c4a5deea5b0fec41c94c136cf115597227',\n UniversalRouter: '0x66a9893cc07d91d95644aedd05d03f95e1dba8af',\n },\n}\n", "import { getAddress } from 'ethers/address'\n\nimport { Token } from '#uniswap-token'\n\nimport type { TokenParameters } from '../types/index.ts'\n\nexport const tokenRegistryValueToToken = (value: TokenParameters): Token => {\n const {\n address, chainId, decimals, symbol, name,\n } = value\n const normalizedAddress = getAddress(address.toLowerCase())\n return new Token(chainId, normalizedAddress, decimals, symbol, name)\n}\n", "import type { UniswapCryptoPair } from '@xyo-network/payload-plugins/uniswap-crypto-market'\nimport type { Provider } from 'ethers'\n\nimport type { TokenPairPoolKey } from '../types/index.ts'\nimport { priceFromUniswapV4 } from './priceFromUniswapV4.ts'\n\nexport const pricesFromUniswapV4 = async (poolId: TokenPairPoolKey[], provider: Provider): Promise<UniswapCryptoPair[]> => {\n return await Promise.all(poolId.map(pool => priceFromUniswapV4(pool, provider)))\n}\n", "import { ZeroAddress } from 'ethers'\n\nimport type { TokenPairPoolKey, TokenParameters } from '../types/index.ts'\n\nexport const TokenRegistry: Record<string, TokenParameters> = {\n USDT: {\n address: '0xdac17f958d2ee523a2206206994597c13d831ec7',\n chainId: 1,\n decimals: 6,\n symbol: 'USDT',\n },\n XYO: {\n address: '0x55296f69f40ea6d20e478533c15a6b08b654e758',\n chainId: 1,\n decimals: 18,\n symbol: 'XYO',\n },\n XL1: {\n address: '0xf72ae3e0da743033abd7a407557d684c1ae66aed',\n chainId: 1,\n decimals: 18,\n symbol: 'XL1',\n },\n} as const\n\nexport const UniswapV4DefaultPools: Record<string, TokenPairPoolKey> = {\n 'XYO:USDT': {\n fee: 3000,\n hookAddress: ZeroAddress,\n tickSpacing: 60,\n tokens: [TokenRegistry.XYO, TokenRegistry.USDT],\n },\n 'XL1:USDT': {\n fee: 3000,\n hookAddress: ZeroAddress,\n tickSpacing: 60,\n tokens: [TokenRegistry.XL1, TokenRegistry.USDT],\n },\n} as const\n", "import { UniswapCryptoMarketSchema } from '@xyo-network/payload-plugins/uniswap-crypto-market'\nimport { createPayloadSetWitnessPlugin, PayloadSetSchema } from '@xyo-network/sdk'\n\nimport { UniswapV4CryptoMarketWitness } from './Witness.ts'\n\nexport const UniswapV4CryptoMarketPlugin = () =>\n createPayloadSetWitnessPlugin<UniswapV4CryptoMarketWitness>(\n { required: { [UniswapCryptoMarketSchema]: 1 }, schema: PayloadSetSchema },\n {\n witness: async (params) => {\n const result = await UniswapV4CryptoMarketWitness.create(params)\n return result\n },\n },\n )\n", "import { assertEx } from '@ariestools/sdk'\nimport type { UniswapCryptoMarketPayload } from '@xyo-network/payload-plugins/uniswap-crypto-market'\nimport { UniswapCryptoMarketSchema, UniswapV4CryptoMarketWitnessConfigSchema } from '@xyo-network/payload-plugins/uniswap-crypto-market'\nimport type {\n AnyConfigSchema, Payload, Schema, WitnessParams,\n} from '@xyo-network/sdk'\nimport { AbstractWitness, creatableModule } from '@xyo-network/sdk'\nimport type { Provider } from 'ethers'\n\nimport type { UniswapV4CryptoMarketWitnessConfig } from './Config.ts'\nimport { pricesFromUniswapV4, UniswapV4DefaultPools } from './lib/index.ts'\nimport type { TokenPairPoolKey } from './types/index.ts'\n\nexport interface UniswapV4CryptoMarketWitnessParams extends WitnessParams<\n AnyConfigSchema<UniswapV4CryptoMarketWitnessConfig>> {\n provider?: Provider\n}\n\n@creatableModule()\nexport class UniswapV4CryptoMarketWitness<\n TParams extends UniswapV4CryptoMarketWitnessParams = UniswapV4CryptoMarketWitnessParams,\n> extends AbstractWitness<TParams> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, UniswapV4CryptoMarketWitnessConfigSchema]\n static override readonly defaultConfigSchema: Schema = UniswapV4CryptoMarketWitnessConfigSchema\n\n protected get pools(): TokenPairPoolKey[] {\n return this.config?.poolKeys ?? Object.values(UniswapV4DefaultPools)\n }\n\n protected get provider() {\n return assertEx(this.params.provider, () => 'Provider Required')\n }\n\n protected override async observeHandler(): Promise<Payload[]> {\n this.started('throw')\n const pairs = await pricesFromUniswapV4(this.pools, this.provider)\n const timestamp = Date.now()\n const payload: UniswapCryptoMarketPayload = {\n pairs, schema: UniswapCryptoMarketSchema, timestamp,\n }\n return [payload]\n }\n\n protected override async startHandler() {\n await super.startHandler()\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { UniswapCryptoPair, UniswapCryptoToken } from '@xyo-network/payload-plugins/uniswap-crypto-market'\nimport type { Provider } from 'ethers'\nimport { ZeroAddress } from 'ethers'\n\nimport type { TokenPairPoolKey } from '../types/index.ts'\nimport { getExchangeRate } from './getExchangeRate.ts'\nimport { tokenRegistryValueToToken } from './tokenRegistryValueToToken.ts'\n\nexport const priceFromUniswapV4 = async (poolId: TokenPairPoolKey, provider: Provider): Promise<UniswapCryptoPair> => {\n const {\n tokens, fee, tickSpacing, hookAddress = ZeroAddress,\n } = poolId\n const tokenA = tokenRegistryValueToToken(tokens[0])\n const tokenB = tokenRegistryValueToToken(tokens[1])\n const rate = await getExchangeRate(tokenA, tokenB, fee, tickSpacing, hookAddress, provider)\n const token0: UniswapCryptoToken = {\n address: tokenA.address,\n symbol: tokenA.symbol ?? '',\n value: Math.max(rate, 0),\n }\n const token1: UniswapCryptoToken = {\n address: tokenB.address,\n symbol: tokenB.symbol ?? '',\n value: rate > 0 ? Number((1 / rate).toPrecision(6)) : 0,\n }\n const pair: UniswapCryptoPair = { tokens: [token0, token1] }\n return pair\n}\n", "import { IStateView__factory } from '@xyo-network/uniswap-typechain/v4-periphery'\nimport { ZeroAddress } from 'ethers/constants'\nimport type { Provider } from 'ethers/providers'\n\nimport type { Token } from '#uniswap-token'\n\nimport { getPoolId } from './getPoolId.ts'\nimport { getPriceFromSqrtX96 } from './getPriceFromSqrtX96.ts'\nimport { sortTokens } from './sortTokens.ts'\nimport { UniswapV4ContractAddresses } from './UniswapV4ContractAddresses.ts'\n\n/**\n * Returns the price of the token pair in the Uniswap V4 pool.\n * @param tokenA The first token in the pair.\n * @param tokenB The second token in the pair.\n * @param fee The fee tier for the pool.\n * @param tickSpacing The tick spacing for the pool.\n * @param hookAddress The address of the hook contract. Default is ZeroAddress.\n * @param provider The EVM provider to use for the transaction.\n * @returns The price of the token pair.\n */\nexport const getExchangeRate = async (\n tokenA: Token,\n tokenB: Token,\n fee: number,\n tickSpacing: number,\n hookAddress: string | undefined,\n provider: Provider,\n): Promise<number> => {\n const hooks = hookAddress ?? ZeroAddress\n const stateView = IStateView__factory.connect(UniswapV4ContractAddresses.Ethereum.StateView, provider)\n const [token0, token1] = sortTokens(tokenA, tokenB)\n const poolId: string = getPoolId(token0, token1, fee, tickSpacing, hooks)\n if (poolId === ZeroAddress) throw new Error('Invalid poolId')\n const response = await stateView.getSlot0(poolId)\n // An uninitialized (nonexistent) pool reads as all zeros rather than reverting\n if (response.sqrtPriceX96 === 0n) throw new Error(`Uniswap V4 pool not initialized [${poolId}]`)\n const price = getPriceFromSqrtX96(response.sqrtPriceX96, token1.decimals, token0.decimals)\n // sqrtPriceX96 encodes token0/token1 in sorted order, not config order.\n // If tokenA was sorted to token1, the price is inverted \u2014 correct for it.\n const wasSwapped = token0.address !== tokenA.address\n return wasSwapped ? 1 / price : price\n}\n", "import { AbiCoder } from 'ethers/abi'\nimport { ZeroAddress } from 'ethers/constants'\nimport { keccak256 } from 'ethers/crypto'\n\nimport type { Token } from '#uniswap-token'\n\nimport { sortTokens } from './sortTokens.ts'\n\n/**\n * Computes the pool address for a given pair of tokens, fee, tick spacing, and hooks which\n * is used to identify the pool on the Uniswap V4 protocol.\n * @param tokenA - The first token in the pair.\n * @param tokenB - The second token in the pair.\n * @param fee - The fee tier for the pool.\n * @param tickSpacing - The tick spacing for the pool.\n * @param hooks - The hooks associated with the pool.\n * @returns The computed pool address as a string.\n */\nexport const getPoolId = (tokenA: Token, tokenB: Token, fee: number, tickSpacing: number, hooks: string): string => {\n const [currency0, currency1] = sortTokens(tokenA, tokenB)\n const currency0Addr = currency0.isNative ? ZeroAddress : currency0.wrapped.address\n const currency1Addr = currency1.isNative ? ZeroAddress : currency1.wrapped.address\n return keccak256(\n AbiCoder.defaultAbiCoder().encode(\n ['address', 'address', 'uint24', 'int24', 'address'],\n [currency0Addr, currency1Addr, fee, tickSpacing, hooks],\n ),\n )\n}\n", "import type { Token } from '#uniswap-token'\n\n/**\n * Sorts two tokens in ascending order by address to ensure consistent ordering.\n *\n * In Uniswap v2, v3, and v4, pool addresses are deterministically derived using\n * `CREATE2` with a hash of the pool's initialization parameters. One critical\n * part of this hash is the `token0` and `token1` addresses. To ensure uniqueness\n * and prevent duplicate pools (e.g., USDC/WETH and WETH/USDC being treated as different),\n * Uniswap requires that token pairs be ordered **lexicographically by address**.\n *\n * This method ensures that tokens are sorted according to that rule.\n *\n * This is required any time you:\n * - Derive a pool address\n * - Generate a pool ID\n * - Call a function that expects a PoolKey or token pair in sorted order\n *\n * @param tokenA - The first token to compare\n * @param tokenB - The second token to compare\n * @returns A tuple `[token0, token1]` sorted by address in ascending order\n */\nexport const sortTokens = (tokenA: Token, tokenB: Token): [Token, Token] => {\n return tokenA.sortsBefore(tokenB) ? [tokenA, tokenB] : [tokenB, tokenA]\n}\n", "const Q96 = 2 ** 96\n\n/**\n * Calculates the price from the square root price in Q96 format.\n * @param sqrtPriceX96 The square root price in Q96 format.\n * @param decimalsA The number of decimals for the first token.\n * @param decimalsB The number of decimals for the second token.\n * @returns The price as a number.\n */\nexport const getPriceFromSqrtX96 = (sqrtPriceX96: bigint, decimalsA: number, decimalsB: number): number => {\n // Floating point keeps ~15 significant digits at any magnitude. Fixed-point\n // scaling truncated low-priced 18-decimal tokens (e.g. XYO/USDT) to 4 digits.\n const sqrtPrice = Number(sqrtPriceX96) / Q96\n return sqrtPrice * sqrtPrice * 10 ** (decimalsB - decimalsA)\n}\n", "// https://docs.uniswap.org/contracts/v4/deployments#mainnet-deployments\nexport const UniswapV4ContractAddresses = {\n Ethereum: {\n PoolManager: '0x000000000004444c5dc75cB358380D2e3dE08A90',\n PositionDescriptor: '0xd1428ba554f4c8450b763a0b2040a4935c63f06c',\n PositionManager: '0xbd216513d74c8cf14cf4747e6aaa6420ff64ee9e',\n Quoter: '0x52f0e24d1c21c8a0cb1e5a5dd6198556bd9e1203',\n StateView: '0x7ffe42c4a5deea5b0fec41c94c136cf115597227',\n UniversalRouter: '0x66a9893cc07d91d95644aedd05d03f95e1dba8af',\n },\n}\n", "import { getAddress } from 'ethers/address'\n\nimport { Token } from '#uniswap-token'\n\nimport type { TokenParameters } from '../types/index.ts'\n\nexport const tokenRegistryValueToToken = (value: TokenParameters): Token => {\n const {\n address, chainId, decimals, symbol, name,\n } = value\n const normalizedAddress = getAddress(address.toLowerCase())\n return new Token(chainId, normalizedAddress, decimals, symbol, name)\n}\n", "import type { Logger } from '@ariestools/sdk'\nimport { fulfilledValues, rejected } from '@ariestools/sdk'\nimport type { UniswapCryptoPair } from '@xyo-network/payload-plugins/uniswap-crypto-market'\nimport type { Provider } from 'ethers'\n\nimport type { TokenPairPoolKey } from '../types/index.ts'\nimport { priceFromUniswapV4 } from './priceFromUniswapV4.ts'\n\nconst poolLabel = ({\n tokens, fee, tickSpacing,\n}: TokenPairPoolKey) => `${tokens[0].symbol}:${tokens[1].symbol} [${fee}/${tickSpacing}]`\n\n/**\n * Prices each pool, skipping (and logging) any that cannot be read so one bad pool\n * does not drop the others. Throws only if every pool fails.\n */\nexport const pricesFromUniswapV4 = async (poolId: TokenPairPoolKey[], provider: Provider, logger?: Logger): Promise<UniswapCryptoPair[]> => {\n const results = await Promise.allSettled(poolId.map(pool => priceFromUniswapV4(pool, provider)))\n const pairs = results.reduce<UniswapCryptoPair[]>(fulfilledValues, [])\n const failures = results.filter(rejected)\n if (pairs.length === 0 && failures.length > 0) throw failures[0].reason\n for (const [index, result] of results.entries()) {\n if (rejected(result)) logger?.warn(`Skipping Uniswap V4 pool ${poolLabel(poolId[index])}: ${result.reason}`)\n }\n return pairs\n}\n", "import { ZeroAddress } from 'ethers'\n\nimport type { TokenPairPoolKey, TokenParameters } from '../types/index.ts'\n\nexport const TokenRegistry: Record<string, TokenParameters> = {\n USDT: {\n address: '0xdac17f958d2ee523a2206206994597c13d831ec7',\n chainId: 1,\n decimals: 6,\n symbol: 'USDT',\n },\n XYO: {\n address: '0x55296f69f40ea6d20e478533c15a6b08b654e758',\n chainId: 1,\n decimals: 18,\n symbol: 'XYO',\n },\n XL1: {\n address: '0xf72ae3e0da743033abd7a407557d684c1ae66aed',\n chainId: 1,\n decimals: 18,\n symbol: 'XL1',\n },\n // Uniswap V4 pools hold native ETH as the zero address\n ETH: {\n address: ZeroAddress,\n chainId: 1,\n decimals: 18,\n symbol: 'ETH',\n },\n USDC: {\n address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',\n chainId: 1,\n decimals: 6,\n symbol: 'USDC',\n },\n WBTC: {\n address: '0x2260fac5e5542a773aa44fbcfedf7c193bc2c599',\n chainId: 1,\n decimals: 8,\n symbol: 'WBTC',\n },\n EURC: {\n address: '0x1abaea1f7c830bd89acc67ec4af516284b1bc33c',\n chainId: 1,\n decimals: 6,\n symbol: 'EURC',\n },\n // Wormhole-bridged SOL\n SOL: {\n address: '0xd31a59c85ae9d8edefec411d448f90841571b89c',\n chainId: 1,\n decimals: 9,\n symbol: 'SOL',\n },\n} as const\n\n/**\n * Hookless mainnet pools. Beyond XYO and XL1, each pair uses its lowest fee tier with real\n * depth: low-fee pools are arbitraged more tightly, so they track the market more closely.\n */\nexport const UniswapV4DefaultPools: Record<string, TokenPairPoolKey> = {\n 'XYO:USDT': {\n fee: 3000,\n hookAddress: ZeroAddress,\n tickSpacing: 60,\n tokens: [TokenRegistry.XYO, TokenRegistry.USDT],\n },\n 'XL1:USDT': {\n fee: 3000,\n hookAddress: ZeroAddress,\n tickSpacing: 60,\n tokens: [TokenRegistry.XL1, TokenRegistry.USDT],\n },\n 'ETH:USDC': {\n fee: 500,\n hookAddress: ZeroAddress,\n tickSpacing: 10,\n tokens: [TokenRegistry.ETH, TokenRegistry.USDC],\n },\n 'ETH:USDT': {\n fee: 500,\n hookAddress: ZeroAddress,\n tickSpacing: 10,\n tokens: [TokenRegistry.ETH, TokenRegistry.USDT],\n },\n 'USDC:USDT': {\n fee: 8,\n hookAddress: ZeroAddress,\n tickSpacing: 1,\n tokens: [TokenRegistry.USDC, TokenRegistry.USDT],\n },\n 'WBTC:ETH': {\n fee: 500,\n hookAddress: ZeroAddress,\n tickSpacing: 10,\n tokens: [TokenRegistry.WBTC, TokenRegistry.ETH],\n },\n 'WBTC:USDC': {\n fee: 500,\n hookAddress: ZeroAddress,\n tickSpacing: 10,\n tokens: [TokenRegistry.WBTC, TokenRegistry.USDC],\n },\n 'EURC:USDC': {\n fee: 300,\n hookAddress: ZeroAddress,\n tickSpacing: 6,\n tokens: [TokenRegistry.EURC, TokenRegistry.USDC],\n },\n // Only 0.3% SOL pools have meaningful depth\n 'SOL:ETH': {\n fee: 3000,\n hookAddress: ZeroAddress,\n tickSpacing: 60,\n tokens: [TokenRegistry.SOL, TokenRegistry.ETH],\n },\n} as const\n", "import { UniswapCryptoMarketSchema } from '@xyo-network/payload-plugins/uniswap-crypto-market'\nimport { createPayloadSetWitnessPlugin, PayloadSetSchema } from '@xyo-network/sdk'\n\nimport { UniswapV4CryptoMarketWitness } from './Witness.ts'\n\nexport const UniswapV4CryptoMarketPlugin = () =>\n createPayloadSetWitnessPlugin<UniswapV4CryptoMarketWitness>(\n { required: { [UniswapCryptoMarketSchema]: 1 }, schema: PayloadSetSchema },\n {\n witness: async (params) => {\n const result = await UniswapV4CryptoMarketWitness.create(params)\n return result\n },\n },\n )\n", "import { assertEx } from '@ariestools/sdk'\nimport type { UniswapCryptoMarketPayload } from '@xyo-network/payload-plugins/uniswap-crypto-market'\nimport { UniswapCryptoMarketSchema, UniswapV4CryptoMarketWitnessConfigSchema } from '@xyo-network/payload-plugins/uniswap-crypto-market'\nimport type {\n AnyConfigSchema, Payload, Schema, WitnessParams,\n} from '@xyo-network/sdk'\nimport { AbstractWitness, creatableModule } from '@xyo-network/sdk'\nimport type { Provider } from 'ethers'\n\nimport type { UniswapV4CryptoMarketWitnessConfig } from './Config.ts'\nimport { pricesFromUniswapV4, UniswapV4DefaultPools } from './lib/index.ts'\nimport type { TokenPairPoolKey } from './types/index.ts'\n\nexport interface UniswapV4CryptoMarketWitnessParams extends WitnessParams<\n AnyConfigSchema<UniswapV4CryptoMarketWitnessConfig>> {\n provider?: Provider\n}\n\n@creatableModule()\nexport class UniswapV4CryptoMarketWitness<\n TParams extends UniswapV4CryptoMarketWitnessParams = UniswapV4CryptoMarketWitnessParams,\n> extends AbstractWitness<TParams> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, UniswapV4CryptoMarketWitnessConfigSchema]\n static override readonly defaultConfigSchema: Schema = UniswapV4CryptoMarketWitnessConfigSchema\n\n protected get pools(): TokenPairPoolKey[] {\n return this.config?.poolKeys ?? Object.values(UniswapV4DefaultPools)\n }\n\n protected get provider() {\n return assertEx(this.params.provider, () => 'Provider Required')\n }\n\n protected override async observeHandler(): Promise<Payload[]> {\n this.started('throw')\n const pairs = await pricesFromUniswapV4(this.pools, this.provider, this.logger)\n const timestamp = Date.now()\n const payload: UniswapCryptoMarketPayload = {\n pairs, schema: UniswapCryptoMarketSchema, timestamp,\n }\n return [payload]\n }\n\n protected override async startHandler() {\n await super.startHandler()\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["ZeroAddress", "ZeroAddress", "ZeroAddress", "ZeroAddress", "ZeroAddress", "UniswapCryptoMarketSchema", "UniswapCryptoMarketSchema"]
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Diviner.d.ts","sourceRoot":"","sources":["../../../../src/modules/crypto-asset/Diviner.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,EAC/F,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAGlD,OAAO,EAAE,oCAAoC,EAAE,MAAM,aAAa,CAAA;AAElE,MAAM,MAAM,8BAA8B,GAAG,aAAa,CAAC;IAAE,MAAM,EAAE,oCAAoC,CAAA;CAAE,CAAC,CAAA;AAC5G,MAAM,MAAM,8BAA8B,GAAG,aAAa,CAAC,eAAe,CAAC,8BAA8B,CAAC,CAAC,CAAA;AAE3G,qBAAa,wBAAwB,CAAC,OAAO,SAAS,8BAA8B,GAAG,8BAA8B,CACnH,SAAQ,eAAe,CAAC,OAAO,CAC/B,YAAW,aAAa,EAAE,eAAe;IACzC,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAAiE;IACjH,gBAAyB,mBAAmB,EAAE,MAAM,CAAuC;IAC3F,gBAAyB,YAAY;;MAA0B;cAE5C,aAAa,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE;CAMlE"}
1
+ {"version":3,"file":"Diviner.d.ts","sourceRoot":"","sources":["../../../../src/modules/crypto-asset/Diviner.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,EAC/F,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAGlD,OAAO,EAAE,oCAAoC,EAAE,MAAM,aAAa,CAAA;AAElE,MAAM,MAAM,8BAA8B,GAAG,aAAa,CAAC;IAAE,MAAM,EAAE,oCAAoC,CAAA;CAAE,CAAC,CAAA;AAC5G,MAAM,MAAM,8BAA8B,GAAG,aAAa,CAAC,eAAe,CAAC,8BAA8B,CAAC,CAAC,CAAA;AAE3G,qBAAa,wBAAwB,CAAC,OAAO,SAAS,8BAA8B,GAAG,8BAA8B,CACnH,SAAQ,eAAe,CAAC,OAAO,CAC/B,YAAW,aAAa,EAAE,eAAe;IACzC,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAAiE;IACjH,gBAAyB,mBAAmB,EAAE,MAAM,CAAuC;IAC3F,gBAAyB,YAAY;;MAA0B;cAE5C,aAAa,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE;CAOlE"}
@@ -1,5 +1,5 @@
1
1
  import type { CoingeckoCryptoMarketPayload } from '@xyo-network/payload-plugins/coingecko-crypto-market';
2
2
  import type { CryptoMarketAssetPayload } from '@xyo-network/payload-plugins/crypto-asset';
3
3
  import type { UniswapCryptoMarketPayload } from '@xyo-network/payload-plugins/uniswap-crypto-market';
4
- export declare const divinePrices: (coinGeckoPayload: CoingeckoCryptoMarketPayload | undefined, uniswapPayload: UniswapCryptoMarketPayload | undefined) => CryptoMarketAssetPayload;
4
+ export declare const divinePrices: (coinGeckoPayload: CoingeckoCryptoMarketPayload | undefined, ...uniswapPayloads: (UniswapCryptoMarketPayload | undefined)[]) => CryptoMarketAssetPayload;
5
5
  //# sourceMappingURL=divinePrices.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"divinePrices.d.ts","sourceRoot":"","sources":["../../../../../src/modules/crypto-asset/lib/divinePrices.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,sDAAsD,CAAA;AACxG,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2CAA2C,CAAA;AAEzF,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,oDAAoD,CAAA;AASpG,eAAO,MAAM,YAAY,GACvB,kBAAkB,4BAA4B,GAAG,SAAS,EAC1D,gBAAgB,0BAA0B,GAAG,SAAS,KACrD,wBAQF,CAAA"}
1
+ {"version":3,"file":"divinePrices.d.ts","sourceRoot":"","sources":["../../../../../src/modules/crypto-asset/lib/divinePrices.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,sDAAsD,CAAA;AACxG,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2CAA2C,CAAA;AAEzF,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,oDAAoD,CAAA;AASpG,eAAO,MAAM,YAAY,GACvB,kBAAkB,4BAA4B,GAAG,SAAS,EAC1D,GAAG,iBAAiB,CAAC,0BAA0B,GAAG,SAAS,CAAC,EAAE,KAC7D,wBAQF,CAAA"}
@@ -1,4 +1,9 @@
1
1
  import type { CryptoMarketAssetPayload } from '@xyo-network/payload-plugins/crypto-asset';
2
2
  import type { UniswapCryptoMarketPayload } from '@xyo-network/payload-plugins/uniswap-crypto-market';
3
- export declare const divineUniswapPrices: (uniswapPayload: UniswapCryptoMarketPayload | undefined) => CryptoMarketAssetPayload;
3
+ /**
4
+ * Values each asset in USD, EUR, BTC and ETH from Uniswap pool prices. Every asset is
5
+ * priced in USD first (see usdPricesFromQuotes), then converted at the USD prices of the
6
+ * valuationReferences. Only assets the payload schema knows are included.
7
+ */
8
+ export declare function divineUniswapPrices(...uniswapPayloads: (UniswapCryptoMarketPayload | undefined)[]): CryptoMarketAssetPayload;
4
9
  //# sourceMappingURL=divineUniswapPrices.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"divineUniswapPrices.d.ts","sourceRoot":"","sources":["../../../../../src/modules/crypto-asset/lib/divineUniswapPrices.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACC,wBAAwB,EAEpC,MAAM,2CAA2C,CAAA;AAElD,OAAO,KAAK,EACV,0BAA0B,EAC3B,MAAM,oDAAoD,CAAA;AAqC3D,eAAO,MAAM,mBAAmB,GAAI,gBAAgB,0BAA0B,GAAG,SAAS,KAAG,wBAgB5F,CAAA"}
1
+ {"version":3,"file":"divineUniswapPrices.d.ts","sourceRoot":"","sources":["../../../../../src/modules/crypto-asset/lib/divineUniswapPrices.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACC,wBAAwB,EACpC,MAAM,2CAA2C,CAAA;AAElD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,oDAAoD,CAAA;AA4BpG;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,eAAe,EAAE,CAAC,0BAA0B,GAAG,SAAS,CAAC,EAAE,GAAG,wBAAwB,CAyB5H"}
@@ -0,0 +1,11 @@
1
+ import type { UniswapCryptoMarketPayload } from '@xyo-network/payload-plugins/uniswap-crypto-market';
2
+ /** A price read from one pool: one unit of `base` is worth `rate` units of `quote` */
3
+ export interface UniswapQuote {
4
+ base: string;
5
+ quote: string;
6
+ rate: number;
7
+ }
8
+ export declare function normalizeUniswapSymbol(symbol: string): string;
9
+ /** Flattens the pairs of every payload into quotes between normalized asset symbols */
10
+ export declare function uniswapQuotes(payloads: UniswapCryptoMarketPayload[]): UniswapQuote[];
11
+ //# sourceMappingURL=uniswapQuotes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uniswapQuotes.d.ts","sourceRoot":"","sources":["../../../../../src/modules/crypto-asset/lib/uniswapQuotes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAsB,MAAM,oDAAoD,CAAA;AAExH,sFAAsF;AACtF,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;CACb;AAKD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAG7D;AAYD,uFAAuF;AACvF,wBAAgB,aAAa,CAAC,QAAQ,EAAE,0BAA0B,EAAE,GAAG,YAAY,EAAE,CAYpF"}