{"_id":"@atomichub/atomicmarket","_rev":"10-54e86a13825fc4af6d9c686567afa213","name":"@atomichub/atomicmarket","dist-tags":{"latest":"2.5.0"},"versions":{"2.0.0":{"name":"@atomichub/atomicmarket","version":"2.0.0","keywords":["atomicmarket","atomicassets","atomichub","wax","antelope","eosio","nft","blockchain","sdk"],"author":{"name":"AtomicHub"},"license":"MIT","_id":"@atomichub/atomicmarket@2.0.0","maintainers":[{"name":"robrigo","email":"rob@atomichub.io"}],"homepage":"https://github.com/atomicassets/atomicmarket-sdk","bugs":{"url":"https://github.com/atomicassets/atomicmarket-sdk/issues"},"dist":{"shasum":"0aa19288f9cb0588e03bd7954df3a87dee63b585","tarball":"https://registry.npmjs.org/@atomichub/atomicmarket/-/atomicmarket-2.0.0.tgz","fileCount":10,"integrity":"sha512-Khw6re5SgYP5zGV8Tb4xZrLlUzeVvYQpwsJhmAKhmYPWgX0auAlQYIPSuIrNapusHpe46HeczsQJjx8aX5m3FQ==","signatures":[{"sig":"MEYCIQC1AfLfHQCsi1pqUfNt3akdb2RXAtdFJsDl9G+Vt/mA6AIhAJR+2bThlWbRw0yADr/JjPc3Fdf5TPbTNvJqhZWeDSDn","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":171412},"main":"build/index.cjs","types":"build/index.d.ts","module":"build/index.mjs","engines":{"node":">=20"},"exports":{".":{"import":{"types":"./build/index.d.mts","default":"./build/index.mjs"},"require":{"types":"./build/index.d.ts","default":"./build/index.cjs"}},"./package.json":"./package.json"},"gitHead":"b1fb4f8311634f364ec57239dadeb7fbdf9bc96e","scripts":{"lint":"eslint .","test":"mocha -r ts-node/register/transpile-only test/**/*.test.ts","build":"tsup","prepack":"tsup","prepare":"tsup","pretest":"tsup","check-types":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json"},"_npmUser":{"name":"robrigo","email":"rob@atomichub.io"},"deprecated":"Depends on a git ref rather than the published @atomichub/atomicassets; use 2.0.1 or later","repository":{"url":"git+https://github.com/atomicassets/atomicmarket-sdk.git","type":"git"},"_npmVersion":"11.16.0","description":"JavaScript/TypeScript SDK for the AtomicMarket NFT marketplace contract on Antelope chains: read sales, auctions, and royalties, and build v2 royalty actions","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@atomichub/atomicassets":"git+https://github.com/atomicassets/atomicassets-sdk.git#feat/v2-modernization"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.4.1","tsup":"^8.5.1","mocha":"^11.0.0","eslint":"^9.17.0","ts-node":"^10.9.2","typescript":"^6.0.0","@types/chai":"^4.3.11","@types/node":"^22.0.0","@types/mocha":"^10.0.6","typescript-eslint":"^8.59.0"},"_npmOperationalInternal":{"tmp":"tmp/atomicmarket_2.0.0_1785008787545_0.33050068737080407","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"@atomichub/atomicmarket","version":"2.0.1","keywords":["atomicmarket","atomicassets","atomichub","wax","antelope","eosio","nft","blockchain","sdk"],"author":{"name":"AtomicHub"},"license":"MIT","_id":"@atomichub/atomicmarket@2.0.1","maintainers":[{"name":"robrigo","email":"rob@atomichub.io"}],"homepage":"https://github.com/atomicassets/atomicmarket-sdk","bugs":{"url":"https://github.com/atomicassets/atomicmarket-sdk/issues"},"dist":{"shasum":"863cdb506af0fc079a1c27f7fa56d7400f06f5e0","tarball":"https://registry.npmjs.org/@atomichub/atomicmarket/-/atomicmarket-2.0.1.tgz","fileCount":10,"integrity":"sha512-ATAOlLnx4vLe83IuHuwcs8IH8HEbhc2s1veeqhs+zVfyo2X9nRsdPHwREbASN2jMLZBmJQ46vbrIFE8slX4TXw==","signatures":[{"sig":"MEUCIGoz4euxSvRnqyD9MUWuki7Cn8LLwIOlQR8cj1PDMBpeAiEAodYZC7wClewuzMmEdhAGAyxOUMxVU7QQHkvuKAobzQY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@atomichub%2fatomicmarket@2.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":179128},"main":"build/index.cjs","types":"build/index.d.ts","module":"build/index.mjs","engines":{"node":">=20"},"exports":{".":{"import":{"types":"./build/index.d.mts","default":"./build/index.mjs"},"require":{"types":"./build/index.d.ts","default":"./build/index.cjs"}},"./package.json":"./package.json"},"gitHead":"95aeb5520e6bd3c8d63bab620979b187b8e6b2e3","scripts":{"lint":"eslint .","test":"mocha -r ts-node/register/transpile-only test/**/*.test.ts","build":"tsup","prepack":"tsup","prepare":"tsup","pretest":"tsup","check-types":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9cf1c11c-9dde-444e-a0cc-9bf8ec6b6841"}},"repository":{"url":"git+https://github.com/atomicassets/atomicmarket-sdk.git","type":"git"},"_npmVersion":"12.0.1","description":"JavaScript/TypeScript SDK for the AtomicMarket NFT marketplace contract on Antelope chains: read sales, auctions, and royalties, and build v2 royalty actions","directories":{},"_nodeVersion":"22.23.1","dependencies":{"@atomichub/atomicassets":"^2.0.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.4.1","tsup":"^8.5.1","mocha":"^11.0.0","eslint":"^9.17.0","ts-node":"^10.9.2","typescript":"^6.0.0","@types/chai":"^4.3.11","@types/node":"^22.0.0","@types/mocha":"^10.0.6","typescript-eslint":"^8.59.0"},"_npmOperationalInternal":{"tmp":"tmp/atomicmarket_2.0.1_1785013272108_0.1079776723147543","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"@atomichub/atomicmarket","version":"2.1.0","keywords":["atomicmarket","atomicassets","atomichub","wax","antelope","eosio","nft","blockchain","sdk"],"author":{"name":"AtomicHub"},"license":"MIT","_id":"@atomichub/atomicmarket@2.1.0","maintainers":[{"name":"robrigo","email":"rob@atomichub.io"}],"homepage":"https://github.com/atomicassets/atomicmarket-sdk","bugs":{"url":"https://github.com/atomicassets/atomicmarket-sdk/issues"},"dist":{"shasum":"a938ea41d3d9a8b8662b1ea39e10ae06794edc72","tarball":"https://registry.npmjs.org/@atomichub/atomicmarket/-/atomicmarket-2.1.0.tgz","fileCount":10,"integrity":"sha512-bKnt8vzKL8RwoBC8YdZGSjzscsO9Nyl3C+VFd6DyweqgKxUu7qZR1EY3jSZxx5ZTL7VB0bDzDnb3HaVpEqYmQg==","signatures":[{"sig":"MEUCIQDgD2jDFjyrSMU1nojc/GbqhX/KVLrTmtWGe9+UQaxFYwIgHHbzkfTOGhicd+NVBBK04MVZbRYoYdpbvko1cGRuNZU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@atomichub%2fatomicmarket@2.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":209426},"main":"build/index.cjs","types":"build/index.d.ts","module":"build/index.mjs","engines":{"node":">=20"},"exports":{".":{"import":{"types":"./build/index.d.mts","default":"./build/index.mjs"},"require":{"types":"./build/index.d.ts","default":"./build/index.cjs"}},"./package.json":"./package.json"},"gitHead":"30b49b792edb5c2714bc6d995028def1a317e056","scripts":{"lint":"eslint .","test":"mocha -r ts-node/register/transpile-only test/**/*.test.ts","build":"tsup","prepack":"tsup","prepare":"tsup","pretest":"tsup","check-types":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9cf1c11c-9dde-444e-a0cc-9bf8ec6b6841"}},"repository":{"url":"git+https://github.com/atomicassets/atomicmarket-sdk.git","type":"git"},"_npmVersion":"12.0.2","description":"JavaScript/TypeScript SDK for the AtomicMarket NFT marketplace contract on Antelope chains: read sales, auctions, and royalties, and build sale, RAM-payment, and v2 royalty actions","directories":{},"_nodeVersion":"22.23.1","dependencies":{"@atomichub/atomicassets":"^2.0.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.4.1","tsup":"^8.5.1","mocha":"^11.0.0","eslint":"^9.17.0","ts-node":"^10.9.2","typescript":"^6.0.0","@types/chai":"^4.3.11","@types/node":"^22.0.0","@types/mocha":"^10.0.6","typescript-eslint":"^8.59.0"},"_npmOperationalInternal":{"tmp":"tmp/atomicmarket_2.1.0_1785534371046_0.8515235576163074","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"@atomichub/atomicmarket","version":"2.2.0","keywords":["atomicmarket","atomicassets","atomichub","wax","antelope","eosio","nft","blockchain","sdk"],"author":{"name":"AtomicHub"},"license":"MIT","_id":"@atomichub/atomicmarket@2.2.0","maintainers":[{"name":"robrigo","email":"rob@atomichub.io"}],"homepage":"https://github.com/atomicassets/atomicmarket-sdk","bugs":{"url":"https://github.com/atomicassets/atomicmarket-sdk/issues"},"dist":{"shasum":"9150fa384a3f1484f9ffccc501d106817057f3a5","tarball":"https://registry.npmjs.org/@atomichub/atomicmarket/-/atomicmarket-2.2.0.tgz","fileCount":10,"integrity":"sha512-mxNjiFAoQauHlZGorZEOEPTXTFoLwqfyPPntd7NG45XpgKLAjX9AIY7RHa0jwK5qhZUEpv0KPLXiHpMGDB10Ow==","signatures":[{"sig":"MEUCIQDJX51URL2dca/QQKRBCSC0F71My/RoPiOmPYv6/WVRwwIgdimVco9qJPiUOD+htYEV5IdgbYEwkwgAe5gHYxpa1mY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@atomichub%2fatomicmarket@2.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":266981},"main":"build/index.cjs","types":"build/index.d.ts","module":"build/index.mjs","engines":{"node":">=20"},"exports":{".":{"import":{"types":"./build/index.d.mts","default":"./build/index.mjs"},"require":{"types":"./build/index.d.ts","default":"./build/index.cjs"}},"./package.json":"./package.json"},"gitHead":"1c0bf0e8e960c2394e046bdcf60804c9ea8bce0a","scripts":{"lint":"eslint .","test":"mocha -r ts-node/register/transpile-only test/**/*.test.ts","build":"tsup","prepack":"tsup","prepare":"tsup","pretest":"tsup","check-types":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9cf1c11c-9dde-444e-a0cc-9bf8ec6b6841"}},"repository":{"url":"git+https://github.com/atomicassets/atomicmarket-sdk.git","type":"git"},"_npmVersion":"12.0.2","description":"JavaScript/TypeScript SDK for the AtomicMarket NFT marketplace contract on Antelope chains: read sales, auctions, and royalties, and build sale, RAM-payment, and v2 royalty actions","directories":{},"_nodeVersion":"22.23.1","dependencies":{"@atomichub/atomicassets":"^2.0.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.4.1","tsup":"^8.5.1","mocha":"^11.0.0","eslint":"^9.17.0","ts-node":"^10.9.2","typescript":"^6.0.0","@types/chai":"^4.3.11","@types/node":"^22.0.0","@types/mocha":"^10.0.6","typescript-eslint":"^8.59.0"},"_npmOperationalInternal":{"tmp":"tmp/atomicmarket_2.2.0_1785879572730_0.26975958146365997","host":"s3://npm-registry-packages-npm-production"}},"2.2.1":{"name":"@atomichub/atomicmarket","version":"2.2.1","keywords":["atomicmarket","atomicassets","atomichub","wax","antelope","eosio","nft","blockchain","sdk"],"author":{"name":"AtomicHub"},"license":"MIT","_id":"@atomichub/atomicmarket@2.2.1","maintainers":[{"name":"robrigo","email":"rob@atomichub.io"}],"homepage":"https://github.com/atomicassets/atomicmarket-sdk","bugs":{"url":"https://github.com/atomicassets/atomicmarket-sdk/issues"},"dist":{"shasum":"13556e58cf003d5c8083d13e441301b618da85db","tarball":"https://registry.npmjs.org/@atomichub/atomicmarket/-/atomicmarket-2.2.1.tgz","fileCount":10,"integrity":"sha512-dcq9h950P59YjOgBslY9ShwdXNF/NafQDlSzmj/VnpbXzHORB/MP0HkVxYYAosgNNJoGqAVOxIvSZ6xkztwkLw==","signatures":[{"sig":"MEUCIQDmAfAqaIBKGVNwmalGIBzPpOtffKlhdzKPm5hY4E/R0AIgan7Y9laWoIWP03JdxyX1x61a+eN525RHvy/k0tVShks=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@atomichub%2fatomicmarket@2.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":268792},"main":"build/index.cjs","types":"build/index.d.ts","module":"build/index.mjs","engines":{"node":">=20"},"exports":{".":{"import":{"types":"./build/index.d.mts","default":"./build/index.mjs"},"require":{"types":"./build/index.d.ts","default":"./build/index.cjs"}},"./package.json":"./package.json"},"gitHead":"e2e96c59231ea4c420215b2804d0f78bccca799a","scripts":{"lint":"eslint .","test":"mocha -r ts-node/register/transpile-only test/**/*.test.ts","build":"tsup","prepack":"tsup","prepare":"tsup","pretest":"tsup","check-types":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9cf1c11c-9dde-444e-a0cc-9bf8ec6b6841"}},"repository":{"url":"git+https://github.com/atomicassets/atomicmarket-sdk.git","type":"git"},"_npmVersion":"12.0.2","description":"JavaScript/TypeScript SDK for the AtomicMarket NFT marketplace contract on Antelope chains: read sales, auctions, and royalties, and build sale, RAM-payment, and v2 royalty actions","directories":{},"_nodeVersion":"22.23.2","dependencies":{"@atomichub/atomicassets":"^2.0.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.4.1","tsup":"^8.5.1","mocha":"^11.0.0","eslint":"^9.17.0","ts-node":"^10.9.2","typescript":"^6.0.0","@types/chai":"^4.3.11","@types/node":"^22.0.0","@types/mocha":"^10.0.6","typescript-eslint":"^8.59.0"},"_npmOperationalInternal":{"tmp":"tmp/atomicmarket_2.2.1_1786903855181_0.13139767366822808","host":"s3://npm-registry-packages-npm-production"}},"2.3.0":{"name":"@atomichub/atomicmarket","version":"2.3.0","keywords":["atomicmarket","atomicassets","atomichub","wax","antelope","eosio","nft","blockchain","sdk"],"author":{"name":"AtomicHub"},"license":"MIT","_id":"@atomichub/atomicmarket@2.3.0","maintainers":[{"name":"robrigo","email":"rob@atomichub.io"}],"homepage":"https://github.com/atomicassets/atomicmarket-sdk","bugs":{"url":"https://github.com/atomicassets/atomicmarket-sdk/issues"},"dist":{"shasum":"00b9916b710df3abb7118105c3c1ebf5c24a3cd2","tarball":"https://registry.npmjs.org/@atomichub/atomicmarket/-/atomicmarket-2.3.0.tgz","fileCount":10,"integrity":"sha512-ZXlMWqTPHPFmpaCuxpjt4m/CzfHZU5hKSvmdVSDMVvu2SYfmnjtXgydIVGPgw8FtVMZCm3LwSPoJAtrbNiiRDg==","signatures":[{"sig":"MEUCIQDcD6LZoZqvuC2rpy1rcWNyY1bEwf3rK9yNhNV/cWWvywIgF7yoc8dvK3ca8EEzalOF4qQgr3OfPYE2uaZzkI1/zC4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@atomichub%2fatomicmarket@2.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":426518},"main":"build/index.cjs","types":"build/index.d.ts","module":"build/index.mjs","engines":{"node":">=20"},"exports":{".":{"import":{"types":"./build/index.d.mts","default":"./build/index.mjs"},"require":{"types":"./build/index.d.ts","default":"./build/index.cjs"}},"./package.json":"./package.json"},"gitHead":"36aee589e23cc823717db35eae62f7339732b58c","scripts":{"lint":"eslint .","test":"mocha -r ts-node/register/transpile-only test/**/*.test.ts","build":"tsup","prepack":"tsup","prepare":"tsup","pretest":"tsup","check-types":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9cf1c11c-9dde-444e-a0cc-9bf8ec6b6841"}},"repository":{"url":"git+https://github.com/atomicassets/atomicmarket-sdk.git","type":"git"},"_npmVersion":"12.0.2","description":"JavaScript/TypeScript SDK for the AtomicMarket NFT marketplace contract on Antelope chains: read sales, auctions, and royalties, and build sale, auction, buyoffer, template-buyoffer, RAM-payment, and v2 royalty actions","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{"@atomichub/atomicassets":"^2.0.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.4.1","tsup":"^8.5.1","mocha":"^11.0.0","eslint":"^9.17.0","ts-node":"^10.9.2","typescript":"^6.0.0","@types/chai":"^4.3.11","@types/node":"^22.0.0","@types/mocha":"^10.0.6","typescript-eslint":"^8.59.0"},"_npmOperationalInternal":{"tmp":"tmp/atomicmarket_2.3.0_1786905352833_0.7596180854986501","host":"s3://npm-registry-packages-npm-production"}},"2.4.0":{"name":"@atomichub/atomicmarket","version":"2.4.0","keywords":["atomicmarket","atomicassets","atomichub","wax","antelope","eosio","nft","blockchain","sdk"],"author":{"name":"AtomicHub"},"license":"MIT","_id":"@atomichub/atomicmarket@2.4.0","maintainers":[{"name":"robrigo","email":"rob@atomichub.io"}],"homepage":"https://github.com/atomicassets/atomicmarket-sdk","bugs":{"url":"https://github.com/atomicassets/atomicmarket-sdk/issues"},"dist":{"shasum":"c52e731e45e06181c120ecc3bf3c4c603f19a2a7","tarball":"https://registry.npmjs.org/@atomichub/atomicmarket/-/atomicmarket-2.4.0.tgz","fileCount":10,"integrity":"sha512-+SA2RKD6atYRmXGSj+1mKkPnfJyi6+jwggBH5pjXPg5Xguwbsx07qyNNv18dgB3NaavlWw8es4YtUNF2XSRgYw==","signatures":[{"sig":"MEYCIQCS42ZlIJQVF1zfWkZf0mHE9h+bmvPysyG1RYzUIC0yAgIhANE0hbKu9FDfPIaFPDQskQc4Infpu5D71TRgSwWSEhrv","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@atomichub%2fatomicmarket@2.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":452021},"main":"build/index.cjs","types":"build/index.d.ts","module":"build/index.mjs","engines":{"node":">=20"},"exports":{".":{"import":{"types":"./build/index.d.mts","default":"./build/index.mjs"},"require":{"types":"./build/index.d.ts","default":"./build/index.cjs"}},"./package.json":"./package.json"},"gitHead":"2c917236f7f9da6f37105c73ff4ea6781715f5d6","scripts":{"lint":"eslint .","test":"mocha -r ts-node/register/transpile-only test/**/*.test.ts","build":"tsup","prepack":"tsup","prepare":"tsup","pretest":"tsup","check-types":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9cf1c11c-9dde-444e-a0cc-9bf8ec6b6841"}},"repository":{"url":"git+https://github.com/atomicassets/atomicmarket-sdk.git","type":"git"},"_npmVersion":"12.0.2","description":"JavaScript/TypeScript SDK for the AtomicMarket NFT marketplace contract on Antelope chains: read sales, auctions, and royalties, and build sale, auction, buyoffer, template-buyoffer, RAM-payment, and v2 royalty actions","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{"@atomichub/atomicassets":"^2.0.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.4.1","tsup":"^8.5.1","mocha":"^11.0.0","eslint":"^9.17.0","ts-node":"^10.9.2","typescript":"^6.0.0","@types/chai":"^4.3.11","@types/node":"^22.0.0","@types/mocha":"^10.0.6","typescript-eslint":"^8.59.0"},"_npmOperationalInternal":{"tmp":"tmp/atomicmarket_2.4.0_1787004095704_0.9708606328881704","host":"s3://npm-registry-packages-npm-production"}},"2.4.1":{"name":"@atomichub/atomicmarket","version":"2.4.1","keywords":["atomicmarket","atomicassets","atomichub","wax","antelope","eosio","nft","blockchain","sdk"],"author":{"url":"https://atomichub.io","name":"AtomicHub"},"license":"MIT","_id":"@atomichub/atomicmarket@2.4.1","maintainers":[{"name":"robrigo","email":"rob@atomichub.io"}],"homepage":"https://github.com/atomicassets/atomicmarket-sdk","bugs":{"url":"https://github.com/atomicassets/atomicmarket-sdk/issues"},"dist":{"shasum":"d2c5e478af314e076a1afe52c3219dd1ec678165","tarball":"https://registry.npmjs.org/@atomichub/atomicmarket/-/atomicmarket-2.4.1.tgz","fileCount":10,"integrity":"sha512-RnDfu4AmGMzQdOP/CoXcpX56vjNoZEbjbIICjabKloZH6o6xLLjwudk6VL9RleeHiY0i4TYeIJx8HVRriG16GA==","signatures":[{"sig":"MEUCICjNzYmDJU+P4yl4kgGrK82EpDSMKczl8EDVnVET52iFAiEAuqiDlGzriStA0zOKobEllv+014tTlEwCGZsl0kWSXi4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@atomichub%2fatomicmarket@2.4.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":459395},"main":"build/index.cjs","types":"build/index.d.ts","module":"build/index.mjs","engines":{"node":">=20"},"exports":{".":{"import":{"types":"./build/index.d.mts","default":"./build/index.mjs"},"require":{"types":"./build/index.d.ts","default":"./build/index.cjs"}},"./package.json":"./package.json"},"gitHead":"437300bae0e5a7a72fdb93165467411fe80b3ea1","scripts":{"lint":"eslint .","test":"mocha -r ts-node/register/transpile-only test/**/*.test.ts","build":"tsup","prepack":"tsup","prepare":"tsup","pretest":"tsup","check-types":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9cf1c11c-9dde-444e-a0cc-9bf8ec6b6841"}},"repository":{"url":"git+https://github.com/atomicassets/atomicmarket-sdk.git","type":"git"},"_npmVersion":"12.0.2","description":"JavaScript/TypeScript SDK for the AtomicMarket NFT marketplace contract on Antelope chains: read sales, auctions, and royalties, and build sale, auction, buyoffer, template-buyoffer, RAM-payment, and v2 royalty actions","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{"@atomichub/atomicassets":"^2.0.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.4.1","tsup":"^8.5.1","mocha":"^11.0.0","eslint":"^9.17.0","ts-node":"^10.9.2","typescript":"^6.0.0","@types/chai":"^4.3.11","@types/node":"^22.0.0","@types/mocha":"^10.0.6","typescript-eslint":"^8.59.0"},"_npmOperationalInternal":{"tmp":"tmp/atomicmarket_2.4.1_1787008308951_0.3208872765533184","host":"s3://npm-registry-packages-npm-production"}},"2.5.0":{"name":"@atomichub/atomicmarket","description":"JavaScript/TypeScript SDK for the AtomicMarket NFT marketplace contract on Antelope chains: read sales, auctions, and royalties, and build sale, auction, buyoffer, template-buyoffer, RAM-payment, and v2 royalty actions","keywords":["atomicmarket","atomicassets","atomichub","wax","antelope","eosio","nft","blockchain","sdk"],"author":{"name":"AtomicHub","url":"https://atomichub.io"},"homepage":"https://github.com/atomicassets/atomicmarket-sdk","bugs":{"url":"https://github.com/atomicassets/atomicmarket-sdk/issues"},"repository":{"type":"git","url":"git+https://github.com/atomicassets/atomicmarket-sdk.git"},"license":"MIT","publishConfig":{"access":"public","provenance":true},"sideEffects":false,"version":"2.5.0","engines":{"node":">=20"},"main":"build/index.cjs","module":"build/index.mjs","types":"build/index.d.ts","exports":{".":{"import":{"types":"./build/index.d.mts","default":"./build/index.mjs"},"require":{"types":"./build/index.d.ts","default":"./build/index.cjs"}},"./package.json":"./package.json"},"scripts":{"build":"tsup","check-types":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","lint":"eslint .","pretest":"tsup","test":"mocha -r ts-node/register/transpile-only test/**/*.test.ts","prepare":"tsup","prepack":"tsup"},"dependencies":{"@atomichub/atomicassets":"^2.0.0"},"devDependencies":{"@types/chai":"^4.3.11","@types/mocha":"^10.0.6","@types/node":"^22.0.0","chai":"^4.4.1","eslint":"^9.17.0","mocha":"^11.0.0","ts-node":"^10.9.2","tsup":"^8.5.1","typescript":"^6.0.0","typescript-eslint":"^8.59.0"},"resolutions":{"serialize-javascript":"^7.0.5"},"_id":"@atomichub/atomicmarket@2.5.0","_integrity":"sha512-PMR0e68sCSF365QMIlIGmIuVwW6dMDzKPkP/1T2GxYORv3BxlRGL3JQJuMPY92JEWyHMD/AxtI97icJLJ0b3MA==","_resolved":"/home/runner/work/atomicmarket-sdk/atomicmarket-sdk/atomichub-atomicmarket-2.5.0.tgz","_from":"file:atomichub-atomicmarket-2.5.0.tgz","_nodeVersion":"22.23.2","_npmVersion":"12.0.2","dist":{"integrity":"sha512-PMR0e68sCSF365QMIlIGmIuVwW6dMDzKPkP/1T2GxYORv3BxlRGL3JQJuMPY92JEWyHMD/AxtI97icJLJ0b3MA==","shasum":"450fcdce7904f30c67c33472bff99b835de1cb64","tarball":"https://registry.npmjs.org/@atomichub/atomicmarket/-/atomicmarket-2.5.0.tgz","fileCount":10,"unpackedSize":468727,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@atomichub%2fatomicmarket@2.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCv9SL0oQB0pqoOyNa7xhhbcrNIRUVBUujCq8V8GRPJngIgDAFb9AFrQeEUPC8ErTvaay1A0GE6j/OF75xoYoRLQ28="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9cf1c11c-9dde-444e-a0cc-9bf8ec6b6841"}},"directories":{},"maintainers":[{"name":"robrigo","email":"rob@atomichub.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/atomicmarket_2.5.0_1788549480789_0.6508917328496395"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-25T19:46:27.431Z","modified":"2026-09-04T19:18:01.247Z","2.0.0":"2026-07-25T19:46:27.690Z","2.0.1":"2026-07-25T21:01:12.261Z","2.1.0":"2026-07-31T21:46:11.204Z","2.2.0":"2026-08-04T21:39:32.870Z","2.2.1":"2026-08-16T18:10:55.356Z","2.3.0":"2026-08-16T18:35:52.995Z","2.4.0":"2026-08-17T22:01:35.853Z","2.4.1":"2026-08-17T23:11:49.084Z","2.5.0":"2026-09-04T19:18:00.919Z"},"bugs":{"url":"https://github.com/atomicassets/atomicmarket-sdk/issues"},"author":{"name":"AtomicHub","url":"https://atomichub.io"},"license":"MIT","homepage":"https://github.com/atomicassets/atomicmarket-sdk","keywords":["atomicmarket","atomicassets","atomichub","wax","antelope","eosio","nft","blockchain","sdk"],"repository":{"type":"git","url":"git+https://github.com/atomicassets/atomicmarket-sdk.git"},"description":"JavaScript/TypeScript SDK for the AtomicMarket NFT marketplace contract on Antelope chains: read sales, auctions, and royalties, and build sale, auction, buyoffer, template-buyoffer, RAM-payment, and v2 royalty actions","maintainers":[{"name":"robrigo","email":"rob@atomichub.io"}],"readme":"# @atomichub/atomicmarket\n\n[![npm version](https://img.shields.io/npm/v/@atomichub/atomicmarket.svg)](https://www.npmjs.com/package/@atomichub/atomicmarket)\n[![CI](https://github.com/atomicassets/atomicmarket-sdk/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/atomicassets/atomicmarket-sdk/actions/workflows/ci.yml)\n[![license](https://img.shields.io/npm/l/@atomichub/atomicmarket.svg)](https://github.com/atomicassets/atomicmarket-sdk/blob/main/LICENSE)\n\nRead NFT market data from the [AtomicMarket](https://github.com/atomicassets/atomicmarket-contract) contract in JavaScript or TypeScript.\n\nAtomicMarket is the marketplace contract that sits on top of the AtomicAssets NFT standard on WAX and other Antelope chains. It is where listings, auctions, buyoffers, and collection royalties live. This SDK gives you typed access to all of it, so asking what is currently for sale in a collection, and for how much, is one call that comes back with prices, token symbols, and the assets themselves already resolved.\n\nIf you are building a marketplace front end, a price tracker, a bot that posts sales, or anything that reports on NFT trading on these chains, this is the client library for it.\n\nFor the NFTs themselves rather than the market around them, use the companion package [@atomichub/atomicassets](https://github.com/atomicassets/atomicassets-sdk).\n\n## Install\n\n```sh\nnpm install @atomichub/atomicmarket\n```\n\nOn Node.js the package requires version 20 or newer. Browsers and bundlers are supported through the ESM and IIFE builds. The package ships CJS, ESM, and a browser IIFE bundle (`build/atomicmarket.global.js`, global `atomicmarket`). Its only dependency is the sibling `@atomichub/atomicassets`.\n\n## Quickstart\n\nList what is currently for sale in a collection:\n\n```ts\nimport { marketApiForNetwork, SaleState } from '@atomichub/atomicmarket';\n\nconst api = marketApiForNetwork('wax');\n\nconst sales = await api.getSales(\n    { collection_name: 'mycollection', state: SaleState.Listed },\n    1,\n    20\n);\n\nfor (const sale of sales) {\n    const { amount, token_symbol, token_precision } = sale.price;\n\n    // amount is an integer string in the token's smallest unit, so scale it\n    // with BigInt. Dividing through a JS number loses digits once the value\n    // passes 2^53.\n    const unit = 10n ** BigInt(token_precision);\n    const whole = BigInt(amount) / unit;\n    const fraction = (BigInt(amount) % unit).toString().padStart(token_precision, '0');\n    const price = token_precision > 0 ? `${whole}.${fraction}` : `${whole}`;\n\n    console.log(sale.sale_id, sale.seller, `${price} ${token_symbol}`);\n}\n```\n\nThere is nothing to configure first. `marketApiForNetwork` points at AtomicHub's public endpoint for the network you name.\n\nExamples here use top-level `await`, which needs an ES module. Under CommonJS, wrap them in an `async` function.\n\nPrices arrive as integer strings with a separate precision, which is how the chain stores them. Scale with `BigInt` rather than dividing through a JS number: past 2^53 a number drops digits, so `123456789012345678` at precision 8 renders as `1234567890.12345672` instead of `...78`. Keep the raw string for comparing and storing, and convert only to display.\n\n## Sales, auctions, and buyoffers\n\nThe three listing types have parallel methods, so what you learn on one carries to the others:\n\n```ts\nconst sales = await api.getSales({ collection_name: 'mycollection' });\nconst auctions = await api.getAuctions({ collection_name: 'mycollection' });\nconst buyoffers = await api.getBuyoffers({ collection_name: 'mycollection' });\n\n// One listing by id\nconst sale = await api.getSale('100');\n\n// Totals for the same filters, which is what pagination needs\nconst total = await api.countSales({ collection_name: 'mycollection' });\n\n// The history behind a listing\nconst logs = await api.getSaleLogs('100');\n```\n\n`SaleState` says where a listing stands: `Waiting`, `Listed`, `Canceled`, `Sold`, or `Invalid`. Filter on `SaleState.Listed` for \"currently buyable\", because the unfiltered call returns every sale the contract has ever recorded.\n\nEach sale carries its `assets`, so rendering a listing usually needs no second call to the AtomicAssets API.\n\n`getSalesV2` and `countSalesV2` query the `/v2/sales` route, a newer materialized index with the same row shape as `/v1/sales`. Note that `/v2/sales` omits `Waiting` sales, so state filters including `Waiting` belong on the v1 route.\n\n### Supported networks\n\n`wax`, `wax-testnet`, `vaulta`, `xpr`, `xpr-testnet`, `jungle4`.\n\nBehind those endpoints is a hosted [atomicassets-api](https://github.com/atomicassets/atomicassets-api) indexer. Pass the constructor your own host if you run one, or a public host for a network without a preset:\n\n```ts\nimport { AtomicMarketApi } from '@atomichub/atomicmarket';\n\nconst api = new AtomicMarketApi('https://my-indexer.example.com', 'atomicmarket', {});\n```\n\nThe built-in `fetch` is used unless you pass your own in the options argument.\n\n## Royalties\n\nAtomicMarket v2 moved royalty configuration on chain, so a collection can split its fee between founders, specific templates, and assets matching an attribute. Those splits are readable:\n\n```ts\n// null when the collection has not configured royalties\nconst config = await api.getRoyaltyConfig('mycollection');\n\nconst templateRules = await api.getRoyaltyTemplateRules('mycollection');\nconst attributeRules = await api.getRoyaltyAttributeRules('mycollection');\n```\n\nWhat the collection has actually paid is a separate read. The indexer keeps one ledger row for every royalty the contract settled, and aggregates one account's rows per token:\n\n```ts\nconst payouts = await api.getRoyaltyPayouts({\n    collection_name: 'mycollection',\n    recipient: 'founderacct1',\n    category: 'template'\n}, 1, 100);\n\nconst settled = await api.countRoyaltyPayouts({collection_name: 'mycollection'});\n\n// one row per token symbol the account has been paid in\nconst earned = await api.getRoyaltyAccount('founderacct1');\n```\n\n`amount` is in raw token units, so read it against the `token_precision` of the same row: `5000000` at precision 8 is `0.05000000 WAX`. The same holds for the `amount` on a `getRoyaltyAccount` row, which sums the payouts the filters admit, and its `payout_count` is a decimal string rather than a number.\n\n`category` names the rule that paid, one of `founders`, `template`, `attribute`, or `dust`, and it tells you which linkage the row carries: a template payout sets `template_id`, an attribute payout sets `rule_id`, and a founders or dust payout sets neither. A dust row is the rounding remainder plus the author fallback, paid to the collection author, and it names no asset either. `listing_id` is null when `listing_type` is `unresolved`, which is the row the indexer keeps when it cannot trace a settlement back to the listing that triggered it. A row whose stored value falls outside the vocabulary this SDK serves reads null for both `listing_type` and `category`.\n\nThe ledger pages like the listing routes. It sorts newest first by default, takes `sort` of `created` or `amount`, `order` of `asc` or `desc`, a `limit` up to 100, and `lower_bound`, `upper_bound`, or `ids` over `log_global_sequence`. `RoyaltyListingType`, `RoyaltyPayoutCategory`, and `RoyaltyPayoutSort` are exported for the filter values.\n\nOn a chain still running AtomicMarket v1 the contract logs no payouts and configures no royalties, so the ledger reads empty, the count is zero, and every collection answers `getRoyaltyConfig` with null. An indexer built before the royalty routes existed is a different case: it answers 404, which arrives as an `ApiError` with `status` 404 from every one of these methods. Only the HTTP 416 that `getRoyaltyConfig` receives for a collection with no royalty config becomes null; the ledger and count routes return empty results instead, never null.\n\n## Writing royalty configuration\n\nReading needs no signing. To change a collection's royalty split, this SDK builds the action objects and hands them to whatever signing library you already use. It does not sign or broadcast anything itself.\n\nThe six royalty actions arrived with v2. A chain still running AtomicMarket v1 carries none of them in its ABI, so on such a chain a signing library cannot serialize what these builders return, let alone submit it.\n\n```ts\nimport { MarketActionBuilder } from '@atomichub/atomicmarket';\n\nconst builder = new MarketActionBuilder('atomicmarket');\n\nconst actions = builder.setroyalconf('mycollection', {\n    founders: [{ recipient: 'founderacct1', weight: 1 }],\n    attribute_mode: 0,\n    split_founders: 5000,\n    split_templates: 2500,\n    split_attributes: 2500\n});\n```\n\nThose three numbers are relative weights, not basis points and not percentages. At settlement each asset is weighed against only the categories that have a payee for it, and the weights are renormalized across those, so that no share is stranded. The 5000/2500/2500 above pays founders two thirds and the template one third on an asset that has a template royalty row and matches no attribute rule, and pays founders the entire fee on an asset with neither. Where no category has a payee, the whole share goes to the collection author.\n\nThe result plugs into a signing library such as [WharfKit](https://wharfkit.com/):\n\n```ts\nawait session.transact({\n    actions: actions.map((action) => ({\n        ...action,\n        authorization: [{ actor: 'authoracct11', permission: 'active' }]\n    }))\n});\n```\n\n`MarketActionBuilder` is synchronous and returns authorization-free `{account, name, data}` objects. If you would rather have authorization attached for you, `MarketActionGenerator` wraps the same builders.\n\n## Building market actions\n\nThe sale, auction, buyoffer, and template-buyoffer actions build the same way: unsigned action objects for your signing library. uint64 fields (the sale, auction, and buyoffer ids, the asset and template ids, and `intended_delphi_median`) are strings so 64-bit values pass through without precision loss. Price fields use chain notation: `'100.00000000 WAX'` for an asset, `'8,WAX'` for a symbol.\n\n```ts\nimport { MarketActionBuilder } from '@atomichub/atomicmarket';\n\nconst builder = new MarketActionBuilder('atomicmarket');\n\n// Take a listing down\nconst cancel = builder.cancelsale('42');\n```\n\nThe RAM payment actions move the RAM cost of a listing's table row onto the payer; the row itself is unchanged. Any account may pay, signing as the payer; no authority over the listing is needed. Marketplaces run them to sponsor their sellers' RAM.\n\n```ts\nconst actions = builder.paysaleram('payeracct111', '42');\nconst auctionRam = builder.payauctram('payeracct111', '42');\nconst buyofferRam = builder.paybuyoram('payeracct111', '7');\n```\n\nSeveral of these flows are not single actions, though, and in each case the action order, the memo literals, and which contract each action belongs to are rules of the contracts rather than choices. Those flows come as composed helpers, so that knowledge lives here instead of in every integration. The actions they compose stay on the builder as well, for anything that needs to assemble its own transaction shape, with two exceptions noted below where building the action alone is not safe.\n\n### Listing an asset\n\n`announceSaleActions` returns the pair a listing takes: `announcesale` on the market contract, then AtomicAssets' `createoffer` handing the assets over to it with memo `'sale'`.\n\n```ts\nconst listing = builder.announceSaleActions({\n    seller: 'selleracct11',\n    asset_ids: ['1099511627776'],\n    listing_price: '100.00000000 WAX',\n    settlement_symbol: '8,WAX',\n    maker_marketplace: '', // '' for none, or your registered marketplace account\n    assets_contract: 'atomicassets'\n});\n```\n\nAnnouncing alone lists nothing and offering alone leaves the assets in an offer nobody accepts, so the two belong in one transaction.\n\nA v2 listing holds exactly one asset. `announcesale` rejects any other size and asks for one sale per asset instead, which one transaction can announce several of. A chain still running v1 takes bundle listings, and this helper builds whatever it is handed either way, since a refused listing is a rejected transaction and nothing is lost to it.\n\nNothing about the symbols is checked here. `announcesale` takes a listing whose `settlement_symbol` is its price's own symbol if that symbol is a supported token, and one whose settlement symbol is anything else if the two are a registered pair, so both readings are legitimate and which one your listing gets is chain state this helper is not handed.\n\n### Buying a sale\n\n`purchaseSaleActions` returns the purchase triple: `assertsale` pinning the terms you expect to buy, a transfer with memo `deposit` crediting the market contract, then `purchasesale` spending that credit. Only the purchase's place is fixed, since it spends the deposited balance and erases the sale row the assertion reads; the assertion writes nothing, so a transaction assembling itself from the raw builders may equally deposit first.\n\n```ts\nconst purchase = builder.purchaseSaleActions({\n    buyer: 'buyeracct111',\n    sale_id: '42',\n    asset_ids: ['1099511627776'],\n    listing_price: '100.00000000 WAX',\n    settlement_symbol: '8,WAX',\n    intended_delphi_median: '0',\n    token_contract: 'eosio.token', // the settlement token's own contract, from IMarketToken.token_contract\n    taker_marketplace: '' // '' for none, or your registered marketplace account\n});\n```\n\nThe deposit is a token transfer rather than an AtomicMarket action, which is why the helper needs `token_contract`; it is the `deposit` builder's action, and the triple carries it unchanged. `assertsale` is what makes the triple safe against a sale that changed between reading it and the transaction landing: if the ids, the price, or the settlement symbol have moved, the assertion fails and nothing does.\n\nIt does not cover a sale of several assets. `purchasesale` on v2 returns early for such a row, declining the offer and erasing the listing before it reaches a balance, while `assertsale` passes on the very ids that made it return and the deposit has already credited the buyer. The transaction commits, and the buyer has paid for nothing and must `withdraw` to get the tokens back. So `purchaseSaleActions` throws on more than one `asset_ids` entry. Bundles are ordinary listings on a chain still running v1, where they purchase correctly, and `allow_v1_bundle_sale: true` is the opt-out for buying one there.\n\n`intended_delphi_median` is `'0'` for a sale listed directly in its settlement token, and that is the whole story for most sales. The contract settles such a sale at its listing price, so `settlement_quantity` may be omitted; supplying it is fine, and common, but it must then equal `listing_price` exactly, since the deposit is what funds the purchase and the purchase spends the listed amount whatever you deposited.\n\nA sale is that one exactly when `settlement_symbol` is `listing_price`'s own symbol, which means the precision as well as the code: `'100.00000000 WAX'` settles `'8,WAX'`, and the same price against `'4,WAX'` names two different symbols and settles through the oracle like any other pair.\n\n### Delphi-priced sales\n\nA sale can be listed in one currency and settled in another at the delphioracle rate, which is what a `settlement_symbol` other than the listing price's own symbol means, and what a non-zero `intended_delphi_median` accompanies. Its two price fields then describe two different symbols: `listing_price` is what the seller asked in the listing currency, and the buyer deposits what that converts to at the median. `assertsale` pins the listing terms only, so no on-chain check stands behind the deposit amount, which makes deriving it the step worth getting right.\n\n`getConfig` carries the pair, `deriveSettlementAmount` converts, and `formatQuantity` renders the result as the quantity string the transfer takes:\n\n```ts\nimport { deriveSettlementAmount, formatQuantity, marketApiForNetwork } from '@atomichub/atomicmarket';\n\nconst api = marketApiForNetwork('wax');\nconst sale = await api.getSale('42');\nconst config = await api.getConfig();\n\nconst pair = config.supported_pairs.find(\n    (candidate) => candidate.listing_symbol === sale.listing_symbol\n        && candidate.settlement_symbol === sale.price.token_symbol\n);\n\nif (!pair || !sale.price.median) {\n    throw new Error(`sale ${sale.sale_id} is not a delphi sale this pair set covers`);\n}\n\n// Bound what the API served before converting it. A median past 2^53 has\n// already lost precision at JSON parse, and a non-integer listing_price\n// would surface as an opaque BigInt error instead of a named one.\nif (!Number.isSafeInteger(sale.price.median) || sale.price.median <= 0) {\n    throw new Error(`sale ${sale.sale_id}: median ${sale.price.median} is not a positive safe integer`);\n}\n\nif (!/^\\d+$/.test(sale.listing_price)) {\n    throw new Error(`sale ${sale.sale_id}: listing_price ${sale.listing_price} is not a raw integer amount`);\n}\n\n// The listing symbol sits on one side of the price feed or the other, and\n// takes that side's precision.\nconst listingPrecision = sale.listing_symbol === pair.data.base_symbol\n    ? pair.data.base_precision\n    : pair.data.quote_precision;\n\nconst settlement = deriveSettlementAmount(BigInt(sale.listing_price), BigInt(sale.price.median), {\n    median_precision: pair.data.median_precision,\n    base_precision: pair.data.base_precision,\n    quote_precision: pair.data.quote_precision,\n    invert_delphi_pair: pair.invert_delphi_pair\n});\n\n// Whoever serves getConfig also controls the numbers deriveSettlementAmount\n// works from, so the amount it derives and the amount this same response\n// separately reports should agree before either is trusted. An indexer\n// converts in its own arithmetic rather than the contract's, and the two can\n// drift by the last place of the contract's double: one raw unit at ordinary\n// magnitudes, proportionally more past 2^53. Anything wider than that is a\n// disagreement rather than rounding, and a reason to stop.\nconst reported = /^\\d+$/.test(sale.price.amount) ? BigInt(sale.price.amount) : undefined;\nconst drift = reported === undefined ? undefined\n    : settlement > reported ? settlement - reported : reported - settlement;\n\n// One raw unit, widened by the spacing of doubles at this magnitude.\nconst tolerance = 1n + settlement / 2n ** 52n;\n\nif (drift === undefined || drift > tolerance) {\n    throw new Error(`sale ${sale.sale_id}: price.amount ${sale.price.amount} does not match the median-derived expectation ${settlement.toString()} for listing_price ${sale.listing_price} ${sale.listing_symbol} at median ${sale.price.median}`);\n}\n\nconst purchase = builder.purchaseSaleActions({\n    buyer: 'buyeracct111',\n    sale_id: sale.sale_id,\n    asset_ids: sale.assets.map((asset) => asset.asset_id),\n    listing_price: formatQuantity(BigInt(sale.listing_price), listingPrecision, sale.listing_symbol),\n    settlement_symbol: `${sale.price.token_precision},${sale.price.token_symbol}`,\n    settlement_quantity: formatQuantity(settlement, sale.price.token_precision, sale.price.token_symbol),\n    intended_delphi_median: String(sale.price.median),\n    token_contract: sale.price.token_contract,\n    taker_marketplace: ''\n});\n```\n\nAmounts on the wire are raw integers in their symbol's smallest unit, and `deriveSettlementAmount` returns the integer the contract charges rather than the exact quotient of those integers. The two are not always the same one. The contract divides and scales in double-precision floating point and truncates the result, so on the WAX/USD pair it lands one raw unit above the exact floor on a small fraction of listing amounts from about $12,124 up, and a deposit derived from the exact floor is then a unit short of what the purchase spends. The derivation reproduces the contract's arithmetic operation for operation so that the amount you deposit is the amount that is taken.\n\nTwo cases have no amount to reproduce and throw instead. A pair whose exponent works out negative, meaning the settlement symbol carries fewer decimals than the median and listing symbols together call for, is one the contract cannot convert at all: it computes that exponent in unsigned arithmetic, where a negative one becomes an enormous positive one and the conversion overflows. And a result at or past 2^64 has no integer for the contract to charge. Past 2^53 the derivation keeps returning values, with the caveat that the contract's own double no longer represents the quotient exactly there, so the amount charged can sit some way off it in either direction; that is the contract's arithmetic, and matching it is the point.\n\n`invert_delphi_pair` says which way the underlying price feed is oriented, and it is the reason the listing precision is read off the matching side of the feed rather than assumed.\n\n`settlement_quantity` is required whenever `settlement_symbol` is not the listing price's own symbol, and it must be denominated in that settlement symbol. Without it the helper would deposit the listing price, which on such a sale is an amount in the wrong currency; with a quantity in some third symbol the deposit credits a balance the purchase never spends, while the real settlement amount is drawn from whatever the buyer already holds in the right one. Both throw.\n\n### Auctions\n\nAn auction is announced and then activated. `announceauct` writes the row, and the auction becomes biddable only once the seller transfers the assets into the market contract's custody with memo `'auction'`. `announceAuctionActions` returns that pair.\n\n```ts\nconst auction = builder.announceAuctionActions({\n    seller: 'selleracct11',\n    asset_ids: ['1099511627776'],\n    starting_bid: '10.00000000 WAX',\n    duration: 86400, // seconds\n    maker_marketplace: '', // '' for none, or your registered marketplace account\n    assets_contract: 'atomicassets'\n});\n```\n\nThe order is the contract's rather than the helper's: the transfer's handler looks an announced auction up by its assets and its seller, so a transfer arriving first has nothing to activate and fails. Where a sale takes an AtomicAssets offer, an auction takes a transfer, and the assets sit in the market contract's custody for the auction's whole duration rather than in an offer until someone buys.\n\n`duration` is the one field here read as a number, and it is checked for being a whole number inside the uint32 range before it is packed, so a `NaN` cannot reach your signing library as a `null`. Whether it also falls inside the contract config's minimum and maximum, whether the starting bid's symbol is supported, and whether the marketplace is registered are chain state, and each refusal is a rejected transaction.\n\nThe rest of the lifecycle is plain builders:\n\n```ts\n// Pair an assertion with a bid the way assertsale pairs with a purchase\nconst assertion = builder.assertauct('42', ['1099511627776']);\nconst bid = builder.auctionbid('bidderacct11', '42', '11.00000000 WAX', '');\n\nconst claimedByBuyer = builder.auctclaimbuy('42');  // the winner takes the assets\nconst claimedBySeller = builder.auctclaimsel('42'); // the seller takes the bid, less fees\nconst cancelled = builder.cancelauct('42');         // only before a bid lands\n```\n\nA bid is spent from the bidder's balance inside the market contract rather than from their wallet, so fund it first with `deposit`, the transfer carrying memo `deposit` covered below. An outbid bid returns to its bidder's balance the same way, and `withdraw` is what moves a balance back out.\n\nAn auction row holding more than one asset predates v2's removal of bundle listings and can no longer be bid on or claimed. Bidding on one, claiming one, or cancelling one dissolves it instead: the standing bid returns to the bidder's balance, the assets return to the seller, the row is erased, and the transaction commits. Nothing guards against that, since these actions are handed an auction id and this SDK cannot see how many assets the row holds, and a bundle row is an ordinary auction on a chain still running v1. Nothing is stranded either way, which is what keeps it on the documented side of the line.\n\n### Buyoffers\n\nA buyoffer is an unsolicited bid on an asset somebody else owns. The buyer escrows the price with `createbuyo`, and the recipient accepts or declines it.\n\n```ts\nconst wanted = builder.createbuyo(\n    'buyeracct111', 'holderacct11', '100.00000000 WAX', ['1099511627776'], 'please sell', ''\n);\n\nconst withdrawn = builder.cancelbuyo('7');                // the buyer changes their mind\nconst refused = builder.declinebuyo('7', 'not for sale'); // the recipient says no\n```\n\n`createbuyo` spends the price from the buyer's market balance, the way a bid does, so a `deposit` usually comes first. Cancelling and declining both return it.\n\nAccepting is a composed flow, because the contract takes no offer id. `acceptbuyo` reads the globally last created row of the AtomicAssets offers table and checks it against the buyoffer, so the offer has to be created in the same transaction, immediately before it:\n\n```ts\nconst accepted = builder.acceptBuyofferActions({\n    recipient: 'holderacct11', // signs the transaction, and sends the offer\n    buyoffer_id: '7',\n    asset_ids: ['1099511627776'],\n    expected_price: '100.00000000 WAX',\n    taker_marketplace: '',\n    assets_contract: 'atomicassets'\n});\n```\n\nNo other `createoffer` may run between this helper's `createoffer` and the market action: the contract would read that one instead, and every check it makes against the offer would fail against it. Appending further actions after the market action, including another accept flow, is safe, the inline `acceptoffer` having consumed the row by then. Do not accept the offer yourself either, since the market contract sends that `acceptoffer`, and an offer already accepted is gone from the table before the contract can find it. That is why `acceptbuyo` is reachable only through this helper.\n\n`acceptBuyofferActions` throws on more than one entry in `asset_ids`. It is the one place in these families where a mistake commits and leaves damage behind rather than reverting: `acceptbuyo` on v2 returns early for a buyoffer row holding several assets, refunding the buyer and erasing the row before it reads the offers table at all, so the transaction lands with nothing sold and the offer this flow created still in the offers table on the recipient's RAM, neither accepted nor declined, until they cancel it. Bundle buyoffers accept correctly on a chain still running v1, and `allow_v1_bundle_buyoffer: true` is the opt-out for one there.\n\n### Template buyoffers\n\nA template buyoffer is a standing bid on any asset of a template rather than on one particular asset, so any holder of that template can fill it.\n\n```ts\nconst wanted = builder.createtbuyo('buyeracct111', '100.00000000 WAX', 'mycollection', '1234', '');\nconst withdrawn = builder.canceltbuyo('9');\n```\n\n`template_id` is a uint64 on these actions and passes through as a string, unlike the int32 `template_id` the royalty builders take. They are two different ABI types on different actions.\n\nFilling one reads the offers table exactly as accepting a buyoffer does, with memo `'tbuyoffer'`, and `fulfillTemplateBuyofferActions` composes that pair:\n\n```ts\nconst fulfilled = builder.fulfillTemplateBuyofferActions({\n    seller: 'selleracct11', // signs the transaction, and sends the offer\n    buyoffer_id: '9',\n    asset_id: '1099511627776', // must carry the template the buyoffer names\n    expected_price: '100.00000000 WAX',\n    taker_marketplace: '',\n    assets_contract: 'atomicassets'\n});\n```\n\nThe same-transaction rule and the no-other-`createoffer` rule hold unchanged, and `fulfilltbuyo` is likewise reachable only through this helper. This one carries no bundle guard, a template buyoffer naming a single asset by construction.\n\n### Funding a market balance\n\nBids, buyoffers, and purchases all spend a balance the market contract holds for the account rather than tokens sitting in its wallet. `deposit` builds the transfer that credits one: a `transfer` on the settlement token's own contract, sent to the market contract, carrying memo `deposit`. That memo is what the contract's notify handler reads, so no other transfer credits a balance.\n\n```ts\nconst funded = builder.deposit('buyeracct111', '100.00000000 WAX', 'eosio.token');\n```\n\nThe action belongs to the token, not to AtomicMarket, which is why it names `token_contract`. Take that value from `IMarketToken.token_contract`: `eosio.token` is WAX's own token contract, not every settlement token's. `withdraw` is how an owner moves a balance back out, and `deposit` how they put one in. The contract also credits a balance on its own, for sale proceeds, an outbid bid, and a cancelled or declined buyoffer, and debits one for every bid, buyoffer, and purchase.\n\nThe quantity is chain notation and passes through verbatim. Nothing checks it here, because there is no second field to check it against: the purchase guards below compare a quantity with a sale's settlement symbol or with its listing price, and a bare deposit carries neither.\n\n`purchaseSaleActions` composes this same action as the middle of its triple, so a purchase built that way needs no separate deposit.\n\n### What the builders validate\n\nAlmost nothing, deliberately. These are composition helpers over values you already trust: they emit what you hand them, and checking a sale you read from an API is your side of that line. The exceptions all share one property, that their failure is a wrong payment rather than a rejected transaction, and each names the offending values in the error:\n\n- `purchaseSaleActions` throws on more than one entry in `asset_ids`, unless `allow_v1_bundle_sale` says the chain is still on v1.\n- `purchaseSaleActions` requires `settlement_quantity`, denominated in `settlement_symbol`, when that symbol is not the listing price's own; and when it is, requires a supplied one to equal `listing_price` and `intended_delphi_median` to be `'0'`.\n- `acceptBuyofferActions` throws on more than one entry in `asset_ids`, unless `allow_v1_bundle_buyoffer` says the chain is still on v1.\n- `announceauct` refuses a `duration` that is not a whole number inside the uint32 range, which is a serialization bound rather than a chain rule: the configured minimum and maximum are chain state and go unchecked.\n- The delphi utilities reject a non-positive median, a precision outside the 0 to 18 the chain allows, and a pair the contract's own conversion cannot compute.\n\nThe symbol checks turn on the discriminator the contract itself uses, whether the sale's two symbol fields name a single symbol, precision and code both.\n\nTwo of them do foreclose a purchase the chain would have taken, deliberately. Requiring a supplied `settlement_quantity` to equal `listing_price` rules out depositing more than the sale costs, which the chain accepts and leaves as balance. Requiring one at all on the oracle branch rules out depositing nothing and letting a standing balance pay, which the chain also accepts. Both are legitimate for a caller who means them and indistinguishable from a wrong amount for one who does not, and the helper cannot see a balance to tell them apart. If you want either, assemble the transaction from `assertsale`, your own transfer, and `purchasesale` on the builder, which assert nothing.\n\nNothing here reads chain state. Whether a symbol is supported, and whether a pairing of two is registered, is chain state, which is why `announceSaleActions` checks nothing at all and why the settlement amount an oracle-settled sale deposits goes unchecked here, the helper never being handed the pair it derives from. Bound anything else you read from a response before you trust it.\n\n## What's new in 2.5.0\n\nBuilds the deposit that funds a market balance, instead of leaving it to each integration.\n\n### Features\n\n- `deposit` builds the market-balance transfer described above, on the builder and the generator alike; `purchaseSaleActions` now composes it instead of assembling its own transfer, with the emitted triple unchanged. (#28)\n\n## What's new in 2.4.1\n\nRefuses a path id that would send the request somewhere else.\n\n### Bug fixes\n\n- An empty id, `.`, or `..` passed to an Explorer method that puts it in a path segment now throws before the request. `encodeURIComponent` leaves a dot alone, so the URL parser inside `fetch` used to resolve the segment away and read a neighbouring route on the same origin: `getRoyaltyAccount('..')` requested `/v1/royalties/`, and an empty id turned a single-row route into its list. The thirteen readers that take an id or a name in the path, over sales, auctions, buy-offers, marketplaces, royalties, assets, and offers, all carry the check. (#25)\n\n## What's new in 2.4.0\n\nReads the settled royalty ledger, so a consumer no longer has to page the payout logs itself.\n\n### Breaking changes\n\n- `IRoyaltyConfig`, `IRoyaltyTemplateRule`, and `IRoyaltyAttributeRule` gain required `market_contract`, `collection_name`, and timestamp fields, and the attribute rule gains `lookup_hash`. Reading a response is unaffected. Code that builds one of these rows by hand, such as a test mock, must supply the added fields. (#23)\n\n### Features\n\n- `getRoyaltyPayouts`, `countRoyaltyPayouts`, and `getRoyaltyAccount` cover the AtomicMarket v2 payout ledger: every settled royalty, the count behind it, and one account's totals per token symbol. Payout filters travel as `RoyaltyPayoutApiParams`, whose primary boundary ranges over `log_global_sequence`. The account totals take the date window alone, because that route groups the boundary column away. (#23)\n- `IRoyaltyPayout` and `IRoyaltyAccountTotal` type the two new row shapes, and `RoyaltyListingType`, `RoyaltyPayoutCategory`, and `RoyaltyPayoutSort` pin the strings the indexer serves and filters on. (#23)\n- `IRoyaltyConfig`, `IRoyaltyTemplateRule`, and `IRoyaltyAttributeRule` carry the `market_contract`, `collection_name`, and four timestamps of their rows, and the attribute rule also carries its `lookup_hash`. (#23)\n\n## What's new in 2.3.0\n\nAdds the auction, buy-offer and template-buy-offer builders and aligns the purchase path with the v2 contract.\n\n### Breaking changes\n\n- `purchaseSaleActions` throws when `asset_ids` has more than one entry. On AtomicMarket v2 a bundle purchase commits with the buyer charged and nothing delivered. Set `allow_v1_bundle_sale: true` on chains still running v1, where bundles are ordinary listings. (#19)\n- `deriveSettlementAmount` matches the contract's own conversion instead of the exact quotient: where the contract's double arithmetic lands one raw unit above the exact floor, so does the SDK, and that unit is the difference between a deposit that funds the purchase and one that leaves it short. It throws on a pair with a negative exponent and on a result at or past 2^64. (#19)\n- `purchaseSaleActions` requires `settlement_quantity` in `settlement_symbol` on the cross-symbol branch, and on a same-symbol sale it must equal `listing_price` with `intended_delphi_median` set to `'0'`. (#19)\n- `purchaseSaleActions` picks its branch from the contract's settlement discriminator, full symbol equality between `listing_price` and `settlement_symbol`. A settlement symbol differing from the price in precision alone therefore settles through the oracle rather than reading as a mismatch. (#19)\n\n### Features\n\n- Adds auction, buy-offer and template-buy-offer actions to `MarketActionBuilder` and `MarketActionGenerator`: `announceauct`, `cancelauct`, `auctionbid`, `auctclaimbuy`, `auctclaimsel`, `assertauct`, `createbuyo`, `cancelbuyo`, `declinebuyo`, `createtbuyo`, `canceltbuyo`. (#20)\n- `announceAuctionActions`, `acceptBuyofferActions` and `fulfillTemplateBuyofferActions` compose the multi-action flows. `acceptbuyo` and `fulfilltbuyo` read the last created row of the AtomicAssets offers table, so neither is safe to build alone and both are reachable only through these helpers. (#20)\n- `AnnounceAuctionInput`, `AcceptBuyofferInput` and `FulfillTemplateBuyofferInput` are exported beside `PurchaseSaleInput` and `AnnounceSaleInput`. (#20)\n\n### Other changes\n\n- `sideEffects: false` in `package.json`, matching the sibling `@atomichub/atomicassets` package, so bundlers may drop the package from builds that import nothing from it. (#19)\n\n## What's new in 2.2.1\n\n### Bug fixes\n\n- The Explorer client percent-encodes caller-supplied path ids and custom data-filter keys, across the twelve path-building methods and the query-string builder. A sale id, marketplace or collection name, or `DataOptions` key carrying `/`, `?`, `#`, `&`, or `=` used to escape its own segment and reshape the request path or query. Hostile input now stays a value. (#17)\n\n### Other changes\n\n- Typed data filters travel as `data%3Anumber.field` rather than `data:number.field`. Standards query parsers percent-decode keys before matching, so servers see the same key. This is confirmed against the live API, where the encoded and raw forms return identical filtered rows. The plain `data.field` form is unchanged. (#17)\n\n## What's new in 2.2.0\n\nComposes the purchase and listing flows and adds the delphi settlement helpers.\n\n### Features\n\n- `purchaseSaleActions` composes `assertsale`, the deposit transfer, and `purchasesale`. `announceSaleActions` composes `announcesale` and the atomicassets `createoffer` carrying the sale memo. Both emit authorization-free action data in the order the market contract expects. (#16)\n- `purchaseSaleActions` throws when a delphi-priced sale arrives without a `settlement_quantity`, because that omission pays the wrong amount rather than failing the transaction. (#16)\n- `deriveSettlementAmount` reproduces the market contract's settlement math with `BigInt`, the float formula losing precision at on-chain magnitudes. `formatQuantity` renders raw integer amounts as chain quantities. (#16)\n- `DelphiPairSpec` projects a supported pair from `getConfig` and rejects a non-positive median or a precision outside the chain's 0 to 18, naming the field in the error. (#16)\n- `IMarketPair.data.quote_precision` is typed `number` rather than the literal `2`, so a pair read from the API feeds a `DelphiPairSpec` directly. (#16)\n- `regmarket` and `withdraw` action builders cover marketplace registration and market-balance withdrawal. (#15)\n\n## What's new in 2.1.0\n\nAdds the sale lifecycle and RAM payment actions, plus the `/v2/sales` routes.\n\n### Features\n\n- Adds the sale lifecycle actions to `MarketActionBuilder` and `MarketActionGenerator`: `announcesale`, `cancelsale`, `assertsale`, `purchasesale`. The uint64 fields, the listing ids and `intended_delphi_median`, are strings, so 64-bit values pass through without precision loss. (#14)\n- RAM payment actions `paysaleram`, `payauctram` and `paybuyoram` move the RAM cost of a listing's table row onto the payer. Any account may pay, signing as the payer. (#14)\n- Adds `getSalesV2` and `countSalesV2` for the `/v2/sales` route, a newer materialized index with the same row shape as `/v1/sales`. `/v2/sales` omits Waiting sales, so a state filter that includes Waiting belongs on the v1 route. (#14)\n- `countOffers` joins `getOffers`, both taking the new `MarketOfferApiParams`, which widens the state filter to comma-joined multi-state queries like the sale and auction params already allow. (#14)\n\n## What's new in 2.0.1\n\nCorrects the buy-offer state enums and the ESM import graph, and depends on the published `@atomichub/atomicassets`.\n\n### Breaking changes\n\n- `BuyofferState` names the lifecycle the indexer reports (`Pending`, `Declined`, `Canceled`, `Accepted`, `Invalid`) instead of the sale lifecycle. The numeric values are unchanged, so filters built from raw numbers behave the same. Code using the removed `BuyofferState.Listed` and `BuyofferState.Sold` no longer compiles and moves to the corrected names. (#13)\n\n### Features\n\n- `TemplateBuyofferState` is new. The template buyoffer routes number their states from `Listed`, one below the other listing types. (#13)\n\n### Bug fixes\n\n- A bare `import ... from '@atomichub/atomicmarket'` under Node ESM no longer fails with \"does not provide an export named 'AtomicHubNetwork'\". `Networks.ts` now splits the value import `NETWORK_ENDPOINTS` from the type-only `AtomicHubNetwork`, so esbuild drops the type from the emitted graph. The CJS build was never affected. (#7)\n\n### Other changes\n\n- The `@atomichub/atomicassets` dependency is a registry range, `^2.0.0`, rather than a git ref, so the lockfile carries a tarball with an integrity hash. (#10)\n- npm publishing runs through the trusted publisher rather than a stored token, so releases carry provenance with no long-lived publish secret. (#8)\n\n## What's new in 2.0.0\n\nPublishes the AtomicHub fork as `@atomichub/atomicmarket`.\n\n### Breaking changes\n\n- The package name is `@atomichub/atomicmarket`. Install it under that name and change imports from `'atomicmarket'`. (#1)\n- Deep imports such as `atomicmarket/build/API/Explorer/Params` are replaced by root exports, for example `import { SaleApiParams } from '@atomichub/atomicmarket'`. (#1)\n- Numeric ABI fields (`template_id`, weights, splits) are numbers. The 64-bit id fields, sale ids and rule ids, remain strings. (#1)\n- Node.js 20 or newer is required. (#1)\n\n### Features\n\n- The package has no third-party runtime dependencies. The built-in `fetch` replaces node-fetch, and a custom `fetch` can still be injected. The only dependency is the sibling `@atomichub/atomicassets`. (#1)\n- Ships dual CJS and ESM output with bundled type declarations, plus a browser IIFE build. (#1)\n- Adds the v2 royalty read endpoints `getRoyaltyConfig`, `getRoyaltyTemplateRules` and `getRoyaltyAttributeRules`. (#1)\n- Adds `MarketActionBuilder`, a synchronous builder for royalty-config actions, alongside `MarketActionGenerator`, which covers the six royalty-configuration actions and their deletes. (#1)\n- Exports typed on-chain table rows and the `AtomicMarketActions` action-name constants. (#1)\n- Exports the market API response-object, query-parameter and enum types from the package root, so no deep `build/` imports are needed. (#1)\n- Adds `current_collection_fee` to sales, auctions and buyoffers. (#1)\n\n### Bug fixes\n\n- `IBuyoffer` matches what the published `atomicmarket` 1.1.6 returns. It carries `buyoffer_id`, `memo` and `decline_memo`, where it used to carry `auction_id` and neither memo field. (#1)\n\n## Migrating from atomicmarket 1.x\n\n- Package name: `npm install @atomichub/atomicmarket` and change imports from `'atomicmarket'` to `'@atomichub/atomicmarket'`.\n- Deep imports such as `atomicmarket/build/API/Explorer/Params` are replaced by root exports: `import { SaleApiParams } from '@atomichub/atomicmarket'`.\n- Numeric ABI fields (`template_id`, weights, splits) are numbers; 64-bit id fields (sale ids, rule ids) remain strings.\n- Node.js 20 or newer is required.\n\n## Credits and license\n\nFork of [atomicmarket-js](https://github.com/pinknetworkx/atomicmarket-js) by pink.network, updated for the v2 AtomicMarket contract. Maintained by AtomicHub.\n\nMIT licensed; see [LICENSE](https://github.com/atomicassets/atomicmarket-sdk/blob/main/LICENSE) for the full text including the original pink.network copyright.\n","readmeFilename":"README.md"}