@xyo-network/diviner-hash-lease 2.92.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.
Files changed (78) hide show
  1. package/LICENSE +165 -0
  2. package/README.md +13 -0
  3. package/dist/browser/Diviner.d.cts +40 -0
  4. package/dist/browser/Diviner.d.cts.map +1 -0
  5. package/dist/browser/Diviner.d.mts +40 -0
  6. package/dist/browser/Diviner.d.mts.map +1 -0
  7. package/dist/browser/Diviner.d.ts +40 -0
  8. package/dist/browser/Diviner.d.ts.map +1 -0
  9. package/dist/browser/index.cjs +8905 -0
  10. package/dist/browser/index.cjs.map +1 -0
  11. package/dist/browser/index.d.cts +2 -0
  12. package/dist/browser/index.d.cts.map +1 -0
  13. package/dist/browser/index.d.mts +2 -0
  14. package/dist/browser/index.d.mts.map +1 -0
  15. package/dist/browser/index.d.ts +2 -0
  16. package/dist/browser/index.d.ts.map +1 -0
  17. package/dist/browser/index.js +8884 -0
  18. package/dist/browser/index.js.map +1 -0
  19. package/dist/browser/reservedBrands.d.cts +5 -0
  20. package/dist/browser/reservedBrands.d.cts.map +1 -0
  21. package/dist/browser/reservedBrands.d.mts +5 -0
  22. package/dist/browser/reservedBrands.d.mts.map +1 -0
  23. package/dist/browser/reservedBrands.d.ts +5 -0
  24. package/dist/browser/reservedBrands.d.ts.map +1 -0
  25. package/dist/browser/reservedCryptos.d.cts +6 -0
  26. package/dist/browser/reservedCryptos.d.cts.map +1 -0
  27. package/dist/browser/reservedCryptos.d.mts +6 -0
  28. package/dist/browser/reservedCryptos.d.mts.map +1 -0
  29. package/dist/browser/reservedCryptos.d.ts +6 -0
  30. package/dist/browser/reservedCryptos.d.ts.map +1 -0
  31. package/dist/browser/reservedDomains.d.cts +4 -0
  32. package/dist/browser/reservedDomains.d.cts.map +1 -0
  33. package/dist/browser/reservedDomains.d.mts +4 -0
  34. package/dist/browser/reservedDomains.d.mts.map +1 -0
  35. package/dist/browser/reservedDomains.d.ts +4 -0
  36. package/dist/browser/reservedDomains.d.ts.map +1 -0
  37. package/dist/node/Diviner.d.cts +40 -0
  38. package/dist/node/Diviner.d.cts.map +1 -0
  39. package/dist/node/Diviner.d.mts +40 -0
  40. package/dist/node/Diviner.d.mts.map +1 -0
  41. package/dist/node/Diviner.d.ts +40 -0
  42. package/dist/node/Diviner.d.ts.map +1 -0
  43. package/dist/node/index.cjs +8917 -0
  44. package/dist/node/index.cjs.map +1 -0
  45. package/dist/node/index.d.cts +2 -0
  46. package/dist/node/index.d.cts.map +1 -0
  47. package/dist/node/index.d.mts +2 -0
  48. package/dist/node/index.d.mts.map +1 -0
  49. package/dist/node/index.d.ts +2 -0
  50. package/dist/node/index.d.ts.map +1 -0
  51. package/dist/node/index.js +8888 -0
  52. package/dist/node/index.js.map +1 -0
  53. package/dist/node/reservedBrands.d.cts +5 -0
  54. package/dist/node/reservedBrands.d.cts.map +1 -0
  55. package/dist/node/reservedBrands.d.mts +5 -0
  56. package/dist/node/reservedBrands.d.mts.map +1 -0
  57. package/dist/node/reservedBrands.d.ts +5 -0
  58. package/dist/node/reservedBrands.d.ts.map +1 -0
  59. package/dist/node/reservedCryptos.d.cts +6 -0
  60. package/dist/node/reservedCryptos.d.cts.map +1 -0
  61. package/dist/node/reservedCryptos.d.mts +6 -0
  62. package/dist/node/reservedCryptos.d.mts.map +1 -0
  63. package/dist/node/reservedCryptos.d.ts +6 -0
  64. package/dist/node/reservedCryptos.d.ts.map +1 -0
  65. package/dist/node/reservedDomains.d.cts +4 -0
  66. package/dist/node/reservedDomains.d.cts.map +1 -0
  67. package/dist/node/reservedDomains.d.mts +4 -0
  68. package/dist/node/reservedDomains.d.mts.map +1 -0
  69. package/dist/node/reservedDomains.d.ts +4 -0
  70. package/dist/node/reservedDomains.d.ts.map +1 -0
  71. package/package.json +67 -0
  72. package/src/Diviner.ts +130 -0
  73. package/src/index.ts +1 -0
  74. package/src/reservedBrands.ts +2003 -0
  75. package/src/reservedCryptos.json +3760 -0
  76. package/src/reservedCryptos.ts +8 -0
  77. package/src/reservedDomains.ts +3003 -0
  78. package/typedoc.json +5 -0
