@t402/polkadot 2.3.1 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -1
- package/dist/{exact-direct → cjs/exact-direct}/client/index.d.ts +1 -1
- package/dist/{exact-direct/client/index.cjs → cjs/exact-direct/client/index.js} +5 -3
- package/dist/{index.cjs.map → cjs/exact-direct/client/index.js.map} +1 -1
- package/dist/{exact-direct → cjs/exact-direct}/facilitator/index.d.ts +1 -1
- package/dist/{exact-direct/facilitator/index.cjs → cjs/exact-direct/facilitator/index.js} +8 -6
- package/dist/cjs/exact-direct/facilitator/index.js.map +1 -0
- package/dist/{exact-direct/server/index.cjs → cjs/exact-direct/server/index.js} +6 -4
- package/dist/cjs/exact-direct/server/index.js.map +1 -0
- package/dist/{index.d.ts → cjs/index.d.ts} +2 -2
- package/dist/{index.cjs → cjs/index.js} +4 -4
- package/dist/cjs/index.js.map +1 -0
- package/dist/{types-Dbjfcz2Y.d.cts → cjs/types-Bb84eJ4_.d.ts} +1 -1
- package/dist/{index.mjs → esm/chunk-BEDKJN2Y.mjs} +28 -22
- package/dist/esm/chunk-BEDKJN2Y.mjs.map +1 -0
- package/dist/{exact-direct/client/index.d.cts → esm/exact-direct/client/index.d.mts} +1 -1
- package/dist/esm/exact-direct/client/index.mjs +71 -0
- package/dist/esm/exact-direct/client/index.mjs.map +1 -0
- package/dist/{exact-direct/facilitator/index.d.cts → esm/exact-direct/facilitator/index.d.mts} +1 -1
- package/dist/{exact-direct → esm/exact-direct}/facilitator/index.mjs +18 -159
- package/dist/esm/exact-direct/facilitator/index.mjs.map +1 -0
- package/dist/{exact-direct → esm/exact-direct}/server/index.mjs +13 -102
- package/dist/esm/exact-direct/server/index.mjs.map +1 -0
- package/dist/{index.d.cts → esm/index.d.mts} +2 -2
- package/dist/esm/index.mjs +69 -0
- package/dist/esm/index.mjs.map +1 -0
- package/dist/{types-Dbjfcz2Y.d.ts → esm/types-Bb84eJ4_.d.mts} +1 -1
- package/package.json +16 -17
- package/dist/exact-direct/client/index.cjs.map +0 -1
- package/dist/exact-direct/client/index.mjs +0 -161
- package/dist/exact-direct/client/index.mjs.map +0 -1
- package/dist/exact-direct/facilitator/index.cjs.map +0 -1
- package/dist/exact-direct/facilitator/index.mjs.map +0 -1
- package/dist/exact-direct/server/index.cjs.map +0 -1
- package/dist/exact-direct/server/index.mjs.map +0 -1
- package/dist/index.mjs.map +0 -1
- /package/dist/{exact-direct → cjs/exact-direct}/server/index.d.ts +0 -0
- /package/dist/{exact-direct/server/index.d.cts → esm/exact-direct/server/index.d.mts} +0 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import {
|
|
2
|
+
POLKADOT_CAIP2_NAMESPACE,
|
|
3
|
+
SCHEME_EXACT_DIRECT,
|
|
4
|
+
__publicField,
|
|
5
|
+
getAssetId,
|
|
6
|
+
isValidAddress
|
|
7
|
+
} from "../../chunk-BEDKJN2Y.mjs";
|
|
8
|
+
|
|
9
|
+
// src/exact-direct/client/scheme.ts
|
|
10
|
+
var ExactDirectPolkadotClient = class {
|
|
11
|
+
constructor(config) {
|
|
12
|
+
__publicField(this, "scheme", SCHEME_EXACT_DIRECT);
|
|
13
|
+
__publicField(this, "signer");
|
|
14
|
+
this.signer = config.signer;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Create a payment payload by executing the transfer
|
|
18
|
+
*/
|
|
19
|
+
async createPaymentPayload(t402Version, requirements) {
|
|
20
|
+
this.validateRequirements(requirements);
|
|
21
|
+
const { network, amount, payTo, extra } = requirements;
|
|
22
|
+
const symbol = extra?.assetSymbol || "USDT";
|
|
23
|
+
const assetId = extra?.assetId ?? getAssetId(network, symbol);
|
|
24
|
+
if (assetId === void 0) {
|
|
25
|
+
throw new Error(`Unknown asset ${symbol} on network ${network}`);
|
|
26
|
+
}
|
|
27
|
+
const from = await this.signer.getAddress();
|
|
28
|
+
const { extrinsicHash, blockHash, extrinsicIndex } = await this.signer.transferAsset(assetId, payTo, amount);
|
|
29
|
+
const polkadotPayload = {
|
|
30
|
+
extrinsicHash,
|
|
31
|
+
blockHash,
|
|
32
|
+
extrinsicIndex,
|
|
33
|
+
from,
|
|
34
|
+
to: payTo,
|
|
35
|
+
amount,
|
|
36
|
+
assetId
|
|
37
|
+
};
|
|
38
|
+
return {
|
|
39
|
+
t402Version,
|
|
40
|
+
payload: polkadotPayload
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Validate payment requirements
|
|
45
|
+
*/
|
|
46
|
+
validateRequirements(requirements) {
|
|
47
|
+
if (requirements.scheme !== SCHEME_EXACT_DIRECT) {
|
|
48
|
+
throw new Error(
|
|
49
|
+
`Invalid scheme: expected ${SCHEME_EXACT_DIRECT}, got ${requirements.scheme}`
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
if (!requirements.network.startsWith(`${POLKADOT_CAIP2_NAMESPACE}:`)) {
|
|
53
|
+
throw new Error(`Invalid network: ${requirements.network}`);
|
|
54
|
+
}
|
|
55
|
+
if (!isValidAddress(requirements.payTo)) {
|
|
56
|
+
throw new Error(`Invalid payTo address: ${requirements.payTo}`);
|
|
57
|
+
}
|
|
58
|
+
const amount = BigInt(requirements.amount);
|
|
59
|
+
if (amount <= 0n) {
|
|
60
|
+
throw new Error(`Invalid amount: ${requirements.amount}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
function createExactDirectPolkadotClient(config) {
|
|
65
|
+
return new ExactDirectPolkadotClient(config);
|
|
66
|
+
}
|
|
67
|
+
export {
|
|
68
|
+
ExactDirectPolkadotClient,
|
|
69
|
+
createExactDirectPolkadotClient
|
|
70
|
+
};
|
|
71
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/exact-direct/client/scheme.ts"],"sourcesContent":["/**\n * Polkadot Exact-Direct Client Scheme\n *\n * In the exact-direct scheme, the client executes the asset transfer directly\n * and provides the extrinsic hash as proof of payment.\n */\n\nimport type {\n PaymentPayload,\n PaymentRequirements,\n SchemeNetworkClient,\n} from \"@t402/core/types\";\nimport type { ClientPolkadotSigner, ExactDirectPolkadotPayload } from \"../../types.js\";\nimport { SCHEME_EXACT_DIRECT, POLKADOT_CAIP2_NAMESPACE } from \"../../constants.js\";\nimport { getAssetId } from \"../../tokens.js\";\nimport { isValidAddress } from \"../../utils.js\";\n\n/**\n * Configuration for the exact-direct client\n */\nexport interface ExactDirectPolkadotClientConfig {\n /** Signer for executing transactions */\n signer: ClientPolkadotSigner;\n}\n\n/**\n * Exact-direct client scheme for Polkadot Asset Hub\n */\nexport class ExactDirectPolkadotClient implements SchemeNetworkClient {\n readonly scheme = SCHEME_EXACT_DIRECT;\n private readonly signer: ClientPolkadotSigner;\n\n constructor(config: ExactDirectPolkadotClientConfig) {\n this.signer = config.signer;\n }\n\n /**\n * Create a payment payload by executing the transfer\n */\n async createPaymentPayload(\n t402Version: number,\n requirements: PaymentRequirements,\n ): Promise<Pick<PaymentPayload, \"t402Version\" | \"payload\">> {\n // Validate requirements\n this.validateRequirements(requirements);\n\n const { network, amount, payTo, extra } = requirements;\n\n // Get asset ID from extra or use default USDT\n const symbol = (extra?.assetSymbol as string) || \"USDT\";\n const assetId = (extra?.assetId as number) ?? getAssetId(network, symbol);\n\n if (assetId === undefined) {\n throw new Error(`Unknown asset ${symbol} on network ${network}`);\n }\n\n // Get sender address\n const from = await this.signer.getAddress();\n\n // Execute the transfer\n const { extrinsicHash, blockHash, extrinsicIndex } =\n await this.signer.transferAsset(assetId, payTo, amount);\n\n // Build the payload\n const polkadotPayload: ExactDirectPolkadotPayload = {\n extrinsicHash,\n blockHash,\n extrinsicIndex,\n from,\n to: payTo,\n amount,\n assetId,\n };\n\n return {\n t402Version,\n payload: polkadotPayload,\n };\n }\n\n /**\n * Validate payment requirements\n */\n private validateRequirements(requirements: PaymentRequirements): void {\n // Check scheme\n if (requirements.scheme !== SCHEME_EXACT_DIRECT) {\n throw new Error(\n `Invalid scheme: expected ${SCHEME_EXACT_DIRECT}, got ${requirements.scheme}`,\n );\n }\n\n // Check network\n if (!requirements.network.startsWith(`${POLKADOT_CAIP2_NAMESPACE}:`)) {\n throw new Error(`Invalid network: ${requirements.network}`);\n }\n\n // Check payTo address\n if (!isValidAddress(requirements.payTo)) {\n throw new Error(`Invalid payTo address: ${requirements.payTo}`);\n }\n\n // Check amount\n const amount = BigInt(requirements.amount);\n if (amount <= 0n) {\n throw new Error(`Invalid amount: ${requirements.amount}`);\n }\n }\n}\n\n/**\n * Create an exact-direct client for Polkadot\n */\nexport function createExactDirectPolkadotClient(\n config: ExactDirectPolkadotClientConfig,\n): ExactDirectPolkadotClient {\n return new ExactDirectPolkadotClient(config);\n}\n"],"mappings":";;;;;;;;;AA4BO,IAAM,4BAAN,MAA+D;AAAA,EAIpE,YAAY,QAAyC;AAHrD,wBAAS,UAAS;AAClB,wBAAiB;AAGf,SAAK,SAAS,OAAO;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBACJ,aACA,cAC0D;AAE1D,SAAK,qBAAqB,YAAY;AAEtC,UAAM,EAAE,SAAS,QAAQ,OAAO,MAAM,IAAI;AAG1C,UAAM,SAAU,OAAO,eAA0B;AACjD,UAAM,UAAW,OAAO,WAAsB,WAAW,SAAS,MAAM;AAExE,QAAI,YAAY,QAAW;AACzB,YAAM,IAAI,MAAM,iBAAiB,MAAM,eAAe,OAAO,EAAE;AAAA,IACjE;AAGA,UAAM,OAAO,MAAM,KAAK,OAAO,WAAW;AAG1C,UAAM,EAAE,eAAe,WAAW,eAAe,IAC/C,MAAM,KAAK,OAAO,cAAc,SAAS,OAAO,MAAM;AAGxD,UAAM,kBAA8C;AAAA,MAClD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,IAAI;AAAA,MACJ;AAAA,MACA;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA,SAAS;AAAA,IACX;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAqB,cAAyC;AAEpE,QAAI,aAAa,WAAW,qBAAqB;AAC/C,YAAM,IAAI;AAAA,QACR,4BAA4B,mBAAmB,SAAS,aAAa,MAAM;AAAA,MAC7E;AAAA,IACF;AAGA,QAAI,CAAC,aAAa,QAAQ,WAAW,GAAG,wBAAwB,GAAG,GAAG;AACpE,YAAM,IAAI,MAAM,oBAAoB,aAAa,OAAO,EAAE;AAAA,IAC5D;AAGA,QAAI,CAAC,eAAe,aAAa,KAAK,GAAG;AACvC,YAAM,IAAI,MAAM,0BAA0B,aAAa,KAAK,EAAE;AAAA,IAChE;AAGA,UAAM,SAAS,OAAO,aAAa,MAAM;AACzC,QAAI,UAAU,IAAI;AAChB,YAAM,IAAI,MAAM,mBAAmB,aAAa,MAAM,EAAE;AAAA,IAC1D;AAAA,EACF;AACF;AAKO,SAAS,gCACd,QAC2B;AAC3B,SAAO,IAAI,0BAA0B,MAAM;AAC7C;","names":[]}
|
package/dist/{exact-direct/facilitator/index.d.cts → esm/exact-direct/facilitator/index.d.mts}
RENAMED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { SchemeNetworkFacilitator, Network, PaymentPayload, PaymentRequirements, VerifyResponse, SettleResponse } from '@t402/core/types';
|
|
2
|
-
import { F as FacilitatorPolkadotSigner,
|
|
2
|
+
import { F as FacilitatorPolkadotSigner, c as PolkadotFacilitatorConfig } from '../../types-Bb84eJ4_.mjs';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Polkadot Exact-Direct Facilitator Scheme
|
|
@@ -1,168 +1,27 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
[POLKADOT_ASSET_HUB_CAIP2]: {
|
|
15
|
-
name: "Polkadot Asset Hub",
|
|
16
|
-
caip2: POLKADOT_ASSET_HUB_CAIP2,
|
|
17
|
-
rpcUrl: DEFAULT_POLKADOT_RPC,
|
|
18
|
-
indexerUrl: DEFAULT_POLKADOT_INDEXER,
|
|
19
|
-
genesisHash: "0x68d56f15f85d3136970ec16946040bc1752654e906147f7e43e9d539d7c3de2f",
|
|
20
|
-
ss58Prefix: 0,
|
|
21
|
-
// Polkadot
|
|
22
|
-
isTestnet: false
|
|
23
|
-
},
|
|
24
|
-
[KUSAMA_ASSET_HUB_CAIP2]: {
|
|
25
|
-
name: "Kusama Asset Hub",
|
|
26
|
-
caip2: KUSAMA_ASSET_HUB_CAIP2,
|
|
27
|
-
rpcUrl: DEFAULT_KUSAMA_RPC,
|
|
28
|
-
indexerUrl: DEFAULT_KUSAMA_INDEXER,
|
|
29
|
-
genesisHash: "0x48239ef607d7928874027a43a67689209727dfb3d3dc5e5b03a39bdc2eda771a",
|
|
30
|
-
ss58Prefix: 2,
|
|
31
|
-
// Kusama
|
|
32
|
-
isTestnet: false
|
|
33
|
-
},
|
|
34
|
-
[WESTEND_ASSET_HUB_CAIP2]: {
|
|
35
|
-
name: "Westend Asset Hub",
|
|
36
|
-
caip2: WESTEND_ASSET_HUB_CAIP2,
|
|
37
|
-
rpcUrl: DEFAULT_WESTEND_RPC,
|
|
38
|
-
indexerUrl: DEFAULT_WESTEND_INDEXER,
|
|
39
|
-
genesisHash: "0xe143f23803ac50e8f6f8e62695d1ce9e4e1d68aa36c1cd2cfd15340213f3423e",
|
|
40
|
-
ss58Prefix: 42,
|
|
41
|
-
// Generic Substrate
|
|
42
|
-
isTestnet: true
|
|
43
|
-
}
|
|
44
|
-
};
|
|
45
|
-
function getNetworkConfig(network) {
|
|
46
|
-
return POLKADOT_NETWORKS[network];
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
// src/tokens.ts
|
|
50
|
-
var USDT_POLKADOT = {
|
|
51
|
-
assetId: 1984,
|
|
52
|
-
symbol: "USDT",
|
|
53
|
-
name: "Tether USD",
|
|
54
|
-
decimals: 6,
|
|
55
|
-
issuer: "Tether"
|
|
56
|
-
};
|
|
57
|
-
var USDT_KUSAMA = {
|
|
58
|
-
assetId: 1984,
|
|
59
|
-
symbol: "USDT",
|
|
60
|
-
name: "Tether USD",
|
|
61
|
-
decimals: 6,
|
|
62
|
-
issuer: "Tether"
|
|
63
|
-
};
|
|
64
|
-
var USDT_WESTEND = {
|
|
65
|
-
assetId: 1984,
|
|
66
|
-
symbol: "USDT",
|
|
67
|
-
name: "Test Tether USD",
|
|
68
|
-
decimals: 6
|
|
69
|
-
};
|
|
70
|
-
var TOKEN_REGISTRY = {
|
|
71
|
-
[POLKADOT_ASSET_HUB_CAIP2]: {
|
|
72
|
-
USDT: USDT_POLKADOT
|
|
73
|
-
},
|
|
74
|
-
[KUSAMA_ASSET_HUB_CAIP2]: {
|
|
75
|
-
USDT: USDT_KUSAMA
|
|
76
|
-
},
|
|
77
|
-
[WESTEND_ASSET_HUB_CAIP2]: {
|
|
78
|
-
USDT: USDT_WESTEND
|
|
79
|
-
}
|
|
80
|
-
};
|
|
81
|
-
var DEFAULT_TOKENS = {
|
|
82
|
-
[POLKADOT_ASSET_HUB_CAIP2]: USDT_POLKADOT,
|
|
83
|
-
[KUSAMA_ASSET_HUB_CAIP2]: USDT_KUSAMA,
|
|
84
|
-
[WESTEND_ASSET_HUB_CAIP2]: USDT_WESTEND
|
|
85
|
-
};
|
|
86
|
-
function getDefaultToken(network) {
|
|
87
|
-
return DEFAULT_TOKENS[network];
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
// src/utils.ts
|
|
91
|
-
function isValidExtrinsicHash(hash) {
|
|
92
|
-
if (!hash || typeof hash !== "string") {
|
|
93
|
-
return false;
|
|
94
|
-
}
|
|
95
|
-
return /^0x[a-fA-F0-9]{64}$/.test(hash);
|
|
96
|
-
}
|
|
97
|
-
function isValidBlockHash(hash) {
|
|
98
|
-
return isValidExtrinsicHash(hash);
|
|
99
|
-
}
|
|
100
|
-
function compareAddresses(addr1, addr2) {
|
|
101
|
-
return addr1 === addr2;
|
|
102
|
-
}
|
|
103
|
-
function extractAssetTransfer(result) {
|
|
104
|
-
if (!result.success) {
|
|
105
|
-
return null;
|
|
106
|
-
}
|
|
107
|
-
if (result.module !== "assets") {
|
|
108
|
-
return null;
|
|
109
|
-
}
|
|
110
|
-
if (result.call !== "transfer" && result.call !== "transferKeepAlive") {
|
|
111
|
-
return null;
|
|
112
|
-
}
|
|
113
|
-
const assetId = result.args.id;
|
|
114
|
-
const to = result.args.target;
|
|
115
|
-
const amount = result.args.amount;
|
|
116
|
-
if (assetId === void 0 || !to || !amount) {
|
|
117
|
-
return null;
|
|
118
|
-
}
|
|
119
|
-
return {
|
|
120
|
-
assetId,
|
|
121
|
-
from: result.signer,
|
|
122
|
-
to,
|
|
123
|
-
amount: amount.toString(),
|
|
124
|
-
success: true
|
|
125
|
-
};
|
|
126
|
-
}
|
|
127
|
-
function extractAssetTransferFromEvents(result) {
|
|
128
|
-
if (!result.success) {
|
|
129
|
-
return null;
|
|
130
|
-
}
|
|
131
|
-
const transferEvent = result.events.find(
|
|
132
|
-
(e) => e.module === "assets" && e.name === "Transferred"
|
|
133
|
-
);
|
|
134
|
-
if (!transferEvent) {
|
|
135
|
-
return null;
|
|
136
|
-
}
|
|
137
|
-
const assetId = transferEvent.data.assetId;
|
|
138
|
-
const from = transferEvent.data.from;
|
|
139
|
-
const to = transferEvent.data.to;
|
|
140
|
-
const amount = transferEvent.data.amount;
|
|
141
|
-
if (assetId === void 0 || !from || !to || !amount) {
|
|
142
|
-
return null;
|
|
143
|
-
}
|
|
144
|
-
return {
|
|
145
|
-
assetId,
|
|
146
|
-
from,
|
|
147
|
-
to,
|
|
148
|
-
amount: amount.toString(),
|
|
149
|
-
success: true
|
|
150
|
-
};
|
|
151
|
-
}
|
|
152
|
-
function buildExtrinsicId(blockHash, extrinsicIndex) {
|
|
153
|
-
return `${blockHash}-${extrinsicIndex}`;
|
|
154
|
-
}
|
|
1
|
+
import {
|
|
2
|
+
POLKADOT_CAIP2_NAMESPACE,
|
|
3
|
+
SCHEME_EXACT_DIRECT,
|
|
4
|
+
__publicField,
|
|
5
|
+
buildExtrinsicId,
|
|
6
|
+
compareAddresses,
|
|
7
|
+
extractAssetTransfer,
|
|
8
|
+
extractAssetTransferFromEvents,
|
|
9
|
+
getDefaultToken,
|
|
10
|
+
getNetworkConfig,
|
|
11
|
+
isValidBlockHash,
|
|
12
|
+
isValidExtrinsicHash
|
|
13
|
+
} from "../../chunk-BEDKJN2Y.mjs";
|
|
155
14
|
|
|
156
15
|
// src/exact-direct/facilitator/scheme.ts
|
|
157
16
|
var DEFAULT_MAX_EXTRINSIC_AGE = 3600;
|
|
158
17
|
var DEFAULT_CACHE_DURATION = 24 * 60 * 60 * 1e3;
|
|
159
18
|
var ExactDirectPolkadotFacilitator = class {
|
|
160
|
-
scheme = SCHEME_EXACT_DIRECT;
|
|
161
|
-
caipFamily = `${POLKADOT_CAIP2_NAMESPACE}:*`;
|
|
162
|
-
signer;
|
|
163
|
-
config;
|
|
164
|
-
usedExtrinsics = /* @__PURE__ */ new Map();
|
|
165
19
|
constructor(signer, config = {}) {
|
|
20
|
+
__publicField(this, "scheme", SCHEME_EXACT_DIRECT);
|
|
21
|
+
__publicField(this, "caipFamily", `${POLKADOT_CAIP2_NAMESPACE}:*`);
|
|
22
|
+
__publicField(this, "signer");
|
|
23
|
+
__publicField(this, "config");
|
|
24
|
+
__publicField(this, "usedExtrinsics", /* @__PURE__ */ new Map());
|
|
166
25
|
this.signer = signer;
|
|
167
26
|
this.config = {
|
|
168
27
|
maxExtrinsicAge: config.maxExtrinsicAge ?? DEFAULT_MAX_EXTRINSIC_AGE,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/exact-direct/facilitator/scheme.ts"],"sourcesContent":["/**\n * Polkadot Exact-Direct Facilitator Scheme\n *\n * Verifies that a Polkadot asset transfer was executed correctly\n * by querying the Subscan indexer.\n */\n\nimport type {\n Network,\n PaymentPayload,\n PaymentRequirements,\n SchemeNetworkFacilitator,\n SettleResponse,\n VerifyResponse,\n} from \"@t402/core/types\";\nimport { POLKADOT_CAIP2_NAMESPACE, SCHEME_EXACT_DIRECT, getNetworkConfig } from \"../../constants.js\";\nimport { getDefaultToken } from \"../../tokens.js\";\nimport type {\n ExactDirectPolkadotPayload,\n FacilitatorPolkadotSigner,\n PolkadotFacilitatorConfig,\n} from \"../../types.js\";\nimport {\n buildExtrinsicId,\n compareAddresses,\n extractAssetTransfer,\n extractAssetTransferFromEvents,\n isValidBlockHash,\n isValidExtrinsicHash,\n} from \"../../utils.js\";\n\n// Default configuration\nconst DEFAULT_MAX_EXTRINSIC_AGE = 3600; // 1 hour\nconst DEFAULT_CACHE_DURATION = 24 * 60 * 60 * 1000; // 24 hours in ms\n\n/**\n * Exact-direct facilitator scheme for Polkadot Asset Hub\n */\nexport class ExactDirectPolkadotFacilitator implements SchemeNetworkFacilitator {\n readonly scheme = SCHEME_EXACT_DIRECT;\n readonly caipFamily = `${POLKADOT_CAIP2_NAMESPACE}:*`;\n\n private readonly signer: FacilitatorPolkadotSigner;\n private readonly config: Required<PolkadotFacilitatorConfig>;\n private readonly usedExtrinsics = new Map<string, number>();\n\n constructor(\n signer: FacilitatorPolkadotSigner,\n config: PolkadotFacilitatorConfig = {},\n ) {\n this.signer = signer;\n this.config = {\n maxExtrinsicAge: config.maxExtrinsicAge ?? DEFAULT_MAX_EXTRINSIC_AGE,\n usedExtrinsicCacheDuration:\n config.usedExtrinsicCacheDuration ?? DEFAULT_CACHE_DURATION,\n };\n\n // Start cleanup interval\n this.startCleanupInterval();\n }\n\n /**\n * Get extra data for payment requirements\n */\n getExtra(network: Network): Record<string, unknown> | undefined {\n const config = getNetworkConfig(network);\n if (!config) return undefined;\n\n const token = getDefaultToken(network);\n return {\n assetId: token?.assetId,\n assetSymbol: token?.symbol,\n assetDecimals: token?.decimals,\n networkName: config.name,\n };\n }\n\n /**\n * Get facilitator signer addresses for a network\n */\n getSigners(network: Network): string[] {\n return this.signer.getAddresses(network);\n }\n\n /**\n * Verify a payment payload\n */\n async verify(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n ): Promise<VerifyResponse> {\n const network = requirements.network;\n\n // Validate scheme\n if (payload.accepted.scheme !== SCHEME_EXACT_DIRECT) {\n return {\n isValid: false,\n invalidReason: `invalid_scheme: expected ${SCHEME_EXACT_DIRECT}, got ${payload.accepted.scheme}`,\n };\n }\n\n // Validate network\n if (payload.accepted.network !== network) {\n return {\n isValid: false,\n invalidReason: `network_mismatch: expected ${network}, got ${payload.accepted.network}`,\n };\n }\n\n // Parse payload\n const polkadotPayload = payload.payload as unknown as ExactDirectPolkadotPayload;\n\n // Validate required fields\n if (!polkadotPayload.extrinsicHash && !polkadotPayload.blockHash) {\n return {\n isValid: false,\n invalidReason: \"missing_extrinsic_identifier: need extrinsicHash or blockHash\",\n };\n }\n\n // Validate extrinsic hash format if provided\n if (polkadotPayload.extrinsicHash && !isValidExtrinsicHash(polkadotPayload.extrinsicHash)) {\n return {\n isValid: false,\n invalidReason: \"invalid_extrinsic_hash_format\",\n };\n }\n\n // Validate block hash format if provided\n if (polkadotPayload.blockHash && !isValidBlockHash(polkadotPayload.blockHash)) {\n return {\n isValid: false,\n invalidReason: \"invalid_block_hash_format\",\n };\n }\n\n if (!polkadotPayload.from) {\n return {\n isValid: false,\n invalidReason: \"missing_from_address\",\n };\n }\n\n // Build unique identifier for replay protection\n const extrinsicId = polkadotPayload.extrinsicHash ||\n buildExtrinsicId(polkadotPayload.blockHash, polkadotPayload.extrinsicIndex);\n\n // Check for replay attack\n if (this.isExtrinsicUsed(extrinsicId)) {\n return {\n isValid: false,\n invalidReason: \"extrinsic_already_used\",\n payer: polkadotPayload.from,\n };\n }\n\n // Query extrinsic\n const extrinsicResult = await this.signer.queryExtrinsic(\n polkadotPayload.extrinsicHash,\n polkadotPayload.blockHash,\n polkadotPayload.extrinsicIndex,\n );\n\n if (!extrinsicResult) {\n return {\n isValid: false,\n invalidReason: \"extrinsic_not_found\",\n payer: polkadotPayload.from,\n };\n }\n\n // Verify extrinsic was successful\n if (!extrinsicResult.success) {\n return {\n isValid: false,\n invalidReason: \"extrinsic_failed\",\n payer: polkadotPayload.from,\n };\n }\n\n // Check extrinsic age\n if (this.config.maxExtrinsicAge > 0) {\n const extrinsicTime = new Date(extrinsicResult.timestamp).getTime();\n const age = (Date.now() - extrinsicTime) / 1000;\n if (age > this.config.maxExtrinsicAge) {\n return {\n isValid: false,\n invalidReason: `extrinsic_too_old: ${Math.round(age)} seconds`,\n payer: polkadotPayload.from,\n };\n }\n }\n\n // Extract transfer details\n const transfer =\n extractAssetTransfer(extrinsicResult) ||\n extractAssetTransferFromEvents(extrinsicResult);\n\n if (!transfer) {\n return {\n isValid: false,\n invalidReason: \"not_asset_transfer\",\n payer: polkadotPayload.from,\n };\n }\n\n // Verify asset ID\n const expectedAssetId = (requirements.extra?.assetId as number) ?? polkadotPayload.assetId;\n if (transfer.assetId !== expectedAssetId) {\n return {\n isValid: false,\n invalidReason: `asset_mismatch: expected ${expectedAssetId}, got ${transfer.assetId}`,\n payer: polkadotPayload.from,\n };\n }\n\n // Verify recipient\n if (!compareAddresses(transfer.to, requirements.payTo)) {\n return {\n isValid: false,\n invalidReason: `recipient_mismatch: expected ${requirements.payTo}, got ${transfer.to}`,\n payer: polkadotPayload.from,\n };\n }\n\n // Verify amount\n const txAmount = BigInt(transfer.amount);\n const requiredAmount = BigInt(requirements.amount);\n if (txAmount < requiredAmount) {\n return {\n isValid: false,\n invalidReason: `insufficient_amount: expected ${requirements.amount}, got ${transfer.amount}`,\n payer: polkadotPayload.from,\n };\n }\n\n // Mark extrinsic as used\n this.markExtrinsicUsed(extrinsicId);\n\n return {\n isValid: true,\n payer: polkadotPayload.from,\n };\n }\n\n /**\n * Settle a payment (for exact-direct, the transfer is already complete)\n */\n async settle(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n ): Promise<SettleResponse> {\n // Verify first\n const verifyResult = await this.verify(payload, requirements);\n\n if (!verifyResult.isValid) {\n return {\n success: false,\n errorReason: verifyResult.invalidReason || \"verification_failed\",\n payer: verifyResult.payer,\n transaction: \"\",\n network: requirements.network,\n };\n }\n\n const polkadotPayload = payload.payload as unknown as ExactDirectPolkadotPayload;\n\n // For exact-direct, settlement is already complete\n return {\n success: true,\n transaction: polkadotPayload.extrinsicHash ||\n buildExtrinsicId(polkadotPayload.blockHash, polkadotPayload.extrinsicIndex),\n network: requirements.network,\n payer: verifyResult.payer,\n };\n }\n\n /**\n * Check if an extrinsic has been used\n */\n private isExtrinsicUsed(extrinsicId: string): boolean {\n return this.usedExtrinsics.has(extrinsicId);\n }\n\n /**\n * Mark an extrinsic as used\n */\n private markExtrinsicUsed(extrinsicId: string): void {\n this.usedExtrinsics.set(extrinsicId, Date.now());\n }\n\n /**\n * Start the cleanup interval for used extrinsics cache\n */\n private startCleanupInterval(): void {\n setInterval(() => {\n const cutoff = Date.now() - this.config.usedExtrinsicCacheDuration;\n for (const [extrinsicId, timestamp] of this.usedExtrinsics) {\n if (timestamp < cutoff) {\n this.usedExtrinsics.delete(extrinsicId);\n }\n }\n }, 60 * 60 * 1000); // Run every hour\n }\n}\n\n/**\n * Create an exact-direct facilitator for Polkadot\n */\nexport function createExactDirectPolkadotFacilitator(\n signer: FacilitatorPolkadotSigner,\n config: PolkadotFacilitatorConfig = {},\n): ExactDirectPolkadotFacilitator {\n return new ExactDirectPolkadotFacilitator(signer, config);\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,109 +1,20 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
var DEFAULT_KUSAMA_RPC = "wss://kusama-asset-hub-rpc.polkadot.io";
|
|
12
|
-
var DEFAULT_WESTEND_RPC = "wss://westend-asset-hub-rpc.polkadot.io";
|
|
13
|
-
var POLKADOT_NETWORKS = {
|
|
14
|
-
[POLKADOT_ASSET_HUB_CAIP2]: {
|
|
15
|
-
name: "Polkadot Asset Hub",
|
|
16
|
-
caip2: POLKADOT_ASSET_HUB_CAIP2,
|
|
17
|
-
rpcUrl: DEFAULT_POLKADOT_RPC,
|
|
18
|
-
indexerUrl: DEFAULT_POLKADOT_INDEXER,
|
|
19
|
-
genesisHash: "0x68d56f15f85d3136970ec16946040bc1752654e906147f7e43e9d539d7c3de2f",
|
|
20
|
-
ss58Prefix: 0,
|
|
21
|
-
// Polkadot
|
|
22
|
-
isTestnet: false
|
|
23
|
-
},
|
|
24
|
-
[KUSAMA_ASSET_HUB_CAIP2]: {
|
|
25
|
-
name: "Kusama Asset Hub",
|
|
26
|
-
caip2: KUSAMA_ASSET_HUB_CAIP2,
|
|
27
|
-
rpcUrl: DEFAULT_KUSAMA_RPC,
|
|
28
|
-
indexerUrl: DEFAULT_KUSAMA_INDEXER,
|
|
29
|
-
genesisHash: "0x48239ef607d7928874027a43a67689209727dfb3d3dc5e5b03a39bdc2eda771a",
|
|
30
|
-
ss58Prefix: 2,
|
|
31
|
-
// Kusama
|
|
32
|
-
isTestnet: false
|
|
33
|
-
},
|
|
34
|
-
[WESTEND_ASSET_HUB_CAIP2]: {
|
|
35
|
-
name: "Westend Asset Hub",
|
|
36
|
-
caip2: WESTEND_ASSET_HUB_CAIP2,
|
|
37
|
-
rpcUrl: DEFAULT_WESTEND_RPC,
|
|
38
|
-
indexerUrl: DEFAULT_WESTEND_INDEXER,
|
|
39
|
-
genesisHash: "0xe143f23803ac50e8f6f8e62695d1ce9e4e1d68aa36c1cd2cfd15340213f3423e",
|
|
40
|
-
ss58Prefix: 42,
|
|
41
|
-
// Generic Substrate
|
|
42
|
-
isTestnet: true
|
|
43
|
-
}
|
|
44
|
-
};
|
|
45
|
-
function isPolkadotNetwork(network) {
|
|
46
|
-
return network.startsWith(`${POLKADOT_CAIP2_NAMESPACE}:`);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
// src/tokens.ts
|
|
50
|
-
var USDT_POLKADOT = {
|
|
51
|
-
assetId: 1984,
|
|
52
|
-
symbol: "USDT",
|
|
53
|
-
name: "Tether USD",
|
|
54
|
-
decimals: 6,
|
|
55
|
-
issuer: "Tether"
|
|
56
|
-
};
|
|
57
|
-
var USDT_KUSAMA = {
|
|
58
|
-
assetId: 1984,
|
|
59
|
-
symbol: "USDT",
|
|
60
|
-
name: "Tether USD",
|
|
61
|
-
decimals: 6,
|
|
62
|
-
issuer: "Tether"
|
|
63
|
-
};
|
|
64
|
-
var USDT_WESTEND = {
|
|
65
|
-
assetId: 1984,
|
|
66
|
-
symbol: "USDT",
|
|
67
|
-
name: "Test Tether USD",
|
|
68
|
-
decimals: 6
|
|
69
|
-
};
|
|
70
|
-
var TOKEN_REGISTRY = {
|
|
71
|
-
[POLKADOT_ASSET_HUB_CAIP2]: {
|
|
72
|
-
USDT: USDT_POLKADOT
|
|
73
|
-
},
|
|
74
|
-
[KUSAMA_ASSET_HUB_CAIP2]: {
|
|
75
|
-
USDT: USDT_KUSAMA
|
|
76
|
-
},
|
|
77
|
-
[WESTEND_ASSET_HUB_CAIP2]: {
|
|
78
|
-
USDT: USDT_WESTEND
|
|
79
|
-
}
|
|
80
|
-
};
|
|
81
|
-
var DEFAULT_TOKENS = {
|
|
82
|
-
[POLKADOT_ASSET_HUB_CAIP2]: USDT_POLKADOT,
|
|
83
|
-
[KUSAMA_ASSET_HUB_CAIP2]: USDT_KUSAMA,
|
|
84
|
-
[WESTEND_ASSET_HUB_CAIP2]: USDT_WESTEND
|
|
85
|
-
};
|
|
86
|
-
function getTokenConfig(network, symbol = "USDT") {
|
|
87
|
-
return TOKEN_REGISTRY[network]?.[symbol];
|
|
88
|
-
}
|
|
89
|
-
function getDefaultToken(network) {
|
|
90
|
-
return DEFAULT_TOKENS[network];
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
// src/utils.ts
|
|
94
|
-
function parseAmount(amount, decimals) {
|
|
95
|
-
const parts = amount.split(".");
|
|
96
|
-
const wholePart = parts[0] || "0";
|
|
97
|
-
const fractionalPart = (parts[1] || "").padEnd(decimals, "0").slice(0, decimals);
|
|
98
|
-
return BigInt(wholePart + fractionalPart).toString();
|
|
99
|
-
}
|
|
1
|
+
import {
|
|
2
|
+
POLKADOT_CAIP2_NAMESPACE,
|
|
3
|
+
SCHEME_EXACT_DIRECT,
|
|
4
|
+
TOKEN_REGISTRY,
|
|
5
|
+
__publicField,
|
|
6
|
+
getDefaultToken,
|
|
7
|
+
getTokenConfig,
|
|
8
|
+
isPolkadotNetwork,
|
|
9
|
+
parseAmount
|
|
10
|
+
} from "../../chunk-BEDKJN2Y.mjs";
|
|
100
11
|
|
|
101
12
|
// src/exact-direct/server/scheme.ts
|
|
102
13
|
var ExactDirectPolkadotServer = class {
|
|
103
|
-
scheme = SCHEME_EXACT_DIRECT;
|
|
104
|
-
moneyParsers = [];
|
|
105
|
-
config;
|
|
106
14
|
constructor(config = {}) {
|
|
15
|
+
__publicField(this, "scheme", SCHEME_EXACT_DIRECT);
|
|
16
|
+
__publicField(this, "moneyParsers", []);
|
|
17
|
+
__publicField(this, "config");
|
|
107
18
|
this.config = config;
|
|
108
19
|
}
|
|
109
20
|
/**
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/exact-direct/server/scheme.ts","../../../../src/exact-direct/server/register.ts"],"sourcesContent":["/**\n * Polkadot Exact-Direct Server Scheme\n *\n * Handles price parsing and payment requirement enhancement for\n * Polkadot Asset Hub payments using the exact-direct scheme.\n */\n\nimport type {\n SchemeNetworkServer,\n PaymentRequirements,\n Price,\n AssetAmount,\n Network,\n MoneyParser,\n} from \"@t402/core/types\";\nimport { SCHEME_EXACT_DIRECT, isPolkadotNetwork } from \"../../constants.js\";\nimport { getDefaultToken, getTokenConfig, TOKEN_REGISTRY } from \"../../tokens.js\";\nimport { parseAmount } from \"../../utils.js\";\n\n/**\n * Configuration for ExactDirectPolkadotServer\n */\nexport interface ExactDirectPolkadotServerConfig {\n /** Preferred token symbol (e.g., \"USDT\"). Defaults to network's default token. */\n preferredToken?: string;\n}\n\n/**\n * Polkadot Exact-Direct Server\n *\n * Implements the server-side price parsing and payment requirements enhancement.\n */\nexport class ExactDirectPolkadotServer implements SchemeNetworkServer {\n readonly scheme = SCHEME_EXACT_DIRECT;\n private moneyParsers: MoneyParser[] = [];\n private config: ExactDirectPolkadotServerConfig;\n\n constructor(config: ExactDirectPolkadotServerConfig = {}) {\n this.config = config;\n }\n\n /**\n * Register a custom money parser in the parser chain.\n */\n registerMoneyParser(parser: MoneyParser): ExactDirectPolkadotServer {\n this.moneyParsers.push(parser);\n return this;\n }\n\n /**\n * Parse price into Polkadot-specific amount\n */\n async parsePrice(price: Price, network: Network): Promise<AssetAmount> {\n // Validate network\n if (!isPolkadotNetwork(network)) {\n throw new Error(`Invalid Polkadot network: ${network}`);\n }\n\n // If already an AssetAmount, return it directly\n if (typeof price === \"object\" && price !== null && \"amount\" in price) {\n if (!price.asset) {\n throw new Error(`Asset must be specified for AssetAmount on network ${network}`);\n }\n return {\n amount: price.amount,\n asset: price.asset,\n extra: price.extra || {},\n };\n }\n\n // Parse Money to decimal number\n const amount = this.parseMoneyToDecimal(price);\n\n // Try each custom money parser in order\n for (const parser of this.moneyParsers) {\n const result = await parser(amount, network);\n if (result !== null) {\n return result;\n }\n }\n\n // All custom parsers returned null, use default conversion\n return this.defaultMoneyConversion(amount, network);\n }\n\n /**\n * Enhance payment requirements with Polkadot-specific details\n */\n async enhancePaymentRequirements(\n paymentRequirements: PaymentRequirements,\n supportedKind: {\n t402Version: number;\n scheme: string;\n network: Network;\n extra?: Record<string, unknown>;\n },\n facilitatorExtensions: string[],\n ): Promise<PaymentRequirements> {\n // Mark unused parameters\n void facilitatorExtensions;\n\n // Start with existing extra fields\n const extra = { ...paymentRequirements.extra };\n\n // Add any facilitator-provided extra fields\n if (supportedKind.extra?.assetId) {\n extra.assetId = supportedKind.extra.assetId;\n }\n if (supportedKind.extra?.assetSymbol) {\n extra.assetSymbol = supportedKind.extra.assetSymbol;\n }\n if (supportedKind.extra?.assetDecimals) {\n extra.assetDecimals = supportedKind.extra.assetDecimals;\n }\n if (supportedKind.extra?.networkName) {\n extra.networkName = supportedKind.extra.networkName;\n }\n\n return {\n ...paymentRequirements,\n extra,\n };\n }\n\n /**\n * Parse Money (string | number) to a decimal number.\n */\n private parseMoneyToDecimal(money: string | number): number {\n if (typeof money === \"number\") {\n return money;\n }\n\n // Remove $ sign and whitespace, then parse\n const cleanMoney = money.replace(/^\\$/, \"\").trim();\n const amount = parseFloat(cleanMoney);\n\n if (isNaN(amount)) {\n throw new Error(`Invalid money format: ${money}`);\n }\n\n return amount;\n }\n\n /**\n * Default money conversion implementation.\n */\n private defaultMoneyConversion(amount: number, network: Network): AssetAmount {\n const token = this.getDefaultAsset(network);\n\n // Convert decimal amount to token amount\n const tokenAmount = parseAmount(amount.toString(), token.decimals);\n\n return {\n amount: tokenAmount.toString(),\n asset: this.createAssetIdentifier(network, token.assetId),\n extra: {\n symbol: token.symbol,\n name: token.name,\n decimals: token.decimals,\n assetId: token.assetId,\n },\n };\n }\n\n /**\n * Create a CAIP-19 asset identifier for Polkadot assets\n */\n private createAssetIdentifier(\n network: Network,\n assetId: number,\n ): string {\n return `${network}/asset:${assetId}`;\n }\n\n /**\n * Get the default asset info for a network.\n */\n private getDefaultAsset(\n network: Network,\n ): { assetId: number; symbol: string; name: string; decimals: number } {\n // If a preferred token is configured, try to use it\n if (this.config.preferredToken) {\n const preferred = getTokenConfig(network, this.config.preferredToken);\n if (preferred) return preferred;\n }\n\n // Use the network's default token\n const defaultToken = getDefaultToken(network);\n if (defaultToken) return defaultToken;\n\n throw new Error(`No tokens configured for network ${network}`);\n }\n\n /**\n * Get all supported networks\n */\n static getSupportedNetworks(): string[] {\n return Object.keys(TOKEN_REGISTRY);\n }\n\n /**\n * Check if a network is supported\n */\n static isNetworkSupported(network: string): boolean {\n return network in TOKEN_REGISTRY;\n }\n}\n\n/**\n * Create an exact-direct server for Polkadot\n */\nexport function createExactDirectPolkadotServer(\n config: ExactDirectPolkadotServerConfig = {},\n): ExactDirectPolkadotServer {\n return new ExactDirectPolkadotServer(config);\n}\n","/**\n * Registration function for Polkadot exact-direct server\n */\n\nimport { t402ResourceServer } from \"@t402/core/server\";\nimport type { Network } from \"@t402/core/types\";\nimport { POLKADOT_CAIP2_NAMESPACE } from \"../../constants.js\";\nimport { ExactDirectPolkadotServer, type ExactDirectPolkadotServerConfig } from \"./scheme.js\";\n\n/**\n * Configuration for registering Polkadot server schemes\n */\nexport interface PolkadotServerRegistrationConfig extends ExactDirectPolkadotServerConfig {\n /**\n * Optional specific networks to register\n * If not provided, registers wildcard support (polkadot:*)\n */\n networks?: Network[];\n}\n\n/**\n * Registers Polkadot exact-direct payment scheme to a t402ResourceServer instance.\n *\n * @param server - The t402ResourceServer instance to register schemes to\n * @param config - Configuration for Polkadot server registration\n * @returns The server instance for chaining\n *\n * @example\n * ```typescript\n * import { registerExactDirectPolkadotServer } from \"@t402/polkadot/exact-direct/server\";\n * import { t402ResourceServer } from \"@t402/core/server\";\n *\n * const server = new t402ResourceServer();\n * registerExactDirectPolkadotServer(server, {\n * networks: [\"polkadot:68d56f15f85d3136970ec16946040bc1\"]\n * });\n * ```\n */\nexport function registerExactDirectPolkadotServer(\n server: t402ResourceServer,\n config: PolkadotServerRegistrationConfig = {},\n): t402ResourceServer {\n const scheme = new ExactDirectPolkadotServer(config);\n\n // Register scheme\n if (config.networks && config.networks.length > 0) {\n // Register specific networks\n config.networks.forEach((network) => {\n server.register(network, scheme);\n });\n } else {\n // Register wildcard for all Polkadot networks\n server.register(`${POLKADOT_CAIP2_NAMESPACE}:*`, scheme);\n }\n\n return server;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { P as PolkadotExtrinsicResult, a as ParsedAssetTransfer } from './types-
|
|
2
|
-
export { C as ClientPolkadotSigner, E as ExactDirectPolkadotPayload, F as FacilitatorPolkadotSigner, b as PolkadotEvent,
|
|
1
|
+
import { P as PolkadotExtrinsicResult, a as ParsedAssetTransfer } from './types-Bb84eJ4_.mjs';
|
|
2
|
+
export { C as ClientPolkadotSigner, E as ExactDirectPolkadotPayload, F as FacilitatorPolkadotSigner, b as PolkadotEvent, c as PolkadotFacilitatorConfig, d as PolkadotServerConfig } from './types-Bb84eJ4_.mjs';
|
|
3
3
|
import '@t402/core/types';
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DEFAULT_KUSAMA_INDEXER,
|
|
3
|
+
DEFAULT_KUSAMA_RPC,
|
|
4
|
+
DEFAULT_POLKADOT_INDEXER,
|
|
5
|
+
DEFAULT_POLKADOT_RPC,
|
|
6
|
+
DEFAULT_TOKENS,
|
|
7
|
+
DEFAULT_WESTEND_INDEXER,
|
|
8
|
+
DEFAULT_WESTEND_RPC,
|
|
9
|
+
KUSAMA_ASSET_HUB_CAIP2,
|
|
10
|
+
POLKADOT_ASSET_HUB_CAIP2,
|
|
11
|
+
POLKADOT_CAIP2_NAMESPACE,
|
|
12
|
+
POLKADOT_NETWORKS,
|
|
13
|
+
SCHEME_EXACT_DIRECT,
|
|
14
|
+
TOKEN_REGISTRY,
|
|
15
|
+
USDT_KUSAMA,
|
|
16
|
+
USDT_POLKADOT,
|
|
17
|
+
USDT_WESTEND,
|
|
18
|
+
WESTEND_ASSET_HUB_CAIP2,
|
|
19
|
+
buildExtrinsicId,
|
|
20
|
+
compareAddresses,
|
|
21
|
+
extractAssetTransfer,
|
|
22
|
+
extractAssetTransferFromEvents,
|
|
23
|
+
formatAmount,
|
|
24
|
+
getAssetId,
|
|
25
|
+
getDefaultToken,
|
|
26
|
+
getNetworkConfig,
|
|
27
|
+
getTokenConfig,
|
|
28
|
+
isPolkadotNetwork,
|
|
29
|
+
isValidAddress,
|
|
30
|
+
isValidBlockHash,
|
|
31
|
+
isValidExtrinsicHash,
|
|
32
|
+
parseAmount,
|
|
33
|
+
parseExtrinsicId
|
|
34
|
+
} from "./chunk-BEDKJN2Y.mjs";
|
|
35
|
+
export {
|
|
36
|
+
DEFAULT_KUSAMA_INDEXER,
|
|
37
|
+
DEFAULT_KUSAMA_RPC,
|
|
38
|
+
DEFAULT_POLKADOT_INDEXER,
|
|
39
|
+
DEFAULT_POLKADOT_RPC,
|
|
40
|
+
DEFAULT_TOKENS,
|
|
41
|
+
DEFAULT_WESTEND_INDEXER,
|
|
42
|
+
DEFAULT_WESTEND_RPC,
|
|
43
|
+
KUSAMA_ASSET_HUB_CAIP2,
|
|
44
|
+
POLKADOT_ASSET_HUB_CAIP2,
|
|
45
|
+
POLKADOT_CAIP2_NAMESPACE,
|
|
46
|
+
POLKADOT_NETWORKS,
|
|
47
|
+
SCHEME_EXACT_DIRECT,
|
|
48
|
+
TOKEN_REGISTRY,
|
|
49
|
+
USDT_KUSAMA,
|
|
50
|
+
USDT_POLKADOT,
|
|
51
|
+
USDT_WESTEND,
|
|
52
|
+
WESTEND_ASSET_HUB_CAIP2,
|
|
53
|
+
buildExtrinsicId,
|
|
54
|
+
compareAddresses,
|
|
55
|
+
extractAssetTransfer,
|
|
56
|
+
extractAssetTransferFromEvents,
|
|
57
|
+
formatAmount,
|
|
58
|
+
getAssetId,
|
|
59
|
+
getDefaultToken,
|
|
60
|
+
getNetworkConfig,
|
|
61
|
+
getTokenConfig,
|
|
62
|
+
isPolkadotNetwork,
|
|
63
|
+
isValidAddress,
|
|
64
|
+
isValidBlockHash,
|
|
65
|
+
isValidExtrinsicHash,
|
|
66
|
+
parseAmount,
|
|
67
|
+
parseExtrinsicId
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -132,4 +132,4 @@ interface PolkadotFacilitatorConfig {
|
|
|
132
132
|
usedExtrinsicCacheDuration?: number;
|
|
133
133
|
}
|
|
134
134
|
|
|
135
|
-
export type { ClientPolkadotSigner as C, ExactDirectPolkadotPayload as E, FacilitatorPolkadotSigner as F, PolkadotExtrinsicResult as P, ParsedAssetTransfer as a, PolkadotEvent as b,
|
|
135
|
+
export type { ClientPolkadotSigner as C, ExactDirectPolkadotPayload as E, FacilitatorPolkadotSigner as F, PolkadotExtrinsicResult as P, ParsedAssetTransfer as a, PolkadotEvent as b, PolkadotFacilitatorConfig as c, PolkadotServerConfig as d };
|
package/package.json
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@t402/polkadot",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.5.0",
|
|
4
4
|
"description": "T402 Polkadot Asset Hub mechanism - USDT payments on Polkadot",
|
|
5
|
-
"
|
|
6
|
-
"main": "./dist/cjs/index.cjs",
|
|
5
|
+
"main": "./dist/cjs/index.js",
|
|
7
6
|
"module": "./dist/esm/index.mjs",
|
|
8
7
|
"types": "./dist/esm/index.d.mts",
|
|
9
8
|
"exports": {
|
|
@@ -13,8 +12,8 @@
|
|
|
13
12
|
"default": "./dist/esm/index.mjs"
|
|
14
13
|
},
|
|
15
14
|
"require": {
|
|
16
|
-
"types": "./dist/cjs/index.d.
|
|
17
|
-
"default": "./dist/cjs/index.
|
|
15
|
+
"types": "./dist/cjs/index.d.ts",
|
|
16
|
+
"default": "./dist/cjs/index.js"
|
|
18
17
|
}
|
|
19
18
|
},
|
|
20
19
|
"./exact-direct/client": {
|
|
@@ -23,8 +22,8 @@
|
|
|
23
22
|
"default": "./dist/esm/exact-direct/client/index.mjs"
|
|
24
23
|
},
|
|
25
24
|
"require": {
|
|
26
|
-
"types": "./dist/cjs/exact-direct/client/index.d.
|
|
27
|
-
"default": "./dist/cjs/exact-direct/client/index.
|
|
25
|
+
"types": "./dist/cjs/exact-direct/client/index.d.ts",
|
|
26
|
+
"default": "./dist/cjs/exact-direct/client/index.js"
|
|
28
27
|
}
|
|
29
28
|
},
|
|
30
29
|
"./exact-direct/server": {
|
|
@@ -33,8 +32,8 @@
|
|
|
33
32
|
"default": "./dist/esm/exact-direct/server/index.mjs"
|
|
34
33
|
},
|
|
35
34
|
"require": {
|
|
36
|
-
"types": "./dist/cjs/exact-direct/server/index.d.
|
|
37
|
-
"default": "./dist/cjs/exact-direct/server/index.
|
|
35
|
+
"types": "./dist/cjs/exact-direct/server/index.d.ts",
|
|
36
|
+
"default": "./dist/cjs/exact-direct/server/index.js"
|
|
38
37
|
}
|
|
39
38
|
},
|
|
40
39
|
"./exact-direct/facilitator": {
|
|
@@ -43,8 +42,8 @@
|
|
|
43
42
|
"default": "./dist/esm/exact-direct/facilitator/index.mjs"
|
|
44
43
|
},
|
|
45
44
|
"require": {
|
|
46
|
-
"types": "./dist/cjs/exact-direct/facilitator/index.d.
|
|
47
|
-
"default": "./dist/cjs/exact-direct/facilitator/index.
|
|
45
|
+
"types": "./dist/cjs/exact-direct/facilitator/index.d.ts",
|
|
46
|
+
"default": "./dist/cjs/exact-direct/facilitator/index.js"
|
|
48
47
|
}
|
|
49
48
|
}
|
|
50
49
|
},
|
|
@@ -53,7 +52,7 @@
|
|
|
53
52
|
"src"
|
|
54
53
|
],
|
|
55
54
|
"dependencies": {
|
|
56
|
-
"@t402/core": "2.
|
|
55
|
+
"@t402/core": "2.5.0"
|
|
57
56
|
},
|
|
58
57
|
"peerDependencies": {
|
|
59
58
|
"@polkadot/api": ">=12.0.0"
|
|
@@ -65,10 +64,10 @@
|
|
|
65
64
|
},
|
|
66
65
|
"devDependencies": {
|
|
67
66
|
"@polkadot/api": "^14.0.0",
|
|
68
|
-
"@types/node": "^
|
|
67
|
+
"@types/node": "^25.2.2",
|
|
69
68
|
"@vitest/coverage-v8": "^3.2.4",
|
|
70
|
-
"tsup": "^8.
|
|
71
|
-
"typescript": "^5.
|
|
69
|
+
"tsup": "^8.5.1",
|
|
70
|
+
"typescript": "^5.9.3",
|
|
72
71
|
"vitest": "^3.2.4"
|
|
73
72
|
},
|
|
74
73
|
"keywords": [
|
|
@@ -81,11 +80,11 @@
|
|
|
81
80
|
"web3"
|
|
82
81
|
],
|
|
83
82
|
"author": "T402 Team",
|
|
84
|
-
"license": "
|
|
83
|
+
"license": "Apache-2.0",
|
|
85
84
|
"repository": {
|
|
86
85
|
"type": "git",
|
|
87
86
|
"url": "https://github.com/t402-io/t402.git",
|
|
88
|
-
"directory": "typescript/packages/mechanisms/polkadot"
|
|
87
|
+
"directory": "sdks/typescript/packages/mechanisms/polkadot"
|
|
89
88
|
},
|
|
90
89
|
"bugs": {
|
|
91
90
|
"url": "https://github.com/t402-io/t402/issues"
|