1 /******************************************************************************
2 * Copyright © 2014-2018 The SuperNET Developers. *
4 * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at *
5 * the top-level directory of this distribution for the individual copyright *
6 * holder information and the developer policies on copyright and licensing. *
8 * Unless otherwise agreed in a custom licensing agreement, no part of the *
9 * SuperNET software, including this file may be copied, modified, propagated *
10 * or distributed except according to the terms contained in the LICENSE file *
12 * Removal or modification of this copyright notice is prohibited. *
14 ******************************************************************************/
16 #include "CCinclude.h"
19 #include "CCrewards.h"
21 #include "CCauction.h"
25 #include "CCchannels.h"
26 #include "CCOracles.h"
29 #include "CCTriggers.h"
30 #include "CCPayments.h"
31 #include "CCGateways.h"
34 CCcustom has most of the functions that need to be extended to create a new CC contract.
36 A CC scriptPubKey can only be spent if it is properly signed and validated. By constraining the vins and vouts, it is possible to implement a variety of functionality. CC vouts have an otherwise non-standard form, but it is properly supported by the enhanced bitcoin protocol code as a "cryptoconditions" output and the same pubkey will create a different address.
38 This allows creation of a special address(es) for each contract type, which has the privkey public. That allows anybody to properly sign and spend it, but with the constraints on what is allowed in the validation code, the contract functionality can be implemented.
40 what needs to be done to add a new contract:
41 1. add EVAL_CODE to eval.h
42 2. initialize the variables in the CCinit function below
43 3. write a Validate function to reject any unsanctioned usage of vin/vout
44 4. make helper functions to create rawtx for RPC functions
45 5. add rpc calls to rpcserver.cpp and rpcserver.h and in one of the rpc.cpp files
46 6. add the new .cpp files to src/Makefile.am
48 IMPORTANT: make sure that all CC inputs and CC outputs are properly accounted for and reconcile to the satoshi. The built in utxo management will enforce overall vin/vout constraints but it wont know anything about the CC constraints. That is what your Validate function needs to do.
50 Generally speaking, there will be normal coins that change into CC outputs, CC outputs that go back to being normal coins, CC outputs that are spent to new CC outputs.
52 Make sure both the CC coins and normal coins are preserved and follow the rules that make sense. It is a good idea to define specific roles for specific vins and vouts to reduce the complexity of validation.
55 // to create a new CCaddr, add to rpcwallet the CCaddress and start with -pubkey= with the pubkey of the new address, with its wif already imported. set normaladdr and CChexstr. run CCaddress and it will print the privkey along with autocorrect the CCaddress. which should then update the CCaddr here
58 #define FUNCNAME IsAssetsInput
59 #define EVALCODE EVAL_ASSETS
60 const char *AssetsCCaddr = "RGKRjeTBw4LYFotSDLT6RWzMHbhXri6BG6";
61 const char *AssetsNormaladdr = "RFYE2yL3KknWdHK6uNhvWacYsCUtwzjY3u";
62 char AssetsCChexstr[67] = { "02adf84e0e075cf90868bd4e3d34a03420e034719649c41f371fc70d8e33aa2702" };
63 uint8_t AssetsCCpriv[32] = { 0x9b, 0x17, 0x66, 0xe5, 0x82, 0x66, 0xac, 0xb6, 0xba, 0x43, 0x83, 0x74, 0xf7, 0x63, 0x11, 0x3b, 0xf0, 0xf3, 0x50, 0x6f, 0xd9, 0x6b, 0x67, 0x85, 0xf9, 0x7a, 0xf0, 0x54, 0x4d, 0xb1, 0x30, 0x77 };
65 #include "CCcustom.inc"
70 #define FUNCNAME IsFaucetInput
71 #define EVALCODE EVAL_FAUCET
72 const char *FaucetCCaddr = "R9zHrofhRbub7ER77B7NrVch3A63R39GuC";
73 const char *FaucetNormaladdr = "RKQV4oYs4rvxAWx1J43VnT73rSTVtUeckk";
74 char FaucetCChexstr[67] = { "03682b255c40d0cde8faee381a1a50bbb89980ff24539cb8518e294d3a63cefe12" };
75 uint8_t FaucetCCpriv[32] = { 0xd4, 0x4f, 0xf2, 0x31, 0x71, 0x7d, 0x28, 0x02, 0x4b, 0xc7, 0xdd, 0x71, 0xa0, 0x39, 0xc4, 0xbe, 0x1a, 0xfe, 0xeb, 0xc2, 0x46, 0xda, 0x76, 0xf8, 0x07, 0x53, 0x3d, 0x96, 0xb4, 0xca, 0xa0, 0xe9 };
77 #include "CCcustom.inc"
82 #define FUNCNAME IsRewardsInput
83 #define EVALCODE EVAL_REWARDS
84 const char *RewardsCCaddr = "RTsRBYL1HSvMoE3qtBJkyiswdVaWkm8YTK";
85 const char *RewardsNormaladdr = "RMgye9jeczNjQx9Uzq8no8pTLiCSwuHwkz";
86 char RewardsCChexstr[67] = { "03da60379d924c2c30ac290d2a86c2ead128cb7bd571f69211cb95356e2dcc5eb9" };
87 uint8_t RewardsCCpriv[32] = { 0x82, 0xf5, 0xd2, 0xe7, 0xd6, 0x99, 0x33, 0x77, 0xfb, 0x80, 0x00, 0x97, 0x23, 0x3d, 0x1e, 0x6f, 0x61, 0xa9, 0xb5, 0x2e, 0x5e, 0xb4, 0x96, 0x6f, 0xbc, 0xed, 0x6b, 0xe2, 0xbb, 0x7b, 0x4b, 0xb3 };
88 #include "CCcustom.inc"
93 #define FUNCNAME IsDiceInput
94 #define EVALCODE EVAL_DICE
95 const char *DiceCCaddr = "REabWB7KjFN5C3LFMZ5odExHPenYzHLtVw";
96 const char *DiceNormaladdr = "RLEe8f7Eg3TDuXii9BmNiiiaVGraHUt25c";
97 char DiceCChexstr[67] = { "039d966927cfdadab3ee6c56da63c21f17ea753dde4b3dfd41487103e24b27e94e" };
98 uint8_t DiceCCpriv[32] = { 0x0e, 0xe8, 0xf5, 0xb4, 0x3d, 0x25, 0xcc, 0x35, 0xd1, 0xf1, 0x2f, 0x04, 0x5f, 0x01, 0x26, 0xb8, 0xd1, 0xac, 0x3a, 0x5a, 0xea, 0xe0, 0x25, 0xa2, 0x8f, 0x2a, 0x8e, 0x0e, 0xf9, 0x34, 0xfa, 0x77 };
99 #include "CCcustom.inc"
104 #define FUNCNAME IsLottoInput
105 #define EVALCODE EVAL_LOTTO
106 const char *LottoCCaddr = "RNXZxgyWSAE6XS3qGnTaf5dVNCxnYzhPrg";
107 const char *LottoNormaladdr = "RLW6hhRqBZZMBndnyPv29Yg3krh6iBYCyg";
108 char LottoCChexstr[67] = { "03f72d2c4db440df1e706502b09ca5fec73ffe954ea1883e4049e98da68690d98f" };
109 uint8_t LottoCCpriv[32] = { 0xb4, 0xac, 0xc2, 0xd9, 0x67, 0x34, 0xd7, 0x58, 0x80, 0x4e, 0x25, 0x55, 0xc0, 0x50, 0x66, 0x84, 0xbb, 0xa2, 0xe7, 0xc0, 0x39, 0x17, 0xb4, 0xc5, 0x07, 0xb7, 0x3f, 0xca, 0x07, 0xb0, 0x9a, 0xeb };
110 #include "CCcustom.inc"
114 // Finite State Machine
115 #define FUNCNAME IsFSMInput
116 #define EVALCODE EVAL_FSM
117 const char *FSMCCaddr = "RUKTbLBeKgHkm3Ss4hKZP3ikuLW1xx7B2x";
118 const char *FSMNormaladdr = "RWSHRbxnJYLvDjpcQ2i8MekgP6h2ctTKaj";
119 char FSMCChexstr[67] = { "039b52d294b413b07f3643c1a28c5467901a76562d8b39a785910ae0a0f3043810" };
120 uint8_t FSMCCpriv[32] = { 0x11, 0xe1, 0xea, 0x3e, 0xdb, 0x36, 0xf0, 0xa8, 0xc6, 0x34, 0xe1, 0x21, 0xb8, 0x02, 0xb9, 0x4b, 0x12, 0x37, 0x8f, 0xa0, 0x86, 0x23, 0x50, 0xb2, 0x5f, 0xe4, 0xe7, 0x36, 0x0f, 0xda, 0xae, 0xfc };
121 #include "CCcustom.inc"
126 #define FUNCNAME IsAuctionInput
127 #define EVALCODE EVAL_AUCTION
128 const char *AuctionCCaddr = "RL4YPX7JYG3FnvoPqWF2pn3nQknH5NWEwx";
129 const char *AuctionNormaladdr = "RFtVDNmdTZBTNZdmFRbfBgJ6LitgTghikL";
130 char AuctionCChexstr[67] = { "037eefe050c14cb60ae65d5b2f69eaa1c9006826d729bc0957bdc3024e3ca1dbe6" };
131 uint8_t AuctionCCpriv[32] = { 0x8c, 0x1b, 0xb7, 0x8c, 0x02, 0xa3, 0x9d, 0x21, 0x28, 0x59, 0xf5, 0xea, 0xda, 0xec, 0x0d, 0x11, 0xcd, 0x38, 0x47, 0xac, 0x0b, 0x6f, 0x19, 0xc0, 0x24, 0x36, 0xbf, 0x1c, 0x0a, 0x06, 0x31, 0xfb };
132 #include "CCcustom.inc"
137 #define FUNCNAME IsMofNInput
138 #define EVALCODE EVAL_MOFN
139 const char *MofNCCaddr = "RDVHcSekmXgeYBqRupNTmqo3Rn8QRXNduy";
140 const char *MofNNormaladdr = "RTPwUjKYECcGn6Y4KYChLhgaht1RSU4jwf";
141 char MofNCChexstr[67] = { "03c91bef3d7cc59c3a89286833a3446b29e52a5e773f738a1ad2b09785e5f4179e" };
142 uint8_t MofNCCpriv[32] = { 0x9d, 0xa1, 0xf8, 0xf7, 0xba, 0x0a, 0x91, 0x36, 0x89, 0x9a, 0x86, 0x30, 0x63, 0x20, 0xd7, 0xdf, 0xaa, 0x35, 0xe3, 0x99, 0x32, 0x2b, 0x63, 0xc0, 0x66, 0x9c, 0x93, 0xc4, 0x5e, 0x9d, 0xb9, 0xce };
143 #include "CCcustom.inc"
148 #define FUNCNAME IsChannelsInput
149 #define EVALCODE EVAL_CHANNELS
150 const char *ChannelsCCaddr = "RQy3rwX8sP9oDm3c39vGKA6H315cgtPLfr";
151 const char *ChannelsNormaladdr = "RQUuT8zmkvDfXqECH4m3VD3SsHZAfnoh1v";
152 char ChannelsCChexstr[67] = { "035debdb19b1c98c615259339500511d6216a3ffbeb28ff5655a7ef5790a12ab0b" };
153 uint8_t ChannelsCCpriv[32] = { 0xec, 0x91, 0x36, 0x15, 0x2d, 0xd4, 0x48, 0x73, 0x22, 0x36, 0x4f, 0x6a, 0x34, 0x5c, 0x61, 0x0f, 0x01, 0xb4, 0x79, 0xe8, 0x1c, 0x2f, 0xa1, 0x1d, 0x4a, 0x0a, 0x21, 0x16, 0xea, 0x82, 0x84, 0x60 };
154 #include "CCcustom.inc"
159 #define FUNCNAME IsOraclesInput
160 #define EVALCODE EVAL_ORACLES
161 const char *OraclesCCaddr = "REt2C4ZMnX8YYX1DRpffNA4hECZTFm39e3";
162 const char *OraclesNormaladdr = "RHkFKzn1csxA3fWzAsxsLWohoCgBbirXb5";
163 char OraclesCChexstr[67] = { "038c1d42db6a45a57eccb8981b078fb7857b9b496293fe299d2b8d120ac5b5691a" };
164 uint8_t OraclesCCpriv[32] = { 0xf7, 0x4b, 0x5b, 0xa2, 0x7a, 0x5e, 0x9c, 0xda, 0x89, 0xb1, 0xcb, 0xb9, 0xe6, 0x9c, 0x2c, 0x70, 0x85, 0x37, 0xdd, 0x00, 0x7a, 0x67, 0xff, 0x7c, 0x62, 0x1b, 0xe2, 0xfb, 0x04, 0x8f, 0x85, 0xbf };
165 #include "CCcustom.inc"
170 #define FUNCNAME IsPricesInput
171 #define EVALCODE EVAL_PRICES
172 const char *PricesCCaddr = "RAL5Vh8NXmFqEKJRKrk1KjKaUckK7mM1iS";
173 const char *PricesNormaladdr = "RBunXCsMHk5NPd6q8SQfmpgre3x133rSwZ";
174 char PricesCChexstr[67] = { "039894cb054c0032e99e65e715b03799607aa91212a16648d391b6fa2cc52ed0cf" };
175 uint8_t PricesCCpriv[32] = { 0x0a, 0x3b, 0xe7, 0x5d, 0xce, 0x06, 0xed, 0xb7, 0xc0, 0xb1, 0xbe, 0xe8, 0x7b, 0x5a, 0xd4, 0x99, 0xb8, 0x8d, 0xde, 0xac, 0xb2, 0x7e, 0x7a, 0x52, 0x96, 0x15, 0xd2, 0xa0, 0xc6, 0xb9, 0x89, 0x61 };
176 #include "CCcustom.inc"
181 #define FUNCNAME IsPegsInput
182 #define EVALCODE EVAL_PEGS
183 const char *PegsCCaddr = "RHnkVb7vHuHnjEjhkCF1bS6xxLLNZPv5fd";
184 const char *PegsNormaladdr = "RMcCZtX6dHf1fz3gpLQhUEMQ8cVZ6Rzaro";
185 char PegsCChexstr[67] = { "03c75c1de29a35e41606363b430c08be1c2dd93cf7a468229a082cc79c7b77eece" };
186 uint8_t PegsCCpriv[32] = { 0x52, 0x56, 0x4c, 0x78, 0x87, 0xf7, 0xa2, 0x39, 0xb0, 0x90, 0xb7, 0xb8, 0x62, 0x80, 0x0f, 0x83, 0x18, 0x9d, 0xf4, 0xf4, 0xbd, 0x28, 0x09, 0xa9, 0x9b, 0x85, 0x54, 0x16, 0x0f, 0x3f, 0xfb, 0x65 };
187 #include "CCcustom.inc"
192 #define FUNCNAME IsTriggersInput
193 #define EVALCODE EVAL_TRIGGERS
194 const char *TriggersCCaddr = "RGLSRDnUqTB43bYtRtNVgmwSSd1sun2te8";
195 const char *TriggersNormaladdr = "RMN25Tn8NNzcyQDiQNuMp8UmwLMFd9thYc";
196 char TriggersCChexstr[67] = { "03afc5be570d0ff419425cfcc580cc762ab82baad88c148f5b028d7db7bfeee61d" };
197 uint8_t TriggersCCpriv[32] = { 0x7c, 0x0b, 0x54, 0x9b, 0x65, 0xd4, 0x89, 0x57, 0xdf, 0x05, 0xfe, 0xa2, 0x62, 0x41, 0xa9, 0x09, 0x0f, 0x2a, 0x6b, 0x11, 0x2c, 0xbe, 0xbd, 0x06, 0x31, 0x8d, 0xc0, 0xb9, 0x96, 0x76, 0x3f, 0x24 };
198 #include "CCcustom.inc"
203 #define FUNCNAME IsPaymentsInput
204 #define EVALCODE EVAL_PAYMENTS
205 const char *PaymentsCCaddr = "REpyKi7avsVduqZ3eimncK4uKqSArLTGGK";
206 const char *PaymentsNormaladdr = "RHRX8RTMAh2STWe9DHqsvJbzS7ty6aZy3d";
207 char PaymentsCChexstr[67] = { "0358f1764f82c63abc7c7455555fd1d3184905e30e819e97667e247e5792b46856" };
208 uint8_t PaymentsCCpriv[32] = { 0x03, 0xc9, 0x73, 0xc2, 0xb8, 0x30, 0x3d, 0xbd, 0xc8, 0xd9, 0xbf, 0x02, 0x49, 0xd9, 0x65, 0x61, 0x45, 0xed, 0x9e, 0x93, 0x51, 0xab, 0x8b, 0x2e, 0xe7, 0xc7, 0x40, 0xf1, 0xc4, 0xd2, 0xc0, 0x5b };
209 #include "CCcustom.inc"
214 #define FUNCNAME IsGatewaysInput
215 #define EVALCODE EVAL_GATEWAYS
216 const char *GatewaysCCaddr = "RKWpoK6vTRtq5b9qrRBodLkCzeURHeEk33";
217 const char *GatewaysNormaladdr = "RGJKV97ZN1wBfunuMt1tebiiHENNEq73Yh";
218 char GatewaysCChexstr[67] = { "03ea9c062b9652d8eff34879b504eda0717895d27597aaeb60347d65eed96ccb40" };
219 uint8_t GatewaysCCpriv[32] = { 0xf7, 0x4b, 0x5b, 0xa2, 0x7a, 0x5e, 0x9c, 0xda, 0x89, 0xb1, 0xcb, 0xb9, 0xe6, 0x9c, 0x2c, 0x70, 0x85, 0x37, 0xdd, 0x00, 0x7a, 0x67, 0xff, 0x7c, 0x62, 0x1b, 0xe2, 0xfb, 0x04, 0x8f, 0x85, 0xbf };
220 #include "CCcustom.inc"
224 struct CCcontract_info *CCinit(struct CCcontract_info *cp,uint8_t evalcode)
226 cp->evalcode = evalcode;
230 strcpy(cp->unspendableCCaddr,AssetsCCaddr);
231 strcpy(cp->normaladdr,AssetsNormaladdr);
232 strcpy(cp->CChexstr,AssetsCChexstr);
233 memcpy(cp->CCpriv,AssetsCCpriv,32);
234 cp->validate = AssetsValidate;
235 cp->ismyvin = IsAssetsInput;
238 strcpy(cp->unspendableCCaddr,FaucetCCaddr);
239 strcpy(cp->normaladdr,FaucetNormaladdr);
240 strcpy(cp->CChexstr,FaucetCChexstr);
241 memcpy(cp->CCpriv,FaucetCCpriv,32);
242 cp->validate = FaucetValidate;
243 cp->ismyvin = IsFaucetInput;
246 strcpy(cp->unspendableCCaddr,RewardsCCaddr);
247 strcpy(cp->normaladdr,RewardsNormaladdr);
248 strcpy(cp->CChexstr,RewardsCChexstr);
249 memcpy(cp->CCpriv,RewardsCCpriv,32);
250 cp->validate = RewardsValidate;
251 cp->ismyvin = IsRewardsInput;
254 strcpy(cp->unspendableCCaddr,DiceCCaddr);
255 strcpy(cp->normaladdr,DiceNormaladdr);
256 strcpy(cp->CChexstr,DiceCChexstr);
257 memcpy(cp->CCpriv,DiceCCpriv,32);
258 cp->validate = DiceValidate;
259 cp->ismyvin = IsDiceInput;
262 strcpy(cp->unspendableCCaddr,LottoCCaddr);
263 strcpy(cp->normaladdr,LottoNormaladdr);
264 strcpy(cp->CChexstr,LottoCChexstr);
265 memcpy(cp->CCpriv,LottoCCpriv,32);
266 cp->validate = LottoValidate;
267 cp->ismyvin = IsLottoInput;
270 strcpy(cp->unspendableCCaddr,FSMCCaddr);
271 strcpy(cp->normaladdr,FSMNormaladdr);
272 strcpy(cp->CChexstr,FSMCChexstr);
273 memcpy(cp->CCpriv,FSMCCpriv,32);
274 cp->validate = FSMValidate;
275 cp->ismyvin = IsFSMInput;
278 strcpy(cp->unspendableCCaddr,AuctionCCaddr);
279 strcpy(cp->normaladdr,AuctionNormaladdr);
280 strcpy(cp->CChexstr,AuctionCChexstr);
281 memcpy(cp->CCpriv,AuctionCCpriv,32);
282 cp->validate = AuctionValidate;
283 cp->ismyvin = IsAuctionInput;
286 strcpy(cp->unspendableCCaddr,MofNCCaddr);
287 strcpy(cp->normaladdr,MofNNormaladdr);
288 strcpy(cp->CChexstr,MofNCChexstr);
289 memcpy(cp->CCpriv,MofNCCpriv,32);
290 cp->validate = MofNValidate;
291 cp->ismyvin = IsMofNInput;
294 strcpy(cp->unspendableCCaddr,ChannelsCCaddr);
295 strcpy(cp->normaladdr,ChannelsNormaladdr);
296 strcpy(cp->CChexstr,ChannelsCChexstr);
297 memcpy(cp->CCpriv,ChannelsCCpriv,32);
298 cp->validate = ChannelsValidate;
299 cp->ismyvin = IsChannelsInput;
302 strcpy(cp->unspendableCCaddr,OraclesCCaddr);
303 strcpy(cp->normaladdr,OraclesNormaladdr);
304 strcpy(cp->CChexstr,OraclesCChexstr);
305 memcpy(cp->CCpriv,OraclesCCpriv,32);
306 cp->validate = OraclesValidate;
307 cp->ismyvin = IsOraclesInput;
310 strcpy(cp->unspendableCCaddr,PricesCCaddr);
311 strcpy(cp->normaladdr,PricesNormaladdr);
312 strcpy(cp->CChexstr,PricesCChexstr);
313 memcpy(cp->CCpriv,PricesCCpriv,32);
314 cp->validate = PricesValidate;
315 cp->ismyvin = IsPricesInput;
318 strcpy(cp->unspendableCCaddr,PegsCCaddr);
319 strcpy(cp->normaladdr,PegsNormaladdr);
320 strcpy(cp->CChexstr,PegsCChexstr);
321 memcpy(cp->CCpriv,PegsCCpriv,32);
322 cp->validate = PegsValidate;
323 cp->ismyvin = IsPegsInput;
326 strcpy(cp->unspendableCCaddr,TriggersCCaddr);
327 strcpy(cp->normaladdr,TriggersNormaladdr);
328 strcpy(cp->CChexstr,TriggersCChexstr);
329 memcpy(cp->CCpriv,TriggersCCpriv,32);
330 cp->validate = TriggersValidate;
331 cp->ismyvin = IsTriggersInput;
334 strcpy(cp->unspendableCCaddr,PaymentsCCaddr);
335 strcpy(cp->normaladdr,PaymentsNormaladdr);
336 strcpy(cp->CChexstr,PaymentsCChexstr);
337 memcpy(cp->CCpriv,PaymentsCCpriv,32);
338 cp->validate = PaymentsValidate;
339 cp->ismyvin = IsPaymentsInput;
342 strcpy(cp->unspendableCCaddr,GatewaysCCaddr);
343 strcpy(cp->normaladdr,GatewaysNormaladdr);
344 strcpy(cp->CChexstr,GatewaysCChexstr);
345 memcpy(cp->CCpriv,GatewaysCCpriv,32);
346 cp->validate = GatewaysValidate;
347 cp->ismyvin = IsGatewaysInput;