@bankofai/x402 0.4.2 → 0.5.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/signers/evmSigner.d.ts +19 -3
- package/dist/signers/evmSigner.d.ts.map +1 -1
- package/dist/signers/evmSigner.js +59 -34
- package/dist/signers/evmSigner.js.map +1 -1
- package/dist/signers/index.d.ts +2 -1
- package/dist/signers/index.d.ts.map +1 -1
- package/dist/signers/index.js +1 -1
- package/dist/signers/index.js.map +1 -1
- package/dist/signers/signer.d.ts +31 -4
- package/dist/signers/signer.d.ts.map +1 -1
- package/dist/signers/signer.js +54 -28
- package/dist/signers/signer.js.map +1 -1
- package/dist/wallet/index.d.ts +8 -0
- package/dist/wallet/index.d.ts.map +1 -0
- package/dist/wallet/index.js +8 -0
- package/dist/wallet/index.js.map +1 -0
- package/package.json +8 -8
- package/dist/mechanisms/gasfree.d.ts +0 -8
- package/dist/mechanisms/gasfree.d.ts.map +0 -1
- package/dist/mechanisms/gasfree.js +0 -125
- package/dist/mechanisms/gasfree.js.map +0 -1
|
@@ -3,11 +3,27 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { type Hex } from 'viem';
|
|
5
5
|
import type { ClientSigner } from '../client/x402Client.js';
|
|
6
|
+
import type { AgentWallet } from './signer.js';
|
|
7
|
+
/**
|
|
8
|
+
* EVM client signer implementation.
|
|
9
|
+
*
|
|
10
|
+
* Accepts any wallet conforming to the AgentWallet interface.
|
|
11
|
+
* The signer is agnostic about how the wallet was created
|
|
12
|
+
* (private key, hosted, etc.).
|
|
13
|
+
*/
|
|
6
14
|
export declare class EvmClientSigner implements ClientSigner {
|
|
7
|
-
private
|
|
15
|
+
private wallet;
|
|
16
|
+
private _address;
|
|
8
17
|
private publicClients;
|
|
9
|
-
|
|
10
|
-
|
|
18
|
+
/**
|
|
19
|
+
* Create signer from a wallet and its pre-resolved address.
|
|
20
|
+
*
|
|
21
|
+
* Prefer the async factory `EvmClientSigner.create()` which resolves
|
|
22
|
+
* the address automatically.
|
|
23
|
+
*/
|
|
24
|
+
constructor(wallet: AgentWallet, address: string);
|
|
25
|
+
/** Async factory: resolve address from wallet and create signer. */
|
|
26
|
+
static create(wallet: AgentWallet): Promise<EvmClientSigner>;
|
|
11
27
|
getAddress(): string;
|
|
12
28
|
getEvmAddress(): Hex;
|
|
13
29
|
signMessage(message: Uint8Array): Promise<string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evmSigner.d.ts","sourceRoot":"","sources":["../../src/signers/evmSigner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"evmSigner.d.ts","sourceRoot":"","sources":["../../src/signers/evmSigner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAIL,KAAK,GAAG,EAIT,MAAM,MAAM,CAAC;AAEd,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAQ5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAQ/C;;;;;;GAMG;AACH,qBAAa,eAAgB,YAAW,YAAY;IAClD,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,aAAa,CAAwC;IAE7D;;;;;OAKG;gBACS,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM;IAKhD,oEAAoE;WACvD,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC;IAKlE,UAAU,IAAI,MAAM;IAIpB,aAAa,IAAI,GAAG;IAId,WAAW,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAIjD,aAAa,CACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC;IAWZ,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAmB/E,cAAc,CAClB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC;IAqBZ,eAAe,CACnB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,MAAM,GAAG,aAAa,GAAG,MAAe,GAC7C,OAAO,CAAC,OAAO,CAAC;IAmEnB,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,QAAQ;IAehB,OAAO,CAAC,qBAAqB;CAY9B"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* EvmClientSigner - EVM client signer for x402 protocol
|
|
3
3
|
*/
|
|
4
|
-
import {
|
|
5
|
-
import { privateKeyToAccount } from 'viem/accounts';
|
|
4
|
+
import { createPublicClient, http, parseAbi, encodeFunctionData, } from 'viem';
|
|
6
5
|
import { mainnet, sepolia, bsc, bscTestnet } from 'viem/chains';
|
|
7
6
|
import { getPaymentPermitAddress, resolveRpcUrl, InsufficientAllowanceError, UnsupportedNetworkError, } from '../index.js';
|
|
8
7
|
const ERC20_ABI = parseAbi([
|
|
@@ -10,48 +9,59 @@ const ERC20_ABI = parseAbi([
|
|
|
10
9
|
'function approve(address spender, uint256 amount) returns (bool)',
|
|
11
10
|
'function balanceOf(address account) view returns (uint256)',
|
|
12
11
|
]);
|
|
12
|
+
/**
|
|
13
|
+
* EVM client signer implementation.
|
|
14
|
+
*
|
|
15
|
+
* Accepts any wallet conforming to the AgentWallet interface.
|
|
16
|
+
* The signer is agnostic about how the wallet was created
|
|
17
|
+
* (private key, hosted, etc.).
|
|
18
|
+
*/
|
|
13
19
|
export class EvmClientSigner {
|
|
14
|
-
|
|
20
|
+
wallet;
|
|
21
|
+
_address;
|
|
15
22
|
publicClients = new Map();
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
/**
|
|
24
|
+
* Create signer from a wallet and its pre-resolved address.
|
|
25
|
+
*
|
|
26
|
+
* Prefer the async factory `EvmClientSigner.create()` which resolves
|
|
27
|
+
* the address automatically.
|
|
28
|
+
*/
|
|
29
|
+
constructor(wallet, address) {
|
|
30
|
+
this.wallet = wallet;
|
|
31
|
+
this._address = address;
|
|
32
|
+
}
|
|
33
|
+
/** Async factory: resolve address from wallet and create signer. */
|
|
34
|
+
static async create(wallet) {
|
|
35
|
+
const address = await wallet.getAddress();
|
|
36
|
+
return new EvmClientSigner(wallet, address);
|
|
25
37
|
}
|
|
26
38
|
getAddress() {
|
|
27
|
-
return this.
|
|
39
|
+
return this._address;
|
|
28
40
|
}
|
|
29
41
|
getEvmAddress() {
|
|
30
|
-
return this.
|
|
42
|
+
return this._address;
|
|
31
43
|
}
|
|
32
44
|
async signMessage(message) {
|
|
33
|
-
return this.
|
|
34
|
-
message: { raw: message },
|
|
35
|
-
});
|
|
45
|
+
return this.wallet.signMessage(message);
|
|
36
46
|
}
|
|
37
47
|
async signTypedData(domain, types, message, primaryType) {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
48
|
+
const fullData = {
|
|
49
|
+
types: { EIP712Domain: [], ...types },
|
|
50
|
+
domain,
|
|
41
51
|
primaryType,
|
|
42
|
-
message
|
|
43
|
-
}
|
|
52
|
+
message,
|
|
53
|
+
};
|
|
54
|
+
return this.wallet.signTypedData(fullData);
|
|
44
55
|
}
|
|
45
56
|
async checkBalance(token, network, address) {
|
|
46
57
|
const chainId = this.parseNetworkToChainId(network);
|
|
47
58
|
const client = this.getPublicClient(chainId, network);
|
|
48
|
-
const targetAddress = (address || this.account.address);
|
|
49
59
|
try {
|
|
50
60
|
return await client.readContract({
|
|
51
61
|
address: token,
|
|
52
62
|
abi: ERC20_ABI,
|
|
53
63
|
functionName: 'balanceOf',
|
|
54
|
-
args: [
|
|
64
|
+
args: [(address ?? this._address)],
|
|
55
65
|
});
|
|
56
66
|
}
|
|
57
67
|
catch (error) {
|
|
@@ -68,7 +78,7 @@ export class EvmClientSigner {
|
|
|
68
78
|
address: token,
|
|
69
79
|
abi: ERC20_ABI,
|
|
70
80
|
functionName: 'allowance',
|
|
71
|
-
args: [this.
|
|
81
|
+
args: [this._address, spender],
|
|
72
82
|
});
|
|
73
83
|
}
|
|
74
84
|
catch (error) {
|
|
@@ -88,20 +98,35 @@ export class EvmClientSigner {
|
|
|
88
98
|
const chainId = this.parseNetworkToChainId(network);
|
|
89
99
|
const client = this.getPublicClient(chainId, network);
|
|
90
100
|
const spender = getPaymentPermitAddress(network);
|
|
91
|
-
const chain = this.getChain(chainId);
|
|
92
101
|
try {
|
|
93
|
-
|
|
94
|
-
const
|
|
95
|
-
account: this.account,
|
|
96
|
-
chain: chain,
|
|
97
|
-
transport: http(rpcUrl),
|
|
98
|
-
});
|
|
99
|
-
const hash = await walletClient.writeContract({
|
|
100
|
-
address: token,
|
|
102
|
+
// Build approve calldata
|
|
103
|
+
const data = encodeFunctionData({
|
|
101
104
|
abi: ERC20_ABI,
|
|
102
105
|
functionName: 'approve',
|
|
103
106
|
args: [spender, BigInt(2) ** BigInt(256) - BigInt(1)],
|
|
104
107
|
});
|
|
108
|
+
// Prepare transaction via public client
|
|
109
|
+
const nonce = await client.getTransactionCount({ address: this._address });
|
|
110
|
+
const gasPrice = await client.getGasPrice();
|
|
111
|
+
const gas = await client.estimateGas({
|
|
112
|
+
account: this._address,
|
|
113
|
+
to: token,
|
|
114
|
+
data,
|
|
115
|
+
});
|
|
116
|
+
const tx = {
|
|
117
|
+
from: this._address,
|
|
118
|
+
to: token,
|
|
119
|
+
data,
|
|
120
|
+
nonce,
|
|
121
|
+
gas: Number(gas),
|
|
122
|
+
gasPrice: Number(gasPrice),
|
|
123
|
+
chainId,
|
|
124
|
+
};
|
|
125
|
+
// Sign via wallet and broadcast
|
|
126
|
+
const signedTxHex = await this.wallet.signTransaction(tx);
|
|
127
|
+
const hash = await client.sendRawTransaction({
|
|
128
|
+
serializedTransaction: `0x${signedTxHex.replace(/^0x/, '')}`,
|
|
129
|
+
});
|
|
105
130
|
const receipt = await client.waitForTransactionReceipt({ hash });
|
|
106
131
|
const success = receipt.status === 'success';
|
|
107
132
|
if (success) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evmSigner.js","sourceRoot":"","sources":["../../src/signers/evmSigner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,kBAAkB,EAClB,
|
|
1
|
+
{"version":3,"file":"evmSigner.js","sourceRoot":"","sources":["../../src/signers/evmSigner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,kBAAkB,EAClB,IAAI,EAGJ,QAAQ,EACR,kBAAkB,GAEnB,MAAM,MAAM,CAAC;AACd,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEhE,OAAO,EACL,uBAAuB,EACvB,aAAa,EACb,0BAA0B,EAC1B,uBAAuB,GACxB,MAAM,aAAa,CAAC;AAIrB,MAAM,SAAS,GAAG,QAAQ,CAAC;IACzB,2EAA2E;IAC3E,kEAAkE;IAClE,4DAA4D;CAC7D,CAAC,CAAC;AAEH;;;;;;GAMG;AACH,MAAM,OAAO,eAAe;IAClB,MAAM,CAAc;IACpB,QAAQ,CAAS;IACjB,aAAa,GAA8B,IAAI,GAAG,EAAE,CAAC;IAE7D;;;;;OAKG;IACH,YAAY,MAAmB,EAAE,OAAe;QAC9C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC1B,CAAC;IAED,oEAAoE;IACpE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAmB;QACrC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAC1C,OAAO,IAAI,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,QAAe,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAmB;QACnC,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,MAA+B,EAC/B,KAA8B,EAC9B,OAAgC,EAChC,WAAmB;QAEnB,MAAM,QAAQ,GAAG;YACf,KAAK,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,GAAG,KAAK,EAAE;YACrC,MAAM;YACN,WAAW;YACX,OAAO;SACR,CAAC;QAEF,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,KAAa,EAAE,OAAe,EAAE,OAAgB;QACjE,MAAM,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACtD,IAAI,CAAC;YACH,OAAO,MAAM,MAAM,CAAC,YAAY,CAAC;gBAC/B,OAAO,EAAE,KAAY;gBACrB,GAAG,EAAE,SAAS;gBACd,YAAY,EAAE,WAAW;gBACzB,IAAI,EAAE,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAQ,CAAC;aAC1C,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CACX,6CAA6C,KAAK,OAAO,OAAO,GAAG,EACnE,KAAK,CACN,CAAC;YACF,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,cAAc,CAClB,KAAa,EACb,OAAe,EACf,OAAe;QAEf,MAAM,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,uBAAuB,CAAC,OAAO,CAAQ,CAAC;QAExD,IAAI,CAAC;YACH,OAAO,MAAM,MAAM,CAAC,YAAY,CAAC;gBAC/B,OAAO,EAAE,KAAY;gBACrB,GAAG,EAAE,SAAS;gBACd,YAAY,EAAE,WAAW;gBACzB,IAAI,EAAE,CAAC,IAAI,CAAC,QAAe,EAAE,OAAO,CAAC;aACtC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CACX,+CAA+C,KAAK,OAAO,OAAO,GAAG,EACrE,KAAK,CACN,CAAC;YACF,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,eAAe,CACnB,KAAa,EACb,MAAc,EACd,OAAe,EACf,OAAwC,MAAM;QAE9C,IAAI,IAAI,KAAK,MAAM;YAAE,OAAO,IAAI,CAAC;QAEjC,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAC3E,IAAI,gBAAgB,IAAI,MAAM;YAAE,OAAO,IAAI,CAAC;QAE5C,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;YAC3B,MAAM,IAAI,0BAA0B,CAAC,+BAA+B,CAAC,CAAC;QACxE,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,uBAAuB,CAAC,OAAO,CAAQ,CAAC;QAExD,IAAI,CAAC;YACH,yBAAyB;YACzB,MAAM,IAAI,GAAG,kBAAkB,CAAC;gBAC9B,GAAG,EAAE,SAAS;gBACd,YAAY,EAAE,SAAS;gBACvB,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;aACtD,CAAC,CAAC;YAEH,wCAAwC;YACxC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,QAAe,EAAE,CAAC,CAAC;YAClF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;YAC5C,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC;gBACnC,OAAO,EAAE,IAAI,CAAC,QAAe;gBAC7B,EAAE,EAAE,KAAY;gBAChB,IAAI;aACL,CAAC,CAAC;YAEH,MAAM,EAAE,GAAG;gBACT,IAAI,EAAE,IAAI,CAAC,QAAQ;gBACnB,EAAE,EAAE,KAAK;gBACT,IAAI;gBACJ,KAAK;gBACL,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC;gBAChB,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;gBAC1B,OAAO;aACR,CAAC;YAEF,gCAAgC;YAChC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;YAC1D,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC;gBAC3C,qBAAqB,EAAE,KAAK,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAS;aACpE,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;YAEjE,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC;YAC7C,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,IAAI,CACV,kDAAkD,KAAK,SAAS,IAAI,EAAE,CACvE,CAAC;YACJ,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CACX,+CAA+C,KAAK,GAAG,EACvD,KAAK,CACN,CAAC;YACF,MAAM,IAAI,0BAA0B,CAClC,yCAAyC,KAAK,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC5G,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,OAAe,EAAE,OAAe;QACtD,IAAI,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,GAAG,kBAAkB,CAAC;gBAC1B,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAC7B,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC;aACxB,CAAC,CAAC;YACH,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,QAAQ,CAAC,OAAe;QAC9B,MAAM,MAAM,GAA0B;YACpC,CAAC,EAAE,OAAO;YACV,QAAQ,EAAE,OAAO;YACjB,EAAE,EAAE,GAAG;YACP,EAAE,EAAE,UAAU;SACf,CAAC;QAEF,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,uBAAuB,CAAC,6BAA6B,OAAO,EAAE,CAAC,CAAC;QAC5E,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,qBAAqB,CAAC,OAAe;QAC3C,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,uBAAuB,CAC/B,+BAA+B,OAAO,EAAE,CACzC,CAAC;QACJ,CAAC;QACD,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACpD,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YACnB,MAAM,IAAI,uBAAuB,CAAC,4BAA4B,OAAO,EAAE,CAAC,CAAC;QAC3E,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
|
package/dist/signers/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Signers for x402 protocol
|
|
3
3
|
*/
|
|
4
|
+
export type { AgentWallet } from './signer.js';
|
|
4
5
|
export { TronClientSigner } from './signer.js';
|
|
5
6
|
export { EvmClientSigner } from './evmSigner.js';
|
|
6
7
|
export type { TronWeb, TypedDataDomain, TypedDataField, TronNetwork, } from './types.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/signers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,YAAY,EACV,OAAO,EACP,eAAe,EACf,cAAc,EACd,WAAW,GACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/signers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,YAAY,EACV,OAAO,EACP,eAAe,EACf,cAAc,EACd,WAAW,GACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/signers/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/signers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/signers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAOjD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/signers/signer.d.ts
CHANGED
|
@@ -6,13 +6,40 @@
|
|
|
6
6
|
import type { ClientSigner } from '../index.js';
|
|
7
7
|
import { type Hex } from '../index.js';
|
|
8
8
|
/**
|
|
9
|
-
*
|
|
9
|
+
* Minimal wallet interface expected by signers.
|
|
10
|
+
* Compatible with agent-wallet's BaseWallet + Eip712Capable.
|
|
11
|
+
*/
|
|
12
|
+
export interface AgentWallet {
|
|
13
|
+
getAddress(): Promise<string>;
|
|
14
|
+
signMessage(msg: Uint8Array): Promise<string>;
|
|
15
|
+
signTypedData(data: Record<string, unknown>): Promise<string>;
|
|
16
|
+
signTransaction(payload: Record<string, unknown>): Promise<string>;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* TRON client signer implementation.
|
|
20
|
+
*
|
|
21
|
+
* Accepts any wallet conforming to the AgentWallet interface.
|
|
22
|
+
* The signer is agnostic about how the wallet was created
|
|
23
|
+
* (private key, hosted, etc.).
|
|
10
24
|
*/
|
|
11
25
|
export declare class TronClientSigner implements ClientSigner {
|
|
12
|
-
private
|
|
26
|
+
private wallet;
|
|
13
27
|
private address;
|
|
14
28
|
private tronWebInstances;
|
|
15
|
-
|
|
29
|
+
/**
|
|
30
|
+
* Create signer from a wallet and its pre-resolved address.
|
|
31
|
+
*
|
|
32
|
+
* Prefer the async factory `TronClientSigner.create()` which resolves
|
|
33
|
+
* the address automatically.
|
|
34
|
+
*/
|
|
35
|
+
constructor(wallet: AgentWallet, address: string);
|
|
36
|
+
/** Async factory: resolve address from wallet and create signer. */
|
|
37
|
+
static create(wallet: AgentWallet): Promise<TronClientSigner>;
|
|
38
|
+
/**
|
|
39
|
+
* Extract signature hex from agent-wallet's signTransaction result.
|
|
40
|
+
* agent-wallet's TronWallet returns a JSON string with the full signed tx.
|
|
41
|
+
*/
|
|
42
|
+
private extractTronSignature;
|
|
16
43
|
/**
|
|
17
44
|
* Get or create a TronWeb instance for the given network.
|
|
18
45
|
*/
|
|
@@ -23,7 +50,7 @@ export declare class TronClientSigner implements ClientSigner {
|
|
|
23
50
|
getEvmAddress(): Hex;
|
|
24
51
|
signMessage(message: Uint8Array): Promise<string>;
|
|
25
52
|
/**
|
|
26
|
-
* Sign EIP-712 typed data using
|
|
53
|
+
* Sign EIP-712 typed data using Wallet abstraction
|
|
27
54
|
*/
|
|
28
55
|
signTypedData(domain: Record<string, unknown>, types: Record<string, unknown>, message: Record<string, unknown>, _primaryType: string): Promise<string>;
|
|
29
56
|
checkBalance(token: string, network: string, address?: string): Promise<bigint>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signer.d.ts","sourceRoot":"","sources":["../../src/signers/signer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAGL,KAAK,GAAG,EAKT,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"signer.d.ts","sourceRoot":"","sources":["../../src/signers/signer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAGL,KAAK,GAAG,EAKT,MAAM,aAAa,CAAC;AAIrB;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9B,WAAW,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9C,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9D,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACpE;AAMD;;;;;;GAMG;AACH,qBAAa,gBAAiB,YAAW,YAAY;IACnD,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,gBAAgB,CAAmC;IAE3D;;;;;OAKG;gBACS,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM;IAKhD,oEAAoE;WACvD,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAKnE;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAY5B;;OAEG;IACH,OAAO,CAAC,UAAU;IAclB,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,aAAa;IAQrB,UAAU,IAAI,MAAM;IAIpB,aAAa,IAAI,GAAG;IAId,WAAW,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAIvD;;OAEG;IACG,aAAa,CACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,CAAC;IAaZ,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAwB/E,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA6BhF,eAAe,CACnB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,MAAM,GAAG,aAAa,GAAG,MAAe,GAC7C,OAAO,CAAC,OAAO,CAAC;CAsFpB"}
|
package/dist/signers/signer.js
CHANGED
|
@@ -3,24 +3,51 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Uses TronWeb's signTypedData (TIP-712) for EIP-712 compatible signing.
|
|
5
5
|
*/
|
|
6
|
-
import { getPaymentPermitAddress, toEvmHex,
|
|
6
|
+
import { getPaymentPermitAddress, toEvmHex, InsufficientAllowanceError, UnsupportedNetworkError, TRON_RPC_URLS, } from '../index.js';
|
|
7
7
|
import { TronWeb as TronWebClass } from 'tronweb';
|
|
8
8
|
/** ERC20 function selectors */
|
|
9
9
|
const ERC20_ALLOWANCE_SELECTOR = 'allowance(address,address)';
|
|
10
10
|
const ERC20_APPROVE_SELECTOR = 'approve(address,uint256)';
|
|
11
11
|
/**
|
|
12
|
-
* TRON client signer implementation
|
|
12
|
+
* TRON client signer implementation.
|
|
13
|
+
*
|
|
14
|
+
* Accepts any wallet conforming to the AgentWallet interface.
|
|
15
|
+
* The signer is agnostic about how the wallet was created
|
|
16
|
+
* (private key, hosted, etc.).
|
|
13
17
|
*/
|
|
14
18
|
export class TronClientSigner {
|
|
15
|
-
|
|
19
|
+
wallet;
|
|
16
20
|
address; // Base58 format
|
|
17
21
|
tronWebInstances = new Map();
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
/**
|
|
23
|
+
* Create signer from a wallet and its pre-resolved address.
|
|
24
|
+
*
|
|
25
|
+
* Prefer the async factory `TronClientSigner.create()` which resolves
|
|
26
|
+
* the address automatically.
|
|
27
|
+
*/
|
|
28
|
+
constructor(wallet, address) {
|
|
29
|
+
this.wallet = wallet;
|
|
30
|
+
this.address = address;
|
|
31
|
+
}
|
|
32
|
+
/** Async factory: resolve address from wallet and create signer. */
|
|
33
|
+
static async create(wallet) {
|
|
34
|
+
const address = await wallet.getAddress();
|
|
35
|
+
return new TronClientSigner(wallet, address);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Extract signature hex from agent-wallet's signTransaction result.
|
|
39
|
+
* agent-wallet's TronWallet returns a JSON string with the full signed tx.
|
|
40
|
+
*/
|
|
41
|
+
extractTronSignature(result) {
|
|
42
|
+
if (typeof result === 'string' && result.trim().startsWith('{')) {
|
|
43
|
+
const signed = JSON.parse(result);
|
|
44
|
+
const sigs = signed.signature;
|
|
45
|
+
if (!Array.isArray(sigs) || sigs.length === 0) {
|
|
46
|
+
throw new Error('Wallet returned signed tx without signature');
|
|
47
|
+
}
|
|
48
|
+
return sigs[0];
|
|
49
|
+
}
|
|
50
|
+
return result;
|
|
24
51
|
}
|
|
25
52
|
/**
|
|
26
53
|
* Get or create a TronWeb instance for the given network.
|
|
@@ -49,7 +76,9 @@ export class TronClientSigner {
|
|
|
49
76
|
createTronWeb(fullHost) {
|
|
50
77
|
const apiKey = typeof process !== 'undefined' ? process.env?.TRON_GRID_API_KEY : undefined;
|
|
51
78
|
const headers = apiKey ? { 'TRON-PRO-API-KEY': apiKey } : undefined;
|
|
52
|
-
|
|
79
|
+
// TronWeb needs a private key for initialization, use a dummy key for read-only operations
|
|
80
|
+
const dummyKey = '0000000000000000000000000000000000000000000000000000000000000001';
|
|
81
|
+
return new TronWebClass({ fullHost, privateKey: dummyKey, headers });
|
|
53
82
|
}
|
|
54
83
|
getAddress() {
|
|
55
84
|
return this.address;
|
|
@@ -58,26 +87,21 @@ export class TronClientSigner {
|
|
|
58
87
|
return toEvmHex(this.address);
|
|
59
88
|
}
|
|
60
89
|
async signMessage(message) {
|
|
61
|
-
|
|
62
|
-
.map(b => b.toString(16).padStart(2, '0'))
|
|
63
|
-
.join('');
|
|
64
|
-
// Signing is pure crypto — any TronWeb instance works
|
|
65
|
-
const tw = this.getDefaultTronWeb();
|
|
66
|
-
return tw.trx.signMessageV2(messageHex, this.privateKey);
|
|
90
|
+
return this.wallet.signMessage(message);
|
|
67
91
|
}
|
|
68
92
|
/**
|
|
69
|
-
* Sign EIP-712 typed data using
|
|
93
|
+
* Sign EIP-712 typed data using Wallet abstraction
|
|
70
94
|
*/
|
|
71
95
|
async signTypedData(domain, types, message, _primaryType) {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
return
|
|
96
|
+
const fullData = {
|
|
97
|
+
types: { EIP712Domain: [], ...types },
|
|
98
|
+
domain,
|
|
99
|
+
primaryType: types.PaymentPermitDetails
|
|
100
|
+
? 'PaymentPermitDetails'
|
|
101
|
+
: Object.keys(types).pop(),
|
|
102
|
+
message,
|
|
103
|
+
};
|
|
104
|
+
return this.wallet.signTypedData(fullData);
|
|
81
105
|
}
|
|
82
106
|
async checkBalance(token, network, address) {
|
|
83
107
|
try {
|
|
@@ -144,8 +168,10 @@ export class TronClientSigner {
|
|
|
144
168
|
if (!tx.result?.result) {
|
|
145
169
|
throw new InsufficientAllowanceError('Failed to build approve transaction');
|
|
146
170
|
}
|
|
147
|
-
// Sign transaction
|
|
148
|
-
const
|
|
171
|
+
// Sign transaction via wallet and extract signature
|
|
172
|
+
const rawResult = await this.wallet.signTransaction(tx.transaction);
|
|
173
|
+
const sigHex = this.extractTronSignature(rawResult);
|
|
174
|
+
const signedTx = { ...tx.transaction, signature: [sigHex] };
|
|
149
175
|
// Broadcast transaction
|
|
150
176
|
const broadcast = await tw.trx.sendRawTransaction(signedTx);
|
|
151
177
|
if (!broadcast.result) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signer.js","sourceRoot":"","sources":["../../src/signers/signer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,uBAAuB,EACvB,QAAQ,
|
|
1
|
+
{"version":3,"file":"signer.js","sourceRoot":"","sources":["../../src/signers/signer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
/**
|
|
3
|
+
* Wallet module — removed in favor of agent-wallet package.
|
|
4
|
+
*
|
|
5
|
+
* Signing is now handled directly by agent-wallet's EvmWallet / TronWallet.
|
|
6
|
+
* Signers accept a private key string or an agent-wallet BaseWallet instance.
|
|
7
|
+
*/
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/wallet/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
/**
|
|
3
|
+
* Wallet module — removed in favor of agent-wallet package.
|
|
4
|
+
*
|
|
5
|
+
* Signing is now handled directly by agent-wallet's EvmWallet / TronWallet.
|
|
6
|
+
* Signers accept a private key string or an agent-wallet BaseWallet instance.
|
|
7
|
+
*/
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/wallet/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bankofai/x402",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0-beta.2",
|
|
4
4
|
"description": "x402 TypeScript SDK (TRON and EVM support)",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"x402",
|
|
@@ -41,11 +41,6 @@
|
|
|
41
41
|
"dist",
|
|
42
42
|
"README.md"
|
|
43
43
|
],
|
|
44
|
-
"scripts": {
|
|
45
|
-
"build": "tsc",
|
|
46
|
-
"clean": "rm -rf dist",
|
|
47
|
-
"test": "vitest run"
|
|
48
|
-
},
|
|
49
44
|
"peerDependencies": {
|
|
50
45
|
"tronweb": "^5.0.0 || ^6.0.0"
|
|
51
46
|
},
|
|
@@ -57,5 +52,10 @@
|
|
|
57
52
|
"publishConfig": {
|
|
58
53
|
"access": "public"
|
|
59
54
|
},
|
|
60
|
-
"license": "MIT"
|
|
61
|
-
|
|
55
|
+
"license": "MIT",
|
|
56
|
+
"scripts": {
|
|
57
|
+
"build": "tsc",
|
|
58
|
+
"clean": "rm -rf dist",
|
|
59
|
+
"test": "vitest run"
|
|
60
|
+
}
|
|
61
|
+
}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { PaymentPayload, PaymentRequirements, ClientMechanism, ClientSigner } from '../index.js';
|
|
2
|
-
export declare class ExactGasFreeClientMechanism implements ClientMechanism {
|
|
3
|
-
private signer;
|
|
4
|
-
constructor(signer: ClientSigner);
|
|
5
|
-
scheme(): string;
|
|
6
|
-
createPaymentPayload(requirements: PaymentRequirements, resource: string, extensions?: Record<string, unknown>): Promise<PaymentPayload>;
|
|
7
|
-
}
|
|
8
|
-
//# sourceMappingURL=gasfree.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"gasfree.d.ts","sourceRoot":"","sources":["../../src/mechanisms/gasfree.ts"],"names":[],"mappings":"AACA,OAAO,EACL,cAAc,EACd,mBAAmB,EAGnB,eAAe,EACf,YAAY,EAOb,MAAM,aAAa,CAAC;AAIrB,qBAAa,0BAA2B,YAAW,eAAe;IAChE,OAAO,CAAC,MAAM,CAAe;gBAEjB,MAAM,EAAE,YAAY;IAIhC,MAAM,IAAI,MAAM;IAIV,oBAAoB,CACxB,YAAY,EAAE,mBAAmB,EACjC,QAAQ,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACnC,OAAO,CAAC,cAAc,CAAC;CA4H3B"}
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
import { TronGasFree } from '@gasfree/gasfree-sdk';
|
|
2
|
-
import { GASFREE_PRIMARY_TYPE, getChainId, getGasFreeApiBaseUrl, getGasFreeApiKey, getGasFreeApiSecret, } from '../index.js';
|
|
3
|
-
import { GasFreeAPIClient } from '../utils/gasfree.js';
|
|
4
|
-
import { findByAddress } from '../tokens.js';
|
|
5
|
-
export class GasFreeTronClientMechanism {
|
|
6
|
-
signer;
|
|
7
|
-
constructor(signer) {
|
|
8
|
-
this.signer = signer;
|
|
9
|
-
}
|
|
10
|
-
scheme() {
|
|
11
|
-
return 'gasfree_exact';
|
|
12
|
-
}
|
|
13
|
-
async createPaymentPayload(requirements, resource, extensions) {
|
|
14
|
-
const chainId = getChainId(requirements.network);
|
|
15
|
-
const apiBaseUrl = getGasFreeApiBaseUrl(requirements.network);
|
|
16
|
-
const apiKey = getGasFreeApiKey();
|
|
17
|
-
const apiSecret = getGasFreeApiSecret();
|
|
18
|
-
const userAddress = await this.signer.getAddress();
|
|
19
|
-
const apiClient = new GasFreeAPIClient(apiBaseUrl, apiKey, apiSecret);
|
|
20
|
-
// 1. Fetch account info
|
|
21
|
-
console.debug(`Fetching account info for ${userAddress} from GasFree API...`);
|
|
22
|
-
const accountInfo = await apiClient.getAddressInfo(userAddress);
|
|
23
|
-
const gasfreeAddress = accountInfo.gasFreeAddress;
|
|
24
|
-
if (!gasfreeAddress) {
|
|
25
|
-
throw new Error(`Could not retrieve GasFree address for ${userAddress}`);
|
|
26
|
-
}
|
|
27
|
-
// 2. Check activation status
|
|
28
|
-
const allowSubmit = accountInfo.allowSubmit || false;
|
|
29
|
-
if (!accountInfo.active && !allowSubmit) {
|
|
30
|
-
throw new Error(`GasFree account for ${userAddress} (${gasfreeAddress}) is not activated.`);
|
|
31
|
-
}
|
|
32
|
-
// 3. Prepare maxFee and providers
|
|
33
|
-
const providers = await apiClient.getProviders();
|
|
34
|
-
if (!providers || providers.length === 0) {
|
|
35
|
-
throw new Error('No GasFree service providers available');
|
|
36
|
-
}
|
|
37
|
-
const serviceProviderAddr = providers[Math.floor(Math.random() * providers.length)].address;
|
|
38
|
-
console.debug(`Selected GasFree provider: ${serviceProviderAddr}`);
|
|
39
|
-
const asset = accountInfo.assets.find((a) => a.tokenAddress === requirements.asset);
|
|
40
|
-
const transferFee = BigInt(asset?.transferFee || '0');
|
|
41
|
-
let maxFee = requirements.extra?.fee?.feeAmount;
|
|
42
|
-
if (!maxFee) {
|
|
43
|
-
// Default to transferFee from API, or 1.0 token units as a safe fallback
|
|
44
|
-
if (transferFee > 0n) {
|
|
45
|
-
maxFee = transferFee.toString();
|
|
46
|
-
}
|
|
47
|
-
else {
|
|
48
|
-
const tokenInfo = findByAddress(requirements.network, requirements.asset);
|
|
49
|
-
const decimals = tokenInfo?.decimals ?? 6;
|
|
50
|
-
maxFee = (10 ** decimals).toString();
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
let maxFeeBig = BigInt(maxFee);
|
|
54
|
-
if (maxFeeBig < transferFee) {
|
|
55
|
-
console.debug(`Increasing maxFee to ${transferFee} to meet protocol requirement`);
|
|
56
|
-
maxFeeBig = transferFee;
|
|
57
|
-
maxFee = maxFeeBig.toString();
|
|
58
|
-
}
|
|
59
|
-
// 4. Balance verification
|
|
60
|
-
const skipBalanceCheck = extensions?.skipBalanceCheck || false;
|
|
61
|
-
if (!skipBalanceCheck) {
|
|
62
|
-
if (asset) {
|
|
63
|
-
const assetBalance = BigInt(asset.balance || '0');
|
|
64
|
-
const requiredTotal = BigInt(requirements.amount) + maxFeeBig;
|
|
65
|
-
if (assetBalance < requiredTotal) {
|
|
66
|
-
throw new Error(`Insufficient balance in GasFree wallet ${gasfreeAddress}.`);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
else {
|
|
70
|
-
throw new Error(`Asset ${requirements.asset} not found in GasFree account ${gasfreeAddress}.`);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
const deadline = extensions?.paymentPermitContext?.meta?.validBefore || Math.floor(Date.now() / 1000) + 3600;
|
|
74
|
-
const gasFree = new TronGasFree({ chainId });
|
|
75
|
-
// 5. Sign TIP-712 typed data
|
|
76
|
-
const { domain, types, message } = gasFree.assembleGasFreeTransactionJson({
|
|
77
|
-
token: requirements.asset,
|
|
78
|
-
serviceProvider: serviceProviderAddr,
|
|
79
|
-
user: userAddress,
|
|
80
|
-
receiver: requirements.payTo,
|
|
81
|
-
value: requirements.amount,
|
|
82
|
-
maxFee: maxFee,
|
|
83
|
-
deadline: deadline.toString(),
|
|
84
|
-
version: '1',
|
|
85
|
-
nonce: accountInfo.nonce.toString(),
|
|
86
|
-
});
|
|
87
|
-
const signature = await this.signer.signTypedData(domain, types, message, GASFREE_PRIMARY_TYPE);
|
|
88
|
-
// 6. Build PaymentPermit structure
|
|
89
|
-
const paymentPermit = {
|
|
90
|
-
meta: {
|
|
91
|
-
kind: 'PAYMENT_ONLY',
|
|
92
|
-
paymentId: extensions?.paymentPermitContext?.meta?.paymentId || '',
|
|
93
|
-
nonce: accountInfo.nonce.toString(),
|
|
94
|
-
validAfter: extensions?.paymentPermitContext?.meta?.validAfter || 0,
|
|
95
|
-
validBefore: Number(deadline),
|
|
96
|
-
},
|
|
97
|
-
buyer: userAddress,
|
|
98
|
-
caller: serviceProviderAddr,
|
|
99
|
-
payment: {
|
|
100
|
-
payToken: requirements.asset,
|
|
101
|
-
payAmount: requirements.amount,
|
|
102
|
-
payTo: requirements.payTo,
|
|
103
|
-
},
|
|
104
|
-
fee: {
|
|
105
|
-
feeTo: serviceProviderAddr,
|
|
106
|
-
feeAmount: maxFee,
|
|
107
|
-
},
|
|
108
|
-
};
|
|
109
|
-
return {
|
|
110
|
-
x402Version: 2,
|
|
111
|
-
resource: { url: resource },
|
|
112
|
-
accepted: requirements,
|
|
113
|
-
payload: {
|
|
114
|
-
signature,
|
|
115
|
-
paymentPermit,
|
|
116
|
-
},
|
|
117
|
-
extensions: {
|
|
118
|
-
...extensions,
|
|
119
|
-
gasfreeAddress,
|
|
120
|
-
scheme: 'gasfree_exact',
|
|
121
|
-
},
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
//# sourceMappingURL=gasfree.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"gasfree.js","sourceRoot":"","sources":["../../src/mechanisms/gasfree.ts"],"names":[],"mappings":"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"}
|