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  }