dop-wallet-v6 1.2.5 → 1.2.6
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/services/transactions/__tests__/tx-proof-transfer-with-data.test.js +12 -6
- package/dist/services/transactions/__tests__/tx-proof-transfer-with-data.test.js.map +1 -1
- package/dist/services/transactions/tx-proof-transfer-with-data.d.ts +11 -2
- package/dist/services/transactions/tx-proof-transfer-with-data.js +56 -38
- package/dist/services/transactions/tx-proof-transfer-with-data.js.map +1 -1
- package/dist/utils/__tests__/bigint-serialization.test.d.ts +1 -0
- package/dist/utils/__tests__/bigint-serialization.test.js +106 -0
- package/dist/utils/__tests__/bigint-serialization.test.js.map +1 -0
- package/dist/utils/bigint-serialization.d.ts +29 -0
- package/dist/utils/bigint-serialization.js +58 -0
- package/dist/utils/bigint-serialization.js.map +1 -0
- package/package.json +1 -1
|
@@ -53,18 +53,24 @@ describe('tx-proof-transfer-with-data', () => {
|
|
|
53
53
|
(0, chai_1.expect)(tx_proof_transfer_with_data_1.generateTransferProof).to.be.a('function');
|
|
54
54
|
(0, chai_1.expect)(tx_proof_transfer_with_data_1.generateTransferProof.length).to.equal(12); // Should have 12 parameters
|
|
55
55
|
});
|
|
56
|
-
it('should export
|
|
57
|
-
(0, chai_1.expect)(tx_proof_transfer_with_data_1.
|
|
58
|
-
(0, chai_1.expect)(tx_proof_transfer_with_data_1.
|
|
56
|
+
it('should export generateTransferProofWithDataInternal function that returns Promise<void>', () => {
|
|
57
|
+
(0, chai_1.expect)(tx_proof_transfer_with_data_1.generateTransferProofWithDataInternal).to.be.a('function');
|
|
58
|
+
(0, chai_1.expect)(tx_proof_transfer_with_data_1.generateTransferProofWithDataInternal.length).to.equal(12); // Should have 12 parameters
|
|
59
|
+
});
|
|
60
|
+
it('should export extractTransferProofData function', () => {
|
|
61
|
+
(0, chai_1.expect)(tx_proof_transfer_with_data_1.extractTransferProofData).to.be.a('function');
|
|
62
|
+
(0, chai_1.expect)(tx_proof_transfer_with_data_1.extractTransferProofData.length).to.equal(0); // Should have no parameters
|
|
59
63
|
});
|
|
60
64
|
it('should maintain naming consistency for frontend developers', () => {
|
|
61
65
|
// The main function that frontend developers will use should be generateTransferProof
|
|
62
66
|
// and it should return the proof data (not void)
|
|
63
67
|
(0, chai_1.expect)(tx_proof_transfer_with_data_1.generateTransferProof).to.be.a('function');
|
|
64
|
-
(0, chai_1.expect)(tx_proof_transfer_with_data_1.
|
|
65
|
-
|
|
68
|
+
(0, chai_1.expect)(tx_proof_transfer_with_data_1.generateTransferProofWithDataInternal).to.be.a('function');
|
|
69
|
+
(0, chai_1.expect)(tx_proof_transfer_with_data_1.extractTransferProofData).to.be.a('function');
|
|
70
|
+
// All functions should exist and be callable
|
|
66
71
|
// generateTransferProof is the one that returns TransferProofData
|
|
67
|
-
//
|
|
72
|
+
// generateTransferProofWithDataInternal is the internal one that returns void
|
|
73
|
+
// extractTransferProofData extracts data from cached proof
|
|
68
74
|
});
|
|
69
75
|
});
|
|
70
76
|
describe('Integration behavior (may fail in test environment)', () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tx-proof-transfer-with-data.test.js","sourceRoot":"","sources":["../../../../src/services/transactions/__tests__/tx-proof-transfer-with-data.test.ts"],"names":[],"mappings":";;AAAA,+BAA8B;AAC9B,gFAIwC;AAExC,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,QAAQ,CAAC,uCAAuC,EAAE,GAAG,EAAE;QACrD,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;YAChE,2DAA2D;YAC3D,MAAM,aAAa,GAAsB;gBACvC,KAAK,EAAE;oBACL,CAAC,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE;oBAC7B,CAAC,EAAE;wBACD,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC;wBACrB,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC;qBACtB;oBACD,CAAC,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE;iBAC9B;gBACD,YAAY,EAAE;oBACZ,UAAU,EAAE,cAAc;oBAC1B,UAAU,EAAE,CAAC,cAAc,EAAE,cAAc,CAAC;oBAC5C,WAAW,EAAE,CAAC,eAAe,EAAE,eAAe,CAAC;oBAC/C,eAAe,EAAE,eAAe;iBACjC;gBACD,WAAW,EAAE;oBACX,IAAI,EAAE,UAAU;oBAChB,EAAE,EAAE,aAAa;oBACjB,KAAK,EAAE,qBAAqB;iBAC7B;gBACD,UAAU,EAAE,CAAC,cAAc,EAAE,cAAc,CAAC;aAC7C,CAAC;YAEF,6CAA6C;YAC7C,IAAA,aAAM,EAAC,aAAa,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAChD,IAAA,aAAM,EAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAClD,IAAA,aAAM,EAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAClD,IAAA,aAAM,EAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAElD,IAAA,aAAM,EAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACpD,IAAA,aAAM,EAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAEpD,IAAA,aAAM,EAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACjE,IAAA,aAAM,EAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAEjE,IAAA,aAAM,EAAC,aAAa,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;YACvD,IAAA,aAAM,EAAC,aAAa,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YAClE,IAAA,aAAM,EAAC,aAAa,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YAClE,IAAA,aAAM,EAAC,aAAa,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;YACnE,IAAA,aAAM,EAAC,aAAa,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;YAEvE,IAAA,aAAM,EAAC,aAAa,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;YACtD,IAAA,aAAM,EAAC,aAAa,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAE3D,IAAA,aAAM,EAAC,aAAa,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YACrD,IAAA,aAAM,EAAC,aAAa,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAC/C,EAAE,CAAC,sFAAsF,EAAE,GAAG,EAAE;YAC9F,IAAA,aAAM,EAAC,mDAAqB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;YAClD,IAAA,aAAM,EAAC,mDAAqB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,4BAA4B;QACjF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oFAAoF,EAAE,GAAG,EAAE;YAC5F,IAAA,aAAM,EAAC,8DAAgC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;YAC7D,IAAA,aAAM,EAAC,8DAAgC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,4BAA4B;QAC5F,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;YACpE,sFAAsF;YACtF,iDAAiD;YACjD,IAAA,aAAM,EAAC,mDAAqB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;YAClD,IAAA,aAAM,EAAC,8DAAgC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;YAE7D,8CAA8C;YAC9C,kEAAkE;YAClE,yEAAyE;QAC3E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qDAAqD,EAAE,GAAG,EAAE;QACnE,EAAE,CAAC,sFAAsF,EAAE,KAAK,IAAI,EAAE;YACpG,qEAAqE;YACrE,4DAA4D;YAE5D,IAAI;gBACF,iEAAiE;gBACjE,MAAM,IAAA,mDAAqB,EACzB,mBAA0B,EAAE,sCAAsC;gBAClE,SAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EACrB,IAAI,EACJ,WAAW,EACX,EAAE,EACF,EAAE,EACF,SAAS,EACT,KAAK,EACL,SAAS,EACT,GAAG,EAAE,GAAE,CAAC,CACT,CAAC;gBAEF,6DAA6D;gBAC7D,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;aAE9D;YAAC,OAAO,KAAK,EAAE;gBACd,uCAAuC;gBACvC,OAAO,CAAC,GAAG,CAAC,2CAA2C,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;gBAExE,kEAAkE;gBAClE,IAAA,aAAM,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,GAAW,EAAE,EAAE,CAC/C,GAAG,CAAC,QAAQ,CAAC,qBAAqB,CAAC;oBACnC,GAAG,CAAC,QAAQ,CAAC,iBAAiB,CAAC;oBAC/B,GAAG,CAAC,QAAQ,CAAC,wBAAwB,CAAC;oBACtC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAC3B,CAAC;aACH;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { expect } from 'chai';\nimport { \n generateTransferProof, \n generateTransferProofForExplorer,\n TransferProofData \n} from '../tx-proof-transfer-with-data';\n\ndescribe('tx-proof-transfer-with-data', () => {\n describe('TransferProofData interface structure', () => {\n it('should have the correct TypeScript interface structure', () => {\n // Test that we can create a valid TransferProofData object\n const mockProofData: TransferProofData = {\n proof: {\n a: { x: '0x123', y: '0x456' },\n b: { \n x: ['0x789', '0xabc'], \n y: ['0xdef', '0x012'] \n },\n c: { x: '0x345', y: '0x678' }\n },\n publicInputs: {\n merkleRoot: '0xmerkleroot',\n nullifiers: ['0xnullifier1', '0xnullifier2'],\n commitments: ['0xcommitment1', '0xcommitment2'],\n boundParamsHash: '0xboundparams'\n },\n transaction: {\n data: '0xtxdata',\n to: '0xrecipient',\n value: '1000000000000000000'\n },\n nullifiers: ['0xnullifier1', '0xnullifier2']\n };\n\n // Verify the structure matches our interface\n expect(mockProofData).to.have.property('proof');\n expect(mockProofData.proof).to.have.property('a');\n expect(mockProofData.proof).to.have.property('b');\n expect(mockProofData.proof).to.have.property('c');\n \n expect(mockProofData.proof.a).to.have.property('x');\n expect(mockProofData.proof.a).to.have.property('y');\n \n expect(mockProofData.proof.b.x).to.be.an('array').with.length(2);\n expect(mockProofData.proof.b.y).to.be.an('array').with.length(2);\n \n expect(mockProofData).to.have.property('publicInputs');\n expect(mockProofData.publicInputs).to.have.property('merkleRoot');\n expect(mockProofData.publicInputs).to.have.property('nullifiers');\n expect(mockProofData.publicInputs).to.have.property('commitments');\n expect(mockProofData.publicInputs).to.have.property('boundParamsHash');\n \n expect(mockProofData).to.have.property('transaction');\n expect(mockProofData.transaction).to.have.property('data');\n \n expect(mockProofData).to.have.property('nullifiers');\n expect(mockProofData.nullifiers).to.be.an('array');\n });\n });\n\n describe('Function exports and signatures', () => {\n it('should export generateTransferProof function that returns Promise<TransferProofData>', () => {\n expect(generateTransferProof).to.be.a('function');\n expect(generateTransferProof.length).to.equal(12); // Should have 12 parameters\n });\n\n it('should export generateTransferProofForExplorer function that returns Promise<void>', () => {\n expect(generateTransferProofForExplorer).to.be.a('function');\n expect(generateTransferProofForExplorer.length).to.equal(12); // Should have 12 parameters\n });\n\n it('should maintain naming consistency for frontend developers', () => {\n // The main function that frontend developers will use should be generateTransferProof\n // and it should return the proof data (not void)\n expect(generateTransferProof).to.be.a('function');\n expect(generateTransferProofForExplorer).to.be.a('function');\n \n // Both functions should exist and be callable\n // generateTransferProof is the one that returns TransferProofData\n // generateTransferProofForExplorer is the internal one that returns void\n });\n });\n\n describe('Integration behavior (may fail in test environment)', () => {\n it('should attempt to call generateTransferProof and handle expected failures gracefully', async () => {\n // This test expects to fail due to missing DOP engine initialization\n // But it verifies the function structure and error handling\n \n try {\n // This will likely fail, but that's expected in test environment\n await generateTransferProof(\n 'V3_PoseidonMerkle' as any, // Using string to avoid import issues\n 'Polygon' as any,\n 'test-wallet-id',\n 'test-encryption-key',\n true,\n 'test memo',\n [],\n [],\n undefined,\n false,\n undefined,\n () => {},\n );\n \n // If we get here, the function worked (unlikely in test env)\n console.log('✅ generateTransferProof executed successfully');\n \n } catch (error) {\n // This is expected in test environment\n console.log('⚠️ Expected failure in test environment:', error.message);\n \n // Verify the error is what we expect (DOP engine not initialized)\n expect(error.message).to.satisfy((msg: string) => \n msg.includes('not yet initialized') || \n msg.includes('No cached proof') ||\n msg.includes('MOCK_DB_ENCRYPTION_KEY') ||\n msg.includes('DOP Engine')\n );\n }\n });\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"tx-proof-transfer-with-data.test.js","sourceRoot":"","sources":["../../../../src/services/transactions/__tests__/tx-proof-transfer-with-data.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect } from 'chai';\nimport { \n generateTransferProof, \n generateTransferProofWithDataInternal,\n extractTransferProofData,\n TransferProofData \n} from '../tx-proof-transfer-with-data';\n\ndescribe('tx-proof-transfer-with-data', () => {\n describe('TransferProofData interface structure', () => {\n it('should have the correct TypeScript interface structure', () => {\n // Test that we can create a valid TransferProofData object\n const mockProofData: TransferProofData = {\n proof: {\n a: { x: '0x123', y: '0x456' },\n b: { \n x: ['0x789', '0xabc'], \n y: ['0xdef', '0x012'] \n },\n c: { x: '0x345', y: '0x678' }\n },\n publicInputs: {\n merkleRoot: '0xmerkleroot',\n nullifiers: ['0xnullifier1', '0xnullifier2'],\n commitments: ['0xcommitment1', '0xcommitment2'],\n boundParamsHash: '0xboundparams'\n },\n transaction: {\n data: '0xtxdata',\n to: '0xrecipient',\n value: '1000000000000000000'\n },\n nullifiers: ['0xnullifier1', '0xnullifier2']\n };\n\n // Verify the structure matches our interface\n expect(mockProofData).to.have.property('proof');\n expect(mockProofData.proof).to.have.property('a');\n expect(mockProofData.proof).to.have.property('b');\n expect(mockProofData.proof).to.have.property('c');\n \n expect(mockProofData.proof.a).to.have.property('x');\n expect(mockProofData.proof.a).to.have.property('y');\n \n expect(mockProofData.proof.b.x).to.be.an('array').with.length(2);\n expect(mockProofData.proof.b.y).to.be.an('array').with.length(2);\n \n expect(mockProofData).to.have.property('publicInputs');\n expect(mockProofData.publicInputs).to.have.property('merkleRoot');\n expect(mockProofData.publicInputs).to.have.property('nullifiers');\n expect(mockProofData.publicInputs).to.have.property('commitments');\n expect(mockProofData.publicInputs).to.have.property('boundParamsHash');\n \n expect(mockProofData).to.have.property('transaction');\n expect(mockProofData.transaction).to.have.property('data');\n \n expect(mockProofData).to.have.property('nullifiers');\n expect(mockProofData.nullifiers).to.be.an('array');\n });\n });\n\n describe('Function exports and signatures', () => {\n it('should export generateTransferProof function that returns Promise<TransferProofData>', () => {\n expect(generateTransferProof).to.be.a('function');\n expect(generateTransferProof.length).to.equal(12); // Should have 12 parameters\n });\n\n it('should export generateTransferProofWithDataInternal function that returns Promise<void>', () => {\n expect(generateTransferProofWithDataInternal).to.be.a('function');\n expect(generateTransferProofWithDataInternal.length).to.equal(12); // Should have 12 parameters\n });\n\n it('should export extractTransferProofData function', () => {\n expect(extractTransferProofData).to.be.a('function');\n expect(extractTransferProofData.length).to.equal(0); // Should have no parameters\n });\n\n it('should maintain naming consistency for frontend developers', () => {\n // The main function that frontend developers will use should be generateTransferProof\n // and it should return the proof data (not void)\n expect(generateTransferProof).to.be.a('function');\n expect(generateTransferProofWithDataInternal).to.be.a('function');\n expect(extractTransferProofData).to.be.a('function');\n \n // All functions should exist and be callable\n // generateTransferProof is the one that returns TransferProofData\n // generateTransferProofWithDataInternal is the internal one that returns void\n // extractTransferProofData extracts data from cached proof\n });\n });\n\n describe('Integration behavior (may fail in test environment)', () => {\n it('should attempt to call generateTransferProof and handle expected failures gracefully', async () => {\n // This test expects to fail due to missing DOP engine initialization\n // But it verifies the function structure and error handling\n \n try {\n // This will likely fail, but that's expected in test environment\n await generateTransferProof(\n 'V3_PoseidonMerkle' as any, // Using string to avoid import issues\n 'Polygon' as any,\n 'test-wallet-id',\n 'test-encryption-key',\n true,\n 'test memo',\n [],\n [],\n undefined,\n false,\n undefined,\n () => {},\n );\n \n // If we get here, the function worked (unlikely in test env)\n console.log('✅ generateTransferProof executed successfully');\n \n } catch (error) {\n // This is expected in test environment\n console.log('⚠️ Expected failure in test environment:', error.message);\n \n // Verify the error is what we expect (DOP engine not initialized)\n expect(error.message).to.satisfy((msg: string) => \n msg.includes('not yet initialized') || \n msg.includes('No cached proof') ||\n msg.includes('MOCK_DB_ENCRYPTION_KEY') ||\n msg.includes('DOP Engine')\n );\n }\n });\n });\n});\n"]}
|
|
@@ -28,9 +28,18 @@ export interface TransferProofData {
|
|
|
28
28
|
};
|
|
29
29
|
nullifiers: string[];
|
|
30
30
|
}
|
|
31
|
-
|
|
31
|
+
/**
|
|
32
|
+
* Internal function to generate transfer proof and cache it
|
|
33
|
+
* Following the dop-wallet pattern for clean separation of concerns
|
|
34
|
+
*/
|
|
35
|
+
export declare const generateTransferProofWithDataInternal: (txidVersion: TXIDVersion, networkName: NetworkName, dopWalletID: string, encryptionKey: string, showSenderAddressToRecipient: boolean, memoText: Optional<string>, erc20AmountRecipients: DopERC20AmountRecipient[], nftAmountRecipients: DopNFTAmountRecipient[], broadcasterFeeERC20AmountRecipient: Optional<DopERC20AmountRecipient>, sendWithPublicWallet: boolean, overallBatchMinGasPrice: Optional<bigint>, progressCallback: GenerateTransactionsProgressCallback) => Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Extract proof data from cached transaction for explorer verification
|
|
38
|
+
* This function should be called after generateTransferProofInternal
|
|
39
|
+
*/
|
|
40
|
+
export declare const extractTransferProofData: () => TransferProofData;
|
|
32
41
|
/**
|
|
33
42
|
* Generate transfer proof and return proof data for explorer verification
|
|
34
|
-
* This
|
|
43
|
+
* This is the main function that frontend developers should use
|
|
35
44
|
*/
|
|
36
45
|
export declare const generateTransferProof: (txidVersion: TXIDVersion, networkName: NetworkName, dopWalletID: string, encryptionKey: string, showSenderAddressToRecipient: boolean, memoText: Optional<string>, erc20AmountRecipients: DopERC20AmountRecipient[], nftAmountRecipients: DopNFTAmountRecipient[], broadcasterFeeERC20AmountRecipient: Optional<DopERC20AmountRecipient>, sendWithPublicWallet: boolean, overallBatchMinGasPrice: Optional<bigint>, progressCallback: GenerateTransactionsProgressCallback) => Promise<TransferProofData>;
|
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.generateTransferProof = exports.
|
|
3
|
+
exports.generateTransferProof = exports.extractTransferProofData = exports.generateTransferProofWithDataInternal = void 0;
|
|
4
4
|
const dop_sharedmodels_v3_1 = require("dop-sharedmodels-v3");
|
|
5
5
|
const tx_generator_1 = require("./tx-generator");
|
|
6
6
|
const proof_cache_1 = require("./proof-cache");
|
|
7
7
|
const error_1 = require("../../utils/error");
|
|
8
|
-
const
|
|
8
|
+
const bigint_serialization_1 = require("../../utils/bigint-serialization");
|
|
9
|
+
/**
|
|
10
|
+
* Internal function to generate transfer proof and cache it
|
|
11
|
+
* Following the dop-wallet pattern for clean separation of concerns
|
|
12
|
+
*/
|
|
13
|
+
const generateTransferProofWithDataInternal = async (txidVersion, networkName, dopWalletID, encryptionKey, showSenderAddressToRecipient, memoText, erc20AmountRecipients, nftAmountRecipients, broadcasterFeeERC20AmountRecipient, sendWithPublicWallet, overallBatchMinGasPrice, progressCallback) => {
|
|
9
14
|
try {
|
|
10
15
|
(0, proof_cache_1.setCachedProvedTransaction)(undefined);
|
|
11
16
|
const { provedTransactions } = await (0, tx_generator_1.generateProofTransactions)(dop_sharedmodels_v3_1.ProofType.Transfer, networkName, dopWalletID, txidVersion, encryptionKey, showSenderAddressToRecipient, memoText, erc20AmountRecipients, nftAmountRecipients, broadcasterFeeERC20AmountRecipient, sendWithPublicWallet, undefined, // relayAdaptID
|
|
@@ -13,7 +18,8 @@ const generateTransferProofForExplorer = async (txidVersion, networkName, dopWal
|
|
|
13
18
|
overallBatchMinGasPrice, progressCallback);
|
|
14
19
|
const transaction = await (0, tx_generator_1.generateTransact)(txidVersion, provedTransactions, networkName, 0n);
|
|
15
20
|
const nullifiers = (0, tx_generator_1.nullifiersForTransactions)(provedTransactions);
|
|
16
|
-
|
|
21
|
+
// Cast to our enhanced type that includes proved transactions
|
|
22
|
+
const enhancedProvedTransaction = {
|
|
17
23
|
proofType: dop_sharedmodels_v3_1.ProofType.Transfer,
|
|
18
24
|
txidVersion,
|
|
19
25
|
dopWalletID,
|
|
@@ -31,64 +37,60 @@ const generateTransferProofForExplorer = async (txidVersion, networkName, dopWal
|
|
|
31
37
|
transaction,
|
|
32
38
|
overallBatchMinGasPrice,
|
|
33
39
|
nullifiers,
|
|
34
|
-
|
|
40
|
+
provedTransactions, // Store the actual proved transactions
|
|
41
|
+
};
|
|
42
|
+
(0, proof_cache_1.setCachedProvedTransaction)(enhancedProvedTransaction);
|
|
35
43
|
}
|
|
36
44
|
catch (err) {
|
|
37
|
-
throw (0, error_1.reportAndSanitizeError)(exports.
|
|
45
|
+
throw (0, error_1.reportAndSanitizeError)(exports.generateTransferProofWithDataInternal.name, err);
|
|
38
46
|
}
|
|
39
47
|
};
|
|
40
|
-
exports.
|
|
48
|
+
exports.generateTransferProofWithDataInternal = generateTransferProofWithDataInternal;
|
|
41
49
|
/**
|
|
42
|
-
*
|
|
43
|
-
* This function
|
|
50
|
+
* Extract proof data from cached transaction for explorer verification
|
|
51
|
+
* This function should be called after generateTransferProofInternal
|
|
44
52
|
*/
|
|
45
|
-
const
|
|
53
|
+
const extractTransferProofData = () => {
|
|
46
54
|
try {
|
|
47
|
-
// First generate the proof using the original function
|
|
48
|
-
await (0, exports.generateTransferProofForExplorer)(txidVersion, networkName, dopWalletID, encryptionKey, showSenderAddressToRecipient, memoText, erc20AmountRecipients, nftAmountRecipients, broadcasterFeeERC20AmountRecipient, sendWithPublicWallet, overallBatchMinGasPrice, progressCallback);
|
|
49
|
-
// Get the cached proved transaction
|
|
50
55
|
const cachedTransaction = (0, proof_cache_1.getCachedProvedTransaction)();
|
|
51
56
|
if (cachedTransaction === undefined) {
|
|
52
|
-
throw new Error('No cached proof found
|
|
57
|
+
throw new Error('No cached proof found. Call generateTransferProofInternal first.');
|
|
53
58
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
// You may need to access the provedTransactions directly if available
|
|
57
|
-
const { provedTransactions } = await (0, tx_generator_1.generateProofTransactions)(dop_sharedmodels_v3_1.ProofType.Transfer, networkName, dopWalletID, txidVersion, encryptionKey, showSenderAddressToRecipient, memoText, erc20AmountRecipients, nftAmountRecipients, broadcasterFeeERC20AmountRecipient, sendWithPublicWallet, undefined, // relayAdaptID
|
|
58
|
-
false, // useDummyProof
|
|
59
|
-
overallBatchMinGasPrice, progressCallback);
|
|
60
|
-
// Extract proof data from the first transaction (assuming single transaction)
|
|
61
|
-
const firstTx = provedTransactions[0];
|
|
62
|
-
if (firstTx === undefined) {
|
|
63
|
-
throw new Error('No proved transaction found');
|
|
59
|
+
if (cachedTransaction.provedTransactions == null || cachedTransaction.provedTransactions.length === 0) {
|
|
60
|
+
throw new Error('No proved transactions found in cached data.');
|
|
64
61
|
}
|
|
65
|
-
//
|
|
62
|
+
// Get the first proved transaction to extract proof data
|
|
63
|
+
const provedTransaction = cachedTransaction.provedTransactions[0];
|
|
64
|
+
// Extract proof components from the actual proved transaction
|
|
66
65
|
const proofData = {
|
|
67
66
|
proof: {
|
|
68
67
|
a: {
|
|
69
|
-
x:
|
|
70
|
-
y:
|
|
68
|
+
x: provedTransaction.proof.a.x.toString(),
|
|
69
|
+
y: provedTransaction.proof.a.y.toString(),
|
|
71
70
|
},
|
|
72
71
|
b: {
|
|
73
|
-
x: [
|
|
74
|
-
|
|
72
|
+
x: [
|
|
73
|
+
provedTransaction.proof.b.x[0].toString(),
|
|
74
|
+
provedTransaction.proof.b.x[1].toString(),
|
|
75
|
+
],
|
|
76
|
+
y: [
|
|
77
|
+
provedTransaction.proof.b.y[0].toString(),
|
|
78
|
+
provedTransaction.proof.b.y[1].toString(),
|
|
79
|
+
],
|
|
75
80
|
},
|
|
76
81
|
c: {
|
|
77
|
-
x:
|
|
78
|
-
y:
|
|
82
|
+
x: provedTransaction.proof.c.x.toString(),
|
|
83
|
+
y: provedTransaction.proof.c.y.toString(),
|
|
79
84
|
},
|
|
80
85
|
},
|
|
81
86
|
publicInputs: {
|
|
82
|
-
merkleRoot:
|
|
83
|
-
nullifiers:
|
|
84
|
-
commitments:
|
|
85
|
-
boundParamsHash:
|
|
86
|
-
// You'll need to compute the hash of boundParams or extract it
|
|
87
|
-
`0x${Buffer.from(JSON.stringify(firstTx.boundParams)).toString('hex')}` :
|
|
88
|
-
'0x0'
|
|
87
|
+
merkleRoot: provedTransaction.merkleRoot.toString(),
|
|
88
|
+
nullifiers: provedTransaction.nullifiers.map((n) => n.toString()),
|
|
89
|
+
commitments: provedTransaction.commitments.map((c) => c.toString()),
|
|
90
|
+
boundParamsHash: (0, bigint_serialization_1.stringifyWithBigInt)(provedTransaction.boundParams),
|
|
89
91
|
},
|
|
90
92
|
transaction: {
|
|
91
|
-
data: cachedTransaction.transaction.data
|
|
93
|
+
data: (cachedTransaction.transaction.data != null) ? cachedTransaction.transaction.data : '0x',
|
|
92
94
|
to: cachedTransaction.transaction.to,
|
|
93
95
|
value: cachedTransaction.transaction.value?.toString(),
|
|
94
96
|
},
|
|
@@ -96,6 +98,22 @@ const generateTransferProof = async (txidVersion, networkName, dopWalletID, encr
|
|
|
96
98
|
};
|
|
97
99
|
return proofData;
|
|
98
100
|
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
throw (0, error_1.reportAndSanitizeError)(exports.extractTransferProofData.name, err);
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
exports.extractTransferProofData = extractTransferProofData;
|
|
106
|
+
/**
|
|
107
|
+
* Generate transfer proof and return proof data for explorer verification
|
|
108
|
+
* This is the main function that frontend developers should use
|
|
109
|
+
*/
|
|
110
|
+
const generateTransferProof = async (txidVersion, networkName, dopWalletID, encryptionKey, showSenderAddressToRecipient, memoText, erc20AmountRecipients, nftAmountRecipients, broadcasterFeeERC20AmountRecipient, sendWithPublicWallet, overallBatchMinGasPrice, progressCallback) => {
|
|
111
|
+
try {
|
|
112
|
+
// First generate the proof following the established pattern
|
|
113
|
+
await (0, exports.generateTransferProofWithDataInternal)(txidVersion, networkName, dopWalletID, encryptionKey, showSenderAddressToRecipient, memoText, erc20AmountRecipients, nftAmountRecipients, broadcasterFeeERC20AmountRecipient, sendWithPublicWallet, overallBatchMinGasPrice, progressCallback);
|
|
114
|
+
// Then extract the proof data for explorer verification
|
|
115
|
+
return (0, exports.extractTransferProofData)();
|
|
116
|
+
}
|
|
99
117
|
catch (err) {
|
|
100
118
|
throw (0, error_1.reportAndSanitizeError)(exports.generateTransferProof.name, err);
|
|
101
119
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tx-proof-transfer-with-data.js","sourceRoot":"","sources":["../../../src/services/transactions/tx-proof-transfer-with-data.ts"],"names":[],"mappings":";;;AAAA,6DAM6B;AAC7B,iDAKwB;AACxB,+CAAuF;AACvF,6CAA2D;AA2BpD,MAAM,gCAAgC,GAAG,KAAK,EACnD,WAAwB,EACxB,WAAwB,EACxB,WAAmB,EACnB,aAAqB,EACrB,4BAAqC,EACrC,QAA0B,EAC1B,qBAAgD,EAChD,mBAA4C,EAC5C,kCAAqE,EACrE,oBAA6B,EAC7B,uBAAyC,EACzC,gBAAsD,EACvC,EAAE;IACjB,IAAI;QACF,IAAA,wCAA0B,EAAC,SAAS,CAAC,CAAC;QAEtC,MAAM,EAAE,kBAAkB,EAAE,GAC1B,MAAM,IAAA,wCAAyB,EAC7B,+BAAS,CAAC,QAAQ,EAClB,WAAW,EACX,WAAW,EACX,WAAW,EACX,aAAa,EACb,4BAA4B,EAC5B,QAAQ,EACR,qBAAqB,EACrB,mBAAmB,EACnB,kCAAkC,EAClC,oBAAoB,EACpB,SAAS,EAAE,eAAe;QAC1B,KAAK,EAAE,gBAAgB;QACvB,uBAAuB,EACvB,gBAAgB,CACjB,CAAC;QACJ,MAAM,WAAW,GAAG,MAAM,IAAA,+BAAgB,EACxC,WAAW,EACX,kBAAkB,EAClB,WAAW,EACX,EAAE,CACH,CAAC;QAEF,MAAM,UAAU,GAAG,IAAA,wCAAyB,EAAC,kBAAkB,CAAC,CAAC;QAEjE,IAAA,wCAA0B,EAAC;YACzB,SAAS,EAAE,+BAAS,CAAC,QAAQ;YAC7B,WAAW;YACX,WAAW;YACX,4BAA4B;YAC5B,QAAQ;YACR,qBAAqB;YACrB,mBAAmB;YACnB,6BAA6B,EAAE,SAAS;YACxC,2BAA2B,EAAE,SAAS;YACtC,gCAAgC,EAAE,SAAS;YAC3C,8BAA8B,EAAE,SAAS;YACzC,kBAAkB,EAAE,SAAS;YAC7B,kCAAkC;YAClC,oBAAoB;YACpB,WAAW;YACX,uBAAuB;YACvB,UAAU;SACX,CAAC,CAAC;KACJ;IAAC,OAAO,GAAG,EAAE;QACZ,MAAM,IAAA,8BAAsB,EAAC,wCAAgC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;KAC1E;AACH,CAAC,CAAC;AAlEW,QAAA,gCAAgC,oCAkE3C;AAEF;;;GAGG;AACI,MAAM,qBAAqB,GAAG,KAAK,EACxC,WAAwB,EACxB,WAAwB,EACxB,WAAmB,EACnB,aAAqB,EACrB,4BAAqC,EACrC,QAA0B,EAC1B,qBAAgD,EAChD,mBAA4C,EAC5C,kCAAqE,EACrE,oBAA6B,EAC7B,uBAAyC,EACzC,gBAAsD,EAC1B,EAAE;IAC9B,IAAI;QACF,uDAAuD;QACvD,MAAM,IAAA,wCAAgC,EACpC,WAAW,EACX,WAAW,EACX,WAAW,EACX,aAAa,EACb,4BAA4B,EAC5B,QAAQ,EACR,qBAAqB,EACrB,mBAAmB,EACnB,kCAAkC,EAClC,oBAAoB,EACpB,uBAAuB,EACvB,gBAAgB,CACjB,CAAC;QAEF,oCAAoC;QACpC,MAAM,iBAAiB,GAAG,IAAA,wCAA0B,GAAE,CAAC;QAEvD,IAAI,iBAAiB,KAAK,SAAS,EAAE;YACnC,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;SAC3D;QAED,8CAA8C;QAC9C,yFAAyF;QACzF,sEAAsE;QAEtE,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,IAAA,wCAAyB,EAC5D,+BAAS,CAAC,QAAQ,EAClB,WAAW,EACX,WAAW,EACX,WAAW,EACX,aAAa,EACb,4BAA4B,EAC5B,QAAQ,EACR,qBAAqB,EACrB,mBAAmB,EACnB,kCAAkC,EAClC,oBAAoB,EACpB,SAAS,EAAE,eAAe;QAC1B,KAAK,EAAE,gBAAgB;QACvB,uBAAuB,EACvB,gBAAgB,CACjB,CAAC;QAEF,8EAA8E;QAC9E,MAAM,OAAO,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;QACtC,IAAI,OAAO,KAAK,SAAS,EAAE;YACzB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;SAChD;QAED,wEAAwE;QACxE,MAAM,SAAS,GAAsB;YACnC,KAAK,EAAE;gBACL,CAAC,EAAE;oBACD,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;oBAC/B,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;iBAChC;gBACD,CAAC,EAAE;oBACD,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;oBACrE,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;iBACtE;gBACD,CAAC,EAAE;oBACD,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;oBAC/B,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;iBAChC;aACF;YACD,YAAY,EAAE;gBACZ,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,QAAQ,EAAE;gBACzC,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;gBACrD,WAAW,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;gBACvD,eAAe,EAAE,OAAO,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC;oBAClD,+DAA+D;oBAC/D,KAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;oBAC3E,KAAK;aACR;YACD,WAAW,EAAE;gBACX,IAAI,EAAE,iBAAiB,CAAC,WAAW,CAAC,IAAI,IAAI,IAAI;gBAChD,EAAE,EAAE,iBAAiB,CAAC,WAAW,CAAC,EAAE;gBACpC,KAAK,EAAE,iBAAiB,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE;aACvD;YACD,UAAU,EAAE,iBAAiB,CAAC,UAAU;SACzC,CAAC;QAEF,OAAO,SAAS,CAAC;KAClB;IAAC,OAAO,GAAG,EAAE;QACZ,MAAM,IAAA,8BAAsB,EAAC,6BAAqB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;KAC/D;AACH,CAAC,CAAC;AAvGW,QAAA,qBAAqB,yBAuGhC","sourcesContent":["import {\n NetworkName,\n ProofType,\n DopERC20AmountRecipient,\n DopNFTAmountRecipient,\n TXIDVersion,\n} from 'dop-sharedmodels-v3';\nimport {\n GenerateTransactionsProgressCallback,\n generateProofTransactions,\n generateTransact,\n nullifiersForTransactions,\n} from './tx-generator';\nimport { setCachedProvedTransaction, getCachedProvedTransaction } from './proof-cache';\nimport { reportAndSanitizeError } from '../../utils/error';\n\n// Type for the proof data needed for explorer verification\nexport interface TransferProofData {\n // ZK-SNARK proof components\n proof: {\n a: { x: string; y: string };\n b: { x: [string, string]; y: [string, string] };\n c: { x: string; y: string };\n };\n // Public inputs for verification\n publicInputs: {\n merkleRoot: string;\n nullifiers: string[];\n commitments: string[];\n boundParamsHash: string;\n };\n // Transaction data\n transaction: {\n data: string;\n to?: string;\n value?: string;\n };\n // Additional metadata\n nullifiers: string[];\n}\n\nexport const generateTransferProofForExplorer = async (\n txidVersion: TXIDVersion,\n networkName: NetworkName,\n dopWalletID: string,\n encryptionKey: string,\n showSenderAddressToRecipient: boolean,\n memoText: Optional<string>,\n erc20AmountRecipients: DopERC20AmountRecipient[],\n nftAmountRecipients: DopNFTAmountRecipient[],\n broadcasterFeeERC20AmountRecipient: Optional<DopERC20AmountRecipient>,\n sendWithPublicWallet: boolean,\n overallBatchMinGasPrice: Optional<bigint>,\n progressCallback: GenerateTransactionsProgressCallback,\n): Promise<void> => {\n try {\n setCachedProvedTransaction(undefined);\n\n const { provedTransactions } =\n await generateProofTransactions(\n ProofType.Transfer,\n networkName,\n dopWalletID,\n txidVersion,\n encryptionKey,\n showSenderAddressToRecipient,\n memoText,\n erc20AmountRecipients,\n nftAmountRecipients,\n broadcasterFeeERC20AmountRecipient,\n sendWithPublicWallet,\n undefined, // relayAdaptID\n false, // useDummyProof\n overallBatchMinGasPrice,\n progressCallback,\n );\n const transaction = await generateTransact(\n txidVersion,\n provedTransactions,\n networkName,\n 0n\n );\n\n const nullifiers = nullifiersForTransactions(provedTransactions);\n\n setCachedProvedTransaction({\n proofType: ProofType.Transfer,\n txidVersion,\n dopWalletID,\n showSenderAddressToRecipient,\n memoText,\n erc20AmountRecipients,\n nftAmountRecipients,\n relayAdaptDecryptERC20Amounts: undefined,\n relayAdaptDecryptNFTAmounts: undefined,\n relayAdaptEncryptERC20Recipients: undefined,\n relayAdaptEncryptNFTRecipients: undefined,\n crossContractCalls: undefined,\n broadcasterFeeERC20AmountRecipient,\n sendWithPublicWallet,\n transaction,\n overallBatchMinGasPrice,\n nullifiers,\n });\n } catch (err) {\n throw reportAndSanitizeError(generateTransferProofForExplorer.name, err);\n }\n};\n\n/**\n * Generate transfer proof and return proof data for explorer verification\n * This function generates the proof and returns the proof data needed for verification on the explorer\n */\nexport const generateTransferProof = async (\n txidVersion: TXIDVersion,\n networkName: NetworkName,\n dopWalletID: string,\n encryptionKey: string,\n showSenderAddressToRecipient: boolean,\n memoText: Optional<string>,\n erc20AmountRecipients: DopERC20AmountRecipient[],\n nftAmountRecipients: DopNFTAmountRecipient[],\n broadcasterFeeERC20AmountRecipient: Optional<DopERC20AmountRecipient>,\n sendWithPublicWallet: boolean,\n overallBatchMinGasPrice: Optional<bigint>,\n progressCallback: GenerateTransactionsProgressCallback,\n): Promise<TransferProofData> => {\n try {\n // First generate the proof using the original function\n await generateTransferProofForExplorer(\n txidVersion,\n networkName,\n dopWalletID,\n encryptionKey,\n showSenderAddressToRecipient,\n memoText,\n erc20AmountRecipients,\n nftAmountRecipients,\n broadcasterFeeERC20AmountRecipient,\n sendWithPublicWallet,\n overallBatchMinGasPrice,\n progressCallback,\n );\n\n // Get the cached proved transaction\n const cachedTransaction = getCachedProvedTransaction();\n \n if (cachedTransaction === undefined) {\n throw new Error('No cached proof found after generation');\n }\n\n // Extract the proof data from the transaction\n // Note: This assumes the transaction.data contains the serialized transaction with proof\n // You may need to access the provedTransactions directly if available\n \n const { provedTransactions } = await generateProofTransactions(\n ProofType.Transfer,\n networkName,\n dopWalletID,\n txidVersion,\n encryptionKey,\n showSenderAddressToRecipient,\n memoText,\n erc20AmountRecipients,\n nftAmountRecipients,\n broadcasterFeeERC20AmountRecipient,\n sendWithPublicWallet,\n undefined, // relayAdaptID\n false, // useDummyProof\n overallBatchMinGasPrice,\n progressCallback,\n );\n\n // Extract proof data from the first transaction (assuming single transaction)\n const firstTx = provedTransactions[0];\n if (firstTx === undefined) {\n throw new Error('No proved transaction found');\n }\n\n // Convert the proof data to the format needed for explorer verification\n const proofData: TransferProofData = {\n proof: {\n a: {\n x: firstTx.proof.a.x.toString(),\n y: firstTx.proof.a.y.toString(),\n },\n b: {\n x: [firstTx.proof.b.x[0].toString(), firstTx.proof.b.x[1].toString()],\n y: [firstTx.proof.b.y[0].toString(), firstTx.proof.b.y[1].toString()],\n },\n c: {\n x: firstTx.proof.c.x.toString(),\n y: firstTx.proof.c.y.toString(),\n },\n },\n publicInputs: {\n merkleRoot: firstTx.merkleRoot.toString(),\n nullifiers: firstTx.nullifiers.map(n => n.toString()),\n commitments: firstTx.commitments.map(c => c.toString()),\n boundParamsHash: firstTx.boundParams !== undefined ? \n // You'll need to compute the hash of boundParams or extract it\n `0x${ Buffer.from(JSON.stringify(firstTx.boundParams)).toString('hex')}` : \n '0x0'\n },\n transaction: {\n data: cachedTransaction.transaction.data || '0x',\n to: cachedTransaction.transaction.to,\n value: cachedTransaction.transaction.value?.toString(),\n },\n nullifiers: cachedTransaction.nullifiers,\n };\n\n return proofData;\n } catch (err) {\n throw reportAndSanitizeError(generateTransferProof.name, err);\n }\n};\n"]}
|
|
1
|
+
{"version":3,"file":"tx-proof-transfer-with-data.js","sourceRoot":"","sources":["../../../src/services/transactions/tx-proof-transfer-with-data.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n NetworkName,\n ProofType,\n DopERC20AmountRecipient,\n DopNFTAmountRecipient,\n TXIDVersion,\n} from 'dop-sharedmodels-v3';\nimport {\n GenerateTransactionsProgressCallback,\n generateProofTransactions,\n generateTransact,\n nullifiersForTransactions,\n} from './tx-generator';\nimport { setCachedProvedTransaction, getCachedProvedTransaction } from './proof-cache';\nimport { reportAndSanitizeError } from '../../utils/error';\nimport { TransactionStructV2, TransactionStructV3 } from 'dop-engine-v3';\nimport { stringifyWithBigInt } from '../../utils/bigint-serialization';\n\n// Type for the proof data needed for explorer verification\nexport interface TransferProofData {\n // ZK-SNARK proof components\n proof: {\n a: { x: string; y: string };\n b: { x: [string, string]; y: [string, string] };\n c: { x: string; y: string };\n };\n // Public inputs for verification\n publicInputs: {\n merkleRoot: string;\n nullifiers: string[];\n commitments: string[];\n boundParamsHash: string;\n };\n // Transaction data\n transaction: {\n data: string;\n to?: string;\n value?: string;\n };\n // Additional metadata\n nullifiers: string[];\n}\n\n// Enhanced cached transaction type that includes the actual proved transactions\ninterface EnhancedProvedTransaction {\n proofType: ProofType;\n txidVersion: TXIDVersion;\n transaction: any;\n dopWalletID: string;\n showSenderAddressToRecipient: boolean;\n memoText: Optional<string>;\n erc20AmountRecipients: DopERC20AmountRecipient[];\n nftAmountRecipients: DopNFTAmountRecipient[];\n relayAdaptDecryptERC20Amounts: Optional<any[]>;\n relayAdaptDecryptNFTAmounts: Optional<any[]>;\n relayAdaptEncryptERC20Recipients: Optional<any[]>;\n relayAdaptEncryptNFTRecipients: Optional<any[]>;\n crossContractCalls: Optional<any[]>;\n broadcasterFeeERC20AmountRecipient: Optional<DopERC20AmountRecipient>;\n sendWithPublicWallet: boolean;\n overallBatchMinGasPrice: Optional<bigint>;\n nullifiers: string[];\n // Store the actual proved transactions for proof data extraction\n provedTransactions: (TransactionStructV2 | TransactionStructV3)[];\n}\n\n/**\n * Internal function to generate transfer proof and cache it\n * Following the dop-wallet pattern for clean separation of concerns\n */\nexport const generateTransferProofWithDataInternal = async (\n txidVersion: TXIDVersion,\n networkName: NetworkName,\n dopWalletID: string,\n encryptionKey: string,\n showSenderAddressToRecipient: boolean,\n memoText: Optional<string>,\n erc20AmountRecipients: DopERC20AmountRecipient[],\n nftAmountRecipients: DopNFTAmountRecipient[],\n broadcasterFeeERC20AmountRecipient: Optional<DopERC20AmountRecipient>,\n sendWithPublicWallet: boolean,\n overallBatchMinGasPrice: Optional<bigint>,\n progressCallback: GenerateTransactionsProgressCallback,\n): Promise<void> => {\n try {\n setCachedProvedTransaction(undefined);\n\n const { provedTransactions } = await generateProofTransactions(\n ProofType.Transfer,\n networkName,\n dopWalletID,\n txidVersion,\n encryptionKey,\n showSenderAddressToRecipient,\n memoText,\n erc20AmountRecipients,\n nftAmountRecipients,\n broadcasterFeeERC20AmountRecipient,\n sendWithPublicWallet,\n undefined, // relayAdaptID\n false, // useDummyProof\n overallBatchMinGasPrice,\n progressCallback,\n );\n \n const transaction = await generateTransact(\n txidVersion,\n provedTransactions,\n networkName,\n 0n\n );\n\n const nullifiers = nullifiersForTransactions(provedTransactions);\n\n // Cast to our enhanced type that includes proved transactions\n const enhancedProvedTransaction: EnhancedProvedTransaction = {\n proofType: ProofType.Transfer,\n txidVersion,\n dopWalletID,\n showSenderAddressToRecipient,\n memoText,\n erc20AmountRecipients,\n nftAmountRecipients,\n relayAdaptDecryptERC20Amounts: undefined,\n relayAdaptDecryptNFTAmounts: undefined,\n relayAdaptEncryptERC20Recipients: undefined,\n relayAdaptEncryptNFTRecipients: undefined,\n crossContractCalls: undefined,\n broadcasterFeeERC20AmountRecipient,\n sendWithPublicWallet,\n transaction,\n overallBatchMinGasPrice,\n nullifiers,\n provedTransactions, // Store the actual proved transactions\n };\n\n setCachedProvedTransaction(enhancedProvedTransaction);\n } catch (err) {\n throw reportAndSanitizeError(generateTransferProofWithDataInternal.name, err);\n }\n};\n\n/**\n * Extract proof data from cached transaction for explorer verification\n * This function should be called after generateTransferProofInternal\n */\nexport const extractTransferProofData = (): TransferProofData => {\n try {\n const cachedTransaction = getCachedProvedTransaction() as EnhancedProvedTransaction;\n \n if (cachedTransaction === undefined) {\n throw new Error('No cached proof found. Call generateTransferProofInternal first.');\n }\n\n if (cachedTransaction.provedTransactions == null || cachedTransaction.provedTransactions.length === 0) {\n throw new Error('No proved transactions found in cached data.');\n }\n\n // Get the first proved transaction to extract proof data\n const provedTransaction = cachedTransaction.provedTransactions[0];\n \n // Extract proof components from the actual proved transaction\n const proofData: TransferProofData = {\n proof: {\n a: {\n x: provedTransaction.proof.a.x.toString(),\n y: provedTransaction.proof.a.y.toString(),\n },\n b: {\n x: [\n provedTransaction.proof.b.x[0].toString(),\n provedTransaction.proof.b.x[1].toString(),\n ],\n y: [\n provedTransaction.proof.b.y[0].toString(),\n provedTransaction.proof.b.y[1].toString(),\n ],\n },\n c: {\n x: provedTransaction.proof.c.x.toString(),\n y: provedTransaction.proof.c.y.toString(),\n },\n },\n publicInputs: {\n merkleRoot: provedTransaction.merkleRoot.toString(),\n nullifiers: provedTransaction.nullifiers.map((n: any) => n.toString()),\n commitments: provedTransaction.commitments.map((c: any) => c.toString()),\n boundParamsHash: stringifyWithBigInt(provedTransaction.boundParams),\n },\n transaction: {\n data: (cachedTransaction.transaction.data != null) ? cachedTransaction.transaction.data : '0x',\n to: cachedTransaction.transaction.to,\n value: cachedTransaction.transaction.value?.toString(),\n },\n nullifiers: cachedTransaction.nullifiers,\n };\n\n return proofData;\n } catch (err) {\n throw reportAndSanitizeError(extractTransferProofData.name, err);\n }\n};\n\n/**\n * Generate transfer proof and return proof data for explorer verification\n * This is the main function that frontend developers should use\n */\nexport const generateTransferProof = async (\n txidVersion: TXIDVersion,\n networkName: NetworkName,\n dopWalletID: string,\n encryptionKey: string,\n showSenderAddressToRecipient: boolean,\n memoText: Optional<string>,\n erc20AmountRecipients: DopERC20AmountRecipient[],\n nftAmountRecipients: DopNFTAmountRecipient[],\n broadcasterFeeERC20AmountRecipient: Optional<DopERC20AmountRecipient>,\n sendWithPublicWallet: boolean,\n overallBatchMinGasPrice: Optional<bigint>,\n progressCallback: GenerateTransactionsProgressCallback,\n): Promise<TransferProofData> => {\n try {\n // First generate the proof following the established pattern\n await generateTransferProofWithDataInternal(\n txidVersion,\n networkName,\n dopWalletID,\n encryptionKey,\n showSenderAddressToRecipient,\n memoText,\n erc20AmountRecipients,\n nftAmountRecipients,\n broadcasterFeeERC20AmountRecipient,\n sendWithPublicWallet,\n overallBatchMinGasPrice,\n progressCallback,\n );\n\n // Then extract the proof data for explorer verification\n return extractTransferProofData();\n } catch (err) {\n throw reportAndSanitizeError(generateTransferProof.name, err);\n }\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const chai_1 = require("chai");
|
|
4
|
+
const bigint_serialization_1 = require("../bigint-serialization");
|
|
5
|
+
describe('BigInt Serialization Utility', () => {
|
|
6
|
+
describe('bigIntReplacer', () => {
|
|
7
|
+
it('should convert BigInt values to strings', () => {
|
|
8
|
+
const bigIntValue = BigInt('123456789012345678901234567890');
|
|
9
|
+
const result = (0, bigint_serialization_1.bigIntReplacer)('test', bigIntValue);
|
|
10
|
+
(0, chai_1.expect)(result).to.equal('123456789012345678901234567890');
|
|
11
|
+
});
|
|
12
|
+
it('should pass through non-BigInt values unchanged', () => {
|
|
13
|
+
(0, chai_1.expect)((0, bigint_serialization_1.bigIntReplacer)('test', 'string')).to.equal('string');
|
|
14
|
+
(0, chai_1.expect)((0, bigint_serialization_1.bigIntReplacer)('test', 123)).to.equal(123);
|
|
15
|
+
(0, chai_1.expect)((0, bigint_serialization_1.bigIntReplacer)('test', null)).to.equal(null);
|
|
16
|
+
(0, chai_1.expect)((0, bigint_serialization_1.bigIntReplacer)('test', undefined)).to.equal(undefined);
|
|
17
|
+
(0, chai_1.expect)((0, bigint_serialization_1.bigIntReplacer)('test', true)).to.equal(true);
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
describe('stringifyWithBigInt', () => {
|
|
21
|
+
it('should serialize objects containing BigInt values', () => {
|
|
22
|
+
const testObject = {
|
|
23
|
+
normalValue: 'test',
|
|
24
|
+
bigIntValue: BigInt('987654321098765432109876543210'),
|
|
25
|
+
nestedObject: {
|
|
26
|
+
anotherBigInt: BigInt('1111111111111111111111111111'),
|
|
27
|
+
normalNumber: 42
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
const result = (0, bigint_serialization_1.stringifyWithBigInt)(testObject);
|
|
31
|
+
const parsed = JSON.parse(result);
|
|
32
|
+
(0, chai_1.expect)(parsed.normalValue).to.equal('test');
|
|
33
|
+
(0, chai_1.expect)(parsed.bigIntValue).to.equal('987654321098765432109876543210');
|
|
34
|
+
(0, chai_1.expect)(parsed.nestedObject.anotherBigInt).to.equal('1111111111111111111111111111');
|
|
35
|
+
(0, chai_1.expect)(parsed.nestedObject.normalNumber).to.equal(42);
|
|
36
|
+
});
|
|
37
|
+
it('should handle arrays with BigInt values', () => {
|
|
38
|
+
const testArray = [
|
|
39
|
+
BigInt('111'),
|
|
40
|
+
'string',
|
|
41
|
+
BigInt('222'),
|
|
42
|
+
{ bigIntProp: BigInt('333') }
|
|
43
|
+
];
|
|
44
|
+
const result = (0, bigint_serialization_1.stringifyWithBigInt)(testArray);
|
|
45
|
+
const parsed = JSON.parse(result);
|
|
46
|
+
(0, chai_1.expect)(parsed[0]).to.equal('111');
|
|
47
|
+
(0, chai_1.expect)(parsed[1]).to.equal('string');
|
|
48
|
+
(0, chai_1.expect)(parsed[2]).to.equal('222');
|
|
49
|
+
(0, chai_1.expect)(parsed[3].bigIntProp).to.equal('333');
|
|
50
|
+
});
|
|
51
|
+
it('should not throw "Do not know how to serialize a BigInt" error', () => {
|
|
52
|
+
const objectWithBigInt = {
|
|
53
|
+
boundParams: {
|
|
54
|
+
treeNumber: BigInt('1'),
|
|
55
|
+
minGasPrice: BigInt('1000000000'),
|
|
56
|
+
unshield: BigInt('0'),
|
|
57
|
+
chainID: BigInt('137')
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
// This should not throw an error
|
|
61
|
+
(0, chai_1.expect)(() => (0, bigint_serialization_1.stringifyWithBigInt)(objectWithBigInt)).to.not.throw();
|
|
62
|
+
// And should produce valid JSON
|
|
63
|
+
const result = (0, bigint_serialization_1.stringifyWithBigInt)(objectWithBigInt);
|
|
64
|
+
(0, chai_1.expect)(() => JSON.parse(result)).to.not.throw();
|
|
65
|
+
});
|
|
66
|
+
it('should preserve the original functionality for native JSON.stringify failures', () => {
|
|
67
|
+
// Test with circular reference
|
|
68
|
+
const circularObj = { name: 'test' };
|
|
69
|
+
circularObj.self = circularObj;
|
|
70
|
+
(0, chai_1.expect)(() => (0, bigint_serialization_1.stringifyWithBigInt)(circularObj)).to.throw();
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
describe('Real-world BigInt usage scenarios', () => {
|
|
74
|
+
it('should handle transaction-like objects with BigInt values', () => {
|
|
75
|
+
const mockTransactionData = {
|
|
76
|
+
proof: {
|
|
77
|
+
a: { x: BigInt('12345'), y: BigInt('67890') },
|
|
78
|
+
b: {
|
|
79
|
+
x: [BigInt('11111'), BigInt('22222')],
|
|
80
|
+
y: [BigInt('33333'), BigInt('44444')]
|
|
81
|
+
},
|
|
82
|
+
c: { x: BigInt('55555'), y: BigInt('66666') }
|
|
83
|
+
},
|
|
84
|
+
publicInputs: {
|
|
85
|
+
merkleRoot: BigInt('999999999999999999999'),
|
|
86
|
+
nullifiers: [BigInt('111111'), BigInt('222222')],
|
|
87
|
+
commitments: [BigInt('333333'), BigInt('444444')],
|
|
88
|
+
boundParamsHash: BigInt('555555555555555555555')
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
// This should not throw the "Do not know how to serialize a BigInt" error
|
|
92
|
+
(0, chai_1.expect)(() => (0, bigint_serialization_1.stringifyWithBigInt)(mockTransactionData)).to.not.throw();
|
|
93
|
+
const result = (0, bigint_serialization_1.stringifyWithBigInt)(mockTransactionData);
|
|
94
|
+
const parsed = JSON.parse(result);
|
|
95
|
+
// Verify the structure is preserved and BigInt values are converted to strings
|
|
96
|
+
(0, chai_1.expect)(parsed.proof.a.x).to.equal('12345');
|
|
97
|
+
(0, chai_1.expect)(parsed.proof.a.y).to.equal('67890');
|
|
98
|
+
(0, chai_1.expect)(parsed.proof.b.x[0]).to.equal('11111');
|
|
99
|
+
(0, chai_1.expect)(parsed.proof.b.x[1]).to.equal('22222');
|
|
100
|
+
(0, chai_1.expect)(parsed.publicInputs.merkleRoot).to.equal('999999999999999999999');
|
|
101
|
+
(0, chai_1.expect)(parsed.publicInputs.nullifiers[0]).to.equal('111111');
|
|
102
|
+
(0, chai_1.expect)(parsed.publicInputs.commitments[1]).to.equal('444444');
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
//# sourceMappingURL=bigint-serialization.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bigint-serialization.test.js","sourceRoot":"","sources":["../../../src/utils/__tests__/bigint-serialization.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect } from 'chai';\nimport { stringifyWithBigInt, bigIntReplacer } from '../bigint-serialization';\n\ndescribe('BigInt Serialization Utility', () => {\n describe('bigIntReplacer', () => {\n it('should convert BigInt values to strings', () => {\n const bigIntValue = BigInt('123456789012345678901234567890');\n const result = bigIntReplacer('test', bigIntValue);\n expect(result).to.equal('123456789012345678901234567890');\n });\n\n it('should pass through non-BigInt values unchanged', () => {\n expect(bigIntReplacer('test', 'string')).to.equal('string');\n expect(bigIntReplacer('test', 123)).to.equal(123);\n expect(bigIntReplacer('test', null)).to.equal(null);\n expect(bigIntReplacer('test', undefined)).to.equal(undefined);\n expect(bigIntReplacer('test', true)).to.equal(true);\n });\n });\n\n describe('stringifyWithBigInt', () => {\n it('should serialize objects containing BigInt values', () => {\n const testObject = {\n normalValue: 'test',\n bigIntValue: BigInt('987654321098765432109876543210'),\n nestedObject: {\n anotherBigInt: BigInt('1111111111111111111111111111'),\n normalNumber: 42\n }\n };\n\n const result = stringifyWithBigInt(testObject);\n const parsed = JSON.parse(result);\n\n expect(parsed.normalValue).to.equal('test');\n expect(parsed.bigIntValue).to.equal('987654321098765432109876543210');\n expect(parsed.nestedObject.anotherBigInt).to.equal('1111111111111111111111111111');\n expect(parsed.nestedObject.normalNumber).to.equal(42);\n });\n\n it('should handle arrays with BigInt values', () => {\n const testArray = [\n BigInt('111'),\n 'string',\n BigInt('222'),\n { bigIntProp: BigInt('333') }\n ];\n\n const result = stringifyWithBigInt(testArray);\n const parsed = JSON.parse(result);\n\n expect(parsed[0]).to.equal('111');\n expect(parsed[1]).to.equal('string');\n expect(parsed[2]).to.equal('222');\n expect(parsed[3].bigIntProp).to.equal('333');\n });\n\n it('should not throw \"Do not know how to serialize a BigInt\" error', () => {\n const objectWithBigInt = {\n boundParams: {\n treeNumber: BigInt('1'),\n minGasPrice: BigInt('1000000000'),\n unshield: BigInt('0'),\n chainID: BigInt('137')\n }\n };\n\n // This should not throw an error\n expect(() => stringifyWithBigInt(objectWithBigInt)).to.not.throw();\n \n // And should produce valid JSON\n const result = stringifyWithBigInt(objectWithBigInt);\n expect(() => JSON.parse(result)).to.not.throw();\n });\n\n it('should preserve the original functionality for native JSON.stringify failures', () => {\n // Test with circular reference\n const circularObj: any = { name: 'test' };\n circularObj.self = circularObj;\n\n expect(() => stringifyWithBigInt(circularObj)).to.throw();\n });\n });\n\n describe('Real-world BigInt usage scenarios', () => {\n it('should handle transaction-like objects with BigInt values', () => {\n const mockTransactionData = {\n proof: {\n a: { x: BigInt('12345'), y: BigInt('67890') },\n b: { \n x: [BigInt('11111'), BigInt('22222')], \n y: [BigInt('33333'), BigInt('44444')] \n },\n c: { x: BigInt('55555'), y: BigInt('66666') }\n },\n publicInputs: {\n merkleRoot: BigInt('999999999999999999999'),\n nullifiers: [BigInt('111111'), BigInt('222222')],\n commitments: [BigInt('333333'), BigInt('444444')],\n boundParamsHash: BigInt('555555555555555555555')\n }\n };\n\n // This should not throw the \"Do not know how to serialize a BigInt\" error\n expect(() => stringifyWithBigInt(mockTransactionData)).to.not.throw();\n \n const result = stringifyWithBigInt(mockTransactionData);\n const parsed = JSON.parse(result);\n \n // Verify the structure is preserved and BigInt values are converted to strings\n expect(parsed.proof.a.x).to.equal('12345');\n expect(parsed.proof.a.y).to.equal('67890');\n expect(parsed.proof.b.x[0]).to.equal('11111');\n expect(parsed.proof.b.x[1]).to.equal('22222');\n expect(parsed.publicInputs.merkleRoot).to.equal('999999999999999999999');\n expect(parsed.publicInputs.nullifiers[0]).to.equal('111111');\n expect(parsed.publicInputs.commitments[1]).to.equal('444444');\n });\n });\n});\n"]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility functions for handling BigInt serialization
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Custom JSON.stringify replacer function that handles BigInt values
|
|
6
|
+
* @param key - Property key
|
|
7
|
+
* @param value - Property value
|
|
8
|
+
* @returns Serialized value with BigInt converted to string
|
|
9
|
+
*/
|
|
10
|
+
export declare function bigIntReplacer(key: string, value: any): any;
|
|
11
|
+
/**
|
|
12
|
+
* Custom JSON.parse reviver function that converts string numbers back to BigInt
|
|
13
|
+
* @param key - Property key
|
|
14
|
+
* @param value - Property value
|
|
15
|
+
* @returns Parsed value with string numbers converted back to BigInt where appropriate
|
|
16
|
+
*/
|
|
17
|
+
export declare function bigIntReviver(key: string, value: any): any;
|
|
18
|
+
/**
|
|
19
|
+
* Safely stringify an object that may contain BigInt values
|
|
20
|
+
* @param obj - Object to stringify
|
|
21
|
+
* @returns JSON string with BigInt values converted to strings
|
|
22
|
+
*/
|
|
23
|
+
export declare function stringifyWithBigInt(obj: any): string;
|
|
24
|
+
/**
|
|
25
|
+
* Safely parse a JSON string that may contain BigInt values
|
|
26
|
+
* @param jsonString - JSON string to parse
|
|
27
|
+
* @returns Parsed object with string numbers converted back to BigInt where appropriate
|
|
28
|
+
*/
|
|
29
|
+
export declare function parseWithBigInt(jsonString: string): any;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Utility functions for handling BigInt serialization
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.parseWithBigInt = exports.stringifyWithBigInt = exports.bigIntReviver = exports.bigIntReplacer = void 0;
|
|
7
|
+
/**
|
|
8
|
+
* Custom JSON.stringify replacer function that handles BigInt values
|
|
9
|
+
* @param key - Property key
|
|
10
|
+
* @param value - Property value
|
|
11
|
+
* @returns Serialized value with BigInt converted to string
|
|
12
|
+
*/
|
|
13
|
+
function bigIntReplacer(key, value) {
|
|
14
|
+
if (typeof value === 'bigint') {
|
|
15
|
+
return value.toString();
|
|
16
|
+
}
|
|
17
|
+
return value;
|
|
18
|
+
}
|
|
19
|
+
exports.bigIntReplacer = bigIntReplacer;
|
|
20
|
+
/**
|
|
21
|
+
* Custom JSON.parse reviver function that converts string numbers back to BigInt
|
|
22
|
+
* @param key - Property key
|
|
23
|
+
* @param value - Property value
|
|
24
|
+
* @returns Parsed value with string numbers converted back to BigInt where appropriate
|
|
25
|
+
*/
|
|
26
|
+
function bigIntReviver(key, value) {
|
|
27
|
+
// This is a basic implementation - you might want to be more specific about which fields to convert
|
|
28
|
+
if (typeof value === 'string' && /^\d+$/.test(value)) {
|
|
29
|
+
// Only convert if it's a string that contains only digits
|
|
30
|
+
try {
|
|
31
|
+
return BigInt(value);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return value;
|
|
38
|
+
}
|
|
39
|
+
exports.bigIntReviver = bigIntReviver;
|
|
40
|
+
/**
|
|
41
|
+
* Safely stringify an object that may contain BigInt values
|
|
42
|
+
* @param obj - Object to stringify
|
|
43
|
+
* @returns JSON string with BigInt values converted to strings
|
|
44
|
+
*/
|
|
45
|
+
function stringifyWithBigInt(obj) {
|
|
46
|
+
return JSON.stringify(obj, bigIntReplacer);
|
|
47
|
+
}
|
|
48
|
+
exports.stringifyWithBigInt = stringifyWithBigInt;
|
|
49
|
+
/**
|
|
50
|
+
* Safely parse a JSON string that may contain BigInt values
|
|
51
|
+
* @param jsonString - JSON string to parse
|
|
52
|
+
* @returns Parsed object with string numbers converted back to BigInt where appropriate
|
|
53
|
+
*/
|
|
54
|
+
function parseWithBigInt(jsonString) {
|
|
55
|
+
return JSON.parse(jsonString, bigIntReviver);
|
|
56
|
+
}
|
|
57
|
+
exports.parseWithBigInt = parseWithBigInt;
|
|
58
|
+
//# sourceMappingURL=bigint-serialization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bigint-serialization.js","sourceRoot":"","sources":["../../src/utils/bigint-serialization.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH;;;;;GAKG;AACH,SAAgB,cAAc,CAAC,GAAW,EAAE,KAAU;IACpD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;QAC7B,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;KACzB;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AALD,wCAKC;AAED;;;;;GAKG;AACH,SAAgB,aAAa,CAAC,GAAW,EAAE,KAAU;IACnD,oGAAoG;IACpG,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;QACpD,0DAA0D;QAC1D,IAAI;YACF,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;SACtB;QAAC,MAAM;YACN,OAAO,KAAK,CAAC;SACd;KACF;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAXD,sCAWC;AAED;;;;GAIG;AACH,SAAgB,mBAAmB,CAAC,GAAQ;IAC1C,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;AAC7C,CAAC;AAFD,kDAEC;AAED;;;;GAIG;AACH,SAAgB,eAAe,CAAC,UAAkB;IAChD,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAC/C,CAAC;AAFD,0CAEC","sourcesContent":["/**\n * Utility functions for handling BigInt serialization\n */\n\n/**\n * Custom JSON.stringify replacer function that handles BigInt values\n * @param key - Property key\n * @param value - Property value\n * @returns Serialized value with BigInt converted to string\n */\nexport function bigIntReplacer(key: string, value: any): any {\n if (typeof value === 'bigint') {\n return value.toString();\n }\n return value;\n}\n\n/**\n * Custom JSON.parse reviver function that converts string numbers back to BigInt\n * @param key - Property key\n * @param value - Property value\n * @returns Parsed value with string numbers converted back to BigInt where appropriate\n */\nexport function bigIntReviver(key: string, value: any): any {\n // This is a basic implementation - you might want to be more specific about which fields to convert\n if (typeof value === 'string' && /^\\d+$/.test(value)) {\n // Only convert if it's a string that contains only digits\n try {\n return BigInt(value);\n } catch {\n return value;\n }\n }\n return value;\n}\n\n/**\n * Safely stringify an object that may contain BigInt values\n * @param obj - Object to stringify\n * @returns JSON string with BigInt values converted to strings\n */\nexport function stringifyWithBigInt(obj: any): string {\n return JSON.stringify(obj, bigIntReplacer);\n}\n\n/**\n * Safely parse a JSON string that may contain BigInt values\n * @param jsonString - JSON string to parse\n * @returns Parsed object with string numbers converted back to BigInt where appropriate\n */\nexport function parseWithBigInt(jsonString: string): any {\n return JSON.parse(jsonString, bigIntReviver);\n}\n"]}
|