@bananapus/nana-sdk-core 1.2.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/utils/hook.d.ts +15 -0
- package/dist/cjs/utils/hook.d.ts.map +1 -1
- package/dist/cjs/utils/hook.js +20 -0
- package/dist/cjs/utils/hook.js.map +1 -1
- package/dist/cjs/utils/index.d.ts +1 -0
- package/dist/cjs/utils/index.d.ts.map +1 -1
- package/dist/cjs/utils/index.js +1 -0
- package/dist/cjs/utils/index.js.map +1 -1
- package/dist/cjs/utils/ipfs.d.ts +33 -1
- package/dist/cjs/utils/ipfs.d.ts.map +1 -1
- package/dist/cjs/utils/ipfs.js +212 -8
- package/dist/cjs/utils/ipfs.js.map +1 -1
- package/dist/cjs/utils/ipfs.test.js +34 -0
- package/dist/cjs/utils/ipfs.test.js.map +1 -1
- package/dist/cjs/v6/cashOut.d.ts +23 -0
- package/dist/cjs/v6/cashOut.d.ts.map +1 -1
- package/dist/cjs/v6/cashOut.js +35 -0
- package/dist/cjs/v6/cashOut.js.map +1 -1
- package/dist/cjs/v6/cashOut.test.js +20 -0
- package/dist/cjs/v6/cashOut.test.js.map +1 -1
- package/dist/cjs/v6/index.d.ts +3 -0
- package/dist/cjs/v6/index.d.ts.map +1 -1
- package/dist/cjs/v6/index.js +3 -0
- package/dist/cjs/v6/index.js.map +1 -1
- package/dist/cjs/v6/launch.d.ts +23 -2
- package/dist/cjs/v6/launch.d.ts.map +1 -1
- package/dist/cjs/v6/launch.js +40 -1
- package/dist/cjs/v6/launch.js.map +1 -1
- package/dist/cjs/v6/launch.test.js +25 -0
- package/dist/cjs/v6/launch.test.js.map +1 -1
- package/dist/cjs/v6/nft.d.ts +165 -0
- package/dist/cjs/v6/nft.d.ts.map +1 -0
- package/dist/cjs/v6/nft.js +356 -0
- package/dist/cjs/v6/nft.js.map +1 -0
- package/dist/cjs/v6/nft.test.d.ts +2 -0
- package/dist/cjs/v6/nft.test.d.ts.map +1 -0
- package/dist/cjs/v6/nft.test.js +279 -0
- package/dist/cjs/v6/nft.test.js.map +1 -0
- package/dist/cjs/v6/pay.d.ts +13 -5
- package/dist/cjs/v6/pay.d.ts.map +1 -1
- package/dist/cjs/v6/pay.js +15 -18
- package/dist/cjs/v6/pay.js.map +1 -1
- package/dist/cjs/v6/pay.test.js +7 -0
- package/dist/cjs/v6/pay.test.js.map +1 -1
- package/dist/cjs/v6/permissions.d.ts +21 -0
- package/dist/cjs/v6/permissions.d.ts.map +1 -1
- package/dist/cjs/v6/permissions.js +44 -1
- package/dist/cjs/v6/permissions.js.map +1 -1
- package/dist/cjs/v6/permissions.test.js +25 -0
- package/dist/cjs/v6/permissions.test.js.map +1 -1
- package/dist/cjs/v6/projectPayers.d.ts +178 -0
- package/dist/cjs/v6/projectPayers.d.ts.map +1 -0
- package/dist/cjs/v6/projectPayers.js +108 -0
- package/dist/cjs/v6/projectPayers.js.map +1 -0
- package/dist/cjs/v6/projectPayers.test.d.ts +2 -0
- package/dist/cjs/v6/projectPayers.test.d.ts.map +1 -0
- package/dist/cjs/v6/projectPayers.test.js +85 -0
- package/dist/cjs/v6/projectPayers.test.js.map +1 -0
- package/dist/cjs/v6/revnets.d.ts +3 -2
- package/dist/cjs/v6/revnets.d.ts.map +1 -1
- package/dist/cjs/v6/revnets.js +3 -2
- package/dist/cjs/v6/revnets.js.map +1 -1
- package/dist/cjs/v6/rulesets.d.ts +42 -0
- package/dist/cjs/v6/rulesets.d.ts.map +1 -1
- package/dist/cjs/v6/rulesets.js +87 -0
- package/dist/cjs/v6/rulesets.js.map +1 -1
- package/dist/cjs/v6/rulesets.test.js +54 -0
- package/dist/cjs/v6/rulesets.test.js.map +1 -1
- package/dist/cjs/v6/suckers.d.ts +740 -2
- package/dist/cjs/v6/suckers.d.ts.map +1 -1
- package/dist/cjs/v6/suckers.js +647 -8
- package/dist/cjs/v6/suckers.js.map +1 -1
- package/dist/cjs/v6/suckers.test.js +228 -0
- package/dist/cjs/v6/suckers.test.js.map +1 -1
- package/dist/cjs/v6/uniswapV4.d.ts +82 -0
- package/dist/cjs/v6/uniswapV4.d.ts.map +1 -0
- package/dist/cjs/v6/uniswapV4.js +336 -0
- package/dist/cjs/v6/uniswapV4.js.map +1 -0
- package/dist/cjs/v6/uniswapV4.test.d.ts +2 -0
- package/dist/cjs/v6/uniswapV4.test.d.ts.map +1 -0
- package/dist/cjs/v6/uniswapV4.test.js +128 -0
- package/dist/cjs/v6/uniswapV4.test.js.map +1 -0
- package/dist/esm/utils/hook.d.ts +15 -0
- package/dist/esm/utils/hook.d.ts.map +1 -1
- package/dist/esm/utils/hook.js +20 -1
- package/dist/esm/utils/hook.js.map +1 -1
- package/dist/esm/utils/index.d.ts +1 -0
- package/dist/esm/utils/index.d.ts.map +1 -1
- package/dist/esm/utils/index.js +1 -0
- package/dist/esm/utils/index.js.map +1 -1
- package/dist/esm/utils/ipfs.d.ts +33 -1
- package/dist/esm/utils/ipfs.d.ts.map +1 -1
- package/dist/esm/utils/ipfs.js +204 -8
- package/dist/esm/utils/ipfs.js.map +1 -1
- package/dist/esm/utils/ipfs.test.js +35 -1
- package/dist/esm/utils/ipfs.test.js.map +1 -1
- package/dist/esm/v6/cashOut.d.ts +23 -0
- package/dist/esm/v6/cashOut.d.ts.map +1 -1
- package/dist/esm/v6/cashOut.js +34 -0
- package/dist/esm/v6/cashOut.js.map +1 -1
- package/dist/esm/v6/cashOut.test.js +22 -2
- package/dist/esm/v6/cashOut.test.js.map +1 -1
- package/dist/esm/v6/index.d.ts +3 -0
- package/dist/esm/v6/index.d.ts.map +1 -1
- package/dist/esm/v6/index.js +3 -0
- package/dist/esm/v6/index.js.map +1 -1
- package/dist/esm/v6/launch.d.ts +23 -2
- package/dist/esm/v6/launch.d.ts.map +1 -1
- package/dist/esm/v6/launch.js +39 -2
- package/dist/esm/v6/launch.js.map +1 -1
- package/dist/esm/v6/launch.test.js +27 -2
- package/dist/esm/v6/launch.test.js.map +1 -1
- package/dist/esm/v6/nft.d.ts +165 -0
- package/dist/esm/v6/nft.d.ts.map +1 -0
- package/dist/esm/v6/nft.js +342 -0
- package/dist/esm/v6/nft.js.map +1 -0
- package/dist/esm/v6/nft.test.d.ts +2 -0
- package/dist/esm/v6/nft.test.d.ts.map +1 -0
- package/dist/esm/v6/nft.test.js +277 -0
- package/dist/esm/v6/nft.test.js.map +1 -0
- package/dist/esm/v6/pay.d.ts +13 -5
- package/dist/esm/v6/pay.d.ts.map +1 -1
- package/dist/esm/v6/pay.js +17 -20
- package/dist/esm/v6/pay.js.map +1 -1
- package/dist/esm/v6/pay.test.js +7 -0
- package/dist/esm/v6/pay.test.js.map +1 -1
- package/dist/esm/v6/permissions.d.ts +21 -0
- package/dist/esm/v6/permissions.d.ts.map +1 -1
- package/dist/esm/v6/permissions.js +40 -0
- package/dist/esm/v6/permissions.js.map +1 -1
- package/dist/esm/v6/permissions.test.js +26 -1
- package/dist/esm/v6/permissions.test.js.map +1 -1
- package/dist/esm/v6/projectPayers.d.ts +178 -0
- package/dist/esm/v6/projectPayers.d.ts.map +1 -0
- package/dist/esm/v6/projectPayers.js +101 -0
- package/dist/esm/v6/projectPayers.js.map +1 -0
- package/dist/esm/v6/projectPayers.test.d.ts +2 -0
- package/dist/esm/v6/projectPayers.test.d.ts.map +1 -0
- package/dist/esm/v6/projectPayers.test.js +83 -0
- package/dist/esm/v6/projectPayers.test.js.map +1 -0
- package/dist/esm/v6/revnets.d.ts +3 -2
- package/dist/esm/v6/revnets.d.ts.map +1 -1
- package/dist/esm/v6/revnets.js +3 -2
- package/dist/esm/v6/revnets.js.map +1 -1
- package/dist/esm/v6/rulesets.d.ts +42 -0
- package/dist/esm/v6/rulesets.d.ts.map +1 -1
- package/dist/esm/v6/rulesets.js +83 -0
- package/dist/esm/v6/rulesets.js.map +1 -1
- package/dist/esm/v6/rulesets.test.js +55 -1
- package/dist/esm/v6/rulesets.test.js.map +1 -1
- package/dist/esm/v6/suckers.d.ts +740 -2
- package/dist/esm/v6/suckers.d.ts.map +1 -1
- package/dist/esm/v6/suckers.js +630 -8
- package/dist/esm/v6/suckers.js.map +1 -1
- package/dist/esm/v6/suckers.test.js +230 -2
- package/dist/esm/v6/suckers.test.js.map +1 -1
- package/dist/esm/v6/uniswapV4.d.ts +82 -0
- package/dist/esm/v6/uniswapV4.d.ts.map +1 -0
- package/dist/esm/v6/uniswapV4.js +318 -0
- package/dist/esm/v6/uniswapV4.js.map +1 -0
- package/dist/esm/v6/uniswapV4.test.d.ts +2 -0
- package/dist/esm/v6/uniswapV4.test.d.ts.map +1 -0
- package/dist/esm/v6/uniswapV4.test.js +126 -0
- package/dist/esm/v6/uniswapV4.test.js.map +1 -0
- package/dist/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
package/dist/cjs/utils/hook.d.ts
CHANGED
|
@@ -1,3 +1,18 @@
|
|
|
1
|
+
import { Address, Hex } from "viem";
|
|
2
|
+
/**
|
|
3
|
+
* The metadata lookup id a JB hook resolves via `JBMetadataResolver.getId`:
|
|
4
|
+
* `bytes4(bytes20(target) ^ bytes20(keccak256(purpose)))`.
|
|
5
|
+
*
|
|
6
|
+
* For JB721 hooks, `target` MUST be the hook's `METADATA_ID_TARGET` — which is
|
|
7
|
+
* `address(this)` in the *implementation's* constructor, so every delegatecall
|
|
8
|
+
* clone reports the shared implementation address, NOT its own clone address.
|
|
9
|
+
* Passing the clone address yields an id the hook never matches, so the pay or
|
|
10
|
+
* cash out silently ignores the tier/token payload. Resolve the target with
|
|
11
|
+
* `get721MetadataIdTarget` rather than passing a hook address directly.
|
|
12
|
+
*
|
|
13
|
+
* @link https://github.com/Bananapus/nana-core-v6/blob/main/src/libraries/JBMetadataResolver.sol (`getId`)
|
|
14
|
+
*/
|
|
15
|
+
export declare function hookMetadataId(target: Address, purpose: string): Hex;
|
|
1
16
|
/**
|
|
2
17
|
*
|
|
3
18
|
* Create metadata for pay or redeem hooks.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../../../src/utils/hook.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../../../src/utils/hook.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EAEP,GAAG,EAMJ,MAAM,MAAM,CAAC;AAEd;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,GAAG,CAKpE;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,iBA8CpE"}
|
package/dist/cjs/utils/hook.js
CHANGED
|
@@ -1,7 +1,27 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.hookMetadataId = hookMetadataId;
|
|
3
4
|
exports.createHookMetadata = createHookMetadata;
|
|
4
5
|
const viem_1 = require("viem");
|
|
6
|
+
/**
|
|
7
|
+
* The metadata lookup id a JB hook resolves via `JBMetadataResolver.getId`:
|
|
8
|
+
* `bytes4(bytes20(target) ^ bytes20(keccak256(purpose)))`.
|
|
9
|
+
*
|
|
10
|
+
* For JB721 hooks, `target` MUST be the hook's `METADATA_ID_TARGET` — which is
|
|
11
|
+
* `address(this)` in the *implementation's* constructor, so every delegatecall
|
|
12
|
+
* clone reports the shared implementation address, NOT its own clone address.
|
|
13
|
+
* Passing the clone address yields an id the hook never matches, so the pay or
|
|
14
|
+
* cash out silently ignores the tier/token payload. Resolve the target with
|
|
15
|
+
* `get721MetadataIdTarget` rather than passing a hook address directly.
|
|
16
|
+
*
|
|
17
|
+
* @link https://github.com/Bananapus/nana-core-v6/blob/main/src/libraries/JBMetadataResolver.sol (`getId`)
|
|
18
|
+
*/
|
|
19
|
+
function hookMetadataId(target, purpose) {
|
|
20
|
+
const targetBytes = (0, viem_1.toBytes)(target).slice(0, 20);
|
|
21
|
+
const purposeBytes = (0, viem_1.toBytes)((0, viem_1.keccak256)((0, viem_1.toBytes)(purpose))).slice(0, 20);
|
|
22
|
+
const xored = targetBytes.map((byte, i) => byte ^ purposeBytes[i]);
|
|
23
|
+
return (0, viem_1.bytesToHex)(xored.slice(0, 4));
|
|
24
|
+
}
|
|
5
25
|
/**
|
|
6
26
|
*
|
|
7
27
|
* Create metadata for pay or redeem hooks.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook.js","sourceRoot":"","sources":["../../../src/utils/hook.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"hook.js","sourceRoot":"","sources":["../../../src/utils/hook.ts"],"names":[],"mappings":";;AAwBA,wCAKC;AASD,gDA8CC;AApFD,+BASc;AAEd;;;;;;;;;;;;GAYG;AACH,SAAgB,cAAc,CAAC,MAAe,EAAE,OAAe;IAC7D,MAAM,WAAW,GAAG,IAAA,cAAO,EAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACjD,MAAM,YAAY,GAAG,IAAA,cAAO,EAAC,IAAA,gBAAS,EAAC,IAAA,cAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACvE,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,OAAO,IAAA,iBAAU,EAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACvC,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,kBAAkB,CAAC,GAAa,EAAE,SAAmB;IACnE,gBAAgB;IAChB,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAExE,oEAAoE;IACpE,IAAI,QAAQ,GAAG,IAAA,mBAAY,EAAC,CAAC,SAAS,CAAC,EAAE,CAAC,eAAQ,CAAC,CAAC,CAAC;IAErD,oEAAoE;IACpE,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,sFAAsF;IACtF,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAEjC,kHAAkH;IAClH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,8BAA8B;QAC9B,QAAQ,IAAI,IAAA,mBAAY,EAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAEhE,QAAQ,IAAI,IAAA,mBAAY,EAAC,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACvD,kFAAkF;QAClF,MAAM,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC;QAEnC,wBAAwB;QACxB,IAAI,MAAM,GAAG,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAC5D,CAAC;IAED,qCAAqC;IACrC,IAAI,YAAY,GACd,QAAQ,CAAC,MAAM,GAAG,EAAE,KAAK,CAAC;QACxB,CAAC,CAAC,QAAQ,CAAC,MAAM;QACjB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IAE/C,yBAAyB;IACzB,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,YAAY,GAAG,CAAC,EAAE,GAAG,CAAS,CAAC;IAE1D,0DAA0D;IAC1D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,2BAA2B;QAC3B,QAAQ,IAAI,IAAA,mBAAY,EACtB,CAAC,OAAO,CAAC,EACT,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,EAAE,GAAG,CAAS,CAAC,CACjD,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACb,CAAC;IAED,2BAA2B;IAC3B,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC"}
|
package/dist/cjs/utils/index.js
CHANGED
|
@@ -21,6 +21,7 @@ __exportStar(require("./deploy.js"), exports);
|
|
|
21
21
|
__exportStar(require("./fee.js"), exports);
|
|
22
22
|
__exportStar(require("./format.js"), exports);
|
|
23
23
|
__exportStar(require("./hook.js"), exports);
|
|
24
|
+
__exportStar(require("./ipfs.js"), exports);
|
|
24
25
|
__exportStar(require("./revnet.js"), exports);
|
|
25
26
|
__exportStar(require("./ruleset.js"), exports);
|
|
26
27
|
__exportStar(require("./token.js"), exports);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iDAA+B;AAC/B,4CAA0B;AAC1B,6CAA2B;AAC3B,8CAA4B;AAC5B,2CAAyB;AACzB,8CAA4B;AAC5B,4CAA0B;AAC1B,8CAA4B;AAC5B,+CAA6B;AAC7B,6CAA2B;AAC3B,0CAAwB;AACxB,2CAAyB"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iDAA+B;AAC/B,4CAA0B;AAC1B,6CAA2B;AAC3B,8CAA4B;AAC5B,2CAAyB;AACzB,8CAA4B;AAC5B,4CAA0B;AAC1B,4CAA0B;AAC1B,8CAA4B;AAC5B,+CAA6B;AAC7B,6CAA2B;AAC3B,0CAAwB;AACxB,2CAAyB"}
|
package/dist/cjs/utils/ipfs.d.ts
CHANGED
|
@@ -1,12 +1,44 @@
|
|
|
1
1
|
export declare function ipfsGatewayUrl(cid: string | undefined, gatewayHostname?: string): string;
|
|
2
|
+
/** Return an `ipfs://` URI for a CID and optional path. */
|
|
3
|
+
export declare function ipfsUri(cid: string, path?: string): string;
|
|
4
|
+
/** Whether a value uses the native `ipfs://` URI scheme. */
|
|
5
|
+
export declare function isIpfsUri(value: string): boolean;
|
|
6
|
+
/**
|
|
7
|
+
* Extract the immutable `<cid>[/path]` part of an IPFS URI or HTTP gateway URL.
|
|
8
|
+
*
|
|
9
|
+
* Both path gateways (`https://host/ipfs/<cid>`) and CID subdomain gateways
|
|
10
|
+
* (`https://<cid>.ipfs.host/path`) are recognized. Returns `null` for ordinary
|
|
11
|
+
* HTTP URLs and malformed values.
|
|
12
|
+
*/
|
|
13
|
+
export declare function ipfsAssetPath(value: string): string | null;
|
|
14
|
+
/** Return the CID (without a path) from an IPFS URI or gateway URL. */
|
|
15
|
+
export declare function cidFromIpfsUri(value: string): string | null;
|
|
16
|
+
/** A lightweight CIDv0 / base32 CIDv1 shape check. */
|
|
17
|
+
export declare function isIpfsCid(value: string): boolean;
|
|
2
18
|
/**
|
|
3
19
|
* Return a hex-encoded CID to store on-chain.
|
|
4
20
|
* Hex-encoded CIDs are used to store some CIDs on-chain because they are more gas-efficient.
|
|
5
21
|
*/
|
|
6
|
-
export declare function encodeIpfsUri(cid: string): string
|
|
22
|
+
export declare function encodeIpfsUri(cid: string): `0x${string}`;
|
|
7
23
|
/**
|
|
8
24
|
* Return the IPFS CID from a given hex-endoded string.
|
|
9
25
|
* Hex-encoded CIDs are used to store some CIDs on-chain because they are more gas-efficient.
|
|
10
26
|
*/
|
|
11
27
|
export declare function decodeEncodedIpfsUri(hex: string): string;
|
|
28
|
+
/** Strict alias describing the on-chain representation more explicitly. */
|
|
29
|
+
export declare const cidV0ToBytes32: typeof encodeIpfsUri;
|
|
30
|
+
/**
|
|
31
|
+
* Decode a bytes32 sha2-256 digest into a CIDv0, returning `null` for the zero
|
|
32
|
+
* value or malformed input instead of throwing.
|
|
33
|
+
*/
|
|
34
|
+
export declare function bytes32ToCidV0(value: string): string | null;
|
|
35
|
+
/**
|
|
36
|
+
* Decode a stored tier metadata digest into equivalent immutable URI forms.
|
|
37
|
+
*
|
|
38
|
+
* The first candidate is the conventional DAG-PB CIDv0 used by Juicebox 721
|
|
39
|
+
* metadata. The second is a raw-codec CIDv1 over the same multihash, retained
|
|
40
|
+
* as a fallback for content that was pinned with a raw block codec. Legacy
|
|
41
|
+
* 33-byte values with a leading version marker are accepted as well.
|
|
42
|
+
*/
|
|
43
|
+
export declare function decodeEncodedIpfsUriCandidates(value: string | undefined | null): readonly [string, string] | null;
|
|
12
44
|
//# sourceMappingURL=ipfs.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ipfs.d.ts","sourceRoot":"","sources":["../../../src/utils/ipfs.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ipfs.d.ts","sourceRoot":"","sources":["../../../src/utils/ipfs.ts"],"names":[],"mappings":"AAaA,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,eAAe,CAAC,EAAE,MAAM,GACvB,MAAM,CAIR;AAED,2DAA2D;AAC3D,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED,4DAA4D;AAC5D,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEhD;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAwB1D;AAED,uEAAuE;AACvE,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG3D;AAED,sDAAsD;AACtD,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAKhD;AA2GD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,iBAWxC;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,UAS/C;AAED,2EAA2E;AAC3E,eAAO,MAAM,cAAc,sBAAgB,CAAC;AAE5C;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM3D;AAED;;;;;;;GAOG;AACH,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAC/B,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAgBlC"}
|
package/dist/cjs/utils/ipfs.js
CHANGED
|
@@ -3,32 +3,236 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.cidV0ToBytes32 = void 0;
|
|
6
7
|
exports.ipfsGatewayUrl = ipfsGatewayUrl;
|
|
8
|
+
exports.ipfsUri = ipfsUri;
|
|
9
|
+
exports.isIpfsUri = isIpfsUri;
|
|
10
|
+
exports.ipfsAssetPath = ipfsAssetPath;
|
|
11
|
+
exports.cidFromIpfsUri = cidFromIpfsUri;
|
|
12
|
+
exports.isIpfsCid = isIpfsCid;
|
|
7
13
|
exports.encodeIpfsUri = encodeIpfsUri;
|
|
8
14
|
exports.decodeEncodedIpfsUri = decodeEncodedIpfsUri;
|
|
15
|
+
exports.bytes32ToCidV0 = bytes32ToCidV0;
|
|
16
|
+
exports.decodeEncodedIpfsUriCandidates = decodeEncodedIpfsUriCandidates;
|
|
9
17
|
const bs58_1 = __importDefault(require("bs58"));
|
|
10
18
|
const PUBLIC_IPFS_GATEWAY_HOSTNAME = "ipfs.io";
|
|
19
|
+
const IPFS_URI_PREFIX = "ipfs://";
|
|
20
|
+
const SHA2_256_MULTIHASH_PREFIX = new Uint8Array([0x12, 0x20]);
|
|
21
|
+
const BASE32_ALPHABET = "abcdefghijklmnopqrstuvwxyz234567";
|
|
22
|
+
function validatedIpfsAssetPath(value) {
|
|
23
|
+
const cid = value.split("/")[0];
|
|
24
|
+
return cid && isIpfsCid(cid) ? value : null;
|
|
25
|
+
}
|
|
11
26
|
function ipfsGatewayUrl(cid, gatewayHostname) {
|
|
12
27
|
return `https://${gatewayHostname ?? PUBLIC_IPFS_GATEWAY_HOSTNAME}/ipfs/${cid}`;
|
|
13
28
|
}
|
|
29
|
+
/** Return an `ipfs://` URI for a CID and optional path. */
|
|
30
|
+
function ipfsUri(cid, path) {
|
|
31
|
+
const suffix = path ? `/${path.replace(/^\/+/, "")}` : "";
|
|
32
|
+
return `${IPFS_URI_PREFIX}${cid}${suffix}`;
|
|
33
|
+
}
|
|
34
|
+
/** Whether a value uses the native `ipfs://` URI scheme. */
|
|
35
|
+
function isIpfsUri(value) {
|
|
36
|
+
return value.startsWith(IPFS_URI_PREFIX);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Extract the immutable `<cid>[/path]` part of an IPFS URI or HTTP gateway URL.
|
|
40
|
+
*
|
|
41
|
+
* Both path gateways (`https://host/ipfs/<cid>`) and CID subdomain gateways
|
|
42
|
+
* (`https://<cid>.ipfs.host/path`) are recognized. Returns `null` for ordinary
|
|
43
|
+
* HTTP URLs and malformed values.
|
|
44
|
+
*/
|
|
45
|
+
function ipfsAssetPath(value) {
|
|
46
|
+
const trimmed = value.trim();
|
|
47
|
+
if (!trimmed)
|
|
48
|
+
return null;
|
|
49
|
+
if (trimmed.startsWith(IPFS_URI_PREFIX)) {
|
|
50
|
+
const path = trimmed.slice(IPFS_URI_PREFIX.length);
|
|
51
|
+
return validatedIpfsAssetPath(path);
|
|
52
|
+
}
|
|
53
|
+
try {
|
|
54
|
+
const url = new URL(trimmed);
|
|
55
|
+
const pathMatch = /^\/ipfs\/([^/]+)(\/.*)?$/i.exec(url.pathname);
|
|
56
|
+
if (pathMatch) {
|
|
57
|
+
return validatedIpfsAssetPath(`${pathMatch[1]}${pathMatch[2] ?? ""}`);
|
|
58
|
+
}
|
|
59
|
+
const [subdomain, marker] = url.hostname.split(".");
|
|
60
|
+
if (marker === "ipfs" && isIpfsCid(subdomain)) {
|
|
61
|
+
return `${subdomain}${url.pathname === "/" ? "" : url.pathname}`;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
/** Return the CID (without a path) from an IPFS URI or gateway URL. */
|
|
70
|
+
function cidFromIpfsUri(value) {
|
|
71
|
+
const path = ipfsAssetPath(value);
|
|
72
|
+
return path?.split("/")[0] || null;
|
|
73
|
+
}
|
|
74
|
+
/** A lightweight CIDv0 / base32 CIDv1 shape check. */
|
|
75
|
+
function isIpfsCid(value) {
|
|
76
|
+
return (/^Qm[1-9A-HJ-NP-Za-km-z]{44}$/.test(value) ||
|
|
77
|
+
/^b[a-z2-7]{20,120}$/.test(value.toLowerCase()));
|
|
78
|
+
}
|
|
79
|
+
function bytesToHex(bytes) {
|
|
80
|
+
return `0x${Array.from(bytes, (byte) => byte.toString(16).padStart(2, "0")).join("")}`;
|
|
81
|
+
}
|
|
82
|
+
function hexToBytes(value) {
|
|
83
|
+
const hex = value.startsWith("0x") ? value.slice(2) : value;
|
|
84
|
+
if (!/^[0-9a-fA-F]*$/.test(hex) || hex.length % 2 !== 0) {
|
|
85
|
+
throw new Error("Expected an even-length hexadecimal value.");
|
|
86
|
+
}
|
|
87
|
+
return Uint8Array.from({ length: hex.length / 2 }, (_, index) => Number.parseInt(hex.slice(index * 2, index * 2 + 2), 16));
|
|
88
|
+
}
|
|
89
|
+
function cidV0Digest(cid) {
|
|
90
|
+
const decoded = bs58_1.default.decode(cid);
|
|
91
|
+
if (decoded.length !== 34 ||
|
|
92
|
+
decoded[0] !== SHA2_256_MULTIHASH_PREFIX[0] ||
|
|
93
|
+
decoded[1] !== SHA2_256_MULTIHASH_PREFIX[1]) {
|
|
94
|
+
throw new Error("Expected a CIDv0 using a 32-byte sha2-256 multihash.");
|
|
95
|
+
}
|
|
96
|
+
return decoded.slice(2);
|
|
97
|
+
}
|
|
98
|
+
function base32Encode(bytes) {
|
|
99
|
+
let result = "";
|
|
100
|
+
let buffer = 0;
|
|
101
|
+
let bits = 0;
|
|
102
|
+
for (const byte of bytes) {
|
|
103
|
+
buffer = (buffer << 8) | byte;
|
|
104
|
+
bits += 8;
|
|
105
|
+
while (bits >= 5) {
|
|
106
|
+
result += BASE32_ALPHABET[(buffer >>> (bits - 5)) & 31];
|
|
107
|
+
bits -= 5;
|
|
108
|
+
buffer &= bits === 0 ? 0 : (1 << bits) - 1;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
if (bits > 0)
|
|
112
|
+
result += BASE32_ALPHABET[(buffer << (5 - bits)) & 31];
|
|
113
|
+
return result;
|
|
114
|
+
}
|
|
115
|
+
function base32Decode(value) {
|
|
116
|
+
const input = value.trim().toLowerCase().replace(/^b/, "").replace(/=+$/, "");
|
|
117
|
+
const output = [];
|
|
118
|
+
let buffer = 0;
|
|
119
|
+
let bits = 0;
|
|
120
|
+
for (const character of input) {
|
|
121
|
+
const index = BASE32_ALPHABET.indexOf(character);
|
|
122
|
+
if (index < 0)
|
|
123
|
+
throw new Error(`Invalid base32 character: ${character}.`);
|
|
124
|
+
buffer = (buffer << 5) | index;
|
|
125
|
+
bits += 5;
|
|
126
|
+
if (bits >= 8) {
|
|
127
|
+
output.push((buffer >>> (bits - 8)) & 0xff);
|
|
128
|
+
bits -= 8;
|
|
129
|
+
buffer &= bits === 0 ? 0 : (1 << bits) - 1;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return Uint8Array.from(output);
|
|
133
|
+
}
|
|
134
|
+
function readVarint(bytes, offset) {
|
|
135
|
+
let value = 0;
|
|
136
|
+
let shift = 0;
|
|
137
|
+
for (let index = offset; index < bytes.length; index++) {
|
|
138
|
+
const byte = bytes[index];
|
|
139
|
+
value += (byte & 0x7f) * 2 ** shift;
|
|
140
|
+
if ((byte & 0x80) === 0)
|
|
141
|
+
return { value, offset: index + 1 };
|
|
142
|
+
shift += 7;
|
|
143
|
+
if (shift > 49)
|
|
144
|
+
throw new Error("The CID varint is too large.");
|
|
145
|
+
}
|
|
146
|
+
throw new Error("The CID varint is truncated.");
|
|
147
|
+
}
|
|
148
|
+
function cidV1Digest(cid) {
|
|
149
|
+
if (!cid.toLowerCase().startsWith("b")) {
|
|
150
|
+
throw new Error("Expected a base32 CIDv1.");
|
|
151
|
+
}
|
|
152
|
+
const bytes = base32Decode(cid);
|
|
153
|
+
const version = readVarint(bytes, 0);
|
|
154
|
+
const codec = readVarint(bytes, version.offset);
|
|
155
|
+
const hashCode = readVarint(bytes, codec.offset);
|
|
156
|
+
const hashLength = readVarint(bytes, hashCode.offset);
|
|
157
|
+
if (version.value !== 1)
|
|
158
|
+
throw new Error("Expected a CIDv1.");
|
|
159
|
+
if (codec.value !== 0x70) {
|
|
160
|
+
throw new Error("Only DAG-PB CIDv1 metadata can be stored in a bytes32 IPFS slot.");
|
|
161
|
+
}
|
|
162
|
+
if (hashCode.value !== 0x12 || hashLength.value !== 32) {
|
|
163
|
+
throw new Error("Expected a CID using a 32-byte sha2-256 multihash.");
|
|
164
|
+
}
|
|
165
|
+
const digest = bytes.slice(hashLength.offset);
|
|
166
|
+
if (digest.length !== hashLength.value) {
|
|
167
|
+
throw new Error("The CID multihash length is invalid.");
|
|
168
|
+
}
|
|
169
|
+
return digest;
|
|
170
|
+
}
|
|
14
171
|
/**
|
|
15
172
|
* Return a hex-encoded CID to store on-chain.
|
|
16
173
|
* Hex-encoded CIDs are used to store some CIDs on-chain because they are more gas-efficient.
|
|
17
174
|
*/
|
|
18
175
|
function encodeIpfsUri(cid) {
|
|
19
|
-
|
|
176
|
+
const assetPath = ipfsAssetPath(cid);
|
|
177
|
+
if (assetPath?.includes("/")) {
|
|
178
|
+
throw new Error("A bytes32 IPFS digest cannot include a path.");
|
|
179
|
+
}
|
|
180
|
+
const candidate = assetPath ?? cid;
|
|
181
|
+
return bytesToHex(candidate.toLowerCase().startsWith("b")
|
|
182
|
+
? cidV1Digest(candidate)
|
|
183
|
+
: cidV0Digest(candidate));
|
|
20
184
|
}
|
|
21
185
|
/**
|
|
22
186
|
* Return the IPFS CID from a given hex-endoded string.
|
|
23
187
|
* Hex-encoded CIDs are used to store some CIDs on-chain because they are more gas-efficient.
|
|
24
188
|
*/
|
|
25
189
|
function decodeEncodedIpfsUri(hex) {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
190
|
+
const digest = hexToBytes(hex);
|
|
191
|
+
if (digest.length !== 32) {
|
|
192
|
+
throw new Error("Expected a bytes32 IPFS digest.");
|
|
193
|
+
}
|
|
194
|
+
if (digest.every((byte) => byte === 0)) {
|
|
195
|
+
throw new Error("The zero bytes32 value does not contain an IPFS CID.");
|
|
196
|
+
}
|
|
197
|
+
return bs58_1.default.encode(new Uint8Array([...SHA2_256_MULTIHASH_PREFIX, ...digest]));
|
|
198
|
+
}
|
|
199
|
+
/** Strict alias describing the on-chain representation more explicitly. */
|
|
200
|
+
exports.cidV0ToBytes32 = encodeIpfsUri;
|
|
201
|
+
/**
|
|
202
|
+
* Decode a bytes32 sha2-256 digest into a CIDv0, returning `null` for the zero
|
|
203
|
+
* value or malformed input instead of throwing.
|
|
204
|
+
*/
|
|
205
|
+
function bytes32ToCidV0(value) {
|
|
206
|
+
try {
|
|
207
|
+
return decodeEncodedIpfsUri(value);
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
return null;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Decode a stored tier metadata digest into equivalent immutable URI forms.
|
|
215
|
+
*
|
|
216
|
+
* The first candidate is the conventional DAG-PB CIDv0 used by Juicebox 721
|
|
217
|
+
* metadata. The second is a raw-codec CIDv1 over the same multihash, retained
|
|
218
|
+
* as a fallback for content that was pinned with a raw block codec. Legacy
|
|
219
|
+
* 33-byte values with a leading version marker are accepted as well.
|
|
220
|
+
*/
|
|
221
|
+
function decodeEncodedIpfsUriCandidates(value) {
|
|
222
|
+
if (!value)
|
|
223
|
+
return null;
|
|
224
|
+
let hex = value.startsWith("0x") ? value.slice(2) : value;
|
|
225
|
+
if (hex.length === 66)
|
|
226
|
+
hex = hex.slice(2);
|
|
227
|
+
const cidV0 = bytes32ToCidV0(hex);
|
|
228
|
+
if (!cidV0)
|
|
229
|
+
return null;
|
|
230
|
+
const multihash = new Uint8Array([
|
|
231
|
+
...SHA2_256_MULTIHASH_PREFIX,
|
|
232
|
+
...hexToBytes(hex),
|
|
233
|
+
]);
|
|
234
|
+
// CIDv1 (0x01), raw codec (0x55), then the same sha2-256 multihash.
|
|
235
|
+
const rawCidV1 = `b${base32Encode(new Uint8Array([0x01, 0x55, ...multihash]))}`;
|
|
236
|
+
return [ipfsUri(cidV0), ipfsUri(rawCidV1)];
|
|
33
237
|
}
|
|
34
238
|
//# sourceMappingURL=ipfs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ipfs.js","sourceRoot":"","sources":["../../../src/utils/ipfs.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ipfs.js","sourceRoot":"","sources":["../../../src/utils/ipfs.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,10 @@ const vitest_1 = require("vitest");
|
|
|
8
8
|
const ipfs_js_1 = require("./ipfs.js");
|
|
9
9
|
const cid = "QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR";
|
|
10
10
|
const cidCorrespondingHex = "c3c4733ec8affd06cf9e9ff50ffc6bcd2ec85a6170004bb709669c31de94391a";
|
|
11
|
+
const digest = "0xbdb815453bdd29f5af61a541e6382e7aace86076a9ba3ca3f6b3bdf7c58aa27f";
|
|
12
|
+
const cidV0 = "Qmb7EZvTHUeVTDi6YmwDFQvKEfCR4UGciUka24coJcNJzS";
|
|
13
|
+
const dagPbCidV1 = "bafybeif5xakuko65fh226ynfihtdqlt2vtuga5vjxi6kh5vtxx34lcvcp4";
|
|
14
|
+
const rawCidV1 = "bafkreif5xakuko65fh226ynfihtdqlt2vtuga5vjxi6kh5vtxx34lcvcp4";
|
|
11
15
|
(0, vitest_1.describe)("IPFS utilities", () => {
|
|
12
16
|
(0, vitest_1.test)("generates IPFS gateway URL correctly", () => {
|
|
13
17
|
(0, vitest_1.expect)((0, ipfs_js_1.ipfsGatewayUrl)(cid)).toEqual(`https://ipfs.io/ipfs/${cid}`);
|
|
@@ -29,5 +33,35 @@ const cidCorrespondingHex = "c3c4733ec8affd06cf9e9ff50ffc6bcd2ec85a6170004bb7096
|
|
|
29
33
|
const decodedCid = (0, ipfs_js_1.decodeEncodedIpfsUri)(hexEncoded);
|
|
30
34
|
(0, vitest_1.expect)(decodedCid).toEqual(cid);
|
|
31
35
|
});
|
|
36
|
+
(0, vitest_1.test)("normalizes native, path-gateway, and subdomain-gateway locations", () => {
|
|
37
|
+
(0, vitest_1.expect)((0, ipfs_js_1.ipfsUri)(cid, "/metadata.json")).toBe(`ipfs://${cid}/metadata.json`);
|
|
38
|
+
(0, vitest_1.expect)((0, ipfs_js_1.ipfsAssetPath)(`ipfs://${cid}/metadata.json`)).toBe(`${cid}/metadata.json`);
|
|
39
|
+
(0, vitest_1.expect)((0, ipfs_js_1.ipfsAssetPath)(`https://gateway.example/ipfs/${cid}/metadata.json`)).toBe(`${cid}/metadata.json`);
|
|
40
|
+
(0, vitest_1.expect)((0, ipfs_js_1.ipfsAssetPath)(`https://${dagPbCidV1}.ipfs.example/metadata.json`)).toBe(`${dagPbCidV1}/metadata.json`);
|
|
41
|
+
(0, vitest_1.expect)((0, ipfs_js_1.cidFromIpfsUri)(`ipfs://${cid}/metadata.json`)).toBe(cid);
|
|
42
|
+
(0, vitest_1.expect)((0, ipfs_js_1.ipfsAssetPath)("https://example.com/metadata.json")).toBeNull();
|
|
43
|
+
(0, vitest_1.expect)((0, ipfs_js_1.ipfsAssetPath)("ipfs://not-a-cid/metadata.json")).toBeNull();
|
|
44
|
+
(0, vitest_1.expect)((0, ipfs_js_1.ipfsAssetPath)("https://gateway.example/ipfs/not-a-cid/metadata.json")).toBeNull();
|
|
45
|
+
});
|
|
46
|
+
(0, vitest_1.test)("encodes equivalent CIDv0 and DAG-PB CIDv1 values identically", () => {
|
|
47
|
+
(0, vitest_1.expect)((0, ipfs_js_1.encodeIpfsUri)(`ipfs://${cidV0}`)).toBe(digest);
|
|
48
|
+
(0, vitest_1.expect)((0, ipfs_js_1.encodeIpfsUri)(`ipfs://${dagPbCidV1}`)).toBe(digest);
|
|
49
|
+
(0, vitest_1.expect)(() => (0, ipfs_js_1.encodeIpfsUri)(`ipfs://${rawCidV1}`)).toThrow(/DAG-PB/);
|
|
50
|
+
(0, vitest_1.expect)(() => (0, ipfs_js_1.encodeIpfsUri)(`ipfs://${cidV0}/metadata.json`)).toThrow(/cannot include a path/);
|
|
51
|
+
});
|
|
52
|
+
(0, vitest_1.test)("reconstructs CIDv0 and raw CIDv1 candidates from a stored digest", () => {
|
|
53
|
+
(0, vitest_1.expect)((0, ipfs_js_1.decodeEncodedIpfsUriCandidates)(digest)).toEqual([
|
|
54
|
+
`ipfs://${cidV0}`,
|
|
55
|
+
`ipfs://${rawCidV1}`,
|
|
56
|
+
]);
|
|
57
|
+
(0, vitest_1.expect)((0, ipfs_js_1.bytes32ToCidV0)(digest)).toBe(cidV0);
|
|
58
|
+
(0, vitest_1.expect)((0, ipfs_js_1.bytes32ToCidV0)(`0x${"0".repeat(64)}`)).toBeNull();
|
|
59
|
+
(0, vitest_1.expect)((0, ipfs_js_1.decodeEncodedIpfsUriCandidates)("0x1234")).toBeNull();
|
|
60
|
+
});
|
|
61
|
+
(0, vitest_1.test)("recognizes supported CID shapes", () => {
|
|
62
|
+
(0, vitest_1.expect)((0, ipfs_js_1.isIpfsCid)(cidV0)).toBe(true);
|
|
63
|
+
(0, vitest_1.expect)((0, ipfs_js_1.isIpfsCid)(dagPbCidV1)).toBe(true);
|
|
64
|
+
(0, vitest_1.expect)((0, ipfs_js_1.isIpfsCid)("not-a-cid")).toBe(false);
|
|
65
|
+
});
|
|
32
66
|
});
|
|
33
67
|
//# sourceMappingURL=ipfs.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ipfs.test.js","sourceRoot":"","sources":["../../../src/utils/ipfs.test.ts"],"names":[],"mappings":";;;;;AAAA,gDAAwB;AACxB,mCAAgD;AAChD,
|
|
1
|
+
{"version":3,"file":"ipfs.test.js","sourceRoot":"","sources":["../../../src/utils/ipfs.test.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/v6/cashOut.d.ts
CHANGED
|
@@ -40,6 +40,29 @@ export declare function buildCashOutTx({ chainId, terminal, holder, projectId, c
|
|
|
40
40
|
beneficiary: Address;
|
|
41
41
|
metadata?: Hex;
|
|
42
42
|
}): V6CashOutTxRequest;
|
|
43
|
+
/**
|
|
44
|
+
* Build cash-out metadata instructing a project's JB721 tiers hook to burn
|
|
45
|
+
* specific NFTs and reclaim their share of surplus.
|
|
46
|
+
*
|
|
47
|
+
* The payload is `abi.encode(uint256[] tokenIds)`, keyed by the hook's cash-out
|
|
48
|
+
* metadata id (`bytes4(bytes20(metadataIdTarget) ^ bytes20(keccak256("cashOut")))`)
|
|
49
|
+
* and packed into the JBMetadataResolver word-offset-table format. This is the
|
|
50
|
+
* cash-out mirror of {@link build721PayMetadata}. The NFTs are burned by the hook
|
|
51
|
+
* itself, so no ERC-721 approval is needed; pass `cashOutCount: 0` to
|
|
52
|
+
* `cashOutTokensOf` (fungible tokens cannot co-redeem in the same call).
|
|
53
|
+
*
|
|
54
|
+
* @param args.metadataIdTarget The hook's `METADATA_ID_TARGET` — the shared
|
|
55
|
+
* *implementation* address, NOT the project's clone hook address (see
|
|
56
|
+
* {@link get721MetadataIdTarget}). Passing the clone address makes the hook ignore
|
|
57
|
+
* the token ids and no NFTs are burned.
|
|
58
|
+
* @param args.tokenIds The token ids of the NFTs to redeem. Must be non-empty,
|
|
59
|
+
* unique, and non-zero (a real NFT token id is never 0).
|
|
60
|
+
* @returns The metadata to pass as `cashOutTokensOf`'s `metadata` argument.
|
|
61
|
+
*/
|
|
62
|
+
export declare function build721CashOutMetadata({ metadataIdTarget, tokenIds, }: {
|
|
63
|
+
metadataIdTarget: Address;
|
|
64
|
+
tokenIds: bigint[];
|
|
65
|
+
}): Hex;
|
|
43
66
|
/**
|
|
44
67
|
* A cash out quote.
|
|
45
68
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cashOut.d.ts","sourceRoot":"","sources":["../../../src/v6/cashOut.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"cashOut.d.ts","sourceRoot":"","sources":["../../../src/v6/cashOut.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,EAAuB,MAAM,MAAM,CAAC;AACvE,OAAO,EACL,kBAAkB,EAEnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAMxC;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,SAAS,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,OAAO,kBAAkB,CAAC;IAC/B,YAAY,EAAE,iBAAiB,CAAC;IAChC,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;CACzE;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,cAAc,CAAC,EAC7B,OAAO,EACP,QAAQ,EACR,MAAM,EACN,SAAS,EACT,YAAY,EACZ,cAAc,EACd,kBAAuB,EACvB,WAAW,EACX,QAAe,GAChB,EAAE;IACD,OAAO,EAAE,SAAS,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,OAAO,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,GAAG,CAAC;CAChB,GAAG,kBAAkB,CAgBrB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,uBAAuB,CAAC,EACtC,gBAAgB,EAChB,QAAQ,GACT,EAAE;IACD,gBAAgB,EAAE,OAAO,CAAC;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,GAAG,GAAG,CAiBN;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,aAAa,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,YAAY,EACpB,EACE,OAAO,EACP,SAAS,EACT,YAAY,EACZ,QAAc,EACd,QAA2C,GAC5C,EAAE;IACD,OAAO,EAAE,SAAS,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GACA,OAAO,CAAC,YAAY,CAAC,CAYvB"}
|
package/dist/cjs/v6/cashOut.js
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.buildCashOutTx = buildCashOutTx;
|
|
4
|
+
exports.build721CashOutMetadata = build721CashOutMetadata;
|
|
4
5
|
exports.getCashOutQuote = getCashOutQuote;
|
|
6
|
+
const viem_1 = require("viem");
|
|
5
7
|
const juicebox_js_1 = require("../generated/juicebox.js");
|
|
6
8
|
const fee_js_1 = require("../utils/fee.js");
|
|
9
|
+
const hook_js_1 = require("../utils/hook.js");
|
|
7
10
|
const currency_js_1 = require("./currency.js");
|
|
8
11
|
const types_js_1 = require("./types.js");
|
|
9
12
|
/**
|
|
@@ -40,6 +43,38 @@ function buildCashOutTx({ chainId, terminal, holder, projectId, cashOutCount, to
|
|
|
40
43
|
],
|
|
41
44
|
};
|
|
42
45
|
}
|
|
46
|
+
/**
|
|
47
|
+
* Build cash-out metadata instructing a project's JB721 tiers hook to burn
|
|
48
|
+
* specific NFTs and reclaim their share of surplus.
|
|
49
|
+
*
|
|
50
|
+
* The payload is `abi.encode(uint256[] tokenIds)`, keyed by the hook's cash-out
|
|
51
|
+
* metadata id (`bytes4(bytes20(metadataIdTarget) ^ bytes20(keccak256("cashOut")))`)
|
|
52
|
+
* and packed into the JBMetadataResolver word-offset-table format. This is the
|
|
53
|
+
* cash-out mirror of {@link build721PayMetadata}. The NFTs are burned by the hook
|
|
54
|
+
* itself, so no ERC-721 approval is needed; pass `cashOutCount: 0` to
|
|
55
|
+
* `cashOutTokensOf` (fungible tokens cannot co-redeem in the same call).
|
|
56
|
+
*
|
|
57
|
+
* @param args.metadataIdTarget The hook's `METADATA_ID_TARGET` — the shared
|
|
58
|
+
* *implementation* address, NOT the project's clone hook address (see
|
|
59
|
+
* {@link get721MetadataIdTarget}). Passing the clone address makes the hook ignore
|
|
60
|
+
* the token ids and no NFTs are burned.
|
|
61
|
+
* @param args.tokenIds The token ids of the NFTs to redeem. Must be non-empty,
|
|
62
|
+
* unique, and non-zero (a real NFT token id is never 0).
|
|
63
|
+
* @returns The metadata to pass as `cashOutTokensOf`'s `metadata` argument.
|
|
64
|
+
*/
|
|
65
|
+
function build721CashOutMetadata({ metadataIdTarget, tokenIds, }) {
|
|
66
|
+
if (tokenIds.length === 0) {
|
|
67
|
+
throw new Error("build721CashOutMetadata requires at least one token id");
|
|
68
|
+
}
|
|
69
|
+
if (new Set(tokenIds.map(String)).size !== tokenIds.length) {
|
|
70
|
+
throw new Error("build721CashOutMetadata token ids must be unique");
|
|
71
|
+
}
|
|
72
|
+
if (tokenIds.some((tokenId) => tokenId <= 0n)) {
|
|
73
|
+
throw new Error("build721CashOutMetadata token ids must be positive");
|
|
74
|
+
}
|
|
75
|
+
const payload = (0, viem_1.encodeAbiParameters)([{ type: "uint256[]" }], [tokenIds]);
|
|
76
|
+
return (0, hook_js_1.createHookMetadata)([(0, hook_js_1.hookMetadataId)(metadataIdTarget, "cashOut")], [payload]);
|
|
77
|
+
}
|
|
43
78
|
/**
|
|
44
79
|
* Quote the surplus reclaimed by cashing out `cashOutCount` project tokens, via
|
|
45
80
|
* `JBTerminalStore.currentReclaimableSurplusOf(projectId, cashOutCount, [], [],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cashOut.js","sourceRoot":"","sources":["../../../src/v6/cashOut.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"cashOut.js","sourceRoot":"","sources":["../../../src/v6/cashOut.ts"],"names":[],"mappings":";;AAwCA,wCAoCC;AAqBD,0DAuBC;AAyCD,0CA2BC;AA5LD,+BAAuE;AACvE,0DAGkC;AAElC,4CAAuD;AACvD,8CAAsE;AACtE,+CAAyD;AACzD,yCAAuC;AAcvC;;;;;;;;;;;;;;;;GAgBG;AACH,SAAgB,cAAc,CAAC,EAC7B,OAAO,EACP,QAAQ,EACR,MAAM,EACN,SAAS,EACT,YAAY,EACZ,cAAc,EACd,kBAAkB,GAAG,EAAE,EACvB,WAAW,EACX,QAAQ,GAAG,IAAI,GAWhB;IACC,OAAO;QACL,OAAO;QACP,OAAO,EAAE,QAAQ;QACjB,GAAG,EAAE,gCAAkB;QACvB,YAAY,EAAE,iBAAiB;QAC/B,IAAI,EAAE;YACJ,MAAM;YACN,SAAS;YACT,YAAY;YACZ,cAAc;YACd,kBAAkB;YAClB,WAAW;YACX,QAAQ;SACT;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,SAAgB,uBAAuB,CAAC,EACtC,gBAAgB,EAChB,QAAQ,GAIT;IACC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC5E,CAAC;IACD,IAAI,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,OAAO,GAAG,IAAA,0BAAmB,EAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEzE,OAAO,IAAA,4BAAkB,EACvB,CAAC,IAAA,wBAAc,EAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC,EAC7C,CAAC,OAAO,CAAC,CACH,CAAC;AACX,CAAC;AAmBD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACI,KAAK,UAAU,eAAe,CACnC,MAAoB,EACpB,EACE,OAAO,EACP,SAAS,EACT,YAAY,EACZ,QAAQ,GAAG,GAAG,EACd,QAAQ,GAAG,MAAM,CAAC,sCAAwB,CAAC,GAO5C;IAED,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC;QAC9C,OAAO,EAAE,IAAA,oBAAS,EAAC,iBAAiB,EAAE,OAAO,CAAC;QAC9C,GAAG,EAAE,gCAAkB;QACvB,YAAY,EAAE,6BAA6B;QAC3C,IAAI,EAAE,CAAC,SAAS,EAAE,YAAY,EAAE,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC;KAC5D,CAAC,CAAC;IAEH,OAAO;QACL,aAAa;QACb,qBAAqB,EAAE,IAAA,6BAAoB,EAAC,aAAa,CAAC;KAC3D,CAAC;AACJ,CAAC"}
|
|
@@ -98,5 +98,25 @@ const projectId = 3n;
|
|
|
98
98
|
0x3606eb48n,
|
|
99
99
|
]);
|
|
100
100
|
});
|
|
101
|
+
(0, vitest_1.test)("build721CashOutMetadata packs the cashOut id and token ids", () => {
|
|
102
|
+
// With a target whose first 4 bytes are zero, the id is the first 4 bytes
|
|
103
|
+
// of keccak256("cashOut").
|
|
104
|
+
const metadata = (0, cashOut_js_1.build721CashOutMetadata)({
|
|
105
|
+
metadataIdTarget: "0x00000000000000000000000000000000DeaDBeef",
|
|
106
|
+
tokenIds: [1000000001n, 1000000002n],
|
|
107
|
+
});
|
|
108
|
+
(0, vitest_1.expect)((0, viem_1.sliceHex)(metadata, 0, 32)).toEqual(`0x${"00".repeat(32)}`);
|
|
109
|
+
// keccak256("cashOut") first 4 bytes, then the payload word offset (2).
|
|
110
|
+
(0, vitest_1.expect)((0, viem_1.sliceHex)(metadata, 32, 36)).toEqual("0x86b14ff4");
|
|
111
|
+
(0, vitest_1.expect)((0, viem_1.sliceHex)(metadata, 36, 37)).toEqual("0x02");
|
|
112
|
+
const [tokenIds] = (0, viem_1.decodeAbiParameters)([{ type: "uint256[]" }], (0, viem_1.sliceHex)(metadata, 64));
|
|
113
|
+
(0, vitest_1.expect)(tokenIds).toEqual([1000000001n, 1000000002n]);
|
|
114
|
+
});
|
|
115
|
+
(0, vitest_1.test)("build721CashOutMetadata rejects empty, duplicate, and zero token ids", () => {
|
|
116
|
+
const target = "0x00000000000000000000000000000000DeaDBeef";
|
|
117
|
+
(0, vitest_1.expect)(() => (0, cashOut_js_1.build721CashOutMetadata)({ metadataIdTarget: target, tokenIds: [] })).toThrow(/at least one/);
|
|
118
|
+
(0, vitest_1.expect)(() => (0, cashOut_js_1.build721CashOutMetadata)({ metadataIdTarget: target, tokenIds: [1n, 1n] })).toThrow(/unique/);
|
|
119
|
+
(0, vitest_1.expect)(() => (0, cashOut_js_1.build721CashOutMetadata)({ metadataIdTarget: target, tokenIds: [0n] })).toThrow(/positive/);
|
|
120
|
+
});
|
|
101
121
|
});
|
|
102
122
|
//# sourceMappingURL=cashOut.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cashOut.test.js","sourceRoot":"","sources":["../../../src/v6/cashOut.test.ts"],"names":[],"mappings":";;AAAA,+
|
|
1
|
+
{"version":3,"file":"cashOut.test.js","sourceRoot":"","sources":["../../../src/v6/cashOut.test.ts"],"names":[],"mappings":"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"}
|