From 1dd95ab83a35c046fcd4181cf4c7c5c12a3d8530 Mon Sep 17 00:00:00 2001 From: Leonard Lyubich Date: Sun, 18 Jun 2023 14:40:18 +0400 Subject: [PATCH] Provide embedded compiled NeoFS contracts There is a need to embed NeoFS contracts' executables in NeoFS Inner Ring application. To do this, `contracts` directory is created. The dir contains compiled contracts (per-contract NEF and manifest). Create eponymous Go package that provides embedded `fs.FS` with the contracts. Add `Read` function which reads, decodes and validates all NeoFS contracts from files and returns ready-to-go data for deployment. Refs #2195. Signed-off-by: Leonard Lyubich --- contracts/alphabet-contract.manifest.json | 1 + contracts/alphabet-contract.nef | Bin 0 -> 4088 bytes contracts/audit-contract.manifest.json | 1 + contracts/audit-contract.nef | Bin 0 -> 1469 bytes contracts/balance-contract.manifest.json | 1 + contracts/balance-contract.nef | Bin 0 -> 2550 bytes contracts/container-contract.manifest.json | 1 + contracts/container-contract.nef | Bin 0 -> 5606 bytes contracts/contracts.go | 129 ++++++++++++++++++++ contracts/contracts_test.go | 125 +++++++++++++++++++ contracts/neofsid-contract.manifest.json | 1 + contracts/neofsid-contract.nef | Bin 0 -> 1791 bytes contracts/netmap-contract.manifest.json | 1 + contracts/netmap-contract.nef | Bin 0 -> 4124 bytes contracts/nns-contract.manifest.json | 1 + contracts/nns-contract.nef | Bin 0 -> 6114 bytes contracts/proxy-contract.manifest.json | 1 + contracts/proxy-contract.nef | Bin 0 -> 794 bytes contracts/reputation-contract.manifest.json | 1 + contracts/reputation-contract.nef | Bin 0 -> 1322 bytes contracts/subnet-contract.manifest.json | 1 + contracts/subnet-contract.nef | Bin 0 -> 3838 bytes 22 files changed, 264 insertions(+) create mode 100755 contracts/alphabet-contract.manifest.json create mode 100755 contracts/alphabet-contract.nef create mode 100755 contracts/audit-contract.manifest.json create mode 100755 contracts/audit-contract.nef create mode 100755 contracts/balance-contract.manifest.json create mode 100755 contracts/balance-contract.nef create mode 100755 contracts/container-contract.manifest.json create mode 100755 contracts/container-contract.nef create mode 100644 contracts/contracts.go create mode 100644 contracts/contracts_test.go create mode 100755 contracts/neofsid-contract.manifest.json create mode 100755 contracts/neofsid-contract.nef create mode 100755 contracts/netmap-contract.manifest.json create mode 100755 contracts/netmap-contract.nef create mode 100755 contracts/nns-contract.manifest.json create mode 100755 contracts/nns-contract.nef create mode 100755 contracts/proxy-contract.manifest.json create mode 100755 contracts/proxy-contract.nef create mode 100755 contracts/reputation-contract.manifest.json create mode 100755 contracts/reputation-contract.nef create mode 100755 contracts/subnet-contract.manifest.json create mode 100755 contracts/subnet-contract.nef diff --git a/contracts/alphabet-contract.manifest.json b/contracts/alphabet-contract.manifest.json new file mode 100755 index 00000000000..ec361e6622c --- /dev/null +++ b/contracts/alphabet-contract.manifest.json @@ -0,0 +1 @@ +{"name":"NeoFS Alphabet","abi":{"methods":[{"name":"_initialize","offset":0,"parameters":[],"returntype":"Void","safe":false},{"name":"_deploy","offset":35,"parameters":[{"name":"data","type":"Any"},{"name":"isUpdate","type":"Boolean"}],"returntype":"Void","safe":false},{"name":"emit","offset":2900,"parameters":[],"returntype":"Void","safe":false},{"name":"gas","offset":2721,"parameters":[],"returntype":"Integer","safe":true},{"name":"name","offset":3531,"parameters":[],"returntype":"String","safe":true},{"name":"neo","offset":2735,"parameters":[],"returntype":"Integer","safe":true},{"name":"onNEP17Payment","offset":914,"parameters":[{"name":"from","type":"Hash160"},{"name":"amount","type":"Integer"},{"name":"data","type":"Any"}],"returntype":"Void","safe":false},{"name":"update","offset":2589,"parameters":[{"name":"script","type":"ByteArray"},{"name":"manifest","type":"ByteArray"},{"name":"data","type":"Any"}],"returntype":"Void","safe":false},{"name":"version","offset":3547,"parameters":[],"returntype":"Integer","safe":true},{"name":"vote","offset":3359,"parameters":[{"name":"epoch","type":"Integer"},{"name":"candidates","type":"Array"}],"returntype":"Void","safe":false}],"events":[]},"features":{},"groups":[],"permissions":[{"contract":"*","methods":["update","transfer","vote"]}],"supportedstandards":[],"trusts":[],"extra":null} \ No newline at end of file diff --git a/contracts/alphabet-contract.nef b/contracts/alphabet-contract.nef new file mode 100755 index 0000000000000000000000000000000000000000..8af58d4ee3beb00bc88ac31c1740767781ecde51 GIT binary patch literal 4088 zcmbVPZ)_W989zHt<0O~l{4Y&f{#>2R$+9+0(s*t?%IvmT7q?AK(~(ICiHq-b?#}0X zFL&phU1{Htkmxi-1&pz%X|{csA`qa_eLx6he*kp?r`i|Nm5H@Og_fd8gOzEbnCHE- zFAi~8MZP%id(S=3^FHtI`8~gzns{uVg7BU>yk}&1bYygRg!(`JI)3?~XEgEfkoj8r zx!>G4?*AwCDtd>`6f_Mf#-zfdB1O4e*T4Jzw@)A6{>>{Vn{J=@U8OiZwKf@;L&g!L zi*pKRApTJ46qb=2Y(L7}O8jE*;EB%WH=lX2`IQeZ=!p+#usw|PdC@QsA`VwSI8c7? zPd6X<_3Ia;(zPQU>$v29UVilP`AmoW~NCV8-H9EdZpc&|XdSx!gM{f7mV$sIu%%v<5s7OtPYylr>t z=riv>!MOsxe_wm)?bcaN=9CONnI(Z5S$H88Mb9G5L%F&d)n&7bMi!sy!n1%4Quii` zy8FkDFT3c^a`{8rdA!T6TSsVlo+cb6tb!)}Tanexg?Bu0-FR35IHH887SWsialPAjo_s1Pga zuw}4%K~=E^Xka;|l*by1OD^HiaGM~eqX7>^B_LiBJSX)WQ;zJR2k+ZY&R2F4q=G~K zoWFiO2(CmWg8{S|gO!moX9z6LvKefHfz>mbs2Z%m=|Wtf83h@6PMx+kABR2gKApVr zXwTOLx=Yn?u~hfS?>zD-Tpr~D&bnD7?U4&Q8?A<*Azi>Sp9@tt!JH0lJ0&V}$3@);iKmmZPkrT7^}bYQ zRTENgF~^RLb*FSGwI1ax-dpD&Dt?6;bS$NaqO|Wnm zos#-51eSg00TI5sJ+dPd(@AOH&DO*Wsn;QVpFwnw$nk;Mu8(lPp%`QuLL(l}ch}r@IsYuCb1#7U^v^qok9h(xg~>1^RP! zy|aN1%Mb=Zt%>?>0=bAQD+AZyw*=H+UyufkQ6)8I?AXSF3J&h4_i;QA-Ky81mL`3_ zDH_06hxTK!#)`@UOddYoH|(M)U#ywZbL){_I#@HAnwoZAjnnNGhYZ7T&gvAC_OBKI zYjg`l!}0w&K=U3uSt-*U5nj4eq47t0!h_RkBGnj=fAdd3^HR z9~#*J0c6D@*!ZZ>v8AWAV)UthRVpiy9dt-V3QuZDh84>r!(xMY30S?FNE>c*GGN9Y zty{ru4buFN5K}VMZ5kr#K&=$f7xVkr-YgI)3H`+B@(4a z?8!^!W=#*kB$Bh_N=awH{$}uj7tAbyn|7xpxWoDPyy?RX_AQ%!?1x|h9B@WZp6Cf4saO{cHVbXnFhcjD+1)o@sZ)C=Vm+Xqx(d3M)DSG5%(vbsnnD8*XSJmWfhEv$8 zzH`7_ES-t|0PLp&t12CAq`2vA_B)>!>;{^kd$&#j+k|)Yj@47D03Ai7L~YduD>n?> zE#hob>w@r^7wBfdNJiMuM3!2$CNOP@wAw4yWU=>cu~vIfeWA&fyz{f%byXODcYZ_o zh(r?<#j++kM2kQTQNqDiqfN|&S@G*UZsKNPwF z(6R-E*LSnrEQn=jowx+GFt%#XTDF$jD9HZh1%(+3(4D|NbDU0i1Hl(nT*@oewjHGh zGq@nzyR?5?&1d z1f(r|iF|6xmU?Ej8Zqfr^m(h_K0@@bAVKDZ=x^aii@x)ZN=45_55oNl(KE1R6y-rb z(csqHXDz(NOJd16=nLh7b>Rz2J{_a285`Lv(cw6J1l6@5nRmR!WtJoO@YHPKAKoR= e-En&!IwiNEvhih5MQ3z?$R!Z9i6?#1j zWu{S|h(=2^YLuu=De2p)PnyO=V+%ozP1wHp&`J!5h(aJF7|@v1_21pu7L8BN!_1uT z|NiUw&N-CYw_U+%->BLb>mP^>^v9V0@%X>I7Cp+YH09m)`m5&5;8Sy|(g{_xizeH9LD~X@6uCn|rZAM-|D$`Q6U2TErgU-j=Tk zU-a%e_<;ZH>$Cn(Zp|3NO%Aww)KZC>CdT!E3paOGFJ8X7_3JY;1?R`T_b;o}k9^cr zC5XUmx@~`!eg(M8J>xp3Qa>3p}Vj;LhOuK*nV|G-8X(( zBjO)D*N+Q1hPBzLWPhBCYC0aLs%4;YtQ%BSP>C8P$&^VFVOzs;z5d5`0l6cS@G_H0 z8+wTCJelTjEXQ9!)ygiBJgmX8;O^rZGeOpgx0*%%TZtIOd7x? zAV60uy)f`z$NioVa$eRBRy8|ZP578H4KnRRCy(nSy%Gan4BY)GjZGG-{IX?RIS2t`fs9>`sX<1pPn)#$;kc?P25D-Ey zw|On1VaYN!j3ZXD=+qS;>FY6bte1c3uUf4FHFT*85agDQkt`|5RZ}Zg(sm~J?|`3; zENI+=tFwRZ*>^3wZR;CnPyF!l`F!Hr)fyLQ`fMg6;^7yc8BTE<|0SrVy(Ol5*rw3= z%4)4vw)vwVLVbfl(~H5Op}|dQlNPI1sSvJa_!l5?G|*;r`KP*mPNh-+Hgr?z4vbZz z8@Z5XnMi6hi}F~ZIG-%=&w|r9QS7XEZMCs*99Vgi0kaSTtT0Wi=!N(({>16AX*_8U_q!_m`uarv c7QqmoGtB0)xCYHysnS>>GB0$za{2kc0htsMy8r+H literal 0 HcmV?d00001 diff --git a/contracts/balance-contract.manifest.json b/contracts/balance-contract.manifest.json new file mode 100755 index 00000000000..8a9ba5f9fd7 --- /dev/null +++ b/contracts/balance-contract.manifest.json @@ -0,0 +1 @@ +{"name":"NeoFS Balance","abi":{"methods":[{"name":"_initialize","offset":0,"parameters":[],"returntype":"Void","safe":false},{"name":"_deploy","offset":93,"parameters":[{"name":"data","type":"Any"},{"name":"isUpdate","type":"Boolean"}],"returntype":"Void","safe":false},{"name":"balanceOf","offset":1104,"parameters":[{"name":"account","type":"Hash160"}],"returntype":"Integer","safe":true},{"name":"burn","offset":1656,"parameters":[{"name":"from","type":"Hash160"},{"name":"amount","type":"Integer"},{"name":"txDetails","type":"ByteArray"}],"returntype":"Void","safe":false},{"name":"decimals","offset":1082,"parameters":[],"returntype":"Integer","safe":true},{"name":"lock","offset":1250,"parameters":[{"name":"txDetails","type":"ByteArray"},{"name":"from","type":"Hash160"},{"name":"to","type":"Hash160"},{"name":"amount","type":"Integer"},{"name":"until","type":"Integer"}],"returntype":"Void","safe":false},{"name":"mint","offset":1516,"parameters":[{"name":"to","type":"Hash160"},{"name":"amount","type":"Integer"},{"name":"txDetails","type":"ByteArray"}],"returntype":"Void","safe":false},{"name":"newEpoch","offset":1387,"parameters":[{"name":"epochNum","type":"Integer"}],"returntype":"Void","safe":false},{"name":"symbol","offset":1078,"parameters":[],"returntype":"String","safe":true},{"name":"totalSupply","offset":1086,"parameters":[],"returntype":"Integer","safe":true},{"name":"transfer","offset":1123,"parameters":[{"name":"from","type":"Hash160"},{"name":"to","type":"Hash160"},{"name":"amount","type":"Integer"},{"name":"data","type":"Any"}],"returntype":"Boolean","safe":false},{"name":"transferX","offset":1147,"parameters":[{"name":"from","type":"Hash160"},{"name":"to","type":"Hash160"},{"name":"amount","type":"Integer"},{"name":"details","type":"ByteArray"}],"returntype":"Void","safe":false},{"name":"update","offset":947,"parameters":[{"name":"script","type":"ByteArray"},{"name":"manifest","type":"ByteArray"},{"name":"data","type":"Any"}],"returntype":"Void","safe":false},{"name":"version","offset":1826,"parameters":[],"returntype":"Integer","safe":true}],"events":[{"name":"Lock","parameters":[{"name":"txID","type":"ByteArray"},{"name":"from","type":"Hash160"},{"name":"to","type":"Hash160"},{"name":"amount","type":"Integer"},{"name":"until","type":"Integer"}]},{"name":"Transfer","parameters":[{"name":"from","type":"Hash160"},{"name":"to","type":"Hash160"},{"name":"amount","type":"Integer"}]},{"name":"TransferX","parameters":[{"name":"from","type":"Hash160"},{"name":"to","type":"Hash160"},{"name":"amount","type":"Integer"},{"name":"details","type":"ByteArray"}]},{"name":"Mint","parameters":[{"name":"to","type":"Hash160"},{"name":"amount","type":"Integer"}]},{"name":"Burn","parameters":[{"name":"from","type":"Hash160"},{"name":"amount","type":"Integer"}]}]},"features":{},"groups":[],"permissions":[{"contract":"*","methods":["update"]}],"supportedstandards":["NEP-17"],"trusts":[],"extra":null} \ No newline at end of file diff --git a/contracts/balance-contract.nef b/contracts/balance-contract.nef new file mode 100755 index 0000000000000000000000000000000000000000..649b31694f7281f5f641ed8d9d117c864c61f9b5 GIT binary patch literal 2550 zcmbVOYitx%6rR~f*|k@)eIXE_!&;V7r55Q}*@(^*3)%oKZm}qCbUJ(6JNuZK&dkEh zw)K|@KQNk@C{Y`V!9O&bn25v}1C^jg6BmCNQ^W@tgF+-2j3_9sXCB)Jf+qG)=bU@a zJ>U86dF!><_3>FyFd8W#eF(=0S#bd zos!Q>hJi6f(e%WHHKkMEpI!Fh(R~@~^!+zaDy7%MI@Tm1ClxVG(bV-U0+OK!J~%vl zF|dlet7Yf=iI+Y)v$6I!>Ja`Ci3Lr=vhkpt#^#M;RHyN*C=_+|a_EsNMAO|T+L{6< z+nz+U&-)Y*?e{+W5FPM7MYLGRsYK|*2D4K#WUT9qNU)e?`UNS6(`iIS5LI^svzm{h zFxTt%@vmGOD5+LVHM>u65QH0)r0&V4;3v^QSEOdF)O}(pXqRdkb_q>UQlvCK9_v7N z7Syz0V8&1wS&>)DiXmtglULH1k#tZQj9ySxMKf@k5o9Z`XgHpsNoQ+_uyY|ahZgk- zIYAaNBPz0?38KMBvShdvr}^VQYBg=RB>6M<&3~HfrRZ(lld)hIqRid4^yn<XLevsmlT=FOL|@~L=tDPsbbOQ zqjtwl;H7O1x^0>Woe^>x7Sa}@^fLy*Ob)o#jmm{_20T1xC-7t}1e%%& zuJVQeH_&yo8k#)d<7+(c6W?2Jql0T_8fO^TYN8V?9MaZ@!>ogEcmV(r>9J5n=h zoI<4+L=n2HzmUsWcD)PQG%hGN_ViU7(sC44WH1mb(89e=gaw?73rmzJB9my5r-kWmM(*G?E^^Z)E$!U1vTMH1{+cH_ZoRy1akJ>#kZ?i5H7fD*30Wh?uQqxXAycIThv@}R^n1CWkQ zXb5cH1sg5n@D5omHyCJRS?|XhBj`Fd^f+pq#Zu*1vuA>1;k9{H&<)Q<+%SiMJCiMf zpjpF_x+6L%W{-AnIsSQ)?EqzpSjC}G1`ym02#nl#tN}$_1UbbXbp<&M!Rtk6A-mTc zr67t*K{lL-kmS&C!`6n00t##dk9>lEfmQ^rw~F?F?E1sWmjxgML3KORw?6+seKM38;e-%&0I|obiM$E5LHN1%ab82BQmX zd5lE1d}bAiSB(cQm&-#loubxIf^CF2S_Z85W^C)BjAuOr)=+rRs6jpv+f Kx!|V@ihl!Hi;CU= literal 0 HcmV?d00001 diff --git a/contracts/container-contract.manifest.json b/contracts/container-contract.manifest.json new file mode 100755 index 00000000000..76dcfff6511 --- /dev/null +++ b/contracts/container-contract.manifest.json @@ -0,0 +1 @@ +{"name":"NeoFS Container","abi":{"methods":[{"name":"_initialize","offset":0,"parameters":[],"returntype":"Void","safe":false},{"name":"_deploy","offset":83,"parameters":[{"name":"data","type":"Any"},{"name":"isUpdate","type":"Boolean"}],"returntype":"Void","safe":false},{"name":"containersOf","offset":3109,"parameters":[{"name":"owner","type":"ByteArray"}],"returntype":"InteropInterface","safe":true},{"name":"count","offset":3064,"parameters":[],"returntype":"Integer","safe":true},{"name":"delete","offset":2655,"parameters":[{"name":"containerID","type":"ByteArray"},{"name":"signature","type":"Signature"},{"name":"token","type":"ByteArray"}],"returntype":"Void","safe":false},{"name":"eACL","offset":3418,"parameters":[{"name":"containerID","type":"ByteArray"}],"returntype":"Array","safe":true},{"name":"get","offset":2951,"parameters":[{"name":"containerID","type":"ByteArray"}],"returntype":"Array","safe":true},{"name":"getContainerSize","offset":3678,"parameters":[{"name":"id","type":"ByteArray"}],"returntype":"Array","safe":true},{"name":"iterateAllContainerSizes","offset":4051,"parameters":[{"name":"epoch","type":"Integer"}],"returntype":"InteropInterface","safe":true},{"name":"iterateContainerSizes","offset":3953,"parameters":[{"name":"epoch","type":"Integer"},{"name":"cid","type":"Hash256"}],"returntype":"InteropInterface","safe":true},{"name":"list","offset":3163,"parameters":[{"name":"owner","type":"ByteArray"}],"returntype":"Array","safe":true},{"name":"listContainerSizes","offset":3792,"parameters":[{"name":"epoch","type":"Integer"}],"returntype":"Array","safe":true},{"name":"newEpoch","offset":4103,"parameters":[{"name":"epochNum","type":"Integer"}],"returntype":"Void","safe":false},{"name":"onNEP11Payment","offset":1137,"parameters":[{"name":"a","type":"Hash160"},{"name":"b","type":"Integer"},{"name":"c","type":"ByteArray"},{"name":"d","type":"Any"}],"returntype":"Void","safe":false},{"name":"owner","offset":3013,"parameters":[{"name":"containerID","type":"ByteArray"}],"returntype":"ByteArray","safe":true},{"name":"put","offset":1571,"parameters":[{"name":"container","type":"ByteArray"},{"name":"signature","type":"Signature"},{"name":"publicKey","type":"PublicKey"},{"name":"token","type":"ByteArray"}],"returntype":"Void","safe":false},{"name":"putContainerSize","offset":3476,"parameters":[{"name":"epoch","type":"Integer"},{"name":"cid","type":"ByteArray"},{"name":"usedSize","type":"Integer"},{"name":"pubKey","type":"PublicKey"}],"returntype":"Void","safe":false},{"name":"putNamed","offset":1587,"parameters":[{"name":"container","type":"ByteArray"},{"name":"signature","type":"Signature"},{"name":"publicKey","type":"PublicKey"},{"name":"token","type":"ByteArray"},{"name":"name","type":"String"},{"name":"zone","type":"String"}],"returntype":"Void","safe":false},{"name":"setEACL","offset":3259,"parameters":[{"name":"eACL","type":"ByteArray"},{"name":"signature","type":"Signature"},{"name":"publicKey","type":"PublicKey"},{"name":"token","type":"ByteArray"}],"returntype":"Void","safe":false},{"name":"startContainerEstimation","offset":4133,"parameters":[{"name":"epoch","type":"Integer"}],"returntype":"Void","safe":false},{"name":"stopContainerEstimation","offset":4214,"parameters":[{"name":"epoch","type":"Integer"}],"returntype":"Void","safe":false},{"name":"update","offset":1438,"parameters":[{"name":"script","type":"ByteArray"},{"name":"manifest","type":"ByteArray"},{"name":"data","type":"Any"}],"returntype":"Void","safe":false},{"name":"version","offset":4294,"parameters":[],"returntype":"Integer","safe":true}],"events":[{"name":"containerPut","parameters":[{"name":"container","type":"ByteArray"},{"name":"signature","type":"Signature"},{"name":"publicKey","type":"PublicKey"},{"name":"token","type":"ByteArray"}]},{"name":"PutSuccess","parameters":[{"name":"containerID","type":"Hash256"},{"name":"publicKey","type":"PublicKey"}]},{"name":"containerDelete","parameters":[{"name":"containerID","type":"ByteArray"},{"name":"signature","type":"Signature"},{"name":"token","type":"ByteArray"}]},{"name":"DeleteSuccess","parameters":[{"name":"containerID","type":"ByteArray"}]},{"name":"setEACL","parameters":[{"name":"eACL","type":"ByteArray"},{"name":"signature","type":"Signature"},{"name":"publicKey","type":"PublicKey"},{"name":"token","type":"ByteArray"}]},{"name":"SetEACLSuccess","parameters":[{"name":"containerID","type":"ByteArray"},{"name":"publicKey","type":"PublicKey"}]},{"name":"StartEstimation","parameters":[{"name":"epoch","type":"Integer"}]},{"name":"StopEstimation","parameters":[{"name":"epoch","type":"Integer"}]}]},"features":{},"groups":[],"permissions":[{"contract":"*","methods":["update","addKey","transferX","register","addRecord","deleteRecords"]}],"supportedstandards":[],"trusts":[],"extra":null} \ No newline at end of file diff --git a/contracts/container-contract.nef b/contracts/container-contract.nef new file mode 100755 index 0000000000000000000000000000000000000000..aa7526b72851965923d554931287c04cb3e80ba3 GIT binary patch literal 5606 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 YYDUSqNiE0s_vi&jq3@=K^s(9h0iDFS)&Kwi literal 0 HcmV?d00001 diff --git a/contracts/contracts.go b/contracts/contracts.go new file mode 100644 index 00000000000..4d70c28bc53 --- /dev/null +++ b/contracts/contracts.go @@ -0,0 +1,129 @@ +/* +Package contracts embeds compiled NeoFS contracts and provides access to them. + +Contracts' source code is located in https://github.com/nspcc-dev/neofs-contract. +*/ +package contracts + +import ( + "embed" + "encoding/json" + "errors" + "fmt" + "io/fs" + + "github.com/nspcc-dev/neo-go/pkg/io" + "github.com/nspcc-dev/neo-go/pkg/smartcontract/manifest" + "github.com/nspcc-dev/neo-go/pkg/smartcontract/nef" +) + +// Contract represents compiled NeoFS contract. +type Contract struct { + NEF nef.File + Manifest manifest.Manifest +} + +// Contracts groups all compiled NeoFS contracts. +type Contracts struct { + Alphabet Contract + Audit Contract + Balance Contract + Container Contract + NeoFSID Contract + Netmap Contract + NNS Contract + Proxy Contract + Reputation Contract + Subnet Contract +} + +//go:embed *-contract.nef *-contract.manifest.json +var _fs embed.FS + +// Read reads compiled NeoFS contracts stored in the package directory into +// Contracts instance and returns it. +// +// File schema: +// - compiled executables (NEF) are named by pattern '*-contract.nef' +// - manifests are named by pattern '*-contract.manifest.json' +// +// where asterisk stands for contract names: +// - alphabet (NeoFS Alphabet) +// - audit (NeoFS Audit) +// - balance (NeoFS Balance) +// - container (NeoFS Container) +// - neofsid (NeoFS ID) +// - netmap (NeoFS Netmap) +// - nns (NameService) +// - proxy (NeoFS Notary Proxy) +// - reputation (NeoFS Reputation) +// - subnet (NeoFS Subnet) +// +// Read fails if any of the NeoFS contract files is missing, invalid or has +// different name in the manifest. +func Read() (Contracts, error) { + return read(_fs) +} + +var ( + errInvalidNEF = errors.New("invalid NEF") + errInvalidManifest = errors.New("invalid manifest") + errInvalidName = errors.New("invalid name") +) + +// read same as Read by allows to override source fs.FS. +func read(_fs fs.FS) (res Contracts, err error) { + for filePrefix, item := range map[string]struct { + cPtr *Contract + name string + }{ + "alphabet": {&res.Alphabet, "NeoFS Alphabet"}, + "audit": {&res.Audit, "NeoFS Audit"}, + "balance": {&res.Balance, "NeoFS Balance"}, + "container": {&res.Container, "NeoFS Container"}, + "neofsid": {&res.NeoFSID, "NeoFS ID"}, + "netmap": {&res.Netmap, "NeoFS Netmap"}, + "nns": {&res.NNS, "NameService"}, + "proxy": {&res.Proxy, "NeoFS Notary Proxy"}, + "reputation": {&res.Reputation, "NeoFS Reputation"}, + "subnet": {&res.Subnet, "NeoFS Subnet"}, + } { + err = readContractFromFiles(item.cPtr, _fs, filePrefix) + if err != nil { + return res, fmt.Errorf("read contract from '%s*' files: %w", filePrefix, err) + } + + if item.cPtr.Manifest.Name != item.name { + return res, fmt.Errorf("%w: expected '%s', got '%s'", errInvalidName, item.name, item.cPtr.Manifest.Name) + } + } + + return res, nil +} + +func readContractFromFiles(c *Contract, _fs fs.FS, filePrefix string) error { + fNEF, err := _fs.Open(filePrefix + "-contract.nef") + if err != nil { + return fmt.Errorf("open file containing contract NEF: %w", err) + } + defer fNEF.Close() + + fManifest, err := _fs.Open(filePrefix + "-contract.manifest.json") + if err != nil { + return fmt.Errorf("open file containing contract NEF: %w", err) + } + defer fManifest.Close() + + bReader := io.NewBinReaderFromIO(fNEF) + c.NEF.DecodeBinary(bReader) + if bReader.Err != nil { + return fmt.Errorf("%w: %v", errInvalidNEF, bReader.Err) + } + + err = json.NewDecoder(fManifest).Decode(&c.Manifest) + if err != nil { + return fmt.Errorf("%w: %v", errInvalidManifest, err) + } + + return nil +} diff --git a/contracts/contracts_test.go b/contracts/contracts_test.go new file mode 100644 index 00000000000..81dab906142 --- /dev/null +++ b/contracts/contracts_test.go @@ -0,0 +1,125 @@ +package contracts + +import ( + "crypto/rand" + "encoding/json" + "io/fs" + "testing" + "testing/fstest" + + "github.com/nspcc-dev/neo-go/pkg/smartcontract/manifest" + "github.com/nspcc-dev/neo-go/pkg/smartcontract/nef" + "github.com/stretchr/testify/require" +) + +func TestGetDir(t *testing.T) { + cs, err := Read() + require.NoError(t, err) + + for _, item := range []struct { + c Contract + name string + }{ + {cs.Alphabet, "NeoFS Alphabet"}, + {cs.Audit, "NeoFS Audit"}, + {cs.Balance, "NeoFS Balance"}, + {cs.Container, "NeoFS Container"}, + {cs.NeoFSID, "NeoFS ID"}, + {cs.Netmap, "NeoFS Netmap"}, + {cs.NNS, "NameService"}, + {cs.Proxy, "NeoFS Notary Proxy"}, + {cs.Reputation, "NeoFS Reputation"}, + {cs.Subnet, "NeoFS Subnet"}, + } { + require.Equal(t, item.name, item.c.Manifest.Name) + } +} + +func TestGet(t *testing.T) { + _fs := fstest.MapFS{} + + cs := []struct { + filePrefix string + name string + }{ + {"alphabet", "NeoFS Alphabet"}, + {"audit", "NeoFS Audit"}, + {"balance", "NeoFS Balance"}, + {"container", "NeoFS Container"}, + {"neofsid", "NeoFS ID"}, + {"netmap", "NeoFS Netmap"}, + {"nns", "NameService"}, + {"proxy", "NeoFS Notary Proxy"}, + {"reputation", "NeoFS Reputation"}, + {"subnet", "NeoFS Subnet"}, + } + + nefFileWithPrefix := func(prefix string) string { return prefix + "-contract.nef" } + manifestFileWithPrefix := func(prefix string) string { return prefix + "-contract.manifest.json" } + + for _, c := range cs { + script := make([]byte, 32) + rand.Read(script) + + _nef, err := nef.NewFile(script) + require.NoError(t, err) + + bNEF, err := _nef.Bytes() + require.NoError(t, err) + + jManifest, err := json.Marshal(manifest.NewManifest(c.name)) + require.NoError(t, err) + + _fs[nefFileWithPrefix(c.filePrefix)] = &fstest.MapFile{Data: bNEF} + _fs[manifestFileWithPrefix(c.filePrefix)] = &fstest.MapFile{Data: jManifest} + } + + _, err := read(_fs) + require.NoError(t, err) + + for _, c := range cs { + filename := nefFileWithPrefix(c.filePrefix) + fCp := _fs[filename] + + delete(_fs, filename) + + _, err = read(_fs) + require.ErrorIs(t, err, fs.ErrNotExist) + + _fs[filename] = &fstest.MapFile{Data: []byte("invalid NEF")} + + _, err = read(_fs) + require.ErrorIs(t, err, errInvalidNEF) + + _fs[filename] = fCp + + _, err = read(_fs) + require.NoError(t, err) + + filename = manifestFileWithPrefix(c.filePrefix) + fCp = _fs[filename] + + delete(_fs, filename) + + _, err = read(_fs) + require.ErrorIs(t, err, fs.ErrNotExist) + + _fs[filename] = &fstest.MapFile{Data: []byte("invalid manifest")} + + _, err = read(_fs) + require.ErrorIs(t, err, errInvalidManifest) + + jWrongNameManifest, err := json.Marshal(manifest.NewManifest(c.name + "1")) + require.NoError(t, err) + + _fs[filename] = &fstest.MapFile{Data: jWrongNameManifest} + + _, err = read(_fs) + require.ErrorIs(t, err, errInvalidName) + + _fs[filename] = fCp + + _, err = read(_fs) + require.NoError(t, err) + } +} diff --git a/contracts/neofsid-contract.manifest.json b/contracts/neofsid-contract.manifest.json new file mode 100755 index 00000000000..bfdb0b1b40c --- /dev/null +++ b/contracts/neofsid-contract.manifest.json @@ -0,0 +1 @@ +{"name":"NeoFS ID","abi":{"methods":[{"name":"_initialize","offset":0,"parameters":[],"returntype":"Void","safe":false},{"name":"_deploy","offset":35,"parameters":[{"name":"data","type":"Any"},{"name":"isUpdate","type":"Boolean"}],"returntype":"Void","safe":false},{"name":"addKey","offset":1030,"parameters":[{"name":"owner","type":"ByteArray"},{"name":"keys","type":"Array"}],"returntype":"Void","safe":false},{"name":"key","offset":1442,"parameters":[{"name":"owner","type":"ByteArray"}],"returntype":"Array","safe":true},{"name":"removeKey","offset":1235,"parameters":[{"name":"owner","type":"ByteArray"},{"name":"keys","type":"Array"}],"returntype":"Void","safe":false},{"name":"update","offset":899,"parameters":[{"name":"script","type":"ByteArray"},{"name":"manifest","type":"ByteArray"},{"name":"data","type":"Any"}],"returntype":"Void","safe":false},{"name":"version","offset":1513,"parameters":[],"returntype":"Integer","safe":true}],"events":[]},"features":{},"groups":[],"permissions":[{"contract":"*","methods":["update"]}],"supportedstandards":[],"trusts":[],"extra":null} \ No newline at end of file diff --git a/contracts/neofsid-contract.nef b/contracts/neofsid-contract.nef new file mode 100755 index 0000000000000000000000000000000000000000..25daa80ae79491ae8459e2ca77d17e21b2d3cb8b GIT binary patch literal 1791 zcmcIkU2NM_6t>f}wAuxdHk-C-Ww%-9g+WWYB}9uXm8bc;zv9n)=dM%9#V;?cGI+hrojf&q#*`ElyL31Nu?Epkno$2 z&i&5$zVn^)Z0_(u1CgN_GL#%1NsbIBx&QEme^IWBpCv}0xu^5&YbQECytQD9H^B^| zW29Whlp@4&Jim1FQ2p|iYkR*uvru%uef;hfQa>5Sl*l2D=RUs`9uXhjKX#r1$hM)P zA*BSTWvnChC2=AglHR>NQ#W0~bn>g>VEBSq!8pG%*m*7<&PAff>-p6I79FsP=}Cr* zBlX2aAp;InO;x4{QUVQP3>k#VmJ7>7MG)I8M4??ZO=3}`LfLT3#6sC3uRS*0t))jo z94E4B62q13Qlu^nfyBQ?DMjn8_PAJrJ;jDXm_!PNIx=Rc2FWy3h(Rrxg>1#bCWV@8 zYgr9M3`EPaIqnCaWHE*|E?s?e`zv4VzGnJQWqBFAJ5nVOG`vgDnG4A0GH9j0jV5O|=)mT52R7Lrxh z6MTF6jT?foU_9A%f7hVy%StPpT&BLF5enkl9&g5BenYn{^Qln-j#8o0zQEL(W zSlFf&>ozX+){k?s2g5yLv1Y|DJK(Mw`%#- zBpZG*)4>I0#mJK1&!n#=7jk@U7KN~zZK8BFEmn{M5aE8%zZq>mjcq|NvUoyce%<4w z(~U-BQP>H#n#fSGF#~4_v#*M%uWHr-tpZ-_4(Rj1Wo#g;ZI&i24=@3Cw~E_UMPZvY zUDb8hbG~e~%TMqf>DZrM<$WMd43?m*9|Ne!1`M`n9V_d&$I?ZXKi;=wg4o)L-^UJL zAK$nnX<*1~8{G-ue*I|sc4R{hv zmf5H?2RLWm4#0&xEd@bWug_O;8Ss3N+}yxg{5%5%+gJfOMXHAC9T(5Sev`ol{@-No z^T`C}OMpGtm?er#ynslNNur-k-Es1l|h9Zw{Kj!l>GD^GqP0Cq+0iln$WLFKOa5S9|&!+ U%kHmtak&z|grlcK<)UN#1wi(8hyVZp literal 0 HcmV?d00001 diff --git a/contracts/netmap-contract.manifest.json b/contracts/netmap-contract.manifest.json new file mode 100755 index 00000000000..51b9094a4d2 --- /dev/null +++ b/contracts/netmap-contract.manifest.json @@ -0,0 +1 @@ +{"name":"NeoFS Netmap","abi":{"methods":[{"name":"_initialize","offset":0,"parameters":[],"returntype":"Void","safe":false},{"name":"_deploy","offset":93,"parameters":[{"name":"data","type":"Any"},{"name":"isUpdate","type":"Boolean"}],"returntype":"Void","safe":false},{"name":"addPeer","offset":1692,"parameters":[{"name":"nodeInfo","type":"ByteArray"}],"returntype":"Void","safe":false},{"name":"addPeerIR","offset":1647,"parameters":[{"name":"nodeInfo","type":"ByteArray"}],"returntype":"Void","safe":false},{"name":"config","offset":3153,"parameters":[{"name":"key","type":"ByteArray"}],"returntype":"Any","safe":true},{"name":"epoch","offset":2333,"parameters":[],"returntype":"Integer","safe":true},{"name":"innerRingList","offset":1602,"parameters":[],"returntype":"Array","safe":true},{"name":"lastEpochBlock","offset":2372,"parameters":[],"returntype":"Integer","safe":false},{"name":"listConfig","offset":3239,"parameters":[],"returntype":"Array","safe":true},{"name":"netmap","offset":2411,"parameters":[],"returntype":"Array","safe":true},{"name":"netmapCandidates","offset":2493,"parameters":[],"returntype":"Array","safe":true},{"name":"newEpoch","offset":2042,"parameters":[{"name":"epochNum","type":"Integer"}],"returntype":"Void","safe":false},{"name":"setConfig","offset":3171,"parameters":[{"name":"id","type":"ByteArray"},{"name":"key","type":"ByteArray"},{"name":"val","type":"ByteArray"}],"returntype":"Void","safe":false},{"name":"snapshot","offset":2509,"parameters":[{"name":"diff","type":"Integer"}],"returntype":"Array","safe":true},{"name":"snapshotByEpoch","offset":3105,"parameters":[{"name":"epoch","type":"Integer"}],"returntype":"Array","safe":true},{"name":"update","offset":1472,"parameters":[{"name":"script","type":"ByteArray"},{"name":"manifest","type":"ByteArray"},{"name":"data","type":"Any"}],"returntype":"Void","safe":false},{"name":"updateSnapshotCount","offset":2663,"parameters":[{"name":"count","type":"Integer"}],"returntype":"Void","safe":false},{"name":"updateState","offset":1937,"parameters":[{"name":"state","type":"Integer"},{"name":"publicKey","type":"PublicKey"}],"returntype":"Void","safe":false},{"name":"updateStateIR","offset":2013,"parameters":[{"name":"state","type":"Integer"},{"name":"publicKey","type":"PublicKey"}],"returntype":"Void","safe":false},{"name":"version","offset":3321,"parameters":[],"returntype":"Integer","safe":true}],"events":[{"name":"AddPeer","parameters":[{"name":"nodeInfo","type":"ByteArray"}]},{"name":"AddPeerSuccess","parameters":[{"name":"publicKey","type":"PublicKey"}]},{"name":"UpdateState","parameters":[{"name":"state","type":"Integer"},{"name":"publicKey","type":"PublicKey"}]},{"name":"UpdateStateSuccess","parameters":[{"name":"publicKey","type":"PublicKey"},{"name":"state","type":"Integer"}]},{"name":"NewEpoch","parameters":[{"name":"epoch","type":"Integer"}]}]},"features":{},"groups":[],"permissions":[{"contract":"*","methods":["update","newEpoch"]}],"supportedstandards":[],"trusts":[],"extra":null} \ No newline at end of file diff --git a/contracts/netmap-contract.nef b/contracts/netmap-contract.nef new file mode 100755 index 0000000000000000000000000000000000000000..d01ab140bb362bb3e22abcf039065a30b5649de0 GIT binary patch literal 4124 zcmbVPeQXW*T(4`hw9PG=QHR|&gSu<+=CX`N11|O@@9U3y z&v)nCIe>AuPFv$ELe;o^NJy3u7mDlh7?YZOm z>faA^FVXssgE>i)R3aA1wB%tt%yVzI?MmFg-S~C-`!BruaOfKI3+W}4t*ELb>j&kW zWHOA$bLFXjeCO!HcYNdGr+jZ5{^PQlIkI>#JSpi1B#lhUqAun3RUf5A$qTao%3e+U zDz^7+K5g?xC3%={hgl2+R!Gk zs90pDTkBXv9a$<*kjd1=!Tz>OgX1WW73CbsK^*Q; zHZj`gP5$uR$+}{uE+#=LStfn;)KY)@`AFLctL8%|*w}i+jf*+nF;-DUolrT>YK460 znfYi0oX6qGPEMV{tGik0MkG^`Q0a8+hugouBHCNw96G3 zW`Rd0%^0k)Z5rt+k1hwjT zUy)`D?(rH$39&|)hBwSd@5MBfr&(x)RxB~_c6Ltmh_UStVB;_qB{_gOD_KN6W>dWdYEAkqcAMy zX4Au7#y;>d3J#=)*yay^ddLSqyk>JyLdV0;aI;D^%C($XC)i9U^Lt(ofVgjZxQ$WF zDt4T;tPTB4!O8cwz42sXl<}CJT6|y#MHN+=BDA9MQ0IdE+$6XJm%0|1=3OmJiyJ6=cDU!zOIo%s6NN^?Pv=m@-;Q`vWYsOKt-x+ z>EwNn|K?3U#OY~0w5CqMOa1HcO(U0J7i@nXPY)sc%V+FFGhWk9(y3@$HSU<}a3I5( zVXzjx2W?s_ep?I}z%6eihEJV}ZZ(A+FrKHP8_+sM0z{N2`6&u;l#_Hjy>SyYFR)@T zQGm$MQz}S0QCVhUXmj&Qt&+_GEKgL5#j1s0qPlV^R9;y3U+cbYC_-fr$Tlc~2SDas zENs|{o7HKd0P>mef`a<4pL~D+Lsv7~@BY^FPyh8NmvY0uzrKt*9G%VhXmb2ZV~>uY zJ63nLBhct-A0uqLzPzlk3uWv8+WM4A+$uvAxwDJqTI4DK8A*(KJq{xX?Vuu*!4osY zY&|shWEm#S44rk+XtD#)XVm8kH$;eV5EO*-A1p7cdAn-S@C|B%wi*mWDs(#fF|(Q$ zo`4e+Q>7A}l6Xz0syHb@4uK0MR9dq87osz$THs-L?KzE%rMT1movHBY=w3)yMzE}+ zd)!QFy2UMS>$j*{*>>p9F#^0+kynVuR*R2Rr_&)weCX3QMP)2o8K=59oqWneMaYo1 z+8hIBOYEblZv|tO%6O4v`GQo9J87&6!&V;8{AYQ&Oq`4aan;NSA3&m@n_d1Do(2KI z2cq`F%l5<0Mk%IkZQ&J2>uNZ5W*~KO3y{_p)y(e*p>85i!QzwSB@3_PSdiKoMnjyU zQmadOSu&hQb{&Or-o9ti*F?WPf&r1K~$ixIN z@oleH^X43xB`367cu{D2q2pp&coFt48%|g8`>NQxJwo{3(1Txwq?_!(ooId5+5-4e z1*l_O;uWd^TTV%CU*n;lmWjC?Fw_x)6~f-!vRITSrQA*1gxgjh78(o5y+bZ zJ;a`AYGrA&IO^Cf<1Zl81 zAHDw;X{W(v-VKB)a;Sm^Yeq2gJAg{xE%d5QHRTo((@lx82`FSysA`hD;%jBn7jA_1=wq^kZ;|3wE|Z!u=Qh23_Wxn*d=sUZ!l7Eu^f4UBw+opvNqbnx|KVN&ta!&wc1FjyN{H~QnU~C zDqzie8-eXh1Ky95l{HZNldiXE`Ecq3c6ap PMYrJUCelBD?8W~9(Hqba literal 0 HcmV?d00001 diff --git a/contracts/nns-contract.manifest.json b/contracts/nns-contract.manifest.json new file mode 100755 index 00000000000..b858bab5199 --- /dev/null +++ b/contracts/nns-contract.manifest.json @@ -0,0 +1 @@ +{"name":"NameService","abi":{"methods":[{"name":"_initialize","offset":0,"parameters":[],"returntype":"Void","safe":false},{"name":"_deploy","offset":32,"parameters":[{"name":"data","type":"Any"},{"name":"isUpdate","type":"Boolean"}],"returntype":"Void","safe":false},{"name":"addRecord","offset":2567,"parameters":[{"name":"name","type":"String"},{"name":"typ","type":"Integer"},{"name":"data","type":"String"}],"returntype":"Void","safe":false},{"name":"balanceOf","offset":568,"parameters":[{"name":"owner","type":"Hash160"}],"returntype":"Integer","safe":true},{"name":"decimals","offset":479,"parameters":[],"returntype":"Integer","safe":true},{"name":"deleteRecords","offset":2702,"parameters":[{"name":"name","type":"String"},{"name":"typ","type":"Integer"}],"returntype":"Void","safe":false},{"name":"getAllRecords","offset":2858,"parameters":[{"name":"name","type":"String"}],"returntype":"InteropInterface","safe":false},{"name":"getPrice","offset":972,"parameters":[],"returntype":"Integer","safe":true},{"name":"getRecords","offset":2659,"parameters":[{"name":"name","type":"String"},{"name":"typ","type":"Integer"}],"returntype":"Array","safe":true},{"name":"isAvailable","offset":1006,"parameters":[{"name":"name","type":"String"}],"returntype":"Boolean","safe":true},{"name":"ownerOf","offset":501,"parameters":[{"name":"tokenID","type":"ByteArray"}],"returntype":"Hash160","safe":true},{"name":"properties","offset":523,"parameters":[{"name":"tokenID","type":"ByteArray"}],"returntype":"Map","safe":true},{"name":"register","offset":1267,"parameters":[{"name":"name","type":"String"},{"name":"owner","type":"Hash160"},{"name":"email","type":"String"},{"name":"refresh","type":"Integer"},{"name":"retry","type":"Integer"},{"name":"expire","type":"Integer"},{"name":"ttl","type":"Integer"}],"returntype":"Boolean","safe":false},{"name":"renew","offset":2026,"parameters":[{"name":"name","type":"String"}],"returntype":"Integer","safe":false},{"name":"resolve","offset":2836,"parameters":[{"name":"name","type":"String"},{"name":"typ","type":"Integer"}],"returntype":"Array","safe":true},{"name":"roots","offset":866,"parameters":[],"returntype":"InteropInterface","safe":true},{"name":"setAdmin","offset":2237,"parameters":[{"name":"name","type":"String"},{"name":"admin","type":"Hash160"}],"returntype":"Void","safe":false},{"name":"setPrice","offset":894,"parameters":[{"name":"price","type":"Integer"}],"returntype":"Void","safe":false},{"name":"setRecord","offset":2371,"parameters":[{"name":"name","type":"String"},{"name":"typ","type":"Integer"},{"name":"id","type":"Integer"},{"name":"data","type":"String"}],"returntype":"Void","safe":false},{"name":"symbol","offset":473,"parameters":[],"returntype":"String","safe":true},{"name":"tokens","offset":644,"parameters":[],"returntype":"InteropInterface","safe":true},{"name":"tokensOf","offset":673,"parameters":[{"name":"owner","type":"Hash160"}],"returntype":"InteropInterface","safe":true},{"name":"totalSupply","offset":485,"parameters":[],"returntype":"Integer","safe":true},{"name":"transfer","offset":735,"parameters":[{"name":"to","type":"Hash160"},{"name":"tokenID","type":"ByteArray"},{"name":"data","type":"Any"}],"returntype":"Boolean","safe":false},{"name":"update","offset":386,"parameters":[{"name":"nef","type":"ByteArray"},{"name":"manifest","type":"String"},{"name":"data","type":"Any"}],"returntype":"Void","safe":false},{"name":"updateSOA","offset":2147,"parameters":[{"name":"name","type":"String"},{"name":"email","type":"String"},{"name":"refresh","type":"Integer"},{"name":"retry","type":"Integer"},{"name":"expire","type":"Integer"},{"name":"ttl","type":"Integer"}],"returntype":"Void","safe":false},{"name":"version","offset":481,"parameters":[],"returntype":"Integer","safe":true}],"events":[{"name":"Transfer","parameters":[{"name":"from","type":"Hash160"},{"name":"to","type":"Hash160"},{"name":"amount","type":"Integer"},{"name":"tokenId","type":"ByteArray"}]}]},"features":{},"groups":[],"permissions":[{"contract":"0xfffdc93764dbaddd97c48f252a53ea4643faa3fd","methods":["update"]},{"contract":"*","methods":["onNEP11Payment"]}],"supportedstandards":["NEP-11"],"trusts":[],"extra":null} \ No newline at end of file diff --git a/contracts/nns-contract.nef b/contracts/nns-contract.nef new file mode 100755 index 0000000000000000000000000000000000000000..85c9a45afe66df2182c698a4d0608e424811bee6 GIT binary patch literal 6114 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 L2B$-(o6Sc6WZV^* literal 0 HcmV?d00001 diff --git a/contracts/reputation-contract.manifest.json b/contracts/reputation-contract.manifest.json new file mode 100755 index 00000000000..b920489ebb5 --- /dev/null +++ b/contracts/reputation-contract.manifest.json @@ -0,0 +1 @@ +{"name":"NeoFS Reputation","abi":{"methods":[{"name":"_deploy","offset":0,"parameters":[{"name":"data","type":"Any"},{"name":"isUpdate","type":"Boolean"}],"returntype":"Void","safe":false},{"name":"get","offset":929,"parameters":[{"name":"epoch","type":"Integer"},{"name":"peerID","type":"ByteArray"}],"returntype":"Array","safe":true},{"name":"getByID","offset":945,"parameters":[{"name":"id","type":"ByteArray"}],"returntype":"Array","safe":true},{"name":"listByEpoch","offset":1035,"parameters":[{"name":"epoch","type":"Integer"}],"returntype":"Array","safe":true},{"name":"put","offset":778,"parameters":[{"name":"epoch","type":"Integer"},{"name":"peerID","type":"ByteArray"},{"name":"value","type":"ByteArray"}],"returntype":"Void","safe":false},{"name":"update","offset":644,"parameters":[{"name":"script","type":"ByteArray"},{"name":"manifest","type":"ByteArray"},{"name":"data","type":"Any"}],"returntype":"Void","safe":false},{"name":"version","offset":1113,"parameters":[],"returntype":"Integer","safe":false}],"events":[{"name":"reputationPut","parameters":[{"name":"epoch","type":"Integer"},{"name":"peerID","type":"ByteArray"},{"name":"value","type":"ByteArray"}]}]},"features":{},"groups":[],"permissions":[{"contract":"*","methods":["update"]}],"supportedstandards":[],"trusts":[],"extra":null} \ No newline at end of file diff --git a/contracts/reputation-contract.nef b/contracts/reputation-contract.nef new file mode 100755 index 0000000000000000000000000000000000000000..acfd39dd14802fee685f3d3eb906c391efe69b8d GIT binary patch literal 1322 zcmbVLU5Fc17`>C9Cd=MR(jO=-WpC5%bgS$(+a`ntsx#J9NKwXaA%gfYow?naWM=MU z=4N+h!8h?`O9ep%UF?>=E&8O0O2M_(f)%p$ElUxth}vQ)R9ZyXrgtWjYzzC;dAr}7 z@0{=Fe6LoHAGR@fF7r(FE7A}n)edU?tm2(%9pWj<_g}ZPX(__Rm zbxJV?fa8|$9%=vf$E|%=FE7^pn=ftdkoKnuof0_)IIz*rVHLaB(PcxQ!yLl^utpQL zcuf5G!F1d9dE2Y53Zsb|LQ~hPozdjAT%wZ6o^MxI_ps<5r(XPt<>;CA(h^^Shg!BO zQ;aA<7O}=HLS@HCCQ&icT^6FqZP_+)C{~ed`6h92xz1@XPNcPBlZgv(#KCrp%2X#7 zQiw$zS)oX`blNLX6<7Xx`2(TGff4|=HY61?gGX8_#MvX}4eH#oxb;Hz6V^rcu~-n% zJV~q{zBLr&7QVAJ@xT55oE2(-^SFibL;>=)gJ*Qoa?uQS+@KaycTJfpS{Y%_#!Aq@ z^G6wYr&Qv=eA#17wjQW&v~;|83B_}3-ELD4jpEdoc*OLWlnXbnb4V@Pki_>nA`6}`6?ZU0Q=k}9 z@d7)MmS*;*Jd>GCS)Ea6MJF_yBB_PhlxC9Dl=$ZhJKhG4nR)HH$@ZVDKtNK__U0MG zTn`btoGE{AL)FE9 zPkp;PB3)_bZtBclF~~7*gf6LOyz7y+KQGjh5i?MjF++e<__?X+*@%AFjRf{SK};Kw goRK|o?Zo-BD{gMJAuuzCwcCA5t_$7!{+o9m0SGzKhX4Qo literal 0 HcmV?d00001 diff --git a/contracts/subnet-contract.manifest.json b/contracts/subnet-contract.manifest.json new file mode 100755 index 00000000000..d5da77c7b78 --- /dev/null +++ b/contracts/subnet-contract.manifest.json @@ -0,0 +1 @@ +{"name":"NeoFS Subnet","abi":{"methods":[{"name":"_initialize","offset":0,"parameters":[],"returntype":"Void","safe":false},{"name":"_deploy","offset":64,"parameters":[{"name":"data","type":"Any"},{"name":"isUpdate","type":"Boolean"}],"returntype":"Void","safe":false},{"name":"addClientAdmin","offset":2323,"parameters":[{"name":"subnetID","type":"ByteArray"},{"name":"groupID","type":"ByteArray"},{"name":"adminPublicKey","type":"PublicKey"}],"returntype":"Void","safe":false},{"name":"addNode","offset":1719,"parameters":[{"name":"subnetID","type":"ByteArray"},{"name":"node","type":"PublicKey"}],"returntype":"Void","safe":false},{"name":"addNodeAdmin","offset":1354,"parameters":[{"name":"subnetID","type":"ByteArray"},{"name":"adminKey","type":"PublicKey"}],"returntype":"Void","safe":false},{"name":"addUser","offset":2774,"parameters":[{"name":"subnetID","type":"ByteArray"},{"name":"groupID","type":"ByteArray"},{"name":"userID","type":"ByteArray"}],"returntype":"Void","safe":false},{"name":"delete","offset":1165,"parameters":[{"name":"id","type":"ByteArray"}],"returntype":"Void","safe":false},{"name":"get","offset":1055,"parameters":[{"name":"id","type":"ByteArray"}],"returntype":"ByteArray","safe":false},{"name":"nodeAllowed","offset":2163,"parameters":[{"name":"subnetID","type":"ByteArray"},{"name":"node","type":"PublicKey"}],"returntype":"Boolean","safe":false},{"name":"put","offset":882,"parameters":[{"name":"id","type":"ByteArray"},{"name":"ownerKey","type":"PublicKey"},{"name":"info","type":"ByteArray"}],"returntype":"Void","safe":false},{"name":"removeClientAdmin","offset":2548,"parameters":[{"name":"subnetID","type":"ByteArray"},{"name":"groupID","type":"ByteArray"},{"name":"adminPublicKey","type":"PublicKey"}],"returntype":"Void","safe":false},{"name":"removeNode","offset":1924,"parameters":[{"name":"subnetID","type":"ByteArray"},{"name":"node","type":"PublicKey"}],"returntype":"Void","safe":false},{"name":"removeNodeAdmin","offset":1536,"parameters":[{"name":"subnetID","type":"ByteArray"},{"name":"adminKey","type":"PublicKey"}],"returntype":"Void","safe":false},{"name":"removeUser","offset":3018,"parameters":[{"name":"subnetID","type":"ByteArray"},{"name":"groupID","type":"ByteArray"},{"name":"userID","type":"ByteArray"}],"returntype":"Void","safe":false},{"name":"update","offset":752,"parameters":[{"name":"script","type":"ByteArray"},{"name":"manifest","type":"ByteArray"},{"name":"data","type":"Any"}],"returntype":"Void","safe":false},{"name":"userAllowed","offset":3263,"parameters":[{"name":"subnetID","type":"ByteArray"},{"name":"user","type":"ByteArray"}],"returntype":"Boolean","safe":false},{"name":"version","offset":3435,"parameters":[],"returntype":"Integer","safe":true}],"events":[{"name":"Put","parameters":[{"name":"id","type":"ByteArray"},{"name":"ownerKey","type":"PublicKey"},{"name":"info","type":"ByteArray"}]},{"name":"Delete","parameters":[{"name":"id","type":"ByteArray"}]},{"name":"RemoveNode","parameters":[{"name":"subnetID","type":"ByteArray"},{"name":"node","type":"PublicKey"}]}]},"features":{},"groups":[],"permissions":[{"contract":"*","methods":["update"]}],"supportedstandards":[],"trusts":[],"extra":null} \ No newline at end of file diff --git a/contracts/subnet-contract.nef b/contracts/subnet-contract.nef new file mode 100755 index 0000000000000000000000000000000000000000..d880e17ee41a93db2e3e024f9bba23abb0aa4b21 GIT binary patch literal 3838 zcmdT{TWl0%6rR~j+2TNU3k6bX7?!eKQOZ`jHf(~P6~$F_*)tiV#7Nd%4|wC$go)%v7AneJ7|?hbQWkUs&inBh8^~1 z^Wsv-2Qz_T#&Ks?Ddg!K>4M4QOwvPYZEK}=7t!aJ)8lS_H?)9H7ZseTEAAua-{q-g z(nE6aq(;r^VY69LRTA-4+dn(+1D<5{Gy+kIw7UsAij034@PHFX z!|+2`xBu@kL2gg9QRd)b)7P-f^jsn2(PP#fHC99uar=tU9aQ6FPBE8(9J%=MAMbyO z35I!)$1*Ltuv{(|LJd^Cgai%?y>!0_YT=M-`aGsll?x1F#-=c}q;i3hPo+S{JM!7A zZitDM$FE3|?r7Z~#_7#eP!wQ6%E>%B#R{}7Oy{harVmDWSl>NwSfb{S9r$(qhO^x( zmhV2Y=i9eWaP41?m8lwQ&k}xXyywYBw{%hqm3)r?>Es+@A8M0Ky4~YCtPd}s0$AvW zq~t*J=C+L;F})&QVrjUJn&Yf6Gcji7fJBj^9X8O2x052YoqasETwZEwq!!u7!NHCO zk%kpjiRsY}U=$tsyl(N!?!vECg&ecz&|35@*@eZ}KJ%Vd&na$2zQ%kN}P0USIf z964PIEv~o)0C6Hxgk}}82mr;>_C_Y@oxyEJ0k|%C<2ElMR^ACouNa4`y&u!!eXi8?&wpq2m+kL8{=It{*R)5MyD(9Aw zIR;P*q3e-}m@7b0*senQPAj!EJy8cqGJ6ZkiT!9Z_`H%R?wdi^E;>`!z-e;CN%kt( z#$#0~fVOU=K-Y(>qR}ghd5MMsK3HAAZ%Lx}U4@h}OV)TK`uIW6+p}&bQ(GK5a*p-;m56?Hsay_u zd`z%Z%RmngU9(#Q;hFuKQ7N60Ghvz{N&6(H3!Ct>RbP!SFHN^`z_*Kuqk*r+(Wlu> kPw*71cI#%BZlKWy=UMojeTygV!