@gauntlet-xyz/sdk 2.0.0 → 2.5.0
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.
- package/README.md +134 -1
- package/dist/api/activity.d.ts +70 -0
- package/dist/api/activity.d.ts.map +1 -0
- package/dist/api/activity.js +154 -0
- package/dist/api/activity.js.map +1 -0
- package/dist/api/caip.d.ts +29 -0
- package/dist/api/caip.d.ts.map +1 -0
- package/dist/api/caip.js +38 -0
- package/dist/api/caip.js.map +1 -0
- package/dist/api/client.d.ts +135 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +119 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/decimal.d.ts +21 -0
- package/dist/api/decimal.d.ts.map +1 -0
- package/dist/api/decimal.js +44 -0
- package/dist/api/decimal.js.map +1 -0
- package/dist/api/errors.d.ts +32 -0
- package/dist/api/errors.d.ts.map +1 -0
- package/dist/api/errors.js +41 -0
- package/dist/api/errors.js.map +1 -0
- package/dist/api/generated.d.ts +1505 -0
- package/dist/api/generated.d.ts.map +1 -0
- package/dist/api/generated.js +6 -0
- package/dist/api/generated.js.map +1 -0
- package/dist/api/http.d.ts +16 -0
- package/dist/api/http.d.ts.map +1 -0
- package/dist/api/http.js +39 -0
- package/dist/api/http.js.map +1 -0
- package/dist/api/index.d.ts +14 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +8 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/positionHistory.d.ts +44 -0
- package/dist/api/positionHistory.d.ts.map +1 -0
- package/dist/api/positionHistory.js +126 -0
- package/dist/api/positionHistory.js.map +1 -0
- package/dist/client.d.ts +6 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +2 -0
- package/dist/client.js.map +1 -1
- package/dist/errors.d.ts +11 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +21 -2
- package/dist/errors.js.map +1 -1
- package/dist/evm/abis/priceAndFeeCalculatorV2.d.ts +44 -0
- package/dist/evm/abis/priceAndFeeCalculatorV2.d.ts.map +1 -1
- package/dist/evm/abis/priceAndFeeCalculatorV2.js +22 -0
- package/dist/evm/abis/priceAndFeeCalculatorV2.js.map +1 -1
- package/dist/evm/abis/provisionerV2.d.ts +280 -0
- package/dist/evm/abis/provisionerV2.d.ts.map +1 -1
- package/dist/evm/abis/provisionerV2.js +92 -0
- package/dist/evm/abis/provisionerV2.js.map +1 -1
- package/dist/evm/adapters/aera.d.ts.map +1 -1
- package/dist/evm/adapters/aera.js +41 -10
- package/dist/evm/adapters/aera.js.map +1 -1
- package/dist/evm/adapters/types.d.ts +2 -0
- package/dist/evm/adapters/types.d.ts.map +1 -1
- package/dist/evm/aeraContracts/priceAndFeeCalculator.d.ts +10 -5
- package/dist/evm/aeraContracts/priceAndFeeCalculator.d.ts.map +1 -1
- package/dist/evm/aeraContracts/priceAndFeeCalculator.js +39 -5
- package/dist/evm/aeraContracts/priceAndFeeCalculator.js.map +1 -1
- package/dist/evm/aeraContracts/readOptions.d.ts +8 -0
- package/dist/evm/aeraContracts/readOptions.d.ts.map +1 -0
- package/dist/evm/aeraContracts/readOptions.js +4 -0
- package/dist/evm/aeraContracts/readOptions.js.map +1 -0
- package/dist/evm/aeraContracts/v2.d.ts +1932 -217
- package/dist/evm/aeraContracts/v2.d.ts.map +1 -1
- package/dist/evm/aeraContracts/v2.js +84 -28
- package/dist/evm/aeraContracts/v2.js.map +1 -1
- package/dist/evm/aeraContracts.d.ts +9 -3
- package/dist/evm/aeraContracts.d.ts.map +1 -1
- package/dist/evm/aeraContracts.js +69 -8
- package/dist/evm/aeraContracts.js.map +1 -1
- package/dist/evm/deposit.d.ts.map +1 -1
- package/dist/evm/deposit.js +1 -1
- package/dist/evm/deposit.js.map +1 -1
- package/dist/evm/index.d.ts +8 -0
- package/dist/evm/index.d.ts.map +1 -1
- package/dist/evm/index.js +3 -0
- package/dist/evm/index.js.map +1 -1
- package/dist/evm/tokenModes.d.ts +22 -0
- package/dist/evm/tokenModes.d.ts.map +1 -0
- package/dist/evm/tokenModes.js +34 -0
- package/dist/evm/tokenModes.js.map +1 -0
- package/dist/evm/withdraw.d.ts +8 -0
- package/dist/evm/withdraw.d.ts.map +1 -1
- package/dist/evm/withdraw.js +85 -5
- package/dist/evm/withdraw.js.map +1 -1
- package/dist/evm/withdrawQuote.d.ts +127 -0
- package/dist/evm/withdrawQuote.d.ts.map +1 -0
- package/dist/evm/withdrawQuote.js +164 -0
- package/dist/evm/withdrawQuote.js.map +1 -0
- package/dist/index.d.ts +8 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/privy/index.d.ts +52 -0
- package/dist/privy/index.d.ts.map +1 -0
- package/dist/privy/index.js +51 -0
- package/dist/privy/index.js.map +1 -0
- package/manifest/vaults.json +255 -3
- package/package.json +2 -2
- package/src/api/activity.ts +219 -0
- package/src/api/caip.ts +61 -0
- package/src/api/client.ts +234 -0
- package/src/api/decimal.ts +49 -0
- package/src/api/errors.ts +64 -0
- package/src/api/generated.ts +1505 -0
- package/src/api/http.ts +62 -0
- package/src/api/index.ts +70 -0
- package/src/api/positionHistory.ts +167 -0
- package/src/client.ts +7 -1
- package/src/errors.ts +32 -2
- package/src/evm/abis/priceAndFeeCalculatorV2.ts +22 -0
- package/src/evm/abis/provisionerV2.ts +92 -0
- package/src/evm/adapters/aera.ts +50 -23
- package/src/evm/adapters/types.ts +2 -0
- package/src/evm/aeraContracts/priceAndFeeCalculator.ts +72 -5
- package/src/evm/aeraContracts/readOptions.ts +3 -0
- package/src/evm/aeraContracts/v2.ts +158 -34
- package/src/evm/aeraContracts.ts +81 -8
- package/src/evm/deposit.ts +2 -1
- package/src/evm/index.ts +32 -0
- package/src/evm/tokenModes.ts +54 -0
- package/src/evm/withdraw.ts +131 -7
- package/src/evm/withdrawQuote.ts +360 -0
- package/src/index.ts +18 -0
- package/src/privy/index.ts +95 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/privy/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,KAAK,EACV,KAAK,eAAe,EAEpB,KAAK,SAAS,EACd,KAAK,YAAY,EAClB,MAAM,MAAM,CAAC;AACd,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1E;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IAClC,gCAAgC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,mBAAmB,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC;CACjD;AAED;;;;;;;;GAQG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,mBAAmB,EAC3B,KAAK,EAAE,KAAK,GACX,OAAO,CAAC,YAAY,CAAC,CAOvB;AAED,MAAM,WAAW,yBAAyB;IACxC,sEAAsE;IACtE,MAAM,EAAE,mBAAmB,CAAC;IAC5B,8FAA8F;IAC9F,MAAM,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;IAC5B,sFAAsF;IACtF,UAAU,CAAC,EAAE,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,6BAA6B,CACjD,MAAM,EAAE,yBAAyB,GAChC,OAAO,CAAC,cAAc,CAAC,CAiBzB"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { createPublicClient, createWalletClient, custom, http, } from 'viem';
|
|
2
|
+
import { GauntletClient } from '../client';
|
|
3
|
+
/**
|
|
4
|
+
* Wraps a Privy wallet in a viem `WalletClient` bound to `chain`, ready to
|
|
5
|
+
* sign SDK transaction steps.
|
|
6
|
+
*
|
|
7
|
+
* ```ts
|
|
8
|
+
* const { wallets } = useWallets();
|
|
9
|
+
* const wallet = await walletClientFromPrivy(wallets[0], base);
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
export async function walletClientFromPrivy(wallet, chain) {
|
|
13
|
+
const provider = await wallet.getEthereumProvider();
|
|
14
|
+
return createWalletClient({
|
|
15
|
+
account: wallet.address,
|
|
16
|
+
chain,
|
|
17
|
+
transport: custom(provider),
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Opinionated one-call setup for Privy apps: builds public clients for each
|
|
22
|
+
* chain and a signing wallet from the Privy provider, returning a fully
|
|
23
|
+
* configured `GauntletClient`.
|
|
24
|
+
*
|
|
25
|
+
* ```ts
|
|
26
|
+
* const client = await createGauntletClientFromPrivy({
|
|
27
|
+
* wallet: wallets[0],
|
|
28
|
+
* chains: [base],
|
|
29
|
+
* builderCode: 'my-app',
|
|
30
|
+
* });
|
|
31
|
+
* const steps = await getDepositTx(client, { vaultId, amount });
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export async function createGauntletClientFromPrivy(config) {
|
|
35
|
+
const evmClients = {};
|
|
36
|
+
for (const chain of config.chains) {
|
|
37
|
+
evmClients[chain.id] = createPublicClient({
|
|
38
|
+
chain,
|
|
39
|
+
transport: config.transports?.[chain.id] ?? http(),
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
return new GauntletClient({
|
|
43
|
+
evmClients,
|
|
44
|
+
wallet: await walletClientFromPrivy(config.wallet, config.chains[0]),
|
|
45
|
+
apiKey: config.apiKey,
|
|
46
|
+
apiUrl: config.apiUrl,
|
|
47
|
+
attributionMode: config.attributionMode,
|
|
48
|
+
builderCode: config.builderCode,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/privy/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,MAAM,EACN,IAAI,GAOL,MAAM,MAAM,CAAC;AACd,OAAO,EAAmB,cAAc,EAAgB,MAAM,WAAW,CAAC;AAe1E;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,MAA2B,EAC3B,KAAY;IAEZ,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,mBAAmB,EAAE,CAAC;IACpD,OAAO,kBAAkB,CAAC;QACxB,OAAO,EAAE,MAAM,CAAC,OAAkB;QAClC,KAAK;QACL,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC;KAC5B,CAAC,CAAC;AACL,CAAC;AAeD;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,MAAiC;IAEjC,MAAM,UAAU,GAAkC,EAAE,CAAC;IACrD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,kBAAkB,CAAC;YACxC,KAAK;YACL,SAAS,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE;SACnD,CAAC,CAAC;IACL,CAAC;IAED,OAAO,IAAI,cAAc,CAAC;QACxB,UAAU;QACV,MAAM,EAAE,MAAM,qBAAqB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACpE,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,eAAe,EAAE,MAAM,CAAC,eAAe;QACvC,WAAW,EAAE,MAAM,CAAC,WAAW;KAChC,CAAC,CAAC;AACL,CAAC"}
|
package/manifest/vaults.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "2026-05
|
|
2
|
+
"version": "2026-08-05",
|
|
3
3
|
"vaults": [
|
|
4
4
|
{
|
|
5
5
|
"vaultId": "baseUsdcPrime",
|
|
@@ -1746,7 +1746,7 @@
|
|
|
1746
1746
|
"chainId": 1,
|
|
1747
1747
|
"vaultAddress": "0x00000000d8f3d6c5DFeB2D2b5ED2276095f3aF44",
|
|
1748
1748
|
"vaultType": "multi-depositor",
|
|
1749
|
-
"expirationDays":
|
|
1749
|
+
"expirationDays": 90,
|
|
1750
1750
|
"supplyToken": [
|
|
1751
1751
|
{
|
|
1752
1752
|
"address": "0xc26a6fa2c37b38e549a4a1807543801db684f99c",
|
|
@@ -1773,7 +1773,7 @@
|
|
|
1773
1773
|
"chainId": 1,
|
|
1774
1774
|
"vaultAddress": "0x953Ca96b057D5397CE7791C5AE9b5a19b1352341",
|
|
1775
1775
|
"vaultType": "multi-depositor",
|
|
1776
|
-
"expirationDays":
|
|
1776
|
+
"expirationDays": 90,
|
|
1777
1777
|
"supplyToken": [
|
|
1778
1778
|
{
|
|
1779
1779
|
"address": "0x99e05cdbeac5d91150935c59ff8e9ba9945d6884",
|
|
@@ -2074,6 +2074,258 @@
|
|
|
2074
2074
|
]
|
|
2075
2075
|
}
|
|
2076
2076
|
]
|
|
2077
|
+
},
|
|
2078
|
+
{
|
|
2079
|
+
"vaultId": "exausd",
|
|
2080
|
+
"name": "exaUSD",
|
|
2081
|
+
"protocol": "aera",
|
|
2082
|
+
"strategy": "Institutional USD Yield Vault",
|
|
2083
|
+
"deployments": [
|
|
2084
|
+
{
|
|
2085
|
+
"chain": "evm",
|
|
2086
|
+
"chainId": 8453,
|
|
2087
|
+
"vaultAddress": "0xDDDFf4bE1a90CD6F05CE1e977c674ff3aa556C97",
|
|
2088
|
+
"vaultType": "multi-depositor",
|
|
2089
|
+
"supplyToken": [
|
|
2090
|
+
{
|
|
2091
|
+
"address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
|
|
2092
|
+
"symbol": "USDC",
|
|
2093
|
+
"decimals": 6
|
|
2094
|
+
}
|
|
2095
|
+
]
|
|
2096
|
+
}
|
|
2097
|
+
]
|
|
2098
|
+
},
|
|
2099
|
+
{
|
|
2100
|
+
"vaultId": "exaeth",
|
|
2101
|
+
"name": "exaETH",
|
|
2102
|
+
"protocol": "aera",
|
|
2103
|
+
"strategy": "Institutional ETH Yield Vault",
|
|
2104
|
+
"deployments": [
|
|
2105
|
+
{
|
|
2106
|
+
"chain": "evm",
|
|
2107
|
+
"chainId": 1,
|
|
2108
|
+
"vaultAddress": "0x2B02DA0A074b690075f0b8E6921e2526B0Ff7896",
|
|
2109
|
+
"vaultType": "multi-depositor",
|
|
2110
|
+
"supplyToken": [
|
|
2111
|
+
{
|
|
2112
|
+
"address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
|
|
2113
|
+
"symbol": "WETH",
|
|
2114
|
+
"decimals": 18
|
|
2115
|
+
}
|
|
2116
|
+
]
|
|
2117
|
+
}
|
|
2118
|
+
]
|
|
2119
|
+
},
|
|
2120
|
+
{
|
|
2121
|
+
"vaultId": "prime",
|
|
2122
|
+
"name": "Gauntlet Levered PRIME",
|
|
2123
|
+
"protocol": "aera",
|
|
2124
|
+
"strategy": "Levered PRIME Looping",
|
|
2125
|
+
"deployments": [
|
|
2126
|
+
{
|
|
2127
|
+
"chain": "evm",
|
|
2128
|
+
"chainId": 1,
|
|
2129
|
+
"vaultAddress": "0xc4C7Ea9af473046559F0492bbBa186A2E043fe94",
|
|
2130
|
+
"vaultType": "multi-depositor",
|
|
2131
|
+
"supplyToken": [
|
|
2132
|
+
{
|
|
2133
|
+
"address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
|
|
2134
|
+
"symbol": "USDC",
|
|
2135
|
+
"decimals": 6
|
|
2136
|
+
}
|
|
2137
|
+
]
|
|
2138
|
+
}
|
|
2139
|
+
]
|
|
2140
|
+
},
|
|
2141
|
+
{
|
|
2142
|
+
"vaultId": "stgprime",
|
|
2143
|
+
"name": "Gauntlet Levered PRIME Staging",
|
|
2144
|
+
"protocol": "aera",
|
|
2145
|
+
"strategy": "Levered PRIME Looping",
|
|
2146
|
+
"deployments": [
|
|
2147
|
+
{
|
|
2148
|
+
"chain": "evm",
|
|
2149
|
+
"chainId": 1,
|
|
2150
|
+
"vaultAddress": "0x8F2d98522B977C33a1EFDD4e25b0B045777B2193",
|
|
2151
|
+
"vaultType": "multi-depositor",
|
|
2152
|
+
"supplyToken": [
|
|
2153
|
+
{
|
|
2154
|
+
"address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
|
|
2155
|
+
"symbol": "USDC",
|
|
2156
|
+
"decimals": 6
|
|
2157
|
+
}
|
|
2158
|
+
]
|
|
2159
|
+
}
|
|
2160
|
+
]
|
|
2161
|
+
},
|
|
2162
|
+
{
|
|
2163
|
+
"vaultId": "devprime",
|
|
2164
|
+
"name": "Gauntlet Levered PRIME Dev",
|
|
2165
|
+
"protocol": "aera",
|
|
2166
|
+
"strategy": "Levered PRIME Looping",
|
|
2167
|
+
"deployments": [
|
|
2168
|
+
{
|
|
2169
|
+
"chain": "evm",
|
|
2170
|
+
"chainId": 1,
|
|
2171
|
+
"vaultAddress": "0x9E96A8A209D423F422293FCD5534a6b36cc376dA",
|
|
2172
|
+
"vaultType": "multi-depositor",
|
|
2173
|
+
"supplyToken": [
|
|
2174
|
+
{
|
|
2175
|
+
"address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
|
|
2176
|
+
"symbol": "USDC",
|
|
2177
|
+
"decimals": 6
|
|
2178
|
+
}
|
|
2179
|
+
]
|
|
2180
|
+
}
|
|
2181
|
+
]
|
|
2182
|
+
},
|
|
2183
|
+
{
|
|
2184
|
+
"vaultId": "gtlpraen",
|
|
2185
|
+
"name": "gtLPRAEN",
|
|
2186
|
+
"protocol": "aera",
|
|
2187
|
+
"strategy": "Gauntlet x Raenest Base LP Vault",
|
|
2188
|
+
"deployments": [
|
|
2189
|
+
{
|
|
2190
|
+
"chain": "evm",
|
|
2191
|
+
"chainId": 8453,
|
|
2192
|
+
"vaultAddress": "0x970173b2666736ebe040e2C3bef6c62664D9b0B9",
|
|
2193
|
+
"vaultType": "multi-depositor",
|
|
2194
|
+
"supplyToken": [
|
|
2195
|
+
{
|
|
2196
|
+
"address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
|
|
2197
|
+
"symbol": "USDC",
|
|
2198
|
+
"decimals": 6
|
|
2199
|
+
}
|
|
2200
|
+
]
|
|
2201
|
+
}
|
|
2202
|
+
]
|
|
2203
|
+
},
|
|
2204
|
+
{
|
|
2205
|
+
"vaultId": "devusdhy",
|
|
2206
|
+
"name": "devUSDhy",
|
|
2207
|
+
"protocol": "aera",
|
|
2208
|
+
"strategy": "Gauntlet High Yield Dev",
|
|
2209
|
+
"deployments": [
|
|
2210
|
+
{
|
|
2211
|
+
"chain": "evm",
|
|
2212
|
+
"chainId": 1,
|
|
2213
|
+
"vaultAddress": "0xeAf1f4C98635b56021a3EAabC08Fca3b24214084",
|
|
2214
|
+
"vaultType": "single-depositor",
|
|
2215
|
+
"supplyToken": [
|
|
2216
|
+
{
|
|
2217
|
+
"address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
|
|
2218
|
+
"symbol": "USDC",
|
|
2219
|
+
"decimals": 6
|
|
2220
|
+
}
|
|
2221
|
+
]
|
|
2222
|
+
}
|
|
2223
|
+
]
|
|
2224
|
+
},
|
|
2225
|
+
{
|
|
2226
|
+
"vaultId": "stgusdhy",
|
|
2227
|
+
"name": "stgUSDhy",
|
|
2228
|
+
"protocol": "aera",
|
|
2229
|
+
"strategy": "Gauntlet High Yield Staging",
|
|
2230
|
+
"deployments": [
|
|
2231
|
+
{
|
|
2232
|
+
"chain": "evm",
|
|
2233
|
+
"chainId": 1,
|
|
2234
|
+
"vaultAddress": "0x12081d6D2fC9AFe58390FF7B8909c8A31d4F4Ff2",
|
|
2235
|
+
"vaultType": "multi-depositor",
|
|
2236
|
+
"supplyToken": [
|
|
2237
|
+
{
|
|
2238
|
+
"address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
|
|
2239
|
+
"symbol": "USDC",
|
|
2240
|
+
"decimals": 6
|
|
2241
|
+
}
|
|
2242
|
+
]
|
|
2243
|
+
}
|
|
2244
|
+
]
|
|
2245
|
+
},
|
|
2246
|
+
{
|
|
2247
|
+
"vaultId": "gtusdhy",
|
|
2248
|
+
"name": "gtUSDhy",
|
|
2249
|
+
"protocol": "aera",
|
|
2250
|
+
"strategy": "Gauntlet High Yield Prod",
|
|
2251
|
+
"deployments": [
|
|
2252
|
+
{
|
|
2253
|
+
"chain": "evm",
|
|
2254
|
+
"chainId": 1,
|
|
2255
|
+
"vaultAddress": "0x15218Fbb0Efc0A3D5D731a242d853fa625532C3D",
|
|
2256
|
+
"vaultType": "multi-depositor",
|
|
2257
|
+
"supplyToken": [
|
|
2258
|
+
{
|
|
2259
|
+
"address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
|
|
2260
|
+
"symbol": "USDC",
|
|
2261
|
+
"decimals": 6
|
|
2262
|
+
}
|
|
2263
|
+
]
|
|
2264
|
+
}
|
|
2265
|
+
]
|
|
2266
|
+
},
|
|
2267
|
+
{
|
|
2268
|
+
"vaultId": "gtlooper",
|
|
2269
|
+
"name": "sUSDS Looping Dev",
|
|
2270
|
+
"protocol": "aera",
|
|
2271
|
+
"strategy": "sUSDS Looping",
|
|
2272
|
+
"deployments": [
|
|
2273
|
+
{
|
|
2274
|
+
"chain": "evm",
|
|
2275
|
+
"chainId": 1,
|
|
2276
|
+
"vaultAddress": "0x65bC393D16381b292221A664a783812A89f11DE6",
|
|
2277
|
+
"vaultType": "multi-depositor",
|
|
2278
|
+
"supplyToken": [
|
|
2279
|
+
{
|
|
2280
|
+
"address": "0xdC035D45d973E3EC169d2276DDab16f1e407384F",
|
|
2281
|
+
"symbol": "USDS",
|
|
2282
|
+
"decimals": 18
|
|
2283
|
+
}
|
|
2284
|
+
]
|
|
2285
|
+
}
|
|
2286
|
+
]
|
|
2287
|
+
},
|
|
2288
|
+
{
|
|
2289
|
+
"vaultId": "stgskylev",
|
|
2290
|
+
"name": "sUSDS Looping Staging",
|
|
2291
|
+
"protocol": "aera",
|
|
2292
|
+
"strategy": "sUSDS Looping",
|
|
2293
|
+
"deployments": [
|
|
2294
|
+
{
|
|
2295
|
+
"chain": "evm",
|
|
2296
|
+
"chainId": 1,
|
|
2297
|
+
"vaultAddress": "0x8BE13F43F1693F98343bD0C3DB6bE705D57221A3",
|
|
2298
|
+
"vaultType": "multi-depositor",
|
|
2299
|
+
"supplyToken": [
|
|
2300
|
+
{
|
|
2301
|
+
"address": "0xdC035D45d973E3EC169d2276DDab16f1e407384F",
|
|
2302
|
+
"symbol": "USDS",
|
|
2303
|
+
"decimals": 18
|
|
2304
|
+
}
|
|
2305
|
+
]
|
|
2306
|
+
}
|
|
2307
|
+
]
|
|
2308
|
+
},
|
|
2309
|
+
{
|
|
2310
|
+
"vaultId": "gtskylooping",
|
|
2311
|
+
"name": "Gauntlet sUSDS Looping",
|
|
2312
|
+
"protocol": "aera",
|
|
2313
|
+
"strategy": "sUSDS Looping",
|
|
2314
|
+
"deployments": [
|
|
2315
|
+
{
|
|
2316
|
+
"chain": "evm",
|
|
2317
|
+
"chainId": 1,
|
|
2318
|
+
"vaultAddress": "0xeA40De595f099cA04695b0Ca105499E50AF77f92",
|
|
2319
|
+
"vaultType": "multi-depositor",
|
|
2320
|
+
"supplyToken": [
|
|
2321
|
+
{
|
|
2322
|
+
"address": "0xdC035D45d973E3EC169d2276DDab16f1e407384F",
|
|
2323
|
+
"symbol": "USDS",
|
|
2324
|
+
"decimals": 18
|
|
2325
|
+
}
|
|
2326
|
+
]
|
|
2327
|
+
}
|
|
2328
|
+
]
|
|
2077
2329
|
}
|
|
2078
2330
|
]
|
|
2079
2331
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gauntlet-xyz/sdk",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.5.0",
|
|
4
4
|
"description": "Official Gauntlet SDK for vault deposits, withdrawals, and attribution",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"keywords": [
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
"@viem/anvil": "^0.0.10",
|
|
61
61
|
"echo-cli": "^2.0.0",
|
|
62
62
|
"eslint": "^8.57.0",
|
|
63
|
-
"typescript": "~5.
|
|
63
|
+
"typescript": "~5.6.3",
|
|
64
64
|
"viem": "2.30.1",
|
|
65
65
|
"vitest": "^4.1.2"
|
|
66
66
|
},
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import { GauntletSDKError } from '../errors';
|
|
2
|
+
import type { ActivityOptions, GauntletApi, TokenRef, UserActivity } from './client';
|
|
3
|
+
import { decimalToBigInt, sharesToBigInt } from './decimal';
|
|
4
|
+
import { SettlementTimeoutError } from './errors';
|
|
5
|
+
|
|
6
|
+
export type ActivityFlowKind = 'deposit' | 'withdraw' | 'transfer_in' | 'transfer_out';
|
|
7
|
+
export type ActivityFlowStatus = 'settled' | 'pending' | 'refunded';
|
|
8
|
+
|
|
9
|
+
/** A signed token amount as reported by the API, with base-unit conversion when possible. */
|
|
10
|
+
export interface AssetAmount {
|
|
11
|
+
/** Human-unit decimal string exactly as the API emits it, e.g. `"1250.5"`. */
|
|
12
|
+
decimal: string;
|
|
13
|
+
/** Base-unit integer (`decimal × 10^token.decimals`); null when the token's decimals are unknown. */
|
|
14
|
+
raw: bigint | null;
|
|
15
|
+
token: TokenRef | null;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* One user action against a vault, stitched from the activity log's immutable
|
|
20
|
+
* rows. Sync flows (Morpho, secondary-market transfers) come from a single
|
|
21
|
+
* row; Aera async flows pair a `*_pending` request row with its terminal
|
|
22
|
+
* settle/refund row via `request_hash`.
|
|
23
|
+
*/
|
|
24
|
+
export interface ActivityFlow {
|
|
25
|
+
kind: ActivityFlowKind;
|
|
26
|
+
status: ActivityFlowStatus;
|
|
27
|
+
/** CAIP-10 vault id (`"{chainId}:{address}"`). */
|
|
28
|
+
vaultId: string;
|
|
29
|
+
/** Aera async correlation hash; null for sync flows and transfers. */
|
|
30
|
+
requestHash: string | null;
|
|
31
|
+
/** When the request row landed. Null when the flow's pending row is outside the fetched window. */
|
|
32
|
+
requestedAt: Date | null;
|
|
33
|
+
/** When the terminal (settle/refund) row landed. Null while pending. */
|
|
34
|
+
settledAt: Date | null;
|
|
35
|
+
/** Magnitude of the flow's asset movement (requested amount for refunded flows). */
|
|
36
|
+
assets: AssetAmount;
|
|
37
|
+
/** Magnitude of the flow's share movement in 18-decimal base units. */
|
|
38
|
+
shares: bigint;
|
|
39
|
+
/** Transaction hashes in row order (request first, then settlement, when both are known). */
|
|
40
|
+
txHashes: string[];
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const PENDING_TYPES = new Set(['deposit_pending', 'withdraw_pending']);
|
|
44
|
+
const REFUNDED_TYPES = new Set(['deposit_refunded', 'withdraw_refunded']);
|
|
45
|
+
|
|
46
|
+
function flowKind(rowType: string): ActivityFlowKind {
|
|
47
|
+
if (rowType.startsWith('deposit')) return 'deposit';
|
|
48
|
+
if (rowType.startsWith('withdraw')) return 'withdraw';
|
|
49
|
+
if (rowType === 'transfer_in' || rowType === 'transfer_out') return rowType;
|
|
50
|
+
throw new GauntletSDKError(`Unknown activity row type "${rowType}"`);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function abs(value: bigint): bigint {
|
|
54
|
+
return value < 0n ? -value : value;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Comparison scale for asset amounts. The API emits human-unit decimal strings
|
|
59
|
+
* with at most `token.decimals` fractional digits, so 18 digits is exact for
|
|
60
|
+
* every supported asset.
|
|
61
|
+
*/
|
|
62
|
+
const ASSET_SCALE = 18;
|
|
63
|
+
|
|
64
|
+
function toAssetAmount(rows: UserActivity[]): AssetAmount {
|
|
65
|
+
// Per the API contract, at most one row of an async lifecycle carries the
|
|
66
|
+
// asset movement (the other legs are "0"), so the max magnitude is the
|
|
67
|
+
// flow's amount. For refunded flows this surfaces the requested amount
|
|
68
|
+
// instead of the useless net of zero.
|
|
69
|
+
let best = rows[0];
|
|
70
|
+
let bestMagnitude = abs(decimalToBigInt(best.assets_delta.native, ASSET_SCALE));
|
|
71
|
+
for (const row of rows.slice(1)) {
|
|
72
|
+
const magnitude = abs(decimalToBigInt(row.assets_delta.native, ASSET_SCALE));
|
|
73
|
+
if (magnitude > bestMagnitude) {
|
|
74
|
+
best = row;
|
|
75
|
+
bestMagnitude = magnitude;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
const token =
|
|
79
|
+
best.assets_delta.token ?? rows.find((r) => r.assets_delta.token)?.assets_delta.token ?? null;
|
|
80
|
+
const decimal = best.assets_delta.native.replace(/^-/, '');
|
|
81
|
+
const raw = token?.decimals != null ? decimalToBigInt(decimal, token.decimals) : null;
|
|
82
|
+
return { decimal, raw, token };
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Pure stitcher: folds raw activity rows into `ActivityFlow`s. Rows may be in
|
|
87
|
+
* any order and may span multiple vaults; async lifecycles are paired by
|
|
88
|
+
* `request_hash`. Flows are returned newest-first (by the flow's latest row).
|
|
89
|
+
*/
|
|
90
|
+
export function stitchActivityFlows(rows: UserActivity[]): ActivityFlow[] {
|
|
91
|
+
const groups = new Map<string, UserActivity[]>();
|
|
92
|
+
for (const [index, row] of rows.entries()) {
|
|
93
|
+
// Rows without a request_hash are standalone sync flows: each one is its
|
|
94
|
+
// own group, so two same-type events in one transaction (e.g. a multicall
|
|
95
|
+
// doing two deposits) stay two flows.
|
|
96
|
+
const key = row.request_hash ?? `row:${index}`;
|
|
97
|
+
const group = groups.get(key);
|
|
98
|
+
if (group) group.push(row);
|
|
99
|
+
else groups.set(key, [row]);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const flows: ActivityFlow[] = [];
|
|
103
|
+
for (const group of groups.values()) {
|
|
104
|
+
group.sort((a, b) => a.block_timestamp - b.block_timestamp);
|
|
105
|
+
const pendingRow = group.find((r) => PENDING_TYPES.has(r.type)) ?? null;
|
|
106
|
+
const terminalRow = group.find((r) => !PENDING_TYPES.has(r.type)) ?? null;
|
|
107
|
+
const isAsync = group.some((r) => r.request_hash != null);
|
|
108
|
+
|
|
109
|
+
let status: ActivityFlowStatus;
|
|
110
|
+
if (!terminalRow) status = 'pending';
|
|
111
|
+
else if (REFUNDED_TYPES.has(terminalRow.type)) status = 'refunded';
|
|
112
|
+
else status = 'settled';
|
|
113
|
+
|
|
114
|
+
let sharesMagnitude = 0n;
|
|
115
|
+
for (const row of group) {
|
|
116
|
+
const shares = abs(sharesToBigInt(row.shares_delta));
|
|
117
|
+
if (shares > sharesMagnitude) sharesMagnitude = shares;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
flows.push({
|
|
121
|
+
kind: flowKind((terminalRow ?? pendingRow ?? group[0]).type),
|
|
122
|
+
status,
|
|
123
|
+
vaultId: group[0].vault_id,
|
|
124
|
+
requestHash: group[0].request_hash ?? null,
|
|
125
|
+
requestedAt: pendingRow
|
|
126
|
+
? new Date(pendingRow.block_timestamp * 1000)
|
|
127
|
+
: isAsync
|
|
128
|
+
? null
|
|
129
|
+
: new Date(group[0].block_timestamp * 1000),
|
|
130
|
+
settledAt: terminalRow ? new Date(terminalRow.block_timestamp * 1000) : null,
|
|
131
|
+
assets: toAssetAmount(group),
|
|
132
|
+
shares: sharesMagnitude,
|
|
133
|
+
txHashes: [...new Set(group.map((r) => r.tx_hash))],
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
return flows.sort((a, b) => {
|
|
138
|
+
const aAt = (a.settledAt ?? a.requestedAt)?.getTime() ?? 0;
|
|
139
|
+
const bAt = (b.settledAt ?? b.requestedAt)?.getTime() ?? 0;
|
|
140
|
+
return bAt - aAt;
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
export interface ActivityFlowsOptions extends Pick<ActivityOptions, 'vaultId' | 'limit'> {
|
|
145
|
+
/** Stop paginating once this many rows have been fetched. Defaults to 1000. */
|
|
146
|
+
maxRows?: number;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Fetches the wallet's activity log and stitches it into lifecycle-aware
|
|
151
|
+
* flows — the replacement for scanning vault event logs over RPC.
|
|
152
|
+
*
|
|
153
|
+
* ```ts
|
|
154
|
+
* const flows = await getActivityFlows(client.api, wallet);
|
|
155
|
+
* const open = flows.filter((f) => f.status === 'pending');
|
|
156
|
+
* ```
|
|
157
|
+
*/
|
|
158
|
+
export async function getActivityFlows(
|
|
159
|
+
api: GauntletApi,
|
|
160
|
+
walletAddress: string,
|
|
161
|
+
options: ActivityFlowsOptions = {}
|
|
162
|
+
): Promise<ActivityFlow[]> {
|
|
163
|
+
const maxRows = options.maxRows ?? 1000;
|
|
164
|
+
const rows: UserActivity[] = [];
|
|
165
|
+
for await (const row of api.activityRows(walletAddress, {
|
|
166
|
+
vaultId: options.vaultId,
|
|
167
|
+
// The API caps page size at 1000; request maxRows per page so the common
|
|
168
|
+
// case is a single round trip instead of ten default-100 pages.
|
|
169
|
+
limit: options.limit ?? Math.min(maxRows, 1000),
|
|
170
|
+
order: 'desc',
|
|
171
|
+
})) {
|
|
172
|
+
rows.push(row);
|
|
173
|
+
if (rows.length >= maxRows) break;
|
|
174
|
+
}
|
|
175
|
+
const flows = stitchActivityFlows(rows);
|
|
176
|
+
if (rows.length >= maxRows) {
|
|
177
|
+
// The window cut may have split an async lifecycle, keeping a terminal
|
|
178
|
+
// row whose request leg (the one carrying the amount) fell outside the
|
|
179
|
+
// window. Drop those flows rather than reporting zeroed amounts.
|
|
180
|
+
return flows.filter((f) => f.requestHash === null || f.requestedAt !== null);
|
|
181
|
+
}
|
|
182
|
+
return flows;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
export interface WaitForSettlementOptions {
|
|
186
|
+
/** CAIP-10 vault id — narrows polling to one vault's activity. */
|
|
187
|
+
vaultId?: string;
|
|
188
|
+
/** Polling interval. Defaults to 5s. */
|
|
189
|
+
pollIntervalMs?: number;
|
|
190
|
+
/** Overall deadline. Defaults to 10 minutes. Throws `SettlementTimeoutError` on expiry. */
|
|
191
|
+
timeoutMs?: number;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Polls the activity log until the Aera async request identified by
|
|
196
|
+
* `requestHash` reaches a terminal state, and returns the settled or refunded
|
|
197
|
+
* flow. Use after submitting a `requestDeposit` / `requestRedeem` transaction.
|
|
198
|
+
*/
|
|
199
|
+
export async function waitForRequestSettlement(
|
|
200
|
+
api: GauntletApi,
|
|
201
|
+
walletAddress: string,
|
|
202
|
+
requestHash: string,
|
|
203
|
+
options: WaitForSettlementOptions = {}
|
|
204
|
+
): Promise<ActivityFlow> {
|
|
205
|
+
const pollIntervalMs = options.pollIntervalMs ?? 5_000;
|
|
206
|
+
const timeoutMs = options.timeoutMs ?? 600_000;
|
|
207
|
+
const deadline = Date.now() + timeoutMs;
|
|
208
|
+
|
|
209
|
+
for (;;) {
|
|
210
|
+
const flows = await getActivityFlows(api, walletAddress, { vaultId: options.vaultId });
|
|
211
|
+
const flow = flows.find((f) => f.requestHash === requestHash);
|
|
212
|
+
if (flow && flow.status !== 'pending') return flow;
|
|
213
|
+
|
|
214
|
+
if (Date.now() + pollIntervalMs > deadline) {
|
|
215
|
+
throw new SettlementTimeoutError(requestHash, timeoutMs);
|
|
216
|
+
}
|
|
217
|
+
await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));
|
|
218
|
+
}
|
|
219
|
+
}
|
package/src/api/caip.ts
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { GauntletClient } from '../client';
|
|
2
|
+
import { VaultNotFoundError } from '../errors';
|
|
3
|
+
import { resolveVault } from '../evm/vaults';
|
|
4
|
+
import { InvalidCaipIdError } from './errors';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* The Gaia API identifies vaults as `"{chainId}:{address}"` with a lowercase
|
|
8
|
+
* address (a CAIP-10-style account id without the `eip155` namespace prefix).
|
|
9
|
+
*/
|
|
10
|
+
export interface ApiVaultId {
|
|
11
|
+
chainId: number;
|
|
12
|
+
/** Lowercase EVM address. */
|
|
13
|
+
address: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function parseApiVaultId(id: string): ApiVaultId {
|
|
17
|
+
const match = /^(?:eip155:)?(\d+):(0x[0-9a-fA-F]{40})$/.exec(id);
|
|
18
|
+
if (!match) throw new InvalidCaipIdError(id);
|
|
19
|
+
return { chainId: Number(match[1]), address: match[2].toLowerCase() };
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function formatApiVaultId(chainId: number, address: string): string {
|
|
23
|
+
return `${chainId}:${address.toLowerCase()}`;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Resolves a manifest vault id (e.g. `VaultId.AeraUsdAlpha` / `'gtusda'`) to
|
|
28
|
+
* the Gaia API's CAIP-10 id for the vault's deployment on `chainId`.
|
|
29
|
+
*
|
|
30
|
+
* Deployment resolution is `resolveVault` — the same rules tx-building uses:
|
|
31
|
+
* single-deployment vaults resolve directly (a mismatched explicit `chainId`
|
|
32
|
+
* throws `ChainMismatchError`), multi-chain vaults default to Base when
|
|
33
|
+
* `chainId` is omitted.
|
|
34
|
+
*/
|
|
35
|
+
export async function apiVaultIdFromVaultId(
|
|
36
|
+
client: GauntletClient,
|
|
37
|
+
vaultId: string,
|
|
38
|
+
chainId?: number
|
|
39
|
+
): Promise<string> {
|
|
40
|
+
const resolved = await resolveVault(client, vaultId, chainId);
|
|
41
|
+
if (!resolved) throw new VaultNotFoundError(vaultId, chainId);
|
|
42
|
+
return formatApiVaultId(resolved.vault.chainId, resolved.vault.vaultAddress);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Resolves a Gaia API CAIP-10 vault id back to the manifest vault id, or
|
|
47
|
+
* `undefined` when the vault is not in the bundled manifest (the API indexes
|
|
48
|
+
* more vaults than the manifest lists).
|
|
49
|
+
*/
|
|
50
|
+
export async function vaultIdFromApiVaultId(
|
|
51
|
+
client: GauntletClient,
|
|
52
|
+
apiVaultId: string
|
|
53
|
+
): Promise<string | undefined> {
|
|
54
|
+
const { chainId, address } = parseApiVaultId(apiVaultId);
|
|
55
|
+
const manifest = await client.manifest;
|
|
56
|
+
return manifest.vaults.find((v) =>
|
|
57
|
+
v.deployments.some(
|
|
58
|
+
(d) => d.chain === 'evm' && d.chainId === chainId && d.vaultAddress.toLowerCase() === address
|
|
59
|
+
)
|
|
60
|
+
)?.vaultId;
|
|
61
|
+
}
|