@pafi-dev/core 0.1.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 +1157 -0
- package/dist/abi/index.cjs +31 -0
- package/dist/abi/index.cjs.map +1 -0
- package/dist/abi/index.d.cts +2479 -0
- package/dist/abi/index.d.ts +2479 -0
- package/dist/abi/index.js +31 -0
- package/dist/abi/index.js.map +1 -0
- package/dist/auth/index.cjs +11 -0
- package/dist/auth/index.cjs.map +1 -0
- package/dist/auth/index.d.cts +60 -0
- package/dist/auth/index.d.ts +60 -0
- package/dist/auth/index.js +11 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/chunk-27V32VNM.cjs +370 -0
- package/dist/chunk-27V32VNM.cjs.map +1 -0
- package/dist/chunk-2PIXFXA2.js +135 -0
- package/dist/chunk-2PIXFXA2.js.map +1 -0
- package/dist/chunk-37BBGXTS.js +149 -0
- package/dist/chunk-37BBGXTS.js.map +1 -0
- package/dist/chunk-4QOWQQCH.cjs +99 -0
- package/dist/chunk-4QOWQQCH.cjs.map +1 -0
- package/dist/chunk-4RYBJLF3.js +370 -0
- package/dist/chunk-4RYBJLF3.js.map +1 -0
- package/dist/chunk-5QJZT7VB.cjs +46 -0
- package/dist/chunk-5QJZT7VB.cjs.map +1 -0
- package/dist/chunk-5YH4D7QF.js +467 -0
- package/dist/chunk-5YH4D7QF.js.map +1 -0
- package/dist/chunk-BNTVOKYT.cjs +101 -0
- package/dist/chunk-BNTVOKYT.cjs.map +1 -0
- package/dist/chunk-C4ZDYG4D.js +101 -0
- package/dist/chunk-C4ZDYG4D.js.map +1 -0
- package/dist/chunk-CAE2BVKI.cjs +136 -0
- package/dist/chunk-CAE2BVKI.cjs.map +1 -0
- package/dist/chunk-CL3QSI4O.cjs +65 -0
- package/dist/chunk-CL3QSI4O.cjs.map +1 -0
- package/dist/chunk-CWP4PFOP.cjs +72 -0
- package/dist/chunk-CWP4PFOP.cjs.map +1 -0
- package/dist/chunk-DSCUHT3F.js +99 -0
- package/dist/chunk-DSCUHT3F.js.map +1 -0
- package/dist/chunk-FGKLDKJK.cjs +467 -0
- package/dist/chunk-FGKLDKJK.cjs.map +1 -0
- package/dist/chunk-FIKTQR7H.js +136 -0
- package/dist/chunk-FIKTQR7H.js.map +1 -0
- package/dist/chunk-FXNG4G22.js +2041 -0
- package/dist/chunk-FXNG4G22.js.map +1 -0
- package/dist/chunk-GWLEEXM4.cjs +163 -0
- package/dist/chunk-GWLEEXM4.cjs.map +1 -0
- package/dist/chunk-IPXARZ6F.cjs +135 -0
- package/dist/chunk-IPXARZ6F.cjs.map +1 -0
- package/dist/chunk-KFWZRL7I.js +65 -0
- package/dist/chunk-KFWZRL7I.js.map +1 -0
- package/dist/chunk-KW6M5FXY.js +129 -0
- package/dist/chunk-KW6M5FXY.js.map +1 -0
- package/dist/chunk-MEREIEE4.cjs +129 -0
- package/dist/chunk-MEREIEE4.cjs.map +1 -0
- package/dist/chunk-O4SMTUOY.js +163 -0
- package/dist/chunk-O4SMTUOY.js.map +1 -0
- package/dist/chunk-O7LQKCBT.cjs +149 -0
- package/dist/chunk-O7LQKCBT.cjs.map +1 -0
- package/dist/chunk-P56TUGTS.js +46 -0
- package/dist/chunk-P56TUGTS.js.map +1 -0
- package/dist/chunk-R4L66ZR5.js +72 -0
- package/dist/chunk-R4L66ZR5.js.map +1 -0
- package/dist/chunk-S2XRFFP3.cjs +2041 -0
- package/dist/chunk-S2XRFFP3.cjs.map +1 -0
- package/dist/contract/index.cjs +27 -0
- package/dist/contract/index.cjs.map +1 -0
- package/dist/contract/index.d.cts +18 -0
- package/dist/contract/index.d.ts +18 -0
- package/dist/contract/index.js +27 -0
- package/dist/contract/index.js.map +1 -0
- package/dist/eip712/index.cjs +20 -0
- package/dist/eip712/index.cjs.map +1 -0
- package/dist/eip712/index.d.cts +83 -0
- package/dist/eip712/index.d.ts +83 -0
- package/dist/eip712/index.js +20 -0
- package/dist/eip712/index.js.map +1 -0
- package/dist/index.cjs +412 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +239 -0
- package/dist/index.d.ts +239 -0
- package/dist/index.js +412 -0
- package/dist/index.js.map +1 -0
- package/dist/quoting/index.cjs +19 -0
- package/dist/quoting/index.cjs.map +1 -0
- package/dist/quoting/index.d.cts +59 -0
- package/dist/quoting/index.d.ts +59 -0
- package/dist/quoting/index.js +19 -0
- package/dist/quoting/index.js.map +1 -0
- package/dist/relay/index.cjs +19 -0
- package/dist/relay/index.cjs.map +1 -0
- package/dist/relay/index.d.cts +62 -0
- package/dist/relay/index.d.ts +62 -0
- package/dist/relay/index.js +19 -0
- package/dist/relay/index.js.map +1 -0
- package/dist/swap/index.cjs +29 -0
- package/dist/swap/index.cjs.map +1 -0
- package/dist/swap/index.d.cts +79 -0
- package/dist/swap/index.d.ts +79 -0
- package/dist/swap/index.js +29 -0
- package/dist/swap/index.js.map +1 -0
- package/dist/types-CkRJzrZr.d.cts +98 -0
- package/dist/types-CkRJzrZr.d.ts +98 -0
- package/package.json +114 -0
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import {
|
|
2
|
+
issuerRegistryAbi,
|
|
3
|
+
mintingOracleAbi,
|
|
4
|
+
pointTokenAbi
|
|
5
|
+
} from "./chunk-FXNG4G22.js";
|
|
6
|
+
import {
|
|
7
|
+
relayAbi
|
|
8
|
+
} from "./chunk-4RYBJLF3.js";
|
|
9
|
+
|
|
10
|
+
// src/contract/pointToken.ts
|
|
11
|
+
async function getMintRequestNonce(client, pointToken, receiver) {
|
|
12
|
+
return client.readContract({
|
|
13
|
+
address: pointToken,
|
|
14
|
+
abi: pointTokenAbi,
|
|
15
|
+
functionName: "mintRequestNonces",
|
|
16
|
+
args: [receiver]
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
async function getReceiverConsentNonce(client, pointToken, receiver) {
|
|
20
|
+
return client.readContract({
|
|
21
|
+
address: pointToken,
|
|
22
|
+
abi: pointTokenAbi,
|
|
23
|
+
functionName: "receiverConsentNonces",
|
|
24
|
+
args: [receiver]
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
async function isMinter(client, pointToken, account) {
|
|
28
|
+
return client.readContract({
|
|
29
|
+
address: pointToken,
|
|
30
|
+
abi: pointTokenAbi,
|
|
31
|
+
functionName: "minters",
|
|
32
|
+
args: [account]
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
async function getTokenName(client, pointToken) {
|
|
36
|
+
return client.readContract({
|
|
37
|
+
address: pointToken,
|
|
38
|
+
abi: pointTokenAbi,
|
|
39
|
+
functionName: "name"
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
async function getIssuer(client, pointToken) {
|
|
43
|
+
return client.readContract({
|
|
44
|
+
address: pointToken,
|
|
45
|
+
abi: pointTokenAbi,
|
|
46
|
+
functionName: "issuer"
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// src/contract/issuerRegistry.ts
|
|
51
|
+
async function getIssuer2(client, registryAddress, issuer) {
|
|
52
|
+
const result = await client.readContract({
|
|
53
|
+
address: registryAddress,
|
|
54
|
+
abi: issuerRegistryAbi,
|
|
55
|
+
functionName: "getIssuer",
|
|
56
|
+
args: [issuer]
|
|
57
|
+
});
|
|
58
|
+
const [
|
|
59
|
+
issuerAddress,
|
|
60
|
+
signerAddress,
|
|
61
|
+
name,
|
|
62
|
+
symbol,
|
|
63
|
+
declaredTotalSupply,
|
|
64
|
+
capBasisPoints,
|
|
65
|
+
active,
|
|
66
|
+
pointToken,
|
|
67
|
+
mintingOracle
|
|
68
|
+
] = result;
|
|
69
|
+
return {
|
|
70
|
+
issuerAddress,
|
|
71
|
+
signerAddress,
|
|
72
|
+
name,
|
|
73
|
+
symbol,
|
|
74
|
+
declaredTotalSupply,
|
|
75
|
+
capBasisPoints,
|
|
76
|
+
active,
|
|
77
|
+
pointToken,
|
|
78
|
+
mintingOracle
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
async function isActiveIssuer(client, registryAddress, issuer) {
|
|
82
|
+
return client.readContract({
|
|
83
|
+
address: registryAddress,
|
|
84
|
+
abi: issuerRegistryAbi,
|
|
85
|
+
functionName: "isActiveIssuer",
|
|
86
|
+
args: [issuer]
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// src/contract/mintingOracle.ts
|
|
91
|
+
async function verifyMintCap(client, oracleAddress, issuer, amount) {
|
|
92
|
+
await client.readContract({
|
|
93
|
+
address: oracleAddress,
|
|
94
|
+
abi: mintingOracleAbi,
|
|
95
|
+
functionName: "verifyMintCap",
|
|
96
|
+
args: [issuer, amount]
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
async function getPointTokenIssuer(client, oracleAddress, pointToken) {
|
|
100
|
+
return client.readContract({
|
|
101
|
+
address: oracleAddress,
|
|
102
|
+
abi: mintingOracleAbi,
|
|
103
|
+
functionName: "pointTokenToIssuer",
|
|
104
|
+
args: [pointToken]
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// src/contract/relay.ts
|
|
109
|
+
async function getUsdt(client, relayAddress) {
|
|
110
|
+
return client.readContract({
|
|
111
|
+
address: relayAddress,
|
|
112
|
+
abi: relayAbi,
|
|
113
|
+
functionName: "usdt"
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export {
|
|
118
|
+
getMintRequestNonce,
|
|
119
|
+
getReceiverConsentNonce,
|
|
120
|
+
isMinter,
|
|
121
|
+
getTokenName,
|
|
122
|
+
getIssuer,
|
|
123
|
+
getIssuer2,
|
|
124
|
+
isActiveIssuer,
|
|
125
|
+
verifyMintCap,
|
|
126
|
+
getPointTokenIssuer,
|
|
127
|
+
getUsdt
|
|
128
|
+
};
|
|
129
|
+
//# sourceMappingURL=chunk-KW6M5FXY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/contract/pointToken.ts","../src/contract/issuerRegistry.ts","../src/contract/mintingOracle.ts","../src/contract/relay.ts"],"sourcesContent":["import type { Address, PublicClient } from \"viem\";\nimport { pointTokenAbi } from \"../abi/pointToken\";\n\nexport async function getMintRequestNonce(\n client: PublicClient,\n pointToken: Address,\n receiver: Address,\n): Promise<bigint> {\n return client.readContract({\n address: pointToken,\n abi: pointTokenAbi,\n functionName: \"mintRequestNonces\",\n args: [receiver],\n });\n}\n\nexport async function getReceiverConsentNonce(\n client: PublicClient,\n pointToken: Address,\n receiver: Address,\n): Promise<bigint> {\n return client.readContract({\n address: pointToken,\n abi: pointTokenAbi,\n functionName: \"receiverConsentNonces\",\n args: [receiver],\n });\n}\n\nexport async function isMinter(\n client: PublicClient,\n pointToken: Address,\n account: Address,\n): Promise<boolean> {\n return client.readContract({\n address: pointToken,\n abi: pointTokenAbi,\n functionName: \"minters\",\n args: [account],\n });\n}\n\nexport async function getTokenName(\n client: PublicClient,\n pointToken: Address,\n): Promise<string> {\n return client.readContract({\n address: pointToken,\n abi: pointTokenAbi,\n functionName: \"name\",\n });\n}\n\nexport async function getIssuer(\n client: PublicClient,\n pointToken: Address,\n): Promise<Address> {\n return client.readContract({\n address: pointToken,\n abi: pointTokenAbi,\n functionName: \"issuer\",\n });\n}\n","import type { Address, PublicClient } from \"viem\";\nimport { issuerRegistryAbi } from \"../abi/issuerRegistry\";\nimport type { Issuer } from \"../types\";\n\nexport async function getIssuer(\n client: PublicClient,\n registryAddress: Address,\n issuer: Address,\n): Promise<Issuer> {\n const result = await client.readContract({\n address: registryAddress,\n abi: issuerRegistryAbi,\n functionName: \"getIssuer\",\n args: [issuer],\n });\n\n const [\n issuerAddress,\n signerAddress,\n name,\n symbol,\n declaredTotalSupply,\n capBasisPoints,\n active,\n pointToken,\n mintingOracle,\n ] = result;\n\n return {\n issuerAddress,\n signerAddress,\n name,\n symbol,\n declaredTotalSupply,\n capBasisPoints,\n active,\n pointToken,\n mintingOracle,\n };\n}\n\nexport async function isActiveIssuer(\n client: PublicClient,\n registryAddress: Address,\n issuer: Address,\n): Promise<boolean> {\n return client.readContract({\n address: registryAddress,\n abi: issuerRegistryAbi,\n functionName: \"isActiveIssuer\",\n args: [issuer],\n });\n}\n","import type { Address, PublicClient } from \"viem\";\nimport { mintingOracleAbi } from \"../abi/mintingOracle\";\n\nexport async function verifyMintCap(\n client: PublicClient,\n oracleAddress: Address,\n issuer: Address,\n amount: bigint,\n): Promise<void> {\n await client.readContract({\n address: oracleAddress,\n abi: mintingOracleAbi,\n functionName: \"verifyMintCap\",\n args: [issuer, amount],\n });\n}\n\nexport async function getPointTokenIssuer(\n client: PublicClient,\n oracleAddress: Address,\n pointToken: Address,\n): Promise<Address> {\n return client.readContract({\n address: oracleAddress,\n abi: mintingOracleAbi,\n functionName: \"pointTokenToIssuer\",\n args: [pointToken],\n });\n}\n","import type { Address, PublicClient } from \"viem\";\nimport { relayAbi } from \"../abi/relay\";\n\nexport async function getUsdt(\n client: PublicClient,\n relayAddress: Address,\n): Promise<Address> {\n return client.readContract({\n address: relayAddress,\n abi: relayAbi,\n functionName: \"usdt\",\n });\n}\n"],"mappings":";;;;;;;;;;AAGA,eAAsB,oBACpB,QACA,YACA,UACiB;AACjB,SAAO,OAAO,aAAa;AAAA,IACzB,SAAS;AAAA,IACT,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC,QAAQ;AAAA,EACjB,CAAC;AACH;AAEA,eAAsB,wBACpB,QACA,YACA,UACiB;AACjB,SAAO,OAAO,aAAa;AAAA,IACzB,SAAS;AAAA,IACT,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC,QAAQ;AAAA,EACjB,CAAC;AACH;AAEA,eAAsB,SACpB,QACA,YACA,SACkB;AAClB,SAAO,OAAO,aAAa;AAAA,IACzB,SAAS;AAAA,IACT,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC,OAAO;AAAA,EAChB,CAAC;AACH;AAEA,eAAsB,aACpB,QACA,YACiB;AACjB,SAAO,OAAO,aAAa;AAAA,IACzB,SAAS;AAAA,IACT,KAAK;AAAA,IACL,cAAc;AAAA,EAChB,CAAC;AACH;AAEA,eAAsB,UACpB,QACA,YACkB;AAClB,SAAO,OAAO,aAAa;AAAA,IACzB,SAAS;AAAA,IACT,KAAK;AAAA,IACL,cAAc;AAAA,EAChB,CAAC;AACH;;;AC1DA,eAAsBA,WACpB,QACA,iBACA,QACiB;AACjB,QAAM,SAAS,MAAM,OAAO,aAAa;AAAA,IACvC,SAAS;AAAA,IACT,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC,MAAM;AAAA,EACf,CAAC;AAED,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAsB,eACpB,QACA,iBACA,QACkB;AAClB,SAAO,OAAO,aAAa;AAAA,IACzB,SAAS;AAAA,IACT,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC,MAAM;AAAA,EACf,CAAC;AACH;;;ACjDA,eAAsB,cACpB,QACA,eACA,QACA,QACe;AACf,QAAM,OAAO,aAAa;AAAA,IACxB,SAAS;AAAA,IACT,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC,QAAQ,MAAM;AAAA,EACvB,CAAC;AACH;AAEA,eAAsB,oBACpB,QACA,eACA,YACkB;AAClB,SAAO,OAAO,aAAa;AAAA,IACzB,SAAS;AAAA,IACT,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC,UAAU;AAAA,EACnB,CAAC;AACH;;;ACzBA,eAAsB,QACpB,QACA,cACkB;AAClB,SAAO,OAAO,aAAa;AAAA,IACzB,SAAS;AAAA,IACT,KAAK;AAAA,IACL,cAAc;AAAA,EAChB,CAAC;AACH;","names":["getIssuer"]}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
var _chunkS2XRFFP3cjs = require('./chunk-S2XRFFP3.cjs');
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
var _chunk27V32VNMcjs = require('./chunk-27V32VNM.cjs');
|
|
9
|
+
|
|
10
|
+
// src/contract/pointToken.ts
|
|
11
|
+
async function getMintRequestNonce(client, pointToken, receiver) {
|
|
12
|
+
return client.readContract({
|
|
13
|
+
address: pointToken,
|
|
14
|
+
abi: _chunkS2XRFFP3cjs.pointTokenAbi,
|
|
15
|
+
functionName: "mintRequestNonces",
|
|
16
|
+
args: [receiver]
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
async function getReceiverConsentNonce(client, pointToken, receiver) {
|
|
20
|
+
return client.readContract({
|
|
21
|
+
address: pointToken,
|
|
22
|
+
abi: _chunkS2XRFFP3cjs.pointTokenAbi,
|
|
23
|
+
functionName: "receiverConsentNonces",
|
|
24
|
+
args: [receiver]
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
async function isMinter(client, pointToken, account) {
|
|
28
|
+
return client.readContract({
|
|
29
|
+
address: pointToken,
|
|
30
|
+
abi: _chunkS2XRFFP3cjs.pointTokenAbi,
|
|
31
|
+
functionName: "minters",
|
|
32
|
+
args: [account]
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
async function getTokenName(client, pointToken) {
|
|
36
|
+
return client.readContract({
|
|
37
|
+
address: pointToken,
|
|
38
|
+
abi: _chunkS2XRFFP3cjs.pointTokenAbi,
|
|
39
|
+
functionName: "name"
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
async function getIssuer(client, pointToken) {
|
|
43
|
+
return client.readContract({
|
|
44
|
+
address: pointToken,
|
|
45
|
+
abi: _chunkS2XRFFP3cjs.pointTokenAbi,
|
|
46
|
+
functionName: "issuer"
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// src/contract/issuerRegistry.ts
|
|
51
|
+
async function getIssuer2(client, registryAddress, issuer) {
|
|
52
|
+
const result = await client.readContract({
|
|
53
|
+
address: registryAddress,
|
|
54
|
+
abi: _chunkS2XRFFP3cjs.issuerRegistryAbi,
|
|
55
|
+
functionName: "getIssuer",
|
|
56
|
+
args: [issuer]
|
|
57
|
+
});
|
|
58
|
+
const [
|
|
59
|
+
issuerAddress,
|
|
60
|
+
signerAddress,
|
|
61
|
+
name,
|
|
62
|
+
symbol,
|
|
63
|
+
declaredTotalSupply,
|
|
64
|
+
capBasisPoints,
|
|
65
|
+
active,
|
|
66
|
+
pointToken,
|
|
67
|
+
mintingOracle
|
|
68
|
+
] = result;
|
|
69
|
+
return {
|
|
70
|
+
issuerAddress,
|
|
71
|
+
signerAddress,
|
|
72
|
+
name,
|
|
73
|
+
symbol,
|
|
74
|
+
declaredTotalSupply,
|
|
75
|
+
capBasisPoints,
|
|
76
|
+
active,
|
|
77
|
+
pointToken,
|
|
78
|
+
mintingOracle
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
async function isActiveIssuer(client, registryAddress, issuer) {
|
|
82
|
+
return client.readContract({
|
|
83
|
+
address: registryAddress,
|
|
84
|
+
abi: _chunkS2XRFFP3cjs.issuerRegistryAbi,
|
|
85
|
+
functionName: "isActiveIssuer",
|
|
86
|
+
args: [issuer]
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// src/contract/mintingOracle.ts
|
|
91
|
+
async function verifyMintCap(client, oracleAddress, issuer, amount) {
|
|
92
|
+
await client.readContract({
|
|
93
|
+
address: oracleAddress,
|
|
94
|
+
abi: _chunkS2XRFFP3cjs.mintingOracleAbi,
|
|
95
|
+
functionName: "verifyMintCap",
|
|
96
|
+
args: [issuer, amount]
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
async function getPointTokenIssuer(client, oracleAddress, pointToken) {
|
|
100
|
+
return client.readContract({
|
|
101
|
+
address: oracleAddress,
|
|
102
|
+
abi: _chunkS2XRFFP3cjs.mintingOracleAbi,
|
|
103
|
+
functionName: "pointTokenToIssuer",
|
|
104
|
+
args: [pointToken]
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// src/contract/relay.ts
|
|
109
|
+
async function getUsdt(client, relayAddress) {
|
|
110
|
+
return client.readContract({
|
|
111
|
+
address: relayAddress,
|
|
112
|
+
abi: _chunk27V32VNMcjs.relayAbi,
|
|
113
|
+
functionName: "usdt"
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
exports.getMintRequestNonce = getMintRequestNonce; exports.getReceiverConsentNonce = getReceiverConsentNonce; exports.isMinter = isMinter; exports.getTokenName = getTokenName; exports.getIssuer = getIssuer; exports.getIssuer2 = getIssuer2; exports.isActiveIssuer = isActiveIssuer; exports.verifyMintCap = verifyMintCap; exports.getPointTokenIssuer = getPointTokenIssuer; exports.getUsdt = getUsdt;
|
|
129
|
+
//# sourceMappingURL=chunk-MEREIEE4.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/phitran/Pacific-Finance/pafi-backend/pafi-sdk/packages/core/dist/chunk-MEREIEE4.cjs","../src/contract/pointToken.ts","../src/contract/issuerRegistry.ts","../src/contract/mintingOracle.ts","../src/contract/relay.ts"],"names":["getIssuer"],"mappings":"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","file":"/Users/phitran/Pacific-Finance/pafi-backend/pafi-sdk/packages/core/dist/chunk-MEREIEE4.cjs","sourcesContent":[null,"import type { Address, PublicClient } from \"viem\";\nimport { pointTokenAbi } from \"../abi/pointToken\";\n\nexport async function getMintRequestNonce(\n client: PublicClient,\n pointToken: Address,\n receiver: Address,\n): Promise<bigint> {\n return client.readContract({\n address: pointToken,\n abi: pointTokenAbi,\n functionName: \"mintRequestNonces\",\n args: [receiver],\n });\n}\n\nexport async function getReceiverConsentNonce(\n client: PublicClient,\n pointToken: Address,\n receiver: Address,\n): Promise<bigint> {\n return client.readContract({\n address: pointToken,\n abi: pointTokenAbi,\n functionName: \"receiverConsentNonces\",\n args: [receiver],\n });\n}\n\nexport async function isMinter(\n client: PublicClient,\n pointToken: Address,\n account: Address,\n): Promise<boolean> {\n return client.readContract({\n address: pointToken,\n abi: pointTokenAbi,\n functionName: \"minters\",\n args: [account],\n });\n}\n\nexport async function getTokenName(\n client: PublicClient,\n pointToken: Address,\n): Promise<string> {\n return client.readContract({\n address: pointToken,\n abi: pointTokenAbi,\n functionName: \"name\",\n });\n}\n\nexport async function getIssuer(\n client: PublicClient,\n pointToken: Address,\n): Promise<Address> {\n return client.readContract({\n address: pointToken,\n abi: pointTokenAbi,\n functionName: \"issuer\",\n });\n}\n","import type { Address, PublicClient } from \"viem\";\nimport { issuerRegistryAbi } from \"../abi/issuerRegistry\";\nimport type { Issuer } from \"../types\";\n\nexport async function getIssuer(\n client: PublicClient,\n registryAddress: Address,\n issuer: Address,\n): Promise<Issuer> {\n const result = await client.readContract({\n address: registryAddress,\n abi: issuerRegistryAbi,\n functionName: \"getIssuer\",\n args: [issuer],\n });\n\n const [\n issuerAddress,\n signerAddress,\n name,\n symbol,\n declaredTotalSupply,\n capBasisPoints,\n active,\n pointToken,\n mintingOracle,\n ] = result;\n\n return {\n issuerAddress,\n signerAddress,\n name,\n symbol,\n declaredTotalSupply,\n capBasisPoints,\n active,\n pointToken,\n mintingOracle,\n };\n}\n\nexport async function isActiveIssuer(\n client: PublicClient,\n registryAddress: Address,\n issuer: Address,\n): Promise<boolean> {\n return client.readContract({\n address: registryAddress,\n abi: issuerRegistryAbi,\n functionName: \"isActiveIssuer\",\n args: [issuer],\n });\n}\n","import type { Address, PublicClient } from \"viem\";\nimport { mintingOracleAbi } from \"../abi/mintingOracle\";\n\nexport async function verifyMintCap(\n client: PublicClient,\n oracleAddress: Address,\n issuer: Address,\n amount: bigint,\n): Promise<void> {\n await client.readContract({\n address: oracleAddress,\n abi: mintingOracleAbi,\n functionName: \"verifyMintCap\",\n args: [issuer, amount],\n });\n}\n\nexport async function getPointTokenIssuer(\n client: PublicClient,\n oracleAddress: Address,\n pointToken: Address,\n): Promise<Address> {\n return client.readContract({\n address: oracleAddress,\n abi: mintingOracleAbi,\n functionName: \"pointTokenToIssuer\",\n args: [pointToken],\n });\n}\n","import type { Address, PublicClient } from \"viem\";\nimport { relayAbi } from \"../abi/relay\";\n\nexport async function getUsdt(\n client: PublicClient,\n relayAddress: Address,\n): Promise<Address> {\n return client.readContract({\n address: relayAddress,\n abi: relayAbi,\n functionName: \"usdt\",\n });\n}\n"]}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
// src/auth/loginMessage.ts
|
|
2
|
+
import { getAddress, verifyMessage, recoverMessageAddress } from "viem";
|
|
3
|
+
var DEFAULT_VERSION = "1";
|
|
4
|
+
var DEFAULT_STATEMENT = "Sign in with Ethereum to PAFI.";
|
|
5
|
+
function createLoginMessage(params) {
|
|
6
|
+
const {
|
|
7
|
+
domain,
|
|
8
|
+
address,
|
|
9
|
+
chainId,
|
|
10
|
+
nonce,
|
|
11
|
+
uri,
|
|
12
|
+
statement = DEFAULT_STATEMENT,
|
|
13
|
+
version = DEFAULT_VERSION,
|
|
14
|
+
issuedAt = /* @__PURE__ */ new Date(),
|
|
15
|
+
expirationTime,
|
|
16
|
+
notBefore,
|
|
17
|
+
requestId
|
|
18
|
+
} = params;
|
|
19
|
+
if (!domain) throw new Error("createLoginMessage: domain required");
|
|
20
|
+
if (!nonce) throw new Error("createLoginMessage: nonce required");
|
|
21
|
+
if (!uri) throw new Error("createLoginMessage: uri required");
|
|
22
|
+
const checksummed = getAddress(address);
|
|
23
|
+
const lines = [];
|
|
24
|
+
lines.push(`${domain} wants you to sign in with your Ethereum account:`);
|
|
25
|
+
lines.push(checksummed);
|
|
26
|
+
lines.push("");
|
|
27
|
+
if (statement) {
|
|
28
|
+
lines.push(statement);
|
|
29
|
+
lines.push("");
|
|
30
|
+
}
|
|
31
|
+
lines.push(`URI: ${uri}`);
|
|
32
|
+
lines.push(`Version: ${version}`);
|
|
33
|
+
lines.push(`Chain ID: ${chainId}`);
|
|
34
|
+
lines.push(`Nonce: ${nonce}`);
|
|
35
|
+
lines.push(`Issued At: ${issuedAt.toISOString()}`);
|
|
36
|
+
if (expirationTime) {
|
|
37
|
+
lines.push(`Expiration Time: ${expirationTime.toISOString()}`);
|
|
38
|
+
}
|
|
39
|
+
if (notBefore) {
|
|
40
|
+
lines.push(`Not Before: ${notBefore.toISOString()}`);
|
|
41
|
+
}
|
|
42
|
+
if (requestId) {
|
|
43
|
+
lines.push(`Request ID: ${requestId}`);
|
|
44
|
+
}
|
|
45
|
+
return lines.join("\n");
|
|
46
|
+
}
|
|
47
|
+
function parseLoginMessage(message) {
|
|
48
|
+
const lines = message.split("\n");
|
|
49
|
+
if (lines.length < 7) {
|
|
50
|
+
throw new Error("parseLoginMessage: message too short");
|
|
51
|
+
}
|
|
52
|
+
const headerLine = lines[0] ?? "";
|
|
53
|
+
const headerMatch = headerLine.match(
|
|
54
|
+
/^(?<domain>.+) wants you to sign in with your Ethereum account:$/
|
|
55
|
+
);
|
|
56
|
+
if (!headerMatch || !headerMatch.groups) {
|
|
57
|
+
throw new Error("parseLoginMessage: invalid header line");
|
|
58
|
+
}
|
|
59
|
+
const domain = headerMatch.groups["domain"];
|
|
60
|
+
const addressLine = lines[1] ?? "";
|
|
61
|
+
if (!/^0x[0-9a-fA-F]{40}$/.test(addressLine)) {
|
|
62
|
+
throw new Error("parseLoginMessage: invalid address line");
|
|
63
|
+
}
|
|
64
|
+
const address = getAddress(addressLine);
|
|
65
|
+
let cursor = 2;
|
|
66
|
+
if (lines[cursor] !== "") {
|
|
67
|
+
throw new Error("parseLoginMessage: missing blank line after address");
|
|
68
|
+
}
|
|
69
|
+
cursor++;
|
|
70
|
+
let statement;
|
|
71
|
+
if (cursor < lines.length && !looksLikeKeyValue(lines[cursor])) {
|
|
72
|
+
statement = lines[cursor];
|
|
73
|
+
cursor++;
|
|
74
|
+
if (lines[cursor] !== "") {
|
|
75
|
+
throw new Error("parseLoginMessage: missing blank line after statement");
|
|
76
|
+
}
|
|
77
|
+
cursor++;
|
|
78
|
+
}
|
|
79
|
+
const fields = /* @__PURE__ */ new Map();
|
|
80
|
+
for (; cursor < lines.length; cursor++) {
|
|
81
|
+
const line = lines[cursor];
|
|
82
|
+
if (line === "") continue;
|
|
83
|
+
const idx = line.indexOf(": ");
|
|
84
|
+
if (idx === -1) {
|
|
85
|
+
throw new Error(`parseLoginMessage: malformed field line: "${line}"`);
|
|
86
|
+
}
|
|
87
|
+
const key = line.slice(0, idx);
|
|
88
|
+
const value = line.slice(idx + 2);
|
|
89
|
+
fields.set(key, value);
|
|
90
|
+
}
|
|
91
|
+
const uri = requireField(fields, "URI");
|
|
92
|
+
const version = requireField(fields, "Version");
|
|
93
|
+
const chainId = Number(requireField(fields, "Chain ID"));
|
|
94
|
+
if (!Number.isInteger(chainId)) {
|
|
95
|
+
throw new Error("parseLoginMessage: Chain ID is not an integer");
|
|
96
|
+
}
|
|
97
|
+
const nonce = requireField(fields, "Nonce");
|
|
98
|
+
const issuedAt = new Date(requireField(fields, "Issued At"));
|
|
99
|
+
const expirationTime = optionalDate(fields, "Expiration Time");
|
|
100
|
+
const notBefore = optionalDate(fields, "Not Before");
|
|
101
|
+
const requestId = fields.get("Request ID");
|
|
102
|
+
const result = {
|
|
103
|
+
domain,
|
|
104
|
+
address,
|
|
105
|
+
chainId,
|
|
106
|
+
nonce,
|
|
107
|
+
uri,
|
|
108
|
+
version,
|
|
109
|
+
issuedAt
|
|
110
|
+
};
|
|
111
|
+
if (statement !== void 0) result.statement = statement;
|
|
112
|
+
if (expirationTime !== void 0) result.expirationTime = expirationTime;
|
|
113
|
+
if (notBefore !== void 0) result.notBefore = notBefore;
|
|
114
|
+
if (requestId !== void 0) result.requestId = requestId;
|
|
115
|
+
return result;
|
|
116
|
+
}
|
|
117
|
+
async function verifyLoginMessage(message, signature) {
|
|
118
|
+
const parsed = parseLoginMessage(message);
|
|
119
|
+
const valid = await verifyMessage({
|
|
120
|
+
address: parsed.address,
|
|
121
|
+
message,
|
|
122
|
+
signature
|
|
123
|
+
});
|
|
124
|
+
if (valid) {
|
|
125
|
+
return { valid: true, address: parsed.address };
|
|
126
|
+
}
|
|
127
|
+
const recovered = await recoverMessageAddress({ message, signature });
|
|
128
|
+
return { valid: false, address: getAddress(recovered) };
|
|
129
|
+
}
|
|
130
|
+
var KNOWN_KEYS = /* @__PURE__ */ new Set([
|
|
131
|
+
"URI",
|
|
132
|
+
"Version",
|
|
133
|
+
"Chain ID",
|
|
134
|
+
"Nonce",
|
|
135
|
+
"Issued At",
|
|
136
|
+
"Expiration Time",
|
|
137
|
+
"Not Before",
|
|
138
|
+
"Request ID"
|
|
139
|
+
]);
|
|
140
|
+
function looksLikeKeyValue(line) {
|
|
141
|
+
const idx = line.indexOf(": ");
|
|
142
|
+
if (idx === -1) return false;
|
|
143
|
+
return KNOWN_KEYS.has(line.slice(0, idx));
|
|
144
|
+
}
|
|
145
|
+
function requireField(fields, key) {
|
|
146
|
+
const value = fields.get(key);
|
|
147
|
+
if (value === void 0) {
|
|
148
|
+
throw new Error(`parseLoginMessage: missing required field "${key}"`);
|
|
149
|
+
}
|
|
150
|
+
return value;
|
|
151
|
+
}
|
|
152
|
+
function optionalDate(fields, key) {
|
|
153
|
+
const raw = fields.get(key);
|
|
154
|
+
if (raw === void 0) return void 0;
|
|
155
|
+
return new Date(raw);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
export {
|
|
159
|
+
createLoginMessage,
|
|
160
|
+
parseLoginMessage,
|
|
161
|
+
verifyLoginMessage
|
|
162
|
+
};
|
|
163
|
+
//# sourceMappingURL=chunk-O4SMTUOY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/auth/loginMessage.ts"],"sourcesContent":["import { getAddress, verifyMessage, recoverMessageAddress } from \"viem\";\nimport type { Address, Hex } from \"viem\";\nimport type { LoginMessageParams, VerifyLoginResult } from \"./types\";\n\nconst DEFAULT_VERSION = \"1\";\nconst DEFAULT_STATEMENT = \"Sign in with Ethereum to PAFI.\";\n\n/**\n * Build an EIP-4361 login message string.\n *\n * The output is a deterministic plain-text message that the wallet signs via\n * `personal_sign`. The same message can be parsed back with\n * {@link parseLoginMessage} and verified with {@link verifyLoginMessage}.\n */\nexport function createLoginMessage(params: LoginMessageParams): string {\n const {\n domain,\n address,\n chainId,\n nonce,\n uri,\n statement = DEFAULT_STATEMENT,\n version = DEFAULT_VERSION,\n issuedAt = new Date(),\n expirationTime,\n notBefore,\n requestId,\n } = params;\n\n if (!domain) throw new Error(\"createLoginMessage: domain required\");\n if (!nonce) throw new Error(\"createLoginMessage: nonce required\");\n if (!uri) throw new Error(\"createLoginMessage: uri required\");\n\n const checksummed = getAddress(address);\n\n const lines: string[] = [];\n lines.push(`${domain} wants you to sign in with your Ethereum account:`);\n lines.push(checksummed);\n lines.push(\"\");\n if (statement) {\n lines.push(statement);\n lines.push(\"\");\n }\n lines.push(`URI: ${uri}`);\n lines.push(`Version: ${version}`);\n lines.push(`Chain ID: ${chainId}`);\n lines.push(`Nonce: ${nonce}`);\n lines.push(`Issued At: ${issuedAt.toISOString()}`);\n if (expirationTime) {\n lines.push(`Expiration Time: ${expirationTime.toISOString()}`);\n }\n if (notBefore) {\n lines.push(`Not Before: ${notBefore.toISOString()}`);\n }\n if (requestId) {\n lines.push(`Request ID: ${requestId}`);\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Parse a login message string built by {@link createLoginMessage} back into\n * its structured fields. Throws if the message does not match the expected\n * EIP-4361 layout.\n */\nexport function parseLoginMessage(message: string): LoginMessageParams {\n const lines = message.split(\"\\n\");\n if (lines.length < 7) {\n throw new Error(\"parseLoginMessage: message too short\");\n }\n\n const headerLine = lines[0] ?? \"\";\n const headerMatch = headerLine.match(\n /^(?<domain>.+) wants you to sign in with your Ethereum account:$/,\n );\n if (!headerMatch || !headerMatch.groups) {\n throw new Error(\"parseLoginMessage: invalid header line\");\n }\n const domain = headerMatch.groups[\"domain\"]!;\n\n const addressLine = lines[1] ?? \"\";\n if (!/^0x[0-9a-fA-F]{40}$/.test(addressLine)) {\n throw new Error(\"parseLoginMessage: invalid address line\");\n }\n const address = getAddress(addressLine);\n\n // After address: blank line, optional statement + blank line, then key:value lines.\n let cursor = 2;\n if (lines[cursor] !== \"\") {\n throw new Error(\"parseLoginMessage: missing blank line after address\");\n }\n cursor++;\n\n let statement: string | undefined;\n // Statement is present if the next line is not a known key.\n if (cursor < lines.length && !looksLikeKeyValue(lines[cursor]!)) {\n statement = lines[cursor];\n cursor++;\n if (lines[cursor] !== \"\") {\n throw new Error(\"parseLoginMessage: missing blank line after statement\");\n }\n cursor++;\n }\n\n const fields = new Map<string, string>();\n for (; cursor < lines.length; cursor++) {\n const line = lines[cursor]!;\n if (line === \"\") continue;\n const idx = line.indexOf(\": \");\n if (idx === -1) {\n throw new Error(`parseLoginMessage: malformed field line: \"${line}\"`);\n }\n const key = line.slice(0, idx);\n const value = line.slice(idx + 2);\n fields.set(key, value);\n }\n\n const uri = requireField(fields, \"URI\");\n const version = requireField(fields, \"Version\");\n const chainId = Number(requireField(fields, \"Chain ID\"));\n if (!Number.isInteger(chainId)) {\n throw new Error(\"parseLoginMessage: Chain ID is not an integer\");\n }\n const nonce = requireField(fields, \"Nonce\");\n const issuedAt = new Date(requireField(fields, \"Issued At\"));\n const expirationTime = optionalDate(fields, \"Expiration Time\");\n const notBefore = optionalDate(fields, \"Not Before\");\n const requestId = fields.get(\"Request ID\");\n\n const result: LoginMessageParams = {\n domain,\n address,\n chainId,\n nonce,\n uri,\n version,\n issuedAt,\n };\n if (statement !== undefined) result.statement = statement;\n if (expirationTime !== undefined) result.expirationTime = expirationTime;\n if (notBefore !== undefined) result.notBefore = notBefore;\n if (requestId !== undefined) result.requestId = requestId;\n return result;\n}\n\n/**\n * Verify that a login message was signed by the address embedded in the\n * message. Returns `{ valid, address }` where `address` is the recovered\n * signer (checksummed). Does NOT check expiration / not-before / nonce\n * consumption — those are the AuthService's responsibility.\n */\nexport async function verifyLoginMessage(\n message: string,\n signature: Hex,\n): Promise<VerifyLoginResult> {\n const parsed = parseLoginMessage(message);\n const valid = await verifyMessage({\n address: parsed.address,\n message,\n signature,\n });\n if (valid) {\n return { valid: true, address: parsed.address };\n }\n // Recover anyway so callers can log the mismatch.\n const recovered = await recoverMessageAddress({ message, signature });\n return { valid: false, address: getAddress(recovered) as Address };\n}\n\n// -------------------------------------------------------------------------\n// helpers\n// -------------------------------------------------------------------------\n\nconst KNOWN_KEYS = new Set([\n \"URI\",\n \"Version\",\n \"Chain ID\",\n \"Nonce\",\n \"Issued At\",\n \"Expiration Time\",\n \"Not Before\",\n \"Request ID\",\n]);\n\nfunction looksLikeKeyValue(line: string): boolean {\n const idx = line.indexOf(\": \");\n if (idx === -1) return false;\n return KNOWN_KEYS.has(line.slice(0, idx));\n}\n\nfunction requireField(fields: Map<string, string>, key: string): string {\n const value = fields.get(key);\n if (value === undefined) {\n throw new Error(`parseLoginMessage: missing required field \"${key}\"`);\n }\n return value;\n}\n\nfunction optionalDate(\n fields: Map<string, string>,\n key: string,\n): Date | undefined {\n const raw = fields.get(key);\n if (raw === undefined) return undefined;\n return new Date(raw);\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
var _chunkIPXARZ6Fcjs = require('./chunk-IPXARZ6F.cjs');
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
var _chunk5QJZT7VBcjs = require('./chunk-5QJZT7VB.cjs');
|
|
9
|
+
|
|
10
|
+
// src/swap/approval.ts
|
|
11
|
+
var _viem = require('viem');
|
|
12
|
+
async function checkAllowance(client, token, owner, spender) {
|
|
13
|
+
return client.readContract({
|
|
14
|
+
address: token,
|
|
15
|
+
abi: _chunkIPXARZ6Fcjs.erc20Abi,
|
|
16
|
+
functionName: "allowance",
|
|
17
|
+
args: [owner, spender]
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
function buildErc20ApprovalCalldata(spender, amount) {
|
|
21
|
+
return _viem.encodeFunctionData.call(void 0, {
|
|
22
|
+
abi: _chunkIPXARZ6Fcjs.erc20Abi,
|
|
23
|
+
functionName: "approve",
|
|
24
|
+
args: [spender, amount]
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
function buildPermit2ApprovalCalldata(token, spender, amount, expiration) {
|
|
28
|
+
return _viem.encodeFunctionData.call(void 0, {
|
|
29
|
+
abi: _chunkIPXARZ6Fcjs.permit2Abi,
|
|
30
|
+
functionName: "approve",
|
|
31
|
+
args: [token, spender, amount, expiration]
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// src/swap/universalRouter.ts
|
|
36
|
+
|
|
37
|
+
var V4_SWAP = 16;
|
|
38
|
+
var SWAP_EXACT_IN = 7;
|
|
39
|
+
var SETTLE_ALL = 12;
|
|
40
|
+
var TAKE_ALL = 15;
|
|
41
|
+
var PATH_KEY_ABI_COMPONENTS = [
|
|
42
|
+
{ name: "intermediateCurrency", type: "address" },
|
|
43
|
+
{ name: "fee", type: "uint256" },
|
|
44
|
+
{ name: "tickSpacing", type: "int24" },
|
|
45
|
+
{ name: "hooks", type: "address" },
|
|
46
|
+
{ name: "hookData", type: "bytes" }
|
|
47
|
+
];
|
|
48
|
+
var EXACT_INPUT_PARAMS_ABI = [
|
|
49
|
+
{ name: "currencyIn", type: "address" },
|
|
50
|
+
{
|
|
51
|
+
name: "path",
|
|
52
|
+
type: "tuple[]",
|
|
53
|
+
components: PATH_KEY_ABI_COMPONENTS
|
|
54
|
+
},
|
|
55
|
+
{ name: "amountIn", type: "uint128" },
|
|
56
|
+
{ name: "amountOutMinimum", type: "uint128" }
|
|
57
|
+
];
|
|
58
|
+
function buildV4SwapInput(currencyIn, path, amountIn, minAmountOut, outputCurrency) {
|
|
59
|
+
const actions = _viem.encodePacked.call(void 0,
|
|
60
|
+
["uint8", "uint8", "uint8"],
|
|
61
|
+
[SWAP_EXACT_IN, SETTLE_ALL, TAKE_ALL]
|
|
62
|
+
);
|
|
63
|
+
const swapParam = _viem.encodeAbiParameters.call(void 0,
|
|
64
|
+
[{ name: "swap", type: "tuple", components: EXACT_INPUT_PARAMS_ABI }],
|
|
65
|
+
[
|
|
66
|
+
{
|
|
67
|
+
currencyIn,
|
|
68
|
+
path: path.map((p) => ({
|
|
69
|
+
intermediateCurrency: p.intermediateCurrency,
|
|
70
|
+
fee: BigInt(p.fee),
|
|
71
|
+
tickSpacing: p.tickSpacing,
|
|
72
|
+
hooks: p.hooks,
|
|
73
|
+
hookData: p.hookData
|
|
74
|
+
})),
|
|
75
|
+
amountIn,
|
|
76
|
+
amountOutMinimum: minAmountOut
|
|
77
|
+
}
|
|
78
|
+
]
|
|
79
|
+
);
|
|
80
|
+
const settleParam = _viem.encodeAbiParameters.call(void 0,
|
|
81
|
+
[
|
|
82
|
+
{ name: "currency", type: "address" },
|
|
83
|
+
{ name: "maxAmount", type: "uint256" }
|
|
84
|
+
],
|
|
85
|
+
[currencyIn, amountIn]
|
|
86
|
+
);
|
|
87
|
+
const takeParam = _viem.encodeAbiParameters.call(void 0,
|
|
88
|
+
[
|
|
89
|
+
{ name: "currency", type: "address" },
|
|
90
|
+
{ name: "minAmount", type: "uint256" }
|
|
91
|
+
],
|
|
92
|
+
[outputCurrency, minAmountOut]
|
|
93
|
+
);
|
|
94
|
+
return _viem.encodeAbiParameters.call(void 0,
|
|
95
|
+
[
|
|
96
|
+
{ name: "actions", type: "bytes" },
|
|
97
|
+
{ name: "params", type: "bytes[]" }
|
|
98
|
+
],
|
|
99
|
+
[actions, [swapParam, settleParam, takeParam]]
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
function buildUniversalRouterExecuteArgs(currencyIn, path, amountIn, minAmountOut, outputCurrency) {
|
|
103
|
+
const commands = _viem.encodePacked.call(void 0, ["uint8"], [V4_SWAP]);
|
|
104
|
+
const inputs = [
|
|
105
|
+
buildV4SwapInput(currencyIn, path, amountIn, minAmountOut, outputCurrency)
|
|
106
|
+
];
|
|
107
|
+
return { commands, inputs };
|
|
108
|
+
}
|
|
109
|
+
function buildSwapFromQuote(params) {
|
|
110
|
+
return buildUniversalRouterExecuteArgs(
|
|
111
|
+
params.currencyIn,
|
|
112
|
+
params.quote.path,
|
|
113
|
+
params.amountIn,
|
|
114
|
+
params.minAmountOut,
|
|
115
|
+
params.currencyOut
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// src/swap/simulate.ts
|
|
120
|
+
async function simulateSwap(client, routerAddress, commands, inputs, deadline, from) {
|
|
121
|
+
try {
|
|
122
|
+
const gasEstimate = await client.estimateContractGas({
|
|
123
|
+
address: routerAddress,
|
|
124
|
+
abi: _chunkIPXARZ6Fcjs.universalRouterAbi,
|
|
125
|
+
functionName: "execute",
|
|
126
|
+
args: [commands, inputs, deadline],
|
|
127
|
+
account: from
|
|
128
|
+
});
|
|
129
|
+
return { success: true, gasEstimate };
|
|
130
|
+
} catch (error) {
|
|
131
|
+
const message = error instanceof Error ? error.message : "Unknown simulation error";
|
|
132
|
+
throw new (0, _chunk5QJZT7VBcjs.SimulationError)("swap", message);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
exports.checkAllowance = checkAllowance; exports.buildErc20ApprovalCalldata = buildErc20ApprovalCalldata; exports.buildPermit2ApprovalCalldata = buildPermit2ApprovalCalldata; exports.V4_SWAP = V4_SWAP; exports.SWAP_EXACT_IN = SWAP_EXACT_IN; exports.SETTLE_ALL = SETTLE_ALL; exports.TAKE_ALL = TAKE_ALL; exports.buildV4SwapInput = buildV4SwapInput; exports.buildUniversalRouterExecuteArgs = buildUniversalRouterExecuteArgs; exports.buildSwapFromQuote = buildSwapFromQuote; exports.simulateSwap = simulateSwap;
|
|
149
|
+
//# sourceMappingURL=chunk-O7LQKCBT.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/phitran/Pacific-Finance/pafi-backend/pafi-sdk/packages/core/dist/chunk-O7LQKCBT.cjs","../src/swap/approval.ts","../src/swap/universalRouter.ts","../src/swap/simulate.ts"],"names":[],"mappings":"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","file":"/Users/phitran/Pacific-Finance/pafi-backend/pafi-sdk/packages/core/dist/chunk-O7LQKCBT.cjs","sourcesContent":[null,"import { encodeFunctionData } from \"viem\";\nimport type { Address, Hex, PublicClient } from \"viem\";\nimport { erc20Abi } from \"../abi/erc20\";\nimport { permit2Abi } from \"../abi/permit2\";\n\nexport async function checkAllowance(\n client: PublicClient,\n token: Address,\n owner: Address,\n spender: Address,\n): Promise<bigint> {\n return client.readContract({\n address: token,\n abi: erc20Abi,\n functionName: \"allowance\",\n args: [owner, spender],\n });\n}\n\n/**\n * Encode an ERC-20 approve(spender, amount) call.\n */\nexport function buildErc20ApprovalCalldata(\n spender: Address,\n amount: bigint,\n): Hex {\n return encodeFunctionData({\n abi: erc20Abi,\n functionName: \"approve\",\n args: [spender, amount],\n });\n}\n\n/**\n * Encode a Permit2 approve(token, spender, amount, expiration) call.\n */\nexport function buildPermit2ApprovalCalldata(\n token: Address,\n spender: Address,\n amount: bigint,\n expiration: number,\n): Hex {\n return encodeFunctionData({\n abi: permit2Abi,\n functionName: \"approve\",\n args: [token, spender, amount, expiration],\n });\n}\n","import { encodeAbiParameters, encodePacked } from \"viem\";\nimport type { Address, Hex } from \"viem\";\nimport type { PathKey, QuoteResult } from \"../types\";\n\n// -------------------------------------------------------------------------\n// V4 UniversalRouter command / action constants\n// Reference: https://github.com/Uniswap/v4-periphery/blob/main/src/libraries/Actions.sol\n// -------------------------------------------------------------------------\n\n/** UniversalRouter command byte for V4 swap */\nexport const V4_SWAP = 0x10 as const;\n\n/** V4 actions */\nexport const SWAP_EXACT_IN_SINGLE = 0x06 as const;\nexport const SWAP_EXACT_IN = 0x07 as const;\nexport const SETTLE_ALL = 0x0c as const;\nexport const TAKE_ALL = 0x0f as const;\n\n// -------------------------------------------------------------------------\n// ABI type strings matching Uniswap's V4Planner encoding\n// Reference: https://github.com/Uniswap/sdks/blob/main/sdks/v4-sdk/src/utils/v4Planner.ts\n//\n// IMPORTANT: PathKey.fee is uint256 in the V4 Router ABI (not uint24).\n// -------------------------------------------------------------------------\n\n// PathKey components for V4 Router ABI encoding.\n// IMPORTANT: fee is uint256 in the V4 Router (not uint24 as in PoolKey).\n// Reference: https://github.com/Uniswap/sdks/blob/main/sdks/v4-sdk/src/utils/v4Planner.ts\nconst PATH_KEY_ABI_COMPONENTS = [\n { name: \"intermediateCurrency\", type: \"address\" },\n { name: \"fee\", type: \"uint256\" },\n { name: \"tickSpacing\", type: \"int24\" },\n { name: \"hooks\", type: \"address\" },\n { name: \"hookData\", type: \"bytes\" },\n] as const;\n\nconst EXACT_INPUT_PARAMS_ABI = [\n { name: \"currencyIn\", type: \"address\" },\n {\n name: \"path\",\n type: \"tuple[]\",\n components: PATH_KEY_ABI_COMPONENTS,\n },\n { name: \"amountIn\", type: \"uint128\" },\n { name: \"amountOutMinimum\", type: \"uint128\" },\n] as const;\n\n/**\n * Build the calldata inputs[0] (the V4_SWAP command payload) for\n * UniversalRouter.execute.\n *\n * Actions encoded: SWAP_EXACT_IN → SETTLE_ALL → TAKE_ALL\n *\n * Encoding matches the Uniswap V4 SDK's V4Planner — each action's params\n * are individually ABI-encoded, then wrapped together with the action bytes.\n */\nexport function buildV4SwapInput(\n currencyIn: Address,\n path: PathKey[],\n amountIn: bigint,\n minAmountOut: bigint,\n outputCurrency: Address,\n): Hex {\n const actions = encodePacked(\n [\"uint8\", \"uint8\", \"uint8\"],\n [SWAP_EXACT_IN, SETTLE_ALL, TAKE_ALL],\n );\n\n // Param 0: ExactInputParams — encoded as a single tuple so the CalldataDecoder\n // can locate it via a single offset pointer. fee is uint256 per V4 Router spec.\n const swapParam = encodeAbiParameters(\n [{ name: \"swap\", type: \"tuple\", components: EXACT_INPUT_PARAMS_ABI }],\n [\n {\n currencyIn,\n path: path.map((p) => ({\n intermediateCurrency: p.intermediateCurrency,\n fee: BigInt(p.fee),\n tickSpacing: p.tickSpacing,\n hooks: p.hooks,\n hookData: p.hookData,\n })),\n amountIn,\n amountOutMinimum: minAmountOut,\n },\n ],\n );\n\n // Param 1: SETTLE_ALL { currency, maxAmount }\n const settleParam = encodeAbiParameters(\n [\n { name: \"currency\", type: \"address\" },\n { name: \"maxAmount\", type: \"uint256\" },\n ],\n [currencyIn, amountIn],\n );\n\n // Param 2: TAKE_ALL { currency, minAmount }\n const takeParam = encodeAbiParameters(\n [\n { name: \"currency\", type: \"address\" },\n { name: \"minAmount\", type: \"uint256\" },\n ],\n [outputCurrency, minAmountOut],\n );\n\n return encodeAbiParameters(\n [\n { name: \"actions\", type: \"bytes\" },\n { name: \"params\", type: \"bytes[]\" },\n ],\n [actions, [swapParam, settleParam, takeParam]],\n );\n}\n\n/**\n * Build the full commands + inputs args for UniversalRouter.execute.\n */\nexport function buildUniversalRouterExecuteArgs(\n currencyIn: Address,\n path: PathKey[],\n amountIn: bigint,\n minAmountOut: bigint,\n outputCurrency: Address,\n): { commands: Hex; inputs: Hex[] } {\n const commands = encodePacked([\"uint8\"], [V4_SWAP]);\n const inputs: Hex[] = [\n buildV4SwapInput(currencyIn, path, amountIn, minAmountOut, outputCurrency),\n ];\n return { commands, inputs };\n}\n\n/**\n * Build UniversalRouter execute args from a quote result.\n *\n * Takes the output of `findBestQuote` / `quoteBestRoute` and produces\n * ready-to-use `{ commands, inputs }` for `UniversalRouter.execute`.\n *\n * @param quote - Quote result containing the path\n * @param currencyIn - Input token address\n * @param currencyOut - Output token address\n * @param amountIn - Exact input amount (same value passed to the quoter)\n * @param minAmountOut - Minimum acceptable output (caller applies slippage)\n */\nexport function buildSwapFromQuote(params: {\n quote: QuoteResult;\n currencyIn: Address;\n currencyOut: Address;\n amountIn: bigint;\n minAmountOut: bigint;\n}): { commands: Hex; inputs: Hex[] } {\n return buildUniversalRouterExecuteArgs(\n params.currencyIn,\n params.quote.path,\n params.amountIn,\n params.minAmountOut,\n params.currencyOut,\n );\n}\n","import type { Address, Hex, PublicClient } from \"viem\";\nimport { universalRouterAbi } from \"../abi/universalRouter\";\nimport { SimulationError } from \"../errors\";\n\nexport interface SwapSimulationResult {\n success: boolean;\n gasEstimate: bigint;\n}\n\n/**\n * Simulate a UniversalRouter.execute swap call via eth_call (no gas spent).\n *\n * Runs the full V4 swap flow — token transfer via Permit2, swap via\n * PoolManager, output settlement — without submitting a transaction.\n * If the simulation reverts, throws a `SimulationError` with the reason.\n *\n * @param client - viem PublicClient\n * @param routerAddress - UniversalRouter contract address\n * @param commands - Packed command bytes (from buildSwapFromQuote)\n * @param inputs - Encoded inputs per command (from buildSwapFromQuote)\n * @param deadline - Unix timestamp after which the tx expires\n * @param from - Address that will execute the swap\n */\nexport async function simulateSwap(\n client: PublicClient,\n routerAddress: Address,\n commands: Hex,\n inputs: Hex[],\n deadline: bigint,\n from: Address,\n): Promise<SwapSimulationResult> {\n try {\n const gasEstimate = await client.estimateContractGas({\n address: routerAddress,\n abi: universalRouterAbi,\n functionName: \"execute\",\n args: [commands, inputs, deadline],\n account: from,\n });\n\n return { success: true, gasEstimate };\n } catch (error: unknown) {\n const message =\n error instanceof Error ? error.message : \"Unknown simulation error\";\n throw new SimulationError(\"swap\", message);\n }\n}\n"]}
|