private void saveTrackingOriginsToState() { Binder origins = new Binder(); for (Map.Entry<HashId, String> entry: trackingOrigins.entrySet()) { origins.set(entry.getKey().toBase64String(), entry.getValue()); } getStateData().set(TRACKING_ORIGINS_FIELD_NAME, origins); Binder callbacks = new Binder(); for (Map.Entry<String, PublicKey> entry: callbackKeys.entrySet()) { callbacks.set(entry.getKey(), entry.getValue().pack()); } getStateData().set(CALLBACK_KEYS_FIELD_NAME, callbacks); }
paidU = getStateData().getInt(PAID_U_FIELD_NAME, 0); callbackRate = getStateData().getDouble(CALLBACK_RATE_FIELD_NAME); prepaidOriginDays = getStateData().getInt(PREPAID_OD_FIELD_NAME, 0); long prepaidFromSeconds = getStateData().getLong(PREPAID_FROM_TIME_FIELD_NAME, 0); prepaidFrom = ZonedDateTime.ofInstant(Instant.ofEpochSecond(prepaidFromSeconds), ZoneId.systemDefault()); Binder trackingOriginsAsBase64 = getStateData().getBinder(TRACKING_ORIGINS_FIELD_NAME); Binder callbacksData = getStateData().getBinder(CALLBACK_KEYS_FIELD_NAME);
@Override public boolean beforeUpdate(ImmutableEnvironment c) { boolean checkResult = false; // recalculate prepaid origins*days without saving to state calculatePrepaidOriginDays(false); // check that payment was not hacked checkResult = prepaidOriginDays == getStateData().getInt(PREPAID_OD_FIELD_NAME, 0); if(!checkResult) { addError(Errors.FAILED_CHECK, "Wrong [state.data." + PREPAID_OD_FIELD_NAME + "] value. " + "Should be sum of early paid U and paid U by current revision."); return checkResult; } // and call common follower check checkResult = additionallyFollowerCheck(c); return checkResult; }
getStateData().set(PAID_U_FIELD_NAME, paidU); getStateData().set(PREPAID_OD_FIELD_NAME, prepaidOriginDays); if(getRevision() == 1) getStateData().set(PREPAID_FROM_TIME_FIELD_NAME, now.toEpochSecond()); getStateData().set(FOLLOWED_ORIGINS_FIELD_NAME, trackingOrigins.size()); getStateData().set(SPENT_OD_FIELD_NAME, spentODs); getStateData().set(SPENT_OD_TIME_FIELD_NAME, spentODsTime.toEpochSecond()); getStateData().set(CALLBACK_RATE_FIELD_NAME, callbackRate);
private Binder queryFollowerInfo(Binder params, Session session) throws IOException { checkNode(session, true); Binder res = new Binder(); res.set("follower_state", null); byte[] follower_id = params.getBinary("follower_id"); byte[] followerBin = node.getLedger().getSmartContractById(HashId.withDigest(follower_id)); if (followerBin != null) { FollowerContract followerContract = (FollowerContract) Contract.fromPackedTransaction(followerBin); res.set("follower_state", followerContract.getStateData()); } return res; }
@Override public boolean beforeCreate(ImmutableEnvironment c) { boolean checkResult = true; // recalculate prepaid origins*days without saving to state calculatePrepaidOriginDays(false); int paidU = getPaidU(); if(paidU == 0) { if(getPaidU(true) > 0) { addError(Errors.FAILED_CHECK, "Test payment is not allowed for follower contracts"); } checkResult = false; } else if(paidU < getMinPayment()) { addError(Errors.FAILED_CHECK, "Payment for follower contract is below minimum level of " + getMinPayment() + "U"); checkResult = false; } if(!checkResult) { addError(Errors.FAILED_CHECK, "Follower contract hasn't valid payment"); return checkResult; } // check that payment was not hacked checkResult = prepaidOriginDays == getStateData().getInt(PREPAID_OD_FIELD_NAME, 0); if(!checkResult) { addError(Errors.FAILED_CHECK, "Wrong [state.data." + PREPAID_OD_FIELD_NAME + "] value. " + "Should be sum of early paid U and paid U by current revision."); return checkResult; } // and call common follower check checkResult = additionallyFollowerCheck(c); return checkResult; }
assertEquals(followerInfo.size(),9); assertEquals(followerInfo.getInt("paid_U", 0),followerContract.getStateData().get("paid_U")); assertTrue(followerInfo.getDouble("prepaid_OD") == followerContract.getPrepaidOriginsDays().doubleValue()); assertEquals(followerInfo.getLong("prepaid_from", 0), followerContract.getStateData().get("prepaid_from")); assertEquals(followerInfo.getInt("followed_origins", 0), followerContract.getStateData().get("followed_origins")); assertEquals(followerInfo.getDouble("spent_OD"), followerContract.getStateData().get("spent_OD")); assertEquals(followerInfo.getLong("spent_OD_time", 0), followerContract.getStateData().get("spent_OD_time")); assertEquals(followerInfo.getDouble("callback_rate"), followerContract.getStateData().get("callback_rate")); assertEquals(followerInfo.getBinder("callback_keys").get("http://localhost:7777/follow.callback"), callbackKey.getPublicKey().pack()); assertEquals(followerInfo.getBinder("tracking_origins").get(simpleContract.getOrigin().toBase64String()), "http://localhost:7777/follow.callback");