@nevermined-io/core-kit 0.4.6 → 0.5.1
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/Instantiable.abstract.js +15 -13
- package/dist/Instantiable.abstract.js.map +1 -0
- package/dist/artifacts/generated.d.ts +174 -40
- package/dist/artifacts/generated.d.ts.map +1 -1
- package/dist/artifacts/generated.js +22805 -7111
- package/dist/artifacts/generated.js.map +1 -0
- package/dist/contracts/AccessManager.js +12 -3
- package/dist/contracts/AccessManager.js.map +1 -0
- package/dist/contracts/AssetRegistry.d.ts +1 -0
- package/dist/contracts/AssetRegistry.d.ts.map +1 -1
- package/dist/contracts/AssetRegistry.js +134 -69
- package/dist/contracts/AssetRegistry.js.map +1 -0
- package/dist/contracts/ContractBase.d.ts.map +1 -1
- package/dist/contracts/ContractBase.js +173 -140
- package/dist/contracts/ContractBase.js.map +1 -0
- package/dist/contracts/ContractsApi.js +6 -54
- package/dist/contracts/ContractsApi.js.map +1 -0
- package/dist/contracts/CryptoTemplateBase.js +23 -11
- package/dist/contracts/CryptoTemplateBase.js.map +1 -0
- package/dist/contracts/FiatPaymentTemplate.js +9 -1
- package/dist/contracts/FiatPaymentTemplate.js.map +1 -0
- package/dist/contracts/FiatSettlementCondition.js +8 -1
- package/dist/contracts/FiatSettlementCondition.js.map +1 -0
- package/dist/contracts/FixedPaymentTemplate.js +42 -10
- package/dist/contracts/FixedPaymentTemplate.js.map +1 -0
- package/dist/contracts/NFT1155Base.js +48 -12
- package/dist/contracts/NFT1155Base.js.map +1 -0
- package/dist/contracts/NFT1155Credits.js +2 -0
- package/dist/contracts/NFT1155Credits.js.map +1 -0
- package/dist/contracts/NFT1155ExpirableCredits.js +26 -6
- package/dist/contracts/NFT1155ExpirableCredits.js.map +1 -0
- package/dist/contracts/NVMConfig.js +2 -0
- package/dist/contracts/NVMConfig.js.map +1 -0
- package/dist/contracts/PayAsYouGoTemplate.js +36 -10
- package/dist/contracts/PayAsYouGoTemplate.js.map +1 -0
- package/dist/contracts/ProtocolStandardFees.js +7 -1
- package/dist/contracts/ProtocolStandardFees.js.map +1 -0
- package/dist/contracts/Roles.js +2 -0
- package/dist/contracts/Roles.js.map +1 -0
- package/dist/contracts/index.js +2 -0
- package/dist/contracts/index.js.map +1 -0
- package/dist/errors/NeverminedErrors.js +27 -26
- package/dist/errors/NeverminedErrors.js.map +1 -0
- package/dist/errors/index.js +2 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/models/AgentX402AccessToken.js +78 -46
- package/dist/models/AgentX402AccessToken.js.map +1 -0
- package/dist/models/Logger.js +12 -12
- package/dist/models/Logger.js.map +1 -0
- package/dist/models/NeverminedOptions.d.ts +3 -3
- package/dist/models/NeverminedOptions.d.ts.map +1 -1
- package/dist/models/NeverminedOptions.js +3 -28
- package/dist/models/NeverminedOptions.js.map +1 -0
- package/dist/models/NvmApiKey.js +96 -147
- package/dist/models/NvmApiKey.js.map +1 -0
- package/dist/models/Transactions.js +3 -1
- package/dist/models/Transactions.js.map +1 -0
- package/dist/models/index.js +2 -0
- package/dist/models/index.js.map +1 -0
- package/dist/nevermined/Nevermined.js +20 -42
- package/dist/nevermined/Nevermined.js.map +1 -0
- package/dist/nevermined/api/PaymentsApi.js +38 -43
- package/dist/nevermined/api/PaymentsApi.js.map +1 -0
- package/dist/nevermined/api/ServicesApi.js +7 -15
- package/dist/nevermined/api/ServicesApi.js.map +1 -0
- package/dist/nevermined/api/UtilsApi.js +7 -19
- package/dist/nevermined/api/UtilsApi.js.map +1 -0
- package/dist/nevermined/index.js +2 -0
- package/dist/nevermined/index.js.map +1 -0
- package/dist/nevermined/utils/AgentUtils.js +25 -23
- package/dist/nevermined/utils/AgentUtils.js.map +1 -0
- package/dist/nevermined/utils/AnvilHelpers.js +34 -19
- package/dist/nevermined/utils/AnvilHelpers.js.map +1 -0
- package/dist/nevermined/utils/BlockchainViemUtils.d.ts +4 -4
- package/dist/nevermined/utils/BlockchainViemUtils.js +102 -108
- package/dist/nevermined/utils/BlockchainViemUtils.js.map +1 -0
- package/dist/nevermined/utils/JwtUtils.js +33 -28
- package/dist/nevermined/utils/JwtUtils.js.map +1 -0
- package/dist/nevermined/utils/SignatureUtils.js +23 -27
- package/dist/nevermined/utils/SignatureUtils.js.map +1 -0
- package/dist/nevermined/utils/WebServiceConnector.js +18 -20
- package/dist/nevermined/utils/WebServiceConnector.js.map +1 -0
- package/dist/nevermined/utils/ZeroDevPolicies.js +115 -75
- package/dist/nevermined/utils/ZeroDevPolicies.js.map +1 -0
- package/dist/nevermined/utils/index.js +2 -0
- package/dist/nevermined/utils/index.js.map +1 -0
- package/dist/services/Api.js +11 -5
- package/dist/services/Api.js.map +1 -0
- package/dist/services/Profiles.js +15 -20
- package/dist/services/Profiles.js.map +1 -0
- package/dist/services/index.js +2 -0
- package/dist/services/index.js.map +1 -0
- package/dist/utils/ConversionTypeHelpers.js +13 -6
- package/dist/utils/ConversionTypeHelpers.js.map +1 -0
- package/dist/utils/DeploymentInfo.js +12 -7
- package/dist/utils/DeploymentInfo.js.map +1 -0
- package/dist/utils/Network.js +27 -19
- package/dist/utils/Network.js.map +1 -0
- package/dist/utils/helpers.js +42 -31
- package/dist/utils/helpers.js.map +1 -0
- package/dist/utils/index.js +2 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +17 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { lockPaymentConditionAddress, payAsYouGoTemplateConfig, paymentsVaultAddress
|
|
1
|
+
import { lockPaymentConditionAddress, payAsYouGoTemplateConfig, paymentsVaultAddress } from '../artifacts/generated.js';
|
|
2
2
|
import { generateZeroXId } from '../utils/helpers.js';
|
|
3
3
|
import { CryptoTemplateBase } from './CryptoTemplateBase.js';
|
|
4
4
|
export class PayAsYouGoTemplate extends CryptoTemplateBase {
|
|
@@ -9,7 +9,11 @@ export class PayAsYouGoTemplate extends CryptoTemplateBase {
|
|
|
9
9
|
}
|
|
10
10
|
async order(planId, owner, txParams) {
|
|
11
11
|
const agreementIdSeed = generateZeroXId();
|
|
12
|
-
return this.send('order', owner, [
|
|
12
|
+
return this.send('order', owner, [
|
|
13
|
+
agreementIdSeed,
|
|
14
|
+
planId,
|
|
15
|
+
[]
|
|
16
|
+
], txParams);
|
|
13
17
|
}
|
|
14
18
|
async simulateOrder(planId, owner, tokenAddress, totalAmount, txParams) {
|
|
15
19
|
const agreementIdSeed = generateZeroXId();
|
|
@@ -18,20 +22,30 @@ export class PayAsYouGoTemplate extends CryptoTemplateBase {
|
|
|
18
22
|
to: tokenAddress,
|
|
19
23
|
abi: this.TOKEN_APPROVE_ABI,
|
|
20
24
|
functionName: 'approve',
|
|
21
|
-
args: [
|
|
25
|
+
args: [
|
|
26
|
+
lockPaymentConditionAddress,
|
|
27
|
+
totalAmount
|
|
28
|
+
]
|
|
22
29
|
},
|
|
23
30
|
{
|
|
24
31
|
to: tokenAddress,
|
|
25
32
|
abi: this.TOKEN_APPROVE_ABI,
|
|
26
33
|
functionName: 'approve',
|
|
27
|
-
args: [
|
|
34
|
+
args: [
|
|
35
|
+
paymentsVaultAddress,
|
|
36
|
+
totalAmount
|
|
37
|
+
]
|
|
28
38
|
},
|
|
29
39
|
{
|
|
30
40
|
to: this.address,
|
|
31
41
|
abi: this.contract.abi,
|
|
32
42
|
functionName: 'order',
|
|
33
|
-
args: [
|
|
34
|
-
|
|
43
|
+
args: [
|
|
44
|
+
agreementIdSeed,
|
|
45
|
+
planId,
|
|
46
|
+
[]
|
|
47
|
+
]
|
|
48
|
+
}
|
|
35
49
|
];
|
|
36
50
|
return this.simulateMulticall(calls, owner, txParams);
|
|
37
51
|
}
|
|
@@ -42,21 +56,33 @@ export class PayAsYouGoTemplate extends CryptoTemplateBase {
|
|
|
42
56
|
contractAddress: tokenAddress,
|
|
43
57
|
abi: this.TOKEN_APPROVE_ABI,
|
|
44
58
|
functionName: 'approve',
|
|
45
|
-
args: [
|
|
59
|
+
args: [
|
|
60
|
+
lockPaymentConditionAddress,
|
|
61
|
+
totalAmount
|
|
62
|
+
]
|
|
46
63
|
},
|
|
47
64
|
{
|
|
48
65
|
contractAddress: tokenAddress,
|
|
49
66
|
abi: this.TOKEN_APPROVE_ABI,
|
|
50
67
|
functionName: 'approve',
|
|
51
|
-
args: [
|
|
68
|
+
args: [
|
|
69
|
+
paymentsVaultAddress,
|
|
70
|
+
totalAmount
|
|
71
|
+
]
|
|
52
72
|
},
|
|
53
73
|
{
|
|
54
74
|
contractAddress: this.address,
|
|
55
75
|
abi: this.contract.abi,
|
|
56
76
|
functionName: 'order',
|
|
57
|
-
args: [
|
|
58
|
-
|
|
77
|
+
args: [
|
|
78
|
+
agreementIdSeed,
|
|
79
|
+
planId,
|
|
80
|
+
[]
|
|
81
|
+
]
|
|
82
|
+
}
|
|
59
83
|
];
|
|
60
84
|
return await this.multicall(calls, owner, txParams);
|
|
61
85
|
}
|
|
62
86
|
}
|
|
87
|
+
|
|
88
|
+
//# sourceMappingURL=PayAsYouGoTemplate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/contracts/PayAsYouGoTemplate.ts"],"sourcesContent":["import { Account, Address } from 'viem'\nimport { SmartAccount } from 'viem/account-abstraction'\nimport {\n lockPaymentConditionAddress,\n payAsYouGoTemplateConfig,\n paymentsVaultAddress,\n} from '../artifacts/generated.js'\nimport { InstantiableConfig } from '../Instantiable.abstract.js'\nimport { TxParameters } from '../models/Transactions.js'\nimport { generateZeroXId } from '../utils/helpers.js'\nimport { CryptoTemplateBase } from './CryptoTemplateBase.js'\nimport { MulticallEntry, SimulateMulticallEntry } from './ContractBase.js'\n\nexport class PayAsYouGoTemplate extends CryptoTemplateBase {\n public static override async getInstance(\n config: InstantiableConfig,\n ): Promise<PayAsYouGoTemplate> {\n const payAsYouGoTemplate = new PayAsYouGoTemplate(\n 'PayAsYouGoTemplate',\n payAsYouGoTemplateConfig.address,\n )\n await payAsYouGoTemplate.init(config, payAsYouGoTemplateConfig)\n return payAsYouGoTemplate\n }\n\n public async order(planId: bigint, owner: Account | SmartAccount, txParams?: TxParameters) {\n const agreementIdSeed = generateZeroXId()\n return this.send('order', owner, [agreementIdSeed, planId, []], txParams)\n }\n\n public async simulateOrder(\n planId: bigint,\n owner: Account | SmartAccount,\n tokenAddress: Address,\n totalAmount: bigint,\n txParams?: TxParameters,\n ) {\n const agreementIdSeed = generateZeroXId()\n const calls: SimulateMulticallEntry[] = [\n {\n to: tokenAddress,\n abi: this.TOKEN_APPROVE_ABI,\n functionName: 'approve',\n args: [lockPaymentConditionAddress, totalAmount],\n },\n {\n to: tokenAddress,\n abi: this.TOKEN_APPROVE_ABI,\n functionName: 'approve',\n args: [paymentsVaultAddress, totalAmount],\n },\n {\n to: this.address,\n abi: this.contract.abi,\n functionName: 'order',\n args: [agreementIdSeed, planId, []],\n },\n ]\n return this.simulateMulticall(calls, owner, txParams)\n }\n\n public async orderWithApprovals(\n planId: bigint,\n totalAmount: bigint,\n tokenAddress: Address,\n owner: Account | SmartAccount,\n txParams?: TxParameters,\n ) {\n const agreementIdSeed = generateZeroXId()\n\n const calls: MulticallEntry[] = [\n {\n contractAddress: tokenAddress,\n abi: this.TOKEN_APPROVE_ABI,\n functionName: 'approve',\n args: [lockPaymentConditionAddress, totalAmount],\n },\n {\n contractAddress: tokenAddress,\n abi: this.TOKEN_APPROVE_ABI,\n functionName: 'approve',\n args: [paymentsVaultAddress, totalAmount],\n },\n {\n contractAddress: this.address,\n abi: this.contract.abi,\n functionName: 'order',\n args: [agreementIdSeed, planId, []],\n },\n ]\n return await this.multicall(calls, owner, txParams)\n }\n}\n"],"names":["lockPaymentConditionAddress","payAsYouGoTemplateConfig","paymentsVaultAddress","generateZeroXId","CryptoTemplateBase","PayAsYouGoTemplate","getInstance","config","payAsYouGoTemplate","address","init","order","planId","owner","txParams","agreementIdSeed","send","simulateOrder","tokenAddress","totalAmount","calls","to","abi","TOKEN_APPROVE_ABI","functionName","args","contract","simulateMulticall","orderWithApprovals","contractAddress","multicall"],"mappings":"AAEA,SACEA,2BAA2B,EAC3BC,wBAAwB,EACxBC,oBAAoB,QACf,4BAA2B;AAGlC,SAASC,eAAe,QAAQ,sBAAqB;AACrD,SAASC,kBAAkB,QAAQ,0BAAyB;AAG5D,OAAO,MAAMC,2BAA2BD;IACtC,aAA6BE,YAC3BC,MAA0B,EACG;QAC7B,MAAMC,qBAAqB,IAAIH,mBAC7B,sBACAJ,yBAAyBQ,OAAO;QAElC,MAAMD,mBAAmBE,IAAI,CAACH,QAAQN;QACtC,OAAOO;IACT;IAEA,MAAaG,MAAMC,MAAc,EAAEC,KAA6B,EAAEC,QAAuB,EAAE;QACzF,MAAMC,kBAAkBZ;QACxB,OAAO,IAAI,CAACa,IAAI,CAAC,SAASH,OAAO;YAACE;YAAiBH;YAAQ,EAAE;SAAC,EAAEE;IAClE;IAEA,MAAaG,cACXL,MAAc,EACdC,KAA6B,EAC7BK,YAAqB,EACrBC,WAAmB,EACnBL,QAAuB,EACvB;QACA,MAAMC,kBAAkBZ;QACxB,MAAMiB,QAAkC;YACtC;gBACEC,IAAIH;gBACJI,KAAK,IAAI,CAACC,iBAAiB;gBAC3BC,cAAc;gBACdC,MAAM;oBAACzB;oBAA6BmB;iBAAY;YAClD;YACA;gBACEE,IAAIH;gBACJI,KAAK,IAAI,CAACC,iBAAiB;gBAC3BC,cAAc;gBACdC,MAAM;oBAACvB;oBAAsBiB;iBAAY;YAC3C;YACA;gBACEE,IAAI,IAAI,CAACZ,OAAO;gBAChBa,KAAK,IAAI,CAACI,QAAQ,CAACJ,GAAG;gBACtBE,cAAc;gBACdC,MAAM;oBAACV;oBAAiBH;oBAAQ,EAAE;iBAAC;YACrC;SACD;QACD,OAAO,IAAI,CAACe,iBAAiB,CAACP,OAAOP,OAAOC;IAC9C;IAEA,MAAac,mBACXhB,MAAc,EACdO,WAAmB,EACnBD,YAAqB,EACrBL,KAA6B,EAC7BC,QAAuB,EACvB;QACA,MAAMC,kBAAkBZ;QAExB,MAAMiB,QAA0B;YAC9B;gBACES,iBAAiBX;gBACjBI,KAAK,IAAI,CAACC,iBAAiB;gBAC3BC,cAAc;gBACdC,MAAM;oBAACzB;oBAA6BmB;iBAAY;YAClD;YACA;gBACEU,iBAAiBX;gBACjBI,KAAK,IAAI,CAACC,iBAAiB;gBAC3BC,cAAc;gBACdC,MAAM;oBAACvB;oBAAsBiB;iBAAY;YAC3C;YACA;gBACEU,iBAAiB,IAAI,CAACpB,OAAO;gBAC7Ba,KAAK,IAAI,CAACI,QAAQ,CAACJ,GAAG;gBACtBE,cAAc;gBACdC,MAAM;oBAACV;oBAAiBH;oBAAQ,EAAE;iBAAC;YACrC;SACD;QACD,OAAO,MAAM,IAAI,CAACkB,SAAS,CAACV,OAAOP,OAAOC;IAC5C;AACF"}
|
|
@@ -7,9 +7,15 @@ export class ProtocolStandardFees extends ContractBase {
|
|
|
7
7
|
return protocolStandardFees;
|
|
8
8
|
}
|
|
9
9
|
async calculateFee(totalAmount, priceConfig, creditsConfig) {
|
|
10
|
-
return this.contract.read.calculateFee([
|
|
10
|
+
return this.contract.read.calculateFee([
|
|
11
|
+
totalAmount,
|
|
12
|
+
priceConfig,
|
|
13
|
+
creditsConfig
|
|
14
|
+
]);
|
|
11
15
|
}
|
|
12
16
|
async getFeeRates() {
|
|
13
17
|
return this.contract.read.getFeeRates();
|
|
14
18
|
}
|
|
15
19
|
}
|
|
20
|
+
|
|
21
|
+
//# sourceMappingURL=ProtocolStandardFees.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/contracts/ProtocolStandardFees.ts"],"sourcesContent":["import { CreditsConfig, PriceConfig } from '@nevermined-io/commons'\nimport { protocolStandardFeesConfig } from '../artifacts/generated.js'\nimport { InstantiableConfig } from '../Instantiable.abstract.js'\nimport { ContractBase } from './ContractBase.js'\n\nexport class ProtocolStandardFees extends ContractBase {\n public static override async getInstance(\n config: InstantiableConfig,\n ): Promise<ProtocolStandardFees> {\n const protocolStandardFees = new ProtocolStandardFees(\n 'ProtocolStandardFees',\n protocolStandardFeesConfig.address,\n )\n await protocolStandardFees.init(config, protocolStandardFeesConfig)\n return protocolStandardFees\n }\n\n public async calculateFee(\n totalAmount: bigint,\n priceConfig: PriceConfig,\n creditsConfig: CreditsConfig,\n ) {\n return this.contract.read.calculateFee([totalAmount, priceConfig, creditsConfig])\n }\n\n public async getFeeRates() {\n return this.contract.read.getFeeRates()\n }\n}\n"],"names":["protocolStandardFeesConfig","ContractBase","ProtocolStandardFees","getInstance","config","protocolStandardFees","address","init","calculateFee","totalAmount","priceConfig","creditsConfig","contract","read","getFeeRates"],"mappings":"AACA,SAASA,0BAA0B,QAAQ,4BAA2B;AAEtE,SAASC,YAAY,QAAQ,oBAAmB;AAEhD,OAAO,MAAMC,6BAA6BD;IACxC,aAA6BE,YAC3BC,MAA0B,EACK;QAC/B,MAAMC,uBAAuB,IAAIH,qBAC/B,wBACAF,2BAA2BM,OAAO;QAEpC,MAAMD,qBAAqBE,IAAI,CAACH,QAAQJ;QACxC,OAAOK;IACT;IAEA,MAAaG,aACXC,WAAmB,EACnBC,WAAwB,EACxBC,aAA4B,EAC5B;QACA,OAAO,IAAI,CAACC,QAAQ,CAACC,IAAI,CAACL,YAAY,CAAC;YAACC;YAAaC;YAAaC;SAAc;IAClF;IAEA,MAAaG,cAAc;QACzB,OAAO,IAAI,CAACF,QAAQ,CAACC,IAAI,CAACC,WAAW;IACvC;AACF"}
|
package/dist/contracts/Roles.js
CHANGED
|
@@ -10,3 +10,5 @@ export const FIAT_SETTLEMENT_ROLE = 3860893312041324254n;
|
|
|
10
10
|
export const CREDITS_BURNER_ROLE = 16934877136143260882n;
|
|
11
11
|
export const CREDITS_TRANSFER_ROLE = 11914029060103770296n;
|
|
12
12
|
export const NVM_INFRA_ADMIN_ROLE = 7924818820658164977n;
|
|
13
|
+
|
|
14
|
+
//# sourceMappingURL=Roles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/contracts/Roles.ts"],"sourcesContent":["export const UPGRADE_ROLE = 16061234310146353691n\nexport const DEPOSITOR_ROLE = 14314970521567793544n\nexport const WITHDRAW_ROLE = 8393396895733992431n\nexport const CREDITS_MINTER_ROLE = 331619801143826648n\nexport const GOVERNOR_ROLE = 13709648602636273795n\nexport const CONTRACT_TEMPLATE_ROLE = 10197209388572726906n\nexport const CONTRACT_CONDITION_ROLE = 16570836817734027638n\nexport const UPDATE_CONDITION_STATUS_ROLE = 14777935691551675925n\nexport const FIAT_SETTLEMENT_ROLE = 3860893312041324254n\nexport const CREDITS_BURNER_ROLE = 16934877136143260882n\nexport const CREDITS_TRANSFER_ROLE = 11914029060103770296n\nexport const NVM_INFRA_ADMIN_ROLE = 7924818820658164977n\n"],"names":["UPGRADE_ROLE","DEPOSITOR_ROLE","WITHDRAW_ROLE","CREDITS_MINTER_ROLE","GOVERNOR_ROLE","CONTRACT_TEMPLATE_ROLE","CONTRACT_CONDITION_ROLE","UPDATE_CONDITION_STATUS_ROLE","FIAT_SETTLEMENT_ROLE","CREDITS_BURNER_ROLE","CREDITS_TRANSFER_ROLE","NVM_INFRA_ADMIN_ROLE"],"mappings":"AAAA,OAAO,MAAMA,eAAe,qBAAqB,CAAA;AACjD,OAAO,MAAMC,iBAAiB,qBAAqB,CAAA;AACnD,OAAO,MAAMC,gBAAgB,oBAAoB,CAAA;AACjD,OAAO,MAAMC,sBAAsB,mBAAmB,CAAA;AACtD,OAAO,MAAMC,gBAAgB,qBAAqB,CAAA;AAClD,OAAO,MAAMC,yBAAyB,qBAAqB,CAAA;AAC3D,OAAO,MAAMC,0BAA0B,qBAAqB,CAAA;AAC5D,OAAO,MAAMC,+BAA+B,qBAAqB,CAAA;AACjE,OAAO,MAAMC,uBAAuB,oBAAoB,CAAA;AACxD,OAAO,MAAMC,sBAAsB,qBAAqB,CAAA;AACxD,OAAO,MAAMC,wBAAwB,qBAAqB,CAAA;AAC1D,OAAO,MAAMC,uBAAuB,oBAAoB,CAAA"}
|
package/dist/contracts/index.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/contracts/index.ts"],"sourcesContent":["export * from './ContractsApi.js'\nexport * from './Roles.js'\n"],"names":[],"mappings":"AAAA,cAAc,oBAAmB;AACjC,cAAc,aAAY"}
|
|
@@ -1,94 +1,93 @@
|
|
|
1
1
|
export class NeverminedNodeError extends Error {
|
|
2
|
-
constructor(message)
|
|
2
|
+
constructor(message){
|
|
3
3
|
super(`Nevermined Node error: ${message}`);
|
|
4
4
|
}
|
|
5
5
|
}
|
|
6
6
|
export class GraphError extends Error {
|
|
7
|
-
constructor(message)
|
|
7
|
+
constructor(message){
|
|
8
8
|
super(`Graph error: ${message}`);
|
|
9
9
|
}
|
|
10
10
|
}
|
|
11
11
|
export class HttpError extends Error {
|
|
12
|
-
constructor(message, code)
|
|
12
|
+
constructor(message, code){
|
|
13
13
|
super(`Http error with code ${code}: ${message}`);
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
16
|
export class ContractsError extends Error {
|
|
17
|
-
constructor(message)
|
|
17
|
+
constructor(message){
|
|
18
18
|
super(`Contracts error: ${message}`);
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
21
|
export class ContractSimulationError extends Error {
|
|
22
|
-
constructor(message)
|
|
22
|
+
constructor(message){
|
|
23
23
|
super(`Contract simulation error: ${message}`);
|
|
24
24
|
}
|
|
25
25
|
}
|
|
26
26
|
export class Web3Error extends Error {
|
|
27
|
-
constructor(message)
|
|
27
|
+
constructor(message){
|
|
28
28
|
super(`Web3 error: ${message}`);
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
31
|
export class ApiError extends Error {
|
|
32
|
-
constructor(message)
|
|
32
|
+
constructor(message){
|
|
33
33
|
super(`Api error: ${message}`);
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
36
|
export class NFTError extends Error {
|
|
37
|
-
constructor(message)
|
|
37
|
+
constructor(message){
|
|
38
38
|
super(`NFT error: ${message}`);
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
41
|
export class DynamicCreditsOverLimit extends NFTError {
|
|
42
|
-
constructor(message)
|
|
42
|
+
constructor(message){
|
|
43
43
|
super(`DynamicCreditsOverLimit error: ${message}`);
|
|
44
44
|
}
|
|
45
45
|
}
|
|
46
46
|
export class DynamicCreditsUnderLimit extends NFTError {
|
|
47
|
-
constructor(message)
|
|
47
|
+
constructor(message){
|
|
48
48
|
super(`DynamicCreditsUnderLimit error: ${message}`);
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
51
|
export class InvalidAddress extends Error {
|
|
52
|
-
constructor(address)
|
|
52
|
+
constructor(address){
|
|
53
53
|
super(`Invalid Address ${address}`);
|
|
54
54
|
}
|
|
55
55
|
}
|
|
56
56
|
export class NotEnoughBalance extends Error {
|
|
57
|
-
constructor(message)
|
|
57
|
+
constructor(message){
|
|
58
58
|
super(`NotEnoughBalance: ${message}`);
|
|
59
59
|
}
|
|
60
60
|
}
|
|
61
61
|
export class MethodNotSupported extends Error {
|
|
62
|
-
constructor(message)
|
|
62
|
+
constructor(message){
|
|
63
63
|
super(`MethodNotSupported: ${message}`);
|
|
64
64
|
}
|
|
65
65
|
}
|
|
66
66
|
export class PlanNotFound extends Error {
|
|
67
|
-
constructor(message)
|
|
67
|
+
constructor(message){
|
|
68
68
|
super(`PlanNotFound: ${message}`);
|
|
69
69
|
}
|
|
70
70
|
}
|
|
71
71
|
export class AgentNotFound extends Error {
|
|
72
|
-
constructor(message)
|
|
72
|
+
constructor(message){
|
|
73
73
|
super(`AgentNotFound: ${message}`);
|
|
74
74
|
}
|
|
75
75
|
}
|
|
76
76
|
export class AssetError extends Error {
|
|
77
|
-
constructor(message)
|
|
77
|
+
constructor(message){
|
|
78
78
|
super(`Asset error: ${message}`);
|
|
79
79
|
}
|
|
80
80
|
}
|
|
81
81
|
export class PaymentFeesNotIncluded extends Error {
|
|
82
|
-
constructor(message)
|
|
82
|
+
constructor(message){
|
|
83
83
|
super(`PaymentFeesNotIncluded: ${message}`);
|
|
84
84
|
}
|
|
85
85
|
}
|
|
86
86
|
export class DDOError extends Error {
|
|
87
|
-
constructor(message, did)
|
|
87
|
+
constructor(message, did){
|
|
88
88
|
if (did) {
|
|
89
89
|
super(`DDO(${did}) error: ${message}`);
|
|
90
|
-
}
|
|
91
|
-
else {
|
|
90
|
+
} else {
|
|
92
91
|
super(`DDO error: ${message}`);
|
|
93
92
|
}
|
|
94
93
|
// from https://bobbyhadz.com/blog/typescript-extend-error-class
|
|
@@ -97,32 +96,34 @@ export class DDOError extends Error {
|
|
|
97
96
|
}
|
|
98
97
|
}
|
|
99
98
|
export class DDOServiceNotFoundError extends DDOError {
|
|
100
|
-
constructor(serviceType, did)
|
|
99
|
+
constructor(serviceType, did){
|
|
101
100
|
super(`Service with type "${serviceType}" not found`, did);
|
|
102
101
|
}
|
|
103
102
|
}
|
|
104
103
|
export class DDOServiceAlreadyExists extends DDOError {
|
|
105
|
-
constructor(serviceType, index)
|
|
104
|
+
constructor(serviceType, index){
|
|
106
105
|
super(`Service with type "${serviceType}" and index ${index} already exists`);
|
|
107
106
|
}
|
|
108
107
|
}
|
|
109
108
|
export class DDOConditionNotFoundError extends DDOError {
|
|
110
|
-
constructor(conditionName)
|
|
109
|
+
constructor(conditionName){
|
|
111
110
|
super(`Condition with name "${conditionName}" not found`);
|
|
112
111
|
}
|
|
113
112
|
}
|
|
114
113
|
export class DDOParamNotFoundError extends DDOError {
|
|
115
|
-
constructor(conditionName, paramName)
|
|
114
|
+
constructor(conditionName, paramName){
|
|
116
115
|
super(`Parameter "${paramName}" not found on Condition with type "${conditionName}"`);
|
|
117
116
|
}
|
|
118
117
|
}
|
|
119
118
|
export class DDOPriceNotFoundError extends DDOError {
|
|
120
|
-
constructor(serviceType, did)
|
|
119
|
+
constructor(serviceType, did){
|
|
121
120
|
super(`Service with type "${serviceType}" is not priced.`, did);
|
|
122
121
|
}
|
|
123
122
|
}
|
|
124
123
|
export class NvmAccountError extends Error {
|
|
125
|
-
constructor(message)
|
|
124
|
+
constructor(message){
|
|
126
125
|
super(`NVM Account error: ${message}`);
|
|
127
126
|
}
|
|
128
127
|
}
|
|
128
|
+
|
|
129
|
+
//# sourceMappingURL=NeverminedErrors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/errors/NeverminedErrors.ts"],"sourcesContent":["import { Address } from 'viem'\n\nexport class NeverminedNodeError extends Error {\n constructor(message: string) {\n super(`Nevermined Node error: ${message}`)\n }\n}\n\nexport class GraphError extends Error {\n constructor(message: string) {\n super(`Graph error: ${message}`)\n }\n}\n\nexport class HttpError extends Error {\n constructor(message: string, code: number) {\n super(`Http error with code ${code}: ${message}`)\n }\n}\n\nexport class ContractsError extends Error {\n constructor(message: string) {\n super(`Contracts error: ${message}`)\n }\n}\n\nexport class ContractSimulationError extends Error {\n constructor(message: string) {\n super(`Contract simulation error: ${message}`)\n }\n}\n\nexport class Web3Error extends Error {\n constructor(message: string) {\n super(`Web3 error: ${message}`)\n }\n}\n\nexport class ApiError extends Error {\n constructor(message: string) {\n super(`Api error: ${message}`)\n }\n}\n\nexport class NFTError extends Error {\n constructor(message: string) {\n super(`NFT error: ${message}`)\n }\n}\n\nexport class DynamicCreditsOverLimit extends NFTError {\n constructor(message: string) {\n super(`DynamicCreditsOverLimit error: ${message}`)\n }\n}\n\nexport class DynamicCreditsUnderLimit extends NFTError {\n constructor(message: string) {\n super(`DynamicCreditsUnderLimit error: ${message}`)\n }\n}\n\nexport class InvalidAddress extends Error {\n constructor(address?: Address) {\n super(`Invalid Address ${address}`)\n }\n}\n\nexport class NotEnoughBalance extends Error {\n constructor(message: string) {\n super(`NotEnoughBalance: ${message}`)\n }\n}\n\nexport class MethodNotSupported extends Error {\n constructor(message: string) {\n super(`MethodNotSupported: ${message}`)\n }\n}\n\nexport class PlanNotFound extends Error {\n constructor(message: string) {\n super(`PlanNotFound: ${message}`)\n }\n}\n\nexport class AgentNotFound extends Error {\n constructor(message: string) {\n super(`AgentNotFound: ${message}`)\n }\n}\n\nexport class AssetError extends Error {\n constructor(message: string) {\n super(`Asset error: ${message}`)\n }\n}\n\nexport class PaymentFeesNotIncluded extends Error {\n constructor(message: string) {\n super(`PaymentFeesNotIncluded: ${message}`)\n }\n}\n\nexport class DDOError extends Error {\n constructor(message: string, did?: string) {\n if (did) {\n super(`DDO(${did}) error: ${message}`)\n } else {\n super(`DDO error: ${message}`)\n }\n\n // from https://bobbyhadz.com/blog/typescript-extend-error-class\n // 👇️ because we are extending a built-in class\n Object.setPrototypeOf(this, DDOError.prototype)\n }\n}\n\nexport class DDOServiceNotFoundError extends DDOError {\n constructor(serviceType: string, did?: string) {\n super(`Service with type \"${serviceType}\" not found`, did)\n }\n}\n\nexport class DDOServiceAlreadyExists extends DDOError {\n constructor(serviceType: string, index: number) {\n super(`Service with type \"${serviceType}\" and index ${index} already exists`)\n }\n}\n\nexport class DDOConditionNotFoundError extends DDOError {\n constructor(conditionName: string) {\n super(`Condition with name \"${conditionName}\" not found`)\n }\n}\n\nexport class DDOParamNotFoundError extends DDOError {\n constructor(conditionName: string, paramName?: string) {\n super(`Parameter \"${paramName}\" not found on Condition with type \"${conditionName}\"`)\n }\n}\n\nexport class DDOPriceNotFoundError extends DDOError {\n constructor(serviceType: string, did?: string) {\n super(`Service with type \"${serviceType}\" is not priced.`, did)\n }\n}\n\nexport class NvmAccountError extends Error {\n constructor(message: string) {\n super(`NVM Account error: ${message}`)\n }\n}\n"],"names":["NeverminedNodeError","Error","message","GraphError","HttpError","code","ContractsError","ContractSimulationError","Web3Error","ApiError","NFTError","DynamicCreditsOverLimit","DynamicCreditsUnderLimit","InvalidAddress","address","NotEnoughBalance","MethodNotSupported","PlanNotFound","AgentNotFound","AssetError","PaymentFeesNotIncluded","DDOError","did","Object","setPrototypeOf","prototype","DDOServiceNotFoundError","serviceType","DDOServiceAlreadyExists","index","DDOConditionNotFoundError","conditionName","DDOParamNotFoundError","paramName","DDOPriceNotFoundError","NvmAccountError"],"mappings":"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"}
|
package/dist/errors/index.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/errors/index.ts"],"sourcesContent":["export * from './NeverminedErrors.js'\n"],"names":[],"mappings":"AAAA,cAAc,wBAAuB"}
|
package/dist/index.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from './contracts/index.js'\nexport * from './models/index.js'\nexport * from './nevermined/index.js'\nexport * from './nevermined/Nevermined.js'\nexport * from './errors/index.js'\nexport * from './Instantiable.abstract.js'\n\n// Utils\nexport * from './utils/index.js'\n"],"names":[],"mappings":"AAAA,cAAc,uBAAsB;AACpC,cAAc,oBAAmB;AACjC,cAAc,wBAAuB;AACrC,cAAc,6BAA4B;AAC1C,cAAc,oBAAmB;AACjC,cAAc,6BAA4B;AAE1C,QAAQ;AACR,cAAc,mBAAkB"}
|
|
@@ -1,24 +1,43 @@
|
|
|
1
1
|
import { keccak256, toBytes } from 'viem';
|
|
2
2
|
export const NeverminedTypedDataTypes = {
|
|
3
3
|
SessionKey: [
|
|
4
|
-
{
|
|
5
|
-
|
|
4
|
+
{
|
|
5
|
+
name: 'id',
|
|
6
|
+
type: 'string'
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
name: 'data',
|
|
10
|
+
type: 'string'
|
|
11
|
+
}
|
|
6
12
|
],
|
|
7
|
-
SessionKeys: [
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
13
|
+
SessionKeys: [
|
|
14
|
+
{
|
|
15
|
+
name: 'sessionKeys',
|
|
16
|
+
type: 'SessionKey[]'
|
|
17
|
+
}
|
|
12
18
|
],
|
|
19
|
+
Authorization: [
|
|
20
|
+
{
|
|
21
|
+
name: 'from',
|
|
22
|
+
type: 'address'
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
name: 'sessionKeysProvider',
|
|
26
|
+
type: 'string'
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
name: 'sessionKeys',
|
|
30
|
+
type: 'SessionKey[]'
|
|
31
|
+
}
|
|
32
|
+
]
|
|
13
33
|
};
|
|
14
34
|
/**
|
|
15
35
|
* Generate an x402 access token aligned with x402 v2 spec
|
|
16
36
|
*
|
|
17
37
|
* @param options - Token generation options
|
|
18
38
|
* @returns x402 access token with EIP-712 signature
|
|
19
|
-
*/
|
|
20
|
-
|
|
21
|
-
const { subscriber, orderSessionKey, redeemSessionKey, publicClient, planId, schemeVersion = '1', agentId, resource, httpVerb, validUntil, } = options;
|
|
39
|
+
*/ export const generateAgentX402AccessToken = async (options)=>{
|
|
40
|
+
const { subscriber, orderSessionKey, redeemSessionKey, publicClient, planId, schemeVersion = '1', agentId, resource, httpVerb, validUntil } = options;
|
|
22
41
|
// hash the session keys
|
|
23
42
|
const redeemSessionKeyHash = keccak256(toBytes(redeemSessionKey));
|
|
24
43
|
const orderSessionKeyHash = keccak256(toBytes(orderSessionKey));
|
|
@@ -29,26 +48,26 @@ export const generateAgentX402AccessToken = async (options) => {
|
|
|
29
48
|
sessionKeys: [
|
|
30
49
|
{
|
|
31
50
|
id: 'order',
|
|
32
|
-
data: orderSessionKeyHash
|
|
51
|
+
data: orderSessionKeyHash
|
|
33
52
|
},
|
|
34
53
|
{
|
|
35
54
|
id: 'redeem',
|
|
36
|
-
data: redeemSessionKeyHash
|
|
37
|
-
}
|
|
38
|
-
]
|
|
55
|
+
data: redeemSessionKeyHash
|
|
56
|
+
}
|
|
57
|
+
]
|
|
39
58
|
};
|
|
40
59
|
const domain = {
|
|
41
60
|
name: 'Nevermined',
|
|
42
61
|
version: '1',
|
|
43
62
|
chainId: publicClient.chain?.id,
|
|
44
|
-
verifyingContract: subscriber.address
|
|
63
|
+
verifyingContract: subscriber.address
|
|
45
64
|
};
|
|
46
65
|
// generate the eip712 data
|
|
47
66
|
const eip712Data = {
|
|
48
67
|
domain,
|
|
49
68
|
types: NeverminedTypedDataTypes,
|
|
50
69
|
primaryType: 'Authorization',
|
|
51
|
-
message
|
|
70
|
+
message
|
|
52
71
|
};
|
|
53
72
|
const signature = await subscriber.signTypedData(eip712Data);
|
|
54
73
|
// Get network in CAIP-2 format (eip155:chainId)
|
|
@@ -56,23 +75,31 @@ export const generateAgentX402AccessToken = async (options) => {
|
|
|
56
75
|
const network = chainId ? `eip155:${chainId}` : publicClient.chain?.name;
|
|
57
76
|
return {
|
|
58
77
|
x402Version: 2,
|
|
59
|
-
...
|
|
78
|
+
...resource && {
|
|
79
|
+
resource
|
|
80
|
+
},
|
|
60
81
|
accepted: {
|
|
61
82
|
scheme: 'nvm:erc4337',
|
|
62
83
|
network,
|
|
63
84
|
planId,
|
|
64
85
|
extra: {
|
|
65
86
|
version: schemeVersion,
|
|
66
|
-
...
|
|
67
|
-
|
|
68
|
-
|
|
87
|
+
...agentId && {
|
|
88
|
+
agentId
|
|
89
|
+
},
|
|
90
|
+
...httpVerb && {
|
|
91
|
+
httpVerb
|
|
92
|
+
}
|
|
93
|
+
}
|
|
69
94
|
},
|
|
70
95
|
payload: {
|
|
71
96
|
signature,
|
|
72
|
-
authorization: message
|
|
97
|
+
authorization: message
|
|
98
|
+
},
|
|
99
|
+
...validUntil !== undefined && {
|
|
100
|
+
validUntil
|
|
73
101
|
},
|
|
74
|
-
|
|
75
|
-
extensions: {},
|
|
102
|
+
extensions: {}
|
|
76
103
|
};
|
|
77
104
|
};
|
|
78
105
|
/**
|
|
@@ -81,8 +108,7 @@ export const generateAgentX402AccessToken = async (options) => {
|
|
|
81
108
|
* @param accessToken - The x402 access token to verify
|
|
82
109
|
* @param publicClient - Viem public client
|
|
83
110
|
* @returns true if signature is valid
|
|
84
|
-
*/
|
|
85
|
-
export const verifyAgentX402AccessToken = async (accessToken, publicClient) => {
|
|
111
|
+
*/ export const verifyAgentX402AccessToken = async (accessToken, publicClient)=>{
|
|
86
112
|
const erc4337Payload = accessToken.payload;
|
|
87
113
|
// Extract subscriber address from payload.authorization.from
|
|
88
114
|
const subscriberAddress = erc4337Payload.authorization.from;
|
|
@@ -90,7 +116,7 @@ export const verifyAgentX402AccessToken = async (accessToken, publicClient) => {
|
|
|
90
116
|
name: 'Nevermined',
|
|
91
117
|
version: '1',
|
|
92
118
|
chainId: publicClient.chain?.id,
|
|
93
|
-
verifyingContract: subscriberAddress
|
|
119
|
+
verifyingContract: subscriberAddress
|
|
94
120
|
};
|
|
95
121
|
const { signature, authorization } = erc4337Payload;
|
|
96
122
|
const isValid = await publicClient.verifyTypedData({
|
|
@@ -99,7 +125,7 @@ export const verifyAgentX402AccessToken = async (accessToken, publicClient) => {
|
|
|
99
125
|
types: NeverminedTypedDataTypes,
|
|
100
126
|
domain,
|
|
101
127
|
message: authorization,
|
|
102
|
-
primaryType: 'Authorization'
|
|
128
|
+
primaryType: 'Authorization'
|
|
103
129
|
});
|
|
104
130
|
return isValid;
|
|
105
131
|
};
|
|
@@ -108,12 +134,19 @@ export const verifyAgentX402AccessToken = async (accessToken, publicClient) => {
|
|
|
108
134
|
*
|
|
109
135
|
* @param token - The token to validate (unknown type for safety)
|
|
110
136
|
* @returns Validation result with errors if any
|
|
111
|
-
*/
|
|
112
|
-
|
|
113
|
-
|
|
137
|
+
*/ const SUPPORTED_SCHEMES = [
|
|
138
|
+
'nvm:erc4337',
|
|
139
|
+
'nvm:card-delegation'
|
|
140
|
+
];
|
|
141
|
+
export const validateX402TokenStructure = (token)=>{
|
|
114
142
|
const errors = [];
|
|
115
143
|
if (!token || typeof token !== 'object') {
|
|
116
|
-
return {
|
|
144
|
+
return {
|
|
145
|
+
valid: false,
|
|
146
|
+
errors: [
|
|
147
|
+
'Token must be an object'
|
|
148
|
+
]
|
|
149
|
+
};
|
|
117
150
|
}
|
|
118
151
|
const t = token;
|
|
119
152
|
// Validate x402Version
|
|
@@ -123,8 +156,7 @@ export const validateX402TokenStructure = (token) => {
|
|
|
123
156
|
// Validate accepted object
|
|
124
157
|
if (!t.accepted || typeof t.accepted !== 'object') {
|
|
125
158
|
errors.push('accepted is required');
|
|
126
|
-
}
|
|
127
|
-
else {
|
|
159
|
+
} else {
|
|
128
160
|
const accepted = t.accepted;
|
|
129
161
|
const scheme = accepted.scheme;
|
|
130
162
|
if (!SUPPORTED_SCHEMES.includes(scheme)) {
|
|
@@ -136,8 +168,7 @@ export const validateX402TokenStructure = (token) => {
|
|
|
136
168
|
// Validate extra
|
|
137
169
|
if (!accepted.extra || typeof accepted.extra !== 'object') {
|
|
138
170
|
errors.push('extra is required in accepted');
|
|
139
|
-
}
|
|
140
|
-
else {
|
|
171
|
+
} else {
|
|
141
172
|
const extra = accepted.extra;
|
|
142
173
|
if (!extra.version || typeof extra.version !== 'string') {
|
|
143
174
|
errors.push('version is required in accepted.extra');
|
|
@@ -153,8 +184,7 @@ export const validateX402TokenStructure = (token) => {
|
|
|
153
184
|
// Validate payload
|
|
154
185
|
if (!t.payload || typeof t.payload !== 'object') {
|
|
155
186
|
errors.push('payload is required');
|
|
156
|
-
}
|
|
157
|
-
else {
|
|
187
|
+
} else {
|
|
158
188
|
const accepted = t.accepted;
|
|
159
189
|
const scheme = accepted?.scheme;
|
|
160
190
|
const payload = t.payload;
|
|
@@ -164,13 +194,11 @@ export const validateX402TokenStructure = (token) => {
|
|
|
164
194
|
}
|
|
165
195
|
if (!payload.authorization || typeof payload.authorization !== 'object') {
|
|
166
196
|
errors.push('authorization is required in payload');
|
|
167
|
-
}
|
|
168
|
-
else {
|
|
197
|
+
} else {
|
|
169
198
|
const auth = payload.authorization;
|
|
170
199
|
if (!auth.from || typeof auth.from !== 'string') {
|
|
171
200
|
errors.push('from address is required in payload.authorization');
|
|
172
|
-
}
|
|
173
|
-
else if (!auth.from.startsWith('0x')) {
|
|
201
|
+
} else if (!auth.from.startsWith('0x')) {
|
|
174
202
|
errors.push('from must be a valid hex address');
|
|
175
203
|
}
|
|
176
204
|
if (!auth.sessionKeysProvider || typeof auth.sessionKeysProvider !== 'string') {
|
|
@@ -180,8 +208,7 @@ export const validateX402TokenStructure = (token) => {
|
|
|
180
208
|
errors.push('sessionKeys array is required in payload.authorization');
|
|
181
209
|
}
|
|
182
210
|
}
|
|
183
|
-
}
|
|
184
|
-
else if (scheme === 'nvm:card-delegation') {
|
|
211
|
+
} else if (scheme === 'nvm:card-delegation') {
|
|
185
212
|
if (!payload.token || typeof payload.token !== 'string') {
|
|
186
213
|
errors.push('token is required in payload for nvm:card-delegation');
|
|
187
214
|
}
|
|
@@ -191,11 +218,16 @@ export const validateX402TokenStructure = (token) => {
|
|
|
191
218
|
if (t.extensions === undefined) {
|
|
192
219
|
errors.push('extensions is required (can be empty object)');
|
|
193
220
|
}
|
|
194
|
-
return {
|
|
221
|
+
return {
|
|
222
|
+
valid: errors.length === 0,
|
|
223
|
+
errors
|
|
224
|
+
};
|
|
195
225
|
};
|
|
196
|
-
export const b64EncodeX402AccessToken = (accessToken)
|
|
226
|
+
export const b64EncodeX402AccessToken = (accessToken)=>{
|
|
197
227
|
return Buffer.from(JSON.stringify(accessToken)).toString('base64');
|
|
198
228
|
};
|
|
199
|
-
export const b64DecodeX402AccessToken = (encoded)
|
|
229
|
+
export const b64DecodeX402AccessToken = (encoded)=>{
|
|
200
230
|
return JSON.parse(Buffer.from(encoded, 'base64').toString('utf-8'));
|
|
201
231
|
};
|
|
232
|
+
|
|
233
|
+
//# sourceMappingURL=AgentX402AccessToken.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/models/AgentX402AccessToken.ts"],"sourcesContent":["import { keccak256, PublicClient, toBytes, TypedDataDefinition } from 'viem'\nimport { SmartAccount } from 'viem/account-abstraction'\n\n/**\n * x402 Resource information\n */\nexport type X402Resource = {\n url: string\n description?: string\n mimeType?: string\n}\n\n/**\n * Supported x402 payment schemes\n */\nexport type X402Scheme = 'nvm:erc4337' | 'nvm:card-delegation'\n\n/**\n * x402 Accepted scheme fields (common to all schemes)\n */\nexport type X402Accepted = {\n scheme: X402Scheme\n network: string\n planId?: string\n extra: {\n version: string\n agentId?: string\n httpVerb?: string\n }\n}\n\n/**\n * Payload specific to the nvm:erc4337 scheme\n */\nexport type X402Erc4337Payload = {\n signature: `0x${string}`\n authorization: {\n from: `0x${string}`\n sessionKeysProvider: string\n sessionKeys: { id: string; data: string }[]\n }\n}\n\n/**\n * Payload specific to the nvm:card-delegation scheme\n */\nexport type X402CardDelegationPayload = {\n token: string\n}\n\n/**\n * x402 Access Token aligned with x402 v2 spec\n *\n * Key changes from previous version:\n * - `subscriberAddress` moved to `payload.authorization.from`\n * - `planId` is now in `accepted` (optional — required for erc4337, optional for card-delegation)\n * - `agentId` moved to `accepted.extra.agentId` (optional)\n * - `scheme` and `network` moved to `accepted`\n * - Added `resource` and `extensions` for x402 v2 alignment\n */\nexport type AgentX402AccessToken = {\n x402Version: 2\n resource?: X402Resource\n accepted: X402Accepted\n payload: X402Erc4337Payload | X402CardDelegationPayload\n validUntil?: number\n extensions: Record<string, unknown>\n}\n\nexport type NeverminedTypedDataDomain = {\n name: 'Nevermined'\n version: '1'\n chainId: number\n verifyingContract: `0x${string}`\n}\n\nexport type NeverminedTypedData = {\n SessionKey: [{ name: 'id'; type: 'string' }, { name: 'data'; type: 'string' }]\n SessionKeys: [{ name: 'sessionKeys'; type: 'SessionKey[]' }]\n Authorization: [\n { name: 'from'; type: 'address' },\n { name: 'sessionKeysProvider'; type: 'string' },\n { name: 'sessionKeys'; type: 'SessionKey[]' },\n ]\n}\n\nexport const NeverminedTypedDataTypes: NeverminedTypedData = {\n SessionKey: [\n { name: 'id', type: 'string' },\n { name: 'data', type: 'string' },\n ],\n SessionKeys: [{ name: 'sessionKeys', type: 'SessionKey[]' }],\n Authorization: [\n { name: 'from', type: 'address' },\n { name: 'sessionKeysProvider', type: 'string' },\n { name: 'sessionKeys', type: 'SessionKey[]' },\n ],\n}\n\nexport type NeverminedTypedDataMessage = {\n from: `0x${string}`\n sessionKeysProvider: string\n sessionKeys: { id: string; data: string }[]\n}\n\n/**\n * Options for generating an x402 access token\n */\nexport type GenerateX402TokenOptions = {\n subscriber: SmartAccount\n orderSessionKey: string\n redeemSessionKey: string\n publicClient: PublicClient\n planId: string\n /** Scheme version (e.g., '1') - stored in accepted.extra.version */\n schemeVersion?: string\n agentId?: string\n resource?: X402Resource\n httpVerb?: string\n /** Token expiration timestamp in seconds (Unix epoch) */\n validUntil?: number\n}\n\n/**\n * Generate an x402 access token aligned with x402 v2 spec\n *\n * @param options - Token generation options\n * @returns x402 access token with EIP-712 signature\n */\nexport const generateAgentX402AccessToken = async (\n options: GenerateX402TokenOptions,\n): Promise<AgentX402AccessToken> => {\n const {\n subscriber,\n orderSessionKey,\n redeemSessionKey,\n publicClient,\n planId,\n schemeVersion = '1',\n agentId,\n resource,\n httpVerb,\n validUntil,\n } = options\n\n // hash the session keys\n const redeemSessionKeyHash = keccak256(toBytes(redeemSessionKey))\n const orderSessionKeyHash = keccak256(toBytes(orderSessionKey))\n\n // generate the message with `from` address\n const message: NeverminedTypedDataMessage = {\n from: subscriber.address,\n sessionKeysProvider: 'zerodev',\n sessionKeys: [\n {\n id: 'order',\n data: orderSessionKeyHash,\n },\n {\n id: 'redeem',\n data: redeemSessionKeyHash,\n },\n ],\n }\n\n const domain: NeverminedTypedDataDomain = {\n name: 'Nevermined',\n version: '1',\n chainId: publicClient.chain?.id as number,\n verifyingContract: subscriber.address,\n }\n\n // generate the eip712 data\n const eip712Data = {\n domain,\n\n types: NeverminedTypedDataTypes,\n primaryType: 'Authorization',\n message,\n } satisfies TypedDataDefinition<NeverminedTypedData, 'Authorization'>\n\n const signature = await subscriber.signTypedData(eip712Data)\n\n // Get network in CAIP-2 format (eip155:chainId)\n const chainId = publicClient.chain?.id\n const network = chainId ? `eip155:${chainId}` : (publicClient.chain?.name as string)\n\n return {\n x402Version: 2,\n ...(resource && { resource }),\n accepted: {\n scheme: 'nvm:erc4337',\n network,\n planId,\n extra: {\n version: schemeVersion,\n ...(agentId && { agentId }),\n ...(httpVerb && { httpVerb }),\n },\n },\n payload: {\n signature,\n authorization: message,\n },\n ...(validUntil !== undefined && { validUntil }),\n extensions: {},\n }\n}\n\n/**\n * Verify an x402 access token signature\n *\n * @param accessToken - The x402 access token to verify\n * @param publicClient - Viem public client\n * @returns true if signature is valid\n */\nexport const verifyAgentX402AccessToken = async (\n accessToken: AgentX402AccessToken,\n publicClient: PublicClient,\n): Promise<boolean> => {\n const erc4337Payload = accessToken.payload as X402Erc4337Payload\n // Extract subscriber address from payload.authorization.from\n const subscriberAddress = erc4337Payload.authorization.from\n\n const domain: NeverminedTypedDataDomain = {\n name: 'Nevermined',\n version: '1',\n chainId: publicClient.chain?.id as number,\n verifyingContract: subscriberAddress,\n }\n const { signature, authorization } = erc4337Payload\n const isValid = await publicClient.verifyTypedData({\n address: subscriberAddress,\n signature,\n types: NeverminedTypedDataTypes,\n domain,\n message: authorization,\n primaryType: 'Authorization',\n })\n return isValid\n}\n\n/**\n * Validation result for x402 token structure\n */\nexport type X402TokenValidationResult = {\n valid: boolean\n errors: string[]\n}\n\n/**\n * Validate the structure of an x402 access token\n *\n * @param token - The token to validate (unknown type for safety)\n * @returns Validation result with errors if any\n */\nconst SUPPORTED_SCHEMES: X402Scheme[] = ['nvm:erc4337', 'nvm:card-delegation']\n\nexport const validateX402TokenStructure = (token: unknown): X402TokenValidationResult => {\n const errors: string[] = []\n\n if (!token || typeof token !== 'object') {\n return { valid: false, errors: ['Token must be an object'] }\n }\n\n const t = token as Record<string, unknown>\n\n // Validate x402Version\n if (t.x402Version !== 2) {\n errors.push('x402Version must be 2')\n }\n\n // Validate accepted object\n if (!t.accepted || typeof t.accepted !== 'object') {\n errors.push('accepted is required')\n } else {\n const accepted = t.accepted as Record<string, unknown>\n const scheme = accepted.scheme as string\n\n if (!SUPPORTED_SCHEMES.includes(scheme as X402Scheme)) {\n errors.push(`scheme must be one of: ${SUPPORTED_SCHEMES.join(', ')}`)\n }\n\n if (!accepted.network || typeof accepted.network !== 'string') {\n errors.push('network is required in accepted')\n }\n\n // Validate extra\n if (!accepted.extra || typeof accepted.extra !== 'object') {\n errors.push('extra is required in accepted')\n } else {\n const extra = accepted.extra as Record<string, unknown>\n if (!extra.version || typeof extra.version !== 'string') {\n errors.push('version is required in accepted.extra')\n }\n }\n\n // Scheme-specific accepted validation\n if (scheme === 'nvm:erc4337') {\n if (!accepted.planId || typeof accepted.planId !== 'string') {\n errors.push('planId is required in accepted for nvm:erc4337')\n }\n }\n }\n\n // Validate payload\n if (!t.payload || typeof t.payload !== 'object') {\n errors.push('payload is required')\n } else {\n const accepted = t.accepted as Record<string, unknown> | undefined\n const scheme = accepted?.scheme as string | undefined\n const payload = t.payload as Record<string, unknown>\n\n if (scheme === 'nvm:erc4337') {\n if (!payload.signature || typeof payload.signature !== 'string') {\n errors.push('signature is required in payload')\n }\n\n if (!payload.authorization || typeof payload.authorization !== 'object') {\n errors.push('authorization is required in payload')\n } else {\n const auth = payload.authorization as Record<string, unknown>\n\n if (!auth.from || typeof auth.from !== 'string') {\n errors.push('from address is required in payload.authorization')\n } else if (!auth.from.startsWith('0x')) {\n errors.push('from must be a valid hex address')\n }\n\n if (!auth.sessionKeysProvider || typeof auth.sessionKeysProvider !== 'string') {\n errors.push('sessionKeysProvider is required in payload.authorization')\n }\n\n if (!Array.isArray(auth.sessionKeys)) {\n errors.push('sessionKeys array is required in payload.authorization')\n }\n }\n } else if (scheme === 'nvm:card-delegation') {\n if (!payload.token || typeof payload.token !== 'string') {\n errors.push('token is required in payload for nvm:card-delegation')\n }\n }\n }\n\n // Validate extensions (must be present, even if empty)\n if (t.extensions === undefined) {\n errors.push('extensions is required (can be empty object)')\n }\n\n return { valid: errors.length === 0, errors }\n}\n\nexport const b64EncodeX402AccessToken = (accessToken: AgentX402AccessToken): string => {\n return Buffer.from(JSON.stringify(accessToken)).toString('base64')\n}\n\nexport const b64DecodeX402AccessToken = (encoded: string): AgentX402AccessToken => {\n return JSON.parse(Buffer.from(encoded, 'base64').toString('utf-8'))\n}\n"],"names":["keccak256","toBytes","NeverminedTypedDataTypes","SessionKey","name","type","SessionKeys","Authorization","generateAgentX402AccessToken","options","subscriber","orderSessionKey","redeemSessionKey","publicClient","planId","schemeVersion","agentId","resource","httpVerb","validUntil","redeemSessionKeyHash","orderSessionKeyHash","message","from","address","sessionKeysProvider","sessionKeys","id","data","domain","version","chainId","chain","verifyingContract","eip712Data","types","primaryType","signature","signTypedData","network","x402Version","accepted","scheme","extra","payload","authorization","undefined","extensions","verifyAgentX402AccessToken","accessToken","erc4337Payload","subscriberAddress","isValid","verifyTypedData","SUPPORTED_SCHEMES","validateX402TokenStructure","token","errors","valid","t","push","includes","join","auth","startsWith","Array","isArray","length","b64EncodeX402AccessToken","Buffer","JSON","stringify","toString","b64DecodeX402AccessToken","encoded","parse"],"mappings":"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"}
|