@andrewkimjoseph/celina-sdk 0.4.0 → 0.4.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.
- package/README.md +17 -0
- package/build/abis/ubi-scheme.d.ts +12 -0
- package/build/abis/ubi-scheme.js +7 -0
- package/build/abis/ubi-scheme.js.map +1 -1
- package/build/services/gooddollar.service.d.ts +8 -1
- package/build/services/gooddollar.service.js +66 -26
- package/build/services/gooddollar.service.js.map +1 -1
- package/build/services/uniswap-path-router.js +43 -43
- package/build/services/uniswap-path-router.js.map +1 -1
- package/build/services/uniswap-pool-discovery.d.ts +13 -0
- package/build/services/uniswap-pool-discovery.js +68 -71
- package/build/services/uniswap-pool-discovery.js.map +1 -1
- package/build/utils/format-duration.d.ts +2 -0
- package/build/utils/format-duration.js +17 -0
- package/build/utils/format-duration.js.map +1 -0
- package/build/utils/format-unix-datetime.d.ts +4 -0
- package/build/utils/format-unix-datetime.js +18 -0
- package/build/utils/format-unix-datetime.js.map +1 -0
- package/package.json +1 -1
- package/tests/catalog/domains/defi.ts +7 -1
package/README.md
CHANGED
|
@@ -18,6 +18,8 @@ Requires Node.js ≥ 20.
|
|
|
18
18
|
|
|
19
19
|
- [Quick start](https://andrewkimjoseph.gitbook.io/celina-sdk/getting-started/quick-start)
|
|
20
20
|
- [wagmi integration](https://andrewkimjoseph.gitbook.io/celina-sdk/guides/wagmi-integration)
|
|
21
|
+
- [Aave](https://andrewkimjoseph.gitbook.io/celina-sdk/guides/aave)
|
|
22
|
+
- [GoodDollar UBI](docs/guides/gooddollar.md) — whitelist, daily entitlement, `prepareClaimUbi` on Celo
|
|
21
23
|
- [Carbon DeFi on Celo](docs/guides/carbon.md) — hybrid Carbon REST + `@bancor/carbon-sdk` (25 operations)
|
|
22
24
|
- [Self Agent ID](docs/guides/self-agent-id.md) — verify, register, and refresh human-backed agents on Celo
|
|
23
25
|
- [Telemetry](docs/guides/telemetry.md) — optional Amplitude read metrics (opt out with `CELINA_ANALYTICS_DISABLED=1`)
|
|
@@ -48,8 +50,23 @@ const prepared = await celina.carbon.prepareLimitOrder({
|
|
|
48
50
|
budget: 100,
|
|
49
51
|
});
|
|
50
52
|
// prepared.preparedFlow?.steps → same signing flow; check prepared.warnings
|
|
53
|
+
|
|
54
|
+
// GoodDollar UBI (reads + unsigned claim)
|
|
55
|
+
const eligibility = await celina.gooddollar.getUbiClaimEligibility("0xYourAddress");
|
|
56
|
+
const ubiFlow = await celina.gooddollar.prepareClaimUbi("0xYourAddress");
|
|
57
|
+
// ubiFlow.steps → wagmi sendTransaction (G$ to signer, gas in CELO)
|
|
51
58
|
```
|
|
52
59
|
|
|
60
|
+
## GoodDollar UBI
|
|
61
|
+
|
|
62
|
+
Identity whitelist reads, daily entitlement checks, and unsigned `UBISchemeV2.claim()` preparation on Celo mainnet. One claim per verified identity per day; connected wallets resolve via `getWhitelistedRoot`.
|
|
63
|
+
|
|
64
|
+
| Reads (`celina.gooddollar`) | Prepare (unsigned) |
|
|
65
|
+
|-----------------------------|-------------------|
|
|
66
|
+
| `getWhitelistingInfo`, `getUbiClaimEligibility` | `prepareClaimUbi` |
|
|
67
|
+
|
|
68
|
+
MCP tools: `get_gooddollar_whitelisting_info`, `get_gooddollar_ubi_entitlement` (read); `claim_daily_gooddollar_ubi` (stdio write with server key). Full workflow: [GoodDollar guide](docs/guides/gooddollar.md).
|
|
69
|
+
|
|
53
70
|
## Carbon DeFi
|
|
54
71
|
|
|
55
72
|
Hybrid **Carbon REST** (`https://mcp.carbondefi.xyz`) plus **`@bancor/carbon-sdk`** fallback for trade quotes and taker swaps when REST is unavailable. All 25 operations target Celo mainnet; no private keys — `prepare*` returns unsigned flows for the user’s wallet.
|
|
@@ -31,6 +31,18 @@ export declare const ubiSchemeAbi: readonly [{
|
|
|
31
31
|
readonly name: "";
|
|
32
32
|
readonly type: "bool";
|
|
33
33
|
}];
|
|
34
|
+
}, {
|
|
35
|
+
readonly name: "lastClaimed";
|
|
36
|
+
readonly type: "function";
|
|
37
|
+
readonly stateMutability: "view";
|
|
38
|
+
readonly inputs: readonly [{
|
|
39
|
+
readonly name: "";
|
|
40
|
+
readonly type: "address";
|
|
41
|
+
}];
|
|
42
|
+
readonly outputs: readonly [{
|
|
43
|
+
readonly name: "";
|
|
44
|
+
readonly type: "uint256";
|
|
45
|
+
}];
|
|
34
46
|
}, {
|
|
35
47
|
readonly name: "paused";
|
|
36
48
|
readonly type: "function";
|
package/build/abis/ubi-scheme.js
CHANGED
|
@@ -20,6 +20,13 @@ export const ubiSchemeAbi = [
|
|
|
20
20
|
inputs: [{ name: "account", type: "address" }],
|
|
21
21
|
outputs: [{ name: "", type: "bool" }],
|
|
22
22
|
},
|
|
23
|
+
{
|
|
24
|
+
name: "lastClaimed",
|
|
25
|
+
type: "function",
|
|
26
|
+
stateMutability: "view",
|
|
27
|
+
inputs: [{ name: "", type: "address" }],
|
|
28
|
+
outputs: [{ name: "", type: "uint256" }],
|
|
29
|
+
},
|
|
23
30
|
{
|
|
24
31
|
name: "paused",
|
|
25
32
|
type: "function",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ubi-scheme.js","sourceRoot":"","sources":["../../src/abis/ubi-scheme.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B;QACE,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,YAAY;QAC7B,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;KACtC;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,MAAM;QACvB,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAC9C,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;KACzC;IACD;QACE,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,MAAM;QACvB,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAC9C,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;KACtC;IACD;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,MAAM;QACvB,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;KACtC;IACD;QACE,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,MAAM;QACvB,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;KACzC;IACD;QACE,IAAI,EAAE,sBAAsB;QAC5B,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,MAAM;QACvB,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;KACzC;IACD;QACE,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,MAAM;QACvB,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;KACzC;IACD;QACE,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,MAAM;QACvB,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;KACzC;CACqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"ubi-scheme.js","sourceRoot":"","sources":["../../src/abis/ubi-scheme.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B;QACE,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,YAAY;QAC7B,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;KACtC;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,MAAM;QACvB,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAC9C,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;KACzC;IACD;QACE,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,MAAM;QACvB,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAC9C,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;KACtC;IACD;QACE,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,MAAM;QACvB,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QACvC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;KACzC;IACD;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,MAAM;QACvB,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;KACtC;IACD;QACE,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,MAAM;QACvB,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;KACzC;IACD;QACE,IAAI,EAAE,sBAAsB;QAC5B,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,MAAM;QACvB,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;KACzC;IACD;QACE,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,MAAM;QACvB,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;KACzC;IACD;QACE,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,MAAM;QACvB,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;KACzC;CACqB,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { CeloClientFactory } from "../clients/celo-client.js";
|
|
2
2
|
import { type SerializedPreparedFlow } from "../types/prepared.js";
|
|
3
|
-
/** GoodDollar IdentityV4 whitelist
|
|
3
|
+
/** GoodDollar IdentityV4 whitelist, reverification, and daily UBI claim preparation. */
|
|
4
4
|
export declare class GoodDollarService {
|
|
5
5
|
private readonly clientFactory;
|
|
6
6
|
constructor(clientFactory: CeloClientFactory);
|
|
@@ -53,6 +53,12 @@ export declare class GoodDollarService {
|
|
|
53
53
|
claimableAmount: string;
|
|
54
54
|
claimableAmountFormatted: string;
|
|
55
55
|
alreadyClaimedToday: boolean;
|
|
56
|
+
inClaimCooldown: boolean;
|
|
57
|
+
lastClaimedAt: string | null;
|
|
58
|
+
nextClaimAvailableAt: string;
|
|
59
|
+
secondsUntilNextClaim: string;
|
|
60
|
+
nextClaimAvailableIn: string;
|
|
61
|
+
ubiPeriodDay: string;
|
|
56
62
|
schemePaused: boolean;
|
|
57
63
|
schemeStarted: boolean;
|
|
58
64
|
estimatedDailyUbi: string;
|
|
@@ -61,6 +67,7 @@ export declare class GoodDollarService {
|
|
|
61
67
|
currentDailyUbiFormatted: string;
|
|
62
68
|
reasons: string[];
|
|
63
69
|
identity: {
|
|
70
|
+
checkedAddress: `0x${string}`;
|
|
64
71
|
isCurrentlyWhitelisted: boolean;
|
|
65
72
|
statusLabel: string;
|
|
66
73
|
reverification: {
|
|
@@ -8,6 +8,9 @@ import { GOODDOLLAR_IDENTITY_ADDRESS, GOODDOLLAR_UBI_SCHEME_ADDRESS, } from "../
|
|
|
8
8
|
import { CELINA_DATA_SUFFIX } from "../config/celina-tag.js";
|
|
9
9
|
import { serializePreparedFlow, } from "../types/prepared.js";
|
|
10
10
|
import { formatUnixDate } from "../utils/format-date.js";
|
|
11
|
+
import { formatDuration } from "../utils/format-duration.js";
|
|
12
|
+
import { formatUnixDateTimeUtc, formatUnixIso, } from "../utils/format-unix-datetime.js";
|
|
13
|
+
const SECONDS_PER_DAY = 86400n;
|
|
11
14
|
const G_DOLLAR_DECIMALS = 18;
|
|
12
15
|
const ZERO_ADDRESS = "0x0000000000000000000000000000000000000000";
|
|
13
16
|
const STATUS_LABELS = {
|
|
@@ -24,7 +27,7 @@ function statusLabel(status) {
|
|
|
24
27
|
function taggedCalldata(data) {
|
|
25
28
|
return concat([data, CELINA_DATA_SUFFIX]);
|
|
26
29
|
}
|
|
27
|
-
/** GoodDollar IdentityV4 whitelist
|
|
30
|
+
/** GoodDollar IdentityV4 whitelist, reverification, and daily UBI claim preparation. */
|
|
28
31
|
export class GoodDollarService {
|
|
29
32
|
clientFactory;
|
|
30
33
|
constructor(clientFactory) {
|
|
@@ -107,7 +110,7 @@ export class GoodDollarService {
|
|
|
107
110
|
const client = this.getPublicClient();
|
|
108
111
|
const ubiContract = GOODDOLLAR_UBI_SCHEME_ADDRESS;
|
|
109
112
|
const identityContract = GOODDOLLAR_IDENTITY_ADDRESS;
|
|
110
|
-
const [whitelistedRoot, claimableAmount, schemePaused, periodStart, estimatedDailyUbi, dailyUbi,
|
|
113
|
+
const [whitelistedRoot, claimableAmount, schemePaused, periodStart, estimatedDailyUbi, dailyUbi, ubiPeriodDay,] = await Promise.all([
|
|
111
114
|
client.readContract({
|
|
112
115
|
address: identityContract,
|
|
113
116
|
abi: goodDollarIdentityAbi,
|
|
@@ -140,50 +143,80 @@ export class GoodDollarService {
|
|
|
140
143
|
abi: ubiSchemeAbi,
|
|
141
144
|
functionName: "dailyUbi",
|
|
142
145
|
}),
|
|
143
|
-
|
|
146
|
+
client.readContract({
|
|
147
|
+
address: ubiContract,
|
|
148
|
+
abi: ubiSchemeAbi,
|
|
149
|
+
functionName: "currentDay",
|
|
150
|
+
}),
|
|
144
151
|
]);
|
|
145
152
|
const root = whitelistedRoot;
|
|
146
153
|
const claimable = claimableAmount;
|
|
154
|
+
const periodStartBn = periodStart;
|
|
147
155
|
const nowSec = BigInt(Math.floor(Date.now() / 1000));
|
|
148
|
-
const schemeStarted = nowSec >=
|
|
156
|
+
const schemeStarted = nowSec >= periodStartBn;
|
|
157
|
+
const identityAddress = root !== ZERO_ADDRESS ? root : address;
|
|
149
158
|
let alreadyClaimedToday = false;
|
|
159
|
+
let lastClaimedSec = 0n;
|
|
150
160
|
if (root !== ZERO_ADDRESS) {
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
161
|
+
const [hasClaimed, lastClaimed] = await Promise.all([
|
|
162
|
+
client.readContract({
|
|
163
|
+
address: ubiContract,
|
|
164
|
+
abi: ubiSchemeAbi,
|
|
165
|
+
functionName: "hasClaimed",
|
|
166
|
+
args: [root],
|
|
167
|
+
}),
|
|
168
|
+
client.readContract({
|
|
169
|
+
address: ubiContract,
|
|
170
|
+
abi: ubiSchemeAbi,
|
|
171
|
+
functionName: "lastClaimed",
|
|
172
|
+
args: [root],
|
|
173
|
+
}),
|
|
174
|
+
]);
|
|
175
|
+
alreadyClaimedToday = hasClaimed;
|
|
176
|
+
lastClaimedSec = lastClaimed;
|
|
157
177
|
}
|
|
178
|
+
const whitelistingInfo = await this.getWhitelistingInfo(identityAddress);
|
|
179
|
+
const currentContractDay = schemeStarted && periodStartBn > 0n
|
|
180
|
+
? (nowSec - periodStartBn) / SECONDS_PER_DAY
|
|
181
|
+
: 0n;
|
|
182
|
+
const nextClaimAt = periodStartBn + (currentContractDay + 1n) * SECONDS_PER_DAY;
|
|
183
|
+
const secondsUntilNextClaim = nextClaimAt > nowSec ? nextClaimAt - nowSec : 0n;
|
|
184
|
+
const inClaimCooldown = root !== ZERO_ADDRESS && alreadyClaimedToday;
|
|
158
185
|
const reasons = [];
|
|
159
|
-
if (root === ZERO_ADDRESS) {
|
|
160
|
-
reasons.push("not whitelisted");
|
|
161
|
-
}
|
|
162
|
-
if (!whitelistingInfo.isCurrentlyWhitelisted) {
|
|
163
|
-
if (whitelistingInfo.reverification?.isReverificationOverdue) {
|
|
164
|
-
reasons.push("reverification overdue");
|
|
165
|
-
}
|
|
166
|
-
else if (root !== ZERO_ADDRESS) {
|
|
167
|
-
reasons.push("identity not currently whitelisted");
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
186
|
if (schemePaused) {
|
|
171
187
|
reasons.push("scheme paused");
|
|
172
188
|
}
|
|
173
189
|
if (!schemeStarted) {
|
|
174
190
|
reasons.push("scheme not started");
|
|
175
191
|
}
|
|
176
|
-
if (
|
|
177
|
-
reasons.push("
|
|
192
|
+
if (root === ZERO_ADDRESS) {
|
|
193
|
+
reasons.push("not whitelisted");
|
|
194
|
+
}
|
|
195
|
+
else if (alreadyClaimedToday) {
|
|
196
|
+
const waitLabel = formatDuration(secondsUntilNextClaim);
|
|
197
|
+
const atLabel = formatUnixDateTimeUtc(nextClaimAt);
|
|
198
|
+
reasons.push(`already claimed this period; next claim in ${waitLabel} (${atLabel})`);
|
|
178
199
|
}
|
|
179
|
-
|
|
180
|
-
|
|
200
|
+
else {
|
|
201
|
+
if (!whitelistingInfo.isCurrentlyWhitelisted) {
|
|
202
|
+
if (whitelistingInfo.reverification?.isReverificationOverdue) {
|
|
203
|
+
reasons.push("reverification overdue");
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
reasons.push("identity not currently whitelisted");
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
if (claimable === 0n) {
|
|
210
|
+
reasons.push("no entitlement available");
|
|
211
|
+
}
|
|
181
212
|
}
|
|
182
213
|
const isEligibleToClaim = root !== ZERO_ADDRESS &&
|
|
183
214
|
!schemePaused &&
|
|
184
215
|
schemeStarted &&
|
|
185
|
-
whitelistingInfo.isCurrentlyWhitelisted &&
|
|
186
216
|
claimable > 0n;
|
|
217
|
+
const lastClaimedAt = lastClaimedSec > 0n ? formatUnixIso(lastClaimedSec) : null;
|
|
218
|
+
const nextClaimAvailableAt = formatUnixIso(nextClaimAt);
|
|
219
|
+
const nextClaimAvailableIn = formatDuration(secondsUntilNextClaim);
|
|
187
220
|
return {
|
|
188
221
|
address,
|
|
189
222
|
contract: ubiContract,
|
|
@@ -194,6 +227,12 @@ export class GoodDollarService {
|
|
|
194
227
|
claimableAmount: claimable.toString(),
|
|
195
228
|
claimableAmountFormatted: claimable > 0n ? `${formatUnits(claimable, G_DOLLAR_DECIMALS)} G$` : "0 G$",
|
|
196
229
|
alreadyClaimedToday,
|
|
230
|
+
inClaimCooldown,
|
|
231
|
+
lastClaimedAt,
|
|
232
|
+
nextClaimAvailableAt,
|
|
233
|
+
secondsUntilNextClaim: secondsUntilNextClaim.toString(),
|
|
234
|
+
nextClaimAvailableIn,
|
|
235
|
+
ubiPeriodDay: ubiPeriodDay.toString(),
|
|
197
236
|
schemePaused,
|
|
198
237
|
schemeStarted,
|
|
199
238
|
estimatedDailyUbi: estimatedDailyUbi.toString(),
|
|
@@ -202,6 +241,7 @@ export class GoodDollarService {
|
|
|
202
241
|
currentDailyUbiFormatted: `${formatUnits(dailyUbi, G_DOLLAR_DECIMALS)} G$`,
|
|
203
242
|
reasons: isEligibleToClaim ? [] : reasons,
|
|
204
243
|
identity: {
|
|
244
|
+
checkedAddress: identityAddress,
|
|
205
245
|
isCurrentlyWhitelisted: whitelistingInfo.isCurrentlyWhitelisted,
|
|
206
246
|
statusLabel: whitelistingInfo.statusLabel,
|
|
207
247
|
reverification: whitelistingInfo.reverification,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gooddollar.service.js","sourceRoot":"","sources":["../../src/services/gooddollar.service.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,WAAW,EAAY,MAAM,MAAM,CAAC;AAEzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EACL,2BAA2B,EAC3B,6BAA6B,GAC9B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAEL,qBAAqB,GAEtB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"gooddollar.service.js","sourceRoot":"","sources":["../../src/services/gooddollar.service.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,WAAW,EAAY,MAAM,MAAM,CAAC;AAEzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EACL,2BAA2B,EAC3B,6BAA6B,GAC9B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAEL,qBAAqB,GAEtB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EACL,qBAAqB,EACrB,aAAa,GACd,MAAM,kCAAkC,CAAC;AAE1C,MAAM,eAAe,GAAG,MAAM,CAAC;AAE/B,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAC7B,MAAM,YAAY,GAAG,4CAAqD,CAAC;AAE3E,MAAM,aAAa,GAA2B;IAC5C,CAAC,EAAE,MAAM;IACT,CAAC,EAAE,aAAa;IAChB,CAAC,EAAE,cAAc;IACjB,GAAG,EAAE,aAAa;CACnB,CAAC;AAEF,qFAAqF;AACrF,MAAM,kBAAkB,GAAG,UAAU,CAAC;AAEtC,SAAS,WAAW,CAAC,MAAc;IACjC,OAAO,aAAa,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC;AAC5C,CAAC;AAED,SAAS,cAAc,CAAC,IAAS;IAC/B,OAAO,MAAM,CAAC,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,wFAAwF;AACxF,MAAM,OAAO,iBAAiB;IACC;IAA7B,YAA6B,aAAgC;QAAhC,kBAAa,GAAb,aAAa,CAAmB;IAAG,CAAC;IAEzD,eAAe;QACrB,OAAO,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC;IAChD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,mBAAmB,CAAC,OAAsB;QAC9C,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC;QAC3D,MAAM,QAAQ,GAAG,2BAA2B,CAAC;QAE7C,MAAM,CACJ,cAAc,EACd,sBAAsB,EACtB,2BAA2B,EAC3B,mBAAmB,EACpB,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACpB,MAAM,CAAC,YAAY,CAAC;gBAClB,OAAO,EAAE,QAAQ;gBACjB,GAAG,EAAE,qBAAqB;gBAC1B,YAAY,EAAE,YAAY;gBAC1B,IAAI,EAAE,CAAC,OAAO,CAAC;aAChB,CAAC;YACF,MAAM,CAAC,YAAY,CAAC;gBAClB,OAAO,EAAE,QAAQ;gBACjB,GAAG,EAAE,qBAAqB;gBAC1B,YAAY,EAAE,eAAe;gBAC7B,IAAI,EAAE,CAAC,OAAO,CAAC;aAChB,CAAC;YACF,MAAM,CAAC,YAAY,CAAC;gBAClB,OAAO,EAAE,QAAQ;gBACjB,GAAG,EAAE,qBAAqB;gBAC1B,YAAY,EAAE,sBAAsB;aACrC,CAAC;YACF,IAAI,CAAC,wBAAwB,CAAC,MAAM,EAAE,QAAQ,CAAC;SAChD,CAAC,CAAC;QAEH,MAAM,CACJ,iBAAiB,EACjB,SAAS,EACT,GAAG,EACH,oBAAoB,EACpB,MAAM,EACN,SAAS,EACV,GAAG,cAAc,CAAC;QAEnB,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QACjC,MAAM,oBAAoB,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACvD,MAAM,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;QACvC,MAAM,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;QAEvC,IAAI,+BAA+B,GAAkB,IAAI,CAAC;QAC1D,IAAI,SAAS,KAAK,CAAC,IAAI,oBAAoB,GAAG,CAAC,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClF,MAAM,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAChD,oBAAoB,EACpB,YAAY,EACZ,mBAAmB,CAAC,MAAM,CAC3B,CAAC;YACF,+BAA+B;gBAC7B,mBAAmB,CAAC,kBAAkB,CAAC,IAAI,IAAI,CAAC;QACpD,CAAC;QAED,MAAM,mBAAmB,GAAG,SAAS,KAAK,CAAC,IAAI,YAAY,GAAG,CAAC,CAAC;QAEhE,MAAM,cAAc,GAClB,SAAS,KAAK,CAAC,IAAI,oBAAoB,GAAG,CAAC,IAAI,+BAA+B,KAAK,IAAI;YACrF,CAAC,CAAC,IAAI,CAAC,2BAA2B,CAC9B,oBAAoB,EACpB,+BAA+B,EAC/B,MAAM,CAAC,2BAA2B,CAAC,CACpC;YACH,CAAC,CAAC,IAAI,CAAC;QAEX,OAAO;YACL,OAAO;YACP,QAAQ;YACR,sBAAsB;YACtB,MAAM,EAAE,SAAS;YACjB,WAAW,EAAE,WAAW,CAAC,SAAS,CAAC;YACnC,aAAa,EAAE,mBAAmB,CAAC,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI;YACxE,mBAAmB,EACjB,oBAAoB,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,IAAI;YACxE,iBAAiB,EAAE;gBACjB,aAAa,EACX,8DAA8D;gBAChE,mBAAmB,EACjB,wGAAwG;aAC3G;YACD,cAAc;YACd,QAAQ,EAAE;gBACR,iBAAiB,EAAE,oBAAoB;gBACvC,SAAS,EAAE,YAAY;gBACvB,GAAG;gBACH,oBAAoB,EAAE,MAAM,CAAC,oBAAoB,CAAC;gBAClD,MAAM,EAAE,SAAS;gBACjB,SAAS,EAAE,YAAY;aACxB;SACF,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,sBAAsB,CAAC,OAAsB;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACtC,MAAM,WAAW,GAAG,6BAA6B,CAAC;QAClD,MAAM,gBAAgB,GAAG,2BAA2B,CAAC;QAErD,MAAM,CACJ,eAAe,EACf,eAAe,EACf,YAAY,EACZ,WAAW,EACX,iBAAiB,EACjB,QAAQ,EACR,YAAY,EACb,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACpB,MAAM,CAAC,YAAY,CAAC;gBAClB,OAAO,EAAE,gBAAgB;gBACzB,GAAG,EAAE,qBAAqB;gBAC1B,YAAY,EAAE,oBAAoB;gBAClC,IAAI,EAAE,CAAC,OAAO,CAAC;aAChB,CAAC;YACF,MAAM,CAAC,YAAY,CAAC;gBAClB,OAAO,EAAE,WAAW;gBACpB,GAAG,EAAE,YAAY;gBACjB,YAAY,EAAE,kBAAkB;gBAChC,IAAI,EAAE,CAAC,OAAO,CAAC;aAChB,CAAC;YACF,MAAM,CAAC,YAAY,CAAC;gBAClB,OAAO,EAAE,WAAW;gBACpB,GAAG,EAAE,YAAY;gBACjB,YAAY,EAAE,QAAQ;aACvB,CAAC;YACF,MAAM,CAAC,YAAY,CAAC;gBAClB,OAAO,EAAE,WAAW;gBACpB,GAAG,EAAE,YAAY;gBACjB,YAAY,EAAE,aAAa;aAC5B,CAAC;YACF,MAAM,CAAC,YAAY,CAAC;gBAClB,OAAO,EAAE,WAAW;gBACpB,GAAG,EAAE,YAAY;gBACjB,YAAY,EAAE,sBAAsB;aACrC,CAAC;YACF,MAAM,CAAC,YAAY,CAAC;gBAClB,OAAO,EAAE,WAAW;gBACpB,GAAG,EAAE,YAAY;gBACjB,YAAY,EAAE,UAAU;aACzB,CAAC;YACF,MAAM,CAAC,YAAY,CAAC;gBAClB,OAAO,EAAE,WAAW;gBACpB,GAAG,EAAE,YAAY;gBACjB,YAAY,EAAE,YAAY;aAC3B,CAAC;SACH,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,eAAgC,CAAC;QAC9C,MAAM,SAAS,GAAG,eAAyB,CAAC;QAC5C,MAAM,aAAa,GAAG,WAAqB,CAAC;QAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;QACrD,MAAM,aAAa,GAAG,MAAM,IAAI,aAAa,CAAC;QAE9C,MAAM,eAAe,GACnB,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;QAEzC,IAAI,mBAAmB,GAAG,KAAK,CAAC;QAChC,IAAI,cAAc,GAAG,EAAE,CAAC;QAExB,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;YAC1B,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBAClD,MAAM,CAAC,YAAY,CAAC;oBAClB,OAAO,EAAE,WAAW;oBACpB,GAAG,EAAE,YAAY;oBACjB,YAAY,EAAE,YAAY;oBAC1B,IAAI,EAAE,CAAC,IAAI,CAAC;iBACb,CAAC;gBACF,MAAM,CAAC,YAAY,CAAC;oBAClB,OAAO,EAAE,WAAW;oBACpB,GAAG,EAAE,YAAY;oBACjB,YAAY,EAAE,aAAa;oBAC3B,IAAI,EAAE,CAAC,IAAI,CAAC;iBACb,CAAC;aACH,CAAC,CAAC;YACH,mBAAmB,GAAG,UAAU,CAAC;YACjC,cAAc,GAAG,WAAqB,CAAC;QACzC,CAAC;QAED,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAC;QAEzE,MAAM,kBAAkB,GACtB,aAAa,IAAI,aAAa,GAAG,EAAE;YACjC,CAAC,CAAC,CAAC,MAAM,GAAG,aAAa,CAAC,GAAG,eAAe;YAC5C,CAAC,CAAC,EAAE,CAAC;QACT,MAAM,WAAW,GACf,aAAa,GAAG,CAAC,kBAAkB,GAAG,EAAE,CAAC,GAAG,eAAe,CAAC;QAC9D,MAAM,qBAAqB,GACzB,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,MAAM,eAAe,GAAG,IAAI,KAAK,YAAY,IAAI,mBAAmB,CAAC;QAErE,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAChC,CAAC;QACD,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACrC,CAAC;QACD,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAClC,CAAC;aAAM,IAAI,mBAAmB,EAAE,CAAC;YAC/B,MAAM,SAAS,GAAG,cAAc,CAAC,qBAAqB,CAAC,CAAC;YACxD,MAAM,OAAO,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;YACnD,OAAO,CAAC,IAAI,CACV,8CAA8C,SAAS,KAAK,OAAO,GAAG,CACvE,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,gBAAgB,CAAC,sBAAsB,EAAE,CAAC;gBAC7C,IAAI,gBAAgB,CAAC,cAAc,EAAE,uBAAuB,EAAE,CAAC;oBAC7D,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;gBACzC,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;gBACrD,CAAC;YACH,CAAC;YACD,IAAI,SAAS,KAAK,EAAE,EAAE,CAAC;gBACrB,OAAO,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QAED,MAAM,iBAAiB,GACrB,IAAI,KAAK,YAAY;YACrB,CAAC,YAAY;YACb,aAAa;YACb,SAAS,GAAG,EAAE,CAAC;QAEjB,MAAM,aAAa,GACjB,cAAc,GAAG,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7D,MAAM,oBAAoB,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;QACxD,MAAM,oBAAoB,GAAG,cAAc,CAAC,qBAAqB,CAAC,CAAC;QAEnE,OAAO;YACL,OAAO;YACP,QAAQ,EAAE,WAAW;YACrB,eAAe,EAAE,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;YACpD,iBAAiB,EACf,IAAI,KAAK,YAAY;gBACrB,IAAI,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,WAAW,EAAE;YAC9C,iBAAiB;YACjB,eAAe,EAAE,SAAS,CAAC,QAAQ,EAAE;YACrC,wBAAwB,EACtB,SAAS,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,SAAS,EAAE,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM;YAC7E,mBAAmB;YACnB,eAAe;YACf,aAAa;YACb,oBAAoB;YACpB,qBAAqB,EAAE,qBAAqB,CAAC,QAAQ,EAAE;YACvD,oBAAoB;YACpB,YAAY,EAAG,YAAuB,CAAC,QAAQ,EAAE;YACjD,YAAY;YACZ,aAAa;YACb,iBAAiB,EAAG,iBAA4B,CAAC,QAAQ,EAAE;YAC3D,0BAA0B,EAAE,GAAG,WAAW,CAAC,iBAA2B,EAAE,iBAAiB,CAAC,KAAK;YAC/F,eAAe,EAAG,QAAmB,CAAC,QAAQ,EAAE;YAChD,wBAAwB,EAAE,GAAG,WAAW,CAAC,QAAkB,EAAE,iBAAiB,CAAC,KAAK;YACpF,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO;YACzC,QAAQ,EAAE;gBACR,cAAc,EAAE,eAAe;gBAC/B,sBAAsB,EAAE,gBAAgB,CAAC,sBAAsB;gBAC/D,WAAW,EAAE,gBAAgB,CAAC,WAAW;gBACzC,cAAc,EAAE,gBAAgB,CAAC,cAAc;aAChD;SACF,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,eAAe,CAAC,IAAmB;QACvC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAC5D,IAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE,CAAC;YACnC,MAAM,MAAM,GACV,WAAW,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;gBAC5B,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;gBAChC,CAAC,CAAC,uBAAuB,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,gCAAgC,MAAM,GAAG,CAAC,CAAC;QAC7D,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAC5C,MAAM,SAAS,GAAG,cAAc,CAC9B,kBAAkB,CAAC;YACjB,GAAG,EAAE,YAAY;YACjB,YAAY,EAAE,OAAO;SACtB,CAAC,CACH,CAAC;QAEF,MAAM,YAAY,CAAC,mBAAmB,CAAC;YACrC,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,6BAA6B;YACtC,GAAG,EAAE,YAAY;YACjB,YAAY,EAAE,OAAO;SACtB,CAAC,CAAC;QAEH,MAAM,IAAI,GAAiB;YACzB,OAAO,EAAE,SAAS;YAClB,IAAI;YACJ,OAAO,EAAE,+BAA+B,WAAW,CAAC,wBAAwB,GAAG;YAC/E,KAAK,EAAE;gBACL;oBACE,IAAI,EAAE,UAAU;oBAChB,EAAE,EAAE,6BAA6B;oBACjC,IAAI,EAAE,SAAS;oBACf,KAAK,EAAE,GAAG;oBACV,WAAW,EAAE,4BAA4B;iBAC1C;aACF;SACF,CAAC;QAEF,OAAO,qBAAqB,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAEO,kBAAkB,CACxB,iBAAyB,EACzB,SAAiB,EACjB,aAAqB;QAErB,IAAI,iBAAiB,GAAG,kBAAkB,EAAE,CAAC;YAC3C,OAAO,aAAa,GAAG,CAAC,CAAC;QAC3B,CAAC;QACD,IAAI,SAAS,IAAI,aAAa,EAAE,CAAC;YAC/B,OAAO,CAAC,CAAC;QACX,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,KAAK,CAAC,wBAAwB,CACpC,MAA6D,EAC7D,QAA4C;QAE5C,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;YACvC,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC;oBACtC,OAAO,EAAE,QAAQ;oBACjB,GAAG,EAAE,qBAAqB;oBAC1B,YAAY,EAAE,qBAAqB;oBACnC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;iBACtB,CAAC,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAC9B,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM;YACR,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,2BAA2B,CACjC,iBAAyB,EACzB,+BAAuC,EACvC,2BAAmC;QAEnC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAC7C,MAAM,2BAA2B,GAAG,IAAI,CAAC,KAAK,CAC5C,CAAC,MAAM,GAAG,iBAAiB,CAAC,GAAG,KAAK,CACrC,CAAC;QACF,MAAM,+BAA+B,GACnC,+BAA+B,GAAG,2BAA2B,CAAC;QAChE,MAAM,+BAA+B,GACnC,iBAAiB,GAAG,+BAA+B,GAAG,KAAK,CAAC;QAC9D,MAAM,uBAAuB,GAAG,+BAA+B,GAAG,CAAC,CAAC;QACpE,MAAM,6BAA6B,GAAG,IAAI,CAAC,GAAG,CAC5C,GAAG,EACH,IAAI,CAAC,GAAG,CACN,CAAC,EACD,IAAI,CAAC,KAAK,CACR,CAAC,2BAA2B,GAAG,+BAA+B,CAAC;YAC7D,GAAG,CACN,CACF,CACF,CAAC;QAEF,OAAO;YACL,2BAA2B;YAC3B,+BAA+B;YAC/B,2BAA2B;YAC3B,+BAA+B;YAC/B,wBAAwB,EAAE,cAAc,CAAC,+BAA+B,CAAC;YACzE,6BAA6B;YAC7B,uBAAuB;SACxB,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { v4QuoterAbi } from "../abis/uniswap-v4-quoter.js";
|
|
2
2
|
import { normalizeUniswapPoolKey, UNISWAP_V4, } from "../config/uniswap.js";
|
|
3
|
-
import { getUniswapPoolIndex, } from "./uniswap-pool-discovery.js";
|
|
4
|
-
|
|
3
|
+
import { getUniswapPoolIndex, poolsBetween, } from "./uniswap-pool-discovery.js";
|
|
4
|
+
/** Maximum pools in a route (2 intermediate currencies → 3 pools). */
|
|
5
|
+
const MAX_POOLS = 3;
|
|
5
6
|
function otherToken(poolKey, currency) {
|
|
6
7
|
const c = currency.toLowerCase();
|
|
7
8
|
if (poolKey.currency0.toLowerCase() === c)
|
|
@@ -39,7 +40,7 @@ function enumeratePaths(index, currencyIn, currencyOut) {
|
|
|
39
40
|
const queue = [{ currency: start, pools: [], visited: new Set([start]) }];
|
|
40
41
|
while (queue.length > 0) {
|
|
41
42
|
const node = queue.shift();
|
|
42
|
-
if (node.pools.length >=
|
|
43
|
+
if (node.pools.length >= MAX_POOLS) {
|
|
43
44
|
continue;
|
|
44
45
|
}
|
|
45
46
|
const neighbors = index.adjacency.get(node.currency);
|
|
@@ -50,26 +51,21 @@ function enumeratePaths(index, currencyIn, currencyOut) {
|
|
|
50
51
|
if (node.visited.has(neighbor)) {
|
|
51
52
|
continue;
|
|
52
53
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
queue.push({
|
|
69
|
-
currency: neighbor,
|
|
70
|
-
pools: nextPools,
|
|
71
|
-
visited: new Set([...node.visited, neighbor]),
|
|
72
|
-
});
|
|
54
|
+
// A pair can have several pools (different fee tiers); branch over each so
|
|
55
|
+
// the quoter can pick the genuinely best-priced one.
|
|
56
|
+
for (const poolKey of poolsBetween(index, node.currency, neighbor)) {
|
|
57
|
+
const nextPools = [...node.pools, poolKey];
|
|
58
|
+
if (neighbor === goal) {
|
|
59
|
+
results.push(nextPools);
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
if (nextPools.length < MAX_POOLS) {
|
|
63
|
+
queue.push({
|
|
64
|
+
currency: neighbor,
|
|
65
|
+
pools: nextPools,
|
|
66
|
+
visited: new Set([...node.visited, neighbor]),
|
|
67
|
+
});
|
|
68
|
+
}
|
|
73
69
|
}
|
|
74
70
|
}
|
|
75
71
|
}
|
|
@@ -123,28 +119,32 @@ async function quotePath(client, currencyIn, pools, amountIn) {
|
|
|
123
119
|
export async function findBestUniswapRoute(client, currencyIn, currencyOut, amountIn) {
|
|
124
120
|
const index = await getUniswapPoolIndex(client);
|
|
125
121
|
const candidatePaths = enumeratePaths(index, currencyIn, currencyOut);
|
|
122
|
+
// Quote every candidate path concurrently; failed quotes (e.g. uninitialized
|
|
123
|
+
// pools or insufficient liquidity) are dropped rather than aborting the rest.
|
|
124
|
+
const quotes = await Promise.allSettled(candidatePaths.map(async (pools) => ({
|
|
125
|
+
pools,
|
|
126
|
+
amountOut: await quotePath(client, currencyIn, pools, amountIn),
|
|
127
|
+
})));
|
|
126
128
|
let best = null;
|
|
127
|
-
for (const
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
if (amountOut <= 0n) {
|
|
131
|
-
continue;
|
|
132
|
-
}
|
|
133
|
-
if (!best || amountOut > best.amountOut) {
|
|
134
|
-
best = {
|
|
135
|
-
amountOut,
|
|
136
|
-
route: {
|
|
137
|
-
currencyIn,
|
|
138
|
-
currencyOut,
|
|
139
|
-
pools,
|
|
140
|
-
pathKeys: buildPathKeys(pools, currencyIn),
|
|
141
|
-
hops: pools.length,
|
|
142
|
-
},
|
|
143
|
-
};
|
|
144
|
-
}
|
|
129
|
+
for (const quote of quotes) {
|
|
130
|
+
if (quote.status !== "fulfilled") {
|
|
131
|
+
continue;
|
|
145
132
|
}
|
|
146
|
-
|
|
147
|
-
|
|
133
|
+
const { pools, amountOut } = quote.value;
|
|
134
|
+
if (amountOut <= 0n) {
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
if (!best || amountOut > best.amountOut) {
|
|
138
|
+
best = {
|
|
139
|
+
amountOut,
|
|
140
|
+
route: {
|
|
141
|
+
currencyIn,
|
|
142
|
+
currencyOut,
|
|
143
|
+
pools,
|
|
144
|
+
pathKeys: buildPathKeys(pools, currencyIn),
|
|
145
|
+
hops: pools.length,
|
|
146
|
+
},
|
|
147
|
+
};
|
|
148
148
|
}
|
|
149
149
|
}
|
|
150
150
|
if (!best) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uniswap-path-router.js","sourceRoot":"","sources":["../../src/services/uniswap-path-router.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EACL,uBAAuB,EACvB,UAAU,GAEX,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,mBAAmB,
|
|
1
|
+
{"version":3,"file":"uniswap-path-router.js","sourceRoot":"","sources":["../../src/services/uniswap-path-router.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,12 @@ export type UniswapPoolIndex = {
|
|
|
14
14
|
edges: UniswapPoolEdge[];
|
|
15
15
|
/** Currency address (lowercase) → neighbor currencies in the graph. */
|
|
16
16
|
adjacency: Map<string, Set<string>>;
|
|
17
|
+
/**
|
|
18
|
+
* Sorted pair key (`tokenLo|tokenHi`, lowercase) → every pool connecting that
|
|
19
|
+
* pair. A single token pair can have several pools across fee tiers, so the
|
|
20
|
+
* router must consider all of them to find the best rate.
|
|
21
|
+
*/
|
|
22
|
+
poolsByPair: Map<string, UniswapPoolKey[]>;
|
|
17
23
|
/** Whether pools came from the v4 subgraph or on-chain hub probing. */
|
|
18
24
|
source: "subgraph" | "onchain";
|
|
19
25
|
fetchedAt: number;
|
|
@@ -31,6 +37,13 @@ export declare function computeUniswapPoolId(poolKey: UniswapPoolKey): `0x${stri
|
|
|
31
37
|
export declare function getUniswapPoolIndex(client: PublicClient, options?: {
|
|
32
38
|
forceRefresh?: boolean;
|
|
33
39
|
}): Promise<UniswapPoolIndex>;
|
|
40
|
+
/**
|
|
41
|
+
* All pools connecting two tokens in a cached index (one per fee tier / hooks).
|
|
42
|
+
* @param index - Pool graph from `getUniswapPoolIndex`
|
|
43
|
+
* @param tokenA - First currency address
|
|
44
|
+
* @param tokenB - Second currency address
|
|
45
|
+
*/
|
|
46
|
+
export declare function poolsBetween(index: UniswapPoolIndex, tokenA: `0x${string}`, tokenB: `0x${string}`): UniswapPoolKey[];
|
|
34
47
|
/**
|
|
35
48
|
* Find a pool key connecting two tokens in a cached index, if present.
|
|
36
49
|
* @param index - Pool graph from `getUniswapPoolIndex`
|
|
@@ -5,6 +5,12 @@ import { encodeAbiParameters, keccak256, parseAbiParameters, } from "viem";
|
|
|
5
5
|
import { stateViewAbi } from "../abis/uniswap-state-view.js";
|
|
6
6
|
import { normalizeUniswapPoolKey, UNISWAP_DEFAULT_TICK_SPACING, UNISWAP_FEE_TIERS, UNISWAP_HUB_CURRENCIES, UNISWAP_POOL_CACHE_TTL_MS, UNISWAP_SUBGRAPH_URL, UNISWAP_V4, } from "../config/uniswap.js";
|
|
7
7
|
let cachedIndex = null;
|
|
8
|
+
/** Canonical lowercase key for the unordered pair `(a, b)`. */
|
|
9
|
+
function pairKey(a, b) {
|
|
10
|
+
const lo = a.toLowerCase();
|
|
11
|
+
const hi = b.toLowerCase();
|
|
12
|
+
return lo < hi ? `${lo}|${hi}` : `${hi}|${lo}`;
|
|
13
|
+
}
|
|
8
14
|
/**
|
|
9
15
|
* Compute the Uniswap v4 pool id (keccak256 of sorted pool key fields).
|
|
10
16
|
* @param poolKey - Pool key (normalized so currency0 sorts before currency1)
|
|
@@ -19,24 +25,45 @@ export function computeUniswapPoolId(poolKey) {
|
|
|
19
25
|
normalized.hooks,
|
|
20
26
|
]));
|
|
21
27
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
+
/**
|
|
29
|
+
* Build a routing index from raw pool keys: dedup by pool id, then derive the
|
|
30
|
+
* edge list, currency adjacency, and per-pair pool buckets.
|
|
31
|
+
*/
|
|
32
|
+
function buildPoolIndex(poolKeys, source) {
|
|
33
|
+
const edges = [];
|
|
34
|
+
const adjacency = new Map();
|
|
35
|
+
const poolsByPair = new Map();
|
|
36
|
+
const seen = new Set();
|
|
37
|
+
for (const key of poolKeys) {
|
|
38
|
+
const normalized = normalizeUniswapPoolKey(key);
|
|
39
|
+
const id = computeUniswapPoolId(normalized);
|
|
40
|
+
if (seen.has(id)) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
seen.add(id);
|
|
44
|
+
const a = normalized.currency0.toLowerCase();
|
|
45
|
+
const b = normalized.currency1.toLowerCase();
|
|
46
|
+
edges.push({
|
|
47
|
+
poolKey: normalized,
|
|
48
|
+
tokenA: normalized.currency0,
|
|
49
|
+
tokenB: normalized.currency1,
|
|
50
|
+
});
|
|
51
|
+
if (!adjacency.has(a))
|
|
52
|
+
adjacency.set(a, new Set());
|
|
53
|
+
if (!adjacency.has(b))
|
|
54
|
+
adjacency.set(b, new Set());
|
|
55
|
+
adjacency.get(a).add(b);
|
|
56
|
+
adjacency.get(b).add(a);
|
|
57
|
+
const pk = pairKey(a, b);
|
|
58
|
+
const bucket = poolsByPair.get(pk);
|
|
59
|
+
if (bucket) {
|
|
60
|
+
bucket.push(normalized);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
poolsByPair.set(pk, [normalized]);
|
|
64
|
+
}
|
|
28
65
|
}
|
|
29
|
-
edges.
|
|
30
|
-
poolKey: normalized,
|
|
31
|
-
tokenA: normalized.currency0,
|
|
32
|
-
tokenB: normalized.currency1,
|
|
33
|
-
});
|
|
34
|
-
if (!adjacency.has(a))
|
|
35
|
-
adjacency.set(a, new Set());
|
|
36
|
-
if (!adjacency.has(b))
|
|
37
|
-
adjacency.set(b, new Set());
|
|
38
|
-
adjacency.get(a).add(b);
|
|
39
|
-
adjacency.get(b).add(a);
|
|
66
|
+
return { edges, adjacency, poolsByPair, source, fetchedAt: Date.now() };
|
|
40
67
|
}
|
|
41
68
|
async function fetchSubgraphPools() {
|
|
42
69
|
try {
|
|
@@ -63,19 +90,13 @@ async function fetchSubgraphPools() {
|
|
|
63
90
|
if (!pools?.length) {
|
|
64
91
|
return null;
|
|
65
92
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
tickSpacing: Number(pool.tickSpacing),
|
|
74
|
-
hooks: (pool.hooks || UNISWAP_V4.zeroHooks),
|
|
75
|
-
};
|
|
76
|
-
addEdge(edges, adjacency, poolKey);
|
|
77
|
-
}
|
|
78
|
-
return edges;
|
|
93
|
+
return pools.map((pool) => ({
|
|
94
|
+
currency0: pool.token0.id,
|
|
95
|
+
currency1: pool.token1.id,
|
|
96
|
+
fee: Number(pool.feeTier),
|
|
97
|
+
tickSpacing: Number(pool.tickSpacing),
|
|
98
|
+
hooks: (pool.hooks || UNISWAP_V4.zeroHooks),
|
|
99
|
+
}));
|
|
79
100
|
}
|
|
80
101
|
catch {
|
|
81
102
|
return null;
|
|
@@ -115,9 +136,8 @@ async function probePoolOnChain(client, currencyA, currencyB, fee, tickSpacing)
|
|
|
115
136
|
return null;
|
|
116
137
|
}
|
|
117
138
|
async function buildOnChainIndex(client) {
|
|
118
|
-
const edges = [];
|
|
119
|
-
const adjacency = new Map();
|
|
120
139
|
const hubs = [...UNISWAP_HUB_CURRENCIES];
|
|
140
|
+
const probes = [];
|
|
121
141
|
for (let i = 0; i < hubs.length; i++) {
|
|
122
142
|
for (let j = i + 1; j < hubs.length; j++) {
|
|
123
143
|
const [currency0, currency1] = hubs[i].toLowerCase() < hubs[j].toLowerCase()
|
|
@@ -126,19 +146,12 @@ async function buildOnChainIndex(client) {
|
|
|
126
146
|
for (const fee of UNISWAP_FEE_TIERS) {
|
|
127
147
|
const tickSpacing = UNISWAP_DEFAULT_TICK_SPACING[fee] ??
|
|
128
148
|
UNISWAP_DEFAULT_TICK_SPACING[3000];
|
|
129
|
-
|
|
130
|
-
if (poolKey) {
|
|
131
|
-
addEdge(edges, adjacency, poolKey);
|
|
132
|
-
}
|
|
149
|
+
probes.push(probePoolOnChain(client, currency0, currency1, fee, tickSpacing));
|
|
133
150
|
}
|
|
134
151
|
}
|
|
135
152
|
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
adjacency,
|
|
139
|
-
source: "onchain",
|
|
140
|
-
fetchedAt: Date.now(),
|
|
141
|
-
};
|
|
153
|
+
const poolKeys = (await Promise.all(probes)).filter((poolKey) => poolKey !== null);
|
|
154
|
+
return buildPoolIndex(poolKeys, "onchain");
|
|
142
155
|
}
|
|
143
156
|
/**
|
|
144
157
|
* Load or refresh the v4 pool index (subgraph first, on-chain hub fallback).
|
|
@@ -152,30 +165,23 @@ export async function getUniswapPoolIndex(client, options) {
|
|
|
152
165
|
now - cachedIndex.fetchedAt < UNISWAP_POOL_CACHE_TTL_MS) {
|
|
153
166
|
return cachedIndex;
|
|
154
167
|
}
|
|
155
|
-
const
|
|
156
|
-
if (
|
|
157
|
-
|
|
158
|
-
for (const edge of subgraphEdges) {
|
|
159
|
-
const a = edge.tokenA.toLowerCase();
|
|
160
|
-
const b = edge.tokenB.toLowerCase();
|
|
161
|
-
if (!adjacency.has(a))
|
|
162
|
-
adjacency.set(a, new Set());
|
|
163
|
-
if (!adjacency.has(b))
|
|
164
|
-
adjacency.set(b, new Set());
|
|
165
|
-
adjacency.get(a).add(b);
|
|
166
|
-
adjacency.get(b).add(a);
|
|
167
|
-
}
|
|
168
|
-
cachedIndex = {
|
|
169
|
-
edges: subgraphEdges,
|
|
170
|
-
adjacency,
|
|
171
|
-
source: "subgraph",
|
|
172
|
-
fetchedAt: now,
|
|
173
|
-
};
|
|
168
|
+
const subgraphPools = await fetchSubgraphPools();
|
|
169
|
+
if (subgraphPools?.length) {
|
|
170
|
+
cachedIndex = buildPoolIndex(subgraphPools, "subgraph");
|
|
174
171
|
return cachedIndex;
|
|
175
172
|
}
|
|
176
173
|
cachedIndex = await buildOnChainIndex(client);
|
|
177
174
|
return cachedIndex;
|
|
178
175
|
}
|
|
176
|
+
/**
|
|
177
|
+
* All pools connecting two tokens in a cached index (one per fee tier / hooks).
|
|
178
|
+
* @param index - Pool graph from `getUniswapPoolIndex`
|
|
179
|
+
* @param tokenA - First currency address
|
|
180
|
+
* @param tokenB - Second currency address
|
|
181
|
+
*/
|
|
182
|
+
export function poolsBetween(index, tokenA, tokenB) {
|
|
183
|
+
return index.poolsByPair.get(pairKey(tokenA, tokenB)) ?? [];
|
|
184
|
+
}
|
|
179
185
|
/**
|
|
180
186
|
* Find a pool key connecting two tokens in a cached index, if present.
|
|
181
187
|
* @param index - Pool graph from `getUniswapPoolIndex`
|
|
@@ -183,16 +189,7 @@ export async function getUniswapPoolIndex(client, options) {
|
|
|
183
189
|
* @param tokenB - Second currency address
|
|
184
190
|
*/
|
|
185
191
|
export function findPoolBetween(index, tokenA, tokenB) {
|
|
186
|
-
|
|
187
|
-
const b = tokenB.toLowerCase();
|
|
188
|
-
for (const edge of index.edges) {
|
|
189
|
-
const e0 = edge.tokenA.toLowerCase();
|
|
190
|
-
const e1 = edge.tokenB.toLowerCase();
|
|
191
|
-
if ((e0 === a && e1 === b) || (e0 === b && e1 === a)) {
|
|
192
|
-
return edge.poolKey;
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
return null;
|
|
192
|
+
return poolsBetween(index, tokenA, tokenB)[0] ?? null;
|
|
196
193
|
}
|
|
197
194
|
/** Reset cached index (for tests). */
|
|
198
195
|
export function resetUniswapPoolIndexCache() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uniswap-pool-discovery.js","sourceRoot":"","sources":["../../src/services/uniswap-pool-discovery.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EACL,mBAAmB,EACnB,SAAS,EACT,kBAAkB,GAEnB,MAAM,MAAM,CAAC;AACd,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EACL,uBAAuB,EACvB,4BAA4B,EAC5B,iBAAiB,EACjB,sBAAsB,EACtB,yBAAyB,EACzB,oBAAoB,EACpB,UAAU,GAEX,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"uniswap-pool-discovery.js","sourceRoot":"","sources":["../../src/services/uniswap-pool-discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** Format a duration in seconds as a short human-readable string (hours and minutes). */
|
|
2
|
+
export function formatDuration(seconds) {
|
|
3
|
+
const total = Number(seconds);
|
|
4
|
+
if (total <= 0)
|
|
5
|
+
return "0 minutes";
|
|
6
|
+
const hours = Math.floor(total / 3600);
|
|
7
|
+
const minutes = Math.floor((total % 3600) / 60);
|
|
8
|
+
const parts = [];
|
|
9
|
+
if (hours > 0) {
|
|
10
|
+
parts.push(`${hours} hour${hours === 1 ? "" : "s"}`);
|
|
11
|
+
}
|
|
12
|
+
if (minutes > 0 || hours === 0) {
|
|
13
|
+
parts.push(`${minutes} minute${minutes === 1 ? "" : "s"}`);
|
|
14
|
+
}
|
|
15
|
+
return parts.join(" ");
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=format-duration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-duration.js","sourceRoot":"","sources":["../../src/utils/format-duration.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,MAAM,UAAU,cAAc,CAAC,OAAwB;IACrD,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9B,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,WAAW,CAAC;IAEnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAChD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,UAAU,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** Format a Unix timestamp (seconds) as an ISO 8601 UTC string. */
|
|
2
|
+
export declare function formatUnixIso(unixSeconds: number | bigint): string;
|
|
3
|
+
/** Format a Unix timestamp for display in reason strings (UTC date and time). */
|
|
4
|
+
export declare function formatUnixDateTimeUtc(unixSeconds: number | bigint): string;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** Format a Unix timestamp (seconds) as an ISO 8601 UTC string. */
|
|
2
|
+
export function formatUnixIso(unixSeconds) {
|
|
3
|
+
return new Date(Number(unixSeconds) * 1000).toISOString();
|
|
4
|
+
}
|
|
5
|
+
/** Format a Unix timestamp for display in reason strings (UTC date and time). */
|
|
6
|
+
export function formatUnixDateTimeUtc(unixSeconds) {
|
|
7
|
+
const date = new Date(Number(unixSeconds) * 1000);
|
|
8
|
+
return new Intl.DateTimeFormat("en-US", {
|
|
9
|
+
month: "long",
|
|
10
|
+
day: "numeric",
|
|
11
|
+
year: "numeric",
|
|
12
|
+
hour: "numeric",
|
|
13
|
+
minute: "2-digit",
|
|
14
|
+
timeZone: "UTC",
|
|
15
|
+
timeZoneName: "short",
|
|
16
|
+
}).format(date);
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=format-unix-datetime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-unix-datetime.js","sourceRoot":"","sources":["../../src/utils/format-unix-datetime.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,MAAM,UAAU,aAAa,CAAC,WAA4B;IACxD,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;AAC5D,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,qBAAqB,CAAC,WAA4B;IAChE,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,CAAC;IAClD,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;QACtC,KAAK,EAAE,MAAM;QACb,GAAG,EAAE,SAAS;QACd,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,SAAS;QACjB,QAAQ,EAAE,KAAK;QACf,YAAY,EAAE,OAAO;KACtB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAClB,CAAC"}
|
package/package.json
CHANGED
|
@@ -274,7 +274,13 @@ export const gooddollarOperations: OperationSpec[] = [
|
|
|
274
274
|
arguments: (fx) => ({ address: fx.wallet }),
|
|
275
275
|
},
|
|
276
276
|
assert: (result) => {
|
|
277
|
-
assertHasKeys(result, [
|
|
277
|
+
assertHasKeys(result, [
|
|
278
|
+
"isEligibleToClaim",
|
|
279
|
+
"claimableAmount",
|
|
280
|
+
"secondsUntilNextClaim",
|
|
281
|
+
"nextClaimAvailableIn",
|
|
282
|
+
"ubiPeriodDay",
|
|
283
|
+
]);
|
|
278
284
|
},
|
|
279
285
|
},
|
|
280
286
|
{
|