@allorc/a423-sdk 0.4.0 → 0.5.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/CHANGELOG.md +9 -0
- package/ESCROW.md +4 -2
- package/INTEGRATION.md +5 -1
- package/OPERATIONS.md +3 -1
- package/README.md +4 -2
- package/SECURITY.md +2 -0
- package/SETTLEMENT.md +140 -0
- package/contracts/A423Escrow.sol +68 -6
- package/contracts/standard-input.json +1 -1
- package/examples/operations-dashboard.html +3 -3
- package/package.json +4 -2
- package/src/closing.cjs +17 -0
- package/src/escrow/artifact.json +292 -1
- package/src/escrow/index.cjs +38 -5
- package/src/escrow/index.d.mts +4 -1
- package/src/escrow/index.d.ts +4 -1
- package/src/escrow/index.mjs +1 -1
- package/src/escrow/negotiation.cjs +13 -0
- package/src/escrow/services.cjs +4 -1
- package/src/operations/application.cjs +4 -2
- package/src/operations/factory.cjs +2 -2
- package/src/operations/index.cjs +8 -7
- package/src/operations/index.d.ts +3 -3
- package/src/workflow.cjs +28 -4
- package/src/workflow.d.ts +6 -1
package/src/escrow/artifact.json
CHANGED
|
@@ -189,6 +189,80 @@
|
|
|
189
189
|
"name": "Settled",
|
|
190
190
|
"type": "event"
|
|
191
191
|
},
|
|
192
|
+
{
|
|
193
|
+
"anonymous": false,
|
|
194
|
+
"inputs": [
|
|
195
|
+
{
|
|
196
|
+
"indexed": true,
|
|
197
|
+
"internalType": "bytes32",
|
|
198
|
+
"name": "jobId",
|
|
199
|
+
"type": "bytes32"
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
"indexed": false,
|
|
203
|
+
"internalType": "uint64",
|
|
204
|
+
"name": "revision",
|
|
205
|
+
"type": "uint64"
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
"indexed": false,
|
|
209
|
+
"internalType": "bytes32",
|
|
210
|
+
"name": "proposalHash",
|
|
211
|
+
"type": "bytes32"
|
|
212
|
+
}
|
|
213
|
+
],
|
|
214
|
+
"name": "SettlementAccepted",
|
|
215
|
+
"type": "event"
|
|
216
|
+
},
|
|
217
|
+
{
|
|
218
|
+
"anonymous": false,
|
|
219
|
+
"inputs": [
|
|
220
|
+
{
|
|
221
|
+
"indexed": true,
|
|
222
|
+
"internalType": "bytes32",
|
|
223
|
+
"name": "jobId",
|
|
224
|
+
"type": "bytes32"
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
"indexed": false,
|
|
228
|
+
"internalType": "uint64",
|
|
229
|
+
"name": "revision",
|
|
230
|
+
"type": "uint64"
|
|
231
|
+
},
|
|
232
|
+
{
|
|
233
|
+
"indexed": true,
|
|
234
|
+
"internalType": "address",
|
|
235
|
+
"name": "proposer",
|
|
236
|
+
"type": "address"
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
"indexed": false,
|
|
240
|
+
"internalType": "uint256",
|
|
241
|
+
"name": "workerAmount",
|
|
242
|
+
"type": "uint256"
|
|
243
|
+
},
|
|
244
|
+
{
|
|
245
|
+
"indexed": false,
|
|
246
|
+
"internalType": "uint256",
|
|
247
|
+
"name": "payerAmount",
|
|
248
|
+
"type": "uint256"
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
"indexed": false,
|
|
252
|
+
"internalType": "bytes32",
|
|
253
|
+
"name": "proposalHash",
|
|
254
|
+
"type": "bytes32"
|
|
255
|
+
},
|
|
256
|
+
{
|
|
257
|
+
"indexed": false,
|
|
258
|
+
"internalType": "uint64",
|
|
259
|
+
"name": "expiresAt",
|
|
260
|
+
"type": "uint64"
|
|
261
|
+
}
|
|
262
|
+
],
|
|
263
|
+
"name": "SettlementProposed",
|
|
264
|
+
"type": "event"
|
|
265
|
+
},
|
|
192
266
|
{
|
|
193
267
|
"anonymous": false,
|
|
194
268
|
"inputs": [
|
|
@@ -227,6 +301,19 @@
|
|
|
227
301
|
"name": "Verified",
|
|
228
302
|
"type": "event"
|
|
229
303
|
},
|
|
304
|
+
{
|
|
305
|
+
"inputs": [],
|
|
306
|
+
"name": "SETTLEMENT_TYPEHASH",
|
|
307
|
+
"outputs": [
|
|
308
|
+
{
|
|
309
|
+
"internalType": "bytes32",
|
|
310
|
+
"name": "",
|
|
311
|
+
"type": "bytes32"
|
|
312
|
+
}
|
|
313
|
+
],
|
|
314
|
+
"stateMutability": "view",
|
|
315
|
+
"type": "function"
|
|
316
|
+
},
|
|
230
317
|
{
|
|
231
318
|
"inputs": [],
|
|
232
319
|
"name": "TERMS_TYPEHASH",
|
|
@@ -240,6 +327,29 @@
|
|
|
240
327
|
"stateMutability": "view",
|
|
241
328
|
"type": "function"
|
|
242
329
|
},
|
|
330
|
+
{
|
|
331
|
+
"inputs": [
|
|
332
|
+
{
|
|
333
|
+
"internalType": "bytes32",
|
|
334
|
+
"name": "id",
|
|
335
|
+
"type": "bytes32"
|
|
336
|
+
},
|
|
337
|
+
{
|
|
338
|
+
"internalType": "uint64",
|
|
339
|
+
"name": "revision",
|
|
340
|
+
"type": "uint64"
|
|
341
|
+
},
|
|
342
|
+
{
|
|
343
|
+
"internalType": "bytes32",
|
|
344
|
+
"name": "proposalHash",
|
|
345
|
+
"type": "bytes32"
|
|
346
|
+
}
|
|
347
|
+
],
|
|
348
|
+
"name": "acceptSettlement",
|
|
349
|
+
"outputs": [],
|
|
350
|
+
"stateMutability": "nonpayable",
|
|
351
|
+
"type": "function"
|
|
352
|
+
},
|
|
243
353
|
{
|
|
244
354
|
"inputs": [
|
|
245
355
|
{
|
|
@@ -464,6 +574,38 @@
|
|
|
464
574
|
"internalType": "uint256",
|
|
465
575
|
"name": "workerPaid",
|
|
466
576
|
"type": "uint256"
|
|
577
|
+
},
|
|
578
|
+
{
|
|
579
|
+
"components": [
|
|
580
|
+
{
|
|
581
|
+
"internalType": "uint64",
|
|
582
|
+
"name": "revision",
|
|
583
|
+
"type": "uint64"
|
|
584
|
+
},
|
|
585
|
+
{
|
|
586
|
+
"internalType": "uint64",
|
|
587
|
+
"name": "expiresAt",
|
|
588
|
+
"type": "uint64"
|
|
589
|
+
},
|
|
590
|
+
{
|
|
591
|
+
"internalType": "address",
|
|
592
|
+
"name": "proposer",
|
|
593
|
+
"type": "address"
|
|
594
|
+
},
|
|
595
|
+
{
|
|
596
|
+
"internalType": "uint256",
|
|
597
|
+
"name": "workerAmount",
|
|
598
|
+
"type": "uint256"
|
|
599
|
+
},
|
|
600
|
+
{
|
|
601
|
+
"internalType": "bytes32",
|
|
602
|
+
"name": "proposalHash",
|
|
603
|
+
"type": "bytes32"
|
|
604
|
+
}
|
|
605
|
+
],
|
|
606
|
+
"internalType": "struct A423Escrow.Proposal",
|
|
607
|
+
"name": "proposal",
|
|
608
|
+
"type": "tuple"
|
|
467
609
|
}
|
|
468
610
|
],
|
|
469
611
|
"internalType": "struct A423Escrow.Job",
|
|
@@ -474,6 +616,39 @@
|
|
|
474
616
|
"stateMutability": "view",
|
|
475
617
|
"type": "function"
|
|
476
618
|
},
|
|
619
|
+
{
|
|
620
|
+
"inputs": [
|
|
621
|
+
{
|
|
622
|
+
"internalType": "bytes32",
|
|
623
|
+
"name": "id",
|
|
624
|
+
"type": "bytes32"
|
|
625
|
+
},
|
|
626
|
+
{
|
|
627
|
+
"internalType": "uint64",
|
|
628
|
+
"name": "expectedRevision",
|
|
629
|
+
"type": "uint64"
|
|
630
|
+
},
|
|
631
|
+
{
|
|
632
|
+
"internalType": "uint256",
|
|
633
|
+
"name": "workerAmount",
|
|
634
|
+
"type": "uint256"
|
|
635
|
+
},
|
|
636
|
+
{
|
|
637
|
+
"internalType": "bytes32",
|
|
638
|
+
"name": "proposalHash",
|
|
639
|
+
"type": "bytes32"
|
|
640
|
+
},
|
|
641
|
+
{
|
|
642
|
+
"internalType": "uint64",
|
|
643
|
+
"name": "expiresAt",
|
|
644
|
+
"type": "uint64"
|
|
645
|
+
}
|
|
646
|
+
],
|
|
647
|
+
"name": "proposeSettlement",
|
|
648
|
+
"outputs": [],
|
|
649
|
+
"stateMutability": "nonpayable",
|
|
650
|
+
"type": "function"
|
|
651
|
+
},
|
|
477
652
|
{
|
|
478
653
|
"inputs": [
|
|
479
654
|
{
|
|
@@ -518,6 +693,122 @@
|
|
|
518
693
|
"stateMutability": "nonpayable",
|
|
519
694
|
"type": "function"
|
|
520
695
|
},
|
|
696
|
+
{
|
|
697
|
+
"inputs": [
|
|
698
|
+
{
|
|
699
|
+
"components": [
|
|
700
|
+
{
|
|
701
|
+
"internalType": "bytes32",
|
|
702
|
+
"name": "jobId",
|
|
703
|
+
"type": "bytes32"
|
|
704
|
+
},
|
|
705
|
+
{
|
|
706
|
+
"internalType": "bytes32",
|
|
707
|
+
"name": "agreementHash",
|
|
708
|
+
"type": "bytes32"
|
|
709
|
+
},
|
|
710
|
+
{
|
|
711
|
+
"internalType": "uint64",
|
|
712
|
+
"name": "escrowVersion",
|
|
713
|
+
"type": "uint64"
|
|
714
|
+
},
|
|
715
|
+
{
|
|
716
|
+
"internalType": "uint256",
|
|
717
|
+
"name": "workerAmount",
|
|
718
|
+
"type": "uint256"
|
|
719
|
+
},
|
|
720
|
+
{
|
|
721
|
+
"internalType": "uint256",
|
|
722
|
+
"name": "payerAmount",
|
|
723
|
+
"type": "uint256"
|
|
724
|
+
},
|
|
725
|
+
{
|
|
726
|
+
"internalType": "bytes32",
|
|
727
|
+
"name": "proposalHash",
|
|
728
|
+
"type": "bytes32"
|
|
729
|
+
},
|
|
730
|
+
{
|
|
731
|
+
"internalType": "uint64",
|
|
732
|
+
"name": "expiresAt",
|
|
733
|
+
"type": "uint64"
|
|
734
|
+
}
|
|
735
|
+
],
|
|
736
|
+
"internalType": "struct A423Escrow.ClosingSettlement",
|
|
737
|
+
"name": "s",
|
|
738
|
+
"type": "tuple"
|
|
739
|
+
},
|
|
740
|
+
{
|
|
741
|
+
"internalType": "bytes",
|
|
742
|
+
"name": "payerSignature",
|
|
743
|
+
"type": "bytes"
|
|
744
|
+
},
|
|
745
|
+
{
|
|
746
|
+
"internalType": "bytes",
|
|
747
|
+
"name": "workerSignature",
|
|
748
|
+
"type": "bytes"
|
|
749
|
+
}
|
|
750
|
+
],
|
|
751
|
+
"name": "settleByConsent",
|
|
752
|
+
"outputs": [],
|
|
753
|
+
"stateMutability": "nonpayable",
|
|
754
|
+
"type": "function"
|
|
755
|
+
},
|
|
756
|
+
{
|
|
757
|
+
"inputs": [
|
|
758
|
+
{
|
|
759
|
+
"components": [
|
|
760
|
+
{
|
|
761
|
+
"internalType": "bytes32",
|
|
762
|
+
"name": "jobId",
|
|
763
|
+
"type": "bytes32"
|
|
764
|
+
},
|
|
765
|
+
{
|
|
766
|
+
"internalType": "bytes32",
|
|
767
|
+
"name": "agreementHash",
|
|
768
|
+
"type": "bytes32"
|
|
769
|
+
},
|
|
770
|
+
{
|
|
771
|
+
"internalType": "uint64",
|
|
772
|
+
"name": "escrowVersion",
|
|
773
|
+
"type": "uint64"
|
|
774
|
+
},
|
|
775
|
+
{
|
|
776
|
+
"internalType": "uint256",
|
|
777
|
+
"name": "workerAmount",
|
|
778
|
+
"type": "uint256"
|
|
779
|
+
},
|
|
780
|
+
{
|
|
781
|
+
"internalType": "uint256",
|
|
782
|
+
"name": "payerAmount",
|
|
783
|
+
"type": "uint256"
|
|
784
|
+
},
|
|
785
|
+
{
|
|
786
|
+
"internalType": "bytes32",
|
|
787
|
+
"name": "proposalHash",
|
|
788
|
+
"type": "bytes32"
|
|
789
|
+
},
|
|
790
|
+
{
|
|
791
|
+
"internalType": "uint64",
|
|
792
|
+
"name": "expiresAt",
|
|
793
|
+
"type": "uint64"
|
|
794
|
+
}
|
|
795
|
+
],
|
|
796
|
+
"internalType": "struct A423Escrow.ClosingSettlement",
|
|
797
|
+
"name": "s",
|
|
798
|
+
"type": "tuple"
|
|
799
|
+
}
|
|
800
|
+
],
|
|
801
|
+
"name": "settlementDigest",
|
|
802
|
+
"outputs": [
|
|
803
|
+
{
|
|
804
|
+
"internalType": "bytes32",
|
|
805
|
+
"name": "",
|
|
806
|
+
"type": "bytes32"
|
|
807
|
+
}
|
|
808
|
+
],
|
|
809
|
+
"stateMutability": "view",
|
|
810
|
+
"type": "function"
|
|
811
|
+
},
|
|
521
812
|
{
|
|
522
813
|
"inputs": [
|
|
523
814
|
{
|
|
@@ -657,5 +948,5 @@
|
|
|
657
948
|
"type": "function"
|
|
658
949
|
}
|
|
659
950
|
],
|
|
660
|
-
"bytecode": "0x610180604052348015610010575f5ffd5b506040516127c43803806127c483398101604081905261002f916101df565b6040518060400160405280600a81526020016941343233457363726f7760b01b815250604051806040016040528060018152602001603160f81b81525060015f8190555061008760018361016760201b90919060201c565b61012052610096816002610167565b61014052815160208084019190912060e052815190820120610100524660a05261012260e05161010051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b60805250503060c0526001600160a01b0381163b5f0361015557604051630256965f60e01b815260040160405180910390fd5b6001600160a01b0316610160526103cc565b5f6020835110156101825761017b83610199565b9050610193565b8161018d84826102a4565b5060ff90505b92915050565b5f5f829050601f815111156101cc578260405163305a27a960e01b81526004016101c3919061035e565b60405180910390fd5b80516101d7826103a9565b179392505050565b5f602082840312156101ef575f5ffd5b81516001600160a01b0381168114610205575f5ffd5b9392505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061023457607f821691505b60208210810361025257634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561029f57805f5260205f20601f840160051c8101602085101561027d5750805b601f840160051c820191505b8181101561029c575f8155600101610289565b50505b505050565b81516001600160401b038111156102bd576102bd61020c565b6102d1816102cb8454610220565b84610258565b6020601f821160018114610303575f83156102ec5750848201515b5f19600385901b1c1916600184901b17845561029c565b5f84815260208120601f198516915b828110156103325787850151825560209485019460019092019101610312565b508482101561034f57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b602081525f82518060208401525f5b8181101561038a576020818601810151604086840101520161036d565b505f604082850101526040601f19601f83011684010191505092915050565b80516020808301519190811015610252575f1960209190910360031b1b16919050565b60805160a05160c05160e0516101005161012051610140516101605161236561045f5f395f81816101f601528181610cfa01528181610d8a01528181610dd901528181611641015281816116d60152818161174e01528181611794015261183601525f61144601525f61141401525f6115da01525f6115b201525f61150d01525f61153701525f61156101526123655ff3fe608060405234801561000f575f5ffd5b50600436106100cb575f3560e01c806384b0196e11610088578063d26ff86e11610063578063d26ff86e146101ab578063edb70d9e146101be578063f729cf0d146101d1578063fc0c546a146101f1575f5ffd5b806384b0196e1461016a5780638a92631714610185578063cc3e049b14610198575f5ffd5b8063099d2518146100cf5780633aa36987146100f55780634e8fee001461011c57806367d42a8b14610131578063795ea18e1461014457806382cbf88b14610157575b5f5ffd5b6100e26100dd366004611c4f565b610230565b6040519081526020015b60405180910390f35b6100e27f3a82e9543b510404d05948b3e6cbf4e32f66690f864ccb5ef67ee5927a49a4ba81565b61012f61012a366004611c71565b610288565b005b61012f61013f366004611c91565b61039f565b61012f610152366004611c91565b61046f565b61012f610165366004611c71565b6105cb565b61017261070e565b6040516100ec9796959493929190611ceb565b61012f610193366004611d81565b610750565b61012f6101a6366004611c91565b610eee565b61012f6101b9366004611c71565b610f76565b61012f6101cc366004611c71565b61107c565b6101e46101df366004611c91565b611154565b6040516100ec9190611e34565b6102187f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100ec565b5f6102827f3a82e9543b510404d05948b3e6cbf4e32f66690f864ccb5ef67ee5927a49a4ba83604051602001610267929190611fa1565b604051602081830303815290604052805190602001206112d6565b92915050565b5f828152600360208190526040909120908101546001600160a01b031633146102c3576040516282b42960e81b815260040160405180910390fd5b6002600882015460ff1660078111156102de576102de611e00565b146102fc57604051636f20b45d60e11b815260040160405180910390fd5b6006810154600160401b90046001600160401b03164211156103315760405163637910d560e11b815260040160405180910390fd5b8060090154821461035557604051630256965f60e01b815260040160405180910390fd5b60088101805460ff1916600317905560405182815283907f5c83c73bb0b96f8bc4b95aabcb7980de29ee8ec40cf1aa83c5bd999b44077557906020015b60405180910390a2505050565b6103a7611302565b5f818152600360208190526040909120908101546001600160a01b031633146103e2576040516282b42960e81b815260040160405180910390fd5b6003600882015460ff1660078111156103fd576103fd611e00565b1461041b57604051636f20b45d60e11b815260040160405180910390fd5b6006810154600160801b90046001600160401b03164211156104505760405163637910d560e11b815260040160405180910390fd5b6104628282835f01600501545f61132a565b5061046c60015f55565b50565b610477611302565b5f8181526003602052604090206002600882015460ff16600781111561049f5761049f611e00565b141580156104c657506003600882015460ff1660078111156104c3576104c3611e00565b14155b80156104eb57506004600882015460ff1660078111156104e8576104e8611e00565b14155b1561050957604051636f20b45d60e11b815260040160405180910390fd5b6006810154600160801b90046001600160401b0316421161053d5760405163637910d560e11b815260040160405180910390fd5b600681015460058201545f9161271091600160c01b90910461ffff16906105659083906120ca565b61056f91906120f1565b6105799190612108565b60068301546005840154600160c01b90910461ffff169061059d9061271090612108565b6105a791906120f1565b6105b1919061211b565b90506105c0838383600361132a565b505061046c60015f55565b5f82815260036020526040902060018101546001600160a01b03163314801590610602575060028101546001600160a01b03163314155b801561061b575060038101546001600160a01b03163314155b15610638576040516282b42960e81b815260040160405180910390fd5b6002600882015460ff16600781111561065357610653611e00565b1415801561067a57506003600882015460ff16600781111561067757610677611e00565b14155b1561069857604051636f20b45d60e11b815260040160405180910390fd5b6006810154600160801b90046001600160401b03164211156106cd5760405163637910d560e11b815260040160405180910390fd5b60088101805460ff1916600417905560405182815283907f8e39eab2c454d024fb5c89b50dabc51f5068c7a283891d06aa91f5ba96acded190602001610392565b5f6060805f5f5f606061071f61140d565b61072761143f565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b610758611302565b610768604084016020850161212e565b6001600160a01b0316336001600160a01b031614610798576040516282b42960e81b815260040160405180910390fd5b82355f9081526003602052604081206008015460ff1660078111156107bf576107bf611e00565b146107dd57604051636f20b45d60e11b815260040160405180910390fd5b823515806107ee5750610140830135155b806107fb575060a0830135155b8061081d57505f610812606085016040860161212e565b6001600160a01b0316145b806108575750610833604084016020850161212e565b6001600160a01b031661084c606085016040860161212e565b6001600160a01b0316145b8061087957505f61086e608085016060860161212e565b6001600160a01b0316145b8061089b57505f61089060a085016080860161212e565b6001600160a01b0316145b806108d557506108b1604084016020850161212e565b6001600160a01b03166108ca60a085016080860161212e565b6001600160a01b0316145b8061090f57506108eb606084016040850161212e565b6001600160a01b031661090460a085016080860161212e565b6001600160a01b0316145b80610930575061271061092a61014085016101208601612147565b61ffff16115b1561094e57604051630256965f60e01b815260040160405180910390fd5b4261095f60e0850160c08601612160565b6001600160401b03161115806109a6575061098060e0840160c08501612160565b6001600160401b031661099a610100850160e08601612160565b6001600160401b031611155b806109e457506109bd610100840160e08501612160565b6001600160401b03166109d861012085016101008601612160565b6001600160401b031611155b15610a0257604051630256965f60e01b815260040160405180910390fd5b5f610a13606085016040860161212e565b6001600160a01b03163b5f03610a9457610a33606085016040860161212e565b6001600160a01b0316610a83610a4886610230565b85858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061146c92505050565b6001600160a01b0316149050610b35565b610aa4606085016040860161212e565b6001600160a01b0316631626ba7e610abb86610230565b85856040518463ffffffff1660e01b8152600401610adb93929190612179565b602060405180830381865afa925050508015610b14575060408051601f3d908101601f19168201909252610b11918101906121ae565b60015b610b1f57505f610b35565b6001600160e01b031916630b135d3f60e11b1490505b80610b52576040516282b42960e81b815260040160405180910390fd5b604051806080016040528085803603810190610b6e919061220a565b8152602001600181525f602080830182905260409283018290528735825260038082529183902084518051825580830151600180840180546001600160a01b039384166001600160a01b03199182161790915596830151600285018054918416918916919091179055606083015195840180549683169688169690961790955560808201516004840180549190921696169590951790945560a0840151600582015560c084015160068201805460e087015161010088015161012089015161ffff16600160c01b0261ffff60c01b196001600160401b03928316600160801b021669ffffffffffffffffffff60801b19938316600160401b026fffffffffffffffffffffffffffffffff19909516929096169190911792909217169290921791909117905561014090930151600780850191909155908401516008840180549193909260ff19909216918490811115610cc957610cc9611e00565b02179055506040828101516009830155606090920151600a90910155516370a0823160e01b81523060048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610d47573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d6b91906122d3565b9050610db6610d80604087016020880161212e565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016903060a0890135611494565b610dc460a08601358261211b565b6040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610e26573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e4a91906122d3565b14610e685760405163570883e560e01b815260040160405180910390fd5b610e78604086016020870161212e565b6001600160a01b031661014086013586357f32f3ba658fc1eefa6d5ca6ba35e8715bb439f7713edf2d61c03f4920fcb8cbab610eba60608a0160408b0161212e565b604080516001600160a01b03909216825260a08b013560208301520160405180910390a45050610ee960015f55565b505050565b610ef6611302565b5f8181526003602052604090206001600882015460ff166007811115610f1e57610f1e611e00565b14610f3c57604051636f20b45d60e11b815260040160405180910390fd5b60068101546001600160401b03164211610f695760405163637910d560e11b815260040160405180910390fd5b61046282825f600161132a565b5f82815260036020526040902060028101546001600160a01b03163314610faf576040516282b42960e81b815260040160405180910390fd5b6001600882015460ff166007811115610fca57610fca611e00565b14610fe857604051636f20b45d60e11b815260040160405180910390fd5b60068101546001600160401b03164211156110165760405163637910d560e11b815260040160405180910390fd5b8161103457604051630256965f60e01b815260040160405180910390fd5b6009810182905560088101805460ff1916600217905560405182815283907fa2f32e666157494cac7b795a43a2914dcb77efd9515b47db67dd15d332234f9790602001610392565b611084611302565b5f82815260036020526040902060048101546001600160a01b031633146110bd576040516282b42960e81b815260040160405180910390fd5b6004600882015460ff1660078111156110d8576110d8611e00565b146110f657604051636f20b45d60e11b815260040160405180910390fd5b6006810154600160801b90046001600160401b031642118061111b5750600581015482115b1561113957604051630256965f60e01b815260040160405180910390fd5b611146838284600261132a565b5061115060015f55565b5050565b604080516101e0810182525f6080820181815260a0830182905260c0830182905260e08301829052610100830182905261012083018290526101408301829052610160830182905261018083018290526101a083018290526101c0830182905282526020820181905291810182905260608101919091525f8281526003602081815260409283902083516101e0810190945280546080850190815260018201546001600160a01b0390811660a08701526002830154811660c087015293820154841660e08601526004820154909316610100850152600581015461012085015260068101546001600160401b03808216610140870152600160401b82048116610160870152600160801b820416610180860152600160c01b900461ffff166101a08501526007808201546101c0860152928452600881015490929184019160ff909116908111156112a7576112a7611e00565b60078111156112b8576112b8611e00565b815260098201546020820152600a9091015460409091015292915050565b5f6102826112e2611501565b8360405161190160f01b8152600281019290925260228201526042902090565b60025f540361132457604051633ee5aeb560e01b815260040160405180910390fd5b60025f55565b60058301545f9061133c9084906122ea565b9050821561135857801561135157600761135b565b600561135b565b60065b60088501805460ff1916600183600781111561137957611379611e00565b0217905550600a840183905582156113a35760028401546113a3906001600160a01b03168461162a565b80156113c15760018401546113c1906001600160a01b03168261162a565b604080518481526020810183905260ff841681830152905186917fb3a77f60f2042a66aa50b5810774aab5f1a2dd6799ee891ebb9fe98b95fec57f919081900360600190a25050505050565b606061143a7f000000000000000000000000000000000000000000000000000000000000000060016118c0565b905090565b606061143a7f000000000000000000000000000000000000000000000000000000000000000060026118c0565b5f5f5f5f61147a8686611969565b92509250925061148a82826119b2565b5090949350505050565b6040516001600160a01b0384811660248301528381166044830152606482018390526114fb9186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050611a6f565b50505050565b5f306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561155957507f000000000000000000000000000000000000000000000000000000000000000046145b1561158357507f000000000000000000000000000000000000000000000000000000000000000090565b61143a604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b6040516370a0823160e01b81523060048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa15801561168e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116b291906122d3565b6040516370a0823160e01b81526001600160a01b0385811660048301529192505f917f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561171b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061173f91906122d3565b90506117756001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168585611adb565b61177f83836122ea565b6040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa1580156117e1573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061180591906122d3565b1415806118a25750611817838261211b565b6040516370a0823160e01b81526001600160a01b0386811660048301527f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561187b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061189f91906122d3565b14155b156114fb5760405163570883e560e01b815260040160405180910390fd5b606060ff83146118da576118d383611b0c565b9050610282565b8180546118e6906122fd565b80601f0160208091040260200160405190810160405280929190818152602001828054611912906122fd565b801561195d5780601f106119345761010080835404028352916020019161195d565b820191905f5260205f20905b81548152906001019060200180831161194057829003601f168201915b50505050509050610282565b5f5f5f83516041036119a0576020840151604085015160608601515f1a61199288828585611b49565b9550955095505050506119ab565b505081515f91506002905b9250925092565b5f8260038111156119c5576119c5611e00565b036119ce575050565b60018260038111156119e2576119e2611e00565b03611a005760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115611a1457611a14611e00565b03611a3a5760405163fce698f760e01b8152600481018290526024015b60405180910390fd5b6003826003811115611a4e57611a4e611e00565b03611150576040516335e2f38360e21b815260048101829052602401611a31565b5f5f60205f8451602086015f885af180611a8e576040513d5f823e3d81fd5b50505f513d91508115611aa5578060011415611ab2565b6001600160a01b0384163b155b156114fb57604051635274afe760e01b81526001600160a01b0385166004820152602401611a31565b6040516001600160a01b03838116602483015260448201839052610ee991859182169063a9059cbb906064016114c9565b60605f611b1883611c11565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115611b8257505f91506003905082611c07565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611bd3573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116611bfe57505f925060019150829050611c07565b92505f91508190505b9450945094915050565b5f60ff8216601f81111561028257604051632cd44ac360e21b815260040160405180910390fd5b5f6101608284031215611c49575f5ffd5b50919050565b5f6101608284031215611c60575f5ffd5b611c6a8383611c38565b9392505050565b5f5f60408385031215611c82575f5ffd5b50508035926020909101359150565b5f60208284031215611ca1575f5ffd5b5035919050565b5f81518084525f5b81811015611ccc57602081850181015186830182015201611cb0565b505f602082860101526020601f19601f83011685010191505092915050565b60ff60f81b8816815260e060208201525f611d0960e0830189611ca8565b8281036040840152611d1b8189611ca8565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b81811015611d70578351835260209384019390920191600101611d52565b50909b9a5050505050505050505050565b5f5f5f6101808486031215611d94575f5ffd5b611d9e8585611c38565b92506101608401356001600160401b03811115611db9575f5ffd5b8401601f81018613611dc9575f5ffd5b80356001600160401b03811115611dde575f5ffd5b866020828401011115611def575f5ffd5b939660209190910195509293505050565b634e487b7160e01b5f52602160045260245ffd5b60088110611e3057634e487b7160e01b5f52602160045260245ffd5b9052565b5f6101c0820190508251805183526020810151611e5c60208501826001600160a01b03169052565b506040810151611e7760408501826001600160a01b03169052565b506060810151611e9260608501826001600160a01b03169052565b506080810151611ead60808501826001600160a01b03169052565b5060a081015160a084015260c0810151611ed260c08501826001600160401b03169052565b5060e0810151611eed60e08501826001600160401b03169052565b50610100810151611f0a6101008501826001600160401b03169052565b50610120810151611f2261012085018261ffff169052565b50610140810151610140840152506020830151611f43610160840182611e14565b5060408301516101808301526060909201516101a09091015290565b80356001600160a01b0381168114611f75575f5ffd5b919050565b80356001600160401b0381168114611f75575f5ffd5b803561ffff81168114611f75575f5ffd5b8281528135602080830191909152610180820190611fc0908401611f5f565b6001600160a01b038116604084015250611fdc60408401611f5f565b6001600160a01b038116606084015250611ff860608401611f5f565b6001600160a01b03811660808401525061201460808401611f5f565b6001600160a01b03811660a08401525060a083013560c08381019190915261203d908401611f7a565b6001600160401b03811660e08401525061205960e08401611f7a565b6001600160401b038116610100840152506120776101008401611f7a565b6001600160401b038116610120840152506120956101208401611f90565b61ffff81166101408401525061014092909201356101609190910152919050565b634e487b7160e01b5f52601260045260245ffd5b5f826120d8576120d86120b6565b500690565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610282576102826120dd565b5f82612116576121166120b6565b500490565b80820180821115610282576102826120dd565b5f6020828403121561213e575f5ffd5b611c6a82611f5f565b5f60208284031215612157575f5ffd5b611c6a82611f90565b5f60208284031215612170575f5ffd5b611c6a82611f7a565b83815260406020820152816040820152818360608301375f818301606090810191909152601f909201601f1916010192915050565b5f602082840312156121be575f5ffd5b81516001600160e01b031981168114611c6a575f5ffd5b60405161016081016001600160401b038111828210171561220457634e487b7160e01b5f52604160045260245ffd5b60405290565b5f61016082840312801561221c575f5ffd5b506122256121d5565b8235815261223560208401611f5f565b602082015261224660408401611f5f565b604082015261225760608401611f5f565b606082015261226860808401611f5f565b608082015260a0838101359082015261228360c08401611f7a565b60c082015261229460e08401611f7a565b60e08201526122a66101008401611f7a565b6101008201526122b96101208401611f90565b610120820152610140928301359281019290925250919050565b5f602082840312156122e3575f5ffd5b5051919050565b81810381811115610282576102826120dd565b600181811c9082168061231157607f821691505b602082108103611c4957634e487b7160e01b5f52602260045260245ffdfea26469706673582212205baa27a5ede03269f91b23ac0ffdafa9d221f7764d1f438eee508bec48f9def564736f6c634300081e0033"
|
|
951
|
+
"bytecode": "0x610180604052348015610010575f5ffd5b5060405161348438038061348483398101604081905261002f916101df565b6040518060400160405280600a81526020016941343233457363726f7760b01b815250604051806040016040528060018152602001603160f81b81525060015f8190555061008760018361016760201b90919060201c565b61012052610096816002610167565b61014052815160208084019190912060e052815190820120610100524660a05261012260e05161010051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b60805250503060c0526001600160a01b0381163b5f0361015557604051630256965f60e01b815260040160405180910390fd5b6001600160a01b0316610160526103cc565b5f6020835110156101825761017b83610199565b9050610193565b8161018d84826102a4565b5060ff90505b92915050565b5f5f829050601f815111156101cc578260405163305a27a960e01b81526004016101c3919061035e565b60405180910390fd5b80516101d7826103a9565b179392505050565b5f602082840312156101ef575f5ffd5b81516001600160a01b0381168114610205575f5ffd5b9392505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061023457607f821691505b60208210810361025257634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561029f57805f5260205f20601f840160051c8101602085101561027d5750805b601f840160051c820191505b8181101561029c575f8155600101610289565b50505b505050565b81516001600160401b038111156102bd576102bd61020c565b6102d1816102cb8454610220565b84610258565b6020601f821160018114610303575f83156102ec5750848201515b5f19600385901b1c1916600184901b17845561029c565b5f84815260208120601f198516915b828110156103325787850151825560209485019460019092019101610312565b508482101561034f57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b602081525f82518060208401525f5b8181101561038a576020818601810151604086840101520161036d565b505f604082850101526040601f19601f83011684010191505092915050565b80516020808301519190811015610252575f1960209190910360031b1b16919050565b60805160a05160c05160e0516101005161012051610140516101605161302561045f5f395f81816102af015281816114bf015281816115470152818161159601528181611ee101528181611f7601528181611fee0152818161203401526120d601525f611e0f01525f611ddd01525f61223901525f61221101525f61216c01525f61219601525f6121c001526130255ff3fe608060405234801561000f575f5ffd5b5060043610610111575f3560e01c806382cbf88b1161009e578063cc3e049b1161006e578063cc3e049b14610251578063d26ff86e14610264578063edb70d9e14610277578063f729cf0d1461028a578063fc0c546a146102aa575f5ffd5b806382cbf88b146101e957806384b0196e146101fc5780638a92631714610217578063b1fb79c01461022a575f5ffd5b80633cf973a8116100e45780633cf973a81461018a5780634e8fee001461019d57806367d42a8b146101b05780636d78dc2e146101c3578063795ea18e146101d6575f5ffd5b806308834fb714610115578063099d25181461012a57806316db9070146101505780633aa3698714610163575b5f5ffd5b6101286101233660046126e5565b6102e9565b005b61013d61013836600461272f565b6103ce565b6040519081526020015b60405180910390f35b61012861015e366004612751565b610426565b61013d7f3a82e9543b510404d05948b3e6cbf4e32f66690f864ccb5ef67ee5927a49a4ba81565b6101286101983660046127f1565b61075c565b6101286101ab366004612872565b61090e565b6101286101be366004612892565b610a25565b61013d6101d13660046128a9565b610af5565b6101286101e4366004612892565b610b2c565b6101286101f7366004612872565b610cb8565b610204610e43565b6040516101479796959493929190612906565b61012861022536600461299c565b610e85565b61013d7f540b958eec7b6eee84ef0a13bf83a448a990f8e9566a0f28bb771a27d0c364d581565b61012861025f366004612892565b6116a6565b610128610272366004612872565b611784565b610128610285366004612872565b61188a565b61029d610298366004612892565b611962565b6040516101479190612a21565b6102d17f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610147565b6102f1611ad0565b5f83815260036020526040902060018101546001600160a01b03163314801590610328575060028101546001600160a01b03163314155b8061033f5750600c8101546001600160a01b031633145b1561035c576040516282b42960e81b815260040160405180910390fd5b610367818484611af8565b604080516001600160401b03851681526020810184905285917fb2bf4a774270088cf58089bef9455cc4ec4e914fda289fb7fff5025eafc533c8910160405180910390a26103bf848283600b01600201546004611bc3565b506103c960015f55565b505050565b5f6104207f3a82e9543b510404d05948b3e6cbf4e32f66690f864ccb5ef67ee5927a49a4ba83604051602001610405929190612bbf565b60405160208183030381529060405280519060200120611cac565b92915050565b5f85815260036020526040902060018101546001600160a01b0316331480159061045d575060028101546001600160a01b03163314155b1561047a576040516282b42960e81b815260040160405180910390fd5b600160088083015460ff1690811115610495576104956129ed565b141580156104bc5750600260088083015460ff16908111156104b9576104b96129ed565b14155b80156104e15750600360088083015460ff16908111156104de576104de6129ed565b14155b8015610504575060088181015460ff1681811115610501576105016129ed565b14155b1561052257604051636f20b45d60e11b815260040160405180910390fd5b600b8101546001600160401b0386811691161415806105445750600581015484115b8061054d575082155b1561056b57604051630256965f60e01b815260040160405180910390fd5b60088181015460ff1681811115610584576105846129ed565b14801561059d5750600c8101546001600160a01b031633145b156105ba576040516282b42960e81b815260040160405180910390fd5b42826001600160401b03161115806105e9575060068101546001600160401b03600160801b9091048116908316115b8061060757506006810154600160801b90046001600160401b031642115b156106255760405163637910d560e11b815260040160405180910390fd5b6040518060a0016040528086600161063d9190612ce8565b6001600160401b03908116825284811660208084019190915233604080850182905260608086018b905260809586018a90528651600b89018054958901519187166001600160801b031990961695909517600160401b91871691909102179384905590860151600c880180546001600160a01b0319166001600160a01b03909216919091179055850151600d8701559390920151600e8501556008808501805460ff19169091179055600584015489927f313fe6db037665faaf39fbf4329c07f3e7cd3329ac8ae51afa842bcc974e42c3921690889061071e908290612d07565b604080516001600160401b039485168152602081019390935282015260608101889052908616608082015260a00160405180910390a3505050505050565b610764611ad0565b84355f90815260036020526040908190209061079690829061078c9060608a01908a01612d1a565b8860a00135611af8565b600781015460208701351415806107b55750600d810154606087013514155b806107d7575060058101546107cf90606088013590612d07565b866080013514155b8061080e5750600b810154600160401b90046001600160401b031661080260e0880160c08901612d1a565b6001600160401b031614155b1561082c57604051630256965f60e01b815260040160405180910390fd5b5f61083687610af5565b6001830154909150610853906001600160a01b0316828888611cd8565b158061087657506002820154610874906001600160a01b0316828686611cd8565b155b15610893576040516282b42960e81b815260040160405180910390fd5b86357fb2bf4a774270088cf58089bef9455cc4ec4e914fda289fb7fff5025eafc533c86108c660608a0160408b01612d1a565b604080516001600160401b03909216825260a08b013560208301520160405180910390a26108fc87358360608a01356004611bc3565b505061090760015f55565b5050505050565b5f828152600360208190526040909120908101546001600160a01b03163314610949576040516282b42960e81b815260040160405180910390fd5b600260088083015460ff1690811115610964576109646129ed565b1461098257604051636f20b45d60e11b815260040160405180910390fd5b6006810154600160401b90046001600160401b03164211156109b75760405163637910d560e11b815260040160405180910390fd5b806009015482146109db57604051630256965f60e01b815260040160405180910390fd5b60088101805460ff1916600317905560405182815283907f5c83c73bb0b96f8bc4b95aabcb7980de29ee8ec40cf1aa83c5bd999b44077557906020015b60405180910390a2505050565b610a2d611ad0565b5f818152600360208190526040909120908101546001600160a01b03163314610a68576040516282b42960e81b815260040160405180910390fd5b600360088083015460ff1690811115610a8357610a836129ed565b14610aa157604051636f20b45d60e11b815260040160405180910390fd5b6006810154600160801b90046001600160401b0316421115610ad65760405163637910d560e11b815260040160405180910390fd5b610ae88282835f01600501545f611bc3565b50610af260015f55565b50565b5f6104207f540b958eec7b6eee84ef0a13bf83a448a990f8e9566a0f28bb771a27d0c364d583604051602001610405929190612d33565b610b34611ad0565b5f818152600360205260409020600260088083015460ff1690811115610b5c57610b5c6129ed565b14158015610b835750600360088083015460ff1690811115610b8057610b806129ed565b14155b8015610ba85750600460088083015460ff1690811115610ba557610ba56129ed565b14155b8015610bcb575060088181015460ff1681811115610bc857610bc86129ed565b14155b80610bd857506009810154155b15610bf657604051636f20b45d60e11b815260040160405180910390fd5b6006810154600160801b90046001600160401b03164211610c2a5760405163637910d560e11b815260040160405180910390fd5b600681015460058201545f9161271091600160c01b90910461ffff1690610c52908390612dca565b610c5c9190612ddd565b610c669190612df4565b60068301546005840154600160c01b90910461ffff1690610c8a9061271090612df4565b610c949190612ddd565b610c9e9190612e07565b9050610cad8383836003611bc3565b5050610af260015f55565b5f82815260036020526040902060018101546001600160a01b03163314801590610cef575060028101546001600160a01b03163314155b8015610d08575060038101546001600160a01b03163314155b15610d25576040516282b42960e81b815260040160405180910390fd5b600260088083015460ff1690811115610d4057610d406129ed565b14158015610d675750600360088083015460ff1690811115610d6457610d646129ed565b14155b8015610d8a575060088181015460ff1681811115610d8757610d876129ed565b14155b8015610daf5750600160088083015460ff1690811115610dac57610dac6129ed565b14155b15610dcd57604051636f20b45d60e11b815260040160405180910390fd5b6006810154600160801b90046001600160401b0316421115610e025760405163637910d560e11b815260040160405180910390fd5b60088101805460ff1916600417905560405182815283907f8e39eab2c454d024fb5c89b50dabc51f5068c7a283891d06aa91f5ba96acded190602001610a18565b5f6060805f5f5f6060610e54611dd6565b610e5c611e08565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b610e8d611ad0565b610e9d6040840160208501612e1a565b6001600160a01b0316336001600160a01b031614610ecd576040516282b42960e81b815260040160405180910390fd5b82355f90815260036020526040812060089081015460ff1690811115610ef557610ef56129ed565b14610f1357604051636f20b45d60e11b815260040160405180910390fd5b82351580610f245750610140830135155b80610f31575060a0830135155b80610f5357505f610f486060850160408601612e1a565b6001600160a01b0316145b80610f8d5750610f696040840160208501612e1a565b6001600160a01b0316610f826060850160408601612e1a565b6001600160a01b0316145b80610faf57505f610fa46080850160608601612e1a565b6001600160a01b0316145b80610fd157505f610fc660a0850160808601612e1a565b6001600160a01b0316145b8061100b5750610fe76040840160208501612e1a565b6001600160a01b031661100060a0850160808601612e1a565b6001600160a01b0316145b8061104557506110216060840160408501612e1a565b6001600160a01b031661103a60a0850160808601612e1a565b6001600160a01b0316145b80611066575061271061106061014085016101208601612e33565b61ffff16115b1561108457604051630256965f60e01b815260040160405180910390fd5b4261109560e0850160c08601612d1a565b6001600160401b03161115806110dc57506110b660e0840160c08501612d1a565b6001600160401b03166110d0610100850160e08601612d1a565b6001600160401b031611155b8061111a57506110f3610100840160e08501612d1a565b6001600160401b031661110e61012085016101008601612d1a565b6001600160401b031611155b1561113857604051630256965f60e01b815260040160405180910390fd5b5f6111496060850160408601612e1a565b6001600160a01b03163b5f036111ca576111696060850160408601612e1a565b6001600160a01b03166111b961117e866103ce565b85858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250611e3592505050565b6001600160a01b031614905061126b565b6111da6060850160408601612e1a565b6001600160a01b0316631626ba7e6111f1866103ce565b85856040518463ffffffff1660e01b815260040161121193929190612e4c565b602060405180830381865afa92505050801561124a575060408051601f3d908101601f1916820190925261124791810190612e81565b60015b61125557505f61126b565b6001600160e01b031916630b135d3f60e11b1490505b80611288576040516282b42960e81b815260040160405180910390fd5b6040518060a00160405280858036038101906112a49190612edd565b8152602001600181525f60208083018290526040808401839052805160a0808201835284825281840185905281830185905260608281018690526080808401879052968101929092528a35855260038085529483902087518051825580860151600180840180546001600160a01b039384166001600160a01b0319918216179091559683015160028501805491841691891691909117905594820151978301805498821698871698909817909755968701516004820180549190971694169390931790945592840151600582015560c084015160068201805460e087015161010088015161012089015161ffff16600160c01b0261ffff60c01b196001600160401b03928316600160801b021669ffffffffffffffffffff60801b19938316600160401b026001600160801b03199095169690921695909517929092171617919091179055610140909301516007840155830151600880840180549293909260ff1916918490811115611419576114196129ed565b02179055506040828101516009830155606080840151600a8401556080938401518051600b8501805460208401516001600160401b03908116600160401b026001600160801b031990921693169290921791909117905580830151600c850180546001600160a01b039283166001600160a01b031990911617905591810151600d85015590930151600e90920191909155516370a0823160e01b81523060048201525f917f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015611504573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115289190612fa6565b905061157361153d6040870160208801612e1a565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016903060a0890135611e5d565b61158160a086013582612e07565b6040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa1580156115e3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116079190612fa6565b146116255760405163570883e560e01b815260040160405180910390fd5b6116356040860160208701612e1a565b6001600160a01b031661014086013586357f32f3ba658fc1eefa6d5ca6ba35e8715bb439f7713edf2d61c03f4920fcb8cbab61167760608a0160408b01612e1a565b604080516001600160a01b03909216825260a08b013560208301520160405180910390a450506103c960015f55565b6116ae611ad0565b5f818152600360205260409020600160088083015460ff16908111156116d6576116d66129ed565b1415801561172c575060088181015460ff16818111156116f8576116f86129ed565b148061171c5750600460088083015460ff169081111561171a5761171a6129ed565b145b801561172a57506009810154155b155b1561174a57604051636f20b45d60e11b815260040160405180910390fd5b60068101546001600160401b031642116117775760405163637910d560e11b815260040160405180910390fd5b610ae882825f6001611bc3565b5f82815260036020526040902060028101546001600160a01b031633146117bd576040516282b42960e81b815260040160405180910390fd5b600160088083015460ff16908111156117d8576117d86129ed565b146117f657604051636f20b45d60e11b815260040160405180910390fd5b60068101546001600160401b03164211156118245760405163637910d560e11b815260040160405180910390fd5b8161184257604051630256965f60e01b815260040160405180910390fd5b6009810182905560088101805460ff1916600217905560405182815283907fa2f32e666157494cac7b795a43a2914dcb77efd9515b47db67dd15d332234f9790602001610a18565b611892611ad0565b5f82815260036020526040902060048101546001600160a01b031633146118cb576040516282b42960e81b815260040160405180910390fd5b600460088083015460ff16908111156118e6576118e66129ed565b1461190457604051636f20b45d60e11b815260040160405180910390fd5b6006810154600160801b90046001600160401b03164211806119295750600581015482115b1561194757604051630256965f60e01b815260040160405180910390fd5b6119548382846002611bc3565b5061195e60015f55565b5050565b61196a612601565b5f8281526003602081815260409283902083516102008101909452805460a0850190815260018201546001600160a01b0390811660c08701526002830154811660e08701529382015484166101008601526004820154909316610120850152600581015461014085015260068101546001600160401b03808216610160870152600160401b82048116610180870152600160801b8204166101a0860152600160c01b900461ffff166101c085015260078101546101e08501529183526008808301549184019160ff1690811115611a4357611a436129ed565b6008811115611a5457611a546129ed565b81526009820154602080830191909152600a830154604080840191909152805160a081018252600b8501546001600160401b038082168352600160401b9091041692810192909252600c8401546001600160a01b031690820152600d830154606082810191909152600e90930154608082015291015292915050565b60025f5403611af257604051633ee5aeb560e01b815260040160405180910390fd5b60025f55565b60088381015460ff1681811115611b1157611b116129ed565b14611b2f57604051636f20b45d60e11b815260040160405180910390fd5b600b8301546001600160401b038381169116141580611b525750600e8301548114155b15611b7057604051630256965f60e01b815260040160405180910390fd5b600b830154600160401b90046001600160401b0316421180611ba557506006830154600160801b90046001600160401b031642115b156103c95760405163637910d560e11b815260040160405180910390fd5b60058301545f90611bd5908490612d07565b90508215611bf1578015611bea576007611bf4565b6005611bf4565b60065b846008015f6101000a81548160ff02191690836008811115611c1857611c186129ed565b0217905550600a84018390558215611c42576002840154611c42906001600160a01b031684611eca565b8015611c60576001840154611c60906001600160a01b031682611eca565b604080518481526020810183905260ff841681830152905186917fb3a77f60f2042a66aa50b5810774aab5f1a2dd6799ee891ebb9fe98b95fec57f919081900360600190a25050505050565b5f610420611cb8612160565b8360405161190160f01b8152600281019290925260228201526042902090565b5f846001600160a01b03163b5f03611d4457846001600160a01b0316611d338585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250611e3592505050565b6001600160a01b0316149050611dce565b604051630b135d3f60e11b81526001600160a01b03861690631626ba7e90611d7490879087908790600401612e4c565b602060405180830381865afa925050508015611dad575060408051601f3d908101601f19168201909252611daa91810190612e81565b60015b611db857505f611dce565b6001600160e01b031916630b135d3f60e11b1490505b949350505050565b6060611e037f00000000000000000000000000000000000000000000000000000000000000006001612289565b905090565b6060611e037f00000000000000000000000000000000000000000000000000000000000000006002612289565b5f5f5f5f611e438686612332565b925092509250611e53828261237b565b5090949350505050565b6040516001600160a01b038481166024830152838116604483015260648201839052611ec49186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050612438565b50505050565b6040516370a0823160e01b81523060048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611f2e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f529190612fa6565b6040516370a0823160e01b81526001600160a01b0385811660048301529192505f917f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015611fbb573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fdf9190612fa6565b90506120156001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001685856124a4565b61201f8383612d07565b6040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015612081573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120a59190612fa6565b14158061214257506120b78382612e07565b6040516370a0823160e01b81526001600160a01b0386811660048301527f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561211b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061213f9190612fa6565b14155b15611ec45760405163570883e560e01b815260040160405180910390fd5b5f306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156121b857507f000000000000000000000000000000000000000000000000000000000000000046145b156121e257507f000000000000000000000000000000000000000000000000000000000000000090565b611e03604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b606060ff83146122a35761229c836124d5565b9050610420565b8180546122af90612fbd565b80601f01602080910402602001604051908101604052809291908181526020018280546122db90612fbd565b80156123265780601f106122fd57610100808354040283529160200191612326565b820191905f5260205f20905b81548152906001019060200180831161230957829003601f168201915b50505050509050610420565b5f5f5f8351604103612369576020840151604085015160608601515f1a61235b88828585612512565b955095509550505050612374565b505081515f91506002905b9250925092565b5f82600381111561238e5761238e6129ed565b03612397575050565b60018260038111156123ab576123ab6129ed565b036123c95760405163f645eedf60e01b815260040160405180910390fd5b60028260038111156123dd576123dd6129ed565b036124035760405163fce698f760e01b8152600481018290526024015b60405180910390fd5b6003826003811115612417576124176129ed565b0361195e576040516335e2f38360e21b8152600481018290526024016123fa565b5f5f60205f8451602086015f885af180612457576040513d5f823e3d81fd5b50505f513d9150811561246e57806001141561247b565b6001600160a01b0384163b155b15611ec457604051635274afe760e01b81526001600160a01b03851660048201526024016123fa565b6040516001600160a01b038381166024830152604482018390526103c991859182169063a9059cbb90606401611e92565b60605f6124e1836125da565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561254b57505f915060039050826125d0565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561259c573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166125c757505f9250600191508290506125d0565b92505f91508190505b9450945094915050565b5f60ff8216601f81111561042057604051632cd44ac360e21b815260040160405180910390fd5b6040805161020081019091525f60a0820181815260c0830182905260e08301829052610100830182905261012083018290526101408301829052610160830182905261018083018290526101a083018290526101c083018290526101e0830191909152819081526020015f81526020015f81526020015f81526020016126c56040518060a001604052805f6001600160401b031681526020015f6001600160401b031681526020015f6001600160a01b031681526020015f81526020015f81525090565b905290565b80356001600160401b03811681146126e0575f5ffd5b919050565b5f5f5f606084860312156126f7575f5ffd5b83359250612707602085016126ca565b929592945050506040919091013590565b5f6101608284031215612729575f5ffd5b50919050565b5f6101608284031215612740575f5ffd5b61274a8383612718565b9392505050565b5f5f5f5f5f60a08688031215612765575f5ffd5b85359450612775602087016126ca565b93506040860135925060608601359150612791608087016126ca565b90509295509295909350565b5f60e08284031215612729575f5ffd5b5f5f83601f8401126127bd575f5ffd5b5081356001600160401b038111156127d3575f5ffd5b6020830191508360208285010111156127ea575f5ffd5b9250929050565b5f5f5f5f5f6101208688031215612806575f5ffd5b612810878761279d565b945060e08601356001600160401b0381111561282a575f5ffd5b612836888289016127ad565b9095509350506101008601356001600160401b03811115612855575f5ffd5b612861888289016127ad565b969995985093965092949392505050565b5f5f60408385031215612883575f5ffd5b50508035926020909101359150565b5f602082840312156128a2575f5ffd5b5035919050565b5f60e082840312156128b9575f5ffd5b61274a838361279d565b5f81518084525f5b818110156128e7576020818501810151868301820152016128cb565b505f602082860101526020601f19601f83011685010191505092915050565b60ff60f81b8816815260e060208201525f61292460e08301896128c3565b828103604084015261293681896128c3565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b8181101561298b57835183526020938401939092019160010161296d565b50909b9a5050505050505050505050565b5f5f5f61018084860312156129af575f5ffd5b6129b98585612718565b92506101608401356001600160401b038111156129d4575f5ffd5b6129e0868287016127ad565b9497909650939450505050565b634e487b7160e01b5f52602160045260245ffd5b60098110612a1d57634e487b7160e01b5f52602160045260245ffd5b9052565b5f610260820190508251805183526020810151612a4960208501826001600160a01b03169052565b506040810151612a6460408501826001600160a01b03169052565b506060810151612a7f60608501826001600160a01b03169052565b506080810151612a9a60808501826001600160a01b03169052565b5060a081015160a084015260c0810151612abf60c08501826001600160401b03169052565b5060e0810151612ada60e08501826001600160401b03169052565b50610100810151612af76101008501826001600160401b03169052565b50610120810151612b0f61012085018261ffff169052565b50610140810151610140840152506020830151612b30610160840182612a01565b506040838101516101808401526060808501516101a085015260809485015180516001600160401b039081166101c08701526020820151166101e0860152918201516001600160a01b0316610200850152810151610220840152909201516102409091015290565b80356001600160a01b03811681146126e0575f5ffd5b803561ffff811681146126e0575f5ffd5b8281528135602080830191909152610180820190612bde908401612b98565b6001600160a01b038116604084015250612bfa60408401612b98565b6001600160a01b038116606084015250612c1660608401612b98565b6001600160a01b038116608084015250612c3260808401612b98565b6001600160a01b03811660a08401525060a083013560c083810191909152612c5b9084016126ca565b6001600160401b03811660e084015250612c7760e084016126ca565b6001600160401b03811661010084015250612c9561010084016126ca565b6001600160401b03811661012084015250612cb36101208401612bae565b61ffff81166101408401525061014092909201356101609190910152919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03818116838216019081111561042057610420612cd4565b8181038181111561042057610420612cd4565b5f60208284031215612d2a575f5ffd5b61274a826126ca565b82815281356020808301919091528201356040808301919091526101008201906001600160401b0390612d679085016126ca565b1660608381019190915283013560808084019190915283013560a08084019190915283013560c0808401919091526001600160401b0390612da99085016126ca565b1660e08301529392505050565b634e487b7160e01b5f52601260045260245ffd5b5f82612dd857612dd8612db6565b500690565b808202811582820484141761042057610420612cd4565b5f82612e0257612e02612db6565b500490565b8082018082111561042057610420612cd4565b5f60208284031215612e2a575f5ffd5b61274a82612b98565b5f60208284031215612e43575f5ffd5b61274a82612bae565b83815260406020820152816040820152818360608301375f818301606090810191909152601f909201601f1916010192915050565b5f60208284031215612e91575f5ffd5b81516001600160e01b03198116811461274a575f5ffd5b60405161016081016001600160401b0381118282101715612ed757634e487b7160e01b5f52604160045260245ffd5b60405290565b5f610160828403128015612eef575f5ffd5b50612ef8612ea8565b82358152612f0860208401612b98565b6020820152612f1960408401612b98565b6040820152612f2a60608401612b98565b6060820152612f3b60808401612b98565b608082015260a08381013590820152612f5660c084016126ca565b60c0820152612f6760e084016126ca565b60e0820152612f7961010084016126ca565b610100820152612f8c6101208401612bae565b610120820152610140928301359281019290925250919050565b5f60208284031215612fb6575f5ffd5b5051919050565b600181811c90821680612fd157607f821691505b60208210810361272957634e487b7160e01b5f52602260045260245ffdfea26469706673582212203991425a1354567aa5fd3ad898314bfc11d4837d4af9efe72c5a51c61f6c5ff464736f6c634300081e0033"
|
|
661
952
|
}
|
package/src/escrow/index.cjs
CHANGED
|
@@ -6,9 +6,13 @@ const ABI = artifact.abi;
|
|
|
6
6
|
const TOKEN_ABI = ['function allowance(address,address) view returns(uint256)','function approve(address,uint256) returns(bool)'];
|
|
7
7
|
const TERMS_TYPES = { Terms: [ ['jobId','bytes32'],['payer','address'],['worker','address'],['verifier','address'],['arbitrator','address'],['amount','uint256'],['workDeadline','uint64'],['reviewDeadline','uint64'],['resolutionDeadline','uint64'],['timeoutWorkerBps','uint16'],['agreementHash','bytes32'] ].map(([name,type])=>({name,type})) };
|
|
8
8
|
const transitions = {
|
|
9
|
-
|
|
9
|
+
propose_settlement: {from:['funded','running','submitted','verified'],roles:['requester','worker'],to:'settlement_negotiation',effect:true},
|
|
10
|
+
counter_settlement: {from:['settlement_negotiation'],roles:['requester','worker'],to:'settlement_negotiation',effect:true},
|
|
11
|
+
accept_settlement: {from:['settlement_negotiation'],roles:['requester','worker'],to:'settled',effect:true},
|
|
12
|
+
refund: {from:['funded','running','settlement_negotiation','disputed'],roles:['requester'],to:'refunded',effect:true},
|
|
13
|
+
dispute: {from:['funded','running','submitted','verified','settlement_negotiation'],roles:['requester','worker','verifier'],to:'disputed',effect:true},
|
|
10
14
|
resolve: {from:['disputed'],roles:['arbitrator'],to:'settled',effect:true},
|
|
11
|
-
timeout: {from:['funded','running','submitted','verified','disputed'],roles:['requester','worker','verifier','arbitrator'],to:'settled',effect:true}
|
|
15
|
+
timeout: {from:['funded','running','submitted','verified','disputed','settlement_negotiation'],roles:['requester','worker','verifier','arbitrator'],to:'settled',effect:true}
|
|
12
16
|
};
|
|
13
17
|
function check(condition,message) { if(!condition) throw new Error('Escrow: '+message); }
|
|
14
18
|
function positive(value,name) { check(typeof value==='string' && /^[1-9][0-9]*$/.test(value),name+' must be a positive decimal string');const n=BigInt(value);check(n<(1n<<256n),name+' exceeds uint256');return n; }
|
|
@@ -108,12 +112,41 @@ function createEscrowAdapters({provider,chainId,contractAddress,tokenAddress,sig
|
|
|
108
112
|
const event=logs.find(log=>log?.name===eventName && log.args.jobId===t.jobId);
|
|
109
113
|
check(event,'matching '+eventName+' event missing');
|
|
110
114
|
const snapshot=await contract.getJob(t.jobId,{blockTag:r.blockNumber});match(snapshot,t);validate(snapshot,event);
|
|
111
|
-
return {status:'confirmed',evidence:require('../operations/index.cjs').validateEscrowEvidence({chain_id:String(chainId),contract:config.contractAddress,token:config.tokenAddress,job_id:t.jobId,agreement_hash:t.agreementHash,transaction_hash:r.hash,block_number:r.blockNumber,block_hash:r.blockHash,confirmations,event:eventName,settlement_reason:eventName==='Settled'?Number(event.args.reason):null,reason_hash:eventName==='Disputed'?event.args.reasonHash:null,amount:t.amount.toString(),payer:t.payer,worker:t.worker,verifier:t.verifier,arbitrator:t.arbitrator,result_hash:snapshot.resultHash,worker_paid:snapshot.workerPaid.toString(),state:Number(snapshot.state),observed_at:new Date().toISOString()})};
|
|
115
|
+
return {status:'confirmed',evidence:require('../operations/index.cjs').validateEscrowEvidence({chain_id:String(chainId),contract:config.contractAddress,token:config.tokenAddress,job_id:t.jobId,agreement_hash:t.agreementHash,transaction_hash:r.hash,block_number:r.blockNumber,block_hash:r.blockHash,confirmations,event:eventName,escrow_version:Number(snapshot.proposal.revision),proposal_hash:snapshot.proposal.proposalHash,proposal_worker_amount:snapshot.proposal.workerAmount.toString(),proposal_expires_at:Number(snapshot.proposal.expiresAt),proposal_proposer:snapshot.proposal.proposer,settlement_reason:eventName==='Settled'?Number(event.args.reason):null,reason_hash:eventName==='Disputed'?event.args.reasonHash:null,amount:t.amount.toString(),payer:t.payer,worker:t.worker,verifier:t.verifier,arbitrator:t.arbitrator,result_hash:snapshot.resultHash,worker_paid:snapshot.workerPaid.toString(),state:Number(snapshot.state),observed_at:new Date().toISOString()})};
|
|
112
116
|
}
|
|
113
117
|
function adapter(run){return {execute:ctx=>run(ctx,false),reconcile:ctx=>run(ctx,true)};}
|
|
114
118
|
const state=(s,n)=>check(Number(s.state)===n,'unexpected escrow state');
|
|
115
119
|
const settled=(s,e,t)=>{check([5,6,7].includes(Number(s.state)),'not settled');check(e.args.workerAmount+e.args.payerAmount===t.amount && e.args.workerAmount===s.workerPaid,'settlement amount mismatch');};
|
|
120
|
+
async function propose(ctx,reconcile){
|
|
121
|
+
const {settlementProposal}=require('./negotiation.cjs');
|
|
122
|
+
const t=await context(ctx.job);let proposal;
|
|
123
|
+
try {proposal=settlementProposal(ctx.job,ctx.input);}catch(error){return {status:'rejected',reason:error.message};}
|
|
124
|
+
return observe(ctx,t,'propose_settlement','proposeSettlement',[t.jobId,ctx.input.expected_revision,BigInt(proposal.worker_amount),proposal.proposal_hash,proposal.expires_at],'SettlementProposed',(s,e)=>{
|
|
125
|
+
check(Number(s.state)===8,'negotiation is not active');
|
|
126
|
+
check(Number(e.args.revision)===proposal.escrow_version && e.args.proposalHash===proposal.proposal_hash && e.args.workerAmount===BigInt(proposal.worker_amount) && e.args.payerAmount===BigInt(proposal.payer_amount) && Number(e.args.expiresAt)===proposal.expires_at && getAddress(e.args.proposer)===getAddress(ctx.settlementActorAddress), 'proposal event mismatch');
|
|
127
|
+
},reconcile);
|
|
128
|
+
}
|
|
129
|
+
const proposeAdapter=adapter(async(ctx,r)=>{ctx.settlementActorAddress=getAddress(await addressFor(ctx.operation.actor));return propose(ctx,r);});
|
|
116
130
|
return {
|
|
131
|
+
propose_settlement:proposeAdapter,
|
|
132
|
+
counter_settlement:proposeAdapter,
|
|
133
|
+
accept_settlement:adapter(async(ctx,r)=>{
|
|
134
|
+
const {settlementConsent}=require('./negotiation.cjs');const t=await context(ctx.job);const p=ctx.job.negotiation?.current;
|
|
135
|
+
if(!p || ctx.input.expected_revision!==p.escrow_version || ctx.input.proposal_hash!==p.proposal_hash)return {status:'rejected',reason:'Accept the exact current proposal hash and revision'};
|
|
136
|
+
let consent;try{consent=settlementConsent(ctx.job,config);}catch(error){return {status:'rejected',reason:error.message};}
|
|
137
|
+
let method='acceptSettlement',args=[t.jobId,p.escrow_version,p.proposal_hash];
|
|
138
|
+
if(ctx.input.payer_signature!==undefined || ctx.input.worker_signature!==undefined){
|
|
139
|
+
if(typeof ctx.input.payer_signature!=='string'||typeof ctx.input.worker_signature!=='string')return {status:'rejected',reason:'Both party signatures required for relayed settlement'};
|
|
140
|
+
method='settleByConsent';args=[consent.value,ctx.input.payer_signature,ctx.input.worker_signature];
|
|
141
|
+
}else if(ctx.job.negotiation.current.proposer_id===ctx.operation.actor)return {status:'rejected',reason:'Counterparty must accept; proposer cannot self-accept'};
|
|
142
|
+
const result=await observe(ctx,t,'accept_settlement',method,args,'Settled',(s,e)=>{settled(s,e,t);check(Number(e.args.reason)===4 && e.args.workerAmount===BigInt(p.worker_amount) && e.args.payerAmount===BigInt(p.payer_amount) && Number(s.proposal.revision)===p.escrow_version && s.proposal.proposalHash===p.proposal_hash,'closing allocation mismatch');},r);
|
|
143
|
+
if(result.status==='confirmed'){
|
|
144
|
+
const receipt=await provider.getTransactionReceipt(result.evidence.transaction_hash);
|
|
145
|
+
const accepted=receipt.logs.filter(l=>getAddress(l.address)===config.contractAddress).map(l=>{try{return iface.parseLog(l);}catch{return null;}}).find(e=>e?.name==='SettlementAccepted'&&e.args.jobId===t.jobId);
|
|
146
|
+
check(accepted&&Number(accepted.args.revision)===p.escrow_version&&accepted.args.proposalHash===p.proposal_hash,'matching settlement acceptance missing');
|
|
147
|
+
}
|
|
148
|
+
return result;
|
|
149
|
+
}),
|
|
117
150
|
fund:adapter(async(ctx,reconcile)=>{
|
|
118
151
|
const t=await context(ctx.job);
|
|
119
152
|
check([ctx.job.participants.requester,ctx.job.participants.worker].every(p=>ctx.job.agreement.accepted_by.includes(p)),'both acceptances required');
|
|
@@ -142,9 +175,9 @@ function createEscrowAdapters({provider,chainId,contractAddress,tokenAddress,sig
|
|
|
142
175
|
refund:adapter(async(ctx,r)=>{const t=await context(ctx.job);return observe(ctx,t,'refund','refundExpired',[t.jobId],'Settled',(s,e)=>{state(s,6);settled(s,e,t);check(e.args.payerAmount===t.amount && Number(e.args.reason)===1,'not an expiry refund');},r);}),
|
|
143
176
|
dispute:adapter(async(ctx,r)=>{const t=await context(ctx.job);const reason=bytes32(ctx.input.reason_hash);return observe(ctx,t,'dispute','dispute',[t.jobId,reason],'Disputed',(s,e)=>{check(Number(s.state)>=4,'missing dispute');check(e.args.reasonHash===reason,'reason mismatch');},r);}),
|
|
144
177
|
resolve:adapter(async(ctx,r)=>{const t=await context(ctx.job);check(typeof ctx.input.worker_amount==='string' && /^(0|[1-9][0-9]*)$/.test(ctx.input.worker_amount),'worker_amount must be decimal string');const amount=BigInt(ctx.input.worker_amount);check(amount<=t.amount,'resolution exceeds escrow');return observe(ctx,t,'resolve','resolve',[t.jobId,amount],'Settled',(s,e)=>{settled(s,e,t);check(e.args.workerAmount===amount && Number(e.args.reason)===2,'resolution mismatch');},r);}),
|
|
145
|
-
timeout:adapter(async(ctx,r)=>{const t=await context(ctx.job);const
|
|
178
|
+
timeout:adapter(async(ctx,r)=>{const t=await context(ctx.job);const snapshot=await contract.getJob(t.jobId);const method=snapshot.resultHash===ZeroHash?'refundExpired':'timeout';return observe(ctx,t,'timeout',method,[t.jobId],'Settled',(s,e)=>{settled(s,e,t);const expected=method==='refundExpired'?0n:(t.amount*BigInt(t.timeoutWorkerBps))/10000n;check(e.args.workerAmount===expected && Number(e.args.reason)===(method==='refundExpired'?1:3),'timeout allocation mismatch');},r);})
|
|
146
179
|
};
|
|
147
180
|
}
|
|
148
181
|
module.exports={createEscrowAdapters,createMemoryTransactionStore,workerConsent,escrowTerms,escrowTransitions:transitions,ESCROW_ABI:ABI,ESCROW_BYTECODE:artifact.bytecode};
|
|
149
182
|
|
|
150
|
-
Object.assign(module.exports,require('./services.cjs'));
|
|
183
|
+
Object.assign(module.exports,require('./services.cjs'),require('./negotiation.cjs'));
|
package/src/escrow/index.d.mts
CHANGED
|
@@ -27,7 +27,7 @@ export interface EscrowAdapterOptions extends EscrowConfiguration {
|
|
|
27
27
|
confirmations: number;
|
|
28
28
|
validateArtifact?(context: { job: WorkflowJob; resultHash: string }): Promise<boolean>;
|
|
29
29
|
}
|
|
30
|
-
export function createEscrowAdapters(options: EscrowAdapterOptions): Record<'fund'|'start'|'submit'|'verify'|'release'|'refund'|'dispute'|'resolve'|'timeout', EscrowAdapter>;
|
|
30
|
+
export function createEscrowAdapters(options: EscrowAdapterOptions): Record<'fund'|'start'|'submit'|'verify'|'release'|'refund'|'dispute'|'resolve'|'timeout'|'propose_settlement'|'counter_settlement'|'accept_settlement', EscrowAdapter>;
|
|
31
31
|
export function createMemoryTransactionStore(): TransactionStore;
|
|
32
32
|
export function escrowTerms(job: WorkflowJob, config: EscrowConfiguration): ContractTerms;
|
|
33
33
|
export function workerConsent(job: WorkflowJob, config: EscrowConfiguration): {
|
|
@@ -46,3 +46,6 @@ export function replacePendingTransaction(options: {id: string;transactions: Tra
|
|
|
46
46
|
export function createFeeReplacementWorker(options: {transactions: TransactionStore;provider: Provider;signerForRecord(record: TransactionRecord): Promise<Signer>;authorize(context: any): Promise<boolean>;minAgeMs?: number;maxAttempts?: number;maxFeePerGas: bigint;maxPriorityFeePerGas: bigint}): () => Promise<any[]>;
|
|
47
47
|
|
|
48
48
|
export function createEscrowIndexer(options: {provider: Provider;chainId: number;contractAddress: string;confirmations: number;fromBlock: number;kv: import('../storage/index.js').KeyValueStore;onEvent(event: any): Promise<void>;onReorg(event: any): Promise<void>;batchSize?: number}): () => Promise<{indexed: number;through?: number}>;
|
|
49
|
+
|
|
50
|
+
export function settlementProposal(job: WorkflowJob,input: {worker_amount: string;payer_amount?: string;expected_revision: number;expires_at: number;reason: string;claims?: import('../workflow.js').SettlementClaim[]}): import('../workflow.js').SettlementProposal;
|
|
51
|
+
export function settlementConsent(job: WorkflowJob,configuration: EscrowConfiguration): {domain: {name: string;version: string;chainId: number;verifyingContract: string};types: Record<string,TypedDataField[]>;value: {jobId: string;agreementHash: string;escrowVersion: number;workerAmount: bigint;payerAmount: bigint;proposalHash: string;expiresAt: number}};
|
package/src/escrow/index.d.ts
CHANGED
|
@@ -27,7 +27,7 @@ export interface EscrowAdapterOptions extends EscrowConfiguration {
|
|
|
27
27
|
confirmations: number;
|
|
28
28
|
validateArtifact?(context: { job: WorkflowJob; resultHash: string }): Promise<boolean>;
|
|
29
29
|
}
|
|
30
|
-
export function createEscrowAdapters(options: EscrowAdapterOptions): Record<'fund'|'start'|'submit'|'verify'|'release'|'refund'|'dispute'|'resolve'|'timeout', EscrowAdapter>;
|
|
30
|
+
export function createEscrowAdapters(options: EscrowAdapterOptions): Record<'fund'|'start'|'submit'|'verify'|'release'|'refund'|'dispute'|'resolve'|'timeout'|'propose_settlement'|'counter_settlement'|'accept_settlement', EscrowAdapter>;
|
|
31
31
|
export function createMemoryTransactionStore(): TransactionStore;
|
|
32
32
|
export function escrowTerms(job: WorkflowJob, config: EscrowConfiguration): ContractTerms;
|
|
33
33
|
export function workerConsent(job: WorkflowJob, config: EscrowConfiguration): {
|
|
@@ -46,3 +46,6 @@ export function replacePendingTransaction(options: {id: string;transactions: Tra
|
|
|
46
46
|
export function createFeeReplacementWorker(options: {transactions: TransactionStore;provider: Provider;signerForRecord(record: TransactionRecord): Promise<Signer>;authorize(context: any): Promise<boolean>;minAgeMs?: number;maxAttempts?: number;maxFeePerGas: bigint;maxPriorityFeePerGas: bigint}): () => Promise<any[]>;
|
|
47
47
|
|
|
48
48
|
export function createEscrowIndexer(options: {provider: Provider;chainId: number;contractAddress: string;confirmations: number;fromBlock: number;kv: import('../storage/index.js').KeyValueStore;onEvent(event: any): Promise<void>;onReorg(event: any): Promise<void>;batchSize?: number}): () => Promise<{indexed: number;through?: number}>;
|
|
49
|
+
|
|
50
|
+
export function settlementProposal(job: WorkflowJob,input: {worker_amount: string;payer_amount?: string;expected_revision: number;expires_at: number;reason: string;claims?: import('../workflow.js').SettlementClaim[]}): import('../workflow.js').SettlementProposal;
|
|
51
|
+
export function settlementConsent(job: WorkflowJob,configuration: EscrowConfiguration): {domain: {name: string;version: string;chainId: number;verifyingContract: string};types: Record<string,TypedDataField[]>;value: {jobId: string;agreementHash: string;escrowVersion: number;workerAmount: bigint;payerAmount: bigint;proposalHash: string;expiresAt: number}};
|
package/src/escrow/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import escrow from './index.cjs';
|
|
2
|
-
export const { createEscrowAdapters, createMemoryTransactionStore, workerConsent, escrowTerms, escrowTransitions, ESCROW_ABI, ESCROW_BYTECODE, createEscrowRegistry, createEvidenceRevalidator, createManagedSigner, createDelegationAuthorizer, replacePendingTransaction, createFeeReplacementWorker, createEscrowIndexer } = escrow;
|
|
2
|
+
export const { createEscrowAdapters, createMemoryTransactionStore, workerConsent, escrowTerms, escrowTransitions, ESCROW_ABI, ESCROW_BYTECODE, createEscrowRegistry, createEvidenceRevalidator, createManagedSigner, createDelegationAuthorizer, replacePendingTransaction, createFeeReplacementWorker, createEscrowIndexer, settlementProposal, settlementConsent } = escrow;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const {getAddress}=require('ethers');
|
|
3
|
+
const TYPES={ClosingSettlement:[['jobId','bytes32'],['agreementHash','bytes32'],['escrowVersion','uint64'],['workerAmount','uint256'],['payerAmount','uint256'],['proposalHash','bytes32'],['expiresAt','uint64']].map(([name,type])=>({name,type}))};
|
|
4
|
+
function check(ok,message){if(!ok)throw new TypeError(message);}
|
|
5
|
+
const {settlementProposal}=require('../closing.cjs');
|
|
6
|
+
function settlementConsent(job,configuration){
|
|
7
|
+
const {escrowTerms}=require('./index.cjs');const t=escrowTerms(job,configuration),p=job.negotiation?.current;
|
|
8
|
+
check(p&&job.negotiation.status==='open','Open settlement proposal required');
|
|
9
|
+
const canonical=settlementProposal(job,{worker_amount:p.worker_amount,payer_amount:p.payer_amount,expected_revision:p.escrow_version-1,expires_at:p.expires_at,reason:p.reason,claims:p.claims});
|
|
10
|
+
check(canonical.proposal_hash===p.proposal_hash,'Stored proposal claims or allocation changed');
|
|
11
|
+
return {domain:{name:'A423Escrow',version:'1',chainId:configuration.chainId,verifyingContract:getAddress(configuration.contractAddress)},types:TYPES,value:{jobId:t.jobId,agreementHash:t.agreementHash,escrowVersion:p.escrow_version,workerAmount:BigInt(p.worker_amount),payerAmount:BigInt(p.payer_amount),proposalHash:p.proposal_hash,expiresAt:p.expires_at}};
|
|
12
|
+
}
|
|
13
|
+
module.exports={settlementProposal,settlementConsent};
|
package/src/escrow/services.cjs
CHANGED
|
@@ -5,7 +5,7 @@ const {validateEscrowEvidence}=require('../operations/index.cjs');
|
|
|
5
5
|
function check(ok,message){if(!ok)throw Error(message);}
|
|
6
6
|
function createEscrowRegistry(configurations){
|
|
7
7
|
const map=new Map();for(const c of configurations){const key=c.chainId+':'+getAddress(c.contractAddress).toLowerCase();check(!map.has(key),'Duplicate escrow configuration');map.set(key,createEscrowAdapters(c));}
|
|
8
|
-
const actions=['fund','start','submit','verify','release','refund','dispute','resolve','timeout'];const result={};for(const action of actions){result[action]={};for(const method of ['execute','reconcile'])result[action][method]=ctx=>{const e=ctx.job.agreement?.terms.escrow;const adapter=map.get(e?.chain_id+':'+getAddress(e?.contract).toLowerCase());check(adapter,'Escrow not registered');return adapter[action][method](ctx);};}return result;
|
|
8
|
+
const actions=['fund','start','submit','verify','release','refund','dispute','resolve','timeout','propose_settlement','counter_settlement','accept_settlement'];const result={};for(const action of actions){result[action]={};for(const method of ['execute','reconcile'])result[action][method]=ctx=>{const e=ctx.job.agreement?.terms.escrow;const adapter=map.get(e?.chain_id+':'+getAddress(e?.contract).toLowerCase());check(adapter,'Escrow not registered');return adapter[action][method](ctx);};}return result;
|
|
9
9
|
}
|
|
10
10
|
/** Fresh historical evidence verification. Returns invalid, insufficient_confirmations, or valid; RPC failures throw. */
|
|
11
11
|
function createEvidenceRevalidator({provider,chainId,contractAddress,tokenAddress,confirmations}={}){
|
|
@@ -31,6 +31,9 @@ function createEvidenceRevalidator({provider,chainId,contractAddress,tokenAddres
|
|
|
31
31
|
if(event.name==='Funded'&&(event.args.amount!==t.amount||getAddress(event.args.payer)!==t.payer||getAddress(event.args.worker)!==t.worker||event.args.agreementHash!==t.agreementHash))return invalid('Funding fields mismatch');
|
|
32
32
|
if(['Submitted','Verified'].includes(event.name)&&event.args.resultHash!==snapshot.resultHash)return invalid('Artifact mismatch');
|
|
33
33
|
if(event.name==='Disputed'&&event.args.reasonHash!==evidence.reason_hash)return invalid('Dispute reason mismatch');
|
|
34
|
+
if(event.name==='SettlementProposed'&&(Number(event.args.revision)!==evidence.escrow_version||event.args.proposalHash!==evidence.proposal_hash||event.args.workerAmount.toString()!==evidence.proposal_worker_amount||Number(event.args.expiresAt)!==evidence.proposal_expires_at||getAddress(event.args.proposer)!==getAddress(evidence.proposal_proposer)))return invalid('Proposal fields mismatch');
|
|
35
|
+
if(evidence.escrow_version!==undefined && (Number(snapshot.proposal.revision)!==evidence.escrow_version||snapshot.proposal.proposalHash!==evidence.proposal_hash||snapshot.proposal.workerAmount.toString()!==evidence.proposal_worker_amount||Number(snapshot.proposal.expiresAt)!==evidence.proposal_expires_at||getAddress(snapshot.proposal.proposer)!==getAddress(evidence.proposal_proposer)))return invalid('Cached proposal mismatch');
|
|
36
|
+
if(event.name==='Settled'&&Number(event.args.reason)===4){const acceptance=logs.find(l=>l?.name==='SettlementAccepted'&&l.args.jobId===t.jobId);if(!acceptance||Number(acceptance.args.revision)!==evidence.escrow_version||acceptance.args.proposalHash!==evidence.proposal_hash)return invalid('Mutual acceptance missing');}
|
|
34
37
|
if(event.name==='Settled'&&(event.args.workerAmount!==snapshot.workerPaid||event.args.payerAmount+event.args.workerAmount!==t.amount||Number(event.args.reason)!==evidence.settlement_reason))return invalid('Settlement mismatch');
|
|
35
38
|
return {status:'valid',transaction_hash:receipt.hash,block_hash:block.hash,confirmations:head.number-block.number+1};
|
|
36
39
|
};
|
|
@@ -8,11 +8,11 @@ function createChatTools({workflow,store,queue,actor}={}){
|
|
|
8
8
|
let job=await workflow.create({id,participants:{requester:actor,worker:worker_id,verifier:verifier_id,arbitrator:arbitrator_id},metadata},actor);
|
|
9
9
|
if(terms)job=await workflow.act(job.id,'quote',{terms},{actor,idempotencyKey:'initial_quote'});return job;
|
|
10
10
|
},
|
|
11
|
-
propose_quote:act('quote'),accept_quote:act('accept'),fund_escrow:act('fund'),submit_job:act('submit'),verify_job:act('verify'),release_escrow:act('release'),refund_escrow:act('refund'),dispute_job:act('dispute'),resolve_job:act('resolve'),timeout_job:act('timeout'),cancel_job:act('cancel'),
|
|
11
|
+
propose_quote:act('quote'),accept_quote:act('accept'),fund_escrow:act('fund'),submit_job:act('submit'),verify_job:act('verify'),release_escrow:act('release'),refund_escrow:act('refund'),dispute_job:act('dispute'),resolve_job:act('resolve'),timeout_job:act('timeout'),propose_settlement:act('propose_settlement'),counter_settlement:act('counter_settlement'),accept_settlement:act('accept_settlement'),request_cancellation:act('propose_settlement'),cancel_job:act('cancel'),
|
|
12
12
|
work_on_job:async(input)=>{const job=await act('start')(input);if(!job.pending&&job.state==='running')await enqueueRunningJobs({store,queue});return job;}
|
|
13
13
|
};
|
|
14
14
|
}
|
|
15
|
-
function createApplicationHandler({workflow,store,queue,authenticate,revalidate,consentFor,legacyState=async()=>({}),authorityHandler,basePath='/api/a423'}={}){
|
|
15
|
+
function createApplicationHandler({workflow,store,queue,authenticate,revalidate,consentFor,settlementConsentFor,legacyState=async()=>({}),authorityHandler,basePath='/api/a423'}={}){
|
|
16
16
|
const {createEventStream,freshReceipts,renderReceiptPdf}=require('./index.cjs');
|
|
17
17
|
const protocol=createWorkflowHandler({workflow,authenticate,basePath});const events=createEventStream({store,authenticate});
|
|
18
18
|
return async request=>{
|
|
@@ -29,6 +29,8 @@ function createApplicationHandler({workflow,store,queue,authenticate,revalidate,
|
|
|
29
29
|
}
|
|
30
30
|
const receipt=/^\/api\/a423-receipts\/([A-Za-z0-9_-]{1,128})(\.pdf)?$/.exec(path);
|
|
31
31
|
if(receipt){const data=await freshReceipts({workflow,id:receipt[1],actor,revalidate});if(receipt[2])return new Response(Buffer.from(await renderReceiptPdf(data)),{headers:{'content-type':'application/pdf','cache-control':'no-store'}});return Response.json(data,{headers:{'cache-control':'no-store'}});}
|
|
32
|
+
const closing=/^\/api\/a423-settlement-consent\/([A-Za-z0-9_-]{1,128})$/.exec(path);
|
|
33
|
+
if(closing){const job=await workflow.get(closing[1],actor);if(![job.participants.requester,job.participants.worker].includes(actor))return Response.json({error:'settlement party required'},{status:403});if(!settlementConsentFor)throw Error('Settlement consent not configured');const typed=await settlementConsentFor(job);return Response.json(JSON.parse(JSON.stringify(typed,(_,v)=>typeof v==='bigint'?v.toString():v)),{headers:{'cache-control':'no-store'}});}
|
|
32
34
|
const consent=/^\/api\/a423-worker-consent\/([A-Za-z0-9_-]{1,128})$/.exec(path);
|
|
33
35
|
if(consent){const job=await workflow.get(consent[1],actor);if(job.participants.worker!==actor)return Response.json({error:'worker required'},{status:403});if(!consentFor)throw Error('Wallet consent not configured');const typed=await consentFor(job);return Response.json(JSON.parse(JSON.stringify(typed,(_,v)=>typeof v==='bigint'?v.toString():v)),{headers:{'cache-control':'no-store'}});}
|
|
34
36
|
return Response.json({error:'not found'},{status:404});
|