@@ -0,0 +1,5 @@
1
+ export declare const reservedBrands: {
2
+ name: string;
3
+ value: number;
4
+ }[];
5
+ //# sourceMappingURL=reservedBrands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reservedBrands.d.ts","sourceRoot":"","sources":["../../src/reservedBrands.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,cAAc;;;GAi9D1B,CAAA"}
@@ -0,0 +1,5 @@
1
+ export declare const reservedBrands: {
2
+ name: string;
3
+ value: number;
4
+ }[];
5
+ //# sourceMappingURL=reservedBrands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reservedBrands.d.ts","sourceRoot":"","sources":["../../src/reservedBrands.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,cAAc;;;GAi9D1B,CAAA"}
@@ -0,0 +1,5 @@
1
+ export declare const reservedBrands: {
2
+ name: string;
3
+ value: number;
4
+ }[];
5
+ //# sourceMappingURL=reservedBrands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reservedBrands.d.ts","sourceRoot":"","sources":["../../src/reservedBrands.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,cAAc;;;GAi9D1B,CAAA"}
@@ -0,0 +1,6 @@
1
+ export interface Crypto {
2
+ name: string;
3
+ symbol: string;
4
+ }
5
+ export declare const reservedCryptos: Crypto[];
6
+ //# sourceMappingURL=reservedCryptos.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reservedCryptos.d.ts","sourceRoot":"","sources":["../../src/reservedCryptos.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;CACf;AAED,eAAO,MAAM,eAAe,EAAE,MAAM,EAAkF,CAAA"}
@@ -0,0 +1,6 @@
1
+ export interface Crypto {
2
+ name: string;
3
+ symbol: string;
4
+ }
5
+ export declare const reservedCryptos: Crypto[];
6
+ //# sourceMappingURL=reservedCryptos.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reservedCryptos.d.ts","sourceRoot":"","sources":["../../src/reservedCryptos.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;CACf;AAED,eAAO,MAAM,eAAe,EAAE,MAAM,EAAkF,CAAA"}
@@ -0,0 +1,6 @@
1
+ export interface Crypto {
2
+ name: string;
3
+ symbol: string;
4
+ }
5
+ export declare const reservedCryptos: Crypto[];
6
+ //# sourceMappingURL=reservedCryptos.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reservedCryptos.d.ts","sourceRoot":"","sources":["../../src/reservedCryptos.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;CACf;AAED,eAAO,MAAM,eAAe,EAAE,MAAM,EAAkF,CAAA"}
@@ -0,0 +1,4 @@
1
+ export declare const reservedDomains: {
2
+ name: string;
3
+ }[];
4
+ //# sourceMappingURL=reservedDomains.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reservedDomains.d.ts","sourceRoot":"","sources":["../../src/reservedDomains.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,eAAe;;GAy7F3B,CAAA"}
@@ -0,0 +1,4 @@
1
+ export declare const reservedDomains: {
2
+ name: string;
3
+ }[];
4
+ //# sourceMappingURL=reservedDomains.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reservedDomains.d.ts","sourceRoot":"","sources":["../../src/reservedDomains.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,eAAe;;GAy7F3B,CAAA"}
@@ -0,0 +1,4 @@
1
+ export declare const reservedDomains: {
2
+ name: string;
3
+ }[];
4
+ //# sourceMappingURL=reservedDomains.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reservedDomains.d.ts","sourceRoot":"","sources":["../../src/reservedDomains.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,eAAe;;GAy7F3B,CAAA"}
package/package.json ADDED
@@ -0,0 +1,67 @@
1
+ {
2
+ "name": "@xyo-network/diviner-hash-lease",
3
+ "author": {
4
+ "email": "support@xyo.network",
5
+ "name": "XYO Development Team",
6
+ "url": "https://xyo.network"
7
+ },
8
+ "bugs": {
9
+ "email": "support@xyo.network",
10
+ "url": "https://github.com/XYOracleNetwork/sdk-xyo-client-js/issues"
11
+ },
12
+ "dependencies": {
13
+ "@xylabs/assert": "^3.0.11",
14
+ "@xyo-network/archivist-model": "~2.92.2",
15
+ "@xyo-network/diviner-abstract": "~2.92.2",
16
+ "@xyo-network/diviner-model": "~2.92.2",
17
+ "@xyo-network/module-model": "~2.92.2",
18
+ "@xyo-network/payload-builder": "~2.92.2",
19
+ "@xyo-network/payload-model": "~2.92.2"
20
+ },
21
+ "devDependencies": {
22
+ "@xylabs/ts-scripts-yarn3": "^3.5.2",
23
+ "@xylabs/tsconfig": "^3.5.2",
24
+ "typescript": "^5.4.2"
25
+ },
26
+ "description": "Primary SDK for using XYO Protocol 2.0",
27
+ "types": "dist/node/index.d.ts",
28
+ "exports": {
29
+ ".": {
30
+ "browser": {
31
+ "require": {
32
+ "types": "./dist/browser/index.d.cts",
33
+ "default": "./dist/browser/index.cjs"
34
+ },
35
+ "import": {
36
+ "types": "./dist/browser/index.d.mts",
37
+ "default": "./dist/browser/index.js"
38
+ }
39
+ },
40
+ "node": {
41
+ "require": {
42
+ "types": "./dist/node/index.d.cts",
43
+ "default": "./dist/node/index.cjs"
44
+ },
45
+ "import": {
46
+ "types": "./dist/node/index.d.mts",
47
+ "default": "./dist/node/index.js"
48
+ }
49
+ }
50
+ },
51
+ "./package.json": "./package.json"
52
+ },
53
+ "main": "dist/node/index.cjs",
54
+ "module": "dist/node/index.js",
55
+ "homepage": "https://xyo.network",
56
+ "license": "LGPL-3.0-only",
57
+ "publishConfig": {
58
+ "access": "public"
59
+ },
60
+ "repository": {
61
+ "type": "git",
62
+ "url": "https://github.com/XYOracleNetwork/sdk-xyo-client-js.git"
63
+ },
64
+ "sideEffects": false,
65
+ "version": "2.92.2",
66
+ "type": "module"
67
+ }
package/src/Diviner.ts ADDED
@@ -0,0 +1,130 @@
1
+ import { assertEx } from '@xylabs/assert'
2
+ import { ArchivistParams } from '@xyo-network/archivist-model'
3
+ import { AbstractDiviner } from '@xyo-network/diviner-abstract'
4
+ import { DivinerConfig } from '@xyo-network/diviner-model'
5
+ import { AnyConfigSchema, creatableModule } from '@xyo-network/module-model'
6
+ import { PayloadBuilder } from '@xyo-network/payload-builder'
7
+ import { isPayloadOfSchemaTypeWithMeta, Payload, WithSources } from '@xyo-network/payload-model'
8
+
9
+ import { reservedBrands } from './reservedBrands'
10
+ import { reservedCryptos } from './reservedCryptos'
11
+ import { reservedDomains } from './reservedDomains'
12
+
13
+ const ONE_YEAR = 1000 * 60 * 60 * 24 * 365
14
+
15
+ export const HashLeaseEstimateDivinerConfigSchema = 'network.xyo.diviner.hash.lease.estimate.config'
16
+ export type HashLeaseEstimateDivinerConfigSchema = typeof HashLeaseEstimateDivinerConfigSchema
17
+
18
+ export type HashLeaseEstimateDivinerConfig = DivinerConfig<
19
+ {
20
+ baseMonthlyPrice?: number
21
+ characterLengthFactor?: number
22
+ minNameLength?: number
23
+ },
24
+ HashLeaseEstimateDivinerConfigSchema
25
+ >
26
+
27
+ export type HashLeaseEstimateDivinerParams<
28
+ TConfig extends AnyConfigSchema<HashLeaseEstimateDivinerConfig> = AnyConfigSchema<HashLeaseEstimateDivinerConfig>,
29
+ > = ArchivistParams<TConfig>
30
+
31
+ export const NameSchema = 'network.xyo.name'
32
+ export type NameSchema = typeof NameSchema
33
+
34
+ export type Name = Payload<{ name: string }, NameSchema>
35
+
36
+ export const HashLeaseSchema = 'network.xyo.hash.lease'
37
+ export type HashLeaseSchema = typeof HashLeaseSchema
38
+
39
+ export type HashLease = Payload<
40
+ {
41
+ expire: number
42
+ },
43
+ HashLeaseSchema
44
+ >
45
+
46
+ export const HashLeaseEstimateSchema = 'network.xyo.hash.lease.estimate'
47
+ export type HashLeaseEstimateSchema = typeof HashLeaseEstimateSchema
48
+
49
+ export type HashLeaseEstimate = Payload<{ price: number }, HashLeaseEstimateSchema>
50
+
51
+ @creatableModule()
52
+ export class HashLeaseEstimateDiviner<
53
+ TParams extends HashLeaseEstimateDivinerParams = HashLeaseEstimateDivinerParams,
54
+ TIn extends WithSources<HashLease> | Name = WithSources<HashLease> | Name,
55
+ > extends AbstractDiviner<TParams, TIn, HashLeaseEstimate> {
56
+ static override targetSchema = HashLeaseEstimateSchema
57
+
58
+ private _reservedFragments: string[] = ['xyo', 'xy', 'coin', 'lifehash', 'foreventry']
59
+
60
+ private _reservedStrings?: string[]
61
+
62
+ get baseMonthlyPrice() {
63
+ return this.config.baseMonthlyPrice ?? 4
64
+ }
65
+
66
+ get characterLengthFactor() {
67
+ return this.config.characterLengthFactor ?? 10
68
+ }
69
+
70
+ get minNameLength() {
71
+ return this.config.minNameLength ?? 3
72
+ }
73
+
74
+ get reservedStrings() {
75
+ this._reservedStrings =
76
+ this._reservedStrings ??
77
+ [
78
+ reservedBrands.map(({ name }) => name),
79
+ ...reservedDomains.map(({ name }) => name.split('.')),
80
+ ...reservedCryptos.map(({ name, symbol }) => [name, symbol]),
81
+ ]
82
+ .flat()
83
+ .map((item) => item.toLowerCase())
84
+ return this._reservedStrings
85
+ }
86
+
87
+ protected override async divineHandler(payloads: TIn[] = []): Promise<WithSources<HashLeaseEstimate>[]> {
88
+ const leases = await PayloadBuilder.build(
89
+ payloads.filter(isPayloadOfSchemaTypeWithMeta<WithSources<HashLease>>(HashLeaseSchema)) as WithSources<HashLease>[],
90
+ )
91
+ const payloadMap = await PayloadBuilder.toDataHashMap(payloads)
92
+ return leases.map((lease) => {
93
+ const sources = lease.sources ?? []
94
+ assertEx(sources.length === 1, 'Must pass single source')
95
+ const leaseSource = assertEx(sources.at(0), 'Failed to load lease source')
96
+ const sourcePayload = assertEx(payloadMap[leaseSource], 'Hash lease payload not provided')
97
+ assertEx(sourcePayload.schema === NameSchema, () => `Invalid source schema [${sourcePayload.schema}]`)
98
+ const sourceName = sourcePayload as Name
99
+
100
+ const duration = lease.expire - Date.now()
101
+
102
+ assertEx(duration <= ONE_YEAR, 'Max expiration may be one year in the future')
103
+ assertEx(duration >= ONE_YEAR / 2, 'Min expiration must be half year in the future')
104
+
105
+ //check if all lowercase
106
+ assertEx(sourceName.name.toLowerCase() === sourceName.name, 'name must be lowercase')
107
+
108
+ //check if min length
109
+ assertEx(sourceName.name.length >= this.minNameLength, 'name must be at least 3 characters')
110
+
111
+ //check if in one of the reserved name lists
112
+ assertEx(!this.reservedStrings.includes(sourceName.name), 'Reserved name')
113
+
114
+ //check if any of our fragments are in the name
115
+ for (const reserved of this._reservedFragments) {
116
+ assertEx(!sourceName.name.includes(reserved), 'Reserved name fragment')
117
+ }
118
+ const price = this.calculateLengthCost(sourceName.name, duration)
119
+ return { price, schema: HashLeaseEstimateSchema, sources: [lease.$hash] }
120
+ })
121
+ }
122
+
123
+ private calculateLengthCost(name: string, duration: number) {
124
+ const exponent = this.characterLengthFactor / name.length
125
+ const rawMonthlyCost = Math.pow(this.baseMonthlyPrice, exponent)
126
+ const months = (duration / ONE_YEAR) * 12
127
+ const proratedAnnualPrice = months * rawMonthlyCost
128
+ return Math.floor(proratedAnnualPrice)
129
+ }
130
+ }
package/src/index.ts ADDED
@@ -0,0 +1 @@
1
+ export * from './Diviner'