github.com/stellar/stellar-etl@v1.0.1-0.20240312145900-4874b6bf2b89/internal/transform/effects_test.go (about) 1 package transform 2 3 import ( 4 "crypto/rand" 5 "encoding/hex" 6 "math/big" 7 "strings" 8 "testing" 9 "time" 10 11 "github.com/guregu/null" 12 "github.com/stellar/go/keypair" 13 "github.com/stellar/go/protocols/horizon/base" 14 "github.com/stellar/go/strkey" 15 "github.com/stellar/go/support/contractevents" 16 "github.com/stellar/stellar-etl/internal/toid" 17 "github.com/stellar/stellar-etl/internal/utils" 18 "github.com/stretchr/testify/assert" 19 20 "github.com/stretchr/testify/suite" 21 22 "github.com/stellar/go/ingest" 23 "github.com/stellar/go/xdr" 24 ) 25 26 func TestEffectsCoversAllOperationTypes(t *testing.T) { 27 for typ, s := range xdr.OperationTypeToStringMap { 28 op := xdr.Operation{ 29 Body: xdr.OperationBody{ 30 Type: xdr.OperationType(typ), 31 }, 32 } 33 operation := transactionOperationWrapper{ 34 index: 0, 35 transaction: ingest.LedgerTransaction{ 36 UnsafeMeta: xdr.TransactionMeta{ 37 V: 2, 38 V2: &xdr.TransactionMetaV2{}, 39 }, 40 }, 41 operation: op, 42 ledgerSequence: 1, 43 network: "testnet", 44 ledgerClosed: genericCloseTime.UTC(), 45 } 46 // calling effects should either panic (because the operation field is set to nil) 47 // or not error 48 func() { 49 var err error 50 defer func() { 51 err2 := recover() 52 if err != nil { 53 assert.NotContains(t, err.Error(), "Unknown operation type") 54 } 55 assert.True(t, err2 != nil || err == nil, s) 56 }() 57 _, err = operation.effects() 58 }() 59 } 60 61 // make sure the check works for an unknown operation type 62 op := xdr.Operation{ 63 Body: xdr.OperationBody{ 64 Type: xdr.OperationType(20000), 65 }, 66 } 67 operation := transactionOperationWrapper{ 68 index: 0, 69 transaction: ingest.LedgerTransaction{ 70 UnsafeMeta: xdr.TransactionMeta{ 71 V: 2, 72 V2: &xdr.TransactionMetaV2{}, 73 }, 74 }, 75 operation: op, 76 ledgerSequence: 1, 77 ledgerClosed: genericCloseTime.UTC(), 78 } 79 // calling effects should error due to the unknown operation 80 _, err := operation.effects() 81 assert.Contains(t, err.Error(), "Unknown operation type") 82 } 83 84 func TestOperationEffects(t *testing.T) { 85 86 sourceAID := xdr.MustAddress("GD3MMHD2YZWL5RAUWG6O3RMA5HTZYM7S3JLSZ2Z35JNJAWTDIKXY737V") 87 sourceAccount := xdr.MuxedAccount{ 88 Type: xdr.CryptoKeyTypeKeyTypeMuxedEd25519, 89 Med25519: &xdr.MuxedAccountMed25519{ 90 Id: 0xcafebabe, 91 Ed25519: *sourceAID.Ed25519, 92 }, 93 } 94 destAID := xdr.MustAddress("GDEOVUDLCYTO46D6GD6WH7BFESPBV5RACC6F6NUFCIRU7PL2XONQHVGJ") 95 dest := xdr.MuxedAccount{ 96 Type: xdr.CryptoKeyTypeKeyTypeMuxedEd25519, 97 Med25519: &xdr.MuxedAccountMed25519{ 98 Id: 0xcafebabe, 99 Ed25519: *destAID.Ed25519, 100 }, 101 } 102 strictPaymentWithMuxedAccountsTx := xdr.TransactionEnvelope{ 103 Type: xdr.EnvelopeTypeEnvelopeTypeTx, 104 V1: &xdr.TransactionV1Envelope{ 105 Tx: xdr.Transaction{ 106 SourceAccount: sourceAccount, 107 Fee: 100, 108 SeqNum: 3684420515004429, 109 Operations: []xdr.Operation{ 110 { 111 Body: xdr.OperationBody{ 112 Type: xdr.OperationTypePathPaymentStrictSend, 113 PathPaymentStrictSendOp: &xdr.PathPaymentStrictSendOp{ 114 SendAsset: xdr.Asset{ 115 Type: xdr.AssetTypeAssetTypeCreditAlphanum4, 116 AlphaNum4: &xdr.AlphaNum4{ 117 AssetCode: xdr.AssetCode4{66, 82, 76, 0}, 118 Issuer: xdr.MustAddress("GCXI6Q73J7F6EUSBZTPW4G4OUGVDHABPYF2U4KO7MVEX52OH5VMVUCRF"), 119 }, 120 }, 121 SendAmount: 300000, 122 Destination: dest, 123 DestAsset: xdr.Asset{ 124 Type: 1, 125 AlphaNum4: &xdr.AlphaNum4{ 126 AssetCode: xdr.AssetCode4{65, 82, 83, 0}, 127 Issuer: xdr.MustAddress("GCXI6Q73J7F6EUSBZTPW4G4OUGVDHABPYF2U4KO7MVEX52OH5VMVUCRF"), 128 }, 129 }, 130 DestMin: 10000000, 131 Path: []xdr.Asset{ 132 { 133 Type: xdr.AssetTypeAssetTypeCreditAlphanum4, 134 AlphaNum4: &xdr.AlphaNum4{ 135 AssetCode: xdr.AssetCode4{65, 82, 83, 0}, 136 Issuer: xdr.MustAddress("GCXI6Q73J7F6EUSBZTPW4G4OUGVDHABPYF2U4KO7MVEX52OH5VMVUCRF"), 137 }, 138 }, 139 }, 140 }, 141 }, 142 }, 143 }, 144 }, 145 Signatures: []xdr.DecoratedSignature{ 146 { 147 Hint: xdr.SignatureHint{99, 66, 175, 143}, 148 Signature: xdr.Signature{244, 107, 139, 92, 189, 156, 207, 79, 84, 56, 2, 70, 75, 22, 237, 50, 100, 242, 159, 177, 27, 240, 66, 122, 182, 45, 189, 78, 5, 127, 26, 61, 179, 238, 229, 76, 32, 206, 122, 13, 154, 133, 148, 149, 29, 250, 48, 132, 44, 86, 163, 56, 32, 44, 75, 87, 226, 251, 76, 4, 59, 182, 132, 8}, 149 }, 150 }, 151 }, 152 } 153 strictPaymentWithMuxedAccountsTxBase64, err := xdr.MarshalBase64(strictPaymentWithMuxedAccountsTx) 154 assert.NoError(t, err) 155 156 creator := xdr.MustAddress("GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H") 157 created := xdr.MustAddress("GCQZP3IU7XU6EJ63JZXKCQOYT2RNXN3HB5CNHENNUEUHSMA4VUJJJSEN") 158 sponsor := xdr.MustAddress("GAHK7EEG2WWHVKDNT4CEQFZGKF2LGDSW2IVM4S5DP42RBW3K6BTODB4A") 159 sponsor2 := xdr.MustAddress("GACMZD5VJXTRLKVET72CETCYKELPNCOTTBDC6DHFEUPLG5DHEK534JQX") 160 createAccountMeta := &xdr.TransactionMeta{ 161 V: 1, 162 V1: &xdr.TransactionMetaV1{ 163 TxChanges: xdr.LedgerEntryChanges{ 164 { 165 Type: 3, 166 State: &xdr.LedgerEntry{ 167 LastModifiedLedgerSeq: 0x39, 168 Data: xdr.LedgerEntryData{ 169 Type: 0, 170 Account: &xdr.AccountEntry{ 171 AccountId: creator, 172 Balance: 800152377009533292, 173 SeqNum: 25, 174 InflationDest: &creator, 175 Thresholds: xdr.Thresholds{0x1, 0x0, 0x0, 0x0}, 176 }, 177 }, 178 }, 179 }, 180 { 181 Type: 1, 182 Updated: &xdr.LedgerEntry{ 183 LastModifiedLedgerSeq: 0x39, 184 Data: xdr.LedgerEntryData{ 185 Type: 0, 186 Account: &xdr.AccountEntry{ 187 AccountId: creator, 188 Balance: 800152377009533292, 189 SeqNum: 26, 190 InflationDest: &creator, 191 }, 192 }, 193 Ext: xdr.LedgerEntryExt{}, 194 }, 195 }, 196 }, 197 Operations: []xdr.OperationMeta{ 198 { 199 Changes: xdr.LedgerEntryChanges{ 200 { 201 Type: xdr.LedgerEntryChangeTypeLedgerEntryState, 202 State: &xdr.LedgerEntry{ 203 LastModifiedLedgerSeq: 0x39, 204 Data: xdr.LedgerEntryData{ 205 Type: xdr.LedgerEntryTypeAccount, 206 Account: &xdr.AccountEntry{ 207 AccountId: creator, 208 Balance: 800152367009533292, 209 SeqNum: 26, 210 InflationDest: &creator, 211 Thresholds: xdr.Thresholds{0x1, 0x0, 0x0, 0x0}, 212 }, 213 }, 214 Ext: xdr.LedgerEntryExt{ 215 V: 1, 216 V1: &xdr.LedgerEntryExtensionV1{ 217 SponsoringId: &sponsor2, 218 }, 219 }, 220 }, 221 }, 222 { 223 Type: xdr.LedgerEntryChangeTypeLedgerEntryRemoved, 224 Removed: &xdr.LedgerKey{ 225 Type: xdr.LedgerEntryTypeAccount, 226 Account: &xdr.LedgerKeyAccount{ 227 AccountId: created, 228 }, 229 }, 230 }, 231 { 232 Type: xdr.LedgerEntryChangeTypeLedgerEntryState, 233 State: &xdr.LedgerEntry{ 234 LastModifiedLedgerSeq: 0x39, 235 Data: xdr.LedgerEntryData{ 236 Type: xdr.LedgerEntryTypeAccount, 237 Account: &xdr.AccountEntry{ 238 AccountId: creator, 239 Balance: 800152367009533292, 240 SeqNum: 26, 241 InflationDest: &creator, 242 Thresholds: xdr.Thresholds{0x1, 0x0, 0x0, 0x0}, 243 }, 244 }, 245 Ext: xdr.LedgerEntryExt{ 246 V: 1, 247 V1: &xdr.LedgerEntryExtensionV1{ 248 SponsoringId: &sponsor, 249 }, 250 }, 251 }, 252 }, 253 { 254 Type: xdr.LedgerEntryChangeTypeLedgerEntryUpdated, 255 Updated: &xdr.LedgerEntry{ 256 LastModifiedLedgerSeq: 0x39, 257 Data: xdr.LedgerEntryData{ 258 Type: xdr.LedgerEntryTypeAccount, 259 Account: &xdr.AccountEntry{ 260 AccountId: creator, 261 Balance: 800152367009533292, 262 SeqNum: 26, 263 InflationDest: &creator, 264 Thresholds: xdr.Thresholds{0x1, 0x0, 0x0, 0x0}, 265 }, 266 }, 267 Ext: xdr.LedgerEntryExt{ 268 V: 1, 269 V1: &xdr.LedgerEntryExtensionV1{ 270 SponsoringId: &sponsor2, 271 }, 272 }, 273 }, 274 }, 275 { 276 Type: xdr.LedgerEntryChangeTypeLedgerEntryState, 277 State: &xdr.LedgerEntry{ 278 LastModifiedLedgerSeq: 0x39, 279 Data: xdr.LedgerEntryData{ 280 Type: xdr.LedgerEntryTypeAccount, 281 Account: &xdr.AccountEntry{ 282 AccountId: creator, 283 Balance: 800152377009533292, 284 SeqNum: 26, 285 InflationDest: &creator, 286 Thresholds: xdr.Thresholds{0x1, 0x0, 0x0, 0x0}, 287 }, 288 }, 289 Ext: xdr.LedgerEntryExt{ 290 V: 1, 291 V1: &xdr.LedgerEntryExtensionV1{ 292 SponsoringId: &sponsor, 293 }, 294 }, 295 }, 296 }, 297 { 298 Type: xdr.LedgerEntryChangeTypeLedgerEntryUpdated, 299 Updated: &xdr.LedgerEntry{ 300 LastModifiedLedgerSeq: 0x39, 301 Data: xdr.LedgerEntryData{ 302 Type: xdr.LedgerEntryTypeAccount, 303 Account: &xdr.AccountEntry{ 304 AccountId: creator, 305 Balance: 800152367009533292, 306 SeqNum: 26, 307 InflationDest: &creator, 308 Thresholds: xdr.Thresholds{0x1, 0x0, 0x0, 0x0}, 309 }, 310 }, 311 Ext: xdr.LedgerEntryExt{ 312 V: 1, 313 V1: &xdr.LedgerEntryExtensionV1{ 314 SponsoringId: &sponsor, 315 }, 316 }, 317 }, 318 }, 319 { 320 Type: xdr.LedgerEntryChangeTypeLedgerEntryCreated, 321 Created: &xdr.LedgerEntry{ 322 LastModifiedLedgerSeq: 0x39, 323 Data: xdr.LedgerEntryData{ 324 Type: xdr.LedgerEntryTypeAccount, 325 Account: &xdr.AccountEntry{ 326 AccountId: created, 327 Balance: 10000000000, 328 SeqNum: 244813135872, 329 Thresholds: xdr.Thresholds{0x1, 0x0, 0x0, 0x0}, 330 }, 331 }, 332 Ext: xdr.LedgerEntryExt{ 333 V: 1, 334 V1: &xdr.LedgerEntryExtensionV1{ 335 SponsoringId: &sponsor, 336 }, 337 }, 338 }, 339 }, 340 }, 341 }, 342 }, 343 }, 344 } 345 346 createAccountMetaB64, err := xdr.MarshalBase64(createAccountMeta) 347 assert.NoError(t, err) 348 assert.NoError(t, err) 349 350 harCodedCloseMetaInput := makeLedgerCloseMeta() 351 LedgerClosed, err := utils.GetCloseTime(harCodedCloseMetaInput) 352 353 revokeSponsorshipMeta, revokeSponsorshipEffects := getRevokeSponsorshipMeta(t) 354 355 testCases := []struct { 356 desc string 357 envelopeXDR string 358 resultXDR string 359 metaXDR string 360 feeChangesXDR string 361 hash string 362 index uint32 363 sequence uint32 364 expected []EffectOutput 365 }{ 366 { 367 desc: "createAccount", 368 envelopeXDR: "AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAAaAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAoZftFP3p4ifbTm6hQdieotu3Zw9E05GtoSh5MBytEpQAAAACVAvkAAAAAAAAAAABVvwF9wAAAEDHU95E9wxgETD8TqxUrkgC0/7XHyNDts6Q5huRHfDRyRcoHdv7aMp/sPvC3RPkXjOMjgbKJUX7SgExUeYB5f8F", 369 resultXDR: "AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAA=", 370 metaXDR: createAccountMetaB64, 371 feeChangesXDR: "AAAAAgAAAAMAAAA3AAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9wsatlj11nHQAAAAAAAAABkAAAAAAAAAAQAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9wAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAA5AAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9wsatlj11nFsAAAAAAAAABkAAAAAAAAAAQAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9wAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==", 372 hash: "0e5bd332291e3098e49886df2cdb9b5369a5f9e0a9973f0d9e1a9489c6581ba2", 373 index: 0, 374 sequence: 57, 375 expected: []EffectOutput{ 376 { 377 Address: "GCQZP3IU7XU6EJ63JZXKCQOYT2RNXN3HB5CNHENNUEUHSMA4VUJJJSEN", 378 OperationID: int64(244813139969), 379 Details: map[string]interface{}{ 380 "starting_balance": "1000.0000000", 381 }, 382 Type: int32(EffectAccountCreated), 383 TypeString: EffectTypeNames[EffectAccountCreated], 384 LedgerClosed: genericCloseTime.UTC(), 385 }, 386 { 387 Address: "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", 388 OperationID: int64(244813139969), 389 Details: map[string]interface{}{ 390 "amount": "1000.0000000", 391 "asset_type": "native", 392 }, 393 Type: int32(EffectAccountDebited), 394 TypeString: EffectTypeNames[EffectAccountDebited], 395 LedgerClosed: genericCloseTime.UTC(), 396 }, 397 { 398 Address: "GCQZP3IU7XU6EJ63JZXKCQOYT2RNXN3HB5CNHENNUEUHSMA4VUJJJSEN", 399 OperationID: int64(244813139969), 400 Details: map[string]interface{}{ 401 "public_key": "GCQZP3IU7XU6EJ63JZXKCQOYT2RNXN3HB5CNHENNUEUHSMA4VUJJJSEN", 402 "weight": 1, 403 }, 404 Type: int32(EffectSignerCreated), 405 TypeString: EffectTypeNames[EffectSignerCreated], 406 LedgerClosed: genericCloseTime.UTC(), 407 }, 408 { 409 Address: "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", 410 OperationID: int64(244813139969), 411 Details: map[string]interface{}{ 412 "former_sponsor": "GACMZD5VJXTRLKVET72CETCYKELPNCOTTBDC6DHFEUPLG5DHEK534JQX", 413 }, 414 Type: int32(EffectAccountSponsorshipRemoved), 415 TypeString: EffectTypeNames[EffectAccountSponsorshipRemoved], 416 LedgerClosed: genericCloseTime.UTC(), 417 }, 418 { 419 Address: "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", 420 OperationID: int64(244813139969), 421 Details: map[string]interface{}{ 422 "former_sponsor": "GAHK7EEG2WWHVKDNT4CEQFZGKF2LGDSW2IVM4S5DP42RBW3K6BTODB4A", 423 "new_sponsor": "GACMZD5VJXTRLKVET72CETCYKELPNCOTTBDC6DHFEUPLG5DHEK534JQX", 424 }, 425 Type: int32(EffectAccountSponsorshipUpdated), 426 TypeString: EffectTypeNames[EffectAccountSponsorshipUpdated], 427 LedgerClosed: genericCloseTime.UTC(), 428 }, 429 { 430 Address: "GCQZP3IU7XU6EJ63JZXKCQOYT2RNXN3HB5CNHENNUEUHSMA4VUJJJSEN", 431 OperationID: int64(244813139969), 432 Details: map[string]interface{}{ 433 "sponsor": "GAHK7EEG2WWHVKDNT4CEQFZGKF2LGDSW2IVM4S5DP42RBW3K6BTODB4A", 434 }, 435 Type: int32(EffectAccountSponsorshipCreated), 436 TypeString: EffectTypeNames[EffectAccountSponsorshipCreated], 437 LedgerClosed: genericCloseTime.UTC(), 438 }, 439 }, 440 }, 441 { 442 desc: "payment", 443 envelopeXDR: "AAAAABpcjiETZ0uhwxJJhgBPYKWSVJy2TZ2LI87fqV1cUf/UAAAAZAAAADcAAAABAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAGlyOIRNnS6HDEkmGAE9gpZJUnLZNnYsjzt+pXVxR/9QAAAAAAAAAAAX14QAAAAAAAAAAAVxR/9QAAABAK6pcXYMzAEmH08CZ1LWmvtNDKauhx+OImtP/Lk4hVTMJRVBOebVs5WEPj9iSrgGT0EswuDCZ2i5AEzwgGof9Ag==", 444 resultXDR: "AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAA=", 445 metaXDR: "AAAAAQAAAAIAAAADAAAAOAAAAAAAAAAAGlyOIRNnS6HDEkmGAE9gpZJUnLZNnYsjzt+pXVxR/9QAAAACVAvjnAAAADcAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAOAAAAAAAAAAAGlyOIRNnS6HDEkmGAE9gpZJUnLZNnYsjzt+pXVxR/9QAAAACVAvjnAAAADcAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAA==", 446 feeChangesXDR: "AAAAAgAAAAMAAAA3AAAAAAAAAAAaXI4hE2dLocMSSYYAT2ClklSctk2diyPO36ldXFH/1AAAAAJUC+QAAAAANwAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAA4AAAAAAAAAAAaXI4hE2dLocMSSYYAT2ClklSctk2diyPO36ldXFH/1AAAAAJUC+OcAAAANwAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==", 447 hash: "2a805712c6d10f9e74bb0ccf54ae92a2b4b1e586451fe8133a2433816f6b567c", 448 index: 0, 449 sequence: 56, 450 expected: []EffectOutput{ 451 { 452 Address: "GANFZDRBCNTUXIODCJEYMACPMCSZEVE4WZGZ3CZDZ3P2SXK4KH75IK6Y", 453 Details: map[string]interface{}{ 454 "amount": "10.0000000", 455 "asset_type": "native", 456 }, 457 Type: int32(EffectAccountCredited), 458 TypeString: EffectTypeNames[EffectAccountCredited], 459 OperationID: int64(240518172673), 460 LedgerClosed: genericCloseTime.UTC(), 461 }, 462 { 463 Address: "GANFZDRBCNTUXIODCJEYMACPMCSZEVE4WZGZ3CZDZ3P2SXK4KH75IK6Y", 464 Details: map[string]interface{}{ 465 "amount": "10.0000000", 466 "asset_type": "native", 467 }, 468 Type: int32(EffectAccountDebited), 469 TypeString: EffectTypeNames[EffectAccountDebited], 470 OperationID: int64(240518172673), 471 LedgerClosed: genericCloseTime.UTC(), 472 }, 473 }, 474 }, 475 { 476 desc: "pathPaymentStrictSend", 477 envelopeXDR: "AAAAAPbGHHrGbL7EFLG87cWA6eecM/LaVyzrO+pakFpjQq+PAAAAZAANFvYAAAANAAAAAAAAAAAAAAABAAAAAAAAAA0AAAABQlJMAAAAAACuj0P7T8viUkHM324bjqGqM4AvwXVOKd9lSX7px+1ZWgAAAAAABJPgAAAAAMjq0GsWJu54fjD9Y/wlJJ4a9iAQvF82hRIjT716u5sDAAAAAUFSUwAAAAAAro9D+0/L4lJBzN9uG46hqjOAL8F1TinfZUl+6cftWVoAAAAAAJiWgAAAAAEAAAABQVJTAAAAAACuj0P7T8viUkHM324bjqGqM4AvwXVOKd9lSX7px+1ZWgAAAAAAAAABY0KvjwAAAED0a4tcvZzPT1Q4AkZLFu0yZPKfsRvwQnq2Lb1OBX8aPbPu5UwgznoNmoWUlR36MIQsVqM4ICxLV+L7TAQ7toQI", 478 resultXDR: "AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAANAAAAAAAAAAEAAAAAyOrQaxYm7nh+MP1j/CUknhr2IBC8XzaFEiNPvXq7mwMAAAAAAJmwQAAAAAFBUlMAAAAAAK6PQ/tPy+JSQczfbhuOoaozgC/BdU4p32VJfunH7VlaAAAAAACYloAAAAABQlJMAAAAAACuj0P7T8viUkHM324bjqGqM4AvwXVOKd9lSX7px+1ZWgAAAAAABJPgAAAAAMjq0GsWJu54fjD9Y/wlJJ4a9iAQvF82hRIjT716u5sDAAAAAUFSUwAAAAAAro9D+0/L4lJBzN9uG46hqjOAL8F1TinfZUl+6cftWVoAAAAAAJiWgAAAAAA=", 479 metaXDR: "AAAAAQAAAAIAAAADAA0aVQAAAAAAAAAA9sYcesZsvsQUsbztxYDp55wz8tpXLOs76lqQWmNCr48AAAAXSHbi7AANFvYAAAAMAAAAAwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAA0aVQAAAAAAAAAA9sYcesZsvsQUsbztxYDp55wz8tpXLOs76lqQWmNCr48AAAAXSHbi7AANFvYAAAANAAAAAwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAACAAAAAMADRo0AAAAAQAAAAD2xhx6xmy+xBSxvO3FgOnnnDPy2lcs6zvqWpBaY0KvjwAAAAFCUkwAAAAAAK6PQ/tPy+JSQczfbhuOoaozgC/BdU4p32VJfunH7VlaAAAAAB22gaB//////////wAAAAEAAAABAAAAAAC3GwAAAAAAAAAAAAAAAAAAAAAAAAAAAQANGlUAAAABAAAAAPbGHHrGbL7EFLG87cWA6eecM/LaVyzrO+pakFpjQq+PAAAAAUJSTAAAAAAAro9D+0/L4lJBzN9uG46hqjOAL8F1TinfZUl+6cftWVoAAAAAHbHtwH//////////AAAAAQAAAAEAAAAAALcbAAAAAAAAAAAAAAAAAAAAAAAAAAADAA0aNAAAAAIAAAAAyOrQaxYm7nh+MP1j/CUknhr2IBC8XzaFEiNPvXq7mwMAAAAAAJmwQAAAAAFBUlMAAAAAAK6PQ/tPy+JSQczfbhuOoaozgC/BdU4p32VJfunH7VlaAAAAAUJSTAAAAAAAro9D+0/L4lJBzN9uG46hqjOAL8F1TinfZUl+6cftWVoAAAAAFNyTgAAAAAMAAABkAAAAAAAAAAAAAAAAAAAAAQANGlUAAAACAAAAAMjq0GsWJu54fjD9Y/wlJJ4a9iAQvF82hRIjT716u5sDAAAAAACZsEAAAAABQVJTAAAAAACuj0P7T8viUkHM324bjqGqM4AvwXVOKd9lSX7px+1ZWgAAAAFCUkwAAAAAAK6PQ/tPy+JSQczfbhuOoaozgC/BdU4p32VJfunH7VlaAAAAABRD/QAAAAADAAAAZAAAAAAAAAAAAAAAAAAAAAMADRo0AAAAAQAAAADI6tBrFibueH4w/WP8JSSeGvYgELxfNoUSI0+9erubAwAAAAFCUkwAAAAAAK6PQ/tPy+JSQczfbhuOoaozgC/BdU4p32VJfunH7VlaAAAAAB3kSGB//////////wAAAAEAAAABAAAAAACgN6AAAAAAAAAAAAAAAAAAAAAAAAAAAQANGlUAAAABAAAAAMjq0GsWJu54fjD9Y/wlJJ4a9iAQvF82hRIjT716u5sDAAAAAUJSTAAAAAAAro9D+0/L4lJBzN9uG46hqjOAL8F1TinfZUl+6cftWVoAAAAAHejcQH//////////AAAAAQAAAAEAAAAAAJujwAAAAAAAAAAAAAAAAAAAAAAAAAADAA0aNAAAAAEAAAAAyOrQaxYm7nh+MP1j/CUknhr2IBC8XzaFEiNPvXq7mwMAAAABQVJTAAAAAACuj0P7T8viUkHM324bjqGqM4AvwXVOKd9lSX7px+1ZWgAAAAB2BGcAf/////////8AAAABAAAAAQAAAAAAAAAAAAAAABTck4AAAAAAAAAAAAAAAAEADRpVAAAAAQAAAADI6tBrFibueH4w/WP8JSSeGvYgELxfNoUSI0+9erubAwAAAAFBUlMAAAAAAK6PQ/tPy+JSQczfbhuOoaozgC/BdU4p32VJfunH7VlaAAAAAHYEZwB//////////wAAAAEAAAABAAAAAAAAAAAAAAAAFEP9AAAAAAAAAAAA", 480 feeChangesXDR: "AAAAAgAAAAMADRpIAAAAAAAAAAD2xhx6xmy+xBSxvO3FgOnnnDPy2lcs6zvqWpBaY0KvjwAAABdIduNQAA0W9gAAAAwAAAADAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEADRpVAAAAAAAAAAD2xhx6xmy+xBSxvO3FgOnnnDPy2lcs6zvqWpBaY0KvjwAAABdIduLsAA0W9gAAAAwAAAADAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==", 481 hash: "96415ac1d2f79621b26b1568f963fd8dd6c50c20a22c7428cefbfe9dee867588", 482 index: 0, 483 sequence: 20, 484 expected: []EffectOutput{ 485 486 { 487 Address: "GDEOVUDLCYTO46D6GD6WH7BFESPBV5RACC6F6NUFCIRU7PL2XONQHVGJ", 488 Details: map[string]interface{}{ 489 "amount": "1.0000000", 490 "asset_code": "ARS", 491 "asset_issuer": "GCXI6Q73J7F6EUSBZTPW4G4OUGVDHABPYF2U4KO7MVEX52OH5VMVUCRF", 492 "asset_type": "credit_alphanum4", 493 }, 494 Type: int32(EffectAccountCredited), 495 TypeString: EffectTypeNames[EffectAccountCredited], 496 OperationID: int64(85899350017), 497 LedgerClosed: genericCloseTime.UTC(), 498 }, 499 { 500 Address: "GD3MMHD2YZWL5RAUWG6O3RMA5HTZYM7S3JLSZ2Z35JNJAWTDIKXY737V", 501 Details: map[string]interface{}{ 502 "amount": "0.0300000", 503 "asset_code": "BRL", 504 "asset_issuer": "GCXI6Q73J7F6EUSBZTPW4G4OUGVDHABPYF2U4KO7MVEX52OH5VMVUCRF", 505 "asset_type": "credit_alphanum4", 506 }, 507 Type: int32(EffectAccountDebited), 508 TypeString: EffectTypeNames[EffectAccountDebited], 509 OperationID: int64(85899350017), 510 LedgerClosed: genericCloseTime.UTC(), 511 }, 512 { 513 Address: "GD3MMHD2YZWL5RAUWG6O3RMA5HTZYM7S3JLSZ2Z35JNJAWTDIKXY737V", 514 Details: map[string]interface{}{ 515 "bought_amount": "1.0000000", 516 "bought_asset_code": "ARS", 517 "bought_asset_issuer": "GCXI6Q73J7F6EUSBZTPW4G4OUGVDHABPYF2U4KO7MVEX52OH5VMVUCRF", 518 "bought_asset_type": "credit_alphanum4", 519 "offer_id": xdr.Int64(10072128), 520 "seller": "GDEOVUDLCYTO46D6GD6WH7BFESPBV5RACC6F6NUFCIRU7PL2XONQHVGJ", 521 "sold_amount": "0.0300000", 522 "sold_asset_code": "BRL", 523 "sold_asset_issuer": "GCXI6Q73J7F6EUSBZTPW4G4OUGVDHABPYF2U4KO7MVEX52OH5VMVUCRF", 524 "sold_asset_type": "credit_alphanum4", 525 }, 526 Type: int32(EffectTrade), 527 TypeString: EffectTypeNames[EffectTrade], 528 OperationID: int64(85899350017), 529 LedgerClosed: genericCloseTime.UTC(), 530 }, 531 { 532 Address: "GDEOVUDLCYTO46D6GD6WH7BFESPBV5RACC6F6NUFCIRU7PL2XONQHVGJ", 533 Details: map[string]interface{}{ 534 "bought_amount": "0.0300000", 535 "bought_asset_code": "BRL", 536 "bought_asset_issuer": "GCXI6Q73J7F6EUSBZTPW4G4OUGVDHABPYF2U4KO7MVEX52OH5VMVUCRF", 537 "bought_asset_type": "credit_alphanum4", 538 "offer_id": xdr.Int64(10072128), 539 "seller": "GD3MMHD2YZWL5RAUWG6O3RMA5HTZYM7S3JLSZ2Z35JNJAWTDIKXY737V", 540 "sold_amount": "1.0000000", 541 "sold_asset_code": "ARS", 542 "sold_asset_issuer": "GCXI6Q73J7F6EUSBZTPW4G4OUGVDHABPYF2U4KO7MVEX52OH5VMVUCRF", 543 "sold_asset_type": "credit_alphanum4", 544 }, 545 Type: int32(EffectTrade), 546 TypeString: EffectTypeNames[EffectTrade], 547 OperationID: int64(85899350017), 548 LedgerClosed: genericCloseTime.UTC(), 549 }, 550 { 551 Address: "GD3MMHD2YZWL5RAUWG6O3RMA5HTZYM7S3JLSZ2Z35JNJAWTDIKXY737V", 552 Details: map[string]interface{}{ 553 "bought_amount": "1.0000000", 554 "bought_asset_code": "ARS", 555 "bought_asset_issuer": "GCXI6Q73J7F6EUSBZTPW4G4OUGVDHABPYF2U4KO7MVEX52OH5VMVUCRF", 556 "bought_asset_type": "credit_alphanum4", 557 "offer_id": xdr.Int64(10072128), 558 "seller": "GDEOVUDLCYTO46D6GD6WH7BFESPBV5RACC6F6NUFCIRU7PL2XONQHVGJ", 559 "sold_amount": "0.0300000", 560 "sold_asset_code": "BRL", 561 "sold_asset_issuer": "GCXI6Q73J7F6EUSBZTPW4G4OUGVDHABPYF2U4KO7MVEX52OH5VMVUCRF", 562 "sold_asset_type": "credit_alphanum4", 563 }, 564 Type: int32(EffectOfferUpdated), 565 TypeString: EffectTypeNames[EffectOfferUpdated], 566 OperationID: int64(85899350017), 567 LedgerClosed: genericCloseTime.UTC(), 568 }, 569 { 570 Address: "GDEOVUDLCYTO46D6GD6WH7BFESPBV5RACC6F6NUFCIRU7PL2XONQHVGJ", 571 Details: map[string]interface{}{ 572 "bought_amount": "0.0300000", 573 "bought_asset_code": "BRL", 574 "bought_asset_issuer": "GCXI6Q73J7F6EUSBZTPW4G4OUGVDHABPYF2U4KO7MVEX52OH5VMVUCRF", 575 "bought_asset_type": "credit_alphanum4", 576 "offer_id": xdr.Int64(10072128), 577 "seller": "GD3MMHD2YZWL5RAUWG6O3RMA5HTZYM7S3JLSZ2Z35JNJAWTDIKXY737V", 578 "sold_amount": "1.0000000", 579 "sold_asset_code": "ARS", 580 "sold_asset_issuer": "GCXI6Q73J7F6EUSBZTPW4G4OUGVDHABPYF2U4KO7MVEX52OH5VMVUCRF", 581 "sold_asset_type": "credit_alphanum4", 582 }, 583 Type: int32(EffectOfferUpdated), 584 TypeString: EffectTypeNames[EffectOfferUpdated], 585 OperationID: int64(85899350017), 586 LedgerClosed: genericCloseTime.UTC(), 587 }, 588 { 589 Address: "GD3MMHD2YZWL5RAUWG6O3RMA5HTZYM7S3JLSZ2Z35JNJAWTDIKXY737V", 590 Details: map[string]interface{}{ 591 "bought_amount": "1.0000000", 592 "bought_asset_code": "ARS", 593 "bought_asset_issuer": "GCXI6Q73J7F6EUSBZTPW4G4OUGVDHABPYF2U4KO7MVEX52OH5VMVUCRF", 594 "bought_asset_type": "credit_alphanum4", 595 "offer_id": xdr.Int64(10072128), 596 "seller": "GDEOVUDLCYTO46D6GD6WH7BFESPBV5RACC6F6NUFCIRU7PL2XONQHVGJ", 597 "sold_amount": "0.0300000", 598 "sold_asset_code": "BRL", 599 "sold_asset_issuer": "GCXI6Q73J7F6EUSBZTPW4G4OUGVDHABPYF2U4KO7MVEX52OH5VMVUCRF", 600 "sold_asset_type": "credit_alphanum4", 601 }, 602 Type: int32(EffectOfferRemoved), 603 TypeString: EffectTypeNames[EffectOfferRemoved], 604 OperationID: int64(85899350017), 605 LedgerClosed: genericCloseTime.UTC(), 606 }, 607 { 608 Address: "GDEOVUDLCYTO46D6GD6WH7BFESPBV5RACC6F6NUFCIRU7PL2XONQHVGJ", 609 Details: map[string]interface{}{ 610 "bought_amount": "0.0300000", 611 "bought_asset_code": "BRL", 612 "bought_asset_issuer": "GCXI6Q73J7F6EUSBZTPW4G4OUGVDHABPYF2U4KO7MVEX52OH5VMVUCRF", 613 "bought_asset_type": "credit_alphanum4", 614 "offer_id": xdr.Int64(10072128), 615 "seller": "GD3MMHD2YZWL5RAUWG6O3RMA5HTZYM7S3JLSZ2Z35JNJAWTDIKXY737V", 616 "sold_amount": "1.0000000", 617 "sold_asset_code": "ARS", 618 "sold_asset_issuer": "GCXI6Q73J7F6EUSBZTPW4G4OUGVDHABPYF2U4KO7MVEX52OH5VMVUCRF", 619 "sold_asset_type": "credit_alphanum4", 620 }, 621 Type: int32(EffectOfferRemoved), 622 TypeString: EffectTypeNames[EffectOfferRemoved], 623 OperationID: int64(85899350017), 624 LedgerClosed: genericCloseTime.UTC(), 625 }, 626 }, 627 }, 628 { 629 desc: "pathPaymentStrictSend with muxed accounts", 630 envelopeXDR: strictPaymentWithMuxedAccountsTxBase64, 631 resultXDR: "AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAANAAAAAAAAAAEAAAAAyOrQaxYm7nh+MP1j/CUknhr2IBC8XzaFEiNPvXq7mwMAAAAAAJmwQAAAAAFBUlMAAAAAAK6PQ/tPy+JSQczfbhuOoaozgC/BdU4p32VJfunH7VlaAAAAAACYloAAAAABQlJMAAAAAACuj0P7T8viUkHM324bjqGqM4AvwXVOKd9lSX7px+1ZWgAAAAAABJPgAAAAAMjq0GsWJu54fjD9Y/wlJJ4a9iAQvF82hRIjT716u5sDAAAAAUFSUwAAAAAAro9D+0/L4lJBzN9uG46hqjOAL8F1TinfZUl+6cftWVoAAAAAAJiWgAAAAAA=", 632 metaXDR: "AAAAAQAAAAIAAAADAA0aVQAAAAAAAAAA9sYcesZsvsQUsbztxYDp55wz8tpXLOs76lqQWmNCr48AAAAXSHbi7AANFvYAAAAMAAAAAwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAA0aVQAAAAAAAAAA9sYcesZsvsQUsbztxYDp55wz8tpXLOs76lqQWmNCr48AAAAXSHbi7AANFvYAAAANAAAAAwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAACAAAAAMADRo0AAAAAQAAAAD2xhx6xmy+xBSxvO3FgOnnnDPy2lcs6zvqWpBaY0KvjwAAAAFCUkwAAAAAAK6PQ/tPy+JSQczfbhuOoaozgC/BdU4p32VJfunH7VlaAAAAAB22gaB//////////wAAAAEAAAABAAAAAAC3GwAAAAAAAAAAAAAAAAAAAAAAAAAAAQANGlUAAAABAAAAAPbGHHrGbL7EFLG87cWA6eecM/LaVyzrO+pakFpjQq+PAAAAAUJSTAAAAAAAro9D+0/L4lJBzN9uG46hqjOAL8F1TinfZUl+6cftWVoAAAAAHbHtwH//////////AAAAAQAAAAEAAAAAALcbAAAAAAAAAAAAAAAAAAAAAAAAAAADAA0aNAAAAAIAAAAAyOrQaxYm7nh+MP1j/CUknhr2IBC8XzaFEiNPvXq7mwMAAAAAAJmwQAAAAAFBUlMAAAAAAK6PQ/tPy+JSQczfbhuOoaozgC/BdU4p32VJfunH7VlaAAAAAUJSTAAAAAAAro9D+0/L4lJBzN9uG46hqjOAL8F1TinfZUl+6cftWVoAAAAAFNyTgAAAAAMAAABkAAAAAAAAAAAAAAAAAAAAAQANGlUAAAACAAAAAMjq0GsWJu54fjD9Y/wlJJ4a9iAQvF82hRIjT716u5sDAAAAAACZsEAAAAABQVJTAAAAAACuj0P7T8viUkHM324bjqGqM4AvwXVOKd9lSX7px+1ZWgAAAAFCUkwAAAAAAK6PQ/tPy+JSQczfbhuOoaozgC/BdU4p32VJfunH7VlaAAAAABRD/QAAAAADAAAAZAAAAAAAAAAAAAAAAAAAAAMADRo0AAAAAQAAAADI6tBrFibueH4w/WP8JSSeGvYgELxfNoUSI0+9erubAwAAAAFCUkwAAAAAAK6PQ/tPy+JSQczfbhuOoaozgC/BdU4p32VJfunH7VlaAAAAAB3kSGB//////////wAAAAEAAAABAAAAAACgN6AAAAAAAAAAAAAAAAAAAAAAAAAAAQANGlUAAAABAAAAAMjq0GsWJu54fjD9Y/wlJJ4a9iAQvF82hRIjT716u5sDAAAAAUJSTAAAAAAAro9D+0/L4lJBzN9uG46hqjOAL8F1TinfZUl+6cftWVoAAAAAHejcQH//////////AAAAAQAAAAEAAAAAAJujwAAAAAAAAAAAAAAAAAAAAAAAAAADAA0aNAAAAAEAAAAAyOrQaxYm7nh+MP1j/CUknhr2IBC8XzaFEiNPvXq7mwMAAAABQVJTAAAAAACuj0P7T8viUkHM324bjqGqM4AvwXVOKd9lSX7px+1ZWgAAAAB2BGcAf/////////8AAAABAAAAAQAAAAAAAAAAAAAAABTck4AAAAAAAAAAAAAAAAEADRpVAAAAAQAAAADI6tBrFibueH4w/WP8JSSeGvYgELxfNoUSI0+9erubAwAAAAFBUlMAAAAAAK6PQ/tPy+JSQczfbhuOoaozgC/BdU4p32VJfunH7VlaAAAAAHYEZwB//////////wAAAAEAAAABAAAAAAAAAAAAAAAAFEP9AAAAAAAAAAAA", 633 feeChangesXDR: "AAAAAgAAAAMADRpIAAAAAAAAAAD2xhx6xmy+xBSxvO3FgOnnnDPy2lcs6zvqWpBaY0KvjwAAABdIduNQAA0W9gAAAAwAAAADAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEADRpVAAAAAAAAAAD2xhx6xmy+xBSxvO3FgOnnnDPy2lcs6zvqWpBaY0KvjwAAABdIduLsAA0W9gAAAAwAAAADAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==", 634 hash: "96415ac1d2f79621b26b1568f963fd8dd6c50c20a22c7428cefbfe9dee867588", 635 index: 0, 636 sequence: 20, 637 expected: []EffectOutput{ 638 { 639 Address: "GDEOVUDLCYTO46D6GD6WH7BFESPBV5RACC6F6NUFCIRU7PL2XONQHVGJ", 640 AddressMuxed: null.StringFrom("MDEOVUDLCYTO46D6GD6WH7BFESPBV5RACC6F6NUFCIRU7PL2XONQGAAAAAAMV7V2X24II"), 641 Details: map[string]interface{}{ 642 "amount": "1.0000000", 643 "asset_code": "ARS", 644 "asset_issuer": "GCXI6Q73J7F6EUSBZTPW4G4OUGVDHABPYF2U4KO7MVEX52OH5VMVUCRF", 645 "asset_type": "credit_alphanum4", 646 }, 647 Type: int32(EffectAccountCredited), 648 TypeString: EffectTypeNames[EffectAccountCredited], 649 OperationID: int64(85899350017), 650 LedgerClosed: genericCloseTime.UTC(), 651 }, 652 { 653 Address: "GD3MMHD2YZWL5RAUWG6O3RMA5HTZYM7S3JLSZ2Z35JNJAWTDIKXY737V", 654 AddressMuxed: null.StringFrom("MD3MMHD2YZWL5RAUWG6O3RMA5HTZYM7S3JLSZ2Z35JNJAWTDIKXY6AAAAAAMV7V2XZY4C"), 655 Details: map[string]interface{}{ 656 "amount": "0.0300000", 657 "asset_code": "BRL", 658 "asset_issuer": "GCXI6Q73J7F6EUSBZTPW4G4OUGVDHABPYF2U4KO7MVEX52OH5VMVUCRF", 659 "asset_type": "credit_alphanum4", 660 }, 661 Type: int32(EffectAccountDebited), 662 TypeString: EffectTypeNames[EffectAccountDebited], 663 OperationID: int64(85899350017), 664 LedgerClosed: genericCloseTime.UTC(), 665 }, 666 { 667 Address: "GD3MMHD2YZWL5RAUWG6O3RMA5HTZYM7S3JLSZ2Z35JNJAWTDIKXY737V", 668 AddressMuxed: null.StringFrom("MD3MMHD2YZWL5RAUWG6O3RMA5HTZYM7S3JLSZ2Z35JNJAWTDIKXY6AAAAAAMV7V2XZY4C"), 669 Details: map[string]interface{}{ 670 "bought_amount": "1.0000000", 671 "bought_asset_code": "ARS", 672 "bought_asset_issuer": "GCXI6Q73J7F6EUSBZTPW4G4OUGVDHABPYF2U4KO7MVEX52OH5VMVUCRF", 673 "bought_asset_type": "credit_alphanum4", 674 "offer_id": xdr.Int64(10072128), 675 "seller": "GDEOVUDLCYTO46D6GD6WH7BFESPBV5RACC6F6NUFCIRU7PL2XONQHVGJ", 676 "sold_amount": "0.0300000", 677 "sold_asset_code": "BRL", 678 "sold_asset_issuer": "GCXI6Q73J7F6EUSBZTPW4G4OUGVDHABPYF2U4KO7MVEX52OH5VMVUCRF", 679 "sold_asset_type": "credit_alphanum4", 680 }, 681 Type: int32(EffectTrade), 682 TypeString: EffectTypeNames[EffectTrade], 683 OperationID: int64(85899350017), 684 LedgerClosed: genericCloseTime.UTC(), 685 }, 686 { 687 Address: "GDEOVUDLCYTO46D6GD6WH7BFESPBV5RACC6F6NUFCIRU7PL2XONQHVGJ", 688 Details: map[string]interface{}{ 689 "bought_amount": "0.0300000", 690 "bought_asset_code": "BRL", 691 "bought_asset_issuer": "GCXI6Q73J7F6EUSBZTPW4G4OUGVDHABPYF2U4KO7MVEX52OH5VMVUCRF", 692 "bought_asset_type": "credit_alphanum4", 693 "offer_id": xdr.Int64(10072128), 694 "seller": "GD3MMHD2YZWL5RAUWG6O3RMA5HTZYM7S3JLSZ2Z35JNJAWTDIKXY737V", 695 "seller_muxed": "MD3MMHD2YZWL5RAUWG6O3RMA5HTZYM7S3JLSZ2Z35JNJAWTDIKXY6AAAAAAMV7V2XZY4C", 696 "seller_muxed_id": uint64(0xcafebabe), 697 "sold_amount": "1.0000000", 698 "sold_asset_code": "ARS", 699 "sold_asset_issuer": "GCXI6Q73J7F6EUSBZTPW4G4OUGVDHABPYF2U4KO7MVEX52OH5VMVUCRF", 700 "sold_asset_type": "credit_alphanum4", 701 }, 702 Type: int32(EffectTrade), 703 TypeString: EffectTypeNames[EffectTrade], 704 OperationID: int64(85899350017), 705 LedgerClosed: genericCloseTime.UTC(), 706 }, 707 { 708 Address: "GD3MMHD2YZWL5RAUWG6O3RMA5HTZYM7S3JLSZ2Z35JNJAWTDIKXY737V", 709 AddressMuxed: null.StringFrom("MD3MMHD2YZWL5RAUWG6O3RMA5HTZYM7S3JLSZ2Z35JNJAWTDIKXY6AAAAAAMV7V2XZY4C"), 710 Details: map[string]interface{}{ 711 "bought_amount": "1.0000000", 712 "bought_asset_code": "ARS", 713 "bought_asset_issuer": "GCXI6Q73J7F6EUSBZTPW4G4OUGVDHABPYF2U4KO7MVEX52OH5VMVUCRF", 714 "bought_asset_type": "credit_alphanum4", 715 "offer_id": xdr.Int64(10072128), 716 "seller": "GDEOVUDLCYTO46D6GD6WH7BFESPBV5RACC6F6NUFCIRU7PL2XONQHVGJ", 717 "sold_amount": "0.0300000", 718 "sold_asset_code": "BRL", 719 "sold_asset_issuer": "GCXI6Q73J7F6EUSBZTPW4G4OUGVDHABPYF2U4KO7MVEX52OH5VMVUCRF", 720 "sold_asset_type": "credit_alphanum4", 721 }, 722 Type: int32(EffectOfferUpdated), 723 TypeString: EffectTypeNames[EffectOfferUpdated], 724 OperationID: int64(85899350017), 725 LedgerClosed: genericCloseTime.UTC(), 726 }, 727 { 728 Address: "GDEOVUDLCYTO46D6GD6WH7BFESPBV5RACC6F6NUFCIRU7PL2XONQHVGJ", 729 Details: map[string]interface{}{ 730 "bought_amount": "0.0300000", 731 "bought_asset_code": "BRL", 732 "bought_asset_issuer": "GCXI6Q73J7F6EUSBZTPW4G4OUGVDHABPYF2U4KO7MVEX52OH5VMVUCRF", 733 "bought_asset_type": "credit_alphanum4", 734 "offer_id": xdr.Int64(10072128), 735 "seller": "GD3MMHD2YZWL5RAUWG6O3RMA5HTZYM7S3JLSZ2Z35JNJAWTDIKXY737V", 736 "seller_muxed": "MD3MMHD2YZWL5RAUWG6O3RMA5HTZYM7S3JLSZ2Z35JNJAWTDIKXY6AAAAAAMV7V2XZY4C", 737 "seller_muxed_id": uint64(0xcafebabe), 738 "sold_amount": "1.0000000", 739 "sold_asset_code": "ARS", 740 "sold_asset_issuer": "GCXI6Q73J7F6EUSBZTPW4G4OUGVDHABPYF2U4KO7MVEX52OH5VMVUCRF", 741 "sold_asset_type": "credit_alphanum4", 742 }, 743 Type: int32(EffectOfferUpdated), 744 TypeString: EffectTypeNames[EffectOfferUpdated], 745 OperationID: int64(85899350017), 746 LedgerClosed: genericCloseTime.UTC(), 747 }, 748 { 749 Address: "GD3MMHD2YZWL5RAUWG6O3RMA5HTZYM7S3JLSZ2Z35JNJAWTDIKXY737V", 750 AddressMuxed: null.StringFrom("MD3MMHD2YZWL5RAUWG6O3RMA5HTZYM7S3JLSZ2Z35JNJAWTDIKXY6AAAAAAMV7V2XZY4C"), 751 Details: map[string]interface{}{ 752 "bought_amount": "1.0000000", 753 "bought_asset_code": "ARS", 754 "bought_asset_issuer": "GCXI6Q73J7F6EUSBZTPW4G4OUGVDHABPYF2U4KO7MVEX52OH5VMVUCRF", 755 "bought_asset_type": "credit_alphanum4", 756 "offer_id": xdr.Int64(10072128), 757 "seller": "GDEOVUDLCYTO46D6GD6WH7BFESPBV5RACC6F6NUFCIRU7PL2XONQHVGJ", 758 "sold_amount": "0.0300000", 759 "sold_asset_code": "BRL", 760 "sold_asset_issuer": "GCXI6Q73J7F6EUSBZTPW4G4OUGVDHABPYF2U4KO7MVEX52OH5VMVUCRF", 761 "sold_asset_type": "credit_alphanum4", 762 }, 763 Type: int32(EffectOfferRemoved), 764 TypeString: EffectTypeNames[EffectOfferRemoved], 765 OperationID: int64(85899350017), 766 LedgerClosed: genericCloseTime.UTC(), 767 }, 768 { 769 Address: "GDEOVUDLCYTO46D6GD6WH7BFESPBV5RACC6F6NUFCIRU7PL2XONQHVGJ", 770 Details: map[string]interface{}{ 771 "bought_amount": "0.0300000", 772 "bought_asset_code": "BRL", 773 "bought_asset_issuer": "GCXI6Q73J7F6EUSBZTPW4G4OUGVDHABPYF2U4KO7MVEX52OH5VMVUCRF", 774 "bought_asset_type": "credit_alphanum4", 775 "offer_id": xdr.Int64(10072128), 776 "seller": "GD3MMHD2YZWL5RAUWG6O3RMA5HTZYM7S3JLSZ2Z35JNJAWTDIKXY737V", 777 "seller_muxed": "MD3MMHD2YZWL5RAUWG6O3RMA5HTZYM7S3JLSZ2Z35JNJAWTDIKXY6AAAAAAMV7V2XZY4C", 778 "seller_muxed_id": uint64(0xcafebabe), 779 "sold_amount": "1.0000000", 780 "sold_asset_code": "ARS", 781 "sold_asset_issuer": "GCXI6Q73J7F6EUSBZTPW4G4OUGVDHABPYF2U4KO7MVEX52OH5VMVUCRF", 782 "sold_asset_type": "credit_alphanum4", 783 }, 784 Type: int32(EffectOfferRemoved), 785 TypeString: EffectTypeNames[EffectOfferRemoved], 786 OperationID: int64(85899350017), 787 LedgerClosed: genericCloseTime.UTC(), 788 }, 789 }, 790 }, 791 { 792 desc: "manageSellOffer - without claims", 793 envelopeXDR: "AAAAAC7C83M2T23Bu4kdQGqdfboZgjcxsJ2lBT23ifoRVFexAAAAZAAAABAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAALsLzczZPbcG7iR1Aap19uhmCNzGwnaUFPbeJ+hFUV7EAAAAA7msoAAAAAAEAAAACAAAAAAAAAAAAAAAAAAAAARFUV7EAAABALuai5QxceFbtAiC5nkntNVnvSPeWR+C+FgplPAdRgRS+PPESpUiSCyuiwuhmvuDw7kwxn+A6E0M4ca1s2qzMAg==", 794 resultXDR: "AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAC7C83M2T23Bu4kdQGqdfboZgjcxsJ2lBT23ifoRVFexAAAAAAAAAAEAAAAAAAAAAVVTRAAAAAAALsLzczZPbcG7iR1Aap19uhmCNzGwnaUFPbeJ+hFUV7EAAAAA7msoAAAAAAEAAAACAAAAAAAAAAAAAAAA", 795 metaXDR: "AAAAAQAAAAIAAAADAAAAEgAAAAAAAAAALsLzczZPbcG7iR1Aap19uhmCNzGwnaUFPbeJ+hFUV7EAAAACVAvi1AAAABAAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAEgAAAAAAAAAALsLzczZPbcG7iR1Aap19uhmCNzGwnaUFPbeJ+hFUV7EAAAACVAvi1AAAABAAAAACAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAASAAAAAAAAAAAuwvNzNk9twbuJHUBqnX26GYI3MbCdpQU9t4n6EVRXsQAAAAJUC+LUAAAAEAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAASAAAAAAAAAAAuwvNzNk9twbuJHUBqnX26GYI3MbCdpQU9t4n6EVRXsQAAAAJUC+LUAAAAEAAAAAIAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAAA7msoAAAAAAAAAAAAAAAAAAAAABIAAAACAAAAAC7C83M2T23Bu4kdQGqdfboZgjcxsJ2lBT23ifoRVFexAAAAAAAAAAEAAAAAAAAAAVVTRAAAAAAALsLzczZPbcG7iR1Aap19uhmCNzGwnaUFPbeJ+hFUV7EAAAAA7msoAAAAAAEAAAACAAAAAAAAAAAAAAAA", 796 feeChangesXDR: "AAAAAgAAAAMAAAASAAAAAAAAAAAuwvNzNk9twbuJHUBqnX26GYI3MbCdpQU9t4n6EVRXsQAAAAJUC+OcAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAASAAAAAAAAAAAuwvNzNk9twbuJHUBqnX26GYI3MbCdpQU9t4n6EVRXsQAAAAJUC+M4AAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==", 797 hash: "ca756d1519ceda79f8722042b12cea7ba004c3bd961adb62b59f88a867f86eb3", 798 index: 0, 799 sequence: 56, 800 expected: []EffectOutput{}, 801 }, 802 { 803 desc: "manageSellOffer - with claims", 804 envelopeXDR: "AAAAAPrjQnnOn4RqMmOSDwYfEMVtJuC4VR9fKvPfEtM7DS7VAAAAZAAMDl8AAAADAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVNUUgAAAAAASYK2XlJiUiNav1waFVDq1fzoualYC4UNFqThKBroJe0AAAACVAvkAAAAAGMAAADIAAAAAAAAAAAAAAAAAAAAATsNLtUAAABABmA0aLobgdSrjIrus94Y8PWeD6dDfl7Sya12t2uZasJFI7mZ+yowE1enUMzC/cAhDTypK8QuH2EVXPQC3xpYDA==", 805 resultXDR: "AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAEAAAAADkfaGg9y56NND7n4CRcr4R4fvivwAcMd4ZrCm4jAe5AAAAAAAI0f+AAAAAFTVFIAAAAAAEmCtl5SYlIjWr9cGhVQ6tX86LmpWAuFDRak4Sga6CXtAAAAAS0Il1oAAAAAAAAAAlQL4/8AAAACAAAAAA==", 806 metaXDR: "AAAAAQAAAAIAAAADAAxMfwAAAAAAAAAA+uNCec6fhGoyY5IPBh8QxW0m4LhVH18q898S0zsNLtUAAAAU9GsC1QAMDl8AAAACAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAxMfwAAAAAAAAAA+uNCec6fhGoyY5IPBh8QxW0m4LhVH18q898S0zsNLtUAAAAU9GsC1QAMDl8AAAADAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAACgAAAAMADEx+AAAAAgAAAAAOR9oaD3Lno00PufgJFyvhHh++K/ABwx3hmsKbiMB7kAAAAAAAjR/4AAAAAVNUUgAAAAAASYK2XlJiUiNav1waFVDq1fzoualYC4UNFqThKBroJe0AAAAAAAAAA2L6BdYAAABjAAAAMgAAAAAAAAAAAAAAAAAAAAEADEx/AAAAAgAAAAAOR9oaD3Lno00PufgJFyvhHh++K/ABwx3hmsKbiMB7kAAAAAAAjR/4AAAAAVNUUgAAAAAASYK2XlJiUiNav1waFVDq1fzoualYC4UNFqThKBroJe0AAAAAAAAAAjXxbnwAAABjAAAAMgAAAAAAAAAAAAAAAAAAAAMADEx+AAAAAAAAAAAOR9oaD3Lno00PufgJFyvhHh++K/ABwx3hmsKbiMB7kAAAABnMMdMvAAwOZQAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAABrSdIAkAAAAAAAAAAAAAAAAAAAAAAAAAAQAMTH8AAAAAAAAAAA5H2hoPcuejTQ+5+AkXK+EeH74r8AHDHeGawpuIwHuQAAAAHCA9ty4ADA5lAAAAAgAAAAIAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAEAAAAEYJE8CgAAAAAAAAAAAAAAAAAAAAAAAAADAAxMfgAAAAEAAAAADkfaGg9y56NND7n4CRcr4R4fvivwAcMd4ZrCm4jAe5AAAAABU1RSAAAAAABJgrZeUmJSI1q/XBoVUOrV/Oi5qVgLhQ0WpOEoGugl7QAAABYDWSXWf/////////8AAAABAAAAAQAAAAAAAAAAAAAAA2L6BdYAAAAAAAAAAAAAAAEADEx/AAAAAQAAAAAOR9oaD3Lno00PufgJFyvhHh++K/ABwx3hmsKbiMB7kAAAAAFTVFIAAAAAAEmCtl5SYlIjWr9cGhVQ6tX86LmpWAuFDRak4Sga6CXtAAAAFNZQjnx//////////wAAAAEAAAABAAAAAAAAAAAAAAACNfFufAAAAAAAAAAAAAAAAwAMDnEAAAABAAAAAPrjQnnOn4RqMmOSDwYfEMVtJuC4VR9fKvPfEtM7DS7VAAAAAVNUUgAAAAAASYK2XlJiUiNav1waFVDq1fzoualYC4UNFqThKBroJe0AAAAYdX9/Wn//////////AAAAAQAAAAAAAAAAAAAAAQAMTH8AAAABAAAAAPrjQnnOn4RqMmOSDwYfEMVtJuC4VR9fKvPfEtM7DS7VAAAAAVNUUgAAAAAASYK2XlJiUiNav1waFVDq1fzoualYC4UNFqThKBroJe0AAAAZoogWtH//////////AAAAAQAAAAAAAAAAAAAAAwAMTH8AAAAAAAAAAPrjQnnOn4RqMmOSDwYfEMVtJuC4VR9fKvPfEtM7DS7VAAAAFPRrAtUADA5fAAAAAwAAAAEAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAQAMTH8AAAAAAAAAAPrjQnnOn4RqMmOSDwYfEMVtJuC4VR9fKvPfEtM7DS7VAAAAEqBfHtYADA5fAAAAAwAAAAEAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAA", 807 feeChangesXDR: "AAAAAgAAAAMADA5xAAAAAAAAAAD640J5zp+EajJjkg8GHxDFbSbguFUfXyrz3xLTOw0u1QAAABT0awM5AAwOXwAAAAIAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEADEx/AAAAAAAAAAD640J5zp+EajJjkg8GHxDFbSbguFUfXyrz3xLTOw0u1QAAABT0awLVAAwOXwAAAAIAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==", 808 hash: "ef62da32b6b3eb3c4534dac2be1088387fb93b0093b47e113073c1431fac9db7", 809 index: 0, 810 sequence: 56, 811 expected: []EffectOutput{ 812 { 813 Address: "GD5OGQTZZ2PYI2RSMOJA6BQ7CDCW2JXAXBKR6XZK6PPRFUZ3BUXNLFKP", 814 Details: map[string]interface{}{ 815 "bought_amount": "505.0505050", 816 "bought_asset_code": "STR", 817 "bought_asset_issuer": "GBEYFNS6KJRFEI22X5OBUFKQ5LK7Z2FZVFMAXBINC2SOCKA25AS62PUN", 818 "bought_asset_type": "credit_alphanum4", 819 "offer_id": xdr.Int64(9248760), 820 "seller": "GAHEPWQ2B5ZOPI2NB647QCIXFPQR4H56FPYADQY54GNMFG4IYB5ZAJ5H", 821 "sold_amount": "999.9999999", 822 "sold_asset_type": "native", 823 }, 824 Type: int32(EffectTrade), 825 TypeString: EffectTypeNames[EffectTrade], 826 OperationID: int64(240518172673), 827 LedgerClosed: genericCloseTime.UTC(), 828 }, 829 { 830 Address: "GAHEPWQ2B5ZOPI2NB647QCIXFPQR4H56FPYADQY54GNMFG4IYB5ZAJ5H", 831 Details: map[string]interface{}{ 832 "bought_amount": "999.9999999", 833 "bought_asset_type": "native", 834 "offer_id": xdr.Int64(9248760), 835 "seller": "GD5OGQTZZ2PYI2RSMOJA6BQ7CDCW2JXAXBKR6XZK6PPRFUZ3BUXNLFKP", 836 "sold_amount": "505.0505050", 837 "sold_asset_code": "STR", 838 "sold_asset_issuer": "GBEYFNS6KJRFEI22X5OBUFKQ5LK7Z2FZVFMAXBINC2SOCKA25AS62PUN", 839 "sold_asset_type": "credit_alphanum4", 840 }, 841 Type: int32(EffectTrade), 842 TypeString: EffectTypeNames[EffectTrade], 843 OperationID: int64(240518172673), 844 LedgerClosed: genericCloseTime.UTC(), 845 }, 846 { 847 Address: "GD5OGQTZZ2PYI2RSMOJA6BQ7CDCW2JXAXBKR6XZK6PPRFUZ3BUXNLFKP", 848 Details: map[string]interface{}{ 849 "bought_amount": "505.0505050", 850 "bought_asset_code": "STR", 851 "bought_asset_issuer": "GBEYFNS6KJRFEI22X5OBUFKQ5LK7Z2FZVFMAXBINC2SOCKA25AS62PUN", 852 "bought_asset_type": "credit_alphanum4", 853 "offer_id": xdr.Int64(9248760), 854 "seller": "GAHEPWQ2B5ZOPI2NB647QCIXFPQR4H56FPYADQY54GNMFG4IYB5ZAJ5H", 855 "sold_amount": "999.9999999", 856 "sold_asset_type": "native", 857 }, 858 Type: int32(EffectOfferUpdated), 859 TypeString: EffectTypeNames[EffectOfferUpdated], 860 OperationID: int64(240518172673), 861 LedgerClosed: genericCloseTime.UTC(), 862 }, 863 { 864 Address: "GAHEPWQ2B5ZOPI2NB647QCIXFPQR4H56FPYADQY54GNMFG4IYB5ZAJ5H", 865 Details: map[string]interface{}{ 866 "bought_amount": "999.9999999", 867 "bought_asset_type": "native", 868 "offer_id": xdr.Int64(9248760), 869 "seller": "GD5OGQTZZ2PYI2RSMOJA6BQ7CDCW2JXAXBKR6XZK6PPRFUZ3BUXNLFKP", 870 "sold_amount": "505.0505050", 871 "sold_asset_code": "STR", 872 "sold_asset_issuer": "GBEYFNS6KJRFEI22X5OBUFKQ5LK7Z2FZVFMAXBINC2SOCKA25AS62PUN", 873 "sold_asset_type": "credit_alphanum4", 874 }, 875 Type: int32(EffectOfferUpdated), 876 TypeString: EffectTypeNames[EffectOfferUpdated], 877 OperationID: int64(240518172673), 878 LedgerClosed: genericCloseTime.UTC(), 879 }, 880 { 881 Address: "GD5OGQTZZ2PYI2RSMOJA6BQ7CDCW2JXAXBKR6XZK6PPRFUZ3BUXNLFKP", 882 Details: map[string]interface{}{ 883 "bought_amount": "505.0505050", 884 "bought_asset_code": "STR", 885 "bought_asset_issuer": "GBEYFNS6KJRFEI22X5OBUFKQ5LK7Z2FZVFMAXBINC2SOCKA25AS62PUN", 886 "bought_asset_type": "credit_alphanum4", 887 "offer_id": xdr.Int64(9248760), 888 "seller": "GAHEPWQ2B5ZOPI2NB647QCIXFPQR4H56FPYADQY54GNMFG4IYB5ZAJ5H", 889 "sold_amount": "999.9999999", 890 "sold_asset_type": "native", 891 }, 892 Type: int32(EffectOfferRemoved), 893 TypeString: EffectTypeNames[EffectOfferRemoved], 894 OperationID: int64(240518172673), 895 LedgerClosed: genericCloseTime.UTC(), 896 }, 897 { 898 Address: "GAHEPWQ2B5ZOPI2NB647QCIXFPQR4H56FPYADQY54GNMFG4IYB5ZAJ5H", 899 Details: map[string]interface{}{ 900 "bought_amount": "999.9999999", 901 "bought_asset_type": "native", 902 "offer_id": xdr.Int64(9248760), 903 "seller": "GD5OGQTZZ2PYI2RSMOJA6BQ7CDCW2JXAXBKR6XZK6PPRFUZ3BUXNLFKP", 904 "sold_amount": "505.0505050", 905 "sold_asset_code": "STR", 906 "sold_asset_issuer": "GBEYFNS6KJRFEI22X5OBUFKQ5LK7Z2FZVFMAXBINC2SOCKA25AS62PUN", 907 "sold_asset_type": "credit_alphanum4", 908 }, 909 Type: int32(EffectOfferRemoved), 910 TypeString: EffectTypeNames[EffectOfferRemoved], 911 OperationID: int64(240518172673), 912 LedgerClosed: genericCloseTime.UTC(), 913 }, 914 { 915 Address: "GD5OGQTZZ2PYI2RSMOJA6BQ7CDCW2JXAXBKR6XZK6PPRFUZ3BUXNLFKP", 916 Details: map[string]interface{}{ 917 "bought_amount": "505.0505050", 918 "bought_asset_code": "STR", 919 "bought_asset_issuer": "GBEYFNS6KJRFEI22X5OBUFKQ5LK7Z2FZVFMAXBINC2SOCKA25AS62PUN", 920 "bought_asset_type": "credit_alphanum4", 921 "offer_id": xdr.Int64(9248760), 922 "seller": "GAHEPWQ2B5ZOPI2NB647QCIXFPQR4H56FPYADQY54GNMFG4IYB5ZAJ5H", 923 "sold_amount": "999.9999999", 924 "sold_asset_type": "native", 925 }, 926 Type: int32(EffectOfferCreated), 927 TypeString: EffectTypeNames[EffectOfferCreated], 928 OperationID: int64(240518172673), 929 LedgerClosed: genericCloseTime.UTC(), 930 }, 931 { 932 Address: "GAHEPWQ2B5ZOPI2NB647QCIXFPQR4H56FPYADQY54GNMFG4IYB5ZAJ5H", 933 Details: map[string]interface{}{ 934 "bought_amount": "999.9999999", 935 "bought_asset_type": "native", 936 "offer_id": xdr.Int64(9248760), 937 "seller": "GD5OGQTZZ2PYI2RSMOJA6BQ7CDCW2JXAXBKR6XZK6PPRFUZ3BUXNLFKP", 938 "sold_amount": "505.0505050", 939 "sold_asset_code": "STR", 940 "sold_asset_issuer": "GBEYFNS6KJRFEI22X5OBUFKQ5LK7Z2FZVFMAXBINC2SOCKA25AS62PUN", 941 "sold_asset_type": "credit_alphanum4", 942 }, 943 Type: int32(EffectOfferCreated), 944 TypeString: EffectTypeNames[EffectOfferCreated], 945 OperationID: int64(240518172673), 946 LedgerClosed: genericCloseTime.UTC(), 947 }, 948 }, 949 }, 950 { 951 desc: "manageBuyOffer - with claims", 952 envelopeXDR: "AAAAAEotqBM9oOzudkkctgQlY/PHS0rFcxVasWQVnSytiuBEAAAAZAANIfEAAAADAAAAAAAAAAAAAAABAAAAAAAAAAwAAAAAAAAAAlRYVGFscGhhNAAAAAAAAABKLagTPaDs7nZJHLYEJWPzx0tKxXMVWrFkFZ0srYrgRAAAAAB3NZQAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAABrYrgRAAAAEAh57TBifjJuUPj1TI7zIvaAZmyRjWLY4ktc0F16Knmy4Fw07L7cC5vCwjn4ZXyrgr9bpEGhv4oN6znbPpNLQUH", 953 resultXDR: "AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAMAAAAAAAAAAEAAAAAgbI9jY68fYXd6+DwMcZQQIYCK4HsKKvqnR5o+1IdVoUAAAAAAJovcgAAAAJUWFRhbHBoYTQAAAAAAAAASi2oEz2g7O52SRy2BCVj88dLSsVzFVqxZBWdLK2K4EQAAAAAdzWUAAAAAAAAAAAAdzWUAAAAAAIAAAAA", 954 metaXDR: "AAAAAQAAAAIAAAADAA0pGAAAAAAAAAAASi2oEz2g7O52SRy2BCVj88dLSsVzFVqxZBWdLK2K4EQAAAAXSHbm1AANIfEAAAACAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAA0pGAAAAAAAAAAASi2oEz2g7O52SRy2BCVj88dLSsVzFVqxZBWdLK2K4EQAAAAXSHbm1AANIfEAAAADAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAACAAAAAMADSkYAAAAAAAAAABKLagTPaDs7nZJHLYEJWPzx0tKxXMVWrFkFZ0srYrgRAAAABdIdubUAA0h8QAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEADSkYAAAAAAAAAABKLagTPaDs7nZJHLYEJWPzx0tKxXMVWrFkFZ0srYrgRAAAABbRQVLUAA0h8QAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAMADSjEAAAAAgAAAACBsj2Njrx9hd3r4PAxxlBAhgIrgewoq+qdHmj7Uh1WhQAAAAAAmi9yAAAAAlRYVGFscGhhNAAAAAAAAABKLagTPaDs7nZJHLYEJWPzx0tKxXMVWrFkFZ0srYrgRAAAAAAAAAAAstBeAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQANKRgAAAACAAAAAIGyPY2OvH2F3evg8DHGUECGAiuB7Cir6p0eaPtSHVaFAAAAAACaL3IAAAACVFhUYWxwaGE0AAAAAAAAAEotqBM9oOzudkkctgQlY/PHS0rFcxVasWQVnSytiuBEAAAAAAAAAAA7msoAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAADAA0oxAAAAAAAAAAAgbI9jY68fYXd6+DwMcZQQIYCK4HsKKvqnR5o+1IdVoUAAAAZJU0xXAANGSMAAAARAAAABAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQADMowLgdQAAAAAAAAAAAAAAAAAAAAAAAAAAAEADSkYAAAAAAAAAACBsj2Njrx9hd3r4PAxxlBAhgIrgewoq+qdHmj7Uh1WhQAAABmcgsVcAA0ZIwAAABEAAAAEAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAMyi5RMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAwANKMQAAAABAAAAAIGyPY2OvH2F3evg8DHGUECGAiuB7Cir6p0eaPtSHVaFAAAAAlRYVGFscGhhNAAAAAAAAABKLagTPaDs7nZJHLYEJWPzx0tKxXMVWrFkFZ0srYrgRAAACRatNxoAf/////////8AAAABAAAAAQAAAAAAAAAAAAAAALLQXgAAAAAAAAAAAAAAAAEADSkYAAAAAQAAAACBsj2Njrx9hd3r4PAxxlBAhgIrgewoq+qdHmj7Uh1WhQAAAAJUWFRhbHBoYTQAAAAAAAAASi2oEz2g7O52SRy2BCVj88dLSsVzFVqxZBWdLK2K4EQAAAkWNgGGAH//////////AAAAAQAAAAEAAAAAAAAAAAAAAAA7msoAAAAAAAAAAAA=", 955 feeChangesXDR: "AAAAAgAAAAMADSSgAAAAAAAAAABKLagTPaDs7nZJHLYEJWPzx0tKxXMVWrFkFZ0srYrgRAAAABdIduc4AA0h8QAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEADSkYAAAAAAAAAABKLagTPaDs7nZJHLYEJWPzx0tKxXMVWrFkFZ0srYrgRAAAABdIdubUAA0h8QAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==", 956 hash: "9caa91eec6e29730f4aabafb60898a8ecedd3bf67b8628e6e32066fbba9bec5d", 957 index: 0, 958 sequence: 56, 959 expected: []EffectOutput{ 960 { 961 Address: "GBFC3KATHWQOZ3TWJEOLMBBFMPZ4OS2KYVZRKWVRMQKZ2LFNRLQEIRCV", 962 Details: map[string]interface{}{ 963 "bought_amount": "200.0000000", 964 "bought_asset_code": "TXTalpha4", 965 "bought_asset_issuer": "GBFC3KATHWQOZ3TWJEOLMBBFMPZ4OS2KYVZRKWVRMQKZ2LFNRLQEIRCV", 966 "bought_asset_type": "credit_alphanum12", 967 "offer_id": xdr.Int64(10104690), 968 "seller": "GCA3EPMNR26H3BO55PQPAMOGKBAIMARLQHWCRK7KTUPGR62SDVLIL7D6", 969 "sold_amount": "200.0000000", 970 "sold_asset_type": "native", 971 }, 972 Type: int32(EffectTrade), 973 TypeString: EffectTypeNames[EffectTrade], 974 OperationID: int64(240518172673), 975 LedgerClosed: genericCloseTime.UTC(), 976 }, 977 { 978 Address: "GCA3EPMNR26H3BO55PQPAMOGKBAIMARLQHWCRK7KTUPGR62SDVLIL7D6", 979 Details: map[string]interface{}{ 980 "bought_amount": "200.0000000", 981 "bought_asset_type": "native", 982 "offer_id": xdr.Int64(10104690), 983 "seller": "GBFC3KATHWQOZ3TWJEOLMBBFMPZ4OS2KYVZRKWVRMQKZ2LFNRLQEIRCV", 984 "sold_amount": "200.0000000", 985 "sold_asset_code": "TXTalpha4", 986 "sold_asset_issuer": "GBFC3KATHWQOZ3TWJEOLMBBFMPZ4OS2KYVZRKWVRMQKZ2LFNRLQEIRCV", 987 "sold_asset_type": "credit_alphanum12", 988 }, 989 Type: int32(EffectTrade), 990 TypeString: EffectTypeNames[EffectTrade], 991 OperationID: int64(240518172673), 992 LedgerClosed: genericCloseTime.UTC(), 993 }, 994 { 995 Address: "GBFC3KATHWQOZ3TWJEOLMBBFMPZ4OS2KYVZRKWVRMQKZ2LFNRLQEIRCV", 996 Details: map[string]interface{}{ 997 "bought_amount": "200.0000000", 998 "bought_asset_code": "TXTalpha4", 999 "bought_asset_issuer": "GBFC3KATHWQOZ3TWJEOLMBBFMPZ4OS2KYVZRKWVRMQKZ2LFNRLQEIRCV", 1000 "bought_asset_type": "credit_alphanum12", 1001 "offer_id": xdr.Int64(10104690), 1002 "seller": "GCA3EPMNR26H3BO55PQPAMOGKBAIMARLQHWCRK7KTUPGR62SDVLIL7D6", 1003 "sold_amount": "200.0000000", 1004 "sold_asset_type": "native", 1005 }, 1006 Type: int32(EffectOfferUpdated), 1007 TypeString: EffectTypeNames[EffectOfferUpdated], 1008 OperationID: int64(240518172673), 1009 LedgerClosed: genericCloseTime.UTC(), 1010 }, 1011 { 1012 Address: "GCA3EPMNR26H3BO55PQPAMOGKBAIMARLQHWCRK7KTUPGR62SDVLIL7D6", 1013 Details: map[string]interface{}{ 1014 "bought_amount": "200.0000000", 1015 "bought_asset_type": "native", 1016 "offer_id": xdr.Int64(10104690), 1017 "seller": "GBFC3KATHWQOZ3TWJEOLMBBFMPZ4OS2KYVZRKWVRMQKZ2LFNRLQEIRCV", 1018 "sold_amount": "200.0000000", 1019 "sold_asset_code": "TXTalpha4", 1020 "sold_asset_issuer": "GBFC3KATHWQOZ3TWJEOLMBBFMPZ4OS2KYVZRKWVRMQKZ2LFNRLQEIRCV", 1021 "sold_asset_type": "credit_alphanum12", 1022 }, 1023 Type: int32(EffectOfferUpdated), 1024 TypeString: EffectTypeNames[EffectOfferUpdated], 1025 OperationID: int64(240518172673), 1026 LedgerClosed: genericCloseTime.UTC(), 1027 }, 1028 { 1029 Address: "GBFC3KATHWQOZ3TWJEOLMBBFMPZ4OS2KYVZRKWVRMQKZ2LFNRLQEIRCV", 1030 Details: map[string]interface{}{ 1031 "bought_amount": "200.0000000", 1032 "bought_asset_code": "TXTalpha4", 1033 "bought_asset_issuer": "GBFC3KATHWQOZ3TWJEOLMBBFMPZ4OS2KYVZRKWVRMQKZ2LFNRLQEIRCV", 1034 "bought_asset_type": "credit_alphanum12", 1035 "offer_id": xdr.Int64(10104690), 1036 "seller": "GCA3EPMNR26H3BO55PQPAMOGKBAIMARLQHWCRK7KTUPGR62SDVLIL7D6", 1037 "sold_amount": "200.0000000", 1038 "sold_asset_type": "native", 1039 }, 1040 Type: int32(EffectOfferRemoved), 1041 TypeString: EffectTypeNames[EffectOfferRemoved], 1042 OperationID: int64(240518172673), 1043 LedgerClosed: genericCloseTime.UTC(), 1044 }, 1045 { 1046 Address: "GCA3EPMNR26H3BO55PQPAMOGKBAIMARLQHWCRK7KTUPGR62SDVLIL7D6", 1047 Details: map[string]interface{}{ 1048 "bought_amount": "200.0000000", 1049 "bought_asset_type": "native", 1050 "offer_id": xdr.Int64(10104690), 1051 "seller": "GBFC3KATHWQOZ3TWJEOLMBBFMPZ4OS2KYVZRKWVRMQKZ2LFNRLQEIRCV", 1052 "sold_amount": "200.0000000", 1053 "sold_asset_code": "TXTalpha4", 1054 "sold_asset_issuer": "GBFC3KATHWQOZ3TWJEOLMBBFMPZ4OS2KYVZRKWVRMQKZ2LFNRLQEIRCV", 1055 "sold_asset_type": "credit_alphanum12", 1056 }, 1057 Type: int32(EffectOfferRemoved), 1058 TypeString: EffectTypeNames[EffectOfferRemoved], 1059 OperationID: int64(240518172673), 1060 LedgerClosed: genericCloseTime.UTC(), 1061 }, 1062 { 1063 Address: "GBFC3KATHWQOZ3TWJEOLMBBFMPZ4OS2KYVZRKWVRMQKZ2LFNRLQEIRCV", 1064 Details: map[string]interface{}{ 1065 "bought_amount": "200.0000000", 1066 "bought_asset_code": "TXTalpha4", 1067 "bought_asset_issuer": "GBFC3KATHWQOZ3TWJEOLMBBFMPZ4OS2KYVZRKWVRMQKZ2LFNRLQEIRCV", 1068 "bought_asset_type": "credit_alphanum12", 1069 "offer_id": xdr.Int64(10104690), 1070 "seller": "GCA3EPMNR26H3BO55PQPAMOGKBAIMARLQHWCRK7KTUPGR62SDVLIL7D6", 1071 "sold_amount": "200.0000000", 1072 "sold_asset_type": "native", 1073 }, 1074 Type: int32(EffectOfferCreated), 1075 TypeString: EffectTypeNames[EffectOfferCreated], 1076 OperationID: int64(240518172673), 1077 LedgerClosed: genericCloseTime.UTC(), 1078 }, 1079 { 1080 Address: "GCA3EPMNR26H3BO55PQPAMOGKBAIMARLQHWCRK7KTUPGR62SDVLIL7D6", 1081 Details: map[string]interface{}{ 1082 "bought_amount": "200.0000000", 1083 "bought_asset_type": "native", 1084 "offer_id": xdr.Int64(10104690), 1085 "seller": "GBFC3KATHWQOZ3TWJEOLMBBFMPZ4OS2KYVZRKWVRMQKZ2LFNRLQEIRCV", 1086 "sold_amount": "200.0000000", 1087 "sold_asset_code": "TXTalpha4", 1088 "sold_asset_issuer": "GBFC3KATHWQOZ3TWJEOLMBBFMPZ4OS2KYVZRKWVRMQKZ2LFNRLQEIRCV", 1089 "sold_asset_type": "credit_alphanum12", 1090 }, 1091 Type: int32(EffectOfferCreated), 1092 TypeString: EffectTypeNames[EffectOfferCreated], 1093 OperationID: int64(240518172673), 1094 LedgerClosed: genericCloseTime.UTC(), 1095 }, 1096 }, 1097 }, 1098 { 1099 desc: "createPassiveSellOffer", 1100 envelopeXDR: "AAAAAAHwZwJPu1TJhQGgsLRXBzcIeySkeGXzEqh0W9AHWvFDAAAAZAAN3tMAAAACAAAAAQAAAAAAAAAAAAAAAF4FBqwAAAAAAAAAAQAAAAAAAAAEAAAAAAAAAAFDT1AAAAAAALly/iTceP/82O3aZAmd8hyqUjYAANfc5RfN0/iibCtTAAAAADuaygAAAAAJAAAACgAAAAAAAAABB1rxQwAAAEDz2JIw8Z3Owoc5c2tsiY3kzOYUmh32155u00Xs+RYxO5fL0ApYd78URHcYCbe0R32YmuLTfefWQStR3RfhqKAL", 1101 resultXDR: "AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAEAAAAAMgQ65fmCczzuwmU3oQLivASzvZdhzjhJOQ6C+xTSDu8AAAAAAKMvZgAAAAFDT1AAAAAAALly/iTceP/82O3aZAmd8hyqUjYAANfc5RfN0/iibCtTAAAA6NSlEAAAAAAAAAAAADuaygAAAAACAAAAAA==", 1102 metaXDR: "AAAAAQAAAAIAAAADAA3fGgAAAAAAAAAAAfBnAk+7VMmFAaCwtFcHNwh7JKR4ZfMSqHRb0Ada8UMAAAAXSHbnOAAN3tMAAAABAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAA3fGgAAAAAAAAAAAfBnAk+7VMmFAaCwtFcHNwh7JKR4ZfMSqHRb0Ada8UMAAAAXSHbnOAAN3tMAAAACAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAACgAAAAMADd72AAAAAgAAAAAyBDrl+YJzPO7CZTehAuK8BLO9l2HOOEk5DoL7FNIO7wAAAAAAoy9mAAAAAUNPUAAAAAAAuXL+JNx4//zY7dpkCZ3yHKpSNgAA19zlF83T+KJsK1MAAAAAAAAA6NSlEAAAAAABAAAD6AAAAAAAAAAAAAAAAAAAAAIAAAACAAAAADIEOuX5gnM87sJlN6EC4rwEs72XYc44STkOgvsU0g7vAAAAAACjL2YAAAADAA3fGQAAAAAAAAAAMgQ65fmCczzuwmU3oQLivASzvZdhzjhJOQ6C+xTSDu8AAAAXSHbkfAAIGHsAAAAJAAAAAwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAB3NZQAAAAAAAAAAAAAAAAAAAAAAAAAAAEADd8aAAAAAAAAAAAyBDrl+YJzPO7CZTehAuK8BLO9l2HOOEk5DoL7FNIO7wAAABeEEa58AAgYewAAAAkAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAADuaygAAAAAAAAAAAAAAAAAAAAAAAAAAAwAN3xkAAAABAAAAADIEOuX5gnM87sJlN6EC4rwEs72XYc44STkOgvsU0g7vAAAAAUNPUAAAAAAAuXL+JNx4//zY7dpkCZ3yHKpSNgAA19zlF83T+KJsK1MAABI3mQjsAH//////////AAAAAQAAAAEAAAAAAAAAAAAAAdGpSiAAAAAAAAAAAAAAAAABAA3fGgAAAAEAAAAAMgQ65fmCczzuwmU3oQLivASzvZdhzjhJOQ6C+xTSDu8AAAABQ09QAAAAAAC5cv4k3Hj//Njt2mQJnfIcqlI2AADX3OUXzdP4omwrUwAAEU7EY9wAf/////////8AAAABAAAAAQAAAAAAAAAAAAAA6NSlEAAAAAAAAAAAAAAAAAMADd7UAAAAAQAAAAAB8GcCT7tUyYUBoLC0Vwc3CHskpHhl8xKodFvQB1rxQwAAAAFDT1AAAAAAALly/iTceP/82O3aZAmd8hyqUjYAANfc5RfN0/iibCtTAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAAAAAAEADd8aAAAAAQAAAAAB8GcCT7tUyYUBoLC0Vwc3CHskpHhl8xKodFvQB1rxQwAAAAFDT1AAAAAAALly/iTceP/82O3aZAmd8hyqUjYAANfc5RfN0/iibCtTAAAA6NSlEAB//////////wAAAAEAAAAAAAAAAAAAAAMADd8aAAAAAAAAAAAB8GcCT7tUyYUBoLC0Vwc3CHskpHhl8xKodFvQB1rxQwAAABdIduc4AA3e0wAAAAIAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEADd8aAAAAAAAAAAAB8GcCT7tUyYUBoLC0Vwc3CHskpHhl8xKodFvQB1rxQwAAABcM3B04AA3e0wAAAAIAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==", 1103 feeChangesXDR: "AAAAAgAAAAMADd7UAAAAAAAAAAAB8GcCT7tUyYUBoLC0Vwc3CHskpHhl8xKodFvQB1rxQwAAABdIduecAA3e0wAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEADd8aAAAAAAAAAAAB8GcCT7tUyYUBoLC0Vwc3CHskpHhl8xKodFvQB1rxQwAAABdIduc4AA3e0wAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==", 1104 hash: "e4b286344ae1c863ab15773ddf6649b08fe031383135194f8613a3a475c41a5a", 1105 index: 0, 1106 sequence: 56, 1107 expected: []EffectOutput{ 1108 { 1109 Address: "GAA7AZYCJ65VJSMFAGQLBNCXA43QQ6ZEUR4GL4YSVB2FXUAHLLYUHIO5", 1110 Details: map[string]interface{}{ 1111 "bought_amount": "100000.0000000", 1112 "bought_asset_code": "COP", 1113 "bought_asset_issuer": "GC4XF7RE3R4P77GY5XNGICM56IOKUURWAAANPXHFC7G5H6FCNQVVH3OH", 1114 "bought_asset_type": "credit_alphanum4", 1115 "offer_id": xdr.Int64(10694502), 1116 "seller": "GAZAIOXF7GBHGPHOYJSTPIIC4K6AJM55S5Q44OCJHEHIF6YU2IHO6VHU", 1117 "sold_amount": "100.0000000", 1118 "sold_asset_type": "native", 1119 }, 1120 Type: int32(EffectTrade), 1121 TypeString: EffectTypeNames[EffectTrade], 1122 OperationID: int64(240518172673), 1123 LedgerClosed: genericCloseTime.UTC(), 1124 }, 1125 { 1126 Address: "GAZAIOXF7GBHGPHOYJSTPIIC4K6AJM55S5Q44OCJHEHIF6YU2IHO6VHU", 1127 Details: map[string]interface{}{ 1128 "bought_amount": "100.0000000", 1129 "bought_asset_type": "native", 1130 "offer_id": xdr.Int64(10694502), 1131 "seller": "GAA7AZYCJ65VJSMFAGQLBNCXA43QQ6ZEUR4GL4YSVB2FXUAHLLYUHIO5", 1132 "sold_amount": "100000.0000000", 1133 "sold_asset_code": "COP", 1134 "sold_asset_issuer": "GC4XF7RE3R4P77GY5XNGICM56IOKUURWAAANPXHFC7G5H6FCNQVVH3OH", 1135 "sold_asset_type": "credit_alphanum4", 1136 }, 1137 Type: int32(EffectTrade), 1138 TypeString: EffectTypeNames[EffectTrade], 1139 OperationID: int64(240518172673), 1140 LedgerClosed: genericCloseTime.UTC(), 1141 }, 1142 { 1143 Address: "GAA7AZYCJ65VJSMFAGQLBNCXA43QQ6ZEUR4GL4YSVB2FXUAHLLYUHIO5", 1144 Details: map[string]interface{}{ 1145 "bought_amount": "100000.0000000", 1146 "bought_asset_code": "COP", 1147 "bought_asset_issuer": "GC4XF7RE3R4P77GY5XNGICM56IOKUURWAAANPXHFC7G5H6FCNQVVH3OH", 1148 "bought_asset_type": "credit_alphanum4", 1149 "offer_id": xdr.Int64(10694502), 1150 "seller": "GAZAIOXF7GBHGPHOYJSTPIIC4K6AJM55S5Q44OCJHEHIF6YU2IHO6VHU", 1151 "sold_amount": "100.0000000", 1152 "sold_asset_type": "native", 1153 }, 1154 Type: int32(EffectOfferUpdated), 1155 TypeString: EffectTypeNames[EffectOfferUpdated], 1156 OperationID: int64(240518172673), 1157 LedgerClosed: genericCloseTime.UTC(), 1158 }, 1159 { 1160 Address: "GAZAIOXF7GBHGPHOYJSTPIIC4K6AJM55S5Q44OCJHEHIF6YU2IHO6VHU", 1161 Details: map[string]interface{}{ 1162 "bought_amount": "100.0000000", 1163 "bought_asset_type": "native", 1164 "offer_id": xdr.Int64(10694502), 1165 "seller": "GAA7AZYCJ65VJSMFAGQLBNCXA43QQ6ZEUR4GL4YSVB2FXUAHLLYUHIO5", 1166 "sold_amount": "100000.0000000", 1167 "sold_asset_code": "COP", 1168 "sold_asset_issuer": "GC4XF7RE3R4P77GY5XNGICM56IOKUURWAAANPXHFC7G5H6FCNQVVH3OH", 1169 "sold_asset_type": "credit_alphanum4", 1170 }, 1171 Type: int32(EffectOfferUpdated), 1172 TypeString: EffectTypeNames[EffectOfferUpdated], 1173 OperationID: int64(240518172673), 1174 LedgerClosed: genericCloseTime.UTC(), 1175 }, 1176 { 1177 Address: "GAA7AZYCJ65VJSMFAGQLBNCXA43QQ6ZEUR4GL4YSVB2FXUAHLLYUHIO5", 1178 Details: map[string]interface{}{ 1179 "bought_amount": "100000.0000000", 1180 "bought_asset_code": "COP", 1181 "bought_asset_issuer": "GC4XF7RE3R4P77GY5XNGICM56IOKUURWAAANPXHFC7G5H6FCNQVVH3OH", 1182 "bought_asset_type": "credit_alphanum4", 1183 "offer_id": xdr.Int64(10694502), 1184 "seller": "GAZAIOXF7GBHGPHOYJSTPIIC4K6AJM55S5Q44OCJHEHIF6YU2IHO6VHU", 1185 "sold_amount": "100.0000000", 1186 "sold_asset_type": "native", 1187 }, 1188 Type: int32(EffectOfferRemoved), 1189 TypeString: EffectTypeNames[EffectOfferRemoved], 1190 OperationID: int64(240518172673), 1191 LedgerClosed: genericCloseTime.UTC(), 1192 }, 1193 { 1194 Address: "GAZAIOXF7GBHGPHOYJSTPIIC4K6AJM55S5Q44OCJHEHIF6YU2IHO6VHU", 1195 Details: map[string]interface{}{ 1196 "bought_amount": "100.0000000", 1197 "bought_asset_type": "native", 1198 "offer_id": xdr.Int64(10694502), 1199 "seller": "GAA7AZYCJ65VJSMFAGQLBNCXA43QQ6ZEUR4GL4YSVB2FXUAHLLYUHIO5", 1200 "sold_amount": "100000.0000000", 1201 "sold_asset_code": "COP", 1202 "sold_asset_issuer": "GC4XF7RE3R4P77GY5XNGICM56IOKUURWAAANPXHFC7G5H6FCNQVVH3OH", 1203 "sold_asset_type": "credit_alphanum4", 1204 }, 1205 Type: int32(EffectOfferRemoved), 1206 TypeString: EffectTypeNames[EffectOfferRemoved], 1207 OperationID: int64(240518172673), 1208 LedgerClosed: genericCloseTime.UTC(), 1209 }, 1210 { 1211 Address: "GAA7AZYCJ65VJSMFAGQLBNCXA43QQ6ZEUR4GL4YSVB2FXUAHLLYUHIO5", 1212 Details: map[string]interface{}{ 1213 "bought_amount": "100000.0000000", 1214 "bought_asset_code": "COP", 1215 "bought_asset_issuer": "GC4XF7RE3R4P77GY5XNGICM56IOKUURWAAANPXHFC7G5H6FCNQVVH3OH", 1216 "bought_asset_type": "credit_alphanum4", 1217 "offer_id": xdr.Int64(10694502), 1218 "seller": "GAZAIOXF7GBHGPHOYJSTPIIC4K6AJM55S5Q44OCJHEHIF6YU2IHO6VHU", 1219 "sold_amount": "100.0000000", 1220 "sold_asset_type": "native", 1221 }, 1222 Type: int32(EffectOfferCreated), 1223 TypeString: EffectTypeNames[EffectOfferCreated], 1224 OperationID: int64(240518172673), 1225 LedgerClosed: genericCloseTime.UTC(), 1226 }, 1227 { 1228 Address: "GAZAIOXF7GBHGPHOYJSTPIIC4K6AJM55S5Q44OCJHEHIF6YU2IHO6VHU", 1229 Details: map[string]interface{}{ 1230 "bought_amount": "100.0000000", 1231 "bought_asset_type": "native", 1232 "offer_id": xdr.Int64(10694502), 1233 "seller": "GAA7AZYCJ65VJSMFAGQLBNCXA43QQ6ZEUR4GL4YSVB2FXUAHLLYUHIO5", 1234 "sold_amount": "100000.0000000", 1235 "sold_asset_code": "COP", 1236 "sold_asset_issuer": "GC4XF7RE3R4P77GY5XNGICM56IOKUURWAAANPXHFC7G5H6FCNQVVH3OH", 1237 "sold_asset_type": "credit_alphanum4", 1238 }, 1239 Type: int32(EffectOfferCreated), 1240 TypeString: EffectTypeNames[EffectOfferCreated], 1241 OperationID: int64(240518172673), 1242 LedgerClosed: genericCloseTime.UTC(), 1243 }, 1244 }, 1245 }, 1246 { 1247 desc: "setOption", 1248 envelopeXDR: "AAAAALly/iTceP/82O3aZAmd8hyqUjYAANfc5RfN0/iibCtTAAAAZAAIGHoAAAAHAAAAAQAAAAAAAAAAAAAAAF4FFtcAAAAAAAAAAQAAAAAAAAAFAAAAAQAAAAAge0MBDbX9OddsGMWIHbY1cGXuGYP4bl1ylIvUklO73AAAAAEAAAACAAAAAQAAAAEAAAABAAAAAwAAAAEAAAABAAAAAQAAAAIAAAABAAAAAwAAAAEAAAAVaHR0cHM6Ly93d3cuaG9tZS5vcmcvAAAAAAAAAQAAAAAge0MBDbX9OddsGMWIHbY1cGXuGYP4bl1ylIvUklO73AAAAAIAAAAAAAAAAaJsK1MAAABAiQjCxE53GjInjJtvNr6gdhztRi0GWOZKlUS2KZBLjX3n2N/y7RRNt7B1ZuFcZAxrnxWHD/fF2XcrEwFAuf4TDA==", 1249 resultXDR: "AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAFAAAAAAAAAAA=", 1250 metaXDR: "AAAAAQAAAAIAAAADAA3iDQAAAAAAAAAAuXL+JNx4//zY7dpkCZ3yHKpSNgAA19zlF83T+KJsK1MAAAAXSHblRAAIGHoAAAAGAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAA3iDQAAAAAAAAAAuXL+JNx4//zY7dpkCZ3yHKpSNgAA19zlF83T+KJsK1MAAAAXSHblRAAIGHoAAAAHAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMADeINAAAAAAAAAAC5cv4k3Hj//Njt2mQJnfIcqlI2AADX3OUXzdP4omwrUwAAABdIduVEAAgYegAAAAcAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEADeINAAAAAAAAAAC5cv4k3Hj//Njt2mQJnfIcqlI2AADX3OUXzdP4omwrUwAAABdIduVEAAgYegAAAAcAAAABAAAAAQAAAAAge0MBDbX9OddsGMWIHbY1cGXuGYP4bl1ylIvUklO73AAAAAEAAAAVaHR0cHM6Ly93d3cuaG9tZS5vcmcvAAAAAwECAwAAAAEAAAAAIHtDAQ21/TnXbBjFiB22NXBl7hmD+G5dcpSL1JJTu9wAAAACAAAAAAAAAAA=", 1251 feeChangesXDR: "AAAAAgAAAAMADd8YAAAAAAAAAAC5cv4k3Hj//Njt2mQJnfIcqlI2AADX3OUXzdP4omwrUwAAABdIduWoAAgYegAAAAYAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEADeINAAAAAAAAAAC5cv4k3Hj//Njt2mQJnfIcqlI2AADX3OUXzdP4omwrUwAAABdIduVEAAgYegAAAAYAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==", 1252 hash: "e76b7b0133690fbfb2de8fa9ca2273cb4f2e29447e0cf0e14a5f82d0daa48760", 1253 index: 0, 1254 sequence: 56, 1255 expected: []EffectOutput{ 1256 { 1257 Address: "GC4XF7RE3R4P77GY5XNGICM56IOKUURWAAANPXHFC7G5H6FCNQVVH3OH", 1258 Details: map[string]interface{}{ 1259 "home_domain": "https://www.home.org/", 1260 }, 1261 Type: int32(EffectAccountHomeDomainUpdated), 1262 TypeString: EffectTypeNames[EffectAccountHomeDomainUpdated], 1263 OperationID: int64(240518172673), 1264 LedgerClosed: genericCloseTime.UTC(), 1265 }, 1266 { 1267 Address: "GC4XF7RE3R4P77GY5XNGICM56IOKUURWAAANPXHFC7G5H6FCNQVVH3OH", 1268 Details: map[string]interface{}{ 1269 "high_threshold": xdr.Uint32(3), 1270 "low_threshold": xdr.Uint32(1), 1271 "med_threshold": xdr.Uint32(2), 1272 }, 1273 Type: int32(EffectAccountThresholdsUpdated), 1274 TypeString: EffectTypeNames[EffectAccountThresholdsUpdated], 1275 OperationID: int64(240518172673), 1276 LedgerClosed: genericCloseTime.UTC(), 1277 }, 1278 { 1279 Address: "GC4XF7RE3R4P77GY5XNGICM56IOKUURWAAANPXHFC7G5H6FCNQVVH3OH", 1280 Details: map[string]interface{}{ 1281 "auth_required_flag": true, 1282 "auth_revocable_flag": false, 1283 }, 1284 Type: int32(EffectAccountFlagsUpdated), 1285 TypeString: EffectTypeNames[EffectAccountFlagsUpdated], 1286 OperationID: int64(240518172673), 1287 LedgerClosed: genericCloseTime.UTC(), 1288 }, 1289 { 1290 Address: "GC4XF7RE3R4P77GY5XNGICM56IOKUURWAAANPXHFC7G5H6FCNQVVH3OH", 1291 Details: map[string]interface{}{ 1292 "inflation_destination": "GAQHWQYBBW272OOXNQMMLCA5WY2XAZPODGB7Q3S5OKKIXVESKO55ZQ7C", 1293 }, 1294 Type: int32(EffectAccountInflationDestinationUpdated), 1295 TypeString: EffectTypeNames[EffectAccountInflationDestinationUpdated], 1296 OperationID: int64(240518172673), 1297 LedgerClosed: genericCloseTime.UTC(), 1298 }, 1299 { 1300 Address: "GC4XF7RE3R4P77GY5XNGICM56IOKUURWAAANPXHFC7G5H6FCNQVVH3OH", 1301 Details: map[string]interface{}{ 1302 "public_key": "GC4XF7RE3R4P77GY5XNGICM56IOKUURWAAANPXHFC7G5H6FCNQVVH3OH", 1303 "weight": int32(3), 1304 }, 1305 Type: int32(EffectSignerUpdated), 1306 TypeString: EffectTypeNames[EffectSignerUpdated], 1307 OperationID: int64(240518172673), 1308 LedgerClosed: genericCloseTime.UTC(), 1309 }, 1310 { 1311 Address: "GC4XF7RE3R4P77GY5XNGICM56IOKUURWAAANPXHFC7G5H6FCNQVVH3OH", 1312 Details: map[string]interface{}{ 1313 "public_key": "GAQHWQYBBW272OOXNQMMLCA5WY2XAZPODGB7Q3S5OKKIXVESKO55ZQ7C", 1314 "weight": int32(2), 1315 }, 1316 Type: int32(EffectSignerCreated), 1317 TypeString: EffectTypeNames[EffectSignerCreated], 1318 OperationID: int64(240518172673), 1319 LedgerClosed: genericCloseTime.UTC(), 1320 }, 1321 }, 1322 }, 1323 { 1324 desc: "changeTrust - trustline created", 1325 envelopeXDR: "AAAAAKturFHJX/eRt5gM6qIXAMbaXvlImqLysA6Qr9tLemxfAAAAZAAAACYAAAABAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAAD5Jjibq+Rf5jsUyQ2/tGzCwiRg0Zd5nj9jARA1Skjz+H//////////AAAAAAAAAAFLemxfAAAAQKN8LftAafeoAGmvpsEokqm47jAuqw4g1UWjmL0j6QPm1jxoalzDwDS3W+N2HOHdjSJlEQaTxGBfQKHhr6nNsAA=", 1326 resultXDR: "AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAA=", 1327 metaXDR: "AAAAAQAAAAIAAAADAAAAKAAAAAAAAAAAq26sUclf95G3mAzqohcAxtpe+UiaovKwDpCv20t6bF8AAAACVAvjOAAAACYAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAKAAAAAAAAAAAq26sUclf95G3mAzqohcAxtpe+UiaovKwDpCv20t6bF8AAAACVAvjOAAAACYAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAAoAAAAAAAAAACrbqxRyV/3kbeYDOqiFwDG2l75SJqi8rAOkK/bS3psXwAAAAJUC+M4AAAAJgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAoAAAAAAAAAACrbqxRyV/3kbeYDOqiFwDG2l75SJqi8rAOkK/bS3psXwAAAAJUC+M4AAAAJgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAAQAAAACrbqxRyV/3kbeYDOqiFwDG2l75SJqi8rAOkK/bS3psXwAAAAFVU0QAAAAAAPkmOJur5F/mOxTJDb+0bMLCJGDRl3meP2MBEDVKSPP4AAAAAAAAAAB//////////wAAAAAAAAAAAAAAAA==", 1328 feeChangesXDR: "AAAAAgAAAAMAAAAmAAAAAAAAAACrbqxRyV/3kbeYDOqiFwDG2l75SJqi8rAOkK/bS3psXwAAAAJUC+QAAAAAJgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAoAAAAAAAAAACrbqxRyV/3kbeYDOqiFwDG2l75SJqi8rAOkK/bS3psXwAAAAJUC+OcAAAAJgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==", 1329 hash: "6fa467b53f5386d77ad35c2502ed2cd3dd8b460a5be22b6b2818b81bcd3ed2da", 1330 index: 0, 1331 sequence: 40, 1332 expected: []EffectOutput{ 1333 { 1334 Address: "GCVW5LCRZFP7PENXTAGOVIQXADDNUXXZJCNKF4VQB2IK7W2LPJWF73UG", 1335 Type: int32(EffectTrustlineCreated), 1336 TypeString: EffectTypeNames[EffectTrustlineCreated], 1337 OperationID: int64(171798695937), 1338 Details: map[string]interface{}{ 1339 "limit": "922337203685.4775807", 1340 "asset_code": "USD", 1341 "asset_type": "credit_alphanum4", 1342 "asset_issuer": "GD4SMOE3VPSF7ZR3CTEQ3P5UNTBMEJDA2GLXTHR7MMARANKKJDZ7RPGF", 1343 }, 1344 LedgerClosed: genericCloseTime.UTC(), 1345 }, 1346 }, 1347 }, 1348 { 1349 desc: "changeTrust - trustline removed", 1350 envelopeXDR: "AAAAABwDSftLnTVAHpKUGYPZfTJr6rIm5Z5IqDHVBFuTI3ubAAAAZAARM9kAAAADAAAAAQAAAAAAAAAAAAAAAF4XMm8AAAAAAAAAAQAAAAAAAAAGAAAAAk9DSVRva2VuAAAAAAAAAABJxf/HoI4oaD9CLBvECRhG9GPMNa/65PTI9N7F37o4nwAAAAAAAAAAAAAAAAAAAAGTI3ubAAAAQMHTFPeyHA+W2EYHVDut4dQ18zvF+47SsTPaePwZUaCgw/A3tKDx7sO7R8xlI3GwKQl91Ljmm1dbvAONU9nk/AQ=", 1351 resultXDR: "AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAGAAAAAAAAAAA=", 1352 metaXDR: "AAAAAQAAAAIAAAADABEz3wAAAAAAAAAAHANJ+0udNUAekpQZg9l9MmvqsiblnkioMdUEW5Mje5sAAAAXSHbm1AARM9kAAAACAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABABEz3wAAAAAAAAAAHANJ+0udNUAekpQZg9l9MmvqsiblnkioMdUEW5Mje5sAAAAXSHbm1AARM9kAAAADAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAMAETPeAAAAAQAAAAAcA0n7S501QB6SlBmD2X0ya+qyJuWeSKgx1QRbkyN7mwAAAAJPQ0lUb2tlbgAAAAAAAAAAScX/x6COKGg/QiwbxAkYRvRjzDWv+uT0yPTexd+6OJ8AAAAAAAAAAH//////////AAAAAQAAAAAAAAAAAAAAAgAAAAEAAAAAHANJ+0udNUAekpQZg9l9MmvqsiblnkioMdUEW5Mje5sAAAACT0NJVG9rZW4AAAAAAAAAAEnF/8egjihoP0IsG8QJGEb0Y8w1r/rk9Mj03sXfujifAAAAAwARM98AAAAAAAAAABwDSftLnTVAHpKUGYPZfTJr6rIm5Z5IqDHVBFuTI3ubAAAAF0h25tQAETPZAAAAAwAAAAEAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAQARM98AAAAAAAAAABwDSftLnTVAHpKUGYPZfTJr6rIm5Z5IqDHVBFuTI3ubAAAAF0h25tQAETPZAAAAAwAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAA", 1353 feeChangesXDR: "AAAAAgAAAAMAETPeAAAAAAAAAAAcA0n7S501QB6SlBmD2X0ya+qyJuWeSKgx1QRbkyN7mwAAABdIduc4ABEz2QAAAAIAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAETPfAAAAAAAAAAAcA0n7S501QB6SlBmD2X0ya+qyJuWeSKgx1QRbkyN7mwAAABdIdubUABEz2QAAAAIAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==", 1354 hash: "0f1e93ed9a83edb01ad8ccab67fd59dc7a513c413a8d5a580c5eb7a9c44f2844", 1355 index: 0, 1356 sequence: 40, 1357 expected: []EffectOutput{ 1358 { 1359 Address: "GAOAGSP3JOOTKQA6SKKBTA6ZPUZGX2VSE3SZ4SFIGHKQIW4TEN5ZX3WW", 1360 Type: int32(EffectTrustlineRemoved), 1361 TypeString: EffectTypeNames[EffectTrustlineRemoved], 1362 OperationID: int64(171798695937), 1363 Details: map[string]interface{}{ 1364 "limit": "0.0000000", 1365 "asset_code": "OCIToken", 1366 "asset_type": "credit_alphanum12", 1367 "asset_issuer": "GBE4L76HUCHCQ2B7IIWBXRAJDBDPIY6MGWX7VZHUZD2N5RO7XI4J6GTJ", 1368 }, 1369 LedgerClosed: genericCloseTime.UTC(), 1370 }, 1371 }, 1372 }, 1373 { 1374 desc: "changeTrust - trustline updated", 1375 envelopeXDR: "AAAAAHHbEhVipyZ2k4byyCZkS1Bdvpj7faBChuYo8S/Rt89UAAAAZAAQuJIAAAAHAAAAAQAAAAAAAAAAAAAAAF4XVskAAAAAAAAAAQAAAAAAAAAGAAAAAlRFU1RBU1NFVAAAAAAAAAA7JUkkD+tgCi2xTVyEcs4WZXOA0l7w2orZg/bghXOgkAAAAAA7msoAAAAAAAAAAAHRt89UAAAAQOCi2ylqRvvRzZaCFjGkLYFk7DCjJA5uZ1nXo8FaPCRl2LZczoMbc46sZIlHh0ENzk7fKjFnRPMo8XAirrrf2go=", 1376 resultXDR: "AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAGAAAAAAAAAAA=", 1377 metaXDR: "AAAAAQAAAAIAAAADABE6jwAAAAAAAAAAcdsSFWKnJnaThvLIJmRLUF2+mPt9oEKG5ijxL9G3z1QAAAAAO5rHRAAQuJIAAAAGAAAAAgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABABE6jwAAAAAAAAAAcdsSFWKnJnaThvLIJmRLUF2+mPt9oEKG5ijxL9G3z1QAAAAAO5rHRAAQuJIAAAAHAAAAAgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAETqAAAAAAQAAAABx2xIVYqcmdpOG8sgmZEtQXb6Y+32gQobmKPEv0bfPVAAAAAJURVNUQVNTRVQAAAAAAAAAOyVJJA/rYAotsU1chHLOFmVzgNJe8NqK2YP24IVzoJAAAAAAO5rKAAAAAAA7msoAAAAAAQAAAAAAAAAAAAAAAQAROo8AAAABAAAAAHHbEhVipyZ2k4byyCZkS1Bdvpj7faBChuYo8S/Rt89UAAAAAlRFU1RBU1NFVAAAAAAAAAA7JUkkD+tgCi2xTVyEcs4WZXOA0l7w2orZg/bghXOgkAAAAAA7msoAAAAAADuaygAAAAABAAAAAAAAAAA=", 1378 feeChangesXDR: "AAAAAgAAAAMAETp/AAAAAAAAAABx2xIVYqcmdpOG8sgmZEtQXb6Y+32gQobmKPEv0bfPVAAAAAA7mseoABC4kgAAAAYAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAETqPAAAAAAAAAABx2xIVYqcmdpOG8sgmZEtQXb6Y+32gQobmKPEv0bfPVAAAAAA7msdEABC4kgAAAAYAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==", 1379 hash: "dc8d4714d7db3d0e27ae07f629bc72f1605fc24a2d178af04edbb602592791aa", 1380 index: 0, 1381 sequence: 40, 1382 expected: []EffectOutput{ 1383 { 1384 Address: "GBY5WEQVMKTSM5UTQ3ZMQJTEJNIF3PUY7N62AQUG4YUPCL6RW7HVJARI", 1385 Type: int32(EffectTrustlineUpdated), 1386 TypeString: EffectTypeNames[EffectTrustlineUpdated], 1387 OperationID: int64(171798695937), 1388 Details: map[string]interface{}{ 1389 "limit": "100.0000000", 1390 "asset_code": "TESTASSET", 1391 "asset_type": "credit_alphanum12", 1392 "asset_issuer": "GA5SKSJEB7VWACRNWFGVZBDSZYLGK44A2JPPBWUK3GB7NYEFOOQJAC2B", 1393 }, 1394 LedgerClosed: genericCloseTime.UTC(), 1395 }, 1396 }, 1397 }, 1398 { 1399 desc: "allowTrust", 1400 envelopeXDR: "AAAAAPkmOJur5F/mOxTJDb+0bMLCJGDRl3meP2MBEDVKSPP4AAAAZAAAACYAAAACAAAAAAAAAAAAAAABAAAAAAAAAAcAAAAAq26sUclf95G3mAzqohcAxtpe+UiaovKwDpCv20t6bF8AAAABVVNEAAAAAAEAAAAAAAAAAUpI8/gAAABA6O2fe1gQBwoO0fMNNEUKH0QdVXVjEWbN5VL51DmRUedYMMXtbX5JKVSzla2kIGvWgls1dXuXHZY/IOlaK01rBQ==", 1401 resultXDR: "AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAA=", 1402 metaXDR: "AAAAAQAAAAIAAAADAAAAKQAAAAAAAAAA+SY4m6vkX+Y7FMkNv7RswsIkYNGXeZ4/YwEQNUpI8/gAAAACVAvi1AAAACYAAAABAAAAAAAAAAAAAAADAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAKQAAAAAAAAAA+SY4m6vkX+Y7FMkNv7RswsIkYNGXeZ4/YwEQNUpI8/gAAAACVAvi1AAAACYAAAACAAAAAAAAAAAAAAADAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAAoAAAAAQAAAACrbqxRyV/3kbeYDOqiFwDG2l75SJqi8rAOkK/bS3psXwAAAAFVU0QAAAAAAPkmOJur5F/mOxTJDb+0bMLCJGDRl3meP2MBEDVKSPP4AAAAAAAAAAB//////////wAAAAAAAAAAAAAAAAAAAAEAAAApAAAAAQAAAACrbqxRyV/3kbeYDOqiFwDG2l75SJqi8rAOkK/bS3psXwAAAAFVU0QAAAAAAPkmOJur5F/mOxTJDb+0bMLCJGDRl3meP2MBEDVKSPP4AAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA==", 1403 feeChangesXDR: "AAAAAgAAAAMAAAAnAAAAAAAAAAD5Jjibq+Rf5jsUyQ2/tGzCwiRg0Zd5nj9jARA1Skjz+AAAAAJUC+OcAAAAJgAAAAEAAAAAAAAAAAAAAAMAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAApAAAAAAAAAAD5Jjibq+Rf5jsUyQ2/tGzCwiRg0Zd5nj9jARA1Skjz+AAAAAJUC+M4AAAAJgAAAAEAAAAAAAAAAAAAAAMAAAAAAQAAAAAAAAAAAAAAAAAAAA==", 1404 hash: "6d2e30fd57492bf2e2b132e1bc91a548a369189bebf77eb2b3d829121a9d2c50", 1405 index: 0, 1406 sequence: 41, 1407 expected: []EffectOutput{ 1408 { 1409 Address: "GD4SMOE3VPSF7ZR3CTEQ3P5UNTBMEJDA2GLXTHR7MMARANKKJDZ7RPGF", 1410 Type: int32(EffectTrustlineFlagsUpdated), 1411 TypeString: EffectTypeNames[EffectTrustlineFlagsUpdated], 1412 OperationID: int64(176093663233), 1413 Details: map[string]interface{}{ 1414 "trustor": "GCVW5LCRZFP7PENXTAGOVIQXADDNUXXZJCNKF4VQB2IK7W2LPJWF73UG", 1415 "asset_code": "USD", 1416 "asset_type": "credit_alphanum4", 1417 "asset_issuer": "GD4SMOE3VPSF7ZR3CTEQ3P5UNTBMEJDA2GLXTHR7MMARANKKJDZ7RPGF", 1418 }, 1419 LedgerClosed: genericCloseTime.UTC(), 1420 }, 1421 { 1422 Address: "GD4SMOE3VPSF7ZR3CTEQ3P5UNTBMEJDA2GLXTHR7MMARANKKJDZ7RPGF", 1423 Type: int32(EffectTrustlineFlagsUpdated), 1424 TypeString: EffectTypeNames[EffectTrustlineFlagsUpdated], 1425 OperationID: int64(176093663233), 1426 Details: map[string]interface{}{ 1427 "asset_code": "USD", 1428 "asset_issuer": "GD4SMOE3VPSF7ZR3CTEQ3P5UNTBMEJDA2GLXTHR7MMARANKKJDZ7RPGF", 1429 "asset_type": "credit_alphanum4", 1430 "authorized_flag": true, 1431 "trustor": "GCVW5LCRZFP7PENXTAGOVIQXADDNUXXZJCNKF4VQB2IK7W2LPJWF73UG", 1432 }, 1433 LedgerClosed: genericCloseTime.UTC(), 1434 }, 1435 }, 1436 }, 1437 { 1438 desc: "accountMerge (Destination)", 1439 envelopeXDR: "AAAAAI77mqNTy9VPgmgn+//uvjP8VJxJ1FHQ4jCrYS+K4+HvAAAAZAAAACsAAAABAAAAAAAAAAAAAAABAAAAAAAAAAgAAAAAYvwdC9CRsrYcDdZWNGsqaNfTR8bywsjubQRHAlb8BfcAAAAAAAAAAYrj4e8AAABA3jJ7wBrRpsrcnqBQWjyzwvVz2v5UJ56G60IhgsaWQFSf+7om462KToc+HJ27aLVOQ83dGh1ivp+VIuREJq/SBw==", 1440 resultXDR: "AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAIAAAAAAAAAAJUC+OcAAAAAA==", 1441 metaXDR: "AAAAAQAAAAIAAAADAAAALAAAAAAAAAAAjvuao1PL1U+CaCf7/+6+M/xUnEnUUdDiMKthL4rj4e8AAAACVAvjnAAAACsAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAALAAAAAAAAAAAjvuao1PL1U+CaCf7/+6+M/xUnEnUUdDiMKthL4rj4e8AAAACVAvjnAAAACsAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAMAAAArAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtonM3Az4AAAAAAAAABIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAsAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtowg5/CUAAAAAAAAABIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAMAAAAsAAAAAAAAAACO+5qjU8vVT4JoJ/v/7r4z/FScSdRR0OIwq2EviuPh7wAAAAJUC+OcAAAAKwAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAI77mqNTy9VPgmgn+//uvjP8VJxJ1FHQ4jCrYS+K4+Hv", 1442 feeChangesXDR: "AAAAAgAAAAMAAAArAAAAAAAAAACO+5qjU8vVT4JoJ/v/7r4z/FScSdRR0OIwq2EviuPh7wAAAAJUC+QAAAAAKwAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAsAAAAAAAAAACO+5qjU8vVT4JoJ/v/7r4z/FScSdRR0OIwq2EviuPh7wAAAAJUC+OcAAAAKwAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==", 1443 hash: "e0773d07aba23d11e6a06b021682294be1f9f202a2926827022539662ce2c7fc", 1444 index: 0, 1445 sequence: 44, 1446 expected: []EffectOutput{ 1447 { 1448 Address: "GCHPXGVDKPF5KT4CNAT7X77OXYZ7YVE4JHKFDUHCGCVWCL4K4PQ67KKZ", 1449 Type: int32(EffectAccountDebited), 1450 TypeString: EffectTypeNames[EffectAccountDebited], 1451 OperationID: int64(188978565121), 1452 Details: map[string]interface{}{ 1453 "amount": "999.9999900", 1454 "asset_type": "native", 1455 }, 1456 LedgerClosed: genericCloseTime.UTC(), 1457 }, 1458 { 1459 Address: "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", 1460 Type: int32(EffectAccountCredited), 1461 TypeString: EffectTypeNames[EffectAccountCredited], 1462 OperationID: int64(188978565121), 1463 Details: map[string]interface{}{ 1464 "amount": "999.9999900", 1465 "asset_type": "native", 1466 }, 1467 LedgerClosed: genericCloseTime.UTC(), 1468 }, 1469 { 1470 Address: "GCHPXGVDKPF5KT4CNAT7X77OXYZ7YVE4JHKFDUHCGCVWCL4K4PQ67KKZ", 1471 Type: int32(EffectAccountRemoved), 1472 TypeString: EffectTypeNames[EffectAccountRemoved], 1473 OperationID: int64(188978565121), 1474 Details: map[string]interface{}{}, 1475 LedgerClosed: genericCloseTime.UTC(), 1476 }, 1477 }, 1478 }, 1479 { 1480 desc: "inflation", 1481 envelopeXDR: "AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAAVAAAAAAAAAAAAAAABAAAAAAAAAAkAAAAAAAAAAVb8BfcAAABABUHuXY+MTgW/wDv5+NDVh9fw4meszxeXO98HEQfgXVeCZ7eObCI2orSGUNA/SK6HV9/uTVSxIQQWIso1QoxHBQ==", 1482 resultXDR: "AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAJAAAAAAAAAAIAAAAAYvwdC9CRsrYcDdZWNGsqaNfTR8bywsjubQRHAlb8BfcAAIrEjCYwXAAAAADj3dgEQp1N5U3fBSOCx/nr5XtiCmNJ2oMJZMx+MYK3JwAAIrEjfceLAAAAAA==", 1483 metaXDR: "AAAAAQAAAAIAAAADAAAALwAAAAAAAAAAYvwdC9CRsrYcDdZWNGsqaNfTR8bywsjubQRHAlb8BfcLGiubZdPvaAAAAAAAAAAUAAAAAAAAAAEAAAAAYvwdC9CRsrYcDdZWNGsqaNfTR8bywsjubQRHAlb8BfcAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAALwAAAAAAAAAAYvwdC9CRsrYcDdZWNGsqaNfTR8bywsjubQRHAlb8BfcLGiubZdPvaAAAAAAAAAAVAAAAAAAAAAEAAAAAYvwdC9CRsrYcDdZWNGsqaNfTR8bywsjubQRHAlb8BfcAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAMAAAAvAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9wsaK5tl0+9oAAAAAAAAABUAAAAAAAAAAQAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9wAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAvAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9wsatl/x+h/EAAAAAAAAABUAAAAAAAAAAQAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9wAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAMAAAAuAAAAAAAAAADj3dgEQp1N5U3fBSOCx/nr5XtiCmNJ2oMJZMx+MYK3JwLGivC7E/+cAAAALQAAAAEAAAAAAAAAAQAAAADj3dgEQp1N5U3fBSOCx/nr5XtiCmNJ2oMJZMx+MYK3JwAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAvAAAAAAAAAADj3dgEQp1N5U3fBSOCx/nr5XtiCmNJ2oMJZMx+MYK3JwLGraHekccnAAAALQAAAAEAAAAAAAAAAQAAAADj3dgEQp1N5U3fBSOCx/nr5XtiCmNJ2oMJZMx+MYK3JwAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==", 1484 feeChangesXDR: "AAAAAgAAAAMAAAAuAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9wsaK5tl0+/MAAAAAAAAABQAAAAAAAAAAQAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9wAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAvAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9wsaK5tl0+9oAAAAAAAAABQAAAAAAAAAAQAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9wAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==", 1485 hash: "ea93efd8c2f4e45c0318c69ec958623a0e4374f40d569eec124d43c8a54d6256", 1486 index: 0, 1487 sequence: 47, 1488 expected: []EffectOutput{ 1489 { 1490 Address: "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", 1491 Type: int32(EffectAccountCredited), 1492 TypeString: EffectTypeNames[EffectAccountCredited], 1493 OperationID: int64(201863467009), 1494 Details: map[string]interface{}{ 1495 "amount": "15257676.9536092", 1496 "asset_type": "native", 1497 }, 1498 LedgerClosed: genericCloseTime.UTC(), 1499 }, 1500 { 1501 Address: "GDR53WAEIKOU3ZKN34CSHAWH7HV6K63CBJRUTWUDBFSMY7RRQK3SPKOS", 1502 Type: int32(EffectAccountCredited), 1503 TypeString: EffectTypeNames[EffectAccountCredited], 1504 OperationID: int64(201863467009), 1505 Details: map[string]interface{}{ 1506 "amount": "3814420.0001419", 1507 "asset_type": "native", 1508 }, 1509 LedgerClosed: genericCloseTime.UTC(), 1510 }, 1511 }, 1512 }, 1513 { 1514 desc: "manageData - data created", 1515 envelopeXDR: "AAAAADEhMVDHiYXdz5z8l73XGyrQ2RN85ZRW1uLsCNQumfsZAAAAZAAAADAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAoAAAAFbmFtZTIAAAAAAAABAAAABDU2NzgAAAAAAAAAAS6Z+xkAAABAjxgnTRBCa0n1efZocxpEjXeITQ5sEYTVd9fowuto2kPw5eFwgVnz6OrKJwCRt5L8ylmWiATXVI3Zyfi3yTKqBA==", 1516 resultXDR: "AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAKAAAAAAAAAAA=", 1517 metaXDR: "AAAAAQAAAAIAAAADAAAAMQAAAAAAAAAAMSExUMeJhd3PnPyXvdcbKtDZE3zllFbW4uwI1C6Z+xkAAAACVAvi1AAAADAAAAABAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAMQAAAAAAAAAAMSExUMeJhd3PnPyXvdcbKtDZE3zllFbW4uwI1C6Z+xkAAAACVAvi1AAAADAAAAACAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAAxAAAAAAAAAAAxITFQx4mF3c+c/Je91xsq0NkTfOWUVtbi7AjULpn7GQAAAAJUC+LUAAAAMAAAAAIAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAxAAAAAAAAAAAxITFQx4mF3c+c/Je91xsq0NkTfOWUVtbi7AjULpn7GQAAAAJUC+LUAAAAMAAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxAAAAAwAAAAAxITFQx4mF3c+c/Je91xsq0NkTfOWUVtbi7AjULpn7GQAAAAVuYW1lMgAAAAAAAAQ1Njc4AAAAAAAAAAA=", 1518 feeChangesXDR: "AAAAAgAAAAMAAAAxAAAAAAAAAAAxITFQx4mF3c+c/Je91xsq0NkTfOWUVtbi7AjULpn7GQAAAAJUC+OcAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAxAAAAAAAAAAAxITFQx4mF3c+c/Je91xsq0NkTfOWUVtbi7AjULpn7GQAAAAJUC+M4AAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==", 1519 hash: "e4609180751e7702466a8845857df43e4d154ec84b6bad62ce507fe12f1daf99", 1520 index: 0, 1521 sequence: 49, 1522 expected: []EffectOutput{ 1523 { 1524 Address: "GAYSCMKQY6EYLXOPTT6JPPOXDMVNBWITPTSZIVWW4LWARVBOTH5RTLAD", 1525 Type: int32(EffectDataCreated), 1526 TypeString: EffectTypeNames[EffectDataCreated], 1527 OperationID: int64(210453401601), 1528 Details: map[string]interface{}{ 1529 "name": xdr.String64("name2"), 1530 "value": "NTY3OA==", 1531 }, 1532 LedgerClosed: genericCloseTime.UTC(), 1533 }, 1534 }, 1535 }, 1536 { 1537 desc: "manageData - data removed", 1538 envelopeXDR: "AAAAALly/iTceP/82O3aZAmd8hyqUjYAANfc5RfN0/iibCtTAAAAZAAIGHoAAAAKAAAAAQAAAAAAAAAAAAAAAF4XaMIAAAAAAAAAAQAAAAAAAAAKAAAABWhlbGxvAAAAAAAAAAAAAAAAAAABomwrUwAAAEDyu3HI9bdkzNBs4UgTjVmYt3LQ0CC/6a8yWBmz8OiKeY/RJ9wJvV9/m0JWGtFWbPOXWBg/Pj3ttgKMiHh9TKoF", 1539 resultXDR: "AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAKAAAAAAAAAAA=", 1540 metaXDR: "AAAAAQAAAAIAAAADABE92wAAAAAAAAAAuXL+JNx4//zY7dpkCZ3yHKpSNgAA19zlF83T+KJsK1MAAAAXSHbkGAAIGHoAAAAJAAAAAgAAAAEAAAAAIHtDAQ21/TnXbBjFiB22NXBl7hmD+G5dcpSL1JJTu9wAAAABAAAAFWh0dHBzOi8vd3d3LmhvbWUub3JnLwAAAAMBAgMAAAABAAAAACB7QwENtf0512wYxYgdtjVwZe4Zg/huXXKUi9SSU7vcAAAAAgAAAAAAAAAAAAAAAQARPdsAAAAAAAAAALly/iTceP/82O3aZAmd8hyqUjYAANfc5RfN0/iibCtTAAAAF0h25BgACBh6AAAACgAAAAIAAAABAAAAACB7QwENtf0512wYxYgdtjVwZe4Zg/huXXKUi9SSU7vcAAAAAQAAABVodHRwczovL3d3dy5ob21lLm9yZy8AAAADAQIDAAAAAQAAAAAge0MBDbX9OddsGMWIHbY1cGXuGYP4bl1ylIvUklO73AAAAAIAAAAAAAAAAAAAAAEAAAAEAAAAAwARPcsAAAADAAAAALly/iTceP/82O3aZAmd8hyqUjYAANfc5RfN0/iibCtTAAAABWhlbGxvAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAMAAAAAuXL+JNx4//zY7dpkCZ3yHKpSNgAA19zlF83T+KJsK1MAAAAFaGVsbG8AAAAAAAADABE92wAAAAAAAAAAuXL+JNx4//zY7dpkCZ3yHKpSNgAA19zlF83T+KJsK1MAAAAXSHbkGAAIGHoAAAAKAAAAAgAAAAEAAAAAIHtDAQ21/TnXbBjFiB22NXBl7hmD+G5dcpSL1JJTu9wAAAABAAAAFWh0dHBzOi8vd3d3LmhvbWUub3JnLwAAAAMBAgMAAAABAAAAACB7QwENtf0512wYxYgdtjVwZe4Zg/huXXKUi9SSU7vcAAAAAgAAAAAAAAAAAAAAAQARPdsAAAAAAAAAALly/iTceP/82O3aZAmd8hyqUjYAANfc5RfN0/iibCtTAAAAF0h25BgACBh6AAAACgAAAAEAAAABAAAAACB7QwENtf0512wYxYgdtjVwZe4Zg/huXXKUi9SSU7vcAAAAAQAAABVodHRwczovL3d3dy5ob21lLm9yZy8AAAADAQIDAAAAAQAAAAAge0MBDbX9OddsGMWIHbY1cGXuGYP4bl1ylIvUklO73AAAAAIAAAAAAAAAAA==", 1541 feeChangesXDR: "AAAAAgAAAAMAET3LAAAAAAAAAAC5cv4k3Hj//Njt2mQJnfIcqlI2AADX3OUXzdP4omwrUwAAABdIduR8AAgYegAAAAkAAAACAAAAAQAAAAAge0MBDbX9OddsGMWIHbY1cGXuGYP4bl1ylIvUklO73AAAAAEAAAAVaHR0cHM6Ly93d3cuaG9tZS5vcmcvAAAAAwECAwAAAAEAAAAAIHtDAQ21/TnXbBjFiB22NXBl7hmD+G5dcpSL1JJTu9wAAAACAAAAAAAAAAAAAAABABE92wAAAAAAAAAAuXL+JNx4//zY7dpkCZ3yHKpSNgAA19zlF83T+KJsK1MAAAAXSHbkGAAIGHoAAAAJAAAAAgAAAAEAAAAAIHtDAQ21/TnXbBjFiB22NXBl7hmD+G5dcpSL1JJTu9wAAAABAAAAFWh0dHBzOi8vd3d3LmhvbWUub3JnLwAAAAMBAgMAAAABAAAAACB7QwENtf0512wYxYgdtjVwZe4Zg/huXXKUi9SSU7vcAAAAAgAAAAAAAAAA", 1542 hash: "397b208adb3d484d14ddd3237422baae0b6bd1e8feb3c970147bc6bcc493d112", 1543 index: 0, 1544 sequence: 49, 1545 expected: []EffectOutput{ 1546 { 1547 Address: "GC4XF7RE3R4P77GY5XNGICM56IOKUURWAAANPXHFC7G5H6FCNQVVH3OH", 1548 Type: int32(EffectDataRemoved), 1549 TypeString: EffectTypeNames[EffectDataRemoved], 1550 OperationID: int64(210453401601), 1551 Details: map[string]interface{}{ 1552 "name": xdr.String64("hello"), 1553 }, 1554 LedgerClosed: genericCloseTime.UTC(), 1555 }, 1556 }, 1557 }, 1558 { 1559 desc: "manageData - data updated", 1560 envelopeXDR: "AAAAAKO5w1Op9wij5oMFtCTUoGO9YgewUKQyeIw1g/L0mMP+AAAAZAAALbYAADNjAAAAAQAAAAAAAAAAAAAAAF4WVfgAAAAAAAAAAQAAAAEAAAAAOO6NdKTWKbGao6zsPag+izHxq3eUPLiwjREobLhQAmQAAAAKAAAAOEdDUjNUUTJUVkgzUVJJN0dRTUMzSUpHVVVCUjMyWVFIV0JJS0lNVFlSUTJZSDRYVVREQjc1VUtFAAAAAQAAABQxNTc4NTIxMjA0XzI5MzI5MDI3OAAAAAAAAAAC0oPafQAAAEAcsS0iq/t8i+p85xwLsRy8JpRNEeqobEC5yuhO9ouVf3PE0VjLqv8sDd0St4qbtXU5fqlHd49R9CR+z7tiRLEB9JjD/gAAAEBmaa9sGxQhEhrakzXcSNpMbR4nox/Ha0p/1sI4tabNEzjgYLwKMn1U9tIdVvKKDwE22jg+CI2FlPJ3+FJPmKUA", 1561 resultXDR: "AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAKAAAAAAAAAAA=", 1562 metaXDR: "AAAAAQAAAAIAAAADABEK2wAAAAAAAAAAo7nDU6n3CKPmgwW0JNSgY71iB7BQpDJ4jDWD8vSYw/4AAAAXSGLVVAAALbYAADNiAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABABEK2wAAAAAAAAAAo7nDU6n3CKPmgwW0JNSgY71iB7BQpDJ4jDWD8vSYw/4AAAAXSGLVVAAALbYAADNjAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAEQqbAAAAAwAAAAA47o10pNYpsZqjrOw9qD6LMfGrd5Q8uLCNEShsuFACZAAAADhHQ1IzVFEyVFZIM1FSSTdHUU1DM0lKR1VVQlIzMllRSFdCSUtJTVRZUlEyWUg0WFVUREI3NVVLRQAAABQxNTc4NTIwODU4XzI1MjM5MTc2OAAAAAAAAAAAAAAAAQARCtsAAAADAAAAADjujXSk1imxmqOs7D2oPosx8at3lDy4sI0RKGy4UAJkAAAAOEdDUjNUUTJUVkgzUVJJN0dRTUMzSUpHVVVCUjMyWVFIV0JJS0lNVFlSUTJZSDRYVVREQjc1VUtFAAAAFDE1Nzg1MjEyMDRfMjkzMjkwMjc4AAAAAAAAAAA=", 1563 feeChangesXDR: "AAAAAgAAAAMAEQqbAAAAAAAAAACjucNTqfcIo+aDBbQk1KBjvWIHsFCkMniMNYPy9JjD/gAAABdIYtW4AAAttgAAM2IAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAEQrbAAAAAAAAAACjucNTqfcIo+aDBbQk1KBjvWIHsFCkMniMNYPy9JjD/gAAABdIYtVUAAAttgAAM2IAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==", 1564 hash: "c60b74a14b628d06d3683db8b36ce81344967ac13bc433124bcef44115fbb257", 1565 index: 0, 1566 sequence: 49, 1567 expected: []EffectOutput{ 1568 { 1569 Address: "GA4O5DLUUTLCTMM2UOWOYPNIH2FTD4NLO6KDZOFQRUISQ3FYKABGJLPC", 1570 Type: int32(EffectDataUpdated), 1571 TypeString: EffectTypeNames[EffectDataUpdated], 1572 OperationID: int64(210453401601), 1573 Details: map[string]interface{}{ 1574 "name": xdr.String64("GCR3TQ2TVH3QRI7GQMC3IJGUUBR32YQHWBIKIMTYRQ2YH4XUTDB75UKE"), 1575 "value": "MTU3ODUyMTIwNF8yOTMyOTAyNzg=", 1576 }, 1577 LedgerClosed: genericCloseTime.UTC(), 1578 }, 1579 }, 1580 }, 1581 { 1582 desc: "bumpSequence - new_seq is the same as current sequence", 1583 envelopeXDR: "AAAAAKGX7RT96eIn205uoUHYnqLbt2cPRNORraEoeTAcrRKUAAAAZAAAAEXZZLgDAAAAAAAAAAAAAAABAAAAAAAAAAsAAABF2WS4AwAAAAAAAAABHK0SlAAAAECcI6ex0Dq6YAh6aK14jHxuAvhvKG2+NuzboAKrfYCaC1ZSQ77BYH/5MghPX97JO9WXV17ehNK7d0umxBgaJj8A", 1584 resultXDR: "AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAALAAAAAAAAAAA=", 1585 metaXDR: "AAAAAQAAAAIAAAADAAAAPQAAAAAAAAAAoZftFP3p4ifbTm6hQdieotu3Zw9E05GtoSh5MBytEpQAAAACVAvicAAAAEXZZLgCAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAPQAAAAAAAAAAoZftFP3p4ifbTm6hQdieotu3Zw9E05GtoSh5MBytEpQAAAACVAvicAAAAEXZZLgDAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAA==", 1586 feeChangesXDR: "AAAAAgAAAAMAAAA8AAAAAAAAAAChl+0U/eniJ9tObqFB2J6i27dnD0TTka2hKHkwHK0SlAAAAAJUC+LUAAAARdlkuAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAA9AAAAAAAAAAChl+0U/eniJ9tObqFB2J6i27dnD0TTka2hKHkwHK0SlAAAAAJUC+JwAAAARdlkuAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==", 1587 hash: "bc11b5c41de791369fd85fa1ccf01c35c20df5f98ff2f75d02ead61bfd520e21", 1588 index: 0, 1589 sequence: 61, 1590 expected: []EffectOutput{}, 1591 }, 1592 { 1593 1594 desc: "bumpSequence - new_seq is lower than current sequence", 1595 envelopeXDR: "AAAAAKGX7RT96eIn205uoUHYnqLbt2cPRNORraEoeTAcrRKUAAAAZAAAAEXZZLgCAAAAAAAAAAAAAAABAAAAAAAAAAsAAABF2WS4AQAAAAAAAAABHK0SlAAAAEC4H7TDntOUXDMg4MfoCPlbLRQZH7VwNpUHMvtnRWqWIiY/qnYYu0bvgYUVtoFOOeqElRKLYqtOW3Fz9iKl0WQJ", 1596 resultXDR: "AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAALAAAAAAAAAAA=", 1597 metaXDR: "AAAAAQAAAAIAAAADAAAAPAAAAAAAAAAAoZftFP3p4ifbTm6hQdieotu3Zw9E05GtoSh5MBytEpQAAAACVAvi1AAAAEXZZLgBAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAPAAAAAAAAAAAoZftFP3p4ifbTm6hQdieotu3Zw9E05GtoSh5MBytEpQAAAACVAvi1AAAAEXZZLgCAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAA==", 1598 feeChangesXDR: "AAAAAgAAAAMAAAA7AAAAAAAAAAChl+0U/eniJ9tObqFB2J6i27dnD0TTka2hKHkwHK0SlAAAAAJUC+M4AAAARdlkuAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAA8AAAAAAAAAAChl+0U/eniJ9tObqFB2J6i27dnD0TTka2hKHkwHK0SlAAAAAJUC+LUAAAARdlkuAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==", 1599 hash: "c8132b95c0063cafd20b26d27f06c12e688609d2d9d3724b840821e861870b8e", 1600 index: 0, 1601 sequence: 60, 1602 expected: []EffectOutput{}, 1603 }, 1604 { 1605 1606 desc: "bumpSequence - new_seq is higher than current sequence", 1607 envelopeXDR: "AAAAAKGX7RT96eIn205uoUHYnqLbt2cPRNORraEoeTAcrRKUAAAAZAAAADkAAAABAAAAAAAAAAAAAAABAAAAAAAAAAsAAABF2WS4AAAAAAAAAAABHK0SlAAAAEDq0JVhKNIq9ag0sR+R/cv3d9tEuaYEm2BazIzILRdGj9alaVMZBhxoJ3ZIpP3rraCJzyoKZO+p5HBVe10a2+UG", 1608 resultXDR: "AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAALAAAAAAAAAAA=", 1609 metaXDR: "AAAAAQAAAAIAAAADAAAAOgAAAAAAAAAAoZftFP3p4ifbTm6hQdieotu3Zw9E05GtoSh5MBytEpQAAAACVAvjnAAAADkAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAOgAAAAAAAAAAoZftFP3p4ifbTm6hQdieotu3Zw9E05GtoSh5MBytEpQAAAACVAvjnAAAADkAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAA6AAAAAAAAAAChl+0U/eniJ9tObqFB2J6i27dnD0TTka2hKHkwHK0SlAAAAAJUC+OcAAAAOQAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAA6AAAAAAAAAAChl+0U/eniJ9tObqFB2J6i27dnD0TTka2hKHkwHK0SlAAAAAJUC+OcAAAARdlkuAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==", 1610 feeChangesXDR: "AAAAAgAAAAMAAAA5AAAAAAAAAAChl+0U/eniJ9tObqFB2J6i27dnD0TTka2hKHkwHK0SlAAAAAJUC+QAAAAAOQAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAA6AAAAAAAAAAChl+0U/eniJ9tObqFB2J6i27dnD0TTka2hKHkwHK0SlAAAAAJUC+OcAAAAOQAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==", 1611 hash: "829d53f2dceebe10af8007564b0aefde819b95734ad431df84270651e7ed8a90", 1612 index: 0, 1613 sequence: 58, 1614 expected: []EffectOutput{ 1615 { 1616 Address: "GCQZP3IU7XU6EJ63JZXKCQOYT2RNXN3HB5CNHENNUEUHSMA4VUJJJSEN", 1617 Type: int32(EffectSequenceBumped), 1618 TypeString: EffectTypeNames[EffectSequenceBumped], 1619 OperationID: int64(249108107265), 1620 Details: map[string]interface{}{ 1621 "new_seq": xdr.SequenceNumber(300000000000), 1622 }, 1623 LedgerClosed: genericCloseTime.UTC(), 1624 }, 1625 }, 1626 }, 1627 { 1628 desc: "revokeSponsorship (signer)", 1629 envelopeXDR: getRevokeSponsorshipEnvelopeXDR(t), 1630 resultXDR: "AAAAAAAAAAAAAAAAAAAAAAAAAAA=", 1631 metaXDR: revokeSponsorshipMeta, 1632 feeChangesXDR: "AAAAAA==", 1633 hash: "a41d1c8cdf515203ac5a10d945d5023325076b23dbe7d65ae402cd5f8cd9f891", 1634 index: 0, 1635 sequence: 58, 1636 expected: revokeSponsorshipEffects, 1637 }, 1638 { 1639 desc: "Failed transaction", 1640 envelopeXDR: "AAAAAPCq/iehD2ASJorqlTyEt0usn2WG3yF4w9xBkgd4itu6AAAAZAAMpboAADNGAAAAAAAAAAAAAAABAAAAAAAAAAMAAAABVEVTVAAAAAAObS6P1g8rj8sCVzRQzYgHhWFkbh1oV+1s47LFPstSpQAAAAAAAAACVAvkAAAAAfcAAAD6AAAAAAAAAAAAAAAAAAAAAXiK27oAAABAHHk5mvM6xBRsvu3RBvzzPIb8GpXaL2M7InPn65LIhFJ2RnHIYrpP6ufZc6SUtKqChNRaN4qw5rjwFXNezmrBCw==", 1641 resultXDR: "AAAAAAAAAGT/////AAAAAQAAAAAAAAAD////+QAAAAA=", 1642 metaXDR: "AAAAAQAAAAIAAAADABDLGAAAAAAAAAAA8Kr+J6EPYBImiuqVPIS3S6yfZYbfIXjD3EGSB3iK27oAAAB2ucIg2AAMpboAADNFAAAA4wAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAABHT9ws4fAAAAAAAAAAAAAAAAAAAAAAAAAAEAEMsYAAAAAAAAAADwqv4noQ9gEiaK6pU8hLdLrJ9lht8heMPcQZIHeIrbugAAAHa5wiDYAAylugAAM0YAAADjAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAEdP3Czh8AAAAAAAAAAAAAAAAAAAAAAAAAAA==", 1643 feeChangesXDR: "AAAAAgAAAAMAEMsCAAAAAAAAAADwqv4noQ9gEiaK6pU8hLdLrJ9lht8heMPcQZIHeIrbugAAAHa5wiE8AAylugAAM0UAAADjAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAEdP3Czh8AAAAAAAAAAAAAAAAAAAAAAAAAAQAQyxgAAAAAAAAAAPCq/iehD2ASJorqlTyEt0usn2WG3yF4w9xBkgd4itu6AAAAdrnCINgADKW6AAAzRQAAAOMAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAEAAAR0/cLOHwAAAAAAAAAAAAAAAAAAAAA=", 1644 hash: "24206737a02f7f855c46e367418e38c223f897792c76bbfb948e1b0dbd695f8b", 1645 index: 0, 1646 sequence: 58, 1647 expected: []EffectOutput{}, 1648 }, 1649 } 1650 for _, tc := range testCases { 1651 t.Run(tc.desc, func(t *testing.T) { 1652 tt := assert.New(t) 1653 transaction := BuildLedgerTransaction( 1654 t, 1655 TestTransaction{ 1656 Index: 1, 1657 EnvelopeXDR: tc.envelopeXDR, 1658 ResultXDR: tc.resultXDR, 1659 MetaXDR: tc.metaXDR, 1660 FeeChangesXDR: tc.feeChangesXDR, 1661 Hash: tc.hash, 1662 }, 1663 ) 1664 1665 operation := transactionOperationWrapper{ 1666 index: tc.index, 1667 transaction: transaction, 1668 operation: transaction.Envelope.Operations()[tc.index], 1669 ledgerSequence: tc.sequence, 1670 ledgerClosed: LedgerClosed, 1671 } 1672 1673 effects, err := operation.effects() 1674 tt.NoError(err) 1675 tt.Equal(tc.expected, effects) 1676 }) 1677 } 1678 } 1679 1680 func TestOperationEffectsSetOptionsSignersOrder(t *testing.T) { 1681 tt := assert.New(t) 1682 transaction := ingest.LedgerTransaction{ 1683 UnsafeMeta: createTransactionMeta([]xdr.OperationMeta{ 1684 { 1685 Changes: []xdr.LedgerEntryChange{ 1686 // State 1687 { 1688 Type: xdr.LedgerEntryChangeTypeLedgerEntryState, 1689 State: &xdr.LedgerEntry{ 1690 Data: xdr.LedgerEntryData{ 1691 Type: xdr.LedgerEntryTypeAccount, 1692 Account: &xdr.AccountEntry{ 1693 AccountId: xdr.MustAddress("GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML"), 1694 Signers: []xdr.Signer{ 1695 { 1696 Key: xdr.MustSigner("GCBBDQLCTNASZJ3MTKAOYEOWRGSHDFAJVI7VPZUOP7KXNHYR3HP2BUKV"), 1697 Weight: 10, 1698 }, 1699 { 1700 Key: xdr.MustSigner("GCAHY6JSXQFKWKP6R7U5JPXDVNV4DJWOWRFLY3Y6YPBF64QRL4BPFDNS"), 1701 Weight: 10, 1702 }, 1703 }, 1704 }, 1705 }, 1706 }, 1707 }, 1708 // Updated 1709 { 1710 Type: xdr.LedgerEntryChangeTypeLedgerEntryUpdated, 1711 Updated: &xdr.LedgerEntry{ 1712 Data: xdr.LedgerEntryData{ 1713 Type: xdr.LedgerEntryTypeAccount, 1714 Account: &xdr.AccountEntry{ 1715 AccountId: xdr.MustAddress("GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML"), 1716 Signers: []xdr.Signer{ 1717 { 1718 Key: xdr.MustSigner("GCBBDQLCTNASZJ3MTKAOYEOWRGSHDFAJVI7VPZUOP7KXNHYR3HP2BUKV"), 1719 Weight: 16, 1720 }, 1721 { 1722 Key: xdr.MustSigner("GCAHY6JSXQFKWKP6R7U5JPXDVNV4DJWOWRFLY3Y6YPBF64QRL4BPFDNS"), 1723 Weight: 15, 1724 }, 1725 { 1726 Key: xdr.MustSigner("GCR3TQ2TVH3QRI7GQMC3IJGUUBR32YQHWBIKIMTYRQ2YH4XUTDB75UKE"), 1727 Weight: 14, 1728 }, 1729 { 1730 Key: xdr.MustSigner("GA4O5DLUUTLCTMM2UOWOYPNIH2FTD4NLO6KDZOFQRUISQ3FYKABGJLPC"), 1731 Weight: 17, 1732 }, 1733 }, 1734 }, 1735 }, 1736 }, 1737 }, 1738 }, 1739 }, 1740 }), 1741 } 1742 transaction.Index = 1 1743 transaction.Envelope.Type = xdr.EnvelopeTypeEnvelopeTypeTx 1744 aid := xdr.MustAddress("GCBBDQLCTNASZJ3MTKAOYEOWRGSHDFAJVI7VPZUOP7KXNHYR3HP2BUKV") 1745 transaction.Envelope.V1 = &xdr.TransactionV1Envelope{ 1746 Tx: xdr.Transaction{ 1747 SourceAccount: aid.ToMuxedAccount(), 1748 }, 1749 } 1750 1751 operation := transactionOperationWrapper{ 1752 index: 0, 1753 transaction: transaction, 1754 operation: xdr.Operation{ 1755 Body: xdr.OperationBody{ 1756 Type: xdr.OperationTypeSetOptions, 1757 SetOptionsOp: &xdr.SetOptionsOp{}, 1758 }, 1759 }, 1760 ledgerSequence: 46, 1761 ledgerClosed: genericCloseTime.UTC(), 1762 } 1763 1764 effects, err := operation.effects() 1765 tt.NoError(err) 1766 expected := []EffectOutput{ 1767 { 1768 Address: "GCBBDQLCTNASZJ3MTKAOYEOWRGSHDFAJVI7VPZUOP7KXNHYR3HP2BUKV", 1769 OperationID: int64(197568499713), 1770 Details: map[string]interface{}{ 1771 "public_key": "GCAHY6JSXQFKWKP6R7U5JPXDVNV4DJWOWRFLY3Y6YPBF64QRL4BPFDNS", 1772 "weight": int32(15), 1773 }, 1774 Type: int32(EffectSignerUpdated), 1775 TypeString: EffectTypeNames[EffectSignerUpdated], 1776 LedgerClosed: genericCloseTime.UTC(), 1777 }, 1778 { 1779 Address: "GCBBDQLCTNASZJ3MTKAOYEOWRGSHDFAJVI7VPZUOP7KXNHYR3HP2BUKV", 1780 OperationID: int64(197568499713), 1781 Details: map[string]interface{}{ 1782 "public_key": "GCBBDQLCTNASZJ3MTKAOYEOWRGSHDFAJVI7VPZUOP7KXNHYR3HP2BUKV", 1783 "weight": int32(16), 1784 }, 1785 Type: int32(EffectSignerUpdated), 1786 TypeString: EffectTypeNames[EffectSignerUpdated], 1787 LedgerClosed: genericCloseTime.UTC(), 1788 }, 1789 { 1790 Address: "GCBBDQLCTNASZJ3MTKAOYEOWRGSHDFAJVI7VPZUOP7KXNHYR3HP2BUKV", 1791 OperationID: int64(197568499713), 1792 Details: map[string]interface{}{ 1793 "public_key": "GA4O5DLUUTLCTMM2UOWOYPNIH2FTD4NLO6KDZOFQRUISQ3FYKABGJLPC", 1794 "weight": int32(17), 1795 }, 1796 Type: int32(EffectSignerCreated), 1797 TypeString: EffectTypeNames[EffectSignerCreated], 1798 LedgerClosed: genericCloseTime.UTC(), 1799 }, 1800 { 1801 Address: "GCBBDQLCTNASZJ3MTKAOYEOWRGSHDFAJVI7VPZUOP7KXNHYR3HP2BUKV", 1802 OperationID: int64(197568499713), 1803 Details: map[string]interface{}{ 1804 "public_key": "GCR3TQ2TVH3QRI7GQMC3IJGUUBR32YQHWBIKIMTYRQ2YH4XUTDB75UKE", 1805 "weight": int32(14), 1806 }, 1807 Type: int32(EffectSignerCreated), 1808 TypeString: EffectTypeNames[EffectSignerCreated], 1809 LedgerClosed: genericCloseTime.UTC(), 1810 }, 1811 } 1812 tt.Equal(expected, effects) 1813 } 1814 1815 func TestOperationEffectsSetOptionsSignersNoUpdated(t *testing.T) { 1816 tt := assert.New(t) 1817 transaction := ingest.LedgerTransaction{ 1818 UnsafeMeta: createTransactionMeta([]xdr.OperationMeta{ 1819 { 1820 Changes: []xdr.LedgerEntryChange{ 1821 // State 1822 { 1823 Type: xdr.LedgerEntryChangeTypeLedgerEntryState, 1824 State: &xdr.LedgerEntry{ 1825 Data: xdr.LedgerEntryData{ 1826 Type: xdr.LedgerEntryTypeAccount, 1827 Account: &xdr.AccountEntry{ 1828 AccountId: xdr.MustAddress("GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML"), 1829 Signers: []xdr.Signer{ 1830 { 1831 Key: xdr.MustSigner("GCBBDQLCTNASZJ3MTKAOYEOWRGSHDFAJVI7VPZUOP7KXNHYR3HP2BUKV"), 1832 Weight: 10, 1833 }, 1834 { 1835 Key: xdr.MustSigner("GCAHY6JSXQFKWKP6R7U5JPXDVNV4DJWOWRFLY3Y6YPBF64QRL4BPFDNS"), 1836 Weight: 10, 1837 }, 1838 { 1839 Key: xdr.MustSigner("GA4O5DLUUTLCTMM2UOWOYPNIH2FTD4NLO6KDZOFQRUISQ3FYKABGJLPC"), 1840 Weight: 17, 1841 }, 1842 }, 1843 }, 1844 }, 1845 }, 1846 }, 1847 // Updated 1848 { 1849 Type: xdr.LedgerEntryChangeTypeLedgerEntryUpdated, 1850 Updated: &xdr.LedgerEntry{ 1851 Data: xdr.LedgerEntryData{ 1852 Type: xdr.LedgerEntryTypeAccount, 1853 Account: &xdr.AccountEntry{ 1854 AccountId: xdr.MustAddress("GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML"), 1855 Signers: []xdr.Signer{ 1856 { 1857 Key: xdr.MustSigner("GCBBDQLCTNASZJ3MTKAOYEOWRGSHDFAJVI7VPZUOP7KXNHYR3HP2BUKV"), 1858 Weight: 16, 1859 }, 1860 { 1861 Key: xdr.MustSigner("GCAHY6JSXQFKWKP6R7U5JPXDVNV4DJWOWRFLY3Y6YPBF64QRL4BPFDNS"), 1862 Weight: 10, 1863 }, 1864 { 1865 Key: xdr.MustSigner("GCR3TQ2TVH3QRI7GQMC3IJGUUBR32YQHWBIKIMTYRQ2YH4XUTDB75UKE"), 1866 Weight: 14, 1867 }, 1868 }, 1869 }, 1870 }, 1871 }, 1872 }, 1873 }, 1874 }, 1875 }), 1876 } 1877 transaction.Index = 1 1878 transaction.Envelope.Type = xdr.EnvelopeTypeEnvelopeTypeTx 1879 aid := xdr.MustAddress("GCBBDQLCTNASZJ3MTKAOYEOWRGSHDFAJVI7VPZUOP7KXNHYR3HP2BUKV") 1880 transaction.Envelope.V1 = &xdr.TransactionV1Envelope{ 1881 Tx: xdr.Transaction{ 1882 SourceAccount: aid.ToMuxedAccount(), 1883 }, 1884 } 1885 1886 operation := transactionOperationWrapper{ 1887 index: 0, 1888 transaction: transaction, 1889 operation: xdr.Operation{ 1890 Body: xdr.OperationBody{ 1891 Type: xdr.OperationTypeSetOptions, 1892 SetOptionsOp: &xdr.SetOptionsOp{}, 1893 }, 1894 }, 1895 ledgerSequence: 46, 1896 ledgerClosed: genericCloseTime.UTC(), 1897 } 1898 1899 effects, err := operation.effects() 1900 tt.NoError(err) 1901 expected := []EffectOutput{ 1902 { 1903 Address: "GCBBDQLCTNASZJ3MTKAOYEOWRGSHDFAJVI7VPZUOP7KXNHYR3HP2BUKV", 1904 OperationID: int64(197568499713), 1905 Details: map[string]interface{}{ 1906 "public_key": "GA4O5DLUUTLCTMM2UOWOYPNIH2FTD4NLO6KDZOFQRUISQ3FYKABGJLPC", 1907 }, 1908 Type: int32(EffectSignerRemoved), 1909 TypeString: EffectTypeNames[EffectSignerRemoved], 1910 LedgerClosed: genericCloseTime.UTC(), 1911 }, 1912 { 1913 Address: "GCBBDQLCTNASZJ3MTKAOYEOWRGSHDFAJVI7VPZUOP7KXNHYR3HP2BUKV", 1914 OperationID: int64(197568499713), 1915 Details: map[string]interface{}{ 1916 "public_key": "GCBBDQLCTNASZJ3MTKAOYEOWRGSHDFAJVI7VPZUOP7KXNHYR3HP2BUKV", 1917 "weight": int32(16), 1918 }, 1919 Type: int32(EffectSignerUpdated), 1920 TypeString: EffectTypeNames[EffectSignerUpdated], 1921 LedgerClosed: genericCloseTime.UTC(), 1922 }, 1923 { 1924 Address: "GCBBDQLCTNASZJ3MTKAOYEOWRGSHDFAJVI7VPZUOP7KXNHYR3HP2BUKV", 1925 OperationID: int64(197568499713), 1926 Details: map[string]interface{}{ 1927 "public_key": "GCR3TQ2TVH3QRI7GQMC3IJGUUBR32YQHWBIKIMTYRQ2YH4XUTDB75UKE", 1928 "weight": int32(14), 1929 }, 1930 Type: int32(EffectSignerCreated), 1931 TypeString: EffectTypeNames[EffectSignerCreated], 1932 LedgerClosed: genericCloseTime.UTC(), 1933 }, 1934 } 1935 tt.Equal(expected, effects) 1936 } 1937 1938 func TestOperationRegressionAccountTrustItself(t *testing.T) { 1939 tt := assert.New(t) 1940 // NOTE: when an account trusts itself, the transaction is successful but 1941 // no ledger entries are actually modified. 1942 transaction := ingest.LedgerTransaction{ 1943 UnsafeMeta: createTransactionMeta([]xdr.OperationMeta{}), 1944 } 1945 transaction.Index = 1 1946 transaction.Envelope.Type = xdr.EnvelopeTypeEnvelopeTypeTx 1947 aid := xdr.MustAddress("GCBBDQLCTNASZJ3MTKAOYEOWRGSHDFAJVI7VPZUOP7KXNHYR3HP2BUKV") 1948 transaction.Envelope.V1 = &xdr.TransactionV1Envelope{ 1949 Tx: xdr.Transaction{ 1950 SourceAccount: aid.ToMuxedAccount(), 1951 }, 1952 } 1953 operation := transactionOperationWrapper{ 1954 index: 0, 1955 transaction: transaction, 1956 operation: xdr.Operation{ 1957 Body: xdr.OperationBody{ 1958 Type: xdr.OperationTypeChangeTrust, 1959 ChangeTrustOp: &xdr.ChangeTrustOp{ 1960 Line: xdr.MustNewCreditAsset("COP", "GCBBDQLCTNASZJ3MTKAOYEOWRGSHDFAJVI7VPZUOP7KXNHYR3HP2BUKV").ToChangeTrustAsset(), 1961 Limit: xdr.Int64(1000), 1962 }, 1963 }, 1964 }, 1965 ledgerSequence: 46, 1966 } 1967 1968 effects, err := operation.effects() 1969 tt.NoError(err) 1970 tt.Equal([]EffectOutput{}, effects) 1971 } 1972 1973 func TestOperationEffectsAllowTrustAuthorizedToMaintainLiabilities(t *testing.T) { 1974 tt := assert.New(t) 1975 asset := xdr.Asset{} 1976 allowTrustAsset, err := asset.ToAssetCode("COP") 1977 tt.NoError(err) 1978 aid := xdr.MustAddress("GDRW375MAYR46ODGF2WGANQC2RRZL7O246DYHHCGWTV2RE7IHE2QUQLD") 1979 source := aid.ToMuxedAccount() 1980 op := xdr.Operation{ 1981 SourceAccount: &source, 1982 Body: xdr.OperationBody{ 1983 Type: xdr.OperationTypeAllowTrust, 1984 AllowTrustOp: &xdr.AllowTrustOp{ 1985 Trustor: xdr.MustAddress("GDQNY3PBOJOKYZSRMK2S7LHHGWZIUISD4QORETLMXEWXBI7KFZZMKTL3"), 1986 Asset: allowTrustAsset, 1987 Authorize: xdr.Uint32(xdr.TrustLineFlagsAuthorizedToMaintainLiabilitiesFlag), 1988 }, 1989 }, 1990 } 1991 1992 operation := transactionOperationWrapper{ 1993 index: 0, 1994 transaction: ingest.LedgerTransaction{ 1995 UnsafeMeta: xdr.TransactionMeta{ 1996 V: 2, 1997 V2: &xdr.TransactionMetaV2{}, 1998 }, 1999 }, 2000 operation: op, 2001 ledgerSequence: 1, 2002 ledgerClosed: genericCloseTime.UTC(), 2003 } 2004 2005 effects, err := operation.effects() 2006 tt.NoError(err) 2007 2008 expected := []EffectOutput{ 2009 { 2010 Address: "GDRW375MAYR46ODGF2WGANQC2RRZL7O246DYHHCGWTV2RE7IHE2QUQLD", 2011 OperationID: 4294967297, 2012 Details: map[string]interface{}{ 2013 "asset_code": "COP", 2014 "asset_issuer": "GDRW375MAYR46ODGF2WGANQC2RRZL7O246DYHHCGWTV2RE7IHE2QUQLD", 2015 "asset_type": "credit_alphanum4", 2016 "trustor": "GDQNY3PBOJOKYZSRMK2S7LHHGWZIUISD4QORETLMXEWXBI7KFZZMKTL3", 2017 }, 2018 Type: int32(EffectTrustlineFlagsUpdated), 2019 TypeString: EffectTypeNames[EffectTrustlineFlagsUpdated], 2020 LedgerClosed: genericCloseTime.UTC(), 2021 }, 2022 { 2023 Address: "GDRW375MAYR46ODGF2WGANQC2RRZL7O246DYHHCGWTV2RE7IHE2QUQLD", 2024 OperationID: int64(4294967297), 2025 Details: map[string]interface{}{ 2026 "asset_code": "COP", 2027 "asset_issuer": "GDRW375MAYR46ODGF2WGANQC2RRZL7O246DYHHCGWTV2RE7IHE2QUQLD", 2028 "asset_type": "credit_alphanum4", 2029 "authorized_to_maintain_liabilites": true, 2030 "trustor": "GDQNY3PBOJOKYZSRMK2S7LHHGWZIUISD4QORETLMXEWXBI7KFZZMKTL3", 2031 }, 2032 Type: int32(EffectTrustlineFlagsUpdated), 2033 TypeString: EffectTypeNames[EffectTrustlineFlagsUpdated], 2034 LedgerClosed: genericCloseTime.UTC(), 2035 }, 2036 } 2037 tt.Equal(expected, effects) 2038 } 2039 2040 func TestOperationEffectsClawback(t *testing.T) { 2041 tt := assert.New(t) 2042 aid := xdr.MustAddress("GDRW375MAYR46ODGF2WGANQC2RRZL7O246DYHHCGWTV2RE7IHE2QUQLD") 2043 source := aid.ToMuxedAccount() 2044 op := xdr.Operation{ 2045 SourceAccount: &source, 2046 Body: xdr.OperationBody{ 2047 Type: xdr.OperationTypeClawback, 2048 ClawbackOp: &xdr.ClawbackOp{ 2049 Asset: xdr.MustNewCreditAsset("COP", "GDRW375MAYR46ODGF2WGANQC2RRZL7O246DYHHCGWTV2RE7IHE2QUQLD"), 2050 From: xdr.MustMuxedAddress("GDQNY3PBOJOKYZSRMK2S7LHHGWZIUISD4QORETLMXEWXBI7KFZZMKTL3"), 2051 Amount: 34, 2052 }, 2053 }, 2054 } 2055 2056 operation := transactionOperationWrapper{ 2057 index: 0, 2058 transaction: ingest.LedgerTransaction{ 2059 UnsafeMeta: xdr.TransactionMeta{ 2060 V: 2, 2061 V2: &xdr.TransactionMetaV2{}, 2062 }, 2063 }, 2064 operation: op, 2065 ledgerSequence: 1, 2066 ledgerClosed: genericCloseTime.UTC(), 2067 } 2068 2069 effects, err := operation.effects() 2070 tt.NoError(err) 2071 2072 expected := []EffectOutput{ 2073 { 2074 Address: "GDRW375MAYR46ODGF2WGANQC2RRZL7O246DYHHCGWTV2RE7IHE2QUQLD", 2075 OperationID: 4294967297, 2076 Details: map[string]interface{}{ 2077 "asset_code": "COP", 2078 "asset_issuer": "GDRW375MAYR46ODGF2WGANQC2RRZL7O246DYHHCGWTV2RE7IHE2QUQLD", 2079 "asset_type": "credit_alphanum4", 2080 "amount": "0.0000034", 2081 }, 2082 Type: int32(EffectAccountCredited), 2083 TypeString: EffectTypeNames[EffectAccountCredited], 2084 LedgerClosed: genericCloseTime.UTC(), 2085 }, 2086 { 2087 Address: "GDQNY3PBOJOKYZSRMK2S7LHHGWZIUISD4QORETLMXEWXBI7KFZZMKTL3", 2088 OperationID: 4294967297, 2089 Details: map[string]interface{}{ 2090 "asset_code": "COP", 2091 "asset_issuer": "GDRW375MAYR46ODGF2WGANQC2RRZL7O246DYHHCGWTV2RE7IHE2QUQLD", 2092 "asset_type": "credit_alphanum4", 2093 "amount": "0.0000034", 2094 }, 2095 Type: int32(EffectAccountDebited), 2096 TypeString: EffectTypeNames[EffectAccountDebited], 2097 LedgerClosed: genericCloseTime.UTC(), 2098 }, 2099 } 2100 tt.Equal(expected, effects) 2101 } 2102 2103 func TestOperationEffectsClawbackClaimableBalance(t *testing.T) { 2104 tt := assert.New(t) 2105 aid := xdr.MustAddress("GDRW375MAYR46ODGF2WGANQC2RRZL7O246DYHHCGWTV2RE7IHE2QUQLD") 2106 source := aid.ToMuxedAccount() 2107 var balanceID xdr.ClaimableBalanceId 2108 xdr.SafeUnmarshalBase64("AAAAANoNV9p9SFDn/BDSqdDrxzH3r7QFdMAzlbF9SRSbkfW+", &balanceID) 2109 op := xdr.Operation{ 2110 SourceAccount: &source, 2111 Body: xdr.OperationBody{ 2112 Type: xdr.OperationTypeClawbackClaimableBalance, 2113 ClawbackClaimableBalanceOp: &xdr.ClawbackClaimableBalanceOp{ 2114 BalanceId: balanceID, 2115 }, 2116 }, 2117 } 2118 2119 operation := transactionOperationWrapper{ 2120 index: 0, 2121 transaction: ingest.LedgerTransaction{ 2122 UnsafeMeta: xdr.TransactionMeta{ 2123 V: 2, 2124 V2: &xdr.TransactionMetaV2{}, 2125 }, 2126 }, 2127 operation: op, 2128 ledgerSequence: 1, 2129 ledgerClosed: genericCloseTime.UTC(), 2130 } 2131 2132 effects, err := operation.effects() 2133 tt.NoError(err) 2134 2135 expected := []EffectOutput{ 2136 { 2137 Address: "GDRW375MAYR46ODGF2WGANQC2RRZL7O246DYHHCGWTV2RE7IHE2QUQLD", 2138 OperationID: 4294967297, 2139 Details: map[string]interface{}{ 2140 "balance_id": "00000000da0d57da7d4850e7fc10d2a9d0ebc731f7afb40574c03395b17d49149b91f5be", 2141 }, 2142 Type: int32(EffectClaimableBalanceClawedBack), 2143 TypeString: EffectTypeNames[EffectClaimableBalanceClawedBack], 2144 LedgerClosed: genericCloseTime.UTC(), 2145 }, 2146 } 2147 tt.Equal(expected, effects) 2148 } 2149 2150 func TestOperationEffectsSetTrustLineFlags(t *testing.T) { 2151 tt := assert.New(t) 2152 aid := xdr.MustAddress("GDRW375MAYR46ODGF2WGANQC2RRZL7O246DYHHCGWTV2RE7IHE2QUQLD") 2153 source := aid.ToMuxedAccount() 2154 trustor := xdr.MustAddress("GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY") 2155 setFlags := xdr.Uint32(xdr.TrustLineFlagsAuthorizedToMaintainLiabilitiesFlag) 2156 clearFlags := xdr.Uint32(xdr.TrustLineFlagsTrustlineClawbackEnabledFlag | xdr.TrustLineFlagsAuthorizedFlag) 2157 op := xdr.Operation{ 2158 SourceAccount: &source, 2159 Body: xdr.OperationBody{ 2160 Type: xdr.OperationTypeSetTrustLineFlags, 2161 SetTrustLineFlagsOp: &xdr.SetTrustLineFlagsOp{ 2162 Trustor: trustor, 2163 Asset: xdr.MustNewCreditAsset("USD", "GDRW375MAYR46ODGF2WGANQC2RRZL7O246DYHHCGWTV2RE7IHE2QUQLD"), 2164 ClearFlags: clearFlags, 2165 SetFlags: setFlags, 2166 }, 2167 }, 2168 } 2169 2170 operation := transactionOperationWrapper{ 2171 index: 0, 2172 transaction: ingest.LedgerTransaction{ 2173 UnsafeMeta: xdr.TransactionMeta{ 2174 V: 2, 2175 V2: &xdr.TransactionMetaV2{}, 2176 }, 2177 }, 2178 operation: op, 2179 ledgerSequence: 1, 2180 ledgerClosed: genericCloseTime.UTC(), 2181 } 2182 2183 effects, err := operation.effects() 2184 tt.NoError(err) 2185 2186 expected := []EffectOutput{ 2187 { 2188 Address: "GDRW375MAYR46ODGF2WGANQC2RRZL7O246DYHHCGWTV2RE7IHE2QUQLD", 2189 OperationID: 4294967297, 2190 Details: map[string]interface{}{ 2191 "asset_code": "USD", 2192 "asset_issuer": "GDRW375MAYR46ODGF2WGANQC2RRZL7O246DYHHCGWTV2RE7IHE2QUQLD", 2193 "asset_type": "credit_alphanum4", 2194 "authorized_flag": false, 2195 "authorized_to_maintain_liabilites": true, 2196 "clawback_enabled_flag": false, 2197 "trustor": "GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY", 2198 }, 2199 Type: int32(EffectTrustlineFlagsUpdated), 2200 TypeString: EffectTypeNames[EffectTrustlineFlagsUpdated], 2201 LedgerClosed: genericCloseTime.UTC(), 2202 }, 2203 } 2204 tt.Equal(expected, effects) 2205 } 2206 2207 func TestCreateClaimableBalanceEffectsTestSuite(t *testing.T) { 2208 suite.Run(t, new(CreateClaimableBalanceEffectsTestSuite)) 2209 } 2210 2211 func TestClaimClaimableBalanceEffectsTestSuite(t *testing.T) { 2212 suite.Run(t, new(ClaimClaimableBalanceEffectsTestSuite)) 2213 } 2214 2215 func TestTrustlineSponsorhipEffects(t *testing.T) { 2216 source := xdr.MustMuxedAddress("GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY") 2217 usdAsset := xdr.MustNewCreditAsset("USD", "GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY") 2218 poolIDStr := "19cc788419412926a11049b9fb1f87906b8f02bc6bf8f73d8fd347ede0b79fa5" 2219 var poolID xdr.PoolId 2220 poolIDBytes, err := hex.DecodeString(poolIDStr) 2221 assert.NoError(t, err) 2222 copy(poolID[:], poolIDBytes) 2223 baseAssetTrustLineEntry := xdr.LedgerEntry{ 2224 LastModifiedLedgerSeq: 20, 2225 Data: xdr.LedgerEntryData{ 2226 Type: xdr.LedgerEntryTypeTrustline, 2227 TrustLine: &xdr.TrustLineEntry{ 2228 AccountId: source.ToAccountId(), 2229 Asset: usdAsset.ToTrustLineAsset(), 2230 Balance: 100, 2231 Limit: 1000, 2232 Flags: 0, 2233 }, 2234 }, 2235 } 2236 baseLiquidityPoolTrustLineEntry := xdr.LedgerEntry{ 2237 LastModifiedLedgerSeq: 20, 2238 Data: xdr.LedgerEntryData{ 2239 Type: xdr.LedgerEntryTypeTrustline, 2240 TrustLine: &xdr.TrustLineEntry{ 2241 AccountId: source.ToAccountId(), 2242 Asset: xdr.TrustLineAsset{ 2243 Type: xdr.AssetTypeAssetTypePoolShare, 2244 LiquidityPoolId: &poolID, 2245 }, 2246 Balance: 100, 2247 Limit: 1000, 2248 Flags: 0, 2249 }, 2250 }, 2251 } 2252 2253 sponsor1 := xdr.MustAddress("GDMQUXK7ZUCWM5472ZU3YLDP4BMJLQQ76DEMNYDEY2ODEEGGRKLEWGW2") 2254 sponsor2 := xdr.MustAddress("GDRW375MAYR46ODGF2WGANQC2RRZL7O246DYHHCGWTV2RE7IHE2QUQLD") 2255 withSponsor := func(le *xdr.LedgerEntry, accID *xdr.AccountId) *xdr.LedgerEntry { 2256 le2 := *le 2257 le2.Ext = xdr.LedgerEntryExt{ 2258 V: 1, 2259 V1: &xdr.LedgerEntryExtensionV1{ 2260 SponsoringId: accID, 2261 }, 2262 } 2263 return &le2 2264 } 2265 2266 changes := xdr.LedgerEntryChanges{ 2267 // create asset sponsorship 2268 xdr.LedgerEntryChange{ 2269 Type: xdr.LedgerEntryChangeTypeLedgerEntryState, 2270 State: &baseAssetTrustLineEntry, 2271 }, 2272 xdr.LedgerEntryChange{ 2273 Type: xdr.LedgerEntryChangeTypeLedgerEntryUpdated, 2274 Updated: withSponsor(&baseAssetTrustLineEntry, &sponsor1), 2275 }, 2276 // update asset sponsorship 2277 xdr.LedgerEntryChange{ 2278 Type: xdr.LedgerEntryChangeTypeLedgerEntryState, 2279 State: withSponsor(&baseAssetTrustLineEntry, &sponsor1), 2280 }, 2281 xdr.LedgerEntryChange{ 2282 Type: xdr.LedgerEntryChangeTypeLedgerEntryUpdated, 2283 Updated: withSponsor(&baseAssetTrustLineEntry, &sponsor2), 2284 }, 2285 // remove asset sponsorship 2286 xdr.LedgerEntryChange{ 2287 Type: xdr.LedgerEntryChangeTypeLedgerEntryState, 2288 State: withSponsor(&baseAssetTrustLineEntry, &sponsor2), 2289 }, 2290 xdr.LedgerEntryChange{ 2291 Type: xdr.LedgerEntryChangeTypeLedgerEntryUpdated, 2292 Updated: &baseAssetTrustLineEntry, 2293 }, 2294 2295 // create liquidity pool sponsorship 2296 xdr.LedgerEntryChange{ 2297 Type: xdr.LedgerEntryChangeTypeLedgerEntryState, 2298 State: &baseLiquidityPoolTrustLineEntry, 2299 }, 2300 xdr.LedgerEntryChange{ 2301 Type: xdr.LedgerEntryChangeTypeLedgerEntryUpdated, 2302 Updated: withSponsor(&baseLiquidityPoolTrustLineEntry, &sponsor1), 2303 }, 2304 // update liquidity pool sponsorship 2305 xdr.LedgerEntryChange{ 2306 Type: xdr.LedgerEntryChangeTypeLedgerEntryState, 2307 State: withSponsor(&baseLiquidityPoolTrustLineEntry, &sponsor1), 2308 }, 2309 xdr.LedgerEntryChange{ 2310 Type: xdr.LedgerEntryChangeTypeLedgerEntryUpdated, 2311 Updated: withSponsor(&baseLiquidityPoolTrustLineEntry, &sponsor2), 2312 }, 2313 // remove liquidity pool sponsorship 2314 xdr.LedgerEntryChange{ 2315 Type: xdr.LedgerEntryChangeTypeLedgerEntryState, 2316 State: withSponsor(&baseLiquidityPoolTrustLineEntry, &sponsor2), 2317 }, 2318 xdr.LedgerEntryChange{ 2319 Type: xdr.LedgerEntryChangeTypeLedgerEntryUpdated, 2320 Updated: &baseLiquidityPoolTrustLineEntry, 2321 }, 2322 } 2323 expected := []EffectOutput{ 2324 { 2325 Type: int32(EffectTrustlineSponsorshipCreated), 2326 TypeString: EffectTypeNames[EffectTrustlineSponsorshipCreated], 2327 Address: "GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY", 2328 OperationID: 4294967297, 2329 Details: map[string]interface{}{ 2330 "asset": "USD:GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY", 2331 // `asset_type` set in `Effect.UnmarshalDetails` to prevent reingestion 2332 "sponsor": "GDMQUXK7ZUCWM5472ZU3YLDP4BMJLQQ76DEMNYDEY2ODEEGGRKLEWGW2", 2333 }, 2334 LedgerClosed: genericCloseTime.UTC(), 2335 }, 2336 { 2337 Type: int32(EffectTrustlineSponsorshipUpdated), 2338 TypeString: EffectTypeNames[EffectTrustlineSponsorshipUpdated], 2339 Address: "GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY", 2340 OperationID: 4294967297, 2341 Details: map[string]interface{}{ 2342 "asset": "USD:GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY", 2343 // `asset_type` set in `Effect.UnmarshalDetails` to prevent reingestion 2344 "former_sponsor": "GDMQUXK7ZUCWM5472ZU3YLDP4BMJLQQ76DEMNYDEY2ODEEGGRKLEWGW2", 2345 "new_sponsor": "GDRW375MAYR46ODGF2WGANQC2RRZL7O246DYHHCGWTV2RE7IHE2QUQLD", 2346 }, 2347 LedgerClosed: genericCloseTime.UTC(), 2348 }, 2349 { 2350 Type: int32(EffectTrustlineSponsorshipRemoved), 2351 TypeString: EffectTypeNames[EffectTrustlineSponsorshipRemoved], 2352 Address: "GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY", 2353 OperationID: 4294967297, 2354 Details: map[string]interface{}{ 2355 "asset": "USD:GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY", 2356 // `asset_type` set in `Effect.UnmarshalDetails` to prevent reingestion 2357 "former_sponsor": "GDRW375MAYR46ODGF2WGANQC2RRZL7O246DYHHCGWTV2RE7IHE2QUQLD", 2358 }, 2359 LedgerClosed: genericCloseTime.UTC(), 2360 }, 2361 { 2362 Type: int32(EffectTrustlineSponsorshipCreated), 2363 TypeString: EffectTypeNames[EffectTrustlineSponsorshipCreated], 2364 Address: "GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY", 2365 OperationID: 4294967297, 2366 Details: map[string]interface{}{ 2367 "liquidity_pool_id": poolIDStr, 2368 "asset_type": "liquidity_pool", 2369 "sponsor": "GDMQUXK7ZUCWM5472ZU3YLDP4BMJLQQ76DEMNYDEY2ODEEGGRKLEWGW2", 2370 }, 2371 LedgerClosed: genericCloseTime.UTC(), 2372 }, 2373 { 2374 Type: int32(EffectTrustlineSponsorshipUpdated), 2375 TypeString: EffectTypeNames[EffectTrustlineSponsorshipUpdated], 2376 Address: "GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY", 2377 OperationID: 4294967297, 2378 Details: map[string]interface{}{ 2379 "liquidity_pool_id": poolIDStr, 2380 "asset_type": "liquidity_pool", 2381 "former_sponsor": "GDMQUXK7ZUCWM5472ZU3YLDP4BMJLQQ76DEMNYDEY2ODEEGGRKLEWGW2", 2382 "new_sponsor": "GDRW375MAYR46ODGF2WGANQC2RRZL7O246DYHHCGWTV2RE7IHE2QUQLD", 2383 }, 2384 LedgerClosed: genericCloseTime.UTC(), 2385 }, 2386 { 2387 Type: int32(EffectTrustlineSponsorshipRemoved), 2388 TypeString: EffectTypeNames[EffectTrustlineSponsorshipRemoved], 2389 Address: "GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY", 2390 OperationID: 4294967297, 2391 Details: map[string]interface{}{ 2392 "liquidity_pool_id": poolIDStr, 2393 "asset_type": "liquidity_pool", 2394 "former_sponsor": "GDRW375MAYR46ODGF2WGANQC2RRZL7O246DYHHCGWTV2RE7IHE2QUQLD", 2395 }, 2396 LedgerClosed: genericCloseTime.UTC(), 2397 }, 2398 } 2399 2400 // pick an operation with no intrinsic effects 2401 // (the sponsosrhip effects are obtained from the changes, so it doesn't matter) 2402 phonyOp := xdr.Operation{ 2403 Body: xdr.OperationBody{ 2404 Type: xdr.OperationTypeEndSponsoringFutureReserves, 2405 }, 2406 } 2407 tx := ingest.LedgerTransaction{ 2408 Index: 0, 2409 Envelope: xdr.TransactionEnvelope{ 2410 Type: xdr.EnvelopeTypeEnvelopeTypeTx, 2411 V1: &xdr.TransactionV1Envelope{ 2412 Tx: xdr.Transaction{ 2413 SourceAccount: source, 2414 Operations: []xdr.Operation{phonyOp}, 2415 }, 2416 }, 2417 }, 2418 UnsafeMeta: xdr.TransactionMeta{ 2419 V: 2, 2420 V2: &xdr.TransactionMetaV2{ 2421 Operations: []xdr.OperationMeta{{Changes: changes}}, 2422 }, 2423 }, 2424 } 2425 2426 operation := transactionOperationWrapper{ 2427 index: 0, 2428 transaction: tx, 2429 operation: phonyOp, 2430 ledgerSequence: 1, 2431 ledgerClosed: genericCloseTime.UTC(), 2432 } 2433 2434 effects, err := operation.effects() 2435 assert.NoError(t, err) 2436 assert.Equal(t, expected, effects) 2437 2438 } 2439 2440 func TestLiquidityPoolEffects(t *testing.T) { 2441 source := xdr.MustMuxedAddress("GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY") 2442 usdAsset := xdr.MustNewCreditAsset("USD", "GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY") 2443 poolIDStr := "ea4e3e63a95fd840c1394f195722ffdcb2d0d4f0a26589c6ab557d81e6b0bf9d" 2444 var poolID xdr.PoolId 2445 poolIDBytes, err := hex.DecodeString(poolIDStr) 2446 assert.NoError(t, err) 2447 copy(poolID[:], poolIDBytes) 2448 baseLiquidityPoolEntry := xdr.LiquidityPoolEntry{ 2449 LiquidityPoolId: poolID, 2450 Body: xdr.LiquidityPoolEntryBody{ 2451 Type: xdr.LiquidityPoolTypeLiquidityPoolConstantProduct, 2452 ConstantProduct: &xdr.LiquidityPoolEntryConstantProduct{ 2453 Params: xdr.LiquidityPoolConstantProductParameters{ 2454 AssetA: xdr.MustNewNativeAsset(), 2455 AssetB: usdAsset, 2456 Fee: 20, 2457 }, 2458 ReserveA: 200, 2459 ReserveB: 100, 2460 TotalPoolShares: 1000, 2461 PoolSharesTrustLineCount: 10, 2462 }, 2463 }, 2464 } 2465 baseState := xdr.LedgerEntryChange{ 2466 Type: xdr.LedgerEntryChangeTypeLedgerEntryState, 2467 State: &xdr.LedgerEntry{ 2468 LastModifiedLedgerSeq: 20, 2469 Data: xdr.LedgerEntryData{ 2470 Type: xdr.LedgerEntryTypeLiquidityPool, 2471 LiquidityPool: &baseLiquidityPoolEntry, 2472 }, 2473 }, 2474 } 2475 updateState := func(cp xdr.LiquidityPoolEntryConstantProduct) xdr.LedgerEntryChange { 2476 return xdr.LedgerEntryChange{ 2477 Type: xdr.LedgerEntryChangeTypeLedgerEntryUpdated, 2478 Updated: &xdr.LedgerEntry{ 2479 LastModifiedLedgerSeq: 20, 2480 Data: xdr.LedgerEntryData{ 2481 Type: xdr.LedgerEntryTypeLiquidityPool, 2482 LiquidityPool: &xdr.LiquidityPoolEntry{ 2483 LiquidityPoolId: poolID, 2484 Body: xdr.LiquidityPoolEntryBody{ 2485 Type: xdr.LiquidityPoolTypeLiquidityPoolConstantProduct, 2486 ConstantProduct: &cp, 2487 }, 2488 }, 2489 }, 2490 }, 2491 } 2492 } 2493 2494 testCases := []struct { 2495 desc string 2496 op xdr.OperationBody 2497 result xdr.OperationResult 2498 changes xdr.LedgerEntryChanges 2499 expected []EffectOutput 2500 }{ 2501 { 2502 desc: "liquidity pool creation", 2503 op: xdr.OperationBody{ 2504 Type: xdr.OperationTypeChangeTrust, 2505 ChangeTrustOp: &xdr.ChangeTrustOp{ 2506 Line: xdr.ChangeTrustAsset{ 2507 Type: xdr.AssetTypeAssetTypePoolShare, 2508 LiquidityPool: &xdr.LiquidityPoolParameters{ 2509 Type: xdr.LiquidityPoolTypeLiquidityPoolConstantProduct, 2510 ConstantProduct: &baseLiquidityPoolEntry.Body.ConstantProduct.Params, 2511 }, 2512 }, 2513 Limit: 1000, 2514 }, 2515 }, 2516 changes: xdr.LedgerEntryChanges{ 2517 xdr.LedgerEntryChange{ 2518 Type: xdr.LedgerEntryChangeTypeLedgerEntryCreated, 2519 Created: &xdr.LedgerEntry{ 2520 LastModifiedLedgerSeq: 20, 2521 Data: xdr.LedgerEntryData{ 2522 Type: xdr.LedgerEntryTypeLiquidityPool, 2523 LiquidityPool: &baseLiquidityPoolEntry, 2524 }, 2525 }, 2526 }, 2527 xdr.LedgerEntryChange{ 2528 Type: xdr.LedgerEntryChangeTypeLedgerEntryCreated, 2529 Created: &xdr.LedgerEntry{ 2530 LastModifiedLedgerSeq: 20, 2531 Data: xdr.LedgerEntryData{ 2532 Type: xdr.LedgerEntryTypeTrustline, 2533 TrustLine: &xdr.TrustLineEntry{ 2534 AccountId: source.ToAccountId(), 2535 Asset: xdr.TrustLineAsset{ 2536 Type: xdr.AssetTypeAssetTypePoolShare, 2537 LiquidityPoolId: &poolID, 2538 }, 2539 }, 2540 }, 2541 }, 2542 }, 2543 }, 2544 expected: []EffectOutput{ 2545 { 2546 Type: int32(EffectTrustlineCreated), 2547 TypeString: EffectTypeNames[EffectTrustlineCreated], 2548 Address: "GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY", 2549 OperationID: 4294967297, 2550 Details: map[string]interface{}{ 2551 "asset_type": "liquidity_pool_shares", 2552 "limit": "0.0001000", 2553 "liquidity_pool_id": poolIDStr, 2554 }, 2555 LedgerClosed: genericCloseTime.UTC(), 2556 }, 2557 { 2558 Type: int32(EffectLiquidityPoolCreated), 2559 TypeString: EffectTypeNames[EffectLiquidityPoolCreated], 2560 Address: "GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY", 2561 OperationID: 4294967297, 2562 Details: map[string]interface{}{ 2563 "liquidity_pool": map[string]interface{}{ 2564 "fee_bp": uint32(20), 2565 "id": poolIDStr, 2566 "reserves": []base.AssetAmount{ 2567 { 2568 "native", 2569 "0.0000200", 2570 }, 2571 { 2572 "USD:GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY", 2573 "0.0000100", 2574 }, 2575 }, 2576 "total_shares": "0.0001000", 2577 "total_trustlines": "10", 2578 "type": "constant_product", 2579 }, 2580 }, 2581 LedgerClosed: genericCloseTime.UTC(), 2582 }, 2583 }, 2584 }, 2585 { 2586 desc: "liquidity pool deposit", 2587 op: xdr.OperationBody{ 2588 Type: xdr.OperationTypeLiquidityPoolDeposit, 2589 LiquidityPoolDepositOp: &xdr.LiquidityPoolDepositOp{ 2590 LiquidityPoolId: poolID, 2591 MaxAmountA: 100, 2592 MaxAmountB: 200, 2593 MinPrice: xdr.Price{ 2594 N: 50, 2595 D: 3, 2596 }, 2597 MaxPrice: xdr.Price{ 2598 N: 100, 2599 D: 2, 2600 }, 2601 }, 2602 }, 2603 changes: xdr.LedgerEntryChanges{ 2604 baseState, 2605 updateState(xdr.LiquidityPoolEntryConstantProduct{ 2606 2607 Params: baseLiquidityPoolEntry.Body.ConstantProduct.Params, 2608 ReserveA: baseLiquidityPoolEntry.Body.ConstantProduct.ReserveA + 50, 2609 ReserveB: baseLiquidityPoolEntry.Body.ConstantProduct.ReserveB + 60, 2610 TotalPoolShares: baseLiquidityPoolEntry.Body.ConstantProduct.TotalPoolShares + 10, 2611 PoolSharesTrustLineCount: baseLiquidityPoolEntry.Body.ConstantProduct.PoolSharesTrustLineCount, 2612 }), 2613 }, 2614 expected: []EffectOutput{ 2615 { 2616 Type: int32(EffectLiquidityPoolDeposited), 2617 TypeString: EffectTypeNames[EffectLiquidityPoolDeposited], 2618 Address: "GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY", 2619 OperationID: 4294967297, 2620 Details: map[string]interface{}{ 2621 "liquidity_pool": map[string]interface{}{ 2622 "fee_bp": uint32(20), 2623 "id": poolIDStr, 2624 "reserves": []base.AssetAmount{ 2625 { 2626 "native", 2627 "0.0000250", 2628 }, 2629 { 2630 "USD:GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY", 2631 "0.0000160", 2632 }, 2633 }, 2634 "total_shares": "0.0001010", 2635 "total_trustlines": "10", 2636 "type": "constant_product", 2637 }, 2638 "reserves_deposited": []base.AssetAmount{ 2639 { 2640 "native", 2641 "0.0000050", 2642 }, 2643 { 2644 "USD:GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY", 2645 "0.0000060", 2646 }, 2647 }, 2648 "shares_received": "0.0000010", 2649 }, 2650 LedgerClosed: genericCloseTime.UTC(), 2651 }, 2652 }, 2653 }, 2654 { 2655 desc: "liquidity pool withdrawal", 2656 op: xdr.OperationBody{ 2657 Type: xdr.OperationTypeLiquidityPoolWithdraw, 2658 LiquidityPoolWithdrawOp: &xdr.LiquidityPoolWithdrawOp{ 2659 LiquidityPoolId: poolID, 2660 Amount: 10, 2661 MinAmountA: 10, 2662 MinAmountB: 5, 2663 }, 2664 }, 2665 changes: xdr.LedgerEntryChanges{ 2666 baseState, 2667 updateState(xdr.LiquidityPoolEntryConstantProduct{ 2668 2669 Params: baseLiquidityPoolEntry.Body.ConstantProduct.Params, 2670 ReserveA: baseLiquidityPoolEntry.Body.ConstantProduct.ReserveA - 11, 2671 ReserveB: baseLiquidityPoolEntry.Body.ConstantProduct.ReserveB - 6, 2672 TotalPoolShares: baseLiquidityPoolEntry.Body.ConstantProduct.TotalPoolShares - 10, 2673 PoolSharesTrustLineCount: baseLiquidityPoolEntry.Body.ConstantProduct.PoolSharesTrustLineCount, 2674 }), 2675 }, 2676 expected: []EffectOutput{ 2677 { 2678 Type: int32(EffectLiquidityPoolWithdrew), 2679 TypeString: EffectTypeNames[EffectLiquidityPoolWithdrew], 2680 Address: "GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY", 2681 OperationID: 4294967297, 2682 Details: map[string]interface{}{ 2683 "liquidity_pool": map[string]interface{}{ 2684 "fee_bp": uint32(20), 2685 "id": poolIDStr, 2686 "reserves": []base.AssetAmount{ 2687 { 2688 "native", 2689 "0.0000189", 2690 }, 2691 { 2692 "USD:GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY", 2693 "0.0000094", 2694 }, 2695 }, 2696 "total_shares": "0.0000990", 2697 "total_trustlines": "10", 2698 "type": "constant_product", 2699 }, 2700 "reserves_received": []base.AssetAmount{ 2701 { 2702 "native", 2703 "0.0000011", 2704 }, 2705 { 2706 "USD:GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY", 2707 "0.0000006", 2708 }, 2709 }, 2710 "shares_redeemed": "0.0000010", 2711 }, 2712 LedgerClosed: genericCloseTime.UTC(), 2713 }, 2714 }, 2715 }, 2716 { 2717 desc: "liquidity pool trade", 2718 op: xdr.OperationBody{ 2719 Type: xdr.OperationTypePathPaymentStrictSend, 2720 PathPaymentStrictSendOp: &xdr.PathPaymentStrictSendOp{ 2721 SendAsset: xdr.MustNewNativeAsset(), 2722 SendAmount: 10, 2723 Destination: xdr.MustMuxedAddress("GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY"), 2724 DestAsset: usdAsset, 2725 DestMin: 5, 2726 Path: nil, 2727 }, 2728 }, 2729 changes: xdr.LedgerEntryChanges{ 2730 baseState, 2731 updateState(xdr.LiquidityPoolEntryConstantProduct{ 2732 2733 Params: baseLiquidityPoolEntry.Body.ConstantProduct.Params, 2734 ReserveA: baseLiquidityPoolEntry.Body.ConstantProduct.ReserveA - 11, 2735 ReserveB: baseLiquidityPoolEntry.Body.ConstantProduct.ReserveB - 6, 2736 TotalPoolShares: baseLiquidityPoolEntry.Body.ConstantProduct.TotalPoolShares - 10, 2737 PoolSharesTrustLineCount: baseLiquidityPoolEntry.Body.ConstantProduct.PoolSharesTrustLineCount, 2738 }), 2739 }, 2740 result: xdr.OperationResult{ 2741 Code: xdr.OperationResultCodeOpInner, 2742 Tr: &xdr.OperationResultTr{ 2743 Type: xdr.OperationTypePathPaymentStrictSend, 2744 PathPaymentStrictSendResult: &xdr.PathPaymentStrictSendResult{ 2745 Code: xdr.PathPaymentStrictSendResultCodePathPaymentStrictSendSuccess, 2746 Success: &xdr.PathPaymentStrictSendResultSuccess{ 2747 Last: xdr.SimplePaymentResult{ 2748 Destination: xdr.MustAddress("GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY"), 2749 Asset: xdr.MustNewCreditAsset("USD", "GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY"), 2750 Amount: 5, 2751 }, 2752 Offers: []xdr.ClaimAtom{ 2753 { 2754 Type: xdr.ClaimAtomTypeClaimAtomTypeLiquidityPool, 2755 LiquidityPool: &xdr.ClaimLiquidityAtom{ 2756 LiquidityPoolId: poolID, 2757 AssetSold: xdr.MustNewNativeAsset(), 2758 AmountSold: 10, 2759 AssetBought: xdr.MustNewCreditAsset("USD", "GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY"), 2760 AmountBought: 5, 2761 }, 2762 }, 2763 }, 2764 }, 2765 }, 2766 }, 2767 }, 2768 expected: []EffectOutput{ 2769 { 2770 Type: int32(EffectAccountCredited), 2771 TypeString: EffectTypeNames[EffectAccountCredited], 2772 Address: "GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY", 2773 OperationID: 4294967297, 2774 Details: map[string]interface{}{ 2775 "amount": "0.0000005", 2776 "asset_code": "USD", 2777 "asset_issuer": "GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY", 2778 "asset_type": "credit_alphanum4", 2779 }, 2780 LedgerClosed: genericCloseTime.UTC(), 2781 }, 2782 { 2783 Type: int32(EffectAccountDebited), 2784 TypeString: EffectTypeNames[EffectAccountDebited], 2785 Address: "GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY", 2786 OperationID: 4294967297, 2787 Details: map[string]interface{}{ 2788 "amount": "0.0000010", 2789 "asset_type": "native", 2790 }, 2791 LedgerClosed: genericCloseTime.UTC(), 2792 }, 2793 { 2794 Type: int32(EffectLiquidityPoolTrade), 2795 TypeString: EffectTypeNames[EffectLiquidityPoolTrade], 2796 Address: "GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY", 2797 OperationID: 4294967297, 2798 Details: map[string]interface{}{ 2799 "bought": map[string]string{ 2800 "amount": "0.0000005", 2801 "asset": "USD:GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY", 2802 }, 2803 "liquidity_pool": map[string]interface{}{ 2804 "fee_bp": uint32(20), 2805 "id": poolIDStr, 2806 "reserves": []base.AssetAmount{ 2807 { 2808 "native", 2809 "0.0000189", 2810 }, 2811 { 2812 "USD:GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY", 2813 "0.0000094", 2814 }, 2815 }, 2816 "total_shares": "0.0000990", 2817 "total_trustlines": "10", 2818 "type": "constant_product", 2819 }, 2820 "sold": map[string]string{ 2821 "amount": "0.0000010", 2822 "asset": "native", 2823 }, 2824 }, 2825 LedgerClosed: genericCloseTime.UTC(), 2826 }, 2827 }, 2828 }, 2829 { 2830 desc: "liquidity pool revocation", 2831 // Deauthorize an asset 2832 // 2833 // This scenario assumes that the asset being deauthorized is also part of a liquidity pool trustline 2834 // from the same account. This results in a revocation (with a claimable balance being created). 2835 // 2836 // This scenario also assumes that the liquidity pool trustline was the last one, cause a liquidity pool removal. 2837 op: xdr.OperationBody{ 2838 Type: xdr.OperationTypeSetTrustLineFlags, 2839 SetTrustLineFlagsOp: &xdr.SetTrustLineFlagsOp{ 2840 Trustor: xdr.MustAddress("GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY"), 2841 Asset: usdAsset, 2842 ClearFlags: xdr.Uint32(xdr.TrustLineFlagsAuthorizedFlag), 2843 }, 2844 }, 2845 changes: xdr.LedgerEntryChanges{ 2846 // Asset trustline update 2847 { 2848 Type: xdr.LedgerEntryChangeTypeLedgerEntryState, 2849 State: &xdr.LedgerEntry{ 2850 LastModifiedLedgerSeq: 20, 2851 Data: xdr.LedgerEntryData{ 2852 Type: xdr.LedgerEntryTypeTrustline, 2853 TrustLine: &xdr.TrustLineEntry{ 2854 AccountId: xdr.MustAddress("GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY"), 2855 Asset: usdAsset.ToTrustLineAsset(), 2856 Balance: 5, 2857 Limit: 100, 2858 Flags: xdr.Uint32(xdr.TrustLineFlagsAuthorizedFlag), 2859 }, 2860 }, 2861 }, 2862 }, 2863 { 2864 Type: xdr.LedgerEntryChangeTypeLedgerEntryUpdated, 2865 Updated: &xdr.LedgerEntry{ 2866 LastModifiedLedgerSeq: 20, 2867 Data: xdr.LedgerEntryData{ 2868 Type: xdr.LedgerEntryTypeTrustline, 2869 TrustLine: &xdr.TrustLineEntry{ 2870 AccountId: xdr.MustAddress("GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY"), 2871 Asset: usdAsset.ToTrustLineAsset(), 2872 Balance: 5, 2873 Limit: 100, 2874 Flags: 0, 2875 }, 2876 }, 2877 }, 2878 }, 2879 // Liquidity pool trustline removal 2880 { 2881 Type: xdr.LedgerEntryChangeTypeLedgerEntryState, 2882 State: &xdr.LedgerEntry{ 2883 LastModifiedLedgerSeq: 20, 2884 Data: xdr.LedgerEntryData{ 2885 Type: xdr.LedgerEntryTypeTrustline, 2886 TrustLine: &xdr.TrustLineEntry{ 2887 AccountId: xdr.MustAddress("GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY"), 2888 Asset: xdr.TrustLineAsset{ 2889 Type: xdr.AssetTypeAssetTypePoolShare, 2890 LiquidityPoolId: &poolID, 2891 }, 2892 Balance: 1000, 2893 Limit: 2000, 2894 Flags: xdr.Uint32(xdr.TrustLineFlagsAuthorizedFlag), 2895 }, 2896 }, 2897 }, 2898 }, 2899 { 2900 Type: xdr.LedgerEntryChangeTypeLedgerEntryRemoved, 2901 Removed: &xdr.LedgerKey{ 2902 Type: xdr.LedgerEntryTypeTrustline, 2903 TrustLine: &xdr.LedgerKeyTrustLine{ 2904 AccountId: xdr.MustAddress("GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY"), 2905 Asset: xdr.TrustLineAsset{ 2906 Type: xdr.AssetTypeAssetTypePoolShare, 2907 LiquidityPoolId: &poolID, 2908 }, 2909 }, 2910 }, 2911 }, 2912 // create claimable balance for USD asset as part of the revocation (in reality there would probably be another claimable 2913 // balance crested for the native asset, but let's keep this simple) 2914 { 2915 Type: xdr.LedgerEntryChangeTypeLedgerEntryCreated, 2916 Created: &xdr.LedgerEntry{ 2917 LastModifiedLedgerSeq: 20, 2918 Data: xdr.LedgerEntryData{ 2919 Type: xdr.LedgerEntryTypeClaimableBalance, 2920 ClaimableBalance: &xdr.ClaimableBalanceEntry{ 2921 BalanceId: xdr.ClaimableBalanceId{ 2922 Type: xdr.ClaimableBalanceIdTypeClaimableBalanceIdTypeV0, 2923 V0: &xdr.Hash{0xa, 0xb}, 2924 }, 2925 Claimants: []xdr.Claimant{ 2926 { 2927 Type: xdr.ClaimantTypeClaimantTypeV0, 2928 V0: &xdr.ClaimantV0{ 2929 Destination: xdr.MustAddress("GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY"), 2930 Predicate: xdr.ClaimPredicate{ 2931 Type: xdr.ClaimPredicateTypeClaimPredicateUnconditional, 2932 }, 2933 }, 2934 }, 2935 }, 2936 Asset: usdAsset, 2937 Amount: 100, 2938 }, 2939 }, 2940 }, 2941 }, 2942 // Liquidity pool removal 2943 baseState, 2944 { 2945 Type: xdr.LedgerEntryChangeTypeLedgerEntryRemoved, 2946 Removed: &xdr.LedgerKey{ 2947 Type: xdr.LedgerEntryTypeLiquidityPool, 2948 LiquidityPool: &xdr.LedgerKeyLiquidityPool{ 2949 LiquidityPoolId: poolID, 2950 }, 2951 }, 2952 }, 2953 }, 2954 expected: []EffectOutput{ 2955 { 2956 Type: int32(EffectTrustlineFlagsUpdated), 2957 TypeString: EffectTypeNames[EffectTrustlineFlagsUpdated], 2958 Address: "GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY", 2959 OperationID: 4294967297, 2960 Details: map[string]interface{}{ 2961 "asset_code": "USD", 2962 "asset_issuer": "GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY", 2963 "asset_type": "credit_alphanum4", 2964 "authorized_flag": false, 2965 "trustor": "GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY", 2966 }, 2967 LedgerClosed: genericCloseTime.UTC(), 2968 }, 2969 { 2970 Type: int32(EffectClaimableBalanceCreated), 2971 TypeString: EffectTypeNames[EffectClaimableBalanceCreated], 2972 Address: "GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY", 2973 OperationID: 4294967297, 2974 Details: map[string]interface{}{ 2975 "amount": "0.0000100", 2976 "asset": "USD:GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY", 2977 "balance_id": "000000000a0b000000000000000000000000000000000000000000000000000000000000", 2978 }, 2979 LedgerClosed: genericCloseTime.UTC(), 2980 }, 2981 { 2982 Type: int32(EffectClaimableBalanceClaimantCreated), 2983 TypeString: EffectTypeNames[EffectClaimableBalanceClaimantCreated], 2984 Address: "GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY", 2985 OperationID: 4294967297, 2986 Details: map[string]interface{}{ 2987 "amount": "0.0000100", 2988 "asset": "USD:GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY", 2989 "balance_id": "000000000a0b000000000000000000000000000000000000000000000000000000000000", 2990 "predicate": xdr.ClaimPredicate{}, 2991 }, 2992 LedgerClosed: genericCloseTime.UTC(), 2993 }, 2994 { 2995 Type: int32(EffectLiquidityPoolRevoked), 2996 TypeString: EffectTypeNames[EffectLiquidityPoolRevoked], 2997 Address: "GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY", 2998 OperationID: 4294967297, 2999 Details: map[string]interface{}{ 3000 "liquidity_pool": map[string]interface{}{ 3001 "fee_bp": uint32(20), 3002 "id": poolIDStr, 3003 "reserves": []base.AssetAmount{ 3004 { 3005 "native", 3006 "0.0000200", 3007 }, 3008 { 3009 "USD:GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY", 3010 "0.0000100", 3011 }, 3012 }, 3013 "total_shares": "0.0001000", 3014 "total_trustlines": "10", 3015 "type": "constant_product", 3016 }, 3017 "reserves_revoked": []map[string]string{ 3018 { 3019 "amount": "0.0000100", 3020 "asset": "USD:GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY", 3021 "claimable_balance_id": "000000000a0b000000000000000000000000000000000000000000000000000000000000", 3022 }, 3023 }, 3024 "shares_revoked": "0.0001000", 3025 }, 3026 LedgerClosed: genericCloseTime.UTC(), 3027 }, 3028 { 3029 Type: int32(EffectLiquidityPoolRemoved), 3030 TypeString: EffectTypeNames[EffectLiquidityPoolRemoved], 3031 Address: "GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY", 3032 OperationID: 4294967297, 3033 Details: map[string]interface{}{ 3034 "liquidity_pool_id": poolIDStr, 3035 }, 3036 LedgerClosed: genericCloseTime.UTC(), 3037 }, 3038 }, 3039 }, 3040 } 3041 for _, tc := range testCases { 3042 3043 op := xdr.Operation{Body: tc.op} 3044 tx := ingest.LedgerTransaction{ 3045 Index: 0, 3046 Envelope: xdr.TransactionEnvelope{ 3047 Type: xdr.EnvelopeTypeEnvelopeTypeTx, 3048 V1: &xdr.TransactionV1Envelope{ 3049 Tx: xdr.Transaction{ 3050 SourceAccount: source, 3051 Operations: []xdr.Operation{op}, 3052 }, 3053 }, 3054 }, 3055 Result: xdr.TransactionResultPair{ 3056 Result: xdr.TransactionResult{ 3057 Result: xdr.TransactionResultResult{ 3058 Results: &[]xdr.OperationResult{ 3059 tc.result, 3060 }, 3061 }, 3062 }, 3063 }, 3064 UnsafeMeta: xdr.TransactionMeta{ 3065 V: 2, 3066 V2: &xdr.TransactionMetaV2{ 3067 Operations: []xdr.OperationMeta{{Changes: tc.changes}}, 3068 }, 3069 }, 3070 } 3071 3072 t.Run(tc.desc, func(t *testing.T) { 3073 operation := transactionOperationWrapper{ 3074 index: 0, 3075 transaction: tx, 3076 operation: op, 3077 ledgerSequence: 1, 3078 ledgerClosed: genericCloseTime.UTC(), 3079 } 3080 3081 effects, err := operation.effects() 3082 assert.NoError(t, err) 3083 assert.Equal(t, tc.expected, effects) 3084 }) 3085 } 3086 3087 } 3088 3089 func getRevokeSponsorshipEnvelopeXDR(t *testing.T) string { 3090 source := xdr.MustMuxedAddress("GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY") 3091 env := &xdr.TransactionEnvelope{ 3092 Type: xdr.EnvelopeTypeEnvelopeTypeTx, 3093 V1: &xdr.TransactionV1Envelope{ 3094 Tx: xdr.Transaction{ 3095 SourceAccount: source, 3096 Memo: xdr.Memo{Type: xdr.MemoTypeMemoNone}, 3097 Operations: []xdr.Operation{ 3098 { 3099 SourceAccount: &source, 3100 Body: xdr.OperationBody{ 3101 Type: xdr.OperationTypeRevokeSponsorship, 3102 RevokeSponsorshipOp: &xdr.RevokeSponsorshipOp{ 3103 Type: xdr.RevokeSponsorshipTypeRevokeSponsorshipSigner, 3104 Signer: &xdr.RevokeSponsorshipOpSigner{ 3105 AccountId: xdr.MustAddress("GAHK7EEG2WWHVKDNT4CEQFZGKF2LGDSW2IVM4S5DP42RBW3K6BTODB4A"), 3106 SignerKey: xdr.MustSigner("GCAHY6JSXQFKWKP6R7U5JPXDVNV4DJWOWRFLY3Y6YPBF64QRL4BPFDNS"), 3107 }, 3108 }, 3109 }, 3110 }, 3111 }, 3112 }, 3113 }, 3114 } 3115 b64, err := xdr.MarshalBase64(env) 3116 assert.NoError(t, err) 3117 return b64 3118 } 3119 3120 func BuildLedgerTransaction(t *testing.T, tx TestTransaction) ingest.LedgerTransaction { 3121 transaction := ingest.LedgerTransaction{ 3122 Index: tx.Index, 3123 Envelope: xdr.TransactionEnvelope{}, 3124 Result: xdr.TransactionResultPair{}, 3125 FeeChanges: xdr.LedgerEntryChanges{}, 3126 UnsafeMeta: xdr.TransactionMeta{}, 3127 } 3128 3129 tt := assert.New(t) 3130 3131 err := xdr.SafeUnmarshalBase64(tx.EnvelopeXDR, &transaction.Envelope) 3132 tt.NoError(err) 3133 err = xdr.SafeUnmarshalBase64(tx.ResultXDR, &transaction.Result.Result) 3134 tt.NoError(err) 3135 err = xdr.SafeUnmarshalBase64(tx.MetaXDR, &transaction.UnsafeMeta) 3136 tt.NoError(err) 3137 err = xdr.SafeUnmarshalBase64(tx.FeeChangesXDR, &transaction.FeeChanges) 3138 tt.NoError(err) 3139 3140 _, err = hex.Decode(transaction.Result.TransactionHash[:], []byte(tx.Hash)) 3141 tt.NoError(err) 3142 3143 return transaction 3144 } 3145 3146 func createTransactionMeta(opMeta []xdr.OperationMeta) xdr.TransactionMeta { 3147 return xdr.TransactionMeta{ 3148 V: 1, 3149 V1: &xdr.TransactionMetaV1{ 3150 Operations: opMeta, 3151 }, 3152 } 3153 } 3154 3155 func getRevokeSponsorshipMeta(t *testing.T) (string, []EffectOutput) { 3156 source := xdr.MustAddress("GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY") 3157 firstSigner := xdr.MustAddress("GCQZP3IU7XU6EJ63JZXKCQOYT2RNXN3HB5CNHENNUEUHSMA4VUJJJSEN") 3158 secondSigner := xdr.MustAddress("GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H") 3159 thirdSigner := xdr.MustAddress("GACMZD5VJXTRLKVET72CETCYKELPNCOTTBDC6DHFEUPLG5DHEK534JQX") 3160 formerSponsor := xdr.MustAddress("GAHK7EEG2WWHVKDNT4CEQFZGKF2LGDSW2IVM4S5DP42RBW3K6BTODB4A") 3161 oldSponsor := xdr.MustAddress("GANFZDRBCNTUXIODCJEYMACPMCSZEVE4WZGZ3CZDZ3P2SXK4KH75IK6Y") 3162 updatedSponsor := xdr.MustAddress("GAHK7EEG2WWHVKDNT4CEQFZGKF2LGDSW2IVM4S5DP42RBW3K6BTODB4A") 3163 newSponsor := xdr.MustAddress("GDEOVUDLCYTO46D6GD6WH7BFESPBV5RACC6F6NUFCIRU7PL2XONQHVGJ") 3164 3165 expectedEffects := []EffectOutput{ 3166 { 3167 Address: source.Address(), 3168 OperationID: 249108107265, 3169 Details: map[string]interface{}{ 3170 "sponsor": newSponsor.Address(), 3171 "signer": thirdSigner.Address(), 3172 }, 3173 Type: int32(EffectSignerSponsorshipCreated), 3174 TypeString: EffectTypeNames[EffectSignerSponsorshipCreated], 3175 LedgerClosed: genericCloseTime.UTC(), 3176 }, 3177 { 3178 Address: source.Address(), 3179 OperationID: 249108107265, 3180 Details: map[string]interface{}{ 3181 "former_sponsor": oldSponsor.Address(), 3182 "new_sponsor": updatedSponsor.Address(), 3183 "signer": secondSigner.Address(), 3184 }, 3185 Type: int32(EffectSignerSponsorshipUpdated), 3186 TypeString: EffectTypeNames[EffectSignerSponsorshipUpdated], 3187 LedgerClosed: genericCloseTime.UTC(), 3188 }, 3189 { 3190 Address: source.Address(), 3191 OperationID: 249108107265, 3192 Details: map[string]interface{}{ 3193 "former_sponsor": formerSponsor.Address(), 3194 "signer": firstSigner.Address(), 3195 }, 3196 Type: int32(EffectSignerSponsorshipRemoved), 3197 TypeString: EffectTypeNames[EffectSignerSponsorshipRemoved], 3198 LedgerClosed: genericCloseTime.UTC(), 3199 }, 3200 } 3201 3202 accountSignersMeta := &xdr.TransactionMeta{ 3203 V: 1, 3204 V1: &xdr.TransactionMetaV1{ 3205 TxChanges: xdr.LedgerEntryChanges{}, 3206 Operations: []xdr.OperationMeta{ 3207 { 3208 Changes: xdr.LedgerEntryChanges{ 3209 { 3210 Type: xdr.LedgerEntryChangeTypeLedgerEntryState, 3211 State: &xdr.LedgerEntry{ 3212 LastModifiedLedgerSeq: 0x39, 3213 Data: xdr.LedgerEntryData{ 3214 Type: xdr.LedgerEntryTypeAccount, 3215 Account: &xdr.AccountEntry{ 3216 AccountId: source, 3217 Balance: 800152367009533292, 3218 SeqNum: 26, 3219 InflationDest: &source, 3220 Thresholds: xdr.Thresholds{0x1, 0x0, 0x0, 0x0}, 3221 Signers: []xdr.Signer{ 3222 { 3223 Key: xdr.SignerKey{ 3224 Type: xdr.SignerKeyTypeSignerKeyTypeEd25519, 3225 Ed25519: firstSigner.Ed25519, 3226 }, 3227 Weight: 10, 3228 }, 3229 { 3230 Key: xdr.SignerKey{ 3231 Type: xdr.SignerKeyTypeSignerKeyTypeEd25519, 3232 Ed25519: secondSigner.Ed25519, 3233 }, 3234 Weight: 10, 3235 }, 3236 { 3237 Key: xdr.SignerKey{ 3238 Type: xdr.SignerKeyTypeSignerKeyTypeEd25519, 3239 Ed25519: thirdSigner.Ed25519, 3240 }, 3241 Weight: 10, 3242 }, 3243 }, 3244 Ext: xdr.AccountEntryExt{ 3245 V: 1, 3246 V1: &xdr.AccountEntryExtensionV1{ 3247 Liabilities: xdr.Liabilities{}, 3248 Ext: xdr.AccountEntryExtensionV1Ext{ 3249 V: 2, 3250 V2: &xdr.AccountEntryExtensionV2{ 3251 NumSponsored: 0, 3252 NumSponsoring: 0, 3253 SignerSponsoringIDs: []xdr.SponsorshipDescriptor{ 3254 &formerSponsor, 3255 &oldSponsor, 3256 nil, 3257 }, 3258 }, 3259 }, 3260 }, 3261 }, 3262 }, 3263 }, 3264 }, 3265 }, 3266 { 3267 Type: xdr.LedgerEntryChangeTypeLedgerEntryUpdated, 3268 Updated: &xdr.LedgerEntry{ 3269 LastModifiedLedgerSeq: 0x39, 3270 Data: xdr.LedgerEntryData{ 3271 Type: xdr.LedgerEntryTypeAccount, 3272 Account: &xdr.AccountEntry{ 3273 AccountId: source, 3274 Balance: 800152367009533292, 3275 SeqNum: 26, 3276 InflationDest: &source, 3277 Thresholds: xdr.Thresholds{0x1, 0x0, 0x0, 0x0}, 3278 Signers: []xdr.Signer{ 3279 { 3280 Key: xdr.SignerKey{ 3281 Type: xdr.SignerKeyTypeSignerKeyTypeEd25519, 3282 Ed25519: secondSigner.Ed25519, 3283 }, 3284 Weight: 10, 3285 }, 3286 { 3287 Key: xdr.SignerKey{ 3288 Type: xdr.SignerKeyTypeSignerKeyTypeEd25519, 3289 Ed25519: thirdSigner.Ed25519, 3290 }, 3291 Weight: 10, 3292 }, 3293 }, 3294 Ext: xdr.AccountEntryExt{ 3295 V: 1, 3296 V1: &xdr.AccountEntryExtensionV1{ 3297 Liabilities: xdr.Liabilities{}, 3298 Ext: xdr.AccountEntryExtensionV1Ext{ 3299 V: 2, 3300 V2: &xdr.AccountEntryExtensionV2{ 3301 NumSponsored: 0, 3302 NumSponsoring: 0, 3303 SignerSponsoringIDs: []xdr.SponsorshipDescriptor{ 3304 &updatedSponsor, 3305 &newSponsor, 3306 }, 3307 }, 3308 }, 3309 }, 3310 }, 3311 }, 3312 }, 3313 }, 3314 }, 3315 }, 3316 }, 3317 }, 3318 }, 3319 } 3320 3321 b64, err := xdr.MarshalBase64(accountSignersMeta) 3322 assert.NoError(t, err) 3323 3324 return b64, expectedEffects 3325 } 3326 3327 type ClaimClaimableBalanceEffectsTestSuite struct { 3328 suite.Suite 3329 ops []xdr.Operation 3330 tx ingest.LedgerTransaction 3331 } 3332 3333 type CreateClaimableBalanceEffectsTestSuite struct { 3334 suite.Suite 3335 ops []xdr.Operation 3336 tx ingest.LedgerTransaction 3337 } 3338 3339 const ( 3340 networkPassphrase = "Arbitrary Testing Passphrase" 3341 ) 3342 3343 type effect struct { 3344 address string 3345 addressMuxed null.String 3346 operationID int64 3347 details map[string]interface{} 3348 effectType EffectType 3349 order uint32 3350 } 3351 3352 func TestInvokeHostFunctionEffects(t *testing.T) { 3353 randAddr := func() string { 3354 return keypair.MustRandom().Address() 3355 } 3356 3357 admin := randAddr() 3358 asset := xdr.MustNewCreditAsset("TESTER", admin) 3359 nativeAsset := xdr.MustNewNativeAsset() 3360 from, to := randAddr(), randAddr() 3361 fromContractBytes, toContractBytes := xdr.Hash{}, xdr.Hash{1} 3362 fromContract := strkey.MustEncode(strkey.VersionByteContract, fromContractBytes[:]) 3363 toContract := strkey.MustEncode(strkey.VersionByteContract, toContractBytes[:]) 3364 amount := big.NewInt(12345) 3365 3366 rawContractId := [64]byte{} 3367 rand.Read(rawContractId[:]) 3368 3369 testCases := []struct { 3370 desc string 3371 asset xdr.Asset 3372 from, to string 3373 eventType contractevents.EventType 3374 expected []EffectOutput 3375 }{ 3376 { 3377 desc: "transfer", 3378 asset: asset, 3379 eventType: contractevents.EventTypeTransfer, 3380 expected: []EffectOutput{ 3381 { 3382 Address: from, 3383 OperationID: toid.New(1, 0, 1).ToInt64(), 3384 Details: map[string]interface{}{ 3385 "amount": "0.0012345", 3386 "asset_code": strings.Trim(asset.GetCode(), "\x00"), 3387 "asset_issuer": asset.GetIssuer(), 3388 "asset_type": "credit_alphanum12", 3389 "contract_event_type": "transfer", 3390 }, 3391 Type: int32(EffectAccountDebited), 3392 TypeString: EffectTypeNames[EffectAccountDebited], 3393 LedgerClosed: time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), 3394 }, { 3395 Address: to, 3396 OperationID: toid.New(1, 0, 1).ToInt64(), 3397 Details: map[string]interface{}{ 3398 "amount": "0.0012345", 3399 "asset_code": strings.Trim(asset.GetCode(), "\x00"), 3400 "asset_issuer": asset.GetIssuer(), 3401 "asset_type": "credit_alphanum12", 3402 "contract_event_type": "transfer", 3403 }, 3404 Type: int32(EffectAccountCredited), 3405 TypeString: EffectTypeNames[EffectAccountCredited], 3406 LedgerClosed: time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), 3407 }, 3408 }, 3409 }, { 3410 desc: "transfer between contracts", 3411 asset: asset, 3412 eventType: contractevents.EventTypeTransfer, 3413 from: fromContract, 3414 to: toContract, 3415 expected: []EffectOutput{ 3416 { 3417 Address: admin, 3418 OperationID: toid.New(1, 0, 1).ToInt64(), 3419 Details: map[string]interface{}{ 3420 "amount": "0.0012345", 3421 "asset_code": strings.Trim(asset.GetCode(), "\x00"), 3422 "asset_issuer": asset.GetIssuer(), 3423 "asset_type": "credit_alphanum12", 3424 "contract": fromContract, 3425 "contract_event_type": "transfer", 3426 }, 3427 Type: int32(EffectContractDebited), 3428 TypeString: EffectTypeNames[EffectContractDebited], 3429 LedgerClosed: time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), 3430 }, { 3431 Address: admin, 3432 OperationID: toid.New(1, 0, 1).ToInt64(), 3433 Details: map[string]interface{}{ 3434 "amount": "0.0012345", 3435 "asset_code": strings.Trim(asset.GetCode(), "\x00"), 3436 "asset_issuer": asset.GetIssuer(), 3437 "asset_type": "credit_alphanum12", 3438 "contract": toContract, 3439 "contract_event_type": "transfer", 3440 }, 3441 Type: int32(EffectContractCredited), 3442 TypeString: EffectTypeNames[EffectContractCredited], 3443 LedgerClosed: time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), 3444 }, 3445 }, 3446 }, { 3447 desc: "mint", 3448 asset: asset, 3449 eventType: contractevents.EventTypeMint, 3450 expected: []EffectOutput{ 3451 { 3452 Address: to, 3453 OperationID: toid.New(1, 0, 1).ToInt64(), 3454 Details: map[string]interface{}{ 3455 "amount": "0.0012345", 3456 "asset_code": strings.Trim(asset.GetCode(), "\x00"), 3457 "asset_issuer": asset.GetIssuer(), 3458 "asset_type": "credit_alphanum12", 3459 "contract_event_type": "mint", 3460 }, 3461 Type: int32(EffectAccountCredited), 3462 TypeString: EffectTypeNames[EffectAccountCredited], 3463 LedgerClosed: time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), 3464 }, 3465 }, 3466 }, { 3467 desc: "burn", 3468 asset: asset, 3469 eventType: contractevents.EventTypeBurn, 3470 expected: []EffectOutput{ 3471 { 3472 Address: from, 3473 OperationID: toid.New(1, 0, 1).ToInt64(), 3474 Details: map[string]interface{}{ 3475 "amount": "0.0012345", 3476 "asset_code": strings.Trim(asset.GetCode(), "\x00"), 3477 "asset_issuer": asset.GetIssuer(), 3478 "asset_type": "credit_alphanum12", 3479 "contract_event_type": "burn", 3480 }, 3481 Type: int32(EffectAccountDebited), 3482 TypeString: EffectTypeNames[EffectAccountDebited], 3483 LedgerClosed: time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), 3484 }, 3485 }, 3486 }, { 3487 desc: "burn from contract", 3488 asset: asset, 3489 eventType: contractevents.EventTypeBurn, 3490 from: fromContract, 3491 expected: []EffectOutput{ 3492 { 3493 Address: admin, 3494 OperationID: toid.New(1, 0, 1).ToInt64(), 3495 Details: map[string]interface{}{ 3496 "amount": "0.0012345", 3497 "asset_code": strings.Trim(asset.GetCode(), "\x00"), 3498 "asset_issuer": asset.GetIssuer(), 3499 "asset_type": "credit_alphanum12", 3500 "contract": fromContract, 3501 "contract_event_type": "burn", 3502 }, 3503 Type: int32(EffectContractDebited), 3504 TypeString: EffectTypeNames[EffectContractDebited], 3505 LedgerClosed: time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), 3506 }, 3507 }, 3508 }, { 3509 desc: "clawback", 3510 asset: asset, 3511 eventType: contractevents.EventTypeClawback, 3512 expected: []EffectOutput{ 3513 { 3514 Address: from, 3515 OperationID: toid.New(1, 0, 1).ToInt64(), 3516 Details: map[string]interface{}{ 3517 "amount": "0.0012345", 3518 "asset_code": strings.Trim(asset.GetCode(), "\x00"), 3519 "asset_issuer": asset.GetIssuer(), 3520 "asset_type": "credit_alphanum12", 3521 "contract_event_type": "clawback", 3522 }, 3523 Type: int32(EffectAccountDebited), 3524 TypeString: EffectTypeNames[EffectAccountDebited], 3525 LedgerClosed: time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), 3526 }, 3527 }, 3528 }, { 3529 desc: "clawback from contract", 3530 asset: asset, 3531 eventType: contractevents.EventTypeClawback, 3532 from: fromContract, 3533 expected: []EffectOutput{ 3534 { 3535 Address: admin, 3536 OperationID: toid.New(1, 0, 1).ToInt64(), 3537 Details: map[string]interface{}{ 3538 "amount": "0.0012345", 3539 "asset_code": strings.Trim(asset.GetCode(), "\x00"), 3540 "asset_issuer": asset.GetIssuer(), 3541 "asset_type": "credit_alphanum12", 3542 "contract": fromContract, 3543 "contract_event_type": "clawback", 3544 }, 3545 Type: int32(EffectContractDebited), 3546 TypeString: EffectTypeNames[EffectContractDebited], 3547 LedgerClosed: time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), 3548 }, 3549 }, 3550 }, { 3551 desc: "transfer native", 3552 asset: nativeAsset, 3553 eventType: contractevents.EventTypeTransfer, 3554 expected: []EffectOutput{ 3555 { 3556 Address: from, 3557 OperationID: toid.New(1, 0, 1).ToInt64(), 3558 Details: map[string]interface{}{ 3559 "amount": "0.0012345", 3560 "asset_type": "native", 3561 "contract_event_type": "transfer", 3562 }, 3563 Type: int32(EffectAccountDebited), 3564 TypeString: EffectTypeNames[EffectAccountDebited], 3565 LedgerClosed: time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), 3566 }, { 3567 Address: to, 3568 OperationID: toid.New(1, 0, 1).ToInt64(), 3569 Details: map[string]interface{}{ 3570 "amount": "0.0012345", 3571 "asset_type": "native", 3572 "contract_event_type": "transfer", 3573 }, 3574 Type: int32(EffectAccountCredited), 3575 TypeString: EffectTypeNames[EffectAccountCredited], 3576 LedgerClosed: time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), 3577 }, 3578 }, 3579 }, { 3580 desc: "transfer into contract", 3581 asset: asset, 3582 to: toContract, 3583 eventType: contractevents.EventTypeTransfer, 3584 expected: []EffectOutput{ 3585 { 3586 Address: from, 3587 OperationID: toid.New(1, 0, 1).ToInt64(), 3588 Details: map[string]interface{}{ 3589 "amount": "0.0012345", 3590 "asset_code": strings.Trim(asset.GetCode(), "\x00"), 3591 "asset_issuer": asset.GetIssuer(), 3592 "asset_type": "credit_alphanum12", 3593 "contract_event_type": "transfer", 3594 }, 3595 Type: int32(EffectAccountDebited), 3596 TypeString: EffectTypeNames[EffectAccountDebited], 3597 LedgerClosed: time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), 3598 }, { 3599 Address: admin, 3600 OperationID: toid.New(1, 0, 1).ToInt64(), 3601 Details: map[string]interface{}{ 3602 "amount": "0.0012345", 3603 "asset_code": strings.Trim(asset.GetCode(), "\x00"), 3604 "asset_issuer": asset.GetIssuer(), 3605 "asset_type": "credit_alphanum12", 3606 "contract": toContract, 3607 "contract_event_type": "transfer", 3608 }, 3609 Type: int32(EffectContractCredited), 3610 TypeString: EffectTypeNames[EffectContractCredited], 3611 LedgerClosed: time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), 3612 }, 3613 }, 3614 }, { 3615 desc: "transfer out of contract", 3616 asset: asset, 3617 from: fromContract, 3618 eventType: contractevents.EventTypeTransfer, 3619 expected: []EffectOutput{ 3620 { 3621 Address: admin, 3622 OperationID: toid.New(1, 0, 1).ToInt64(), 3623 Details: map[string]interface{}{ 3624 "amount": "0.0012345", 3625 "asset_code": strings.Trim(asset.GetCode(), "\x00"), 3626 "asset_issuer": asset.GetIssuer(), 3627 "asset_type": "credit_alphanum12", 3628 "contract": fromContract, 3629 "contract_event_type": "transfer", 3630 }, 3631 Type: int32(EffectContractDebited), 3632 TypeString: EffectTypeNames[EffectContractDebited], 3633 LedgerClosed: time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), 3634 }, { 3635 Address: to, 3636 OperationID: toid.New(1, 0, 1).ToInt64(), 3637 Details: map[string]interface{}{ 3638 "amount": "0.0012345", 3639 "asset_code": strings.Trim(asset.GetCode(), "\x00"), 3640 "asset_issuer": asset.GetIssuer(), 3641 "asset_type": "credit_alphanum12", 3642 "contract_event_type": "transfer", 3643 }, 3644 Type: int32(EffectAccountCredited), 3645 TypeString: EffectTypeNames[EffectAccountCredited], 3646 LedgerClosed: time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), 3647 }, 3648 }, 3649 }, 3650 } 3651 3652 for _, testCase := range testCases { 3653 t.Run(testCase.desc, func(t *testing.T) { 3654 var tx ingest.LedgerTransaction 3655 3656 fromAddr := from 3657 if testCase.from != "" { 3658 fromAddr = testCase.from 3659 } 3660 3661 toAddr := to 3662 if testCase.to != "" { 3663 toAddr = testCase.to 3664 } 3665 3666 tx = makeInvocationTransaction( 3667 fromAddr, toAddr, 3668 admin, 3669 testCase.asset, 3670 amount, 3671 testCase.eventType, 3672 ) 3673 assert.True(t, tx.Result.Successful()) // sanity check 3674 3675 operation := transactionOperationWrapper{ 3676 index: 0, 3677 transaction: tx, 3678 operation: tx.Envelope.Operations()[0], 3679 ledgerSequence: 1, 3680 network: networkPassphrase, 3681 } 3682 3683 effects, err := operation.effects() 3684 assert.NoErrorf(t, err, "event type %v", testCase.eventType) 3685 assert.Lenf(t, effects, len(testCase.expected), "event type %v", testCase.eventType) 3686 assert.Equalf(t, testCase.expected, effects, "event type %v", testCase.eventType) 3687 }) 3688 } 3689 } 3690 3691 // makeInvocationTransaction returns a single transaction containing a single 3692 // invokeHostFunction operation that generates the specified Stellar Asset 3693 // Contract events in its txmeta. 3694 func makeInvocationTransaction( 3695 from, to, admin string, 3696 asset xdr.Asset, 3697 amount *big.Int, 3698 types ...contractevents.EventType, 3699 ) ingest.LedgerTransaction { 3700 meta := xdr.TransactionMetaV3{ 3701 // irrelevant for contract invocations: only events are inspected 3702 Operations: []xdr.OperationMeta{}, 3703 SorobanMeta: &xdr.SorobanTransactionMeta{ 3704 Events: make([]xdr.ContractEvent, len(types)), 3705 }, 3706 } 3707 3708 for idx, type_ := range types { 3709 event := contractevents.GenerateEvent( 3710 type_, 3711 from, to, admin, 3712 asset, 3713 amount, 3714 networkPassphrase, 3715 ) 3716 meta.SorobanMeta.Events[idx] = event 3717 } 3718 3719 envelope := xdr.TransactionV1Envelope{ 3720 Tx: xdr.Transaction{ 3721 // the rest doesn't matter for effect ingestion 3722 Operations: []xdr.Operation{ 3723 { 3724 SourceAccount: xdr.MustMuxedAddressPtr(admin), 3725 Body: xdr.OperationBody{ 3726 Type: xdr.OperationTypeInvokeHostFunction, 3727 // contents of the op are irrelevant as they aren't 3728 // parsed by anyone yet, e.g. effects are generated 3729 // purely from events 3730 InvokeHostFunctionOp: &xdr.InvokeHostFunctionOp{}, 3731 }, 3732 }, 3733 }, 3734 }, 3735 } 3736 3737 return ingest.LedgerTransaction{ 3738 Index: 0, 3739 Envelope: xdr.TransactionEnvelope{ 3740 Type: xdr.EnvelopeTypeEnvelopeTypeTx, 3741 V1: &envelope, 3742 }, 3743 // the result just needs enough to look successful 3744 Result: xdr.TransactionResultPair{ 3745 TransactionHash: xdr.Hash([32]byte{}), 3746 Result: xdr.TransactionResult{ 3747 FeeCharged: 1234, 3748 Result: xdr.TransactionResultResult{ 3749 Code: xdr.TransactionResultCodeTxSuccess, 3750 }, 3751 }, 3752 }, 3753 UnsafeMeta: xdr.TransactionMeta{V: 3, V3: &meta}, 3754 } 3755 } 3756 3757 func TestBumpFootprintExpirationEffects(t *testing.T) { 3758 randAddr := func() string { 3759 return keypair.MustRandom().Address() 3760 } 3761 3762 admin := randAddr() 3763 keyHash := xdr.Hash{} 3764 3765 ledgerEntryKey := xdr.LedgerKey{ 3766 Type: xdr.LedgerEntryTypeTtl, 3767 Ttl: &xdr.LedgerKeyTtl{ 3768 KeyHash: keyHash, 3769 }, 3770 } 3771 ledgerEntryKeyStr, err := xdr.MarshalBase64(ledgerEntryKey) 3772 assert.NoError(t, err) 3773 3774 meta := xdr.TransactionMetaV3{ 3775 Operations: []xdr.OperationMeta{ 3776 { 3777 Changes: xdr.LedgerEntryChanges{ 3778 // TODO: Confirm this STATE entry is emitted from core as part of the 3779 // ledger close meta we get. 3780 { 3781 Type: xdr.LedgerEntryChangeTypeLedgerEntryState, 3782 State: &xdr.LedgerEntry{ 3783 LastModifiedLedgerSeq: 1, 3784 Data: xdr.LedgerEntryData{ 3785 Type: xdr.LedgerEntryTypeTtl, 3786 Ttl: &xdr.TtlEntry{ 3787 KeyHash: keyHash, 3788 LiveUntilLedgerSeq: 1, 3789 }, 3790 }, 3791 }, 3792 }, 3793 { 3794 Type: xdr.LedgerEntryChangeTypeLedgerEntryUpdated, 3795 Updated: &xdr.LedgerEntry{ 3796 Data: xdr.LedgerEntryData{ 3797 Type: xdr.LedgerEntryTypeTtl, 3798 Ttl: &xdr.TtlEntry{ 3799 KeyHash: keyHash, 3800 LiveUntilLedgerSeq: 1234, 3801 }, 3802 }, 3803 }, 3804 }, 3805 }, 3806 }, 3807 }, 3808 } 3809 3810 envelope := xdr.TransactionV1Envelope{ 3811 Tx: xdr.Transaction{ 3812 // the rest doesn't matter for effect ingestion 3813 Operations: []xdr.Operation{ 3814 { 3815 SourceAccount: xdr.MustMuxedAddressPtr(admin), 3816 Body: xdr.OperationBody{ 3817 Type: xdr.OperationTypeExtendFootprintTtl, 3818 ExtendFootprintTtlOp: &xdr.ExtendFootprintTtlOp{ 3819 Ext: xdr.ExtensionPoint{ 3820 V: 0, 3821 }, 3822 ExtendTo: xdr.Uint32(1234), 3823 }, 3824 }, 3825 }, 3826 }, 3827 }, 3828 } 3829 tx := ingest.LedgerTransaction{ 3830 Index: 0, 3831 Envelope: xdr.TransactionEnvelope{ 3832 Type: xdr.EnvelopeTypeEnvelopeTypeTx, 3833 V1: &envelope, 3834 }, 3835 UnsafeMeta: xdr.TransactionMeta{ 3836 V: 3, 3837 Operations: &meta.Operations, 3838 V3: &meta, 3839 }, 3840 } 3841 3842 operation := transactionOperationWrapper{ 3843 index: 0, 3844 transaction: tx, 3845 operation: tx.Envelope.Operations()[0], 3846 ledgerSequence: 1, 3847 network: networkPassphrase, 3848 } 3849 3850 effects, err := operation.effects() 3851 assert.NoError(t, err) 3852 assert.Len(t, effects, 1) 3853 assert.Equal(t, 3854 []EffectOutput{ 3855 { 3856 Address: admin, 3857 OperationID: toid.New(1, 0, 1).ToInt64(), 3858 Details: map[string]interface{}{ 3859 "entries": []string{ 3860 ledgerEntryKeyStr, 3861 }, 3862 "extend_to": xdr.Uint32(1234), 3863 }, 3864 Type: int32(EffectExtendFootprintTtl), 3865 TypeString: EffectTypeNames[EffectExtendFootprintTtl], 3866 LedgerClosed: time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), 3867 }, 3868 }, 3869 effects, 3870 ) 3871 } 3872 3873 func TestAddRestoreFootprintExpirationEffect(t *testing.T) { 3874 randAddr := func() string { 3875 return keypair.MustRandom().Address() 3876 } 3877 3878 admin := randAddr() 3879 keyHash := xdr.Hash{} 3880 3881 ledgerEntryKey := xdr.LedgerKey{ 3882 Type: xdr.LedgerEntryTypeTtl, 3883 Ttl: &xdr.LedgerKeyTtl{ 3884 KeyHash: keyHash, 3885 }, 3886 } 3887 ledgerEntryKeyStr, err := xdr.MarshalBase64(ledgerEntryKey) 3888 assert.NoError(t, err) 3889 3890 meta := xdr.TransactionMetaV3{ 3891 Operations: []xdr.OperationMeta{ 3892 { 3893 Changes: xdr.LedgerEntryChanges{ 3894 // TODO: Confirm this STATE entry is emitted from core as part of the 3895 // ledger close meta we get. 3896 { 3897 Type: xdr.LedgerEntryChangeTypeLedgerEntryState, 3898 State: &xdr.LedgerEntry{ 3899 LastModifiedLedgerSeq: 1, 3900 Data: xdr.LedgerEntryData{ 3901 Type: xdr.LedgerEntryTypeTtl, 3902 Ttl: &xdr.TtlEntry{ 3903 KeyHash: keyHash, 3904 LiveUntilLedgerSeq: 1, 3905 }, 3906 }, 3907 }, 3908 }, 3909 { 3910 Type: xdr.LedgerEntryChangeTypeLedgerEntryUpdated, 3911 Updated: &xdr.LedgerEntry{ 3912 Data: xdr.LedgerEntryData{ 3913 Type: xdr.LedgerEntryTypeTtl, 3914 Ttl: &xdr.TtlEntry{ 3915 KeyHash: keyHash, 3916 LiveUntilLedgerSeq: 1234, 3917 }, 3918 }, 3919 }, 3920 }, 3921 }, 3922 }, 3923 }, 3924 } 3925 3926 envelope := xdr.TransactionV1Envelope{ 3927 Tx: xdr.Transaction{ 3928 // the rest doesn't matter for effect ingestion 3929 Operations: []xdr.Operation{ 3930 { 3931 SourceAccount: xdr.MustMuxedAddressPtr(admin), 3932 Body: xdr.OperationBody{ 3933 Type: xdr.OperationTypeRestoreFootprint, 3934 RestoreFootprintOp: &xdr.RestoreFootprintOp{ 3935 Ext: xdr.ExtensionPoint{ 3936 V: 0, 3937 }, 3938 }, 3939 }, 3940 }, 3941 }, 3942 }, 3943 } 3944 tx := ingest.LedgerTransaction{ 3945 Index: 0, 3946 Envelope: xdr.TransactionEnvelope{ 3947 Type: xdr.EnvelopeTypeEnvelopeTypeTx, 3948 V1: &envelope, 3949 }, 3950 UnsafeMeta: xdr.TransactionMeta{ 3951 V: 3, 3952 Operations: &meta.Operations, 3953 V3: &meta, 3954 }, 3955 } 3956 3957 operation := transactionOperationWrapper{ 3958 index: 0, 3959 transaction: tx, 3960 operation: tx.Envelope.Operations()[0], 3961 ledgerSequence: 1, 3962 network: networkPassphrase, 3963 } 3964 3965 effects, err := operation.effects() 3966 assert.NoError(t, err) 3967 assert.Len(t, effects, 1) 3968 assert.Equal(t, 3969 []EffectOutput{ 3970 { 3971 Address: admin, 3972 OperationID: toid.New(1, 0, 1).ToInt64(), 3973 Details: map[string]interface{}{ 3974 "entries": []string{ 3975 ledgerEntryKeyStr, 3976 }, 3977 }, 3978 Type: int32(EffectRestoreFootprint), 3979 TypeString: EffectTypeNames[EffectRestoreFootprint], 3980 LedgerClosed: time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), 3981 }, 3982 }, 3983 effects, 3984 ) 3985 